diff options
-rw-r--r-- | lib/Sema/SemaTemplateInstantiateDecl.cpp | 9 | ||||
-rw-r--r-- | test/SemaTemplate/instantiate-anonymous-union.cpp | 12 |
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; |