r269214 - Relax -Wcalling-convention-cast when casting to the default convention (cdecl)

Reid Kleckner via cfe-commits cfe-commits at lists.llvm.org
Wed May 11 10:43:13 PDT 2016


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 at +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 "




More information about the cfe-commits mailing list