1*67e74705SXin Li // RUN: %clang_cc1 -fms-extensions -triple i686-pc-windows-msvc -Wcast-calling-convention -DMSVC -Wno-pointer-bool-conversion -verify -x c %s 2*67e74705SXin Li // RUN: %clang_cc1 -fms-extensions -triple i686-pc-windows-msvc -Wcast-calling-convention -DMSVC -Wno-pointer-bool-conversion -verify -x c++ %s 3*67e74705SXin Li // RUN: %clang_cc1 -fms-extensions -triple i686-pc-windows-msvc -Wcast-calling-convention -DMSVC -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s --check-prefix=MSFIXIT 4*67e74705SXin Li // RUN: %clang_cc1 -triple i686-pc-windows-gnu -Wcast-calling-convention -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s --check-prefix=GNUFIXIT 5*67e74705SXin Li 6*67e74705SXin Li // expected-note@+1 {{consider defining 'mismatched_before_winapi' with the 'stdcall' calling convention}} mismatched_before_winapi(int x)7*67e74705SXin Livoid mismatched_before_winapi(int x) {} 8*67e74705SXin Li 9*67e74705SXin Li #ifdef MSVC 10*67e74705SXin Li #define WINAPI __stdcall 11*67e74705SXin Li #else 12*67e74705SXin Li #define WINAPI __attribute__((stdcall)) 13*67e74705SXin Li #endif 14*67e74705SXin Li 15*67e74705SXin Li // expected-note@+1 3 {{consider defining 'mismatched' with the 'stdcall' calling convention}} mismatched(int x)16*67e74705SXin Livoid mismatched(int x) {} 17*67e74705SXin Li 18*67e74705SXin Li typedef void (WINAPI *callback_t)(int); 19*67e74705SXin Li void take_callback(callback_t callback); 20*67e74705SXin Li mismatched_stdcall(int x)21*67e74705SXin Livoid WINAPI mismatched_stdcall(int x) {} 22*67e74705SXin Li 23*67e74705SXin Li void take_opaque_fn(void (*callback)(int)); 24*67e74705SXin Li main()25*67e74705SXin Liint main() { 26*67e74705SXin Li // expected-warning@+1 {{cast between incompatible calling conventions 'cdecl' and 'stdcall'}} 27*67e74705SXin Li take_callback((callback_t)mismatched); 28*67e74705SXin Li 29*67e74705SXin Li // expected-warning@+1 {{cast between incompatible calling conventions 'cdecl' and 'stdcall'}} 30*67e74705SXin Li callback_t callback = (callback_t)mismatched; // warns 31*67e74705SXin Li (void)callback; 32*67e74705SXin Li 33*67e74705SXin Li // expected-warning@+1 {{cast between incompatible calling conventions 'cdecl' and 'stdcall'}} 34*67e74705SXin Li callback = (callback_t)&mismatched; // warns 35*67e74705SXin Li 36*67e74705SXin Li // No warning, just to show we don't drill through other kinds of unary operators. 37*67e74705SXin Li callback = (callback_t)!mismatched; 38*67e74705SXin Li 39*67e74705SXin Li // expected-warning@+1 {{cast between incompatible calling conventions 'cdecl' and 'stdcall'}} 40*67e74705SXin Li callback = (callback_t)&mismatched_before_winapi; // warns 41*67e74705SXin Li 42*67e74705SXin Li // Probably a bug, but we don't warn. 43*67e74705SXin Li void (*callback2)(int) = mismatched; 44*67e74705SXin Li take_callback((callback_t)callback2); 45*67e74705SXin Li 46*67e74705SXin Li // Another way to suppress the warning. 47*67e74705SXin Li take_callback((callback_t)(void*)mismatched); 48*67e74705SXin Li 49*67e74705SXin Li // Don't warn, because we're casting from stdcall to cdecl. Usually that means 50*67e74705SXin Li // the programmer is rinsing the function pointer through some kind of opaque 51*67e74705SXin Li // API. 52*67e74705SXin Li take_opaque_fn((void (*)(int))mismatched_stdcall); 53*67e74705SXin Li } 54*67e74705SXin Li 55*67e74705SXin Li // MSFIXIT: fix-it:"{{.*}}callingconv-cast.c":{16:6-16:6}:"WINAPI " 56*67e74705SXin Li // MSFIXIT: fix-it:"{{.*}}callingconv-cast.c":{16:6-16:6}:"WINAPI " 57*67e74705SXin Li // MSFIXIT: fix-it:"{{.*}}callingconv-cast.c":{16:6-16:6}:"WINAPI " 58*67e74705SXin Li // MSFIXIT: fix-it:"{{.*}}callingconv-cast.c":{7:6-7:6}:"__stdcall " 59*67e74705SXin Li 60*67e74705SXin Li // GNUFIXIT: fix-it:"{{.*}}callingconv-cast.c":{16:6-16:6}:"WINAPI " 61*67e74705SXin Li // GNUFIXIT: fix-it:"{{.*}}callingconv-cast.c":{16:6-16:6}:"WINAPI " 62*67e74705SXin Li // GNUFIXIT: fix-it:"{{.*}}callingconv-cast.c":{16:6-16:6}:"WINAPI " 63*67e74705SXin Li // GNUFIXIT: fix-it:"{{.*}}callingconv-cast.c":{7:6-7:6}:"__attribute__((stdcall)) " 64