|  | // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s | 
|  |  | 
|  | // rdar://8818236 | 
|  | namespace rdar8818236 { | 
|  | struct S { | 
|  | char c2; | 
|  | union { | 
|  | char c; | 
|  | int i; | 
|  | }; | 
|  | }; | 
|  |  | 
|  | // CHECK: @_ZN11rdar88182363fooE = global i64 4 | 
|  | char S::*foo  = &S::c; | 
|  | } | 
|  |  | 
|  | struct A { | 
|  | union { | 
|  | int a; | 
|  | void* b; | 
|  | }; | 
|  |  | 
|  | A() : a(0) { } | 
|  | }; | 
|  |  | 
|  | A a; | 
|  |  | 
|  | namespace PR7021 { | 
|  | struct X | 
|  | { | 
|  | union { long l; }; | 
|  | }; | 
|  |  | 
|  | // CHECK-LABEL: define void @_ZN6PR70211fENS_1XES0_ | 
|  | void f(X x, X z) { | 
|  | X x1; | 
|  |  | 
|  | // CHECK: store i64 1, i64 | 
|  | x1.l = 1; | 
|  |  | 
|  | // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64 | 
|  | X x2(x1); | 
|  |  | 
|  | X x3; | 
|  | // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64 | 
|  | x3 = x1; | 
|  |  | 
|  | // CHECK: ret void | 
|  | } | 
|  | } | 
|  |  | 
|  | namespace test2 { | 
|  | struct A { | 
|  | struct { | 
|  | union { | 
|  | int b; | 
|  | }; | 
|  | }; | 
|  |  | 
|  | A(); | 
|  | }; | 
|  |  | 
|  | A::A() : b(10) { } | 
|  | // CHECK-LABEL: define void @_ZN5test21AC2Ev( | 
|  | // CHECK-NOT: } | 
|  | // CHECK: store i32 10 | 
|  | // CHECK: } | 
|  | } | 
|  |  | 
|  | namespace PR10512 { | 
|  | struct A { | 
|  | A(); | 
|  | A(int); | 
|  | A(long); | 
|  |  | 
|  | struct { | 
|  | struct {int x;}; | 
|  | struct {int y;}; | 
|  | }; | 
|  | }; | 
|  |  | 
|  | // CHECK-LABEL: define void @_ZN7PR105121AC2Ev | 
|  | // CHECK: [[THISADDR:%[a-zA-Z0-9.]+]] = alloca [[A:%"struct[A-Za-z0-9:.]+"]] | 
|  | // CHECK-NEXT: store [[A]]* [[THIS:%[a-zA-Z0-9.]+]], [[A]]** [[THISADDR]] | 
|  | // CHECK-NEXT: [[THIS1:%[a-zA-Z0-9.]+]] = load [[A]]*, [[A]]** [[THISADDR]] | 
|  | // CHECK-NEXT: ret void | 
|  | A::A() {} | 
|  |  | 
|  | // CHECK-LABEL: define void @_ZN7PR105121AC2Ei | 
|  | // CHECK: [[THISADDR:%[a-zA-Z0-9.]+]] = alloca [[A:%"struct[A-Za-z0-9:.]+"]] | 
|  | // CHECK-NEXT: [[XADDR:%[a-zA-Z0-9.]+]] = alloca i32 | 
|  | // CHECK-NEXT: store [[A]]* [[THIS:%[a-zA-Z0-9.]+]], [[A]]** [[THISADDR]] | 
|  | // CHECK-NEXT: store i32 [[X:%[a-zA-Z0-9.]+]], i32* [[XADDR]] | 
|  | // CHECK-NEXT: [[THIS1:%[a-zA-Z0-9.]+]] = load [[A]]*, [[A]]** [[THISADDR]] | 
|  | // CHECK-NEXT: {{getelementptr inbounds.*i32 0, i32 0}} | 
|  | // CHECK-NEXT: {{getelementptr inbounds.*i32 0, i32 0}} | 
|  | // CHECK-NEXT: {{getelementptr inbounds.*i32 0, i32 0}} | 
|  | // CHECK-NEXT: [[TMP:%[a-zA-Z0-9.]+]] = load i32, i32* [[XADDR]] | 
|  | // CHECK-NEXT: store i32 [[TMP]] | 
|  | // CHECK-NEXT: ret void | 
|  | A::A(int x) : x(x) { } | 
|  |  | 
|  | // CHECK-LABEL: define void @_ZN7PR105121AC2El | 
|  | // CHECK: [[THISADDR:%[a-zA-Z0-9.]+]] = alloca [[A:%"struct[A-Za-z0-9:.]+"]] | 
|  | // CHECK-NEXT: [[XADDR:%[a-zA-Z0-9.]+]] = alloca i64 | 
|  | // CHECK-NEXT: store [[A]]* [[THIS:%[a-zA-Z0-9.]+]], [[A]]** [[THISADDR]] | 
|  | // CHECK-NEXT: store i64 [[X:%[a-zA-Z0-9.]+]], i64* [[XADDR]] | 
|  | // CHECK-NEXT: [[THIS1:%[a-zA-Z0-9.]+]] = load [[A]]*, [[A]]** [[THISADDR]] | 
|  | // CHECK-NEXT: {{getelementptr inbounds.*i32 0, i32 0}} | 
|  | // CHECK-NEXT: {{getelementptr inbounds.*i32 0, i32 1}} | 
|  | // CHECK-NEXT: {{getelementptr inbounds.*i32 0, i32 0}} | 
|  | // CHECK-NEXT: [[TMP:%[a-zA-Z0-9.]+]] = load i64, i64* [[XADDR]] | 
|  | // CHECK-NEXT: [[CONV:%[a-zA-Z0-9.]+]] = trunc i64 [[TMP]] to i32 | 
|  | // CHECK-NEXT: store i32 [[CONV]] | 
|  | // CHECK-NEXT: ret void | 
|  | A::A(long y) : y(y) { } | 
|  | } | 
|  |  | 
|  | namespace test3 { | 
|  | struct A { | 
|  | union { | 
|  | mutable char fibers[100]; | 
|  | struct { | 
|  | void (*callback)(void*); | 
|  | void *callback_value; | 
|  | }; | 
|  | }; | 
|  |  | 
|  | A(); | 
|  | }; | 
|  |  | 
|  | A::A() : callback(0), callback_value(0) {} | 
|  | // CHECK-LABEL: define void @_ZN5test31AC2Ev( | 
|  | // CHECK: [[THIS:%.*]] = load | 
|  | // CHECK-NEXT: [[UNION:%.*]] = getelementptr inbounds {{.*}} [[THIS]], i32 0, i32 0 | 
|  | // CHECK-NEXT: [[STRUCT:%.*]] = bitcast {{.*}}* [[UNION]] to | 
|  | // CHECK-NEXT: [[CALLBACK:%.*]] = getelementptr inbounds {{.*}} [[STRUCT]], i32 0, i32 0 | 
|  | // CHECK: store | 
|  | // CHECK-NEXT: [[UNION:%.*]] = getelementptr inbounds {{.*}} [[THIS]], i32 0, i32 0 | 
|  | // CHECK-NEXT: [[STRUCT:%.*]] = bitcast {{.*}}* [[UNION]] to | 
|  | // CHECK-NEXT: [[CVALUE:%.*]] = getelementptr inbounds {{.*}} [[STRUCT]], i32 0, i32 1 | 
|  | // CHECK-NEXT: store i8* null, i8** [[CVALUE]] | 
|  | } | 
|  |  | 
|  | struct S { | 
|  | // CHECK: store i32 42 | 
|  | // CHECK: store i32 55 | 
|  | S() : x(42), y(55) {} | 
|  | union { | 
|  | struct { | 
|  | int x; | 
|  | union { int y; }; | 
|  | }; | 
|  | }; | 
|  | } s; | 
|  |  | 
|  |  | 
|  | //PR8760 | 
|  | template <typename T> struct Foo { | 
|  | Foo() : ptr(__nullptr) {} | 
|  | union { | 
|  | T *ptr; | 
|  | }; | 
|  | }; | 
|  | Foo<int> f; | 
|  |  | 
|  | namespace PR9683 { | 
|  | struct QueueEntry { | 
|  | union { | 
|  | struct { | 
|  | void* mPtr; | 
|  | union { | 
|  | unsigned mSubmissionTag; | 
|  | }; | 
|  | }; | 
|  | unsigned mValue; | 
|  | }; | 
|  | QueueEntry() {} | 
|  | }; | 
|  | QueueEntry QE; | 
|  | } | 
|  |  | 
|  | namespace PR13154 { | 
|  | struct IndirectReferenceField { | 
|  | struct { | 
|  | float &x; | 
|  | }; | 
|  | IndirectReferenceField(float &x); | 
|  | }; | 
|  | IndirectReferenceField::IndirectReferenceField(float &xx) : x(xx) {} | 
|  | } |