[cfe-commits] r46950 - in /cfe/trunk: Sema/SemaChecking.cpp test/Sema/varargs.c

Anders Carlsson andersca at mac.com
Sun Feb 10 20:20:55 PST 2008


Author: andersca
Date: Sun Feb 10 22:20:54 2008
New Revision: 46950

URL: http://llvm.org/viewvc/llvm-project?rev=46950&view=rev
Log:
Get rid of bogus warnings when the second argument in va_start is either an implicit cast expr or a paren expr.

Modified:
    cfe/trunk/Sema/SemaChecking.cpp
    cfe/trunk/test/Sema/varargs.c

Modified: cfe/trunk/Sema/SemaChecking.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Sema/SemaChecking.cpp?rev=46950&r1=46949&r2=46950&view=diff

==============================================================================
--- cfe/trunk/Sema/SemaChecking.cpp (original)
+++ cfe/trunk/Sema/SemaChecking.cpp Sun Feb 10 22:20:54 2008
@@ -149,11 +149,21 @@
   // Verify that the second argument to the builtin is the last argument of the
   // current function or method.
   bool SecondArgIsLastNamedArgument = false;
-  if (DeclRefExpr *DR = dyn_cast<DeclRefExpr>(TheCall->getArg(1))) {
-    if (ParmVarDecl *PV = dyn_cast<ParmVarDecl>(DR->getDecl())) {
+  const Expr *Arg = TheCall->getArg(1);
+  while (1) {
+    if (const ParenExpr *PE = dyn_cast<ParenExpr>(Arg))
+      Arg = PE->getSubExpr();
+    else if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(Arg))
+      Arg = CE->getSubExpr();
+    else
+      break;
+  }
+  
+  if (const DeclRefExpr *DR = dyn_cast<DeclRefExpr>(Arg)) {
+    if (const ParmVarDecl *PV = dyn_cast<ParmVarDecl>(DR->getDecl())) {
       // FIXME: This isn't correct for methods (results in bogus warning).
       // Get the last formal in the current function.
-      ParmVarDecl *LastArg;
+      const ParmVarDecl *LastArg;
       if (CurFunctionDecl)
         LastArg = *(CurFunctionDecl->param_end()-1);
       else

Modified: cfe/trunk/test/Sema/varargs.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/varargs.c?rev=46950&r1=46949&r2=46950&view=diff

==============================================================================
--- cfe/trunk/test/Sema/varargs.c (original)
+++ cfe/trunk/test/Sema/varargs.c Sun Feb 10 22:20:54 2008
@@ -16,3 +16,11 @@
     __builtin_va_start(ap, a); // expected-warning {{second parameter of 'va_start' not last named argument}}
     __builtin_va_start(ap, b);
 }
+
+void f3(float a, ...)
+{
+    __builtin_va_list ap;
+    
+    __builtin_va_start(ap, a);
+    __builtin_va_start(ap, (a));
+}





More information about the cfe-commits mailing list