xref: /aosp_15_r20/external/clang/test/CodeGenCXX/constructor-direct-call.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple i686-pc-mingw32 -fms-extensions -Wmicrosoft %s -emit-llvm -o - | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li class Test1 {
4*67e74705SXin Li public:
5*67e74705SXin Li    int a;
6*67e74705SXin Li };
7*67e74705SXin Li 
f1()8*67e74705SXin Li void f1() {
9*67e74705SXin Li   Test1 var;
10*67e74705SXin Li   var.Test1::Test1();
11*67e74705SXin Li 
12*67e74705SXin Li   // CHECK:   call void @llvm.memcpy.p0i8.p0i8.i32(i8* %{{.*}}, i8* %{{.*}}, i32 4, i32 4, i1 false)
13*67e74705SXin Li   var.Test1::Test1(var);
14*67e74705SXin Li }
15*67e74705SXin Li 
16*67e74705SXin Li class Test2 {
17*67e74705SXin Li public:
Test2()18*67e74705SXin Li   Test2() { a = 10; b = 10; }
19*67e74705SXin Li    int a;
20*67e74705SXin Li    int b;
21*67e74705SXin Li };
22*67e74705SXin Li 
f2()23*67e74705SXin Li void f2() {
24*67e74705SXin Li   // CHECK:  %var = alloca %class.Test2, align 4
25*67e74705SXin Li   // CHECK-NEXT:  call x86_thiscallcc void @_ZN5Test2C1Ev(%class.Test2* %var)
26*67e74705SXin Li   Test2 var;
27*67e74705SXin Li 
28*67e74705SXin Li   // CHECK-NEXT:  call x86_thiscallcc void @_ZN5Test2C1Ev(%class.Test2* %var)
29*67e74705SXin Li   var.Test2::Test2();
30*67e74705SXin Li 
31*67e74705SXin Li   // CHECK:  call void @llvm.memcpy.p0i8.p0i8.i32(i8* %{{.*}}, i8* %{{.*}}, i32 8, i32 4, i1 false)
32*67e74705SXin Li   var.Test2::Test2(var);
33*67e74705SXin Li }
34*67e74705SXin Li 
35*67e74705SXin Li 
36*67e74705SXin Li 
37*67e74705SXin Li 
38*67e74705SXin Li class Test3 {
39*67e74705SXin Li public:
Test3()40*67e74705SXin Li   Test3() { a = 10; b = 15; c = 20; }
Test3(const Test3 & that)41*67e74705SXin Li   Test3(const Test3& that) { a = that.a; b = that.b; c = that.c; }
42*67e74705SXin Li    int a;
43*67e74705SXin Li    int b;
44*67e74705SXin Li    int c;
45*67e74705SXin Li };
46*67e74705SXin Li 
f3()47*67e74705SXin Li void f3() {
48*67e74705SXin Li   // CHECK: call x86_thiscallcc void @_ZN5Test3C1Ev(%class.Test3* %var)
49*67e74705SXin Li   Test3 var;
50*67e74705SXin Li 
51*67e74705SXin Li   // CHECK-NEXT: call x86_thiscallcc void @_ZN5Test3C1Ev(%class.Test3* %var2)
52*67e74705SXin Li   Test3 var2;
53*67e74705SXin Li 
54*67e74705SXin Li   // CHECK-NEXT: call x86_thiscallcc void @_ZN5Test3C1Ev(%class.Test3* %var)
55*67e74705SXin Li   var.Test3::Test3();
56*67e74705SXin Li 
57*67e74705SXin Li   // CHECK-NEXT: call x86_thiscallcc void @_ZN5Test3C1ERKS_(%class.Test3* %var, %class.Test3* dereferenceable({{[0-9]+}}) %var2)
58*67e74705SXin Li   var.Test3::Test3(var2);
59*67e74705SXin Li }
60