[cfe-commits] r68318 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaExpr.cpp test/Sema/arg-duplicate.c test/Sema/function.c test/Sema/knr-def-call.c
Douglas Gregor
dgregor at apple.com
Thu Apr 2 08:37:11 PDT 2009
Author: dgregor
Date: Thu Apr 2 10:37:10 2009
New Revision: 68318
URL: http://llvm.org/viewvc/llvm-project?rev=68318&view=rev
Log:
When calling a function without a prototype for which we have a
definition, warn if there are too many/too few function call
arguments.
Modified:
cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
cfe/trunk/lib/Sema/SemaExpr.cpp
cfe/trunk/test/Sema/arg-duplicate.c
cfe/trunk/test/Sema/function.c
cfe/trunk/test/Sema/knr-def-call.c
Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=68318&r1=68317&r2=68318&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Thu Apr 2 10:37:10 2009
@@ -1177,6 +1177,8 @@
"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 "
Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=68318&r1=68317&r2=68318&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Thu Apr 2 10:37:10 2009
@@ -2368,6 +2368,15 @@
} 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];
Modified: cfe/trunk/test/Sema/arg-duplicate.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/arg-duplicate.c?rev=68318&r1=68317&r2=68318&view=diff
==============================================================================
--- cfe/trunk/test/Sema/arg-duplicate.c (original)
+++ cfe/trunk/test/Sema/arg-duplicate.c Thu Apr 2 10:37:10 2009
@@ -9,6 +9,6 @@
}
void f4(void) {
- f3 (1, 1, 2, 3, 4);
+ f3 (1, 1, 2, 3, 4); // expected-warning{{too many arguments}}
}
Modified: cfe/trunk/test/Sema/function.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/function.c?rev=68318&r1=68317&r2=68318&view=diff
==============================================================================
--- cfe/trunk/test/Sema/function.c (original)
+++ cfe/trunk/test/Sema/function.c Thu Apr 2 10:37:10 2009
@@ -27,7 +27,7 @@
// 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}}
Modified: cfe/trunk/test/Sema/knr-def-call.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/knr-def-call.c?rev=68318&r1=68317&r2=68318&view=diff
==============================================================================
--- cfe/trunk/test/Sema/knr-def-call.c (original)
+++ cfe/trunk/test/Sema/knr-def-call.c Thu Apr 2 10:37:10 2009
@@ -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}}
More information about the cfe-commits
mailing list