[PCH] Temporarily disable the "ambiguous macro" warning that is currently bogus with...
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 23 Jan 2013 18:21:56 +0000 (18:21 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 23 Jan 2013 18:21:56 +0000 (18:21 +0000)
that redefined a macro without undef'ing it first.

Proper reconstruction of the macro info history from modules will properly fix this in subsequent commits.

rdar://13016031

llvm-svn: 173281

clang/lib/Lex/PPMacroExpansion.cpp
clang/test/Modules/macros.c
clang/test/PCH/macro-redef.c [new file with mode: 0644]

index 7901705..6379144 100644 (file)
@@ -377,6 +377,9 @@ bool Preprocessor::HandleMacroExpandedIdentifier(Token &Identifier,
     }
   }
 
+  // FIXME: Temporarily disable this warning that is currently bogus with a PCH
+  // that redefined a macro without undef'ing it first (test/PCH/macro-redef.c).
+#if 0
   // If the macro definition is ambiguous, complain.
   if (MI->isAmbiguous()) {
     Diag(Identifier, diag::warn_pp_ambiguous_macro)
@@ -392,6 +395,7 @@ bool Preprocessor::HandleMacroExpandedIdentifier(Token &Identifier,
       }
     }
   }
+#endif
 
   // If we started lexing a macro, enter the macro expansion body.
 
index f6b4744..1178711 100644 (file)
@@ -1,3 +1,4 @@
+// XFAIL: *
 // RUN: rm -rf %t
 // RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodule-cache-path %t -fmodule-name=macros_top %S/Inputs/module.map
 // RUN: %clang_cc1 -fmodules -x objective-c -emit-module -fmodule-cache-path %t -fmodule-name=macros_left %S/Inputs/module.map
diff --git a/clang/test/PCH/macro-redef.c b/clang/test/PCH/macro-redef.c
new file mode 100644 (file)
index 0000000..7e25d7f
--- /dev/null
@@ -0,0 +1,28 @@
+// RUN: %clang_cc1 %s -emit-pch -o %t1.pch -verify
+// RUN: %clang_cc1 %s -emit-pch -o %t2.pch -include-pch %t1.pch -verify
+// RUN: %clang_cc1 -fsyntax-only %s -include-pch %t2.pch -verify
+
+// Test that a redefinition inside the PCH won't manifest as an ambiguous macro.
+// rdar://13016031
+
+#ifndef HEADER1
+#define HEADER1
+
+#define M1 0 // expected-note {{previous}}
+#define M1 1 // expected-warning {{redefined}}
+
+#define M2 3
+
+#elif !defined(HEADER2)
+#define HEADER2
+
+#define M2 4 // expected-warning {{redefined}}
+ // expected-note@-6 {{previous}}
+
+#else
+
+// Use the error to verify it was parsed.
+int x = M1; // expected-note {{previous}}
+int x = M2; // expected-error {{redefinition}}
+
+#endif