Fix brace init of unions with unnamed struct members

The check for unnamed members was intended to skip unnamed bitfields,
but it ended up skipping unnamed structs. This lead to an assertion in
IRGen.

llvm-svn: 221818
This commit is contained in:
Reid Kleckner 2014-11-12 21:30:23 +00:00
parent 55a333d89b
commit 6d829bdbef
2 changed files with 14 additions and 2 deletions

View File

@ -1555,10 +1555,11 @@ void InitListChecker::CheckStructUnionTypes(const InitializedEntity &Entity,
}
}
// Value-initialize the first named member of the union.
// Value-initialize the first member of the union that isn't an unnamed
// bitfield.
for (RecordDecl::field_iterator FieldEnd = RD->field_end();
Field != FieldEnd; ++Field) {
if (Field->getDeclName()) {
if (!Field->isUnnamedBitfield()) {
if (VerifyOnly)
CheckEmptyInitializable(
InitializedEntity::InitializeMember(*Field, &Entity),

View File

@ -36,6 +36,17 @@ B y {};
B z { 1 };
// CHECK: @z = global {{.*}} { i32 1 }
// Brace initialization should initialize the first field even though it is
// unnamed.
union C {
struct {
int C::*memptr;
};
};
C n{};
// CHECK: @n = global %union.C { %struct.anon { i64 -1 } }, align 8
// Initialization of 'a':
// CHECK: store i32 0, i32* getelementptr inbounds ({{.*}} @a, i32 0, i32 0)