Fixed an assertion failure related to bitfield lowering.
When lowering a bitfield, CGRecordLowering would assign the wrong storage type to a bitfield in some cases and trigger an assertion. In these cases the layout was still correct, just the bitfield info was wrong. llvm-svn: 202562
This commit is contained in:
parent
36a02e0655
commit
fed55979b1
|
@ -277,6 +277,7 @@ void CGRecordLowering::lower(bool NVBaseType) {
|
|||
}
|
||||
|
||||
void CGRecordLowering::lowerUnion() {
|
||||
CharUnits LayoutSize = Layout.getSize();
|
||||
llvm::Type *StorageType = 0;
|
||||
// Compute zero-initializable status.
|
||||
if (!D->field_empty() && !isZeroInitializable(*D->field_begin()))
|
||||
|
@ -293,7 +294,10 @@ void CGRecordLowering::lowerUnion() {
|
|||
// Skip 0 sized bitfields.
|
||||
if (Field->getBitWidthValue(Context) == 0)
|
||||
continue;
|
||||
setBitFieldInfo(*Field, CharUnits::Zero(), getStorageType(*Field));
|
||||
llvm::Type *FieldType = getStorageType(*Field);
|
||||
if (LayoutSize < getSize(FieldType))
|
||||
FieldType = getByteArrayType(LayoutSize);
|
||||
setBitFieldInfo(*Field, CharUnits::Zero(), FieldType);
|
||||
}
|
||||
Fields[*Field] = 0;
|
||||
llvm::Type *FieldType = getStorageType(*Field);
|
||||
|
@ -304,7 +308,6 @@ void CGRecordLowering::lowerUnion() {
|
|||
getSize(FieldType) > getSize(StorageType)))
|
||||
StorageType = FieldType;
|
||||
}
|
||||
CharUnits LayoutSize = Layout.getSize();
|
||||
// If we have no storage type just pad to the appropriate size and return.
|
||||
if (!StorageType)
|
||||
return appendPaddingBytes(LayoutSize);
|
||||
|
|
|
@ -44,3 +44,16 @@ typedef union T0 { unsigned int : 0; } T0;
|
|||
T0 t0;
|
||||
|
||||
union { int large_bitfield: 31; char c } u2;
|
||||
|
||||
struct dt_t_s {
|
||||
union {
|
||||
long long u : 56;
|
||||
} __attribute__((packed));
|
||||
};
|
||||
struct {
|
||||
struct {
|
||||
struct {
|
||||
struct dt_t_s t;
|
||||
};
|
||||
};
|
||||
} a;
|
||||
|
|
Loading…
Reference in New Issue