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