aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-03-09 20:33:32 +0000
committerChris Lattner <sabre@nondot.org>2009-03-09 20:33:32 +0000
commit688a248e03f31312161db97e5e11a950b5b1369c (patch)
treee05e9bb59ec02d3c916fb16a3c712fce15f37731
parentc3c489e64219b132c23110d6ba8d0d4e121bc5f8 (diff)
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
-rw-r--r--lib/Lex/MacroInfo.cpp11
-rw-r--r--test/Preprocessor/macro_misc.c17
2 files changed, 25 insertions, 3 deletions
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}}
+