Dmitry Eremin-Solenikov(lumag) replied on github web page:
test/validation/api/pktio/pktio.c
line 16
@@ -1195,10 +1195,8 @@ void pktio_test_index(void)
ndx = odp_pktio_index(pktio);
CU_ASSERT(ndx >= 0);
- CU_ASSERT(odp_pktio_index(pktio_inval) < 0);
CU_ASSERT(odp_pktio_close(pktio) == 0);
- CU_ASSERT(odp_pktio_index(pktio) < 0);
Comment:
Generally I would agree. However we explicitly have the invalid usecase in API:
```
@retval <0 On failure (e.g., handle not valid)
```
> Dmitry Eremin-Solenikov(lumag) wrote:
> Is there a reason to move function bodies?
>> Dmitry Eremin-Solenikov(lumag) wrote:
>> Maybe `(uintptr_t)(handle) == (uintptr_t)0` would do the trick?
>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>> Very strange. I'm Ok with this workaround, but a comment about clang
>>> version might be appropriate. Don't know if it's worth doing a clang
>>> version check. We do things like that in the `ODP_STATIC_ASSERT()` macro
>>> itself for similar reasons.
>>>> Petri Savolainen(psavol) wrote:
>>>> odp_packet.c:52:19: error: static_assert expression is not an integral
>>>> constant
>>>> expression
>>>> ODP_STATIC_ASSERT(_odp_typeval(ODP_BUFFER_INVALID) == 0, "Buffer inval not
>>>> 0");
>>>> ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>> ../../platform/linux-generic/include/odp/api/plat/strong_types.h:32:30:
>>>> note:
>>>> expanded from macro '_odp_typeval'
>>>> #define _odp_typeval(handle) ((uint32_t)(uintptr_t)(handle))
>>>> ^
>>>> ../../include/odp/api/abi-default/debug.h:26:53: note: expanded from macro
>>>> 'ODP_STATIC_ASSERT'
>>>> #define ODP_STATIC_ASSERT(cond, msg) _Static_assert(cond, msg)
>>>> ^~~~
>>>> odp_packet.c:52:19: note: cast that performs the conversions of a
>>>> reinterpret_cast is not allowed in a constant expression
>>>> ../../platform/linux-generic/include/odp/api/plat/strong_types.h:32:41:
>>>> note:
>>>> expanded from macro '_odp_typeval'
>>>> #define _odp_typeval(handle) ((uint32_t)(uintptr_t)(handle))
>>>>> Petri Savolainen(psavol) wrote:
>>>>> static_assert() seems special. The clang version in Travis does not
>>>>> accept type casts with static_assert(). The cast confuses it to think
>>>>> that (uintptr_t)0 == 0 is not an integral constant.
>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>> `_odp_typeval()` is defined as:
>>>>>> ```
>>>>>> #define _odp_typeval(handle) ((uint32_t)(uintptr_t)(handle))
>>>>>> ```
>>>>>> It's used elsewhere in the ODP code and clang doesn't have any problem
>>>>>> with it. I've verified this works for clang 4.2.1. Since it works
>>>>>> elsewhere on Travis I'm not sure why it wouldn't in this instance.
>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>> I'm OK with just a modified commit name. I agree we needn't be too
>>>>>>> granular about these things.
>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>> I could rename the patch to:
>>>>>>>> "linux-gen: packet: use inlined flow hash and ts set"
>>>>>>>>
>>>>>>>> ... if necessary. The comment says already that also ts set is
>>>>>>>> modified the same way.
>>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>>> I did try several combinations of type casts of invalid values, also
>>>>>>>>> cast to uintptr_t. The problem is that gcc and clang (clang version
>>>>>>>>> 3.8.0-2ubuntu4) of my machine accepted all of those casts, but the
>>>>>>>>> clang version in Travis (clang version 3.8.0-2ubuntu3~trusty5) does
>>>>>>>>> not accept anything.
>>>>>>>>>
>>>>>>>>> Maybe it's a bug in the particular version of clang. Anyway, addition
>>>>>>>>> of this check even only on gcc side is improvement against what we
>>>>>>>>> currently have (no check). Packet invalid is currently 0xfffffff in
>>>>>>>>> ABI spec, but event/buffer invalid are 0.
>>>>>>>>>
>>>>>>>>> odp_packet.c:55:19: error: static_assert expression is not an
>>>>>>>>> integral constant
>>>>>>>>> expression
>>>>>>>>> ODP_STATIC_ASSERT(((uintptr_t)ODP_PACKET_INVALID) == 0, "Packet
>>>>>>>>> invalid not 0");
>>>>>>>>> ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>>>>>> ../../include/odp/api/abi-default/debug.h:26:53: note: expanded from
>>>>>>>>> macro
>>>>>>>>> 'ODP_STATIC_ASSERT'
>>>>>>>>> #define ODP_STATIC_ASSERT(cond, msg) _Static_assert(cond, msg)
>>>>>>>>> ^~~~
>>>>>>>>> odp_packet.c:55:20: note: cast that performs the conversions of a
>>>>>>>>> reinterpret_cast is not allowed in a constant expression
>>>>>>>>> ODP_STATIC_ASSERT(((uintptr_t)ODP_PACKET_INVALID) == 0, "Packet
>>>>>>>>> invalid not 0");
>>>>>>>>> ^
>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>> Since you want to breech the strong type you need to use the
>>>>>>>>>> internal `odp_typeval()` macro here.
>>>>>>>>>> ```
>>>>>>>>>> ODP_STATIC_ASSERT(_odp_typeval(ODP_EVENT_INVALID) == 0, "Event
>>>>>>>>>> invalid not 0");
>>>>>>>>>> ```
>>>>>>>>>> etc. I've verified that this works fine for clang, so no need for
>>>>>>>>>> the conditional compilation.
>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>> Should this be in its own commit? Different function.
https://github.com/Linaro/odp/pull/437#discussion_r165116521
updated_at 2018-01-31 16:54:11