]> granicus.if.org Git - clang/commitdiff
Follow-up to r217302: Don't crash on ~A::A in a postfix expr suffix followed by '<'.
authorNico Weber <nicolasweber@gmx.de>
Mon, 2 Feb 2015 05:33:50 +0000 (05:33 +0000)
committerNico Weber <nicolasweber@gmx.de>
Mon, 2 Feb 2015 05:33:50 +0000 (05:33 +0000)
This used to crash, complaining "ObjectType and scope specifier cannot coexist":

    struct A { } b = b.~A::A <int>;

The only other caller of ParseOptionalCXXScopeSpecifier() that passes in a
non-empty ObjectType clears the ObjectType of the scope specifier comes back
non-empty (see the tok::period case in Parser::ParsePostfixExpressionSuffix()),
so do that here too.

Found by SLi's bot.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@227781 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Parse/ParseExprCXX.cpp
test/Parser/cxx-class.cpp

index 506e13ac4ba307ea45b442af3a40985c7c12cf5d..10ae450fe893bb16f42d19d2dcad3dccc3768ae1 100644 (file)
@@ -2521,6 +2521,8 @@ bool Parser::ParseUnqualifiedId(CXXScopeSpec &SS, bool EnteringContext,
       }
       if (ParseOptionalCXXScopeSpecifier(SS, ObjectType, EnteringContext))
         return true;
+      if (SS.isNotEmpty())
+        ObjectType = ParsedType();
       if (Tok.isNot(tok::identifier) || NextToken().is(tok::coloncolon) ||
           SS.isInvalid()) {
         Diag(TildeLoc, diag::err_destructor_tilde_scope);
index 077bd6f02ceef98386c95491f195b7c64418780a..215c941a4610fcd42ae872b2d2cc4c27bf1b6012 100644 (file)
@@ -174,6 +174,11 @@ namespace DtorErrors {
     int I; // expected-note {{declared here}}
     ~I::I() {} // expected-error {{'I' is not a class, namespace, or enumeration}} expected-error {{'~' in destructor name should be after nested name specifier}}
   };
+
+  struct T {};
+  T t1 = t1.T::~T<int>; // expected-error {{destructor name 'T' does not refer to a template}} expected-error {{expected '(' for function-style cast or type construction}} expected-error {{expected expression}}
+  // Emit the same diagnostic as for the previous case, plus something about ~.
+  T t2 = t2.~T::T<int>; // expected-error {{'~' in destructor name should be after nested name specifier}} expected-error {{destructor name 'T' does not refer to a template}} expected-error {{expected '(' for function-style cast or type construction}} expected-error {{expected expression}}
 }
 
 namespace BadFriend {