diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-05-27 15:25:59 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-05-27 15:25:59 +0000 |
commit | 9f716e4140da8d18165a702f81d2286a12e83a8c (patch) | |
tree | b32d3c53f0fd4b89618aa6c173dbdd956110f931 | |
parent | 25a0fe2a99aaf2d1bf5bdfdae7ab11e2a5e7622f (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.cpp | 2 | ||||
-rw-r--r-- | test/CXX/basic/basic.lookup/basic.lookup.qual/p6.cpp | 2 | ||||
-rw-r--r-- | test/SemaTemplate/destructor-template.cpp | 10 |
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>(); + } + }; +} |