1 | // RUN: %clang_cc1 -emit-llvm %s -o - -triple=i386-pc-win32 | FileCheck %s |
2 | |
3 | class C { |
4 | public: |
5 | void simple_method() {} |
6 | |
7 | void __cdecl cdecl_method() {} |
8 | |
9 | void vararg_method(const char *fmt, ...) {} |
10 | |
11 | static void static_method() {} |
12 | |
13 | int a; |
14 | }; |
15 | |
16 | void call_simple_method() { |
17 | C instance; |
18 | |
19 | instance.simple_method(); |
20 | // Make sure that the call uses the right calling convention: |
21 | // CHECK: call x86_thiscallcc void @"?simple_method@C@@QAEXXZ" |
22 | // CHECK: ret |
23 | |
24 | // Make sure that the definition uses the right calling convention: |
25 | // CHECK: define linkonce_odr dso_local x86_thiscallcc void @"?simple_method@C@@QAEXXZ" |
26 | // CHECK: ret |
27 | } |
28 | |
29 | void call_cdecl_method() { |
30 | C instance; |
31 | instance.cdecl_method(); |
32 | // Make sure that the call uses the right calling convention: |
33 | // CHECK: call void @"?cdecl_method@C@@QAAXXZ" |
34 | // CHECK: ret |
35 | |
36 | // Make sure that the definition uses the right calling convention: |
37 | // CHECK: define linkonce_odr dso_local void @"?cdecl_method@C@@QAAXXZ" |
38 | // CHECK: ret |
39 | } |
40 | |
41 | void call_vararg_method() { |
42 | C instance; |
43 | instance.vararg_method("Hello"); |
44 | // Make sure that the call uses the right calling convention: |
45 | // CHECK: call void (%class.C*, i8*, ...) @"?vararg_method@C@@QAAXPBDZZ" |
46 | // CHECK: ret |
47 | |
48 | // Make sure that the definition uses the right calling convention: |
49 | // CHECK: define linkonce_odr dso_local void @"?vararg_method@C@@QAAXPBDZZ" |
50 | } |
51 | |
52 | void call_static_method() { |
53 | C::static_method(); |
54 | // Make sure that the call uses the right calling convention: |
55 | // CHECK: call void @"?static_method@C@@SAXXZ" |
56 | // CHECK: ret |
57 | |
58 | // Make sure that the definition uses the right calling convention: |
59 | // CHECK: define linkonce_odr dso_local void @"?static_method@C@@SAXXZ" |
60 | } |
61 | |
62 | class Base { |
63 | public: |
64 | Base() {} |
65 | ~Base() {} |
66 | }; |
67 | |
68 | class Child: public Base { }; |
69 | |
70 | void constructors() { |
71 | Child c; |
72 | // Make sure that the Base constructor call in the Child constructor uses |
73 | // the right calling convention: |
74 | // CHECK: define linkonce_odr dso_local x86_thiscallcc %class.Child* @"??0Child@@QAE@XZ" |
75 | // CHECK: %{{[.0-9A-Z_a-z]+}} = call x86_thiscallcc %class.Base* @"??0Base@@QAE@XZ" |
76 | // CHECK: ret |
77 | |
78 | // Make sure that the Base destructor call in the Child denstructor uses |
79 | // the right calling convention: |
80 | // CHECK: define linkonce_odr dso_local x86_thiscallcc void @"??1Child@@QAE@XZ" |
81 | // CHECK: call x86_thiscallcc void @"??1Base@@QAE@XZ" |
82 | // CHECK: ret |
83 | |
84 | // Make sure that the Base constructor definition uses the right CC: |
85 | // CHECK: define linkonce_odr dso_local x86_thiscallcc %class.Base* @"??0Base@@QAE@XZ" |
86 | |
87 | // Make sure that the Base destructor definition uses the right CC: |
88 | // CHECK: define linkonce_odr dso_local x86_thiscallcc void @"??1Base@@QAE@XZ" |
89 | } |
90 | |