xref: /llvm-project/clang/test/CodeGenCXX/cxx11-unrestricted-union.cpp (revision c9bd88e6811fb622cde644a82eac41c0b02c00ee)
1*c9bd88e6SHans Wennborg // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++11 -emit-llvm %s -o - | FileCheck %s
2522fa537SRichard Smith 
3522fa537SRichard Smith struct A {
4522fa537SRichard Smith   A(); A(const A&); A(A&&); A &operator=(const A&); A &operator=(A&&); ~A();
5522fa537SRichard Smith };
6522fa537SRichard Smith struct B {
7522fa537SRichard Smith   B(); B(const B&); B(B&&); B &operator=(const B&); B &operator=(B&&); ~B();
8522fa537SRichard Smith };
9522fa537SRichard Smith 
10522fa537SRichard Smith union U {
11522fa537SRichard Smith   U();
12522fa537SRichard Smith   U(const U &);
13522fa537SRichard Smith   U(U &&);
14522fa537SRichard Smith   U &operator=(const U&);
15522fa537SRichard Smith   U &operator=(U&&);
16522fa537SRichard Smith   ~U();
17522fa537SRichard Smith 
18522fa537SRichard Smith   A a;
19522fa537SRichard Smith   int n;
20522fa537SRichard Smith };
21522fa537SRichard Smith 
22522fa537SRichard Smith // CHECK-NOT: _ZN1A
U()23522fa537SRichard Smith U::U() {}
U(const U &)24522fa537SRichard Smith U::U(const U&) {}
U(U &&)25522fa537SRichard Smith U::U(U&&) {}
operator =(const U &)26522fa537SRichard Smith U &U::operator=(const U&) { return *this; }
operator =(U &&)27522fa537SRichard Smith U &U::operator=(U &&) { return *this; }
~U()28522fa537SRichard Smith U::~U() {}
29522fa537SRichard Smith 
30522fa537SRichard Smith struct S {
31522fa537SRichard Smith   S();
32522fa537SRichard Smith   S(const S &);
33522fa537SRichard Smith   S(S &&);
34522fa537SRichard Smith   S &operator=(const S&);
35522fa537SRichard Smith   S &operator=(S&&);
36522fa537SRichard Smith   ~S();
37522fa537SRichard Smith 
38522fa537SRichard Smith   union {
39522fa537SRichard Smith     A a;
40522fa537SRichard Smith     int n;
41522fa537SRichard Smith   };
42522fa537SRichard Smith   B b;
43522fa537SRichard Smith   int m;
44522fa537SRichard Smith };
45522fa537SRichard Smith 
46522fa537SRichard Smith // CHECK: _ZN1SC2Ev
47522fa537SRichard Smith // CHECK-NOT: _ZN1A
48522fa537SRichard Smith // CHECK: _ZN1BC1Ev
S()49522fa537SRichard Smith S::S() {}
50522fa537SRichard Smith 
51522fa537SRichard Smith // CHECK-NOT: _ZN1A
52522fa537SRichard Smith 
53522fa537SRichard Smith // CHECK: _ZN1SC2ERKS_
54522fa537SRichard Smith // CHECK-NOT: _ZN1A
55522fa537SRichard Smith // CHECK: _ZN1BC1Ev
S(const S &)56522fa537SRichard Smith S::S(const S&) {}
57522fa537SRichard Smith 
58522fa537SRichard Smith // CHECK-NOT: _ZN1A
59522fa537SRichard Smith 
60522fa537SRichard Smith // CHECK: _ZN1SC2EOS_
61522fa537SRichard Smith // CHECK-NOT: _ZN1A
62522fa537SRichard Smith // CHECK: _ZN1BC1Ev
S(S &&)63522fa537SRichard Smith S::S(S&&) {}
64522fa537SRichard Smith 
65522fa537SRichard Smith // CHECK-NOT: _ZN1A
66522fa537SRichard Smith // CHECK-NOT: _ZN1B
operator =(const S &)67522fa537SRichard Smith S &S::operator=(const S&) { return *this; }
68522fa537SRichard Smith 
operator =(S &&)69522fa537SRichard Smith S &S::operator=(S &&) { return *this; }
70522fa537SRichard Smith 
71522fa537SRichard Smith // CHECK: _ZN1SD2Ev
72522fa537SRichard Smith // CHECK-NOT: _ZN1A
73522fa537SRichard Smith // CHECK: _ZN1BD1Ev
~S()74522fa537SRichard Smith S::~S() {}
75522fa537SRichard Smith 
76522fa537SRichard Smith // CHECK-NOT: _ZN1A
77