Home | History | Annotate | Download | only in CodeGenCXX
      1 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s
      2 
      3 // rdar://8818236
      4 namespace rdar8818236 {
      5 struct S {
      6   char c2;
      7   union {
      8     char c;
      9     int i;
     10   };
     11 };
     12 
     13 // CHECK: @_ZN11rdar88182363fooE = global i64 4
     14 char S::*foo  = &S::c;
     15 }
     16 
     17 struct A {
     18   union {
     19     int a;
     20     void* b;
     21   };
     22 
     23   A() : a(0) { }
     24 };
     25 
     26 A a;
     27 
     28 namespace PR7021 {
     29   struct X
     30   {
     31     union { long l; };
     32   };
     33 
     34   // CHECK-LABEL: define void @_ZN6PR70211fENS_1XES0_
     35   void f(X x, X z) {
     36     X x1;
     37 
     38     // CHECK: store i64 1, i64
     39     x1.l = 1;
     40 
     41     // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
     42     X x2(x1);
     43 
     44     X x3;
     45     // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
     46     x3 = x1;
     47 
     48     // CHECK: ret void
     49   }
     50 }
     51 
     52 namespace test2 {
     53   struct A {
     54     struct {
     55       union {
     56         int b;
     57       };
     58     };
     59 
     60     A();
     61   };
     62 
     63   A::A() : b(10) { }
     64   // CHECK-LABEL: define void @_ZN5test21AC2Ev(
     65   // CHECK-NOT: }
     66   // CHECK: store i32 10
     67   // CHECK: }
     68 }
     69 
     70 namespace PR10512 {
     71   struct A {
     72     A();
     73     A(int);
     74     A(long);
     75 
     76     struct {
     77       struct {int x;};
     78       struct {int y;};
     79     };
     80   };
     81 
     82   // CHECK-LABEL: define void @_ZN7PR105121AC2Ev
     83   // CHECK: [[THISADDR:%[a-zA-z0-9.]+]] = alloca [[A:%"struct[A-Za-z0-9:.]+"]]
     84   // CHECK-NEXT: store [[A]]* [[THIS:%[a-zA-z0-9.]+]], [[A]]** [[THISADDR]]
     85   // CHECK-NEXT: [[THIS1:%[a-zA-z0-9.]+]] = load [[A]]*, [[A]]** [[THISADDR]]
     86   // CHECK-NEXT: ret void
     87   A::A() {}
     88 
     89   // CHECK-LABEL: define void @_ZN7PR105121AC2Ei
     90   // CHECK: [[THISADDR:%[a-zA-z0-9.]+]] = alloca [[A:%"struct[A-Za-z0-9:.]+"]]
     91   // CHECK-NEXT: [[XADDR:%[a-zA-z0-9.]+]] = alloca i32
     92   // CHECK-NEXT: store [[A]]* [[THIS:%[a-zA-z0-9.]+]], [[A]]** [[THISADDR]]
     93   // CHECK-NEXT: store i32 [[X:%[a-zA-z0-9.]+]], i32* [[XADDR]]
     94   // CHECK-NEXT: [[THIS1:%[a-zA-z0-9.]+]] = load [[A]]*, [[A]]** [[THISADDR]]
     95   // CHECK-NEXT: {{getelementptr inbounds.*i32 0, i32 0}}
     96   // CHECK-NEXT: {{getelementptr inbounds.*i32 0, i32 0}}
     97   // CHECK-NEXT: {{getelementptr inbounds.*i32 0, i32 0}}
     98   // CHECK-NEXT: [[TMP:%[a-zA-z0-9.]+]] = load i32, i32* [[XADDR]]
     99   // CHECK-NEXT: store i32 [[TMP]]
    100   // CHECK-NEXT: ret void
    101   A::A(int x) : x(x) { }
    102 
    103   // CHECK-LABEL: define void @_ZN7PR105121AC2El
    104   // CHECK: [[THISADDR:%[a-zA-z0-9.]+]] = alloca [[A:%"struct[A-Za-z0-9:.]+"]]
    105   // CHECK-NEXT: [[XADDR:%[a-zA-z0-9.]+]] = alloca i64
    106   // CHECK-NEXT: store [[A]]* [[THIS:%[a-zA-z0-9.]+]], [[A]]** [[THISADDR]]
    107   // CHECK-NEXT: store i64 [[X:%[a-zA-z0-9.]+]], i64* [[XADDR]]
    108   // CHECK-NEXT: [[THIS1:%[a-zA-z0-9.]+]] = load [[A]]*, [[A]]** [[THISADDR]]
    109   // CHECK-NEXT: {{getelementptr inbounds.*i32 0, i32 0}}
    110   // CHECK-NEXT: {{getelementptr inbounds.*i32 0, i32 1}}
    111   // CHECK-NEXT: {{getelementptr inbounds.*i32 0, i32 0}}
    112   // CHECK-NEXT: [[TMP:%[a-zA-z0-9.]+]] = load i64, i64* [[XADDR]]
    113   // CHECK-NEXT: [[CONV:%[a-zA-z0-9.]+]] = trunc i64 [[TMP]] to i32
    114   // CHECK-NEXT: store i32 [[CONV]]
    115   // CHECK-NEXT: ret void
    116   A::A(long y) : y(y) { }
    117 }
    118 
    119 namespace test3 {
    120   struct A {
    121     union {
    122       mutable char fibers[100];
    123       struct {
    124         void (*callback)(void*);
    125         void *callback_value;
    126       };
    127     };
    128 
    129     A();
    130   };
    131 
    132   A::A() : callback(0), callback_value(0) {}
    133   // CHECK-LABEL: define void @_ZN5test31AC2Ev(
    134   // CHECK: [[THIS:%.*]] = load
    135   // CHECK-NEXT: [[UNION:%.*]] = getelementptr inbounds {{.*}} [[THIS]], i32 0, i32 0
    136   // CHECK-NEXT: [[STRUCT:%.*]] = bitcast {{.*}}* [[UNION]] to
    137   // CHECK-NEXT: [[CALLBACK:%.*]] = getelementptr inbounds {{.*}} [[STRUCT]], i32 0, i32 0
    138   // CHECK: store
    139   // CHECK-NEXT: [[UNION:%.*]] = getelementptr inbounds {{.*}} [[THIS]], i32 0, i32 0
    140   // CHECK-NEXT: [[STRUCT:%.*]] = bitcast {{.*}}* [[UNION]] to
    141   // CHECK-NEXT: [[CVALUE:%.*]] = getelementptr inbounds {{.*}} [[STRUCT]], i32 0, i32 1
    142   // CHECK-NEXT: store i8* null, i8** [[CVALUE]]
    143 }
    144 
    145 struct S {
    146   // CHECK: store i32 42
    147   // CHECK: store i32 55
    148   S() : x(42), y(55) {}
    149   union {
    150     struct {
    151       int x;
    152       union { int y; };
    153     };
    154   };
    155 } s;
    156 
    157 
    158 //PR8760
    159 template <typename T> struct Foo {
    160   Foo() : ptr(__nullptr) {}
    161   union {
    162     T *ptr;
    163   };
    164 };
    165 Foo<int> f;
    166 
    167 namespace PR9683 {
    168   struct QueueEntry {
    169     union {
    170       struct {
    171         void* mPtr;
    172         union {
    173           unsigned mSubmissionTag;
    174         };
    175       };
    176       unsigned mValue;
    177     };
    178     QueueEntry() {}
    179   };
    180   QueueEntry QE;
    181 }
    182 
    183 namespace PR13154 {
    184   struct IndirectReferenceField {
    185       struct {
    186           float &x;
    187       };
    188       IndirectReferenceField(float &x);
    189   };
    190   IndirectReferenceField::IndirectReferenceField(float &xx) : x(xx) {}
    191 }
    192