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 llvm-svn: 191159
This commit is contained in:
@@ -1049,6 +1049,11 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression,
|
||||
// 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)))
|
||||
|
||||
@@ -108,6 +108,7 @@ bool Sema::isSimpleTypeSpecifier(tok::TokenKind Kind) const {
|
||||
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;
|
||||
|
||||
|
||||
@@ -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}} \
|
||||
|
||||
Reference in New Issue
Block a user