diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 6e0bec2f1fe4..4a3391c59eb9 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -3180,6 +3180,8 @@ def err_typecheck_call_too_few_args_at_least : Error< def err_typecheck_call_too_many_args : Error< "too many arguments to %select{function|block|method}0 call, " "expected %1, have %2">; +def note_typecheck_call_too_many_args : Note< + "%0 declared here">; def err_typecheck_call_too_many_args_at_most : Error< "too many arguments to %select{function|block|method}0 call, " "expected at most %1, have %2">; diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 9ebc7de84d33..55155efa6962 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -4385,6 +4385,13 @@ Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, << NumArgsInProto << NumArgs << Fn->getSourceRange() << SourceRange(Args[NumArgsInProto]->getLocStart(), Args[NumArgs-1]->getLocEnd()); + + // Emit the location of the prototype. + if (FDecl && !FDecl->getBuiltinID()) + Diag(FDecl->getLocStart(), + diag::note_typecheck_call_too_many_args) + << FDecl; + // This deletes the extra arguments. Call->setNumArgs(Context, NumArgsInProto); return true; diff --git a/clang/test/CXX/basic/basic.lookup/basic.lookup.argdep/p2.cpp b/clang/test/CXX/basic/basic.lookup/basic.lookup.argdep/p2.cpp index 0c905fbf325d..cee7c0242033 100644 --- a/clang/test/CXX/basic/basic.lookup/basic.lookup.argdep/p2.cpp +++ b/clang/test/CXX/basic/basic.lookup/basic.lookup.argdep/p2.cpp @@ -17,7 +17,7 @@ namespace M { struct Y : N::X { }; } -void f(); +void f(); // expected-note 2 {{'f' declared here}} void test_operator_adl(N::X x, M::Y y) { (void)(x + x); diff --git a/clang/test/Sema/exprs.c b/clang/test/Sema/exprs.c index 86cd52ec6362..d7cbbad4aa16 100644 --- a/clang/test/Sema/exprs.c +++ b/clang/test/Sema/exprs.c @@ -163,7 +163,7 @@ void test17(int x) { } // PR6501 -void test18_a(int a); +void test18_a(int a); // expected-note {{'test18_a' declared here}} void test18(int b) { test18_a(b, b); // expected-error {{too many arguments to function call, expected 1, have 2}} test18_a(); // expected-error {{too few arguments to function call, expected 1, have 0}} diff --git a/clang/test/Sema/function-redecl.c b/clang/test/Sema/function-redecl.c index 27ec163ea9cb..7076bdf3bd1f 100644 --- a/clang/test/Sema/function-redecl.c +++ b/clang/test/Sema/function-redecl.c @@ -2,7 +2,7 @@ // PR3588 void g0(int, int); -void g0(); // expected-note{{previous declaration is here}} +void g0(); // expected-note{{previous declaration is here}} expected-note{{'g0' declared here}} void f0() { g0(1, 2, 3); // expected-error{{too many arguments to function call}}