Do not complain about junk on the end of a #endif in a skipped block. Such junk

is permitted by all relevant language standards. Patch by Andy Gibbs!

llvm-svn: 158883
This commit is contained in:
Richard Smith 2012-06-21 00:35:03 +00:00
parent 7bedfda489
commit d0124578ee
2 changed files with 30 additions and 1 deletions

View File

@ -317,7 +317,6 @@ void Preprocessor::SkipExcludedConditionalBlock(SourceLocation IfTokenLoc,
} else if (Directive[0] == 'e') {
StringRef Sub = Directive.substr(1);
if (Sub == "ndif") { // "endif"
CheckEndOfDirective("endif");
PPConditionalInfo CondInfo;
CondInfo.WasSkipping = true; // Silence bogus warning.
bool InCond = CurPPLexer->popConditionalLevel(CondInfo);
@ -326,9 +325,12 @@ void Preprocessor::SkipExcludedConditionalBlock(SourceLocation IfTokenLoc,
// If we popped the outermost skipping block, we're done skipping!
if (!CondInfo.WasSkipping) {
CheckEndOfDirective("endif");
if (Callbacks)
Callbacks->Endif(Tok.getLocation(), CondInfo.IfLoc);
break;
} else {
DiscardUntilEndOfDirective();
}
} else if (Sub == "lse") { // "else".
// #else directive in a skipping conditional. If not in some other

View File

@ -0,0 +1,27 @@
// RUN: %clang_cc1 -Eonly -verify %s
#if 0
#if 1
#endif junk // shouldn't produce diagnostics
#endif
#if 0
#endif junk // expected-warning{{extra tokens at end of #endif directive}}
#if 1 junk // expected-error{{token is not a valid binary operator in a preprocessor subexpression}}
#X // shouldn't produce diagnostics (block #if condition not valid, so skipped)
#else
#X // expected-error{{invalid preprocessing directive}}
#endif
#if 0
// diagnostics should not be produced until final #endif
#X
#include
#if 1 junk
#else junk
#endif junk
#line -2
#error
#warning
#endif junk // expected-warning{{extra tokens at end of #endif directive}}