Array member construction in prologue of user-declared
constructors.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@79640 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp
index 15979be..5bc8b40 100644
--- a/lib/CodeGen/CGCXX.cpp
+++ b/lib/CodeGen/CGCXX.cpp
@@ -1362,8 +1362,10 @@
       // non-static data member initilaizers.
       FieldDecl *Field = Member->getMember();
       QualType FieldType = getContext().getCanonicalType((Field)->getType());
-      assert(!getContext().getAsArrayType(FieldType) 
-             && "FIXME. Field arrays initialization unsupported");
+      const ConstantArrayType *Array = 
+      getContext().getAsConstantArrayType(FieldType);
+      if (Array)
+        FieldType = getContext().getBaseElementType(FieldType);
       
       LoadOfThis = LoadCXXThis();
       LValue LHS = EmitLValueForField(LoadOfThis, Field, false, 0);
@@ -1371,10 +1373,19 @@
         if (!Field->isAnonymousStructOrUnion()) {
           assert(Member->getConstructor() && 
                  "EmitCtorPrologue - no constructor to initialize member");
-          EmitCXXConstructorCall(Member->getConstructor(),
-                                 Ctor_Complete, LHS.getAddress(),
-                                 Member->const_arg_begin(), 
-                                 Member->const_arg_end());
+          if (Array) {
+            const llvm::Type *BasePtr = ConvertType(FieldType);
+            BasePtr = llvm::PointerType::getUnqual(BasePtr);
+            llvm::Value *BaseAddrPtr = 
+            Builder.CreateBitCast(LHS.getAddress(), BasePtr);
+            EmitCXXAggrConstructorCall(Member->getConstructor(), 
+                                       Array, BaseAddrPtr);
+          }
+          else
+            EmitCXXConstructorCall(Member->getConstructor(),
+                                   Ctor_Complete, LHS.getAddress(),
+                                   Member->const_arg_begin(), 
+                                   Member->const_arg_end());
           continue;
         }
         else {