On 11.08.2019 17:21, Kamil Rytarowski wrote:
> On 11.08.2019 14:34, Christos Zoulas wrote:
>> In article <3ebcc5d1-a57d-a290-72d8-6efc73025985%gmx.com@localhost>,
>> Kamil Rytarowski <n54%gmx.com@localhost> wrote:
>>> -=-=-=-=-=-
>>> -=-=-=-=-=-
>>>
>>> On 11.08.2019 02:56, Valery Ushakov wrote:
>>>> Kamil Rytarowski <n54%gmx.com@localhost> wrote:
>>>>
>>>>> Cast of udata from void* to intptr_t shall be done with
>>>>> reinterpret_cast<> otherwise a C++ compiler errors.
>>>>>
>>>>> Defining __REINTERPRET_CAST [1] and using it, did not work as a compiler
>>>>> protested for NULL argument "warning: passing NULL to non-pointer argument".
>>>>>
>>>>> Using double cast __REINTERPRET_CAST(intptr_t, __CAST(void *, (udata)))
>>>>> pacified the warning/error about passing NULL in C++, but it created the
>>>>> problem of calling EV_SET using the native argument type intptr_t.
>>>>
>>>> You are reporting quite an abstract summary that is not so easy to
>>>> follow for someone who hasn't done all the same experiments that you
>>>> already have done.
>>>
>>>
>>> $ cat /tmp/test.cpp
>>>
>>>
>>> #include <sys/types.h>
>>> #include <sys/event.h>
>>>
>>> int
>>> main(int argc, char **argv)
>>> {
>>> struct kevent kv;
>>>
>>> EV_SET(&kv, 0, 0, 0, 0, 0, 0);
>>> EV_SET(&kv, 0, 0, 0, 0, 0, NULL);
>>> EV_SET(&kv, 0, 0, 0, 0, 0, nullptr);
>>> EV_SET(&kv, 0, 0, 0, 0, 0, 0L);
>>> EV_SET(&kv, 0, 0, 0, 0, 0, 0LL);
>>> EV_SET(&kv, 0, 0, 0, 0, 0, 0U);
>>> EV_SET(&kv, 0, 0, 0, 0, 0, 0UL);
>>> EV_SET(&kv, 0, 0, 0, 0, 0, 0ULL);
>>> EV_SET(&kv, 0, 0, 0, 0, 0, (intptr_t)0);
>>> EV_SET(&kv, 0, 0, 0, 0, 0, (uintptr_t)0);
>>>
>>>
>>> return 0;
>>> }
>>
>> How about:
>>
>> EV_SET(&kv, 0, 0, 0, 0, 0, 'a');
> This was handled.
>
>> EV_SET(&kv, 0, 0, 0, 0, 0, 0.0);
>>
>
> This is handled in the newer version (to some extend) as it is converted
> to intptr_t.
>
>> and all the other integral types not mentiones above?
>>
>> So if we are going to go gung ho C++, why not do it as a template?
>
> I have managed to get it to work with templates compatible with c++98
> and newer C++. This code eliminates all g++ and clang++ warnings.
>
> http://netbsd.org/~kamil/patch-00137-EV_SET-template.txt
>
> There is one template fallback for c++11 or newer for std::nullptr_t.
>
>> You could also possibly use std::is_integral (or the c++17 std::is_integral_v)
>> etc., and perhaps get rid of the diagnostic suppression :-)
>>
>
> Compatibility with C++98 is a must in headers.
>
>> christos
>>
>
>
I have found a better approach.
We can simply enforce C cast rules this way:
http://netbsd.org/~kamil/patch-00138-EV_SET-CPP-cast.txt
Independently we can stop enforcing static_cast<> in __CAST() in
sys/cdefs.h and enforce C-style cast that dynamically picks proper
static_cast<>, const_cast<>, reinterpet_cast<> upon needs.
Attachment:
signature.asc
Description: OpenPGP digital signature