apply Eli's patch to fix PR4008, with a testcase. Thanks Eli!

llvm-svn: 69750
This commit is contained in:
Chris Lattner 2009-04-21 23:28:41 +00:00
parent c8e236278e
commit ca515ccb49
2 changed files with 20 additions and 7 deletions

View File

@ -126,6 +126,14 @@ static char GetFirstChar(Preprocessor &PP, const Token &Tok) {
/// don't want to track enough to tell "x.." from "...".
bool TokenConcatenation::AvoidConcat(const Token &PrevTok,
const Token &Tok) const {
// First, check to see if the tokens were directly adjacent in the original
// source. If they were, it must be okay to stick them together: if there
// were an issue, the tokens would have been lexed differently.
if (PrevTok.getLocation().isFileID() && Tok.getLocation().isFileID() &&
PrevTok.getLocation().getFileLocWithOffset(PrevTok.getLength()) ==
Tok.getLocation())
return false;
tok::TokenKind PrevKind = PrevTok.getKind();
if (PrevTok.getIdentifierInfo()) // Language keyword or named operator.
PrevKind = tok::identifier;

View File

@ -1,18 +1,23 @@
// RUN: clang-cc -E %s | grep '+ + - - + + = = =' &&
// RUN: clang-cc -E %s | not grep -F '...' &&
// RUN: clang-cc -E %s | not grep -F 'L"str"'
// RUN: clang-cc -E %s -o %t &&
// This should print as ".. ." to avoid turning into ...
// RUN: grep -F 'A: . . .' %t &&
#define y(a) ..a
y(.)
A: y(.)
// RUN: grep -F 'C: .. .' %t &&
#define DOT .
C: ..DOT
// RUN: grep -F 'D: + + - - + + = = =' %t &&
#define PLUS +
#define EMPTY
#define f(x) =x=
+PLUS -EMPTY- PLUS+ f(=)
D: +PLUS -EMPTY- PLUS+ f(=)
// RUN: grep -F 'E: L "str"' %t
// Should expand to L "str" not L"str"
#define test(x) L#x
test(str)
E: test(str)