diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 3cbba8c9ff55..4cb58d8d19c9 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -66,32 +66,26 @@ Action::TypeTy *Sema::getDestructorName(SourceLocation TildeLoc, // If a pseudo-destructor-name (5.2.4) contains a // nested-name-specifier, the type-names are looked up as types // in the scope designated by the nested-name-specifier. Similarly, in - // a qualified-id of theform: + // a qualified-id of the form: // // :: [opt] nested-name-specifier[opt] class-name :: ~class-name // // the second class-name is looked up in the same scope as the first. // - // To implement this, we look at the prefix of the - // nested-name-specifier we were given, and determine the lookup - // context from that. - NestedNameSpecifier *NNS = (NestedNameSpecifier *)SS.getScopeRep(); - if (NestedNameSpecifier *Prefix = NNS->getPrefix()) { - CXXScopeSpec PrefixSS; - PrefixSS.setScopeRep(Prefix); - LookupCtx = computeDeclContext(PrefixSS, EnteringContext); - isDependent = isDependentScopeSpecifier(PrefixSS); - } else if (ObjectTypePtr) { + // FIXME: We don't implement this, because it breaks lots of + // perfectly reasonable code that no other compilers diagnose. The + // issue is that the first class-name is looked up as a + // nested-name-specifier, so we ignore value declarations, but the + // second lookup is presumably an ordinary name lookup. Hence, we + // end up finding values (say, a function) and complain. See PRs + // 6358 and 6359 for examples of such code. DPG to investigate + // further. + if (ObjectTypePtr) { LookupCtx = computeDeclContext(SearchType); isDependent = SearchType->isDependentType(); } else { LookupCtx = computeDeclContext(SS, EnteringContext); - if (LookupCtx && !LookupCtx->isTranslationUnit()) { - LookupCtx = LookupCtx->getParent(); - isDependent = LookupCtx->isDependentContext(); - } else { - isDependent = false; - } + isDependent = LookupCtx->isDependentContext(); } LookInScope = false; diff --git a/clang/test/SemaCXX/pseudo-destructors.cpp b/clang/test/SemaCXX/pseudo-destructors.cpp index 13ffe1b2005c..02e2c14ca117 100644 --- a/clang/test/SemaCXX/pseudo-destructors.cpp +++ b/clang/test/SemaCXX/pseudo-destructors.cpp @@ -28,7 +28,7 @@ void f(A* a, Foo *f, int *i) { g().~Bar(); // expected-error{{non-scalar}} f->::~Bar(); - f->N::~Wibble(); // expected-error{{expected the class name after '~' to name a destructor}} + f->N::~Wibble(); // FIXME: Cannot use typedef name in destructor id. f->::~Bar(17, 42); // expected-error{{cannot have any arguments}} }