diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -364,6 +364,8 @@ - The Fix-It emitted for unused labels used to expand to the next line, which caused visual oddities now that Clang shows more than one line of code snippet. This has been fixed and the Fix-It now only spans to the end of the ``:``. +- Clang now underlines the parameter list of function declaration when emitting + a note about the mismatch in the number of arguments. Bug Fixes in This Version ------------------------- diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -6459,7 +6459,8 @@ // Emit the location of the prototype. if (!TC && FDecl && !FDecl->getBuiltinID() && !IsExecConfig) - Diag(FDecl->getLocation(), diag::note_callee_decl) << FDecl; + Diag(FDecl->getLocation(), diag::note_callee_decl) + << FDecl << FDecl->getParametersSourceRange(); return true; } @@ -6504,7 +6505,8 @@ // Emit the location of the prototype. if (!TC && FDecl && !FDecl->getBuiltinID() && !IsExecConfig) - Diag(FDecl->getLocation(), diag::note_callee_decl) << FDecl; + Diag(FDecl->getLocation(), diag::note_callee_decl) + << FDecl << FDecl->getParametersSourceRange(); // This deletes the extra arguments. Call->shrinkNumArgs(NumParams); diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -11037,11 +11037,13 @@ if (modeCount == 1 && Fn->getParamDecl(0)->getDeclName()) S.Diag(Fn->getLocation(), diag::note_ovl_candidate_arity_one) << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second - << Description << mode << Fn->getParamDecl(0) << NumFormalArgs; + << Description << mode << Fn->getParamDecl(0) << NumFormalArgs + << Fn->getParametersSourceRange(); else S.Diag(Fn->getLocation(), diag::note_ovl_candidate_arity) << (unsigned)FnKindPair.first << (unsigned)FnKindPair.second - << Description << mode << modeCount << NumFormalArgs; + << Description << mode << modeCount << NumFormalArgs + << Fn->getParametersSourceRange(); MaybeEmitInheritedConstructorNote(S, Found); } diff --git a/clang/test/Misc/diag-func-call-ranges.c b/clang/test/Misc/diag-func-call-ranges.c new file mode 100644 --- /dev/null +++ b/clang/test/Misc/diag-func-call-ranges.c @@ -0,0 +1,11 @@ +// RUN: not %clang_cc1 -fsyntax-only -fdiagnostics-print-source-range-info %s 2>&1 | FileCheck %s --strict-whitespace + +// CHECK: :{9:3-9:7}: error: too few arguments +// CHECK: :{7:12-7:26}: note: 'func' declared here +// CHECK: :{10:3-10:7}{10:13-10:17}: error: too many arguments +// CHECK: :{7:12-7:26}: note: 'func' declared here +void func( int aa, int bb) {} +void arity_mismatch() { + func(3); + func(3, 4,5, 6); +} diff --git a/clang/test/Misc/diag-func-call-ranges.cpp b/clang/test/Misc/diag-func-call-ranges.cpp new file mode 100644 --- /dev/null +++ b/clang/test/Misc/diag-func-call-ranges.cpp @@ -0,0 +1,14 @@ +// RUN: not %clang_cc1 -fsyntax-only -fdiagnostics-print-source-range-info %s 2>&1 | FileCheck %s --strict-whitespace + +// CHECK: error: no matching function for call to 'func' + +// CHECK: :{[[@LINE+1]]:12-[[@LINE+1]]:18}: note: {{.*}} requires single argument +void func( int aa ) {} +// CHECK: :{[[@LINE+1]]:12-[[@LINE+3]]:18}: note: {{.*}} requires 3 arguments +void func( int aa, + int bb, + int cc) {} + +void arity_mismatch() { + func(2, 4); +}