Allow Lexer::getLocForEndOfToken to return the location just passed the macro instantiation

if the location given points at the last token of the macro instantiation.

Fixes rdar://9045701.

llvm-svn: 133804
This commit is contained in:
Argyrios Kyrtzidis 2011-06-24 17:58:59 +00:00
parent ca88b4abec
commit 2cfce18645
2 changed files with 15 additions and 2 deletions

View File

@ -679,9 +679,17 @@ SourceLocation Lexer::AdvanceToTokenCharacter(SourceLocation TokStart,
SourceLocation Lexer::getLocForEndOfToken(SourceLocation Loc, unsigned Offset,
const SourceManager &SM,
const LangOptions &Features) {
if (Loc.isInvalid() || !Loc.isFileID())
if (Loc.isInvalid())
return SourceLocation();
if (Loc.isMacroID()) {
if (Offset > 0 || !SM.isAtEndOfMacroInstantiation(Loc))
return SourceLocation(); // Points inside the macro instantiation.
// Continue and find the location just after the macro instantiation.
Loc = SM.getInstantiationRange(Loc).second;
}
unsigned Len = Lexer::MeasureTokenLength(Loc, SM, Features);
if (Len > Offset)
Len = Len - Offset;

View File

@ -74,6 +74,11 @@ void foo() {
X = 4 // expected-error{{expected ';' after expression}}
}
// rdar://9045701
void test9045701(int x) {
#define VALUE 0
x = VALUE // expected-error{{expected ';' after expression}}
}
// rdar://7980651
typedef int intptr_t; // expected-note {{'intptr_t' declared here}}