xref: /aosp_15_r20/external/clang/test/CodeGenCXX/implicit-copy-constructor.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s -std=c++11 | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li struct A {
4*67e74705SXin Li   A();
5*67e74705SXin Li   A(const A&);
6*67e74705SXin Li   A(A&);
7*67e74705SXin Li   ~A();
8*67e74705SXin Li };
9*67e74705SXin Li 
10*67e74705SXin Li struct B {
11*67e74705SXin Li   B();
12*67e74705SXin Li   B(B&);
13*67e74705SXin Li };
14*67e74705SXin Li 
15*67e74705SXin Li struct C {
CC16*67e74705SXin Li   C() {}
17*67e74705SXin Li   C(C& other, A a = A());
18*67e74705SXin Li   int i, j;
19*67e74705SXin Li };
20*67e74705SXin Li 
21*67e74705SXin Li struct POD {
22*67e74705SXin Li   int array[3][4];
23*67e74705SXin Li };
24*67e74705SXin Li 
25*67e74705SXin Li struct D : A, B, virtual C {
26*67e74705SXin Li   D();
27*67e74705SXin Li   int scalar;
28*67e74705SXin Li   int scalar_array[2][3];
29*67e74705SXin Li   B class_member;
30*67e74705SXin Li   C class_member_array[2][3];
31*67e74705SXin Li   POD pod_array[2][3];
32*67e74705SXin Li 
33*67e74705SXin Li   union {
34*67e74705SXin Li     int x;
35*67e74705SXin Li     float f[3];
36*67e74705SXin Li   };
37*67e74705SXin Li };
38*67e74705SXin Li 
f(D d)39*67e74705SXin Li void f(D d) {
40*67e74705SXin Li   D d2(d);
41*67e74705SXin Li }
42*67e74705SXin Li 
43*67e74705SXin Li // CHECK-LABEL: define linkonce_odr void @_ZN1DC1ERS_(%struct.D* %this, %struct.D* dereferenceable({{[0-9]+}})) unnamed_addr
44*67e74705SXin Li // CHECK: call void @_ZN1AC1Ev
45*67e74705SXin Li // CHECK: call void @_ZN1CC2ERS_1A
46*67e74705SXin Li // CHECK: call void @_ZN1AD1Ev
47*67e74705SXin Li // CHECK: call void @_ZN1AC2ERS_
48*67e74705SXin Li // CHECK: call void @_ZN1BC2ERS_
49*67e74705SXin Li // CHECK: {{call void @llvm.memcpy.p0i8.p0i8.i64.*i64 28}}
50*67e74705SXin Li // CHECK: call void @_ZN1BC1ERS_
51*67e74705SXin Li // CHECK: br
52*67e74705SXin Li // CHECK: {{icmp ult.*, 2}}
53*67e74705SXin Li // CHECK: {{icmp ult.*, 3}}
54*67e74705SXin Li // CHECK: call void @_ZN1AC1Ev
55*67e74705SXin Li // CHECK: call void @_ZN1CC1ERS_1A
56*67e74705SXin Li // CHECK: call void @_ZN1AD1Ev
57*67e74705SXin Li // CHECK: {{call void @llvm.memcpy.p0i8.p0i8.i64.*i64 300}}
58*67e74705SXin Li // CHECK: ret void
59*67e74705SXin Li 
60*67e74705SXin Li 
f0X061*67e74705SXin Li template<class T> struct X0 { void f0(T * ) { } };
X1X162*67e74705SXin Li template <class > struct X1 { X1( X1& , int = 0 ) { } };
63*67e74705SXin Li struct X2 { X1<int> result; };
test_X2()64*67e74705SXin Li void test_X2()
65*67e74705SXin Li {
66*67e74705SXin Li   typedef X2 impl;
67*67e74705SXin Li   typedef X0<impl> pimpl;
68*67e74705SXin Li   impl* i;
69*67e74705SXin Li   pimpl pdata;
70*67e74705SXin Li   pdata.f0( new impl(*i));
71*67e74705SXin Li }
72*67e74705SXin Li 
73*67e74705SXin Li // rdar://problem/9598341
74*67e74705SXin Li namespace test3 {
75*67e74705SXin Li   struct A { A(const A&); A&operator=(const A&); };
76*67e74705SXin Li   struct B { A a; unsigned : 0; };
test(const B & x)77*67e74705SXin Li   void test(const B &x) {
78*67e74705SXin Li     B y = x;
79*67e74705SXin Li     y = x;
80*67e74705SXin Li   }
81*67e74705SXin Li }
82*67e74705SXin Li 
83*67e74705SXin Li namespace test4 {
84*67e74705SXin Li   // When determining whether to implement an array copy as a memcpy, look at
85*67e74705SXin Li   // whether the *selected* constructor is trivial.
86*67e74705SXin Li   struct S {
87*67e74705SXin Li     int arr[5][5];
88*67e74705SXin Li     S(S &);
89*67e74705SXin Li     S(const S &) = default;
90*67e74705SXin Li   };
91*67e74705SXin Li   // CHECK: @_ZN5test42f1
f1(S a)92*67e74705SXin Li   void f1(S a) {
93*67e74705SXin Li     // CHECK-NOT: memcpy
94*67e74705SXin Li     // CHECK: call void @_ZN5test41SC1ERS0_
95*67e74705SXin Li     // CHECK-NOT: memcpy
96*67e74705SXin Li     S b(a);
97*67e74705SXin Li     // CHECK: }
98*67e74705SXin Li   }
99*67e74705SXin Li   // CHECK: @_ZN5test42f2
f2(const S a)100*67e74705SXin Li   void f2(const S a) {
101*67e74705SXin Li     // CHECK-NOT: call void @_ZN5test41SC1ERS0_
102*67e74705SXin Li     // CHECK: memcpy
103*67e74705SXin Li     // CHECK-NOT: call void @_ZN5test41SC1ERS0_
104*67e74705SXin Li     S b(a);
105*67e74705SXin Li     // CHECK: }
106*67e74705SXin Li   }
107*67e74705SXin Li }
108