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