From: Chris Lattner Date: Mon, 24 Sep 2007 05:14:57 +0000 (+0000) Subject: If we see an invalid #ifdef directive, enter a conditional compilation region X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f37bb25120f2b9532443aaee03b7a909eb27af9a;p=clang If we see an invalid #ifdef directive, enter a conditional compilation region so that we don't emit an error on the #endif. Suggestion by Neil. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@42258 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Lex/Preprocessor.cpp b/Lex/Preprocessor.cpp index b51222cefd..f43eae1c98 100644 --- a/Lex/Preprocessor.cpp +++ b/Lex/Preprocessor.cpp @@ -2121,8 +2121,13 @@ void Preprocessor::HandleIfdefDirective(Token &Result, bool isIfndef, ReadMacroName(MacroNameTok); // Error reading macro name? If so, diagnostic already issued. - if (MacroNameTok.getKind() == tok::eom) + if (MacroNameTok.getKind() == tok::eom) { + // Skip code until we get to #endif. This helps with recovery by not + // emitting an error when the #endif is reached. + SkipExcludedConditionalBlock(DirectiveTok.getLocation(), + /*Foundnonskip*/false, /*FoundElse*/false); return; + } // Check to see if this is the last token on the #if[n]def line. CheckEndOfDirective(isIfndef ? "#ifndef" : "#ifdef"); diff --git a/test/Preprocessor/ifdef-recover.c b/test/Preprocessor/ifdef-recover.c new file mode 100644 index 0000000000..2009514f5e --- /dev/null +++ b/test/Preprocessor/ifdef-recover.c @@ -0,0 +1,7 @@ +/* RUN: clang %s 2>&1 | grep error: | count 1 + */ + +#ifdef + +#endif +