[cfe-commits] r172639 - in /cfe/trunk: include/clang/Basic/DiagnosticLexKinds.td include/clang/Lex/Preprocessor.h lib/Lex/PPDirectives.cpp lib/Lex/PPMacroExpansion.cpp lib/Lex/Preprocessor.cpp test/Preprocessor/has_include.c
Eric Christopher
echristo at gmail.com
Wed Jan 16 12:10:50 PST 2013
Caused a -Wreorder warning that I fixed here in r172649.
-eric
On Wed, Jan 16, 2013 at 11:32 AM, Aaron Ballman <aaron at aaronballman.com>wrote:
> Author: aaronballman
> Date: Wed Jan 16 13:32:21 2013
> New Revision: 172639
>
> URL: http://llvm.org/viewvc/llvm-project?rev=172639&view=rev
> Log:
> No longer crashing with an assert when __has_include or __has_include_next
> is used outside of a preprocessor directive. This fixes PR14837.
>
> Modified:
> cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td
> cfe/trunk/include/clang/Lex/Preprocessor.h
> cfe/trunk/lib/Lex/PPDirectives.cpp
> cfe/trunk/lib/Lex/PPMacroExpansion.cpp
> cfe/trunk/lib/Lex/Preprocessor.cpp
> cfe/trunk/test/Preprocessor/has_include.c
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td?rev=172639&r1=172638&r2=172639&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticLexKinds.td Wed Jan 16
> 13:32:21 2013
> @@ -285,6 +285,8 @@
> def note_macro_here : Note<"macro %0 defined here">;
>
> def err_pp_invalid_directive : Error<"invalid preprocessing directive">;
> +def err_pp_directive_required : Error<
> + "%0 must be used within a preprocessing directive">;
> def err_pp_file_not_found : Error<"'%0' file not found">, DefaultFatal;
> def err_pp_file_not_found_not_fatal : Error<
> "'%0' file not found with <angled> include; use \"quotes\" instead">;
>
> Modified: cfe/trunk/include/clang/Lex/Preprocessor.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/Preprocessor.h?rev=172639&r1=172638&r2=172639&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Lex/Preprocessor.h (original)
> +++ cfe/trunk/include/clang/Lex/Preprocessor.h Wed Jan 16 13:32:21 2013
> @@ -160,6 +160,9 @@
> /// \brief True if pragmas are enabled.
> bool PragmasEnabled : 1;
>
> + /// \brief True if we are currently preprocessing a #if or #elif
> directive
> + bool ParsingIfOrElifDirective;
> +
> /// \brief True if we are pre-expanding macro arguments.
> bool InMacroArgPreExpansion;
>
> @@ -446,6 +449,11 @@
> /// \brief Retrieve the module loader associated with this preprocessor.
> ModuleLoader &getModuleLoader() const { return TheModuleLoader; }
>
> + /// \brief True if we are currently preprocessing a #if or #elif
> directive
> + bool isParsingIfOrElifDirective() const {
> + return ParsingIfOrElifDirective;
> + }
> +
> /// SetCommentRetentionState - Control whether or not the preprocessor
> retains
> /// comments in output.
> void SetCommentRetentionState(bool KeepComments, bool
> KeepMacroComments) {
>
> Modified: cfe/trunk/lib/Lex/PPDirectives.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPDirectives.cpp?rev=172639&r1=172638&r2=172639&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Lex/PPDirectives.cpp (original)
> +++ cfe/trunk/lib/Lex/PPDirectives.cpp Wed Jan 16 13:32:21 2013
> @@ -24,6 +24,7 @@
> #include "clang/Lex/Pragma.h"
> #include "llvm/ADT/APInt.h"
> #include "llvm/Support/ErrorHandling.h"
> +#include "llvm/Support/SaveAndRestore.h"
> using namespace clang;
>
>
> //===----------------------------------------------------------------------===//
> @@ -2071,6 +2072,7 @@
> ///
> void Preprocessor::HandleIfDirective(Token &IfToken,
> bool ReadAnyTokensBeforeDirective) {
> + SaveAndRestore<bool> PPDir(ParsingIfOrElifDirective, true);
> ++NumIf;
>
> // Parse and evaluate the conditional expression.
> @@ -2162,6 +2164,7 @@
> /// HandleElifDirective - Implements the \#elif directive.
> ///
> void Preprocessor::HandleElifDirective(Token &ElifToken) {
> + SaveAndRestore<bool> PPDir(ParsingIfOrElifDirective, true);
> ++NumElse;
>
> // #elif directive in a non-skipping conditional... start skipping.
>
> Modified: cfe/trunk/lib/Lex/PPMacroExpansion.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPMacroExpansion.cpp?rev=172639&r1=172638&r2=172639&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Lex/PPMacroExpansion.cpp (original)
> +++ cfe/trunk/lib/Lex/PPMacroExpansion.cpp Wed Jan 16 13:32:21 2013
> @@ -964,6 +964,12 @@
> // that location. If not, use the end of this location instead.
> SourceLocation LParenLoc = Tok.getLocation();
>
> + // These expressions are only allowed within a preprocessor directive.
> + if (!PP.isParsingIfOrElifDirective()) {
> + PP.Diag(LParenLoc, diag::err_pp_directive_required) << II->getName();
> + return false;
> + }
> +
> // Get '('.
> PP.LexNonComment(Tok);
>
>
> Modified: cfe/trunk/lib/Lex/Preprocessor.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/Preprocessor.cpp?rev=172639&r1=172638&r2=172639&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Lex/Preprocessor.cpp (original)
> +++ cfe/trunk/lib/Lex/Preprocessor.cpp Wed Jan 16 13:32:21 2013
> @@ -69,7 +69,8 @@
> CodeCompletionFile(0), CodeCompletionOffset(0),
> CodeCompletionReached(0),
> SkipMainFilePreamble(0, true), CurPPLexer(0),
> CurDirLookup(0), CurLexerKind(CLK_Lexer), Callbacks(0), Listener(0),
> - MacroArgCache(0), Record(0), MIChainHead(0), MICache(0)
> + MacroArgCache(0), Record(0), MIChainHead(0), MICache(0),
> + ParsingIfOrElifDirective(false)
> {
> OwnsHeaderSearch = OwnsHeaders;
>
>
> Modified: cfe/trunk/test/Preprocessor/has_include.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Preprocessor/has_include.c?rev=172639&r1=172638&r2=172639&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Preprocessor/has_include.c (original)
> +++ cfe/trunk/test/Preprocessor/has_include.c Wed Jan 16 13:32:21 2013
> @@ -91,6 +91,28 @@
> #error "__has_include with macro failed (2)."
> #endif
>
> +// Try as non-preprocessor directives
> +void foo( void ) {
> + __has_include_next("stdint.h") // expected-warning {{#include_next in
> primary source file}} expected-error {{__has_include_next must be used
> within a preprocessing directive}}
> + __has_include("stdint.h") // expected-error {{__has_include must be
> used within a preprocessing directive}}
> +}
> +
> +MACRO1 // expected-error {{__has_include must be used within a
> preprocessing directive}}
> +
> +#if 1
> +MACRO1 // expected-error {{__has_include must be used within a
> preprocessing directive}}
> +#endif
> +
> +#if 0
> +#elif 1
> +MACRO1 // expected-error {{__has_include must be used within a
> preprocessing directive}}
> +#endif
> +
> +#if 0
> +MACRO1 // This should be fine because it is never actually reached
> +#endif
> +
> +
> // Try badly formed expressions.
> // FIXME: We can recover better in almost all of these cases. (PR13335)
>
> @@ -126,7 +148,7 @@
> #if __has_include(stdint.h>)
> #endif
>
> -// expected-error at +1 {{missing '(' after '__has_include'}}
> +// expected-error at +1 {{__has_include must be used within a preprocessing
> directive}}
> __has_include
>
> // expected-error at +1 {{missing ')' after '__has_include'}} //
> expected-error at +1 {{expected value in expression}} // expected-note at +1
> {{to match this '('}}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130116/9c130369/attachment.html>
More information about the cfe-commits
mailing list