xref: /minix3/external/bsd/llvm/dist/clang/test/SemaCXX/calling-conv-compat.cpp (revision f4a2713ac843a11c696ec80c0a5e3e5d80b4d338)
1*f4a2713aSLionel Sambuc // RUN: %clang_cc1 -fsyntax-only -std=c++11 -fms-extensions -cxx-abi microsoft -verify -triple i686-pc-win32 %s
2*f4a2713aSLionel Sambuc 
3*f4a2713aSLionel Sambuc // Pointers to free functions
4*f4a2713aSLionel Sambuc void            free_func_default();
5*f4a2713aSLionel Sambuc void __cdecl    free_func_cdecl();
6*f4a2713aSLionel Sambuc void __stdcall  free_func_stdcall();
7*f4a2713aSLionel Sambuc void __fastcall free_func_fastcall();
8*f4a2713aSLionel Sambuc 
9*f4a2713aSLionel Sambuc typedef void (           *fptr_default)();
10*f4a2713aSLionel Sambuc typedef void (__cdecl    *fptr_cdecl)();
11*f4a2713aSLionel Sambuc typedef void (__stdcall  *fptr_stdcall)();
12*f4a2713aSLionel Sambuc typedef void (__fastcall *fptr_fastcall)();
13*f4a2713aSLionel Sambuc 
14*f4a2713aSLionel Sambuc // expected-note@+4 {{candidate function not viable: no known conversion from 'void () __attribute__((stdcall))' to 'fptr_default' (aka 'void (*)()') for 1st argument}}
15*f4a2713aSLionel Sambuc // expected-note@+3 {{candidate function not viable: no known conversion from 'void () __attribute__((fastcall))' to 'fptr_default' (aka 'void (*)()') for 1st argument}}
16*f4a2713aSLionel Sambuc // expected-note@+2 {{candidate function not viable: no known conversion from 'void (*)() __attribute__((stdcall))' to 'fptr_default' (aka 'void (*)()') for 1st argument}}
17*f4a2713aSLionel Sambuc // expected-note@+1 {{candidate function not viable: no known conversion from 'void (*)() __attribute__((fastcall))' to 'fptr_default' (aka 'void (*)()') for 1st argument}}
18*f4a2713aSLionel Sambuc void cb_fptr_default(fptr_default ptr);
19*f4a2713aSLionel Sambuc // expected-note@+4 {{candidate function not viable: no known conversion from 'void () __attribute__((stdcall))' to 'fptr_cdecl' (aka 'void (*)()') for 1st argument}}
20*f4a2713aSLionel Sambuc // expected-note@+3 {{candidate function not viable: no known conversion from 'void () __attribute__((fastcall))' to 'fptr_cdecl' (aka 'void (*)()') for 1st argument}}
21*f4a2713aSLionel Sambuc // expected-note@+2 {{candidate function not viable: no known conversion from 'void (*)() __attribute__((stdcall))' to 'fptr_cdecl' (aka 'void (*)()') for 1st argument}}
22*f4a2713aSLionel Sambuc // expected-note@+1 {{candidate function not viable: no known conversion from 'void (*)() __attribute__((fastcall))' to 'fptr_cdecl' (aka 'void (*)()') for 1st argument}}
23*f4a2713aSLionel Sambuc void cb_fptr_cdecl(fptr_cdecl ptr);
24*f4a2713aSLionel Sambuc // expected-note@+3 {{candidate function not viable: no known conversion from 'void ()' to 'fptr_stdcall' (aka 'void (*)() __attribute__((stdcall))') for 1st argument}}
25*f4a2713aSLionel Sambuc // expected-note@+2 {{candidate function not viable: no known conversion from 'void () __attribute__((cdecl))' to 'fptr_stdcall' (aka 'void (*)() __attribute__((stdcall))') for 1st argument}}
26*f4a2713aSLionel Sambuc // expected-note@+1 {{candidate function not viable: no known conversion from 'void () __attribute__((fastcall))' to 'fptr_stdcall' (aka 'void (*)() __attribute__((stdcall))') for 1st argument}}
27*f4a2713aSLionel Sambuc void cb_fptr_stdcall(fptr_stdcall ptr);
28*f4a2713aSLionel Sambuc // expected-note@+3 {{candidate function not viable: no known conversion from 'void ()' to 'fptr_fastcall' (aka 'void (*)() __attribute__((fastcall))') for 1st argument}}
29*f4a2713aSLionel Sambuc // expected-note@+2 {{candidate function not viable: no known conversion from 'void () __attribute__((cdecl))' to 'fptr_fastcall' (aka 'void (*)() __attribute__((fastcall))') for 1st argument}}
30*f4a2713aSLionel Sambuc // expected-note@+1 {{candidate function not viable: no known conversion from 'void () __attribute__((stdcall))' to 'fptr_fastcall' (aka 'void (*)() __attribute__((fastcall))') for 1st argument}}
31*f4a2713aSLionel Sambuc void cb_fptr_fastcall(fptr_fastcall ptr);
32*f4a2713aSLionel Sambuc // expected-note@+2 {{candidate function not viable: no known conversion from 'void () __attribute__((stdcall))' to 'const fptr_default' (aka 'void (*const)()') for 1st argument}}
33*f4a2713aSLionel Sambuc // expected-note@+1 {{candidate function not viable: no known conversion from 'void () __attribute__((fastcall))' to 'const fptr_default' (aka 'void (*const)()') for 1st argument}}
34*f4a2713aSLionel Sambuc void cb_fptr_const_default(const fptr_default ptr);
35*f4a2713aSLionel Sambuc 
36*f4a2713aSLionel Sambuc void call_free_func() {
37*f4a2713aSLionel Sambuc   cb_fptr_default(free_func_default);
38*f4a2713aSLionel Sambuc   cb_fptr_default(free_func_cdecl);
39*f4a2713aSLionel Sambuc   cb_fptr_default(free_func_stdcall); // expected-error {{no matching function for call to 'cb_fptr_default'}}
40*f4a2713aSLionel Sambuc   cb_fptr_default(free_func_fastcall); // expected-error {{no matching function for call to 'cb_fptr_default'}}
41*f4a2713aSLionel Sambuc   cb_fptr_default(&free_func_default);
42*f4a2713aSLionel Sambuc   cb_fptr_default(&free_func_cdecl);
43*f4a2713aSLionel Sambuc   cb_fptr_default(&free_func_stdcall); // expected-error {{no matching function for call to 'cb_fptr_default'}}
44*f4a2713aSLionel Sambuc   cb_fptr_default(&free_func_fastcall); // expected-error {{no matching function for call to 'cb_fptr_default'}}
45*f4a2713aSLionel Sambuc 
46*f4a2713aSLionel Sambuc   cb_fptr_cdecl(free_func_default);
47*f4a2713aSLionel Sambuc   cb_fptr_cdecl(free_func_cdecl);
48*f4a2713aSLionel Sambuc   cb_fptr_cdecl(free_func_stdcall); // expected-error {{no matching function for call to 'cb_fptr_cdecl'}}
49*f4a2713aSLionel Sambuc   cb_fptr_cdecl(free_func_fastcall); // expected-error {{no matching function for call to 'cb_fptr_cdecl'}}
50*f4a2713aSLionel Sambuc   cb_fptr_cdecl(&free_func_default);
51*f4a2713aSLionel Sambuc   cb_fptr_cdecl(&free_func_cdecl);
52*f4a2713aSLionel Sambuc   cb_fptr_cdecl(&free_func_stdcall); // expected-error {{no matching function for call to 'cb_fptr_cdecl'}}
53*f4a2713aSLionel Sambuc   cb_fptr_cdecl(&free_func_fastcall); // expected-error {{no matching function for call to 'cb_fptr_cdecl'}}
54*f4a2713aSLionel Sambuc 
55*f4a2713aSLionel Sambuc   cb_fptr_stdcall(free_func_default); // expected-error {{no matching function for call to 'cb_fptr_stdcall'}}
56*f4a2713aSLionel Sambuc   cb_fptr_stdcall(free_func_cdecl); // expected-error {{no matching function for call to 'cb_fptr_stdcall'}}
57*f4a2713aSLionel Sambuc   cb_fptr_stdcall(free_func_stdcall);
58*f4a2713aSLionel Sambuc   cb_fptr_stdcall(free_func_fastcall); // expected-error {{no matching function for call to 'cb_fptr_stdcall'}}
59*f4a2713aSLionel Sambuc 
60*f4a2713aSLionel Sambuc   cb_fptr_fastcall(free_func_default); // expected-error {{no matching function for call to 'cb_fptr_fastcall'}}
61*f4a2713aSLionel Sambuc   cb_fptr_fastcall(free_func_cdecl); // expected-error {{no matching function for call to 'cb_fptr_fastcall'}}
62*f4a2713aSLionel Sambuc   cb_fptr_fastcall(free_func_stdcall); // expected-error {{no matching function for call to 'cb_fptr_fastcall'}}
63*f4a2713aSLionel Sambuc   cb_fptr_fastcall(free_func_fastcall);
64*f4a2713aSLionel Sambuc 
65*f4a2713aSLionel Sambuc   cb_fptr_const_default(free_func_default);
66*f4a2713aSLionel Sambuc   cb_fptr_const_default(free_func_cdecl);
67*f4a2713aSLionel Sambuc   cb_fptr_const_default(free_func_stdcall); // expected-error {{no matching function for call to 'cb_fptr_const_default'}}
68*f4a2713aSLionel Sambuc   cb_fptr_const_default(free_func_fastcall); // expected-error {{no matching function for call to 'cb_fptr_const_default'}}
69*f4a2713aSLionel Sambuc 
70*f4a2713aSLionel Sambuc }
71*f4a2713aSLionel Sambuc 
72*f4a2713aSLionel Sambuc // Pointers to variadic functions
73*f4a2713aSLionel Sambuc // variadic function can't declared stdcall or fastcall
74*f4a2713aSLionel Sambuc void         free_func_variadic_default(int, ...);
75*f4a2713aSLionel Sambuc void __cdecl free_func_variadic_cdecl(int, ...);
76*f4a2713aSLionel Sambuc 
77*f4a2713aSLionel Sambuc typedef void (        *fptr_variadic_default)(int, ...);
78*f4a2713aSLionel Sambuc typedef void (__cdecl *fptr_variadic_cdecl)(int, ...);
79*f4a2713aSLionel Sambuc 
80*f4a2713aSLionel Sambuc void cb_fptr_variadic_default(fptr_variadic_default ptr);
81*f4a2713aSLionel Sambuc void cb_fptr_variadic_cdecl(fptr_variadic_cdecl ptr);
82*f4a2713aSLionel Sambuc 
83*f4a2713aSLionel Sambuc void call_free_variadic_func() {
84*f4a2713aSLionel Sambuc   cb_fptr_variadic_default(free_func_variadic_default);
85*f4a2713aSLionel Sambuc   cb_fptr_variadic_default(free_func_variadic_cdecl);
86*f4a2713aSLionel Sambuc   cb_fptr_variadic_default(&free_func_variadic_default);
87*f4a2713aSLionel Sambuc   cb_fptr_variadic_default(&free_func_variadic_cdecl);
88*f4a2713aSLionel Sambuc 
89*f4a2713aSLionel Sambuc   cb_fptr_variadic_cdecl(free_func_variadic_default);
90*f4a2713aSLionel Sambuc   cb_fptr_variadic_cdecl(free_func_variadic_cdecl);
91*f4a2713aSLionel Sambuc   cb_fptr_variadic_cdecl(&free_func_variadic_default);
92*f4a2713aSLionel Sambuc   cb_fptr_variadic_cdecl(&free_func_variadic_cdecl);
93*f4a2713aSLionel Sambuc }
94*f4a2713aSLionel Sambuc 
95*f4a2713aSLionel Sambuc // References to functions
96*f4a2713aSLionel Sambuc typedef void (           &fref_default)();
97*f4a2713aSLionel Sambuc typedef void (__cdecl    &fref_cdecl)();
98*f4a2713aSLionel Sambuc typedef void (__stdcall  &fref_stdcall)();
99*f4a2713aSLionel Sambuc typedef void (__fastcall &fref_fastcall)();
100*f4a2713aSLionel Sambuc 
101*f4a2713aSLionel Sambuc // expected-note@+2 {{candidate function not viable: no known conversion from 'void () __attribute__((stdcall))' to 'fref_default' (aka 'void (&)()') for 1st argument}}
102*f4a2713aSLionel Sambuc // expected-note@+1 {{candidate function not viable: no known conversion from 'void () __attribute__((fastcall))' to 'fref_default' (aka 'void (&)()') for 1st argument}}
103*f4a2713aSLionel Sambuc void cb_fref_default(fref_default ptr);
104*f4a2713aSLionel Sambuc // expected-note@+2 {{candidate function not viable: no known conversion from 'void () __attribute__((stdcall))' to 'fref_cdecl' (aka 'void (&)()') for 1st argument}}
105*f4a2713aSLionel Sambuc // expected-note@+1 {{candidate function not viable: no known conversion from 'void () __attribute__((fastcall))' to 'fref_cdecl' (aka 'void (&)()') for 1st argument}}
106*f4a2713aSLionel Sambuc void cb_fref_cdecl(fref_cdecl ptr);
107*f4a2713aSLionel Sambuc // expected-note@+3 {{candidate function not viable: no known conversion from 'void ()' to 'fref_stdcall' (aka 'void (&)() __attribute__((stdcall))') for 1st argument}}
108*f4a2713aSLionel Sambuc // expected-note@+2 {{candidate function not viable: no known conversion from 'void () __attribute__((cdecl))' to 'fref_stdcall' (aka 'void (&)() __attribute__((stdcall))') for 1st argument}}
109*f4a2713aSLionel Sambuc // expected-note@+1 {{candidate function not viable: no known conversion from 'void () __attribute__((fastcall))' to 'fref_stdcall' (aka 'void (&)() __attribute__((stdcall))') for 1st argument}}
110*f4a2713aSLionel Sambuc void cb_fref_stdcall(fref_stdcall ptr);
111*f4a2713aSLionel Sambuc // expected-note@+3 {{candidate function not viable: no known conversion from 'void ()' to 'fref_fastcall' (aka 'void (&)() __attribute__((fastcall))') for 1st argument}}
112*f4a2713aSLionel Sambuc // expected-note@+2 {{candidate function not viable: no known conversion from 'void () __attribute__((cdecl))' to 'fref_fastcall' (aka 'void (&)() __attribute__((fastcall))') for 1st argument}}
113*f4a2713aSLionel Sambuc // expected-note@+1 {{candidate function not viable: no known conversion from 'void () __attribute__((stdcall))' to 'fref_fastcall' (aka 'void (&)() __attribute__((fastcall))') for 1st argument}}
114*f4a2713aSLionel Sambuc void cb_fref_fastcall(fref_fastcall ptr);
115*f4a2713aSLionel Sambuc 
116*f4a2713aSLionel Sambuc void call_free_func_ref() {
117*f4a2713aSLionel Sambuc   cb_fref_default(free_func_default);
118*f4a2713aSLionel Sambuc   cb_fref_default(free_func_cdecl);
119*f4a2713aSLionel Sambuc   cb_fref_default(free_func_stdcall); // expected-error {{no matching function for call to 'cb_fref_default'}}
120*f4a2713aSLionel Sambuc   cb_fref_default(free_func_fastcall); // expected-error {{no matching function for call to 'cb_fref_default'}}
121*f4a2713aSLionel Sambuc 
122*f4a2713aSLionel Sambuc   cb_fref_cdecl(free_func_default);
123*f4a2713aSLionel Sambuc   cb_fref_cdecl(free_func_cdecl);
124*f4a2713aSLionel Sambuc   cb_fref_cdecl(free_func_stdcall); // expected-error {{no matching function for call to 'cb_fref_cdecl'}}
125*f4a2713aSLionel Sambuc   cb_fref_cdecl(free_func_fastcall); // expected-error {{no matching function for call to 'cb_fref_cdecl'}}
126*f4a2713aSLionel Sambuc 
127*f4a2713aSLionel Sambuc   cb_fref_stdcall(free_func_default); // expected-error {{no matching function for call to 'cb_fref_stdcall'}}
128*f4a2713aSLionel Sambuc   cb_fref_stdcall(free_func_cdecl); // expected-error {{no matching function for call to 'cb_fref_stdcall'}}
129*f4a2713aSLionel Sambuc   cb_fref_stdcall(free_func_stdcall);
130*f4a2713aSLionel Sambuc   cb_fref_stdcall(free_func_fastcall); // expected-error {{no matching function for call to 'cb_fref_stdcall'}}
131*f4a2713aSLionel Sambuc 
132*f4a2713aSLionel Sambuc   cb_fref_fastcall(free_func_default); // expected-error {{no matching function for call to 'cb_fref_fastcall'}}
133*f4a2713aSLionel Sambuc   cb_fref_fastcall(free_func_cdecl); // expected-error {{no matching function for call to 'cb_fref_fastcall'}}
134*f4a2713aSLionel Sambuc   cb_fref_fastcall(free_func_stdcall); // expected-error {{no matching function for call to 'cb_fref_fastcall'}}
135*f4a2713aSLionel Sambuc   cb_fref_fastcall(free_func_fastcall);
136*f4a2713aSLionel Sambuc }
137*f4a2713aSLionel Sambuc 
138*f4a2713aSLionel Sambuc // References to variadic functions
139*f4a2713aSLionel Sambuc // variadic function can't declared stdcall or fastcall
140*f4a2713aSLionel Sambuc typedef void (        &fref_variadic_default)(int, ...);
141*f4a2713aSLionel Sambuc typedef void (__cdecl &fref_variadic_cdecl)(int, ...);
142*f4a2713aSLionel Sambuc 
143*f4a2713aSLionel Sambuc void cb_fref_variadic_default(fptr_variadic_default ptr);
144*f4a2713aSLionel Sambuc void cb_fref_variadic_cdecl(fptr_variadic_cdecl ptr);
145*f4a2713aSLionel Sambuc 
146*f4a2713aSLionel Sambuc void call_free_variadic_func_ref() {
147*f4a2713aSLionel Sambuc   cb_fref_variadic_default(free_func_variadic_default);
148*f4a2713aSLionel Sambuc   cb_fref_variadic_default(free_func_variadic_cdecl);
149*f4a2713aSLionel Sambuc 
150*f4a2713aSLionel Sambuc   cb_fref_variadic_cdecl(free_func_variadic_default);
151*f4a2713aSLionel Sambuc   cb_fref_variadic_cdecl(free_func_variadic_cdecl);
152*f4a2713aSLionel Sambuc }
153*f4a2713aSLionel Sambuc 
154*f4a2713aSLionel Sambuc // Pointers to members
155*f4a2713aSLionel Sambuc namespace NonVariadic {
156*f4a2713aSLionel Sambuc 
157*f4a2713aSLionel Sambuc struct A {
158*f4a2713aSLionel Sambuc   void            member_default();
159*f4a2713aSLionel Sambuc   void __cdecl    member_cdecl();
160*f4a2713aSLionel Sambuc   void __thiscall member_thiscall();
161*f4a2713aSLionel Sambuc };
162*f4a2713aSLionel Sambuc 
163*f4a2713aSLionel Sambuc struct B : public A {
164*f4a2713aSLionel Sambuc };
165*f4a2713aSLionel Sambuc 
166*f4a2713aSLionel Sambuc struct C {
167*f4a2713aSLionel Sambuc   void            member_default();
168*f4a2713aSLionel Sambuc   void __cdecl    member_cdecl();
169*f4a2713aSLionel Sambuc   void __thiscall member_thiscall();
170*f4a2713aSLionel Sambuc };
171*f4a2713aSLionel Sambuc 
172*f4a2713aSLionel Sambuc typedef void (           A::*memb_a_default)();
173*f4a2713aSLionel Sambuc typedef void (__cdecl    A::*memb_a_cdecl)();
174*f4a2713aSLionel Sambuc typedef void (__thiscall A::*memb_a_thiscall)();
175*f4a2713aSLionel Sambuc typedef void (           B::*memb_b_default)();
176*f4a2713aSLionel Sambuc typedef void (__cdecl    B::*memb_b_cdecl)();
177*f4a2713aSLionel Sambuc typedef void (__thiscall B::*memb_b_thiscall)();
178*f4a2713aSLionel Sambuc typedef void (           C::*memb_c_default)();
179*f4a2713aSLionel Sambuc typedef void (__cdecl    C::*memb_c_cdecl)();
180*f4a2713aSLionel Sambuc typedef void (__thiscall C::*memb_c_thiscall)();
181*f4a2713aSLionel Sambuc 
182*f4a2713aSLionel Sambuc // expected-note@+1 {{candidate function not viable: no known conversion from 'void (NonVariadic::A::*)() __attribute__((cdecl))' to 'memb_a_default' (aka 'void (NonVariadic::A::*)() __attribute__((thiscall))') for 1st argument}}
183*f4a2713aSLionel Sambuc void cb_memb_a_default(memb_a_default ptr);
184*f4a2713aSLionel Sambuc // expected-note@+2 {{candidate function not viable: no known conversion from 'void (NonVariadic::A::*)() __attribute__((thiscall))' to 'memb_a_cdecl' (aka 'void (NonVariadic::A::*)() __attribute__((cdecl))') for 1st argument}}
185*f4a2713aSLionel Sambuc // expected-note@+1 {{candidate function not viable: no known conversion from 'void (NonVariadic::A::*)() __attribute__((thiscall))' to 'memb_a_cdecl' (aka 'void (NonVariadic::A::*)() __attribute__((cdecl))') for 1st argument}}
186*f4a2713aSLionel Sambuc void cb_memb_a_cdecl(memb_a_cdecl ptr);
187*f4a2713aSLionel Sambuc // expected-note@+1 {{candidate function not viable: no known conversion from 'void (NonVariadic::A::*)() __attribute__((cdecl))' to 'memb_a_thiscall' (aka 'void (NonVariadic::A::*)() __attribute__((thiscall))') for 1st argument}}
188*f4a2713aSLionel Sambuc void cb_memb_a_thiscall(memb_a_thiscall ptr);
189*f4a2713aSLionel Sambuc // expected-note@+1 {{candidate function not viable: no known conversion from 'void (NonVariadic::A::*)() __attribute__((cdecl))' to 'memb_b_default' (aka 'void (NonVariadic::B::*)() __attribute__((thiscall))') for 1st argument}}
190*f4a2713aSLionel Sambuc void cb_memb_b_default(memb_b_default ptr);
191*f4a2713aSLionel Sambuc // expected-note@+2 {{candidate function not viable: no known conversion from 'void (NonVariadic::A::*)() __attribute__((thiscall))' to 'memb_b_cdecl' (aka 'void (NonVariadic::B::*)() __attribute__((cdecl))') for 1st argument}}
192*f4a2713aSLionel Sambuc // expected-note@+1 {{candidate function not viable: no known conversion from 'void (NonVariadic::A::*)() __attribute__((thiscall))' to 'memb_b_cdecl' (aka 'void (NonVariadic::B::*)() __attribute__((cdecl))') for 1st argument}}
193*f4a2713aSLionel Sambuc void cb_memb_b_cdecl(memb_b_cdecl ptr);
194*f4a2713aSLionel Sambuc // expected-note@+1 {{candidate function not viable: no known conversion from 'void (NonVariadic::A::*)() __attribute__((cdecl))' to 'memb_b_thiscall' (aka 'void (NonVariadic::B::*)() __attribute__((thiscall))') for 1st argument}}
195*f4a2713aSLionel Sambuc void cb_memb_b_thiscall(memb_b_thiscall ptr);
196*f4a2713aSLionel Sambuc // expected-note@+3 {{candidate function not viable: no known conversion from 'void (NonVariadic::A::*)() __attribute__((thiscall))' to 'memb_c_default' (aka 'void (NonVariadic::C::*)() __attribute__((thiscall))') for 1st argument}}
197*f4a2713aSLionel Sambuc // expected-note@+2 {{candidate function not viable: no known conversion from 'void (NonVariadic::A::*)() __attribute__((cdecl))' to 'memb_c_default' (aka 'void (NonVariadic::C::*)() __attribute__((thiscall))') for 1st argument}}
198*f4a2713aSLionel Sambuc // expected-note@+1 {{candidate function not viable: no known conversion from 'void (NonVariadic::A::*)() __attribute__((thiscall))' to 'memb_c_default' (aka 'void (NonVariadic::C::*)() __attribute__((thiscall))') for 1st argument}}
199*f4a2713aSLionel Sambuc void cb_memb_c_default(memb_c_default ptr);
200*f4a2713aSLionel Sambuc // expected-note@+3 {{candidate function not viable: no known conversion from 'void (NonVariadic::A::*)() __attribute__((thiscall))' to 'memb_c_cdecl' (aka 'void (NonVariadic::C::*)() __attribute__((cdecl))') for 1st argument}}
201*f4a2713aSLionel Sambuc // expected-note@+2 {{candidate function not viable: no known conversion from 'void (NonVariadic::A::*)() __attribute__((cdecl))' to 'memb_c_cdecl' (aka 'void (NonVariadic::C::*)() __attribute__((cdecl))') for 1st argument}}
202*f4a2713aSLionel Sambuc // expected-note@+1 {{candidate function not viable: no known conversion from 'void (NonVariadic::A::*)() __attribute__((thiscall))' to 'memb_c_cdecl' (aka 'void (NonVariadic::C::*)() __attribute__((cdecl))') for 1st argument}}
203*f4a2713aSLionel Sambuc void cb_memb_c_cdecl(memb_c_cdecl ptr);
204*f4a2713aSLionel Sambuc // expected-note@+3 {{candidate function not viable: no known conversion from 'void (NonVariadic::A::*)() __attribute__((thiscall))' to 'memb_c_thiscall' (aka 'void (NonVariadic::C::*)() __attribute__((thiscall))') for 1st argument}}
205*f4a2713aSLionel Sambuc // expected-note@+2 {{candidate function not viable: no known conversion from 'void (NonVariadic::A::*)() __attribute__((cdecl))' to 'memb_c_thiscall' (aka 'void (NonVariadic::C::*)() __attribute__((thiscall))') for 1st argument}}
206*f4a2713aSLionel Sambuc // expected-note@+1 {{candidate function not viable: no known conversion from 'void (NonVariadic::A::*)() __attribute__((thiscall))' to 'memb_c_thiscall' (aka 'void (NonVariadic::C::*)() __attribute__((thiscall))') for 1st argument}}
207*f4a2713aSLionel Sambuc void cb_memb_c_thiscall(memb_c_thiscall ptr);
208*f4a2713aSLionel Sambuc 
209*f4a2713aSLionel Sambuc void call_member() {
210*f4a2713aSLionel Sambuc   cb_memb_a_default(&A::member_default);
211*f4a2713aSLionel Sambuc   cb_memb_a_default(&A::member_cdecl); // expected-error {{no matching function for call to 'cb_memb_a_default'}}
212*f4a2713aSLionel Sambuc   cb_memb_a_default(&A::member_thiscall);
213*f4a2713aSLionel Sambuc 
214*f4a2713aSLionel Sambuc   cb_memb_a_cdecl(&A::member_default); // expected-error {{no matching function for call to 'cb_memb_a_cdecl'}}
215*f4a2713aSLionel Sambuc   cb_memb_a_cdecl(&A::member_cdecl);
216*f4a2713aSLionel Sambuc   cb_memb_a_cdecl(&A::member_thiscall); // expected-error {{no matching function for call to 'cb_memb_a_cdecl'}}
217*f4a2713aSLionel Sambuc 
218*f4a2713aSLionel Sambuc   cb_memb_a_thiscall(&A::member_default);
219*f4a2713aSLionel Sambuc   cb_memb_a_thiscall(&A::member_cdecl); // expected-error {{no matching function for call to 'cb_memb_a_thiscall'}}
220*f4a2713aSLionel Sambuc   cb_memb_a_thiscall(&A::member_thiscall);
221*f4a2713aSLionel Sambuc }
222*f4a2713aSLionel Sambuc 
223*f4a2713aSLionel Sambuc void call_member_inheritance() {
224*f4a2713aSLionel Sambuc   cb_memb_b_default(&A::member_default);
225*f4a2713aSLionel Sambuc   cb_memb_b_default(&A::member_cdecl); // expected-error {{no matching function for call to 'cb_memb_b_default'}}
226*f4a2713aSLionel Sambuc   cb_memb_b_default(&A::member_thiscall);
227*f4a2713aSLionel Sambuc   cb_memb_c_default(&A::member_default); // expected-error {{no matching function for call to 'cb_memb_c_default'}}
228*f4a2713aSLionel Sambuc   cb_memb_c_default(&A::member_cdecl); // expected-error {{no matching function for call to 'cb_memb_c_default'}}
229*f4a2713aSLionel Sambuc   cb_memb_c_default(&A::member_thiscall); // expected-error {{no matching function for call to 'cb_memb_c_default'}}
230*f4a2713aSLionel Sambuc 
231*f4a2713aSLionel Sambuc   cb_memb_b_cdecl(&A::member_default); // expected-error {{no matching function for call to 'cb_memb_b_cdecl'}}
232*f4a2713aSLionel Sambuc   cb_memb_b_cdecl(&A::member_cdecl);
233*f4a2713aSLionel Sambuc   cb_memb_b_cdecl(&A::member_thiscall); // expected-error {{no matching function for call to 'cb_memb_b_cdecl'}}
234*f4a2713aSLionel Sambuc   cb_memb_c_cdecl(&A::member_default); // expected-error {{no matching function for call to 'cb_memb_c_cdecl'}}
235*f4a2713aSLionel Sambuc   cb_memb_c_cdecl(&A::member_cdecl); // expected-error {{no matching function for call to 'cb_memb_c_cdecl'}}
236*f4a2713aSLionel Sambuc   cb_memb_c_cdecl(&A::member_thiscall); // expected-error {{no matching function for call to 'cb_memb_c_cdecl'}}
237*f4a2713aSLionel Sambuc 
238*f4a2713aSLionel Sambuc   cb_memb_b_thiscall(&A::member_default);
239*f4a2713aSLionel Sambuc   cb_memb_b_thiscall(&A::member_cdecl); // expected-error {{no matching function for call to 'cb_memb_b_thiscall'}}
240*f4a2713aSLionel Sambuc   cb_memb_b_thiscall(&A::member_thiscall);
241*f4a2713aSLionel Sambuc   cb_memb_c_thiscall(&A::member_default); // expected-error {{no matching function for call to 'cb_memb_c_thiscall'}}
242*f4a2713aSLionel Sambuc   cb_memb_c_thiscall(&A::member_cdecl); // expected-error {{no matching function for call to 'cb_memb_c_thiscall'}}
243*f4a2713aSLionel Sambuc   cb_memb_c_thiscall(&A::member_thiscall); // expected-error {{no matching function for call to 'cb_memb_c_thiscall'}}
244*f4a2713aSLionel Sambuc }
245*f4a2713aSLionel Sambuc } // end namespace NonVariadic
246*f4a2713aSLionel Sambuc 
247*f4a2713aSLionel Sambuc namespace Variadic {
248*f4a2713aSLionel Sambuc struct A {
249*f4a2713aSLionel Sambuc   void            member_default(int, ...);
250*f4a2713aSLionel Sambuc   void __cdecl    member_cdecl(int, ...);
251*f4a2713aSLionel Sambuc   void __thiscall member_thiscall(int, ...); // expected-error {{variadic function cannot use thiscall calling convention}}
252*f4a2713aSLionel Sambuc };
253*f4a2713aSLionel Sambuc 
254*f4a2713aSLionel Sambuc struct B : public A {
255*f4a2713aSLionel Sambuc };
256*f4a2713aSLionel Sambuc 
257*f4a2713aSLionel Sambuc struct C {
258*f4a2713aSLionel Sambuc   void            member_default(int, ...);
259*f4a2713aSLionel Sambuc   void __cdecl    member_cdecl(int, ...);
260*f4a2713aSLionel Sambuc };
261*f4a2713aSLionel Sambuc 
262*f4a2713aSLionel Sambuc typedef void (           A::*memb_a_default)(int, ...);
263*f4a2713aSLionel Sambuc typedef void (__cdecl    A::*memb_a_cdecl)(int, ...);
264*f4a2713aSLionel Sambuc typedef void (           B::*memb_b_default)(int, ...);
265*f4a2713aSLionel Sambuc typedef void (__cdecl    B::*memb_b_cdecl)(int, ...);
266*f4a2713aSLionel Sambuc typedef void (           C::*memb_c_default)(int, ...);
267*f4a2713aSLionel Sambuc typedef void (__cdecl    C::*memb_c_cdecl)(int, ...);
268*f4a2713aSLionel Sambuc 
269*f4a2713aSLionel Sambuc void cb_memb_a_default(memb_a_default ptr);
270*f4a2713aSLionel Sambuc void cb_memb_a_cdecl(memb_a_cdecl ptr);
271*f4a2713aSLionel Sambuc void cb_memb_b_default(memb_b_default ptr);
272*f4a2713aSLionel Sambuc void cb_memb_b_cdecl(memb_b_cdecl ptr);
273*f4a2713aSLionel Sambuc // expected-note@+2 {{candidate function not viable: no known conversion from 'void (Variadic::A::*)(int, ...)' to 'memb_c_default' (aka 'void (Variadic::C::*)(int, ...)') for 1st argument}}
274*f4a2713aSLionel Sambuc // expected-note@+1 {{candidate function not viable: no known conversion from 'void (Variadic::A::*)(int, ...) __attribute__((cdecl))' to 'memb_c_default' (aka 'void (Variadic::C::*)(int, ...)') for 1st argument}}
275*f4a2713aSLionel Sambuc void cb_memb_c_default(memb_c_default ptr);
276*f4a2713aSLionel Sambuc // expected-note@+2 {{candidate function not viable: no known conversion from 'void (Variadic::A::*)(int, ...)' to 'memb_c_cdecl' (aka 'void (Variadic::C::*)(int, ...) __attribute__((cdecl))') for 1st argument}}
277*f4a2713aSLionel Sambuc // expected-note@+1 {{candidate function not viable: no known conversion from 'void (Variadic::A::*)(int, ...) __attribute__((cdecl))' to 'memb_c_cdecl' (aka 'void (Variadic::C::*)(int, ...) __attribute__((cdecl))') for 1st argument}}
278*f4a2713aSLionel Sambuc void cb_memb_c_cdecl(memb_c_cdecl ptr);
279*f4a2713aSLionel Sambuc 
280*f4a2713aSLionel Sambuc void call_member() {
281*f4a2713aSLionel Sambuc   cb_memb_a_default(&A::member_default);
282*f4a2713aSLionel Sambuc   cb_memb_a_default(&A::member_cdecl);
283*f4a2713aSLionel Sambuc 
284*f4a2713aSLionel Sambuc   cb_memb_a_cdecl(&A::member_default);
285*f4a2713aSLionel Sambuc   cb_memb_a_cdecl(&A::member_cdecl);
286*f4a2713aSLionel Sambuc }
287*f4a2713aSLionel Sambuc 
288*f4a2713aSLionel Sambuc void call_member_inheritance() {
289*f4a2713aSLionel Sambuc   cb_memb_b_default(&A::member_default);
290*f4a2713aSLionel Sambuc   cb_memb_b_default(&A::member_cdecl);
291*f4a2713aSLionel Sambuc   cb_memb_c_default(&A::member_default); // expected-error {{no matching function for call to 'cb_memb_c_default'}}
292*f4a2713aSLionel Sambuc   cb_memb_c_default(&A::member_cdecl); // expected-error {{no matching function for call to 'cb_memb_c_default'}}
293*f4a2713aSLionel Sambuc 
294*f4a2713aSLionel Sambuc   cb_memb_b_cdecl(&A::member_default);
295*f4a2713aSLionel Sambuc   cb_memb_b_cdecl(&A::member_cdecl);
296*f4a2713aSLionel Sambuc   cb_memb_c_cdecl(&A::member_default); // expected-error {{no matching function for call to 'cb_memb_c_cdecl'}}
297*f4a2713aSLionel Sambuc   cb_memb_c_cdecl(&A::member_cdecl); // expected-error {{no matching function for call to 'cb_memb_c_cdecl'}}
298*f4a2713aSLionel Sambuc }
299*f4a2713aSLionel Sambuc } // end namespace Variadic
300*f4a2713aSLionel Sambuc 
301*f4a2713aSLionel Sambuc namespace MultiChunkDecls {
302*f4a2713aSLionel Sambuc 
303*f4a2713aSLionel Sambuc // Try to test declarators that have multiple DeclaratorChunks.
304*f4a2713aSLionel Sambuc struct A {
305*f4a2713aSLionel Sambuc   void __thiscall member_thiscall(int);
306*f4a2713aSLionel Sambuc };
307*f4a2713aSLionel Sambuc 
308*f4a2713aSLionel Sambuc void (A::*return_mptr(short))(int) {
309*f4a2713aSLionel Sambuc   return &A::member_thiscall;
310*f4a2713aSLionel Sambuc }
311*f4a2713aSLionel Sambuc 
312*f4a2713aSLionel Sambuc void (A::*(*return_fptr_mptr(char))(short))(int) {
313*f4a2713aSLionel Sambuc   return return_mptr;
314*f4a2713aSLionel Sambuc }
315*f4a2713aSLionel Sambuc 
316*f4a2713aSLionel Sambuc typedef void (A::*mptr_t)(int);
317*f4a2713aSLionel Sambuc mptr_t __stdcall return_mptr_std(short) {
318*f4a2713aSLionel Sambuc   return &A::member_thiscall;
319*f4a2713aSLionel Sambuc }
320*f4a2713aSLionel Sambuc 
321*f4a2713aSLionel Sambuc void (A::*(*return_fptr_std_mptr(char))(short))(int) {
322*f4a2713aSLionel Sambuc   return return_mptr_std; // expected-error {{cannot initialize return object of type 'void (MultiChunkDecls::A::*(*)(short))(int) __attribute__((thiscall))' with an lvalue of type 'mptr_t (short) __attribute__((stdcall))'}}
323*f4a2713aSLionel Sambuc }
324*f4a2713aSLionel Sambuc 
325*f4a2713aSLionel Sambuc void call_return() {
326*f4a2713aSLionel Sambuc   A o;
327*f4a2713aSLionel Sambuc   void (A::*(*fptr)(short))(int) = return_fptr_mptr('a');
328*f4a2713aSLionel Sambuc   void (A::*mptr)(int) = fptr(1);
329*f4a2713aSLionel Sambuc   (o.*mptr)(2);
330*f4a2713aSLionel Sambuc }
331*f4a2713aSLionel Sambuc 
332*f4a2713aSLionel Sambuc } // end namespace MultiChunkDecls
333*f4a2713aSLionel Sambuc 
334*f4a2713aSLionel Sambuc namespace MemberPointers {
335*f4a2713aSLionel Sambuc 
336*f4a2713aSLionel Sambuc struct A {
337*f4a2713aSLionel Sambuc   void __thiscall method_thiscall();
338*f4a2713aSLionel Sambuc   void __cdecl    method_cdecl();
339*f4a2713aSLionel Sambuc   void __stdcall  method_stdcall();
340*f4a2713aSLionel Sambuc   void __fastcall method_fastcall();
341*f4a2713aSLionel Sambuc };
342*f4a2713aSLionel Sambuc 
343*f4a2713aSLionel Sambuc void (           A::*mp1)() = &A::method_thiscall;
344*f4a2713aSLionel Sambuc void (__cdecl    A::*mp2)() = &A::method_cdecl;
345*f4a2713aSLionel Sambuc void (__stdcall  A::*mp3)() = &A::method_stdcall;
346*f4a2713aSLionel Sambuc void (__fastcall A::*mp4)() = &A::method_fastcall;
347*f4a2713aSLionel Sambuc 
348*f4a2713aSLionel Sambuc // Use a typedef to form the member pointer and verify that cdecl is adjusted.
349*f4a2713aSLionel Sambuc typedef void (           fun_default)();
350*f4a2713aSLionel Sambuc typedef void (__cdecl    fun_cdecl)();
351*f4a2713aSLionel Sambuc typedef void (__stdcall  fun_stdcall)();
352*f4a2713aSLionel Sambuc typedef void (__fastcall fun_fastcall)();
353*f4a2713aSLionel Sambuc 
354*f4a2713aSLionel Sambuc // FIXME: Adjust cdecl to thiscall when forming a member pointer.
355*f4a2713aSLionel Sambuc //fun_default  A::*td1 = &A::method_thiscall;
356*f4a2713aSLionel Sambuc fun_cdecl    A::*td2 = &A::method_cdecl;
357*f4a2713aSLionel Sambuc fun_stdcall  A::*td3 = &A::method_stdcall;
358*f4a2713aSLionel Sambuc fun_fastcall A::*td4 = &A::method_fastcall;
359*f4a2713aSLionel Sambuc 
360*f4a2713aSLionel Sambuc // Round trip the function type through a template, and verify that only cdecl
361*f4a2713aSLionel Sambuc // gets adjusted.
362*f4a2713aSLionel Sambuc template<typename Fn> struct X {
363*f4a2713aSLionel Sambuc   typedef Fn A::*p;
364*f4a2713aSLionel Sambuc };
365*f4a2713aSLionel Sambuc 
366*f4a2713aSLionel Sambuc // FIXME: Adjust cdecl to thiscall when forming a member pointer.
367*f4a2713aSLionel Sambuc //X<void            ()>::p tmpl1 = &A::method_thiscall;
368*f4a2713aSLionel Sambuc //X<void __cdecl    ()>::p tmpl2 = &A::method_thiscall;
369*f4a2713aSLionel Sambuc X<void __stdcall  ()>::p tmpl3 = &A::method_stdcall;
370*f4a2713aSLionel Sambuc X<void __fastcall ()>::p tmpl4 = &A::method_fastcall;
371*f4a2713aSLionel Sambuc 
372*f4a2713aSLionel Sambuc } // end namespace MemberPointers
373*f4a2713aSLionel Sambuc 
374*f4a2713aSLionel Sambuc // Test that lambdas that capture nothing convert to cdecl function pointers.
375*f4a2713aSLionel Sambuc namespace Lambdas {
376*f4a2713aSLionel Sambuc 
377*f4a2713aSLionel Sambuc void pass_fptr_cdecl   (void (__cdecl    *fp)());
378*f4a2713aSLionel Sambuc void pass_fptr_stdcall (void (__stdcall  *fp)()); // expected-note {{candidate function not viable}}
379*f4a2713aSLionel Sambuc void pass_fptr_fastcall(void (__fastcall *fp)()); // expected-note {{candidate function not viable}}
380*f4a2713aSLionel Sambuc 
381*f4a2713aSLionel Sambuc void conversion_to_fptr() {
382*f4a2713aSLionel Sambuc   pass_fptr_cdecl   ([]() { } );
383*f4a2713aSLionel Sambuc   pass_fptr_stdcall ([]() { } ); // expected-error {{no matching function for call}}
384*f4a2713aSLionel Sambuc   pass_fptr_fastcall([]() { } ); // expected-error {{no matching function for call}}
385*f4a2713aSLionel Sambuc }
386*f4a2713aSLionel Sambuc 
387*f4a2713aSLionel Sambuc }
388