Fix an incorrect union layout assert. Fixes PR6164.

llvm-svn: 94754
This commit is contained in:
Anders Carlsson 2010-01-28 18:22:03 +00:00
parent 0d61eebd81
commit b1ef991097
2 changed files with 9 additions and 1 deletions

View File

@ -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;
} }

View File

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