aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-09-01 04:31:02 +0000
committerAnders Carlsson <andersca@mac.com>2009-09-01 04:31:02 +0000
commit9988d5d9ad0850e455bd413b03ba7dc8ecee5999 (patch)
tree9e4a8d65837345703efa446ed93b337eb645b7a7
parentd8b285fee4471f393da8ee30f552ceacdc362afa (diff)
Handle member initializers that point to fields in anonymous structs.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@80659 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Sema/SemaTemplateInstantiateDecl.cpp9
-rw-r--r--test/SemaTemplate/instantiate-anonymous-union.cpp12
2 files changed, 19 insertions, 2 deletions
diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp
index 84e464aba3..314a99322b 100644
--- a/lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -1153,8 +1153,13 @@ Sema::InstantiateMemInitializers(CXXConstructorDecl *New,
Init->getRParenLoc(),
New->getParent());
} else if (Init->isMemberInitializer()) {
- FieldDecl *Member =
- cast<FieldDecl>(FindInstantiatedDecl(Init->getMember()));
+ FieldDecl *Member;
+
+ // Is this an anonymous union?
+ if (FieldDecl *UnionInit = Init->getAnonUnionMember())
+ Member = cast<FieldDecl>(UnionInit);
+ else
+ Member = cast<FieldDecl>(FindInstantiatedDecl(Init->getMember()));
NewInit = BuildMemberInitializer(Member, (Expr **)NewArgs.data(),
NewArgs.size(),
diff --git a/test/SemaTemplate/instantiate-anonymous-union.cpp b/test/SemaTemplate/instantiate-anonymous-union.cpp
index 9c2467be64..2c1e9d4c19 100644
--- a/test/SemaTemplate/instantiate-anonymous-union.cpp
+++ b/test/SemaTemplate/instantiate-anonymous-union.cpp
@@ -19,3 +19,15 @@ template <typename T> struct B {
};
B<int> b0;
+
+template <typename T> struct C {
+ union {
+ int a;
+ void* b;
+ };
+
+ C(int a) : a(a) { }
+ C(void* b) : b(b) { }
+};
+
+C<int> c0;