<div dir="ltr">After this tweak, Chromium builds cleanly with the new warning enabled. Maybe it's time to turn it on by default.</div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, May 11, 2016 at 1:43 PM, Reid Kleckner via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rnk<br>
Date: Wed May 11 12:43:13 2016<br>
New Revision: 269214<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=269214&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=269214&view=rev</a><br>
Log:<br>
Relax -Wcalling-convention-cast when casting to the default convention (cdecl)<br>
<br>
Modified:<br>
    cfe/trunk/lib/Sema/SemaCast.cpp<br>
    cfe/trunk/test/Sema/callingconv-cast.c<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaCast.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCast.cpp?rev=269214&r1=269213&r2=269214&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCast.cpp?rev=269214&r1=269213&r2=269214&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaCast.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaCast.cpp Wed May 11 12:43:13 2016<br>
@@ -1760,7 +1760,15 @@ static void DiagnoseCallingConvCast(Sema<br>
   if (!FD || !FD->hasBody(Definition))<br>
     return;<br>
<br>
-  // The source expression is a pointer to a known function defined in this TU.<br>
+  // Only warn if we are casting from the default convention to a non-default<br>
+  // convention. This can happen when the programmer forgot to apply the calling<br>
+  // convention to the function definition and then inserted this cast to<br>
+  // satisfy the type system.<br>
+  CallingConv DefaultCC = Self.getASTContext().getDefaultCallingConvention(<br>
+      FD->isVariadic(), FD->isCXXInstanceMember());<br>
+  if (DstCC == DefaultCC || SrcCC != DefaultCC)<br>
+    return;<br>
+<br>
   // Diagnose this cast, as it is probably bad.<br>
   StringRef SrcCCName = FunctionType::getNameForCallConv(SrcCC);<br>
   StringRef DstCCName = FunctionType::getNameForCallConv(DstCC);<br>
<br>
Modified: cfe/trunk/test/Sema/callingconv-cast.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/callingconv-cast.c?rev=269214&r1=269213&r2=269214&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/callingconv-cast.c?rev=269214&r1=269213&r2=269214&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Sema/callingconv-cast.c (original)<br>
+++ cfe/trunk/test/Sema/callingconv-cast.c Wed May 11 12:43:13 2016<br>
@@ -21,6 +21,10 @@ void mismatched(int x) {}<br>
 typedef void (WINAPI *callback_t)(int);<br>
 void take_callback(callback_t callback);<br>
<br>
+void WINAPI mismatched_stdcall(int x) {}<br>
+<br>
+void take_opaque_fn(void (*callback)(int));<br>
+<br>
 int main() {<br>
   // expected-warning@+1 {{cast between incompatible calling conventions 'cdecl' and 'stdcall'}}<br>
   take_callback((callback_t)mismatched);<br>
@@ -44,6 +48,11 @@ int main() {<br>
<br>
   // Another way to suppress the warning.<br>
   take_callback((callback_t)(void*)mismatched);<br>
+<br>
+  // Don't warn, because we're casting from stdcall to cdecl. Usually that means<br>
+  // the programmer is rinsing the function pointer through some kind of opaque<br>
+  // API.<br>
+  take_opaque_fn((void (*)(int))mismatched_stdcall);<br>
 }<br>
<br>
 // MSFIXIT: fix-it:"{{.*}}callingconv-cast.c":{19:6-19:6}:"WINAPI "<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>