aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-05-27 15:25:59 +0000
committerDouglas Gregor <dgregor@apple.com>2010-05-27 15:25:59 +0000
commit9f716e4140da8d18165a702f81d2286a12e83a8c (patch)
treeb32d3c53f0fd4b89618aa6c173dbdd956110f931
parent25a0fe2a99aaf2d1bf5bdfdae7ab11e2a5e7622f (diff)
When we've parsed a nested-name-specifier in a member access
expression, "forget" about the object type; only the nested-name-specifier matters for name lookup purposes. Fixes PR7239. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@104834 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Parse/ParseExpr.cpp2
-rw-r--r--test/CXX/basic/basic.lookup/basic.lookup.qual/p6.cpp2
-rw-r--r--test/SemaTemplate/destructor-template.cpp10
3 files changed, 13 insertions, 1 deletions
diff --git a/lib/Parse/ParseExpr.cpp b/lib/Parse/ParseExpr.cpp
index b036e568f8..0059a9a0fe 100644
--- a/lib/Parse/ParseExpr.cpp
+++ b/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/test/CXX/basic/basic.lookup/basic.lookup.qual/p6.cpp b/test/CXX/basic/basic.lookup/basic.lookup.qual/p6.cpp
index 633d5cda99..0956de3c2a 100644
--- a/test/CXX/basic/basic.lookup/basic.lookup.qual/p6.cpp
+++ b/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/test/SemaTemplate/destructor-template.cpp b/test/SemaTemplate/destructor-template.cpp
index fa1b3e0001..6fe7f69cdd 100644
--- a/test/SemaTemplate/destructor-template.cpp
+++ b/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>();
+ }
+ };
+}