1a75b71f967d7f090ef16a3d255baddbdce7ff81eNuno Lopes// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s
2e4c9238795d206e22694101d6d727d2ee1f0028dDaniel Dunbar
34967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct I { int k[3]; };
44967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct M { struct I o[2]; };
54967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct M v1[1] = { [0].o[0 ... 1].k[0 ... 1] = 4, 5 };
64967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarunsigned v2[2][3] = {[0 ... 1][0 ... 1] = 2222, 3333};
74967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
84967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-DAG: %struct.M = type { [2 x %struct.I] }
94967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-DAG: %struct.I = type { [3 x i32] }
104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 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] }] }],
124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK: [2 x [3 x i32]] {{[[][[]}}3 x i32] [i32 2222, i32 2222, i32 0], [3 x i32] [i32 2222, i32 2222, i32 3333]],
134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
14305762c08975cd6e0bebd684ca910fa208792483Lauro Ramos Venanciovoid f1() {
15305762c08975cd6e0bebd684ca910fa208792483Lauro Ramos Venancio  // Scalars in braces.
16305762c08975cd6e0bebd684ca910fa208792483Lauro Ramos Venancio  int a = { 1 };
17305762c08975cd6e0bebd684ca910fa208792483Lauro Ramos Venancio}
18305762c08975cd6e0bebd684ca910fa208792483Lauro Ramos Venancio
19305762c08975cd6e0bebd684ca910fa208792483Lauro Ramos Venanciovoid f2() {
20305762c08975cd6e0bebd684ca910fa208792483Lauro Ramos Venancio  int a[2][2] = { { 1, 2 }, { 3, 4 } };
21305762c08975cd6e0bebd684ca910fa208792483Lauro Ramos Venancio  int b[3][3] = { { 1, 2 }, { 3, 4 } };
22305762c08975cd6e0bebd684ca910fa208792483Lauro Ramos Venancio  int *c[2] = { &a[1][1], &b[2][2] };
23305762c08975cd6e0bebd684ca910fa208792483Lauro Ramos Venancio  int *d[2][2] = { {&a[1][1], &b[2][2]}, {&a[0][0], &b[1][1]} };
24305762c08975cd6e0bebd684ca910fa208792483Lauro Ramos Venancio  int *e[3][3] = { {&a[1][1], &b[2][2]}, {&a[0][0], &b[1][1]} };
25145cd89f9233d375381aa13bd28b2d36f83e6181Lauro Ramos Venancio  char ext[3][3] = {".Y",".U",".V"};
26a3881fc62ac1ddbf9c236fffd47b637fb4745bbdAnders Carlsson}
27d3c3856c159ff74794b55d1b5e39c0fa78bf0095Chris Lattner
28d3c3856c159ff74794b55d1b5e39c0fa78bf0095Chris Lattnertypedef void (* F)(void);
29d3c3856c159ff74794b55d1b5e39c0fa78bf0095Chris Lattnerextern void foo(void);
30d3c3856c159ff74794b55d1b5e39c0fa78bf0095Chris Lattnerstruct S { F f; };
31d3c3856c159ff74794b55d1b5e39c0fa78bf0095Chris Lattnervoid f3() {
32d3c3856c159ff74794b55d1b5e39c0fa78bf0095Chris Lattner  struct S a[1] = { { foo } };
33d3c3856c159ff74794b55d1b5e39c0fa78bf0095Chris Lattner}
34d3c3856c159ff74794b55d1b5e39c0fa78bf0095Chris Lattner
35e4c9238795d206e22694101d6d727d2ee1f0028dDaniel Dunbar// Constants
36a75b71f967d7f090ef16a3d255baddbdce7ff81eNuno Lopes// CHECK: @g3 = constant i32 10
37a75b71f967d7f090ef16a3d255baddbdce7ff81eNuno Lopes// CHECK: @f4.g4 = internal constant i32 12
38e4c9238795d206e22694101d6d727d2ee1f0028dDaniel Dunbarconst int g3 = 10;
39e4c9238795d206e22694101d6d727d2ee1f0028dDaniel Dunbarint f4() {
40e4c9238795d206e22694101d6d727d2ee1f0028dDaniel Dunbar  static const int g4 = 12;
41e4c9238795d206e22694101d6d727d2ee1f0028dDaniel Dunbar  return g4;
42e4c9238795d206e22694101d6d727d2ee1f0028dDaniel Dunbar}
43b35baae19b906245b5c2266b47ef411abcc6b25aChris Lattner
44b35baae19b906245b5c2266b47ef411abcc6b25aChris Lattner// PR6537
45b35baae19b906245b5c2266b47ef411abcc6b25aChris Lattnertypedef union vec3 {
46b35baae19b906245b5c2266b47ef411abcc6b25aChris Lattner  struct { double x, y, z; };
47b35baae19b906245b5c2266b47ef411abcc6b25aChris Lattner  double component[3];
48b35baae19b906245b5c2266b47ef411abcc6b25aChris Lattner} vec3;
49b35baae19b906245b5c2266b47ef411abcc6b25aChris Lattnervec3 f5(vec3 value) {
50b35baae19b906245b5c2266b47ef411abcc6b25aChris Lattner  return (vec3) {{
51b35baae19b906245b5c2266b47ef411abcc6b25aChris Lattner    .x = value.x
52b35baae19b906245b5c2266b47ef411abcc6b25aChris Lattner  }};
53b35baae19b906245b5c2266b47ef411abcc6b25aChris Lattner}
540f2b692bb10be35fdc60d0a72a847bdd73124670John McCall
550f2b692bb10be35fdc60d0a72a847bdd73124670John McCall// rdar://problem/8154689
560f2b692bb10be35fdc60d0a72a847bdd73124670John McCallvoid f6() {
570f2b692bb10be35fdc60d0a72a847bdd73124670John McCall  int x;
580f2b692bb10be35fdc60d0a72a847bdd73124670John McCall  long ids[] = { (long) &x };
590f2b692bb10be35fdc60d0a72a847bdd73124670John McCall}
609046c224f16be3cef84f03b96a6c00a621c8383eChris Lattner
619046c224f16be3cef84f03b96a6c00a621c8383eChris Lattner
629046c224f16be3cef84f03b96a6c00a621c8383eChris Lattner
639046c224f16be3cef84f03b96a6c00a621c8383eChris Lattner
649046c224f16be3cef84f03b96a6c00a621c8383eChris Lattner// CHECK: @test7 = global{{.*}}{ i32 0, [4 x i8] c"bar\00" }
659046c224f16be3cef84f03b96a6c00a621c8383eChris Lattner// PR8217
669046c224f16be3cef84f03b96a6c00a621c8383eChris Lattnerstruct a7 {
679046c224f16be3cef84f03b96a6c00a621c8383eChris Lattner  int  b;
689046c224f16be3cef84f03b96a6c00a621c8383eChris Lattner  char v[];
699046c224f16be3cef84f03b96a6c00a621c8383eChris Lattner};
709046c224f16be3cef84f03b96a6c00a621c8383eChris Lattner
719046c224f16be3cef84f03b96a6c00a621c8383eChris Lattnerstruct a7 test7 = { .b = 0, .v = "bar" };
7270b02943ddee9ee31e9641ab3f5eb0dc874b7e03Chris Lattner
7370b02943ddee9ee31e9641ab3f5eb0dc874b7e03Chris Lattner
7470b02943ddee9ee31e9641ab3f5eb0dc874b7e03Chris Lattner// PR279 comment #3
7570b02943ddee9ee31e9641ab3f5eb0dc874b7e03Chris Lattnerchar test8(int X) {
7670b02943ddee9ee31e9641ab3f5eb0dc874b7e03Chris Lattner  char str[100000] = "abc"; // tail should be memset.
7770b02943ddee9ee31e9641ab3f5eb0dc874b7e03Chris Lattner  return str[X];
7870b02943ddee9ee31e9641ab3f5eb0dc874b7e03Chris Lattner// CHECK: @test8(
7970b02943ddee9ee31e9641ab3f5eb0dc874b7e03Chris Lattner// CHECK: call void @llvm.memset
8070b02943ddee9ee31e9641ab3f5eb0dc874b7e03Chris Lattner// CHECK: store i8 97
8170b02943ddee9ee31e9641ab3f5eb0dc874b7e03Chris Lattner// CHECK: store i8 98
8270b02943ddee9ee31e9641ab3f5eb0dc874b7e03Chris Lattner// CHECK: store i8 99
83cfa07e3519cff1c69cd39d02c80263fd6469c3dbBenjamin Kramer// CHECK-NOT: getelementptr
84cfa07e3519cff1c69cd39d02c80263fd6469c3dbBenjamin Kramer// CHECK: load
8570b02943ddee9ee31e9641ab3f5eb0dc874b7e03Chris Lattner}
861b726771d00762fb5c4c2638e60d134c385493aeChris Lattner
871b726771d00762fb5c4c2638e60d134c385493aeChris Lattnervoid bar(void*);
881b726771d00762fb5c4c2638e60d134c385493aeChris Lattner
891b726771d00762fb5c4c2638e60d134c385493aeChris Lattner// PR279
901b726771d00762fb5c4c2638e60d134c385493aeChris Lattnerint test9(int X) {
911b726771d00762fb5c4c2638e60d134c385493aeChris Lattner  int Arr[100] = { X };     // Should use memset
921b726771d00762fb5c4c2638e60d134c385493aeChris Lattner  bar(Arr);
931b726771d00762fb5c4c2638e60d134c385493aeChris Lattner// CHECK: @test9
941b726771d00762fb5c4c2638e60d134c385493aeChris Lattner// CHECK: call void @llvm.memset
951b726771d00762fb5c4c2638e60d134c385493aeChris Lattner// CHECK-NOT: store i32 0
961b726771d00762fb5c4c2638e60d134c385493aeChris Lattner// CHECK: call void @bar
971b726771d00762fb5c4c2638e60d134c385493aeChris Lattner}
981b726771d00762fb5c4c2638e60d134c385493aeChris Lattner
991b726771d00762fb5c4c2638e60d134c385493aeChris Lattnerstruct a {
1001b726771d00762fb5c4c2638e60d134c385493aeChris Lattner  int a, b, c, d, e, f, g, h, i, j, k, *p;
1011b726771d00762fb5c4c2638e60d134c385493aeChris Lattner};
1021b726771d00762fb5c4c2638e60d134c385493aeChris Lattner
1031b726771d00762fb5c4c2638e60d134c385493aeChris Lattnerstruct b {
1041b726771d00762fb5c4c2638e60d134c385493aeChris Lattner  struct a a,b,c,d,e,f,g;
1051b726771d00762fb5c4c2638e60d134c385493aeChris Lattner};
1061b726771d00762fb5c4c2638e60d134c385493aeChris Lattner
1071b726771d00762fb5c4c2638e60d134c385493aeChris Lattnerint test10(int X) {
1081b726771d00762fb5c4c2638e60d134c385493aeChris Lattner  struct b S = { .a.a = X, .d.e = X, .f.e = 0, .f.f = 0, .f.p = 0 };
1091b726771d00762fb5c4c2638e60d134c385493aeChris Lattner  bar(&S);
1101b726771d00762fb5c4c2638e60d134c385493aeChris Lattner
1111b726771d00762fb5c4c2638e60d134c385493aeChris Lattner  // CHECK: @test10
1121b726771d00762fb5c4c2638e60d134c385493aeChris Lattner  // CHECK: call void @llvm.memset
1131b726771d00762fb5c4c2638e60d134c385493aeChris Lattner  // CHECK-NOT: store i32 0
1141b726771d00762fb5c4c2638e60d134c385493aeChris Lattner  // CHECK: call void @bar
1151b726771d00762fb5c4c2638e60d134c385493aeChris Lattner}
116e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner
117e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner
118e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner// PR9257
119e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattnerstruct test11S {
120e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner  int A[10];
121e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner};
122e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattnervoid test11(struct test11S *P) {
123e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner  *P = (struct test11S) { .A = { [0 ... 3] = 4 } };
124e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner  // CHECK: @test11
125e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner  // CHECK: store i32 4
126e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner  // CHECK: store i32 4
127e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner  // CHECK: store i32 4
128e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner  // CHECK: store i32 4
129e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner  // CHECK: ret void
130e0fd832b076eb5a1e4a4549687af0dbf2ad57181Chris Lattner}
131f742eb0196e1b25c0b71e91da4a2b856d16a1dabChris Lattner
132f742eb0196e1b25c0b71e91da4a2b856d16a1dabChris Lattner
133f742eb0196e1b25c0b71e91da4a2b856d16a1dabChris Lattner// Verify that we can convert a recursive struct with a memory that returns
134f742eb0196e1b25c0b71e91da4a2b856d16a1dabChris Lattner// an instance of the struct we're converting.
135f742eb0196e1b25c0b71e91da4a2b856d16a1dabChris Lattnerstruct test12 {
136f742eb0196e1b25c0b71e91da4a2b856d16a1dabChris Lattner  struct test12 (*p)(void);
137f742eb0196e1b25c0b71e91da4a2b856d16a1dabChris Lattner} test12g;
138f742eb0196e1b25c0b71e91da4a2b856d16a1dabChris Lattner
1395a13d4d2c1e45ab611ca857d923caacfaeb3cd07Eli Friedman
1405a13d4d2c1e45ab611ca857d923caacfaeb3cd07Eli Friedmanvoid test13(int x) {
1415a13d4d2c1e45ab611ca857d923caacfaeb3cd07Eli Friedman  struct X { int a; int b : 10; int c; };
1425a13d4d2c1e45ab611ca857d923caacfaeb3cd07Eli Friedman  struct X y = {.c = x};
1435a13d4d2c1e45ab611ca857d923caacfaeb3cd07Eli Friedman  // CHECK: @test13
14472d2dab6058467036df73a5f668036a519043e5bChandler Carruth  // CHECK: and i16 {{.*}}, -1024
1455a13d4d2c1e45ab611ca857d923caacfaeb3cd07Eli Friedman}
146176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
147176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @PR20473
148176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid PR20473() {
1493ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: memcpy{{.*}}getelementptr inbounds ([2 x i8], [2 x i8]* @
150176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  bar((char[2]) {""});
1513ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK: memcpy{{.*}}getelementptr inbounds ([3 x i8], [3 x i8]* @
152176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  bar((char[3]) {""});
153176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
154