forked from OSchip/llvm-project
[preprocessor] Fix assertion hit when 'SingleFileParseMode' option is enabled and #if with an undefined identifier and without #else
'HandleEndifDirective' asserts that 'WasSkipping' is false, so switch to using 'FoundNonSkip' as the hint for 'SingleFileParseMode' to keep going with parsing. llvm-svn: 305940
This commit is contained in:
parent
ed54b4a798
commit
d750e1c491
|
@ -2658,7 +2658,7 @@ void Preprocessor::HandleIfdefDirective(Token &Result, bool isIfndef,
|
|||
// In 'single-file-parse mode' undefined identifiers trigger parsing of all
|
||||
// the directive blocks.
|
||||
CurPPLexer->pushConditionalLevel(DirectiveTok.getLocation(),
|
||||
/*wasskip*/true, /*foundnonskip*/false,
|
||||
/*wasskip*/false, /*foundnonskip*/false,
|
||||
/*foundelse*/false);
|
||||
} else if (!MI == isIfndef) {
|
||||
// Yes, remember that we are inside a conditional, then lex the next token.
|
||||
|
@ -2705,7 +2705,7 @@ void Preprocessor::HandleIfDirective(Token &IfToken,
|
|||
if (PPOpts->SingleFileParseMode && DER.IncludedUndefinedIds) {
|
||||
// In 'single-file-parse mode' undefined identifiers trigger parsing of all
|
||||
// the directive blocks.
|
||||
CurPPLexer->pushConditionalLevel(IfToken.getLocation(), /*wasskip*/true,
|
||||
CurPPLexer->pushConditionalLevel(IfToken.getLocation(), /*wasskip*/false,
|
||||
/*foundnonskip*/false, /*foundelse*/false);
|
||||
} else if (ConditionalTrue) {
|
||||
// Yes, remember that we are inside a conditional, then lex the next token.
|
||||
|
@ -2768,11 +2768,11 @@ void Preprocessor::HandleElseDirective(Token &Result) {
|
|||
if (Callbacks)
|
||||
Callbacks->Else(Result.getLocation(), CI.IfLoc);
|
||||
|
||||
if (PPOpts->SingleFileParseMode && CI.WasSkipping) {
|
||||
if (PPOpts->SingleFileParseMode && !CI.FoundNonSkip) {
|
||||
// In 'single-file-parse mode' undefined identifiers trigger parsing of all
|
||||
// the directive blocks.
|
||||
CurPPLexer->pushConditionalLevel(CI.IfLoc, /*wasskip*/false,
|
||||
/*foundnonskip*/true, /*foundelse*/true);
|
||||
/*foundnonskip*/false, /*foundelse*/true);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -2811,10 +2811,10 @@ void Preprocessor::HandleElifDirective(Token &ElifToken) {
|
|||
SourceRange(ConditionalBegin, ConditionalEnd),
|
||||
PPCallbacks::CVK_NotEvaluated, CI.IfLoc);
|
||||
|
||||
if (PPOpts->SingleFileParseMode && CI.WasSkipping) {
|
||||
if (PPOpts->SingleFileParseMode && !CI.FoundNonSkip) {
|
||||
// In 'single-file-parse mode' undefined identifiers trigger parsing of all
|
||||
// the directive blocks.
|
||||
CurPPLexer->pushConditionalLevel(ElifToken.getLocation(), /*wasskip*/true,
|
||||
CurPPLexer->pushConditionalLevel(ElifToken.getLocation(), /*wasskip*/false,
|
||||
/*foundnonskip*/false, /*foundelse*/false);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -109,3 +109,13 @@
|
|||
// CHECK: [[@LINE+1]]:12: ObjCInterfaceDecl=Test28
|
||||
@interface Test28 @end
|
||||
#endif
|
||||
|
||||
#if SOMETHING_NOT_DEFINED
|
||||
// CHECK: [[@LINE+1]]:12: ObjCInterfaceDecl=Test29
|
||||
@interface Test29 @end
|
||||
#endif
|
||||
|
||||
#ifdef SOMETHING_NOT_DEFINED
|
||||
// CHECK: [[@LINE+1]]:12: ObjCInterfaceDecl=Test30
|
||||
@interface Test30 @end
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue