]> granicus.if.org Git - clang/commitdiff
Reorganize EmitMemberInitializer to put anonymous unions on the common codepath.
authorEli Friedman <eli.friedman@gmail.com>
Mon, 16 Nov 2009 23:34:11 +0000 (23:34 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Mon, 16 Nov 2009 23:34:11 +0000 (23:34 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@88995 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGCXX.cpp

index 9138059d6229eae44ef1c43ef4216f3f5b8085ae..442d4fc30e12ffc2c9b51d316a8aad2e2554745a 100644 (file)
@@ -1515,11 +1515,7 @@ static void EmitMemberInitializer(CodeGenFunction &CGF,
   
   // non-static data member initializers.
   FieldDecl *Field = MemberInit->getMember();
-  QualType FieldType = CGF.getContext().getCanonicalType((Field)->getType());
-  const ConstantArrayType *Array =
-    CGF.getContext().getAsConstantArrayType(FieldType);
-  if (Array)
-    FieldType = CGF.getContext().getBaseElementType(FieldType);
+  QualType FieldType = CGF.getContext().getCanonicalType(Field->getType());
 
   llvm::Value *ThisPtr = CGF.LoadCXXThis();
   LValue LHS;
@@ -1532,32 +1528,38 @@ static void EmitMemberInitializer(CodeGenFunction &CGF,
   } else {
     LHS = CGF.EmitLValueForField(ThisPtr, Field, ClassDecl->isUnion(), 0);
   }
+
+  // If we are initializing an anonymous union field, drill down to the field.
+  if (MemberInit->getAnonUnionMember()) {
+    Field = MemberInit->getAnonUnionMember();
+    LHS = CGF.EmitLValueForField(LHS.getAddress(), Field,
+                                 /*IsUnion=*/true, 0);
+    FieldType = Field->getType();
+  }
+
+  // If the field is an array, branch based on the element type.
+  const ConstantArrayType *Array =
+    CGF.getContext().getAsConstantArrayType(FieldType);
+  if (Array)
+    FieldType = CGF.getContext().getBaseElementType(FieldType);
+
   if (FieldType->getAs<RecordType>()) {
-    if (!Field->isAnonymousStructOrUnion()) {
-      assert(MemberInit->getConstructor() &&
-             "EmitCtorPrologue - no constructor to initialize member");
-      if (Array) {
-        const llvm::Type *BasePtr = CGF.ConvertType(FieldType);
-        BasePtr = llvm::PointerType::getUnqual(BasePtr);
-        llvm::Value *BaseAddrPtr =
-          CGF.Builder.CreateBitCast(LHS.getAddress(), BasePtr);
-        CGF.EmitCXXAggrConstructorCall(MemberInit->getConstructor(),
-                                       Array, BaseAddrPtr);
-      }
-      else
-        CGF.EmitCXXConstructorCall(MemberInit->getConstructor(),
-                                   Ctor_Complete, LHS.getAddress(),
-                                   MemberInit->const_arg_begin(),
-                                   MemberInit->const_arg_end());
-      return;
-    }
-    else {
-      // Initializing an anonymous union data member.
-      FieldDecl *anonMember = MemberInit->getAnonUnionMember();
-      LHS = CGF.EmitLValueForField(LHS.getAddress(), anonMember,
-                                   /*IsUnion=*/true, 0);
-      FieldType = anonMember->getType();
+    assert(MemberInit->getConstructor() &&
+           "EmitCtorPrologue - no constructor to initialize member");
+    if (Array) {
+      const llvm::Type *BasePtr = CGF.ConvertType(FieldType);
+      BasePtr = llvm::PointerType::getUnqual(BasePtr);
+      llvm::Value *BaseAddrPtr =
+        CGF.Builder.CreateBitCast(LHS.getAddress(), BasePtr);
+      CGF.EmitCXXAggrConstructorCall(MemberInit->getConstructor(),
+                                     Array, BaseAddrPtr);
     }
+    else
+      CGF.EmitCXXConstructorCall(MemberInit->getConstructor(),
+                                 Ctor_Complete, LHS.getAddress(),
+                                 MemberInit->const_arg_begin(),
+                                 MemberInit->const_arg_end());
+    return;
   }
 
   assert(MemberInit->getNumArgs() == 1 && "Initializer count must be 1 only");