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