diff options
| author | John McCall <rjmccall@apple.com> | 2009-12-15 22:29:06 +0000 |
|---|---|---|
| committer | John McCall <rjmccall@apple.com> | 2009-12-15 22:29:06 +0000 |
| commit | e9f92a017c8e48cc798dd04f196e73c93c044f42 (patch) | |
| tree | 98295408c65e91d42b50529c915c9f365ba48333 | |
| parent | 5618e98f3345d87076550a56ebe571bf85e6d34e (diff) | |
| download | bcm5719-llvm-e9f92a017c8e48cc798dd04f196e73c93c044f42.tar.gz bcm5719-llvm-e9f92a017c8e48cc798dd04f196e73c93c044f42.zip | |
Link up member-class redeclarations during template instantiation.
This test courtesy of LLVM.
llvm-svn: 91462
| -rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateDecl.cpp | 6 | ||||
| -rw-r--r-- | clang/test/SemaTemplate/instantiate-member-class.cpp | 14 |
2 files changed, 20 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp index 8d74bd76ca5..69982be84b9 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -645,6 +645,12 @@ Decl *TemplateDeclInstantiator::VisitCXXRecordDecl(CXXRecordDecl *D) { CXXRecordDecl *PrevDecl = 0; if (D->isInjectedClassName()) PrevDecl = cast<CXXRecordDecl>(Owner); + else if (D->getPreviousDeclaration()) { + NamedDecl *Prev = SemaRef.FindInstantiatedDecl(D->getPreviousDeclaration(), + TemplateArgs); + if (!Prev) return 0; + PrevDecl = cast<CXXRecordDecl>(Prev); + } CXXRecordDecl *Record = CXXRecordDecl::Create(SemaRef.Context, D->getTagKind(), Owner, diff --git a/clang/test/SemaTemplate/instantiate-member-class.cpp b/clang/test/SemaTemplate/instantiate-member-class.cpp index ff0efd800f9..8a19d74cdde 100644 --- a/clang/test/SemaTemplate/instantiate-member-class.cpp +++ b/clang/test/SemaTemplate/instantiate-member-class.cpp @@ -36,3 +36,17 @@ void test_instantiation(X<double>::C *x, X<void>::C *c3; // okay X<void>::D::E *e1; // okay X<void>::D::E e2; // expected-note{{in instantiation of member class 'struct X<void>::D::E' requested here}} + +// Redeclarations. +namespace test1 { + template <typename T> struct Registry { + class node; + static node *Head; + class node { + node(int v) { Head = this; } + }; + }; + void test() { + Registry<int>::node node(0); + } +} |

