]> granicus.if.org Git - clang/commitdiff
When calling a function without a prototype for which we have a
authorDouglas Gregor <dgregor@apple.com>
Thu, 2 Apr 2009 15:37:10 +0000 (15:37 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 2 Apr 2009 15:37:10 +0000 (15:37 +0000)
definition, warn if there are too many/too few function call
arguments.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68318 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaExpr.cpp
test/Sema/arg-duplicate.c
test/Sema/function.c
test/Sema/knr-def-call.c

index 28a9417659314a189deedb6f346a67600a75dee2..0a53a65e138f00bb9b6ea996103438bbe6b0733e 100644 (file)
@@ -1177,6 +1177,8 @@ def err_typecheck_call_too_few_args : Error<
   "too few arguments to %select{function|block|method}0 call">;
 def err_typecheck_call_too_many_args : Error<
   "too many arguments to %select{function|block|method}0 call">;
+def warn_call_wrong_number_of_arguments : Warning<
+  "too %select{few|many}0 arguments in call to %1">;
 def err_deleted_function_use : Error<"attempt to use a deleted function">;
 def warn_cannot_pass_non_pod_arg_to_vararg : Warning<
   "cannot pass object of non-POD type %0 through variadic "
index 1540f0a009226268fab13c80a0dba6528bd778d5..b3c8be49c981bc54dd6bbe721ce567dc3b421712 100644 (file)
@@ -2368,6 +2368,15 @@ Sema::ActOnCallExpr(Scope *S, ExprArg fn, SourceLocation LParenLoc,
   } else {
     assert(isa<FunctionNoProtoType>(FuncT) && "Unknown FunctionType!");
 
+    if (FDecl) {
+      // Check if we have too few/too many template arguments, based
+      // on our knowledge of the function definition.
+      const FunctionDecl *Def = 0;
+      if (FDecl->getBody(Def) && NumArgs != Def->param_size())
+        Diag(RParenLoc, diag::warn_call_wrong_number_of_arguments)
+          << (NumArgs > Def->param_size()) << FDecl << Fn->getSourceRange();
+    }
+
     // Promote the arguments (C99 6.5.2.2p6).
     for (unsigned i = 0; i != NumArgs; i++) {
       Expr *Arg = Args[i];
index 82b2992af3424e929408f536e5599dbc9d9ac63f..e40a964234d9b9bf592fef7460652ad4cf7dde2e 100644 (file)
@@ -9,6 +9,6 @@ int f3(y, x,
 } 
 
 void f4(void) { 
-  f3 (1, 1, 2, 3, 4);
+  f3 (1, 1, 2, 3, 4); // expected-warning{{too many arguments}}
 }
 
index aec76a26ebd9bf00839fd9afff48fb15d811cf58..e604d0e1ea145054a76c7dd7dc95da31b03e7c42 100644 (file)
@@ -27,7 +27,7 @@ int t9(int a, );  // expected-error {{expected parameter declarator}}
 
 // PR2042
 void t10(){}
-void t11(){t10(1);}
+void t11(){t10(1);} // expected-warning{{too many arguments}}
 
 // PR3208
 void t12(int) {}  // expected-error{{parameter name omitted}}
index 0e562d7c7e7b18e4036eba77acbaa806716124bb..6b033fc3a21f8c6e3a0c905705b821a3508b3368 100644 (file)
@@ -2,10 +2,14 @@
 
 // C DR #316, PR 3626.
 void f0(a, b, c, d) int a,b,c,d; {}
-void t0(void) { f0(1); }
+void t0(void) { 
+  f0(1);  // expected-warning{{too few arguments}}
+}
 
 void f1(a, b) int a, b; {}
-void t1(void) { f1(1, 2, 3); }
+void t1(void) { 
+  f1(1, 2, 3); // expected-warning{{too many arguments}}
+}
 
 void f2(float); // expected-note{{previous declaration is here}}
 void f2(x) float x; { } // expected-warning{{promoted type 'double' of K&R function parameter is not compatible with the parameter type 'float' declared in a previous prototype}}