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
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp
index a0bcfb2..a4005ba 100644
--- a/lib/Sema/SemaDeclCXX.cpp
+++ b/lib/Sema/SemaDeclCXX.cpp
@@ -880,10 +880,16 @@
   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 @@
     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])