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

David Majnemer david.majnemer at gmail.com
Thu Dec 18 18:15:01 PST 2014


On Thu, Dec 18, 2014 at 5:53 PM, Richard Smith <richard at metafoo.co.uk>
wrote:
>
> 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.
>

Fixed in r224562.


>
>
>>  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.)
>

Asserting that it's not eof gives me over a thousand failures in the test
suite.  I'll try to dig into that later.


>
>      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?
>

Done in r224562.


>
>
>> +
>>    /// 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/4fd4c5cd/attachment.html>


More information about the cfe-commits mailing list