[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