forked from OSchip/llvm-project
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:
parent
55a333d89b
commit
6d829bdbef
|
@ -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();
|
for (RecordDecl::field_iterator FieldEnd = RD->field_end();
|
||||||
Field != FieldEnd; ++Field) {
|
Field != FieldEnd; ++Field) {
|
||||||
if (Field->getDeclName()) {
|
if (!Field->isUnnamedBitfield()) {
|
||||||
if (VerifyOnly)
|
if (VerifyOnly)
|
||||||
CheckEmptyInitializable(
|
CheckEmptyInitializable(
|
||||||
InitializedEntity::InitializeMember(*Field, &Entity),
|
InitializedEntity::InitializeMember(*Field, &Entity),
|
||||||
|
|
|
@ -36,6 +36,17 @@ B y {};
|
||||||
B z { 1 };
|
B z { 1 };
|
||||||
// CHECK: @z = global {{.*}} { i32 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':
|
// Initialization of 'a':
|
||||||
|
|
||||||
// CHECK: store i32 0, i32* getelementptr inbounds ({{.*}} @a, i32 0, i32 0)
|
// CHECK: store i32 0, i32* getelementptr inbounds ({{.*}} @a, i32 0, i32 0)
|
||||||
|
|
Loading…
Reference in New Issue