1 // RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s
2
f1()3 void f1() {
4 // Scalars in braces.
5 int a = { 1 };
6 }
7
f2()8 void 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
17 typedef void (* F)(void);
18 extern void foo(void);
19 struct S { F f; };
f3()20 void 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
27 const int g3 = 10;
f4()28 int f4() {
29 static const int g4 = 12;
30 return g4;
31 }
32
33 // PR6537
34 typedef union vec3 {
35 struct { double x, y, z; };
36 double component[3];
37 } vec3;
f5(vec3 value)38 vec3 f5(vec3 value) {
39 return (vec3) {{
40 .x = value.x
41 }};
42 }
43
44 // rdar://problem/8154689
f6()45 void 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
55 struct a7 {
56 int b;
57 char v[];
58 };
59
60 struct a7 test7 = { .b = 0, .v = "bar" };
61
62
63 // PR279 comment #3
test8(int X)64 char 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
76 void bar(void*);
77
78 // PR279
test9(int X)79 int 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
88 struct a {
89 int a, b, c, d, e, f, g, h, i, j, k, *p;
90 };
91
92 struct b {
93 struct a a,b,c,d,e,f,g;
94 };
95
test10(int X)96 int 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
108 struct test11S {
109 int A[10];
110 };
test11(struct test11S * P)111 void 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.
124 struct test12 {
125 struct test12 (*p)(void);
126 } test12g;
127
128
test13(int x)129 void 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 i16 {{.*}}, -1024
134 }
135