r238877 - [MSVC Compatibility] Permit static_cast from void-ptr to function-ptr
David Majnemer
david.majnemer at gmail.com
Mon Jun 8 17:53:35 PDT 2015
Thanks, I'll take a look tonight.
On Monday, June 8, 2015, Reid Kleckner <rnk at google.com> wrote:
> This warns on C-style casts, which it should not:
> $ ninja check
> [68/414] Building CXX object
> lib\ExecutionEngine\RuntimeDyld\CMakeFiles\LLVMRuntimeDyld.dir\RTDyldMemoryManager.cpp.obj
> ..\lib\ExecutionEngine\RuntimeDyld\RTDyldMemoryManager.cpp(61,6) :
> warning: static_cast between pointer-to-function and pointer-to-object is
> a Microsoft extension [-Wmicrosoft]
> ((void (*)(void *))rf)(p);
> ^~~~~~~~~~~~~~~~~~~~
> ..\lib\ExecutionEngine\RuntimeDyld\RTDyldMemoryManager.cpp(74,6) :
> warning: static_cast between pointer-to-function and pointer-to-object is
> a Microsoft extension [-Wmicrosoft]
> ((void (*)(void *))df)(p);
> ^~~~~~~~~~~~~~~~~~~~
> 2 warnings generated.
>
> On Tue, Jun 2, 2015 at 3:15 PM, David Majnemer <david.majnemer at gmail.com
> <javascript:_e(%7B%7D,'cvml','david.majnemer at gmail.com');>> wrote:
>
>> Author: majnemer
>> Date: Tue Jun 2 17:15:12 2015
>> New Revision: 238877
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=238877&view=rev
>> Log:
>> [MSVC Compatibility] Permit static_cast from void-ptr to function-ptr
>>
>> The MSVC 2013 and 2015 implementation of std::atomic is specialized for
>> pointer types. The member functions are implemented using a static_cast
>> from void-ptr to function-ptr which is not allowed in the standard.
>> Permit this conversion if -fms-compatibility is present.
>>
>> This fixes PR23733.
>>
>> Modified:
>> cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>> cfe/trunk/lib/Sema/SemaCast.cpp
>> cfe/trunk/test/SemaCXX/MicrosoftCompatibility-cxx98.cpp
>>
>> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=238877&r1=238876&r2=238877&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
>> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Tue Jun 2
>> 17:15:12 2015
>> @@ -5390,6 +5390,10 @@ def err_bad_const_cast_dest : Error<
>> "which is not a reference, pointer-to-object, or
>> pointer-to-data-member">;
>> def ext_cast_fn_obj : Extension<
>> "cast between pointer-to-function and pointer-to-object is an
>> extension">;
>> +def ext_ms_cast_fn_obj : ExtWarn<
>> + "static_cast between pointer-to-function and pointer-to-object is a "
>> + "Microsoft extension">,
>> + InGroup<Microsoft>;
>> def warn_cxx98_compat_cast_fn_obj : Warning<
>> "cast between pointer-to-function and pointer-to-object is
>> incompatible with C++98">,
>> InGroup<CXX98CompatPedantic>, DefaultIgnore;
>>
>> Modified: cfe/trunk/lib/Sema/SemaCast.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCast.cpp?rev=238877&r1=238876&r2=238877&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Sema/SemaCast.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaCast.cpp Tue Jun 2 17:15:12 2015
>> @@ -1081,6 +1081,14 @@ static TryCastResult TryStaticCast(Sema
>> Kind = CK_BitCast;
>> return TC_Success;
>> }
>> +
>> + // Microsoft permits static_cast from 'pointer-to-void' to
>> + // 'pointer-to-function'.
>> + if (Self.getLangOpts().MSVCCompat &&
>> DestPointee->isFunctionType()) {
>> + Self.Diag(OpRange.getBegin(), diag::ext_ms_cast_fn_obj) <<
>> OpRange;
>> + Kind = CK_BitCast;
>> + return TC_Success;
>> + }
>> }
>> else if (DestType->isObjCObjectPointerType()) {
>> // allow both c-style cast and static_cast of objective-c
>> pointers as
>>
>> Modified: cfe/trunk/test/SemaCXX/MicrosoftCompatibility-cxx98.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/MicrosoftCompatibility-cxx98.cpp?rev=238877&r1=238876&r2=238877&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/SemaCXX/MicrosoftCompatibility-cxx98.cpp (original)
>> +++ cfe/trunk/test/SemaCXX/MicrosoftCompatibility-cxx98.cpp Tue Jun 2
>> 17:15:12 2015
>> @@ -6,3 +6,5 @@ enum ENUM; // expected-warning {{forward
>> ENUM *var = 0;
>> ENUM var2 = (ENUM)3;
>> enum ENUM1* var3 = 0;// expected-warning {{forward references to 'enum'
>> types are a Microsoft extension}}
>> +
>> +void (*PR23733)() = static_cast<void (*)()>((void *)0); //
>> expected-warning {{static_cast between pointer-to-function and
>> pointer-to-object is a Microsoft extension}}
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> <javascript:_e(%7B%7D,'cvml','cfe-commits at cs.uiuc.edu');>
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150608/48503faa/attachment.html>
More information about the cfe-commits
mailing list