summaryrefslogtreecommitdiffstats
path: root/clang/test/CodeGen/designated-initializers.c
diff options
context:
space:
mode:
authorMatthew Curtis <mcurtis@codeaurora.org>2013-10-03 12:14:24 +0000
committerMatthew Curtis <mcurtis@codeaurora.org>2013-10-03 12:14:24 +0000
commit274a9cc84bcfaec3f3a3ef99a4c55587edbf8645 (patch)
tree0e7cf30387293bd7faa500989f505d88e6050c73 /clang/test/CodeGen/designated-initializers.c
parent85aeffaf5c20a068dbadcfa22f6c3ae922a0085e (diff)
downloadbcm5719-llvm-274a9cc84bcfaec3f3a3ef99a4c55587edbf8645.tar.gz
bcm5719-llvm-274a9cc84bcfaec3f3a3ef99a4c55587edbf8645.zip
Gracefully (and correctly) handle init of multiple union members
We now emit warnings when doing so and code generation is consistent with GCC. Note that the C99 spec is unclear as to the precise behavior. See also ... Bug: http://llvm.org/bugs/show_bug.cgi?id=16644 and cfe-dev discussion: http://lists.cs.uiuc.edu/pipermail/cfe-dev/2013-September/031918.html llvm-svn: 191890
Diffstat (limited to 'clang/test/CodeGen/designated-initializers.c')
-rw-r--r--clang/test/CodeGen/designated-initializers.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/clang/test/CodeGen/designated-initializers.c b/clang/test/CodeGen/designated-initializers.c
index b41898600b2..b11c67a4542 100644
--- a/clang/test/CodeGen/designated-initializers.c
+++ b/clang/test/CodeGen/designated-initializers.c
@@ -81,6 +81,63 @@ struct overwrite_string_struct5 {
// CHECK: [6 x i8] c"foo\00y\00", i32 1
+// CHECK: @u1 = {{.*}} { i32 65535 }
+union u_FFFF { char c; long l; } u1 = { .l = 0xFFFF };
+
+
+/// PR16644
+typedef union u_16644 {
+ struct s_16644 {
+ int zero;
+ int one;
+ int two;
+ int three;
+ } a;
+ int b[4];
+} union_16644_t;
+
+// CHECK: @union_16644_instance_0 = {{.*}} { i32 0, i32 0, i32 0, i32 3 } }
+union_16644_t union_16644_instance_0 =
+{
+ .b[0] = 0,
+ .a.one = 1,
+ .b[2] = 2,
+ .a.three = 3,
+};
+
+// CHECK: @union_16644_instance_1 = {{.*}} [i32 10, i32 0, i32 0, i32 0]
+union_16644_t union_16644_instance_1 =
+{
+ .a.three = 13,
+ .b[2] = 12,
+ .a.one = 11,
+ .b[0] = 10,
+};
+
+// CHECK: @union_16644_instance_2 = {{.*}} [i32 0, i32 20, i32 0, i32 0]
+union_16644_t union_16644_instance_2 =
+{
+ .a.one = 21,
+ .b[1] = 20,
+};
+
+// CHECK: @union_16644_instance_3 = {{.*}} { i32 0, i32 31, i32 0, i32 0 }
+union_16644_t union_16644_instance_3 =
+{
+ .b[1] = 30,
+ .a = {
+ .one = 31
+ }
+};
+
+// CHECK: @union_16644_instance_4 = {{.*}} { i32 5, i32 2, i32 0, i32 0 } {{.*}} [i32 0, i32 4, i32 0, i32 0]
+union_16644_t union_16644_instance_4[2] =
+{
+ [0].a.one = 2,
+ [1].a.zero = 3,
+ [0].a.zero = 5,
+ [1].b[1] = 4
+};
void test1(int argc, char **argv)
{
OpenPOWER on IntegriCloud