]> granicus.if.org Git - clang/commitdiff
implement rdar://6762183. I'm not sure if it is more insane that
authorChris Lattner <sabre@nondot.org>
Tue, 7 Apr 2009 06:02:44 +0000 (06:02 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 7 Apr 2009 06:02:44 +0000 (06:02 +0000)
GCC ignores macro definitions after \n's or that real code depends
on this.

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

test/Preprocessor/macro-multiline.c [new file with mode: 0644]
tools/clang-cc/clang-cc.cpp

diff --git a/test/Preprocessor/macro-multiline.c b/test/Preprocessor/macro-multiline.c
new file mode 100644 (file)
index 0000000..eb15668
--- /dev/null
@@ -0,0 +1,8 @@
+// RUN: clang -E %s "-DX=A
+// RUN: THIS_SHOULD_NOT_EXIST_IN_THE_OUTPUT" > %t &&
+// RUN: grep "GOOD: A" %t &&
+// RUN: not grep THIS_SHOULD_NOT_EXIST_IN_THE_OUTPUT %t
+// rdar://6762183
+
+GOOD: X
+
index a2c06e6580501f2b1626d1bab6e3e7b57487b8d2..5a5ffc32af9963ae92961ffde5d22cd67785242c 100644 (file)
@@ -969,7 +969,12 @@ static void DefineBuiltinMacro(std::vector<char> &Buf, const char *Macro,
     // Turn the = into ' '.
     Buf.insert(Buf.end(), Macro, Equal);
     Buf.push_back(' ');
-    Buf.insert(Buf.end(), Equal+1, Equal+strlen(Equal));
+    
+    // Per GCC -D semantics, the macro ends at \n if it exists.
+    const char *End = strpbrk(Equal, "\n\r");
+    if (End == 0) End = Equal+strlen(Equal);
+    
+    Buf.insert(Buf.end(), Equal+1, End);
   } else {
     // Push "macroname 1".
     Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));