1 | // RUN: %clang_cc1 -emit-llvm %s -o - -triple=i686-pc-win32 -mconstructor-aliases -fno-rtti | FileCheck %s |
2 | |
3 | struct A { |
4 | A() : a(42) {} |
5 | A(const A &o) : a(o.a) {} |
6 | ~A() {} |
7 | int a; |
8 | }; |
9 | |
10 | struct B { |
11 | A foo(A o); |
12 | A __cdecl bar(A o); |
13 | A __stdcall baz(A o); |
14 | A __fastcall qux(A o); |
15 | }; |
16 | |
17 | A B::foo(A x) { |
18 | return x; |
19 | } |
20 | |
21 | // CHECK-LABEL: define dso_local x86_thiscallcc %struct.A* @"?foo@B@@QAE?AUA@@U2@@Z" |
22 | // CHECK: (%struct.B* %this, <{ %struct.A*, %struct.A }>* inalloca) |
23 | // CHECK: getelementptr inbounds <{ %struct.A*, %struct.A }>, <{ %struct.A*, %struct.A }>* %{{.*}}, i32 0, i32 0 |
24 | // CHECK: load %struct.A*, %struct.A** |
25 | // CHECK: ret %struct.A* |
26 | |
27 | A B::bar(A x) { |
28 | return x; |
29 | } |
30 | |
31 | // CHECK-LABEL: define dso_local %struct.A* @"?bar@B@@QAA?AUA@@U2@@Z" |
32 | // CHECK: (<{ %struct.B*, %struct.A*, %struct.A }>* inalloca) |
33 | // CHECK: getelementptr inbounds <{ %struct.B*, %struct.A*, %struct.A }>, <{ %struct.B*, %struct.A*, %struct.A }>* %{{.*}}, i32 0, i32 1 |
34 | // CHECK: load %struct.A*, %struct.A** |
35 | // CHECK: ret %struct.A* |
36 | |
37 | A B::baz(A x) { |
38 | return x; |
39 | } |
40 | |
41 | // CHECK-LABEL: define dso_local x86_stdcallcc %struct.A* @"?baz@B@@QAG?AUA@@U2@@Z" |
42 | // CHECK: (<{ %struct.B*, %struct.A*, %struct.A }>* inalloca) |
43 | // CHECK: getelementptr inbounds <{ %struct.B*, %struct.A*, %struct.A }>, <{ %struct.B*, %struct.A*, %struct.A }>* %{{.*}}, i32 0, i32 1 |
44 | // CHECK: load %struct.A*, %struct.A** |
45 | // CHECK: ret %struct.A* |
46 | |
47 | A B::qux(A x) { |
48 | return x; |
49 | } |
50 | |
51 | // CHECK-LABEL: define dso_local x86_fastcallcc void @"?qux@B@@QAI?AUA@@U2@@Z" |
52 | // CHECK: (%struct.B* inreg %this, %struct.A* inreg noalias sret %agg.result, <{ %struct.A }>* inalloca) |
53 | // CHECK: ret void |
54 | |
55 | int main() { |
56 | B b; |
57 | A a = b.foo(A()); |
58 | a = b.bar(a); |
59 | a = b.baz(a); |
60 | a = b.qux(a); |
61 | } |
62 | |
63 | // CHECK: call x86_thiscallcc %struct.A* @"?foo@B@@QAE?AUA@@U2@@Z" |
64 | // CHECK: (%struct.B* %{{[^,]*}}, <{ %struct.A*, %struct.A }>* inalloca %{{[^,]*}}) |
65 | // CHECK: call %struct.A* @"?bar@B@@QAA?AUA@@U2@@Z" |
66 | // CHECK: (<{ %struct.B*, %struct.A*, %struct.A }>* inalloca %{{[^,]*}}) |
67 | // CHECK: call x86_stdcallcc %struct.A* @"?baz@B@@QAG?AUA@@U2@@Z" |
68 | // CHECK: (<{ %struct.B*, %struct.A*, %struct.A }>* inalloca %{{[^,]*}}) |
69 | // CHECK: call x86_fastcallcc void @"?qux@B@@QAI?AUA@@U2@@Z" |
70 | // CHECK: (%struct.B* inreg %{{[^,]*}}, %struct.A* inreg sret %{{.*}}, <{ %struct.A }>* inalloca %{{[^,]*}}) |
71 | |