[PATCH vkd3d] vkd3d: Add a function to mark unreachable code.
Zebediah Figura
zfigura at codeweavers.com
Thu Apr 14 11:14:27 CDT 2022
On 4/14/22 06:00, Giovanni Mascellani wrote:
> Hi,
>
> Il 08/04/22 19:00, Zebediah Figura ha scritto:
>> I don't think there's value in specifying a message for cases like
>> this, and I'd rather not have to do so in new code. This applies to
>> pretty much anywhere we have an assert() in a switch default case.
>>
>> (Ideally we should avoid the 'default' keyword where possible,
>> although in some cases this is difficult.)
>
> vkd3d_unreachable() is written in a way such that you can pass it NULL
> to it for precisely this reason. I went adding messages for all present
> uses, but it is not mandatory to have one. Does this address your
> objection?
I noticed that, but even so, I don't think there's value in printing a
message in any of these cases. A message only makes sense when we expect
it to be printed, and we don't expect any of these messages to ever be
printed. The only reason I added assert(0) was for code clarity, and I
think it's quite clear why the default code paths are unreachable.
>
>>> @@ -1542,12 +1534,10 @@ static void write_sm4_cast(struct hlsl_ctx *ctx,
>>> break;
>>> case HLSL_TYPE_BOOL:
>>> - /* Casts to bool should have already been lowered. */
>>> - assert(0);
>>> - break;
>>> + vkd3d_unreachable("Casts to bool should have already
>>> been lowered");
>>
>> This one I think should remain an assert. I can more easily see this
>> getting triggered due to some forgotten implicit agreement. Hence we
>> probably shouldn't tell the compiler this code path is unreachable.
>>
>> Using an assert(!"string") or assert(0 && "string") construction (or
>> defining our own macro) seems reasonable to me, though.
>
> From the point of view of the compiler, assert(0) is not really
> different from vkd3d_unreachable(NULL): nothing tells the compiler that
> control will never ever reach it; if it happens, the compiler will print
> a message and abort(). The advantage of vkd3d_unreachable() is that the
> compiler won't try to tell you "Hey, you didn't write your return
> statement!" in places where it doesn't make any sense (because it's
> marked "noreturn").
As it's currently written, yes. However, I think we want to hook this up
to __builtin_unreachable() if the latter is available.
More information about the wine-devel
mailing list