diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-08-17 00:31:23 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-08-17 00:31:23 +0000 |
commit | 0e870622e4d4b2ecb7bc6ffd2c97f74fd14220b6 (patch) | |
tree | 38fac8cc64f762ba10fb04be4e187cd9d9bfb779 /lib/Lex/Lexer.cpp | |
parent | ac836e442cbd17f33533bd0b4879258945bc1723 (diff) |
Make Lexer::GetBeginningOfToken able to handle macro arg expansion locations.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@137795 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Lex/Lexer.cpp')
-rw-r--r-- | lib/Lex/Lexer.cpp | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/lib/Lex/Lexer.cpp b/lib/Lex/Lexer.cpp index 0c32c8d9ba..25f07c9e4f 100644 --- a/lib/Lex/Lexer.cpp +++ b/lib/Lex/Lexer.cpp @@ -416,9 +416,10 @@ unsigned Lexer::MeasureTokenLength(SourceLocation Loc, return TheTok.getLength(); } -SourceLocation Lexer::GetBeginningOfToken(SourceLocation Loc, - const SourceManager &SM, - const LangOptions &LangOpts) { +static SourceLocation getBeginningOfFileToken(SourceLocation Loc, + const SourceManager &SM, + const LangOptions &LangOpts) { + assert(Loc.isFileID()); std::pair<FileID, unsigned> LocInfo = SM.getDecomposedLoc(Loc); if (LocInfo.first.isInvalid()) return Loc; @@ -475,6 +476,25 @@ SourceLocation Lexer::GetBeginningOfToken(SourceLocation Loc, return Loc; } +SourceLocation Lexer::GetBeginningOfToken(SourceLocation Loc, + const SourceManager &SM, + const LangOptions &LangOpts) { + if (Loc.isFileID()) + return getBeginningOfFileToken(Loc, SM, LangOpts); + + if (!SM.isMacroArgExpansion(Loc)) + return Loc; + + SourceLocation FileLoc = SM.getSpellingLoc(Loc); + SourceLocation BeginFileLoc = getBeginningOfFileToken(FileLoc, SM, LangOpts); + std::pair<FileID, unsigned> FileLocInfo = SM.getDecomposedLoc(FileLoc); + std::pair<FileID, unsigned> BeginFileLocInfo= SM.getDecomposedLoc(BeginFileLoc); + assert(FileLocInfo.first == BeginFileLocInfo.first && + FileLocInfo.second >= BeginFileLocInfo.second); + return Loc.getFileLocWithOffset(SM.getDecomposedLoc(BeginFileLoc).second - + SM.getDecomposedLoc(FileLoc).second); +} + namespace { enum PreambleDirectiveKind { PDK_Skipped, |