]> granicus.if.org Git - clang/commitdiff
PR4350: Make sure we don't create invalid printf attributes. This isn't
authorEli Friedman <eli.friedman@gmail.com>
Wed, 10 Jun 2009 04:01:38 +0000 (04:01 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Wed, 10 Jun 2009 04:01:38 +0000 (04:01 +0000)
visible anywhere normally because the printf format checks for
this case, and we don't print out attribute values anywhere.  Original
patch by Roberto Bagnara.

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

lib/Sema/SemaDecl.cpp

index c67af295c18c19607b418421d65ef3e3dab80d6e..3a4aeb79a1ac2f8eb1546d1e2b6d8211b9f56edd 100644 (file)
@@ -3208,7 +3208,7 @@ void Sema::AddKnownFunctionAttributes(FunctionDecl *FD) {
     if (Context.BuiltinInfo.isPrintfLike(BuiltinID, FormatIdx, HasVAListArg)) {
       if (!FD->getAttr<FormatAttr>())
         FD->addAttr(::new (Context) FormatAttr("printf", FormatIdx + 1,
-                                               FormatIdx + 2));
+                                             HasVAListArg ? 0 : FormatIdx + 2));
     }
 
     // Mark const if we don't care about errno and that is the only
@@ -3239,10 +3239,12 @@ void Sema::AddKnownFunctionAttributes(FunctionDecl *FD) {
       // FIXME: We known better than our headers.
       const_cast<FormatAttr *>(Format)->setType("printf");
     } else 
-      FD->addAttr(::new (Context) FormatAttr("printf", 1, 2));
+      FD->addAttr(::new (Context) FormatAttr("printf", 1,
+                                             Name->isStr("NSLogv") ? 0 : 2));
   } else if (Name->isStr("asprintf") || Name->isStr("vasprintf")) {
     if (!FD->getAttr<FormatAttr>())
-      FD->addAttr(::new (Context) FormatAttr("printf", 2, 3));
+      FD->addAttr(::new (Context) FormatAttr("printf", 2,
+                                             Name->isStr("vasprintf") ? 0 : 3));
   }
 }