aboutsummaryrefslogtreecommitdiffstats
path: root/test/regression/initializers2.c
diff options
context:
space:
mode:
authorxleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2014-03-28 08:20:14 +0000
committerxleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2014-03-28 08:20:14 +0000
commitc677f108ff340c5bca67b428aa6e56b47f62da8c (patch)
treef75acecc7abe80cf06cfe01a938bdc56620137c6 /test/regression/initializers2.c
parentf37a87e35850e57febba0a39ce3cb526e7886c10 (diff)
downloadcompcert-kvx-c677f108ff340c5bca67b428aa6e56b47f62da8c.tar.gz
compcert-kvx-c677f108ff340c5bca67b428aa6e56b47f62da8c.zip
C: Support array initializers that are too short + default init for remainder.
Elab: Handle C99 designated initializers. C2C, Initializers: more precise intermediate AST for initializers. git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@2439 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e
Diffstat (limited to 'test/regression/initializers2.c')
-rw-r--r--test/regression/initializers2.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/test/regression/initializers2.c b/test/regression/initializers2.c
new file mode 100644
index 00000000..f8d5cafa
--- /dev/null
+++ b/test/regression/initializers2.c
@@ -0,0 +1,74 @@
+#include <stdio.h>
+
+/* Examples of designated initializers from Harbison & Steele */
+
+int a1[5] = { [2] = 100, [1] = 3 };
+int a2[5] = { [0] = 10, [2] = -2, -1, -3 };
+int a3[] = { 1, 2, 3, [2] = 5, 6, 7 };
+
+struct S { int a; float b; char c[4]; };
+struct S s1 = { .c = "abc" };
+struct S s2 = { 13, 3.3, "xxx", .b = 4.5 };
+struct S s3 = { .c = { 'a', 'b', 'c', '\0' } };
+
+union U { int a; float b; char c[4]; };
+union U u1 = { .c = "abc" };
+union U u2 = { .a = 15 };
+union U u3 = { .b = 3.14 };
+union U u4 = { .a = 42, .c[2] = 1 };
+
+struct Point { int x; int y; int z; };
+typedef struct Point PointVector[4];
+PointVector pv1 = {
+ [0].x = 1, [0].y = 2, [0].z = 3,
+ [1] = { .x = 11, .y = 12, .z = 13 },
+ [3] = { .y = 3 }
+};
+
+typedef int Vector[3];
+typedef int Matrix[3][3];
+struct Trio { Vector v; Matrix m; };
+struct Trio t = {
+ .m = { [0][0] = 1, [1][1] = 1, [2][2] = 1 },
+ .v = { [1] = 42, 43 }
+};
+
+int main()
+{
+ int i;
+
+ printf("a1 = { %d, %d, %d, %d, %d }\n",
+ a1[0], a1[1], a1[2], a1[3], a1[4]);
+ printf("a2 = { %d, %d, %d, %d, %d }\n",
+ a2[0], a2[1], a2[2], a2[3], a2[4]);
+ printf("a3 = { %d, %d, %d, %d, %d } (size = %d)\n",
+ a3[0], a3[1], a3[2], a3[3], a3[4],
+ sizeof(a3) / sizeof(int));
+
+ printf("s1 = { %d, %.2f, %s }\n",
+ s1.a, s1.b, s1.c);
+ printf("s2 = { %d, %.2f, %s }\n",
+ s2.a, s2.b, s2.c);
+ printf("s3 = { %d, %.2f, %s }\n",
+ s3.a, s3.b, s3.c);
+
+ printf("u1.c = %s\n", u1.c);
+ printf("u2.a = %d\n", u2.a);
+ printf("u3.b = %.2f\n", u3.b);
+ printf("u4.c = {%d,%d,%d,%d}\n", u4.c[0], u4.c[1], u4.c[2], u4.c[3]);
+
+ printf("pv1 = { ");
+ for (i = 0; i < 4; i++)
+ printf("{%d,%d,%d}, ", pv1[i].x, pv1[i].y, pv1[i].z);
+ printf("}\n");
+
+ printf("t = { {%d,%d,%d}, ", t.v[0], t.v[1], t.v[2]);
+ printf("{");
+ for (i = 0; i < 3; i++)
+ printf("{%d,%d,%d}, ", t.m[i][0], t.m[i][1], t.m[i][2]);
+ printf("} }\n");
+
+ return 0;
+}
+
+