From: Chris Lattner Date: Mon, 9 Mar 2009 20:33:32 +0000 (+0000) Subject: fix PR3764 - A redefinition of a pre-processor macro fails X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=688a248e03f31312161db97e5e11a950b5b1369c;p=clang fix PR3764 - A redefinition of a pre-processor macro fails Redefinition checking should ignore the leading whitespace and start of line flags on the first token of an expansion. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66442 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Lex/MacroInfo.cpp b/lib/Lex/MacroInfo.cpp index de19ff502a..df89450f5a 100644 --- a/lib/Lex/MacroInfo.cpp +++ b/lib/Lex/MacroInfo.cpp @@ -49,9 +49,14 @@ bool MacroInfo::isIdenticalTo(const MacroInfo &Other, Preprocessor &PP) const { for (unsigned i = 0, e = ReplacementTokens.size(); i != e; ++i) { const Token &A = ReplacementTokens[i]; const Token &B = Other.ReplacementTokens[i]; - if (A.getKind() != B.getKind() || - A.isAtStartOfLine() != B.isAtStartOfLine() || - A.hasLeadingSpace() != B.hasLeadingSpace()) + if (A.getKind() != B.getKind()) + return false; + + // If this isn't the first first token, check that the whitespace and + // start-of-line characteristics match. + if (i != 0 && + (A.isAtStartOfLine() != B.isAtStartOfLine() || + A.hasLeadingSpace() != B.hasLeadingSpace())) return false; // If this is an identifier, it is easy. diff --git a/test/Preprocessor/macro_misc.c b/test/Preprocessor/macro_misc.c index 66e9e3fcf3..147e827df3 100644 --- a/test/Preprocessor/macro_misc.c +++ b/test/Preprocessor/macro_misc.c @@ -4,3 +4,20 @@ #ifdef defined #endif + + +// PR3764 + +// This should not produce a redefinition warning. +#define FUNC_LIKE(a) (a) +#define FUNC_LIKE(a)(a) + +// This either. +#define FUNC_LIKE2(a)\ +(a) +#define FUNC_LIKE2(a) (a) + +// This should. +#define FUNC_LIKE3(a) ( a) // expected-note {{previous definition is here}} +#define FUNC_LIKE3(a) (a) // expected-warning {{'FUNC_LIKE3' macro redefined}} +