// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s void f1() { // Scalars in braces. int a = { 1 }; } void f2() { int a[2][2] = { { 1, 2 }, { 3, 4 } }; int b[3][3] = { { 1, 2 }, { 3, 4 } }; int *c[2] = { &a[1][1], &b[2][2] }; int *d[2][2] = { {&a[1][1], &b[2][2]}, {&a[0][0], &b[1][1]} }; int *e[3][3] = { {&a[1][1], &b[2][2]}, {&a[0][0], &b[1][1]} }; char ext[3][3] = {".Y",".U",".V"}; } typedef void (* F)(void); extern void foo(void); struct S { F f; }; void f3() { struct S a[1] = { { foo } }; } // Constants // CHECK: @g3 = constant i32 10 // CHECK: @f4.g4 = internal constant i32 12 const int g3 = 10; int f4() { static const int g4 = 12; return g4; } // PR6537 typedef union vec3 { struct { double x, y, z; }; double component[3]; } vec3; vec3 f5(vec3 value) { return (vec3) {{ .x = value.x }}; } // rdar://problem/8154689 void f6() { int x; long ids[] = { (long) &x }; } // CHECK: @test7 = global{{.*}}{ i32 0, [4 x i8] c"bar\00" } // PR8217 struct a7 { int b; char v[]; }; struct a7 test7 = { .b = 0, .v = "bar" }; // PR279 comment #3 char test8(int X) { char str[100000] = "abc"; // tail should be memset. return str[X]; // CHECK: @test8( // CHECK: call void @llvm.memset // CHECK: store i8 97 // CHECK: store i8 98 // CHECK: store i8 99 } void bar(void*); // PR279 int test9(int X) { int Arr[100] = { X }; // Should use memset bar(Arr); // CHECK: @test9 // CHECK: call void @llvm.memset // CHECK-NOT: store i32 0 // CHECK: call void @bar } struct a { int a, b, c, d, e, f, g, h, i, j, k, *p; }; struct b { struct a a,b,c,d,e,f,g; }; int test10(int X) { struct b S = { .a.a = X, .d.e = X, .f.e = 0, .f.f = 0, .f.p = 0 }; bar(&S); // CHECK: @test10 // CHECK: call void @llvm.memset // CHECK-NOT: store i32 0 // CHECK: call void @bar } // PR9257 struct test11S { int A[10]; }; void test11(struct test11S *P) { *P = (struct test11S) { .A = { [0 ... 3] = 4 } }; // CHECK: @test11 // CHECK: store i32 4 // CHECK: store i32 4 // CHECK: store i32 4 // CHECK: store i32 4 // CHECK: ret void } // Verify that we can convert a recursive struct with a memory that returns // an instance of the struct we're converting. struct test12 { struct test12 (*p)(void); } test12g;