summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReid Kleckner <reid@kleckner.net>2014-11-12 21:30:23 +0000
committerReid Kleckner <reid@kleckner.net>2014-11-12 21:30:23 +0000
commit6d829bdbef0da4ebb626fa793652c599e9826ed8 (patch)
tree4a9c4d43fd77ec4b429d447d6c7cd9d6de3f914d
parent55a333d89bf09897cef7b3cf0b9c97c7498f76ce (diff)
downloadbcm5719-llvm-6d829bdbef0da4ebb626fa793652c599e9826ed8.tar.gz
bcm5719-llvm-6d829bdbef0da4ebb626fa793652c599e9826ed8.zip
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
-rw-r--r--clang/lib/Sema/SemaInit.cpp5
-rw-r--r--clang/test/CodeGenCXX/cxx1y-initializer-aggregate.cpp11
2 files changed, 14 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp
index d1e51de6210..39d6a575aa2 100644
--- a/clang/lib/Sema/SemaInit.cpp
+++ b/clang/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/clang/test/CodeGenCXX/cxx1y-initializer-aggregate.cpp b/clang/test/CodeGenCXX/cxx1y-initializer-aggregate.cpp
index 8bdf8633d61..098a4b945e0 100644
--- a/clang/test/CodeGenCXX/cxx1y-initializer-aggregate.cpp
+++ b/clang/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)
OpenPOWER on IntegriCloud