From: John McCall Date: Tue, 15 Dec 2009 22:29:06 +0000 (+0000) Subject: Link up member-class redeclarations during template instantiation. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6c1c1b8c6ca743a5b6b4c81f9ac56392c12c7457;p=clang Link up member-class redeclarations during template instantiation. This test courtesy of LLVM. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91462 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp index 8d74bd76ca..69982be84b 100644 --- a/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -645,6 +645,12 @@ Decl *TemplateDeclInstantiator::VisitCXXRecordDecl(CXXRecordDecl *D) { CXXRecordDecl *PrevDecl = 0; if (D->isInjectedClassName()) PrevDecl = cast(Owner); + else if (D->getPreviousDeclaration()) { + NamedDecl *Prev = SemaRef.FindInstantiatedDecl(D->getPreviousDeclaration(), + TemplateArgs); + if (!Prev) return 0; + PrevDecl = cast(Prev); + } CXXRecordDecl *Record = CXXRecordDecl::Create(SemaRef.Context, D->getTagKind(), Owner, diff --git a/test/SemaTemplate/instantiate-member-class.cpp b/test/SemaTemplate/instantiate-member-class.cpp index ff0efd800f..8a19d74cdd 100644 --- a/test/SemaTemplate/instantiate-member-class.cpp +++ b/test/SemaTemplate/instantiate-member-class.cpp @@ -36,3 +36,17 @@ void test_instantiation(X::C *x, X::C *c3; // okay X::D::E *e1; // okay X::D::E e2; // expected-note{{in instantiation of member class 'struct X::D::E' requested here}} + +// Redeclarations. +namespace test1 { + template struct Registry { + class node; + static node *Head; + class node { + node(int v) { Head = this; } + }; + }; + void test() { + Registry::node node(0); + } +}