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

Nico Weber via cfe-commits cfe-commits at lists.llvm.org
Mon May 16 16:10:48 PDT 2016


After this tweak, Chromium builds cleanly with the new warning enabled.
Maybe it's time to turn it on by default.

On Wed, May 11, 2016 at 1:43 PM, Reid Kleckner via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> 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 "
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160516/2e46d2cd/attachment.html>


More information about the cfe-commits mailing list