From: Anders Carlsson Date: Tue, 1 Sep 2009 04:31:02 +0000 (+0000) Subject: Handle member initializers that point to fields in anonymous structs. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9988d5d9ad0850e455bd413b03ba7dc8ecee5999;p=clang 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 --- 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(FindInstantiatedDecl(Init->getMember())); + FieldDecl *Member; + + // Is this an anonymous union? + if (FieldDecl *UnionInit = Init->getAnonUnionMember()) + Member = cast(UnionInit); + else + Member = cast(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 struct B { }; B b0; + +template struct C { + union { + int a; + void* b; + }; + + C(int a) : a(a) { } + C(void* b) : b(b) { } +}; + +C c0;