aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2011-06-14 18:12:03 +0000
committerChris Lattner <sabre@nondot.org>2011-06-14 18:12:03 +0000
commit0e0b6931598be8a50ac5c6e0be595b35da276df9 (patch)
tree9cf56b781bb885d368178a2cd1ff6c74de119b01
parent1abd35950bcb0761887dca0995c68b8a9dc8916f (diff)
Fix a crash on the testcase in PR9981 / rdar://9486765.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@133003 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Lex/TokenLexer.cpp7
-rw-r--r--test/Preprocessor/macro_paste_bad.c6
2 files changed, 10 insertions, 3 deletions
diff --git a/lib/Lex/TokenLexer.cpp b/lib/Lex/TokenLexer.cpp
index 65aff0d1d0..751fd0133e 100644
--- a/lib/Lex/TokenLexer.cpp
+++ b/lib/Lex/TokenLexer.cpp
@@ -487,9 +487,10 @@ bool TokenLexer::PasteTokens(Token &Tok) {
// Explicitly convert the token location to have proper instantiation
// information so that the user knows where it came from.
SourceManager &SM = PP.getSourceManager();
- SourceLocation Loc =
- SM.createInstantiationLoc(PasteOpLoc, InstantiateLocStart,
- InstantiateLocEnd, 2);
+ SourceLocation Loc = PasteOpLoc;
+ if (InstantiateLocStart.isValid())
+ Loc = SM.createInstantiationLoc(Loc, InstantiateLocStart,
+ InstantiateLocEnd, 2);
// If we're in microsoft extensions mode, downgrade this from a hard
// error to a warning that defaults to an error. This allows
// disabling it.
diff --git a/test/Preprocessor/macro_paste_bad.c b/test/Preprocessor/macro_paste_bad.c
index 2af0173040..1c0b74ba29 100644
--- a/test/Preprocessor/macro_paste_bad.c
+++ b/test/Preprocessor/macro_paste_bad.c
@@ -33,3 +33,9 @@ XX // expected-error {{attempt to use a poisoned identifier}}
int VA; // expected-warning {{__VA_ARGS__ can only appear in the expansion of a C99 variadic macro}}
+// PR9981
+#define M1(A) A
+#define M2(X)
+M1(M2(##)) // expected-error {{pasting formed '()', an invalid preprocessing token}}
+
+