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