diff options
Diffstat (limited to 'lib/Lex/PPDirectives.cpp')
-rw-r--r-- | lib/Lex/PPDirectives.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp index b242c8ba7e..fc147e420e 100644 --- a/lib/Lex/PPDirectives.cpp +++ b/lib/Lex/PPDirectives.cpp @@ -193,7 +193,8 @@ void Preprocessor::CheckEndOfDirective(const char *DirType, bool EnableMacros) { /// the first valid token. void Preprocessor::SkipExcludedConditionalBlock(SourceLocation IfTokenLoc, bool FoundNonSkipPortion, - bool FoundElse) { + bool FoundElse, + SourceLocation ElseLoc) { ++NumSkipped; assert(CurTokenLexer == 0 && CurPPLexer && "Lexing a macro, not a file?"); @@ -389,6 +390,11 @@ void Preprocessor::SkipExcludedConditionalBlock(SourceLocation IfTokenLoc, // of the file, just stop skipping and return to lexing whatever came after // the #if block. CurPPLexer->LexingRawMode = false; + + if (Callbacks) { + SourceLocation BeginLoc = ElseLoc.isValid() ? ElseLoc : IfTokenLoc; + Callbacks->SourceRangeSkipped(SourceRange(BeginLoc, Tok.getLocation())); + } } void Preprocessor::PTHSkipExcludedConditionalBlock() { @@ -1817,7 +1823,7 @@ void Preprocessor::HandleElseDirective(Token &Result) { // Finally, skip the rest of the contents of this block. SkipExcludedConditionalBlock(CI.IfLoc, /*Foundnonskip*/true, - /*FoundElse*/true); + /*FoundElse*/true, Result.getLocation()); if (Callbacks) Callbacks->Else(); @@ -1850,7 +1856,8 @@ void Preprocessor::HandleElifDirective(Token &ElifToken) { // Finally, skip the rest of the contents of this block. SkipExcludedConditionalBlock(CI.IfLoc, /*Foundnonskip*/true, - /*FoundElse*/CI.FoundElse); + /*FoundElse*/CI.FoundElse, + ElifToken.getLocation()); if (Callbacks) Callbacks->Elif(SourceRange(ConditionalBegin, ConditionalEnd)); |