Author: ahatanak Date: Tue Jan 31 13:53:32 2017 New Revision: 293678 URL: http://llvm.org/viewvc/llvm-project?rev=293678&view=rev Log: [Sema] Transform a templated name before looking it up in FindInstantiatedDecl or passing it to RebuildMemberExpr.
This fixes PR30361. rdar://problem/17341274 Differential Revision: https://reviews.llvm.org/D24969 Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp cfe/trunk/lib/Sema/TreeTransform.h cfe/trunk/test/SemaCXX/destructor.cpp Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp?rev=293678&r1=293677&r2=293678&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp (original) +++ cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp Tue Jan 31 13:53:32 2017 @@ -4990,8 +4990,12 @@ NamedDecl *Sema::FindInstantiatedDecl(So NamedDecl *Result = nullptr; // FIXME: If the name is a dependent name, this lookup won't necessarily // find it. Does that ever matter? - if (D->getDeclName()) { - DeclContext::lookup_result Found = ParentDC->lookup(D->getDeclName()); + if (auto Name = D->getDeclName()) { + DeclarationNameInfo NameInfo(Name, D->getLocation()); + Name = SubstDeclarationNameInfo(NameInfo, TemplateArgs).getName(); + if (!Name) + return nullptr; + DeclContext::lookup_result Found = ParentDC->lookup(Name); Result = findInstantiationOf(Context, D, Found.begin(), Found.end()); } else { // Since we don't have a name for the entity we're looking for, Modified: cfe/trunk/lib/Sema/TreeTransform.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=293678&r1=293677&r2=293678&view=diff ============================================================================== --- cfe/trunk/lib/Sema/TreeTransform.h (original) +++ cfe/trunk/lib/Sema/TreeTransform.h Tue Jan 31 13:53:32 2017 @@ -8966,12 +8966,18 @@ TreeTransform<Derived>::TransformMemberE // base (and therefore couldn't do the check) and a // nested-name-qualifier (and therefore could do the lookup). NamedDecl *FirstQualifierInScope = nullptr; + DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); + if (MemberNameInfo.getName()) { + MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); + if (!MemberNameInfo.getName()) + return ExprError(); + } return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, E->isArrow(), QualifierLoc, TemplateKWLoc, - E->getMemberNameInfo(), + MemberNameInfo, Member, FoundDecl, (E->hasExplicitTemplateArgs() Modified: cfe/trunk/test/SemaCXX/destructor.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/destructor.cpp?rev=293678&r1=293677&r2=293678&view=diff ============================================================================== --- cfe/trunk/test/SemaCXX/destructor.cpp (original) +++ cfe/trunk/test/SemaCXX/destructor.cpp Tue Jan 31 13:53:32 2017 @@ -431,3 +431,23 @@ class Invalid { // The constructor definition should not have errors Invalid::~Invalid() {} + +namespace PR30361 { +template <typename T> +struct C1 { + ~C1() {} + operator C1<T>* () { return nullptr; } + void foo1(); +}; + +template<typename T> +void C1<T>::foo1() { + C1::operator C1<T>*(); + C1::~C1(); +} + +void foo1() { + C1<int> x; + x.foo1(); +} +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits