]> granicus.if.org Git - clang/commitdiff
Expand argument diagnostic for too few arguments to give the number
authorEric Christopher <echristo@apple.com>
Fri, 16 Apr 2010 04:48:22 +0000 (04:48 +0000)
committerEric Christopher <echristo@apple.com>
Fri, 16 Apr 2010 04:48:22 +0000 (04:48 +0000)
of arguments both seen and expected.

Fixes PR6501.

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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaChecking.cpp
lib/Sema/SemaExpr.cpp
lib/Sema/SemaExprObjC.cpp

index cc38077e70f8e9482c1c442dd435ceb1d41a45c4..aa968953833d53f0b7c018e1d7f9096a6a0cce7a 100644 (file)
@@ -2360,7 +2360,11 @@ def note_function_with_incomplete_return_type_declared_here : Note<
 def err_call_incomplete_argument : Error<
   "argument type %0 is incomplete">;
 def err_typecheck_call_too_few_args : Error<
-  "too few arguments to %select{function|block|method}0 call">;
+  "too few arguments to %select{function|block|method}0 call, "
+  "expected %1, have %2">;
+def err_typecheck_call_too_few_args_at_least : Error<
+  "too few arguments to %select{function|block|method}0 call, "
+  "expected at least %1, have %2">;
 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<
index 5091daf32355520d861651bced43d0a9c5e5ce7e..4e33cc67e221442f0792fe43b6c8d2ddc29e392e 100644 (file)
@@ -270,8 +270,10 @@ bool Sema::SemaBuiltinAtomicOverloaded(CallExpr *TheCall) {
 
   // Ensure that we have at least one argument to do type inference from.
   if (TheCall->getNumArgs() < 1)
-    return Diag(TheCall->getLocEnd(), diag::err_typecheck_call_too_few_args)
-              << 0 << TheCall->getCallee()->getSourceRange();
+    return Diag(TheCall->getLocEnd(),
+              diag::err_typecheck_call_too_few_args_at_least)
+              << 0 << 1 << TheCall->getNumArgs()
+              << TheCall->getCallee()->getSourceRange();
 
   // Inspect the first argument of the atomic builtin.  This should always be
   // a pointer type, whose element is an integral scalar or pointer type.
@@ -367,8 +369,10 @@ bool Sema::SemaBuiltinAtomicOverloaded(CallExpr *TheCall) {
   // Now that we know how many fixed arguments we expect, first check that we
   // have at least that many.
   if (TheCall->getNumArgs() < 1+NumFixed)
-    return Diag(TheCall->getLocEnd(), diag::err_typecheck_call_too_few_args)
-            << 0 << TheCall->getCallee()->getSourceRange();
+    return Diag(TheCall->getLocEnd(),
+            diag::err_typecheck_call_too_few_args_at_least)
+            << 0 << 1+NumFixed << TheCall->getNumArgs()
+            << TheCall->getCallee()->getSourceRange();
 
 
   // Get the decl for the concrete builtin from this, we can tell what the
@@ -483,8 +487,9 @@ bool Sema::SemaBuiltinVAStart(CallExpr *TheCall) {
   }
 
   if (TheCall->getNumArgs() < 2) {
-    return Diag(TheCall->getLocEnd(), diag::err_typecheck_call_too_few_args)
-      << 0 /*function call*/;
+    return Diag(TheCall->getLocEnd(),
+      diag::err_typecheck_call_too_few_args_at_least)
+      << 0 /*function call*/ << 2 << TheCall->getNumArgs();
   }
 
   // Determine whether the current function is variadic or not.
@@ -538,7 +543,7 @@ bool Sema::SemaBuiltinVAStart(CallExpr *TheCall) {
 bool Sema::SemaBuiltinUnorderedCompare(CallExpr *TheCall) {
   if (TheCall->getNumArgs() < 2)
     return Diag(TheCall->getLocEnd(), diag::err_typecheck_call_too_few_args)
-      << 0 /*function call*/;
+      << 0 << 2 << TheCall->getNumArgs()/*function call*/;
   if (TheCall->getNumArgs() > 2)
     return Diag(TheCall->getArg(2)->getLocStart(),
                 diag::err_typecheck_call_too_many_args)
@@ -580,7 +585,7 @@ bool Sema::SemaBuiltinUnorderedCompare(CallExpr *TheCall) {
 bool Sema::SemaBuiltinFPClassification(CallExpr *TheCall, unsigned NumArgs) {
   if (TheCall->getNumArgs() < NumArgs)
     return Diag(TheCall->getLocEnd(), diag::err_typecheck_call_too_few_args)
-      << 0 /*function call*/;
+      << 0 << NumArgs << TheCall->getNumArgs()/*function call*/;
   if (TheCall->getNumArgs() > NumArgs)
     return Diag(TheCall->getArg(NumArgs)->getLocStart(),
                 diag::err_typecheck_call_too_many_args)
@@ -619,8 +624,9 @@ bool Sema::SemaBuiltinStackAddress(CallExpr *TheCall) {
 Action::OwningExprResult Sema::SemaBuiltinShuffleVector(CallExpr *TheCall) {
   if (TheCall->getNumArgs() < 3)
     return ExprError(Diag(TheCall->getLocEnd(),
-                          diag::err_typecheck_call_too_few_args)
-      << 0 /*function call*/ << TheCall->getSourceRange());
+                          diag::err_typecheck_call_too_few_args_at_least)
+      << 0 /*function call*/ << 3 << TheCall->getNumArgs()
+      << TheCall->getSourceRange());
 
   unsigned numElements = std::numeric_limits<unsigned>::max();
   if (!TheCall->getArg(0)->isTypeDependent() &&
@@ -647,7 +653,9 @@ Action::OwningExprResult Sema::SemaBuiltinShuffleVector(CallExpr *TheCall) {
       if (TheCall->getNumArgs() < numElements+2)
         return ExprError(Diag(TheCall->getLocEnd(),
                               diag::err_typecheck_call_too_few_args)
-                 << 0 /*function call*/ << TheCall->getSourceRange());
+                 << 0 /*function call*/ 
+                 << numElements+2 << TheCall->getNumArgs()
+                 << TheCall->getSourceRange());
       return ExprError(Diag(TheCall->getLocEnd(),
                             diag::err_typecheck_call_too_many_args)
                  << 0 /*function call*/ << TheCall->getSourceRange());
index 09abf7b6c303bf5c10a7394f3e664a914f279556..4fec07930ddc51f38e521a02f4efd82cdfa74e01 100644 (file)
@@ -3335,7 +3335,8 @@ Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn,
   if (NumArgs < NumArgsInProto) {
     if (!FDecl || NumArgs < FDecl->getMinRequiredArguments())
       return Diag(RParenLoc, diag::err_typecheck_call_too_few_args)
-        << Fn->getType()->isBlockPointerType() << Fn->getSourceRange();
+        << Fn->getType()->isBlockPointerType() 
+        << NumArgsInProto << NumArgs << Fn->getSourceRange();
     Call->setNumArgs(Context, NumArgsInProto);
   }
 
index 530a40f49c1aa3ac2bb8a040f080c20af3b5f771..cc44e30295726cec64195dac8c50e7b178616d98 100644 (file)
@@ -190,7 +190,8 @@ bool Sema::CheckMessageArgumentTypes(Expr **Args, unsigned NumArgs,
     NumNamedArgs = Method->param_size();
   // FIXME. This need be cleaned up.
   if (NumArgs < NumNamedArgs) {
-    Diag(lbrac, diag::err_typecheck_call_too_few_args) << 2;
+    Diag(lbrac, diag::err_typecheck_call_too_few_args) << 2
+    << NumNamedArgs << NumArgs;
     return false;
   }