forked from OSchip/llvm-project
Fix an incorrect union layout assert. Fixes PR6164.
llvm-svn: 94754
This commit is contained in:
parent
0d61eebd81
commit
b1ef991097
|
@ -162,6 +162,8 @@ void CGRecordLayoutBuilder::LayoutUnion(const RecordDecl *D) {
|
||||||
uint64_t Size = 0;
|
uint64_t Size = 0;
|
||||||
unsigned Align = 0;
|
unsigned Align = 0;
|
||||||
|
|
||||||
|
bool HasOnlyZeroSizedBitFields = true;
|
||||||
|
|
||||||
unsigned FieldNo = 0;
|
unsigned FieldNo = 0;
|
||||||
for (RecordDecl::field_iterator Field = D->field_begin(),
|
for (RecordDecl::field_iterator Field = D->field_begin(),
|
||||||
FieldEnd = D->field_end(); Field != FieldEnd; ++Field, ++FieldNo) {
|
FieldEnd = D->field_end(); Field != FieldEnd; ++Field, ++FieldNo) {
|
||||||
|
@ -181,6 +183,8 @@ void CGRecordLayoutBuilder::LayoutUnion(const RecordDecl *D) {
|
||||||
} else
|
} else
|
||||||
Types.addFieldInfo(*Field, 0);
|
Types.addFieldInfo(*Field, 0);
|
||||||
|
|
||||||
|
HasOnlyZeroSizedBitFields = false;
|
||||||
|
|
||||||
const llvm::Type *FieldTy =
|
const llvm::Type *FieldTy =
|
||||||
Types.ConvertTypeForMemRecursive(Field->getType());
|
Types.ConvertTypeForMemRecursive(Field->getType());
|
||||||
unsigned FieldAlign = Types.getTargetData().getABITypeAlignment(FieldTy);
|
unsigned FieldAlign = Types.getTargetData().getABITypeAlignment(FieldTy);
|
||||||
|
@ -207,7 +211,8 @@ void CGRecordLayoutBuilder::LayoutUnion(const RecordDecl *D) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!Align) {
|
if (!Align) {
|
||||||
assert((D->field_begin() == D->field_end()) && "LayoutUnion - Align 0");
|
assert(HasOnlyZeroSizedBitFields &&
|
||||||
|
"0-align record did not have all zero-sized bit-fields!");
|
||||||
Align = 1;
|
Align = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,3 +39,6 @@ int qfunc() {q buf; unsigned char* x = buf.x;}
|
||||||
union RR {_Bool a : 1;} RRU;
|
union RR {_Bool a : 1;} RRU;
|
||||||
int RRF(void) {return RRU.a;}
|
int RRF(void) {return RRU.a;}
|
||||||
|
|
||||||
|
// PR6164
|
||||||
|
typedef union T0 { unsigned int : 0; } T0;
|
||||||
|
T0 t0;
|
||||||
|
|
Loading…
Reference in New Issue