r224505 - Parse: Don't parse after the eof has been consumed

Richard Smith richard at metafoo.co.uk
Thu Dec 18 17:53:28 PST 2014


On Thu, Dec 18, 2014 at 1:57 AM, David Majnemer <david.majnemer at gmail.com>
wrote:
>
> Author: majnemer
> Date: Thu Dec 18 03:57:31 2014
> New Revision: 224505
>
> URL: http://llvm.org/viewvc/llvm-project?rev=224505&view=rev
> Log:
> Parse: Don't parse after the eof has been consumed
>
> ParseCXXNonStaticMemberInitializer stashes away all the tokens for the
> initializer and an additional EOF token to denote where the initializer
> ends.  However, it is possible for ParseLexedMemberInitializer to get
> its hands on the "real" EOF token; since the two tokens are
> indistinguishable, we end up consuming the EOF and descend into madness.
>
> Instead, make it possible to tell which EOF token we are looking at.
>
> This fixes PR21872.
>
> Added:
>     cfe/trunk/test/Parser/PR21872.cpp
> Modified:
>     cfe/trunk/include/clang/Lex/Token.h
>     cfe/trunk/lib/Parse/ParseCXXInlineMethods.cpp
>
> Modified: cfe/trunk/include/clang/Lex/Token.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/Token.h?rev=224505&r1=224504&r2=224505&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Lex/Token.h (original)
> +++ cfe/trunk/include/clang/Lex/Token.h Thu Dec 18 03:57:31 2014
> @@ -23,6 +23,7 @@
>
>  namespace clang {
>
> +class Decl;
>

This is a layering violation; Lex should have no knowledge of AST-level
entities like Decls. Instead, just use an opaque void* pointer here and do
the casting in the Parser.


>  class IdentifierInfo;
>
>  /// Token - This structure provides full information about a lexed token.
> @@ -58,6 +59,8 @@ class Token {
>    ///    may be dirty (have trigraphs / escaped newlines).
>    ///  Annotations (resolved type names, C++ scopes, etc): isAnnotation().
>    ///    This is a pointer to sema-specific data for the annotation token.
> +  ///  Eof:
> +  //     This is a pointer to a Decl.
>    ///  Other:
>    ///    This is null.
>    void *PtrData;
> @@ -164,12 +167,23 @@ public:
>      assert(!isAnnotation() &&
>             "getIdentifierInfo() on an annotation token!");
>      if (isLiteral()) return nullptr;
> +    if (is(tok::eof)) return nullptr;
>

Maybe assert on this case rather than adding another branch to this
function? (I'd expect it to be relatively hot.)

     return (IdentifierInfo*) PtrData;
>    }
>    void setIdentifierInfo(IdentifierInfo *II) {
>      PtrData = (void*) II;
>    }
>
> +  const Decl *getDecl() const {
> +    assert(is(tok::eof));
> +    return reinterpret_cast<const Decl *>(PtrData);
> +  }
> +  void setDecl(const Decl *D) {
> +    assert(is(tok::eof));
> +    assert(!PtrData);
> +    PtrData = const_cast<Decl *>(D);
> +  }
>

Maybe setEofData?


> +
>    /// getRawIdentifier - For a raw identifier token (i.e., an identifier
>    /// lexed in raw mode), returns a reference to the text substring in the
>    /// buffer if known.
>
> Modified: cfe/trunk/lib/Parse/ParseCXXInlineMethods.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseCXXInlineMethods.cpp?rev=224505&r1=224504&r2=224505&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParseCXXInlineMethods.cpp (original)
> +++ cfe/trunk/lib/Parse/ParseCXXInlineMethods.cpp Thu Dec 18 03:57:31 2014
> @@ -218,6 +218,7 @@ void Parser::ParseCXXNonStaticMemberInit
>    Eof.startToken();
>    Eof.setKind(tok::eof);
>    Eof.setLocation(Tok.getLocation());
> +  Eof.setDecl(VarD);
>    Toks.push_back(Eof);
>  }
>
> @@ -622,7 +623,9 @@ void Parser::ParseLexedMemberInitializer
>      while (Tok.isNot(tok::eof))
>        ConsumeAnyToken();
>    }
> -  ConsumeAnyToken();
> +  // Make sure this is *our* artificial EOF token.
> +  if (Tok.getDecl() == MI.Field)
> +    ConsumeAnyToken();
>  }
>
>  /// ConsumeAndStoreUntil - Consume and store the token at the passed token
>
> Added: cfe/trunk/test/Parser/PR21872.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/PR21872.cpp?rev=224505&view=auto
>
> ==============================================================================
> --- cfe/trunk/test/Parser/PR21872.cpp (added)
> +++ cfe/trunk/test/Parser/PR21872.cpp Thu Dec 18 03:57:31 2014
> @@ -0,0 +1,4 @@
> +// RUN: not %clang_cc1 -fsyntax-only %s
> +template <typename T> struct S {
> +    int k =
> ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
> +int f;
>
>
> _______________________________________________
> 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/20141218/5a610eec/attachment.html>


More information about the cfe-commits mailing list