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

Reid Kleckner via cfe-commits cfe-commits at lists.llvm.org
Tue May 17 09:57:36 PDT 2016


Cool, r269780. Let's see if anyone finds any bugs or false positives.

On Mon, May 16, 2016 at 4:10 PM, Nico Weber <thakis at chromium.org> wrote:
> 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
>
>


More information about the cfe-commits mailing list