xref: /aosp_15_r20/external/clang/test/CodeGenCXX/copy-constructor-elim.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm -o - %s | FileCheck %s
2*67e74705SXin Li // RUN: %clang_cc1 -triple %ms_abi_triple -emit-llvm -o - %s | FileCheck %s -check-prefix MS
3*67e74705SXin Li // CHECK-NOT: _ZN1CC1ERK1C
4*67e74705SXin Li // CHECK-NOT: _ZN1SC1ERK1S
5*67e74705SXin Li // MS-NOT: ?0C@@QAE@ABV0
6*67e74705SXin Li // MS-NOT: ?0S@@QAE@ABV0
7*67e74705SXin Li 
8*67e74705SXin Li extern "C" int printf(...);
9*67e74705SXin Li 
10*67e74705SXin Li 
11*67e74705SXin Li struct C {
CC12*67e74705SXin Li   C() : iC(6) {printf("C()\n"); }
CC13*67e74705SXin Li   C(const C& c) { printf("C(const C& c)\n"); }
14*67e74705SXin Li   int iC;
15*67e74705SXin Li };
16*67e74705SXin Li 
foo()17*67e74705SXin Li C foo() {
18*67e74705SXin Li   return C();
19*67e74705SXin Li };
20*67e74705SXin Li 
21*67e74705SXin Li class X { // ...
22*67e74705SXin Li public:
X(int)23*67e74705SXin Li   X(int) {}
X(const X &,int i=1,int j=2,C c=foo ())24*67e74705SXin Li   X(const X&, int i = 1, int j = 2, C c = foo()) {
25*67e74705SXin Li     printf("X(const X&, %d, %d, %d)\n", i, j, c.iC);
26*67e74705SXin Li   }
27*67e74705SXin Li };
28*67e74705SXin Li 
29*67e74705SXin Li 
30*67e74705SXin Li struct S {
31*67e74705SXin Li   S();
32*67e74705SXin Li };
33*67e74705SXin Li 
S()34*67e74705SXin Li S::S() { printf("S()\n"); }
35*67e74705SXin Li 
Call(S)36*67e74705SXin Li void Call(S) {};
37*67e74705SXin Li 
main()38*67e74705SXin Li int main() {
39*67e74705SXin Li   X a(1);
40*67e74705SXin Li   X b(a, 2);
41*67e74705SXin Li   X c = b;
42*67e74705SXin Li   X d(a, 5, 6);
43*67e74705SXin Li   S s;
44*67e74705SXin Li   Call(s);
45*67e74705SXin Li }
46*67e74705SXin Li 
47*67e74705SXin Li struct V {
48*67e74705SXin Li   int x;
49*67e74705SXin Li };
50*67e74705SXin Li 
51*67e74705SXin Li typedef V V_over_aligned __attribute((aligned(8)));
52*67e74705SXin Li extern const V_over_aligned gv1 = {};
53*67e74705SXin Li 
f()54*67e74705SXin Li extern "C" V f() { return gv1; }
55*67e74705SXin Li 
56*67e74705SXin Li // Make sure that we obey the destination's alignment requirements when emitting
57*67e74705SXin Li // the copy.
58*67e74705SXin Li // CHECK-LABEL: define {{.*}} @f(
59*67e74705SXin Li // CHECK:   call void @llvm.memcpy.p0i8.p0i8.{{i64|i32}}({{.*}}, i8* bitcast (%struct.V* @gv1 to i8*), {{i64|i32}} 4, i32 4, i1 false)
60