Author: rnk Date: Wed May 11 12:43:13 2016 New Revision: 269214 URL: http://llvm.org/viewvc/llvm-project?rev=269214&view=rev Log: Relax -Wcalling-convention-cast when casting to the default convention (cdecl)
Modified: cfe/trunk/lib/Sema/SemaCast.cpp cfe/trunk/test/Sema/callingconv-cast.c Modified: cfe/trunk/lib/Sema/SemaCast.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCast.cpp?rev=269214&r1=269213&r2=269214&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaCast.cpp (original) +++ cfe/trunk/lib/Sema/SemaCast.cpp Wed May 11 12:43:13 2016 @@ -1760,7 +1760,15 @@ static void DiagnoseCallingConvCast(Sema if (!FD || !FD->hasBody(Definition)) return; - // The source expression is a pointer to a known function defined in this TU. + // Only warn if we are casting from the default convention to a non-default + // convention. This can happen when the programmer forgot to apply the calling + // convention to the function definition and then inserted this cast to + // satisfy the type system. + CallingConv DefaultCC = Self.getASTContext().getDefaultCallingConvention( + FD->isVariadic(), FD->isCXXInstanceMember()); + if (DstCC == DefaultCC || SrcCC != DefaultCC) + return; + // Diagnose this cast, as it is probably bad. StringRef SrcCCName = FunctionType::getNameForCallConv(SrcCC); StringRef DstCCName = FunctionType::getNameForCallConv(DstCC); Modified: cfe/trunk/test/Sema/callingconv-cast.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/callingconv-cast.c?rev=269214&r1=269213&r2=269214&view=diff ============================================================================== --- cfe/trunk/test/Sema/callingconv-cast.c (original) +++ cfe/trunk/test/Sema/callingconv-cast.c Wed May 11 12:43:13 2016 @@ -21,6 +21,10 @@ void mismatched(int x) {} typedef void (WINAPI *callback_t)(int); void take_callback(callback_t callback); +void WINAPI mismatched_stdcall(int x) {} + +void take_opaque_fn(void (*callback)(int)); + int main() { // expected-warning@+1 {{cast between incompatible calling conventions 'cdecl' and 'stdcall'}} take_callback((callback_t)mismatched); @@ -44,6 +48,11 @@ int main() { // Another way to suppress the warning. take_callback((callback_t)(void*)mismatched); + + // Don't warn, because we're casting from stdcall to cdecl. Usually that means + // the programmer is rinsing the function pointer through some kind of opaque + // API. + take_opaque_fn((void (*)(int))mismatched_stdcall); } // MSFIXIT: fix-it:"{{.*}}callingconv-cast.c":{19:6-19:6}:"WINAPI " _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits