r191159 - Parse: Don't crash during parsing if we lack a simple-type-specifier

David Majnemer david.majnemer at gmail.com
Sat Sep 21 18:24:26 PDT 2013


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}} \





More information about the cfe-commits mailing list