forked from OSchip/llvm-project
Follow-up to r217302: Don't crash on ~A::A in a postfix expr suffix followed by '<'.
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. llvm-svn: 227781
This commit is contained in:
parent
16bbaf1639
commit
7f8ec52067
|
@ -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);
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue