Author: majnemer Date: Sat Sep 21 20:24:26 2013 New Revision: 191159 URL: http://llvm.org/viewvc/llvm-project?rev=191159&view=rev Log: Parse: Don't crash during parsing if we lack a simple-type-specifier
Summary: Parsing cast expressions during error recovery can put us in a bad state. Check to see if the token for a simple-type-specifier makes sense before further parsing. Fixes PR17255. Reviewers: rsmith, doug.gregor, CornedBee, eli.friedman CC: cfe-commits Differential Revision: http://llvm-reviews.chandlerc.com/D1696 Modified: cfe/trunk/lib/Parse/ParseExpr.cpp cfe/trunk/lib/Sema/SemaDecl.cpp cfe/trunk/test/Parser/cxx-decl.cpp Modified: cfe/trunk/lib/Parse/ParseExpr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseExpr.cpp?rev=191159&r1=191158&r2=191159&view=diff ============================================================================== --- cfe/trunk/lib/Parse/ParseExpr.cpp (original) +++ cfe/trunk/lib/Parse/ParseExpr.cpp Sat Sep 21 20:24:26 2013 @@ -1049,6 +1049,11 @@ ExprResult Parser::ParseCastExpression(b // simple-type-specifier braced-init-list // DeclSpec DS(AttrFactory); + + if (!Actions.isSimpleTypeSpecifier(Tok.getKind())) + // This can happen if we tried to recover from errors earlier. + return ExprError(); + ParseCXXSimpleTypeSpecifier(DS); if (Tok.isNot(tok::l_paren) && (!getLangOpts().CPlusPlus11 || Tok.isNot(tok::l_brace))) Modified: cfe/trunk/lib/Sema/SemaDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=191159&r1=191158&r2=191159&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) +++ cfe/trunk/lib/Sema/SemaDecl.cpp Sat Sep 21 20:24:26 2013 @@ -108,6 +108,7 @@ bool Sema::isSimpleTypeSpecifier(tok::To case tok::kw_char16_t: case tok::kw_char32_t: case tok::kw_typeof: + case tok::annot_decltype: case tok::kw_decltype: return getLangOpts().CPlusPlus; Modified: cfe/trunk/test/Parser/cxx-decl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx-decl.cpp?rev=191159&r1=191158&r2=191159&view=diff ============================================================================== --- cfe/trunk/test/Parser/cxx-decl.cpp (original) +++ cfe/trunk/test/Parser/cxx-decl.cpp Sat Sep 21 20:24:26 2013 @@ -209,6 +209,14 @@ namespace PR5066 { using T = int (*T)(); // expected-error {{type-id cannot have a name}} expected-warning {{C++11}} } +namespace PR17255 { +void foo() { + typename A::template B<>; // expected-error {{use of undeclared identifier 'A'}} \ + // expected-error {{expected a qualified name after 'typename'}} \ + // expected-warning {{'template' keyword outside of a template}} +} +} + // PR8380 extern "" // expected-error {{unknown linkage language}} test6a { ;// expected-error {{C++ requires a type specifier for all declarations}} \ _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
