summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/Parse/ParseExpr.cpp2
-rw-r--r--clang/test/CXX/basic/basic.lookup/basic.lookup.qual/p6.cpp2
-rw-r--r--clang/test/SemaTemplate/destructor-template.cpp10
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>();
+ }
+ };
+}
OpenPOWER on IntegriCloud