From: Chris Lattner Date: Tue, 7 Apr 2009 06:02:44 +0000 (+0000) Subject: implement rdar://6762183. I'm not sure if it is more insane that X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0b51415dcf72e42a047612e2dcfe656d3c4442ce;p=clang implement rdar://6762183. I'm not sure if it is more insane that 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 --- diff --git a/test/Preprocessor/macro-multiline.c b/test/Preprocessor/macro-multiline.c new file mode 100644 index 0000000000..eb15668ce3 --- /dev/null +++ b/test/Preprocessor/macro-multiline.c @@ -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 + diff --git a/tools/clang-cc/clang-cc.cpp b/tools/clang-cc/clang-cc.cpp index a2c06e6580..5a5ffc32af 100644 --- a/tools/clang-cc/clang-cc.cpp +++ b/tools/clang-cc/clang-cc.cpp @@ -969,7 +969,12 @@ static void DefineBuiltinMacro(std::vector &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));