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