xref: /aosp_15_r20/external/clang/test/CodeGenCXX/anonymous-union-member-initializer.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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