Cool, r269780. Let's see if anyone finds any bugs or false positives.
On Mon, May 16, 2016 at 4:10 PM, Nico Weber <tha...@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@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