diff options
-rw-r--r-- | clang/lib/Parse/ParseExpr.cpp | 2 | ||||
-rw-r--r-- | clang/test/CXX/basic/basic.lookup/basic.lookup.qual/p6.cpp | 2 | ||||
-rw-r--r-- | clang/test/SemaTemplate/destructor-template.cpp | 10 |
3 files changed, 13 insertions, 1 deletions
diff --git a/clang/lib/Parse/ParseExpr.cpp b/clang/lib/Parse/ParseExpr.cpp index b036e568f8b..0059a9a0fe4 100644 --- a/clang/lib/Parse/ParseExpr.cpp +++ b/clang/lib/Parse/ParseExpr.cpp @@ -1022,6 +1022,8 @@ Parser::ParsePostfixExpressionSuffix(OwningExprResult LHS) { ParseOptionalCXXScopeSpecifier(SS, ObjectType, false, &MayBePseudoDestructor); + if (SS.isNotEmpty()) + ObjectType = 0; } if (Tok.is(tok::code_completion)) { diff --git a/clang/test/CXX/basic/basic.lookup/basic.lookup.qual/p6.cpp b/clang/test/CXX/basic/basic.lookup/basic.lookup.qual/p6.cpp index 633d5cda996..0956de3c2a8 100644 --- a/clang/test/CXX/basic/basic.lookup/basic.lookup.qual/p6.cpp +++ b/clang/test/CXX/basic/basic.lookup/basic.lookup.qual/p6.cpp @@ -20,5 +20,5 @@ struct A { typedef A AB; int main() { AB *p; - p->AB::~AB(); // expected-error{{identifier 'AB' in pseudo-destructor expression does not name a type}} + p->AB::~AB(); // expected-error{{expected the class name after '~' to name a destructor}} } diff --git a/clang/test/SemaTemplate/destructor-template.cpp b/clang/test/SemaTemplate/destructor-template.cpp index fa1b3e0001c..6fe7f69cdd5 100644 --- a/clang/test/SemaTemplate/destructor-template.cpp +++ b/clang/test/SemaTemplate/destructor-template.cpp @@ -40,3 +40,13 @@ namespace cvquals { template void f<const volatile int>(int *); } + +namespace PR7239 { + template<class E> class A { }; + class B { + void f() { + A<int>* x; + x->A<int>::~A<int>(); + } + }; +} |