ahatanak updated this revision to Diff 74324. ahatanak added a comment. Added a call to operator C1<T>* in test case.
https://reviews.llvm.org/D24969 Files: lib/Sema/SemaTemplateInstantiateDecl.cpp lib/Sema/TreeTransform.h test/SemaCXX/destructor.cpp Index: test/SemaCXX/destructor.cpp =================================================================== --- test/SemaCXX/destructor.cpp +++ test/SemaCXX/destructor.cpp @@ -431,3 +431,23 @@ // 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(); +} +} Index: lib/Sema/TreeTransform.h =================================================================== --- lib/Sema/TreeTransform.h +++ lib/Sema/TreeTransform.h @@ -2119,6 +2119,11 @@ NamedDecl *FirstQualifierInScope) { ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, isArrow); + DeclarationNameInfo DNI = MemberNameInfo; + + if (isa<CXXDestructorDecl>(FoundDecl)) + DNI = getDerived().TransformDeclarationNameInfo(MemberNameInfo); + if (!Member->getDeclName()) { // We have a reference to an unnamed field. This is always the // base of an anonymous struct/union member access, i.e. the @@ -2136,7 +2141,7 @@ Base = BaseResult.get(); ExprValueKind VK = isArrow ? VK_LValue : Base->getValueKind(); MemberExpr *ME = new (getSema().Context) - MemberExpr(Base, isArrow, OpLoc, Member, MemberNameInfo, + MemberExpr(Base, isArrow, OpLoc, Member, DNI, cast<FieldDecl>(Member)->getType(), VK, OK_Ordinary); return ME; } @@ -2149,7 +2154,7 @@ // FIXME: this involves duplicating earlier analysis in a lot of // cases; we should avoid this when possible. - LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); + LookupResult R(getSema(), DNI, Sema::LookupMemberName); R.addDecl(FoundDecl); R.resolveKind(); Index: lib/Sema/SemaTemplateInstantiateDecl.cpp =================================================================== --- lib/Sema/SemaTemplateInstantiateDecl.cpp +++ lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -4846,7 +4846,11 @@ NamedDecl *Result = nullptr; if (D->getDeclName()) { - DeclContext::lookup_result Found = ParentDC->lookup(D->getDeclName()); + DeclarationName Name = D->getDeclName(); + if (auto *DD = dyn_cast<CXXDestructorDecl>(D)) + Name = + SubstDeclarationNameInfo(DD->getNameInfo(), TemplateArgs).getName(); + 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,
Index: test/SemaCXX/destructor.cpp =================================================================== --- test/SemaCXX/destructor.cpp +++ test/SemaCXX/destructor.cpp @@ -431,3 +431,23 @@ // 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(); +} +} Index: lib/Sema/TreeTransform.h =================================================================== --- lib/Sema/TreeTransform.h +++ lib/Sema/TreeTransform.h @@ -2119,6 +2119,11 @@ NamedDecl *FirstQualifierInScope) { ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, isArrow); + DeclarationNameInfo DNI = MemberNameInfo; + + if (isa<CXXDestructorDecl>(FoundDecl)) + DNI = getDerived().TransformDeclarationNameInfo(MemberNameInfo); + if (!Member->getDeclName()) { // We have a reference to an unnamed field. This is always the // base of an anonymous struct/union member access, i.e. the @@ -2136,7 +2141,7 @@ Base = BaseResult.get(); ExprValueKind VK = isArrow ? VK_LValue : Base->getValueKind(); MemberExpr *ME = new (getSema().Context) - MemberExpr(Base, isArrow, OpLoc, Member, MemberNameInfo, + MemberExpr(Base, isArrow, OpLoc, Member, DNI, cast<FieldDecl>(Member)->getType(), VK, OK_Ordinary); return ME; } @@ -2149,7 +2154,7 @@ // FIXME: this involves duplicating earlier analysis in a lot of // cases; we should avoid this when possible. - LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); + LookupResult R(getSema(), DNI, Sema::LookupMemberName); R.addDecl(FoundDecl); R.resolveKind(); Index: lib/Sema/SemaTemplateInstantiateDecl.cpp =================================================================== --- lib/Sema/SemaTemplateInstantiateDecl.cpp +++ lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -4846,7 +4846,11 @@ NamedDecl *Result = nullptr; if (D->getDeclName()) { - DeclContext::lookup_result Found = ParentDC->lookup(D->getDeclName()); + DeclarationName Name = D->getDeclName(); + if (auto *DD = dyn_cast<CXXDestructorDecl>(D)) + Name = + SubstDeclarationNameInfo(DD->getNameInfo(), TemplateArgs).getName(); + 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,
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits