assert: make disabled asserts work with bitfield conditions.

We don't care _what_ the `sizeof` results are, we just want it to vaporize
the condition's code out of the build. So we check it with a `? 1 : 0`, so it
always boils down to a `sizeof (int)`, no matter what data type the condition
actually is.

This works with bitfields, pointers, anything that can be "truthy." If it
isn't truthy, it would fail when assertions are enabled anyhow.

Fixes #15990.

(manually cherry picked from commit daf519ae05)
This commit is contained in:
Ryan C. Gordon
2026-07-13 18:30:53 -04:00
parent 0e802c12c0
commit 73fed37c04

View File

@@ -84,11 +84,16 @@ assert can have unique static variables associated with it.
#define SDL_LINE __LINE__
/*
sizeof (x) makes the compiler still parse the expression even without
assertions enabled, so the code is always checked at compile time, but
sizeof ((x) ? 1 : 0) makes the compiler still parse the expression even
without assertions enabled, so the code is always checked at compile time, but
doesn't actually generate code for it, so there are no side effects or
expensive checks at run time, just the constant size of what x WOULD be,
expensive checks at run time, just the constant size of what int would be,
which presumably gets optimized out as unused.
(The `? 1 : 0` is so this always dithers down to `sizeof (int)`...otherwise
you'll have problems when bitfields are used as the condition, since the
compiler will error out on the sizeof.)
This also solves the problem of...
int somevalue = blah();
@@ -107,7 +112,7 @@ disable assertions.
#endif
#define SDL_disabled_assert(condition) \
do { (void) sizeof ((condition)); } while (SDL_NULL_WHILE_LOOP_CONDITION)
do { (void) sizeof ((condition) ? 1 : 0); } while (SDL_NULL_WHILE_LOOP_CONDITION)
typedef enum
{