summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2009-12-15 22:29:06 +0000
committerJohn McCall <rjmccall@apple.com>2009-12-15 22:29:06 +0000
commite9f92a017c8e48cc798dd04f196e73c93c044f42 (patch)
tree98295408c65e91d42b50529c915c9f365ba48333
parent5618e98f3345d87076550a56ebe571bf85e6d34e (diff)
downloadbcm5719-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.cpp6
-rw-r--r--clang/test/SemaTemplate/instantiate-member-class.cpp14
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);
+ }
+}
OpenPOWER on IntegriCloud