From: Reid Kleckner Date: Wed, 12 Nov 2014 21:30:23 +0000 (+0000) Subject: Fix brace init of unions with unnamed struct members X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=081c114a6803bd516a5721ebf78d795d7d8ddc48;p=clang 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@221818 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index d1e51de621..39d6a575aa 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -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), diff --git a/test/CodeGenCXX/cxx1y-initializer-aggregate.cpp b/test/CodeGenCXX/cxx1y-initializer-aggregate.cpp index 8bdf8633d6..098a4b945e 100644 --- a/test/CodeGenCXX/cxx1y-initializer-aggregate.cpp +++ b/test/CodeGenCXX/cxx1y-initializer-aggregate.cpp @@ -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)