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