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@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@+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 >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits