forked from OSchip/llvm-project
Array member construction in prologue of user-declared
constructors. llvm-svn: 79640
This commit is contained in:
parent
23e62c532c
commit
7481bd88bb
|
@ -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,6 +1373,15 @@ void CodeGenFunction::EmitCtorPrologue(const CXXConstructorDecl *CD) {
|
|||
if (!Field->isAnonymousStructOrUnion()) {
|
||||
assert(Member->getConstructor() &&
|
||||
"EmitCtorPrologue - no constructor to initialize member");
|
||||
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(),
|
||||
|
|
|
@ -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() {
|
||||
|
|
Loading…
Reference in New Issue