vsapsai created this revision. vsapsai added reviewers: rsmith, arphaman. Herald added a subscriber: jkorous-apple.
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 https://reviews.llvm.org/D44449 Files: clang/lib/Parse/ParseDecl.cpp clang/test/Parser/cxx-decl.cpp Index: clang/test/Parser/cxx-decl.cpp =================================================================== --- clang/test/Parser/cxx-decl.cpp +++ clang/test/Parser/cxx-decl.cpp @@ -298,6 +298,11 @@ } } +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}} Index: clang/lib/Parse/ParseDecl.cpp =================================================================== --- clang/lib/Parse/ParseDecl.cpp +++ clang/lib/Parse/ParseDecl.cpp @@ -3799,7 +3799,7 @@ DS.SetRangeEnd(Tok.getLocation()); if (DiagID != diag::err_bool_redeclaration) - ConsumeToken(); + ConsumeAnyToken(); AttrsLastTime = false; }
Index: clang/test/Parser/cxx-decl.cpp =================================================================== --- clang/test/Parser/cxx-decl.cpp +++ clang/test/Parser/cxx-decl.cpp @@ -298,6 +298,11 @@ } } +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}} Index: clang/lib/Parse/ParseDecl.cpp =================================================================== --- clang/lib/Parse/ParseDecl.cpp +++ clang/lib/Parse/ParseDecl.cpp @@ -3799,7 +3799,7 @@ DS.SetRangeEnd(Tok.getLocation()); if (DiagID != diag::err_bool_redeclaration) - ConsumeToken(); + ConsumeAnyToken(); AttrsLastTime = false; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits