]> granicus.if.org Git - clang/commitdiff
Patch for handling C99 veriadic macros when using precompiled headers,
authorDouglas Gregor <dgregor@apple.com>
Fri, 29 Jun 2012 18:27:59 +0000 (18:27 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 29 Jun 2012 18:27:59 +0000 (18:27 +0000)
from Filipe Cabecinhas!

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

lib/Lex/Preprocessor.cpp
test/PCH/pch__VA_ARGS__.c [new file with mode: 0644]
test/PCH/pch__VA_ARGS__.h [new file with mode: 0644]

index 70be2cf7a60c622121864ce93cc05ea4dc05a567..c699c4a790ccca2531a1b53415b53905f62fa5e4 100644 (file)
@@ -515,9 +515,19 @@ void Preprocessor::HandleIdentifier(Token &Identifier) {
 
   // If the information about this identifier is out of date, update it from
   // the external source.
+  // We have to treat __VA_ARGS__ in a special way, since it gets
+  // serialized with isPoisoned = true, but our preprocessor may have
+  // unpoisoned it if we're defining a C99 macro.
   if (II.isOutOfDate()) {
+    bool CurrentIsPoisoned = false;
+    if (&II == Ident__VA_ARGS__)
+      CurrentIsPoisoned = Ident__VA_ARGS__->isPoisoned();
+
     ExternalSource->updateOutOfDateIdentifier(II);
     Identifier.setKind(II.getTokenID());
+
+    if (&II == Ident__VA_ARGS__)
+      II.setIsPoisoned(CurrentIsPoisoned);
   }
   
   // If this identifier was poisoned, and if it was not produced from a macro
diff --git a/test/PCH/pch__VA_ARGS__.c b/test/PCH/pch__VA_ARGS__.c
new file mode 100644 (file)
index 0000000..9bc1d3c
--- /dev/null
@@ -0,0 +1,6 @@
+// Test with pch.
+// RUN: %clang_cc1 -emit-pch -o %t %S/pch__VA_ARGS__.h
+// RUN: %clang_cc1 -include-pch %t -fsyntax-only -Weverything %s 2>&1 | FileCheck %s
+
+#define mylog(...) printf(__VA_ARGS__)
+// CHECK-NOT: warning: __VA_ARGS__ can only appear in the expansion of a C99 variadic macro
diff --git a/test/PCH/pch__VA_ARGS__.h b/test/PCH/pch__VA_ARGS__.h
new file mode 100644 (file)
index 0000000..9eb1005
--- /dev/null
@@ -0,0 +1,2 @@
+// Header for PCH test fuzzy-pch.c
+void f(int X);