Array member construction in prologue of user-declared

constructors.

llvm-svn: 79640
This commit is contained in:
Fariborz Jahanian 2009-08-21 17:09:38 +00:00
parent 23e62c532c
commit 7481bd88bb
2 changed files with 20 additions and 6 deletions

View File

@ -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 {

View File

@ -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() {