diff options
| author | David Majnemer <david.majnemer@gmail.com> | 2013-09-22 01:24:26 +0000 |
|---|---|---|
| committer | David Majnemer <david.majnemer@gmail.com> | 2013-09-22 01:24:26 +0000 |
| commit | a5e92556ac18ff0fde5000ee252d79fe2c4a7b00 (patch) | |
| tree | 977dfdcf8ecbc17c3b7b4a8abfee7bcb9037faac /clang | |
| parent | e9ef51222b8b00074a7a66d15dd3b280c2f07133 (diff) | |
| download | bcm5719-llvm-a5e92556ac18ff0fde5000ee252d79fe2c4a7b00.tar.gz bcm5719-llvm-a5e92556ac18ff0fde5000ee252d79fe2c4a7b00.zip | |
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
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Parse/ParseExpr.cpp | 5 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 1 | ||||
| -rw-r--r-- | clang/test/Parser/cxx-decl.cpp | 8 |
3 files changed, 14 insertions, 0 deletions
diff --git a/clang/lib/Parse/ParseExpr.cpp b/clang/lib/Parse/ParseExpr.cpp index bbc7dadde8f..9719d857f39 100644 --- a/clang/lib/Parse/ParseExpr.cpp +++ b/clang/lib/Parse/ParseExpr.cpp @@ -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))) diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 68762e97fa2..92400df00ce 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -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; diff --git a/clang/test/Parser/cxx-decl.cpp b/clang/test/Parser/cxx-decl.cpp index 281e33b20f8..c33a8d561ca 100644 --- a/clang/test/Parser/cxx-decl.cpp +++ b/clang/test/Parser/cxx-decl.cpp @@ -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}} \ |

