forked from OSchip/llvm-project
[CodeGen] Fix a crash when updating a designated initializer
We need to handle the ConstantAggregateZero case here too. rdar://45691981 Differential revision: https://reviews.llvm.org/D54010 llvm-svn: 346004
This commit is contained in:
parent
12950118c9
commit
e3b7144e6a
|
@ -47,7 +47,7 @@ class ConstStructBuilder {
|
|||
public:
|
||||
static llvm::Constant *BuildStruct(ConstantEmitter &Emitter,
|
||||
ConstExprEmitter *ExprEmitter,
|
||||
llvm::ConstantStruct *Base,
|
||||
llvm::Constant *Base,
|
||||
InitListExpr *Updater,
|
||||
QualType ValTy);
|
||||
static llvm::Constant *BuildStruct(ConstantEmitter &Emitter,
|
||||
|
@ -76,7 +76,7 @@ private:
|
|||
void ConvertStructToPacked();
|
||||
|
||||
bool Build(InitListExpr *ILE);
|
||||
bool Build(ConstExprEmitter *Emitter, llvm::ConstantStruct *Base,
|
||||
bool Build(ConstExprEmitter *Emitter, llvm::Constant *Base,
|
||||
InitListExpr *Updater);
|
||||
bool Build(const APValue &Val, const RecordDecl *RD, bool IsPrimaryBase,
|
||||
const CXXRecordDecl *VTableClass, CharUnits BaseOffset);
|
||||
|
@ -566,7 +566,7 @@ llvm::Constant *ConstStructBuilder::Finalize(QualType Ty) {
|
|||
|
||||
llvm::Constant *ConstStructBuilder::BuildStruct(ConstantEmitter &Emitter,
|
||||
ConstExprEmitter *ExprEmitter,
|
||||
llvm::ConstantStruct *Base,
|
||||
llvm::Constant *Base,
|
||||
InitListExpr *Updater,
|
||||
QualType ValTy) {
|
||||
ConstStructBuilder Builder(Emitter);
|
||||
|
@ -1027,8 +1027,8 @@ public:
|
|||
}
|
||||
|
||||
if (destType->isRecordType())
|
||||
return ConstStructBuilder::BuildStruct(Emitter, this,
|
||||
dyn_cast<llvm::ConstantStruct>(Base), Updater, destType);
|
||||
return ConstStructBuilder::BuildStruct(Emitter, this, Base, Updater,
|
||||
destType);
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
@ -1103,7 +1103,7 @@ public:
|
|||
} // end anonymous namespace.
|
||||
|
||||
bool ConstStructBuilder::Build(ConstExprEmitter *ExprEmitter,
|
||||
llvm::ConstantStruct *Base,
|
||||
llvm::Constant *Base,
|
||||
InitListExpr *Updater) {
|
||||
assert(Base && "base expression should not be empty");
|
||||
|
||||
|
@ -1111,7 +1111,7 @@ bool ConstStructBuilder::Build(ConstExprEmitter *ExprEmitter,
|
|||
RecordDecl *RD = ExprType->getAs<RecordType>()->getDecl();
|
||||
const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
|
||||
const llvm::StructLayout *BaseLayout = CGM.getDataLayout().getStructLayout(
|
||||
Base->getType());
|
||||
cast<llvm::StructType>(Base->getType()));
|
||||
unsigned FieldNo = -1;
|
||||
unsigned ElementNo = 0;
|
||||
|
||||
|
@ -1132,7 +1132,7 @@ bool ConstStructBuilder::Build(ConstExprEmitter *ExprEmitter,
|
|||
if (Field->isUnnamedBitfield())
|
||||
continue;
|
||||
|
||||
llvm::Constant *EltInit = Base->getOperand(ElementNo);
|
||||
llvm::Constant *EltInit = Base->getAggregateElement(ElementNo);
|
||||
|
||||
// Bail out if the type of the ConstantStruct does not have the same layout
|
||||
// as the type of the InitListExpr.
|
||||
|
|
|
@ -142,6 +142,18 @@ union_16644_t union_16644_instance_4[2] =
|
|||
// CHECK: @lab = global { [4 x i8], i32 } { [4 x i8] undef, i32 123 }
|
||||
struct leading_anon_bitfield { int : 32; int n; } lab = { .n = 123 };
|
||||
|
||||
// rdar://45691981
|
||||
struct Base {
|
||||
struct {
|
||||
int A;
|
||||
};
|
||||
};
|
||||
struct Derived {
|
||||
struct Base B;
|
||||
};
|
||||
struct Derived D = {{}, .B.A = 42};
|
||||
// CHECK: @D = global %struct.Derived { %struct.Base { %struct.anon.4 { i32 42 } } }, align 4
|
||||
|
||||
void test1(int argc, char **argv)
|
||||
{
|
||||
// CHECK: internal global %struct.foo { i8* null, i32 1024 }
|
||||
|
@ -149,7 +161,7 @@ void test1(int argc, char **argv)
|
|||
.b = 1024,
|
||||
};
|
||||
|
||||
// CHECK: bitcast %union.anon.4* %u2
|
||||
// CHECK: bitcast %union.anon.5* %u2
|
||||
// CHECK: call void @llvm.memset
|
||||
union { int i; float f; } u2 = { };
|
||||
|
||||
|
|
Loading…
Reference in New Issue