diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2009-08-11 18:49:54 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-08-11 18:49:54 +0000 |
commit | e64941280877d065a27e8cefd2a9038256d0e3ac (patch) | |
tree | eb1f5ece8bd53df7f0ac1d689f4e7a21debd6c59 /lib/Sema/SemaDeclCXX.cpp | |
parent | b2fedb46056accb808d42c1754031b9bfa6aa69b (diff) |
ir-gen support for anonymous union data member
copying in copy constructors and used in
default constructor's initializer list.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@78700 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaDeclCXX.cpp')
-rw-r--r-- | lib/Sema/SemaDeclCXX.cpp | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index a0bcfb2b78..a4005bae34 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -880,10 +880,16 @@ static void *GetKeyForTopLevelField(FieldDecl *Field) { return static_cast<void *>(Field); } -static void *GetKeyForMember(CXXBaseOrMemberInitializer *Member) { +static void *GetKeyForMember(CXXBaseOrMemberInitializer *Member, + bool MemberMaybeAnon=false) { // For fields injected into the class via declaration of an anonymous union, // use its anonymous union class declaration as the unique key. if (FieldDecl *Field = Member->getMember()) { + // After BuildBaseOrMemberInitializers call, Field is the anonymous union + // data member of the class. Data member used in the initializer list is + // in AnonUnionMember field. + if (MemberMaybeAnon && Field->isAnonymousStructOrUnion()) + Field = Member->getAnonUnionMember(); if (Field->getDeclContext()->isRecord()) { RecordDecl *RD = cast<RecordDecl>(Field->getDeclContext()); if (RD->isAnonymousStructOrUnion()) @@ -973,7 +979,7 @@ void Sema::ActOnMemInitializers(DeclPtrTy ConstructorDecl, for (unsigned i = 0; i < NumMemInits; i++) { CXXBaseOrMemberInitializer *Member = static_cast<CXXBaseOrMemberInitializer*>(MemInits[i]); - void *MemberInCtorList = GetKeyForMember(Member); + void *MemberInCtorList = GetKeyForMember(Member, true); for (; curIndex < Last; curIndex++) if (MemberInCtorList == AllBaseOrMembers[curIndex]) |