From 64a54ad29929443006d4c8502173c163bedaa223 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Fri, 21 Aug 2009 17:09:38 +0000 Subject: 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 --- lib/CodeGen/CGCXX.cpp | 23 +++++++++++++++++------ test/CodeGenCXX/constructor-init.cpp | 3 +++ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/lib/CodeGen/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp index 15979be790..5bc8b40c63 100644 --- a/lib/CodeGen/CGCXX.cpp +++ b/lib/CodeGen/CGCXX.cpp @@ -1362,8 +1362,10 @@ void CodeGenFunction::EmitCtorPrologue(const CXXConstructorDecl *CD) { // 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 @@ void CodeGenFunction::EmitCtorPrologue(const CXXConstructorDecl *CD) { 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 { diff --git a/test/CodeGenCXX/constructor-init.cpp b/test/CodeGenCXX/constructor-init.cpp index a9d5c289e2..de86d41552 100644 --- a/test/CodeGenCXX/constructor-init.cpp +++ b/test/CodeGenCXX/constructor-init.cpp @@ -46,6 +46,9 @@ struct N : M , P, Q { } float ld; float ff; + M arr_m[3]; + P arr_p[1][3]; + Q arr_q[2][3][4]; }; int main() { -- cgit v1.2.3