summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHans Wennborg <hans@hanshq.net>2017-02-01 16:59:51 +0000
committerHans Wennborg <hans@hanshq.net>2017-02-01 16:59:51 +0000
commitdff88e090e4672426dfdb219b0a6f804d7768c7a (patch)
treeee1f561501aaa599518ba083beb16121c7889c54
parent5114b5eb4c7d38c5a622948fd977e292a635236c (diff)
Merging r293678:
------------------------------------------------------------------------ r293678 | ahatanak | 2017-01-31 11:53:32 -0800 (Tue, 31 Jan 2017) | 9 lines [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 ------------------------------------------------------------------------ git-svn-id: https://llvm.org/svn/llvm-project/cfe/branches/release_40@293782 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Sema/SemaTemplateInstantiateDecl.cpp8
-rw-r--r--lib/Sema/TreeTransform.h8
-rw-r--r--test/SemaCXX/destructor.cpp20
3 files changed, 33 insertions, 3 deletions
diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp
index 48d8b94af1..200775756d 100644
--- a/lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -4996,8 +4996,12 @@ NamedDecl *Sema::FindInstantiatedDecl(SourceLocation Loc, NamedDecl *D,
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,
diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h
index c2aa3fef67..4388ad34e2 100644
--- a/lib/Sema/TreeTransform.h
+++ b/lib/Sema/TreeTransform.h
@@ -8818,12 +8818,18 @@ TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
// 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()
diff --git a/test/SemaCXX/destructor.cpp b/test/SemaCXX/destructor.cpp
index fe1dde5771..49cdc50f3c 100644
--- a/test/SemaCXX/destructor.cpp
+++ b/test/SemaCXX/destructor.cpp
@@ -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();
+}
+}