Index: clang/lib/Sema/SemaExpr.cpp =================================================================== --- clang/lib/Sema/SemaExpr.cpp +++ clang/lib/Sema/SemaExpr.cpp @@ -6448,7 +6448,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; } @@ -6493,7 +6494,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); Index: clang/lib/Sema/SemaOverload.cpp =================================================================== --- clang/lib/Sema/SemaOverload.cpp +++ 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); } Index: clang/test/Misc/diag-func-call-ranges.c =================================================================== --- /dev/null +++ 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:10-9:14}: error: too few arguments +// CHECK: :{7:12-7:26}: note: 'func' declared here +// CHECK: :{10:10-10:14}{10:20-10:24}: error: too many arguments +// CHECK: :{7:12-7:26}: note: 'func' declared here +void func( int aa, int bb) {} +void arity_mismatch() { + (void)(func(3)); + (void)(func(3, 4,5, 6)); +} Index: clang/test/Misc/diag-func-call-ranges.cpp =================================================================== --- /dev/null +++ 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() { + (void)func(2, 4); +}