1*67e74705SXin Li // RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s
2*67e74705SXin Li
3*67e74705SXin Li struct I { int k[3]; };
4*67e74705SXin Li struct M { struct I o[2]; };
5*67e74705SXin Li struct M v1[1] = { [0].o[0 ... 1].k[0 ... 1] = 4, 5 };
6*67e74705SXin Li unsigned v2[2][3] = {[0 ... 1][0 ... 1] = 2222, 3333};
7*67e74705SXin Li
8*67e74705SXin Li // CHECK-DAG: %struct.M = type { [2 x %struct.I] }
9*67e74705SXin Li // CHECK-DAG: %struct.I = type { [3 x i32] }
10*67e74705SXin Li
11*67e74705SXin Li // CHECK: [1 x %struct.M] [%struct.M { [2 x %struct.I] [%struct.I { [3 x i32] [i32 4, i32 4, i32 0] }, %struct.I { [3 x i32] [i32 4, i32 4, i32 5] }] }],
12*67e74705SXin Li // CHECK: [2 x [3 x i32]] {{[[][[]}}3 x i32] [i32 2222, i32 2222, i32 0], [3 x i32] [i32 2222, i32 2222, i32 3333]],
13*67e74705SXin Li
f1()14*67e74705SXin Li void f1() {
15*67e74705SXin Li // Scalars in braces.
16*67e74705SXin Li int a = { 1 };
17*67e74705SXin Li }
18*67e74705SXin Li
f2()19*67e74705SXin Li void f2() {
20*67e74705SXin Li int a[2][2] = { { 1, 2 }, { 3, 4 } };
21*67e74705SXin Li int b[3][3] = { { 1, 2 }, { 3, 4 } };
22*67e74705SXin Li int *c[2] = { &a[1][1], &b[2][2] };
23*67e74705SXin Li int *d[2][2] = { {&a[1][1], &b[2][2]}, {&a[0][0], &b[1][1]} };
24*67e74705SXin Li int *e[3][3] = { {&a[1][1], &b[2][2]}, {&a[0][0], &b[1][1]} };
25*67e74705SXin Li char ext[3][3] = {".Y",".U",".V"};
26*67e74705SXin Li }
27*67e74705SXin Li
28*67e74705SXin Li typedef void (* F)(void);
29*67e74705SXin Li extern void foo(void);
30*67e74705SXin Li struct S { F f; };
f3()31*67e74705SXin Li void f3() {
32*67e74705SXin Li struct S a[1] = { { foo } };
33*67e74705SXin Li }
34*67e74705SXin Li
35*67e74705SXin Li // Constants
36*67e74705SXin Li // CHECK: @g3 = constant i32 10
37*67e74705SXin Li // CHECK: @f4.g4 = internal constant i32 12
38*67e74705SXin Li const int g3 = 10;
f4()39*67e74705SXin Li int f4() {
40*67e74705SXin Li static const int g4 = 12;
41*67e74705SXin Li return g4;
42*67e74705SXin Li }
43*67e74705SXin Li
44*67e74705SXin Li // PR6537
45*67e74705SXin Li typedef union vec3 {
46*67e74705SXin Li struct { double x, y, z; };
47*67e74705SXin Li double component[3];
48*67e74705SXin Li } vec3;
f5(vec3 value)49*67e74705SXin Li vec3 f5(vec3 value) {
50*67e74705SXin Li return (vec3) {{
51*67e74705SXin Li .x = value.x
52*67e74705SXin Li }};
53*67e74705SXin Li }
54*67e74705SXin Li
55*67e74705SXin Li // rdar://problem/8154689
f6()56*67e74705SXin Li void f6() {
57*67e74705SXin Li int x;
58*67e74705SXin Li long ids[] = { (long) &x };
59*67e74705SXin Li }
60*67e74705SXin Li
61*67e74705SXin Li
62*67e74705SXin Li
63*67e74705SXin Li
64*67e74705SXin Li // CHECK: @test7 = global{{.*}}{ i32 0, [4 x i8] c"bar\00" }
65*67e74705SXin Li // PR8217
66*67e74705SXin Li struct a7 {
67*67e74705SXin Li int b;
68*67e74705SXin Li char v[];
69*67e74705SXin Li };
70*67e74705SXin Li
71*67e74705SXin Li struct a7 test7 = { .b = 0, .v = "bar" };
72*67e74705SXin Li
73*67e74705SXin Li
74*67e74705SXin Li // PR279 comment #3
test8(int X)75*67e74705SXin Li char test8(int X) {
76*67e74705SXin Li char str[100000] = "abc"; // tail should be memset.
77*67e74705SXin Li return str[X];
78*67e74705SXin Li // CHECK: @test8(
79*67e74705SXin Li // CHECK: call void @llvm.memset
80*67e74705SXin Li // CHECK: store i8 97
81*67e74705SXin Li // CHECK: store i8 98
82*67e74705SXin Li // CHECK: store i8 99
83*67e74705SXin Li // CHECK-NOT: getelementptr
84*67e74705SXin Li // CHECK: load
85*67e74705SXin Li }
86*67e74705SXin Li
87*67e74705SXin Li void bar(void*);
88*67e74705SXin Li
89*67e74705SXin Li // PR279
test9(int X)90*67e74705SXin Li int test9(int X) {
91*67e74705SXin Li int Arr[100] = { X }; // Should use memset
92*67e74705SXin Li bar(Arr);
93*67e74705SXin Li // CHECK: @test9
94*67e74705SXin Li // CHECK: call void @llvm.memset
95*67e74705SXin Li // CHECK-NOT: store i32 0
96*67e74705SXin Li // CHECK: call void @bar
97*67e74705SXin Li }
98*67e74705SXin Li
99*67e74705SXin Li struct a {
100*67e74705SXin Li int a, b, c, d, e, f, g, h, i, j, k, *p;
101*67e74705SXin Li };
102*67e74705SXin Li
103*67e74705SXin Li struct b {
104*67e74705SXin Li struct a a,b,c,d,e,f,g;
105*67e74705SXin Li };
106*67e74705SXin Li
test10(int X)107*67e74705SXin Li int test10(int X) {
108*67e74705SXin Li struct b S = { .a.a = X, .d.e = X, .f.e = 0, .f.f = 0, .f.p = 0 };
109*67e74705SXin Li bar(&S);
110*67e74705SXin Li
111*67e74705SXin Li // CHECK: @test10
112*67e74705SXin Li // CHECK: call void @llvm.memset
113*67e74705SXin Li // CHECK-NOT: store i32 0
114*67e74705SXin Li // CHECK: call void @bar
115*67e74705SXin Li }
116*67e74705SXin Li
117*67e74705SXin Li
118*67e74705SXin Li // PR9257
119*67e74705SXin Li struct test11S {
120*67e74705SXin Li int A[10];
121*67e74705SXin Li };
test11(struct test11S * P)122*67e74705SXin Li void test11(struct test11S *P) {
123*67e74705SXin Li *P = (struct test11S) { .A = { [0 ... 3] = 4 } };
124*67e74705SXin Li // CHECK: @test11
125*67e74705SXin Li // CHECK: store i32 4
126*67e74705SXin Li // CHECK: store i32 4
127*67e74705SXin Li // CHECK: store i32 4
128*67e74705SXin Li // CHECK: store i32 4
129*67e74705SXin Li // CHECK: ret void
130*67e74705SXin Li }
131*67e74705SXin Li
132*67e74705SXin Li
133*67e74705SXin Li // Verify that we can convert a recursive struct with a memory that returns
134*67e74705SXin Li // an instance of the struct we're converting.
135*67e74705SXin Li struct test12 {
136*67e74705SXin Li struct test12 (*p)(void);
137*67e74705SXin Li } test12g;
138*67e74705SXin Li
139*67e74705SXin Li
test13(int x)140*67e74705SXin Li void test13(int x) {
141*67e74705SXin Li struct X { int a; int b : 10; int c; };
142*67e74705SXin Li struct X y = {.c = x};
143*67e74705SXin Li // CHECK: @test13
144*67e74705SXin Li // CHECK: and i16 {{.*}}, -1024
145*67e74705SXin Li }
146*67e74705SXin Li
147*67e74705SXin Li // CHECK-LABEL: @PR20473
PR20473()148*67e74705SXin Li void PR20473() {
149*67e74705SXin Li // CHECK: memcpy{{.*}}getelementptr inbounds ([2 x i8], [2 x i8]* @
150*67e74705SXin Li bar((char[2]) {""});
151*67e74705SXin Li // CHECK: memcpy{{.*}}getelementptr inbounds ([3 x i8], [3 x i8]* @
152*67e74705SXin Li bar((char[3]) {""});
153*67e74705SXin Li }
154