r238877 - [MSVC Compatibility] Permit static_cast from void-ptr to function-ptr

David Majnemer david.majnemer at gmail.com
Mon Jun 8 19:45:37 PDT 2015


Fixed in r239382.

On Mon, Jun 8, 2015 at 5:53 PM, David Majnemer <david.majnemer at gmail.com>
wrote:

> 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>
>> 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
>>> 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/98c61a14/attachment.html>


More information about the cfe-commits mailing list