Home | History | Annotate | Download | only in CodeGen
      1 // RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s
      2 
      3 void f1() {
      4   // Scalars in braces.
      5   int a = { 1 };
      6 }
      7 
      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; };
     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;
     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;
     38 vec3 f5(vec3 value) {
     39   return (vec3) {{
     40     .x = value.x
     41   }};
     42 }
     43 
     44 // rdar://problem/8154689
     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
     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
     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 
     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 };
    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 
    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