[Preprocessor] When checking if we can concatenate two tokens, check

if they were already concatenated in source using the spelling locations
even if they came from a macro expansion.

This fixes an issue where a GUID passed as macro argument ends up
malformed after preprocessing because we added spaces inside it.

rdar://13016645

llvm-svn: 173826
This commit is contained in:
Argyrios Kyrtzidis 2013-01-29 20:28:24 +00:00
parent dd60e09021
commit 005206a813
2 changed files with 10 additions and 3 deletions

View File

@ -156,9 +156,10 @@ bool TokenConcatenation::AvoidConcat(const Token &PrevPrevTok,
// 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().getLocWithOffset(PrevTok.getLength()) ==
Tok.getLocation())
SourceManager &SM = PP.getSourceManager();
SourceLocation PrevSpellLoc = SM.getSpellingLoc(PrevTok.getLocation());
SourceLocation SpellLoc = SM.getSpellingLoc(Tok.getLocation());
if (PrevSpellLoc.getLocWithOffset(PrevTok.getLength()) == SpellLoc)
return false;
tok::TokenKind PrevKind = PrevTok.getKind();

View File

@ -31,3 +31,9 @@ E: test(str)
#define equal =
F: >>equal
// CHECK: F: >> =
// Make sure we don't introduce spaces in the guid because we try to avoid
// pasting '-' to a numeric constant.
#define TYPEDEF(guid) typedef [uuid(guid)]
TYPEDEF(66504301-BE0F-101A-8BBB-00AA00300CAB) long OLE_COLOR;
// CHECK: typedef [uuid(66504301-BE0F-101A-8BBB-00AA00300CAB)] long OLE_COLOR;