xref: /aosp_15_r20/external/clang/test/CodeGenCXX/cxx11-unrestricted-union.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++11 -emit-llvm %s -o - | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li struct A {
4*67e74705SXin Li   A(); A(const A&); A(A&&); A &operator=(const A&); A &operator=(A&&); ~A();
5*67e74705SXin Li };
6*67e74705SXin Li struct B {
7*67e74705SXin Li   B(); B(const B&); B(B&&); B &operator=(const B&); B &operator=(B&&); ~B();
8*67e74705SXin Li };
9*67e74705SXin Li 
10*67e74705SXin Li union U {
11*67e74705SXin Li   U();
12*67e74705SXin Li   U(const U &);
13*67e74705SXin Li   U(U &&);
14*67e74705SXin Li   U &operator=(const U&);
15*67e74705SXin Li   U &operator=(U&&);
16*67e74705SXin Li   ~U();
17*67e74705SXin Li 
18*67e74705SXin Li   A a;
19*67e74705SXin Li   int n;
20*67e74705SXin Li };
21*67e74705SXin Li 
22*67e74705SXin Li // CHECK-NOT: _ZN1A
U()23*67e74705SXin Li U::U() {}
U(const U &)24*67e74705SXin Li U::U(const U&) {}
U(U &&)25*67e74705SXin Li U::U(U&&) {}
operator =(const U &)26*67e74705SXin Li U &U::operator=(const U&) { return *this; }
operator =(U &&)27*67e74705SXin Li U &U::operator=(U &&) { return *this; }
~U()28*67e74705SXin Li U::~U() {}
29*67e74705SXin Li 
30*67e74705SXin Li struct S {
31*67e74705SXin Li   S();
32*67e74705SXin Li   S(const S &);
33*67e74705SXin Li   S(S &&);
34*67e74705SXin Li   S &operator=(const S&);
35*67e74705SXin Li   S &operator=(S&&);
36*67e74705SXin Li   ~S();
37*67e74705SXin Li 
38*67e74705SXin Li   union {
39*67e74705SXin Li     A a;
40*67e74705SXin Li     int n;
41*67e74705SXin Li   };
42*67e74705SXin Li   B b;
43*67e74705SXin Li   int m;
44*67e74705SXin Li };
45*67e74705SXin Li 
46*67e74705SXin Li // CHECK: _ZN1SC2Ev
47*67e74705SXin Li // CHECK-NOT: _ZN1A
48*67e74705SXin Li // CHECK: _ZN1BC1Ev
S()49*67e74705SXin Li S::S() {}
50*67e74705SXin Li 
51*67e74705SXin Li // CHECK-NOT: _ZN1A
52*67e74705SXin Li 
53*67e74705SXin Li // CHECK: _ZN1SC2ERKS_
54*67e74705SXin Li // CHECK-NOT: _ZN1A
55*67e74705SXin Li // CHECK: _ZN1BC1Ev
S(const S &)56*67e74705SXin Li S::S(const S&) {}
57*67e74705SXin Li 
58*67e74705SXin Li // CHECK-NOT: _ZN1A
59*67e74705SXin Li 
60*67e74705SXin Li // CHECK: _ZN1SC2EOS_
61*67e74705SXin Li // CHECK-NOT: _ZN1A
62*67e74705SXin Li // CHECK: _ZN1BC1Ev
S(S &&)63*67e74705SXin Li S::S(S&&) {}
64*67e74705SXin Li 
65*67e74705SXin Li // CHECK-NOT: _ZN1A
66*67e74705SXin Li // CHECK-NOT: _ZN1B
operator =(const S &)67*67e74705SXin Li S &S::operator=(const S&) { return *this; }
68*67e74705SXin Li 
operator =(S &&)69*67e74705SXin Li S &S::operator=(S &&) { return *this; }
70*67e74705SXin Li 
71*67e74705SXin Li // CHECK: _ZN1SD2Ev
72*67e74705SXin Li // CHECK-NOT: _ZN1A
73*67e74705SXin Li // CHECK: _ZN1BD1Ev
~S()74*67e74705SXin Li S::~S() {}
75*67e74705SXin Li 
76*67e74705SXin Li // CHECK-NOT: _ZN1A
77