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