Make sure we correctly zero-initialize unions containing a pointer to data member as the first field. PR11487.

llvm-svn: 146009
This commit is contained in:
Eli Friedman 2011-12-07 01:30:11 +00:00
parent af748e1180
commit dae858aca3
3 changed files with 27 additions and 7 deletions

View File

@ -1243,13 +1243,17 @@ static llvm::Constant *EmitNullConstant(CodeGenModule &CGM,
for (RecordDecl::field_iterator I = record->field_begin(),
E = record->field_end(); I != E; ++I) {
const FieldDecl *field = *I;
// Ignore bit fields.
if (field->isBitField())
continue;
unsigned fieldIndex = layout.getLLVMFieldNo(field);
elements[fieldIndex] = CGM.EmitNullConstant(field->getType());
// Fill in non-bitfields. (Bitfields always use a zero pattern, which we
// will fill in later.)
if (!field->isBitField()) {
unsigned fieldIndex = layout.getLLVMFieldNo(field);
elements[fieldIndex] = CGM.EmitNullConstant(field->getType());
}
// For unions, stop after the first named field.
if (record->isUnion() && field->getDeclName())
break;
}
// Fill in the virtual bases, if we're working with the complete object.

View File

@ -531,6 +531,7 @@ void CGRecordLayoutBuilder::LayoutUnion(const RecordDecl *D) {
CharUnits unionAlign = CharUnits::Zero();
bool hasOnlyZeroSizedBitFields = true;
bool checkedFirstFieldZeroInit = false;
unsigned fieldNo = 0;
for (RecordDecl::field_iterator field = D->field_begin(),
@ -542,6 +543,11 @@ void CGRecordLayoutBuilder::LayoutUnion(const RecordDecl *D) {
if (!fieldType)
continue;
if (field->getDeclName() && !checkedFirstFieldZeroInit) {
CheckZeroInitializable(field->getType());
checkedFirstFieldZeroInit = true;
}
hasOnlyZeroSizedBitFields = false;
CharUnits fieldAlign = CharUnits::fromQuantity(

View File

@ -230,3 +230,13 @@ namespace test4 {
// CHECK-GLOBAL: @_ZN5test41dE = global %"struct.test4::D" { %"struct.test4::C.base" zeroinitializer, i32* null, %"struct.test4::B.base" { i32 (...)** null, i64 -1 }, %"struct.test4::A" zeroinitializer }, align 8
D d;
}
namespace PR11487 {
union U
{
int U::* mptr;
char x[16];
} x;
// CHECK-GLOBAL: @_ZN7PR114871xE = global %"union.PR11487::U" { i64 -1, [8 x i8] zeroinitializer }, align 8
}