// 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 struct Foo { Foo() : ptr(__nullptr) {} union { T *ptr; }; }; Foo 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) {} }