Author: vsapsai Date: Tue Apr 10 11:29:47 2018 New Revision: 329735 URL: http://llvm.org/viewvc/llvm-project?rev=329735&view=rev Log: [Parser] Fix assertion-on-invalid for unexpected typename.
In `ParseDeclarationSpecifiers` for the code class A typename A; we were able to annotate token `kw_typename` because it refers to existing type. But later during processing token `annot_typename` we failed to `SetTypeSpecType` and exited switch statement leaving annotation token unconsumed. The code after the switch statement failed because it didn't expect a special token. The fix is not to assume that switch statement consumes all special tokens and consume any token, not just non-special. rdar://problem/37099386 Reviewers: rsmith, arphaman Reviewed By: rsmith Subscribers: jkorous-apple, cfe-commits Differential Revision: https://reviews.llvm.org/D44449 Modified: cfe/trunk/lib/Parse/ParseDecl.cpp cfe/trunk/test/Parser/cxx-decl.cpp Modified: cfe/trunk/lib/Parse/ParseDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=329735&r1=329734&r2=329735&view=diff ============================================================================== --- cfe/trunk/lib/Parse/ParseDecl.cpp (original) +++ cfe/trunk/lib/Parse/ParseDecl.cpp Tue Apr 10 11:29:47 2018 @@ -3804,7 +3804,8 @@ void Parser::ParseDeclarationSpecifiers( DS.SetRangeEnd(Tok.getLocation()); if (DiagID != diag::err_bool_redeclaration) - ConsumeToken(); + // After an error the next token can be an annotation token. + ConsumeAnyToken(); AttrsLastTime = false; } Modified: cfe/trunk/test/Parser/cxx-decl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx-decl.cpp?rev=329735&r1=329734&r2=329735&view=diff ============================================================================== --- cfe/trunk/test/Parser/cxx-decl.cpp (original) +++ cfe/trunk/test/Parser/cxx-decl.cpp Tue Apr 10 11:29:47 2018 @@ -298,6 +298,11 @@ inline namespace ParensAroundFriend { // } } +namespace rdar37099386 { + class A typename A; // expected-error {{expected a qualified name after 'typename'}} + // expected-error@-1 {{cannot combine with previous 'class' declaration specifier}} +} + // PR8380 extern "" // expected-error {{unknown linkage language}} test6a { ;// expected-error {{C++ requires a type specifier for all declarations}} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits