blob: 1b0beaea60796e1e0a29e030f82c15af51cf75d2 [file] [log] [blame]
Nuno Lopesa75b71f2010-04-18 19:06:43 +00001// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s
Daniel Dunbare4c92382009-02-13 22:58:39 +00002
Lauro Ramos Venancio305762c2008-02-18 22:44:02 +00003void f1() {
4 // Scalars in braces.
5 int a = { 1 };
Lauro Ramos Venancio305762c2008-02-18 22:44:02 +00006}
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]} };
Lauro Ramos Venancio145cd892008-02-19 19:27:31 +000014 char ext[3][3] = {".Y",".U",".V"};
Anders Carlssona3881fc2008-01-29 01:28:48 +000015}
Chris Lattnerd3c38562008-05-04 00:56:25 +000016
17typedef void (* F)(void);
18extern void foo(void);
19struct S { F f; };
20void f3() {
21 struct S a[1] = { { foo } };
22}
23
Daniel Dunbare4c92382009-02-13 22:58:39 +000024// Constants
Nuno Lopesa75b71f2010-04-18 19:06:43 +000025// CHECK: @g3 = constant i32 10
26// CHECK: @f4.g4 = internal constant i32 12
Daniel Dunbare4c92382009-02-13 22:58:39 +000027const int g3 = 10;
28int f4() {
29 static const int g4 = 12;
30 return g4;
31}
Chris Lattnerb35baae2010-03-08 21:08:07 +000032
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}
John McCall0f2b6922010-07-07 05:08:32 +000043
44// rdar://problem/8154689
45void f6() {
46 int x;
47 long ids[] = { (long) &x };
48}
Chris Lattner9046c222010-10-10 17:49:49 +000049
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" };
Chris Lattner70b02942010-12-02 01:58:41 +000061
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
Benjamin Kramercfa07e32012-08-27 21:35:58 +000072// CHECK-NOT: getelementptr
73// CHECK: load
Chris Lattner70b02942010-12-02 01:58:41 +000074}
Chris Lattner1b726772010-12-02 07:07:26 +000075
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}
Chris Lattnere0fd8322011-02-19 22:28:58 +0000105
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}
Chris Lattnerf742eb02011-07-10 00:18:59 +0000120
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
Eli Friedman5a13d4d2012-02-24 23:53:49 +0000128
129void test13(int x) {
130 struct X { int a; int b : 10; int c; };
131 struct X y = {.c = x};
132 // CHECK: @test13
Chandler Carruth72d2dab2012-12-06 11:14:44 +0000133 // CHECK: and i16 {{.*}}, -1024
Eli Friedman5a13d4d2012-02-24 23:53:49 +0000134}