diff --git a/include/SDL3/SDL_assert.h b/include/SDL3/SDL_assert.h index c2ecadbcf7487..4dce8f2defde6 100644 --- a/include/SDL3/SDL_assert.h +++ b/include/SDL3/SDL_assert.h @@ -80,6 +80,18 @@ assert can have unique static variables associated with it. #define SDL_TriggerBreakpoint() #endif +#if defined(_MSC_VER) && (_MSC_VER > 1400) + #define SDL_Assume(cond) __assume(cond) +#elif SDL_HAS_BUILTIN(__builtin_assume) + #define SDL_Assume(cond) __builtin_assume(cond) +#elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 4))) + #define SDL_Assume(cond) do { \ + (__builtin_expect(!(cond), 0) ? __builtin_unreachable() : (void)0); \ + } while (0) +#else + #define SDL_Assume(cond) +#endif + #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 supports __func__ as a standard. */ # define SDL_FUNCTION __func__ #elif ((defined(__GNUC__) && (__GNUC__ >= 2)) || defined(_MSC_VER) || defined (__WATCOMC__)) diff --git a/test/testplatform.c b/test/testplatform.c index dee807dd27f76..1298cba8b864c 100644 --- a/test/testplatform.c +++ b/test/testplatform.c @@ -438,7 +438,20 @@ static int TestAssertions(SDL_bool verbose) return 0; } -int main(int argc, char *argv[]) +int +TestAssume(SDL_bool verbose) +{ + int max, count, i; + + max = 16; + count = SDLTest_RandomIntegerInRange(0, max); + SDL_Assume(count <= max); + for (i = 0; i < count; i ++); + return (0); +} + +int +main(int argc, char *argv[]) { int i; SDL_bool verbose = SDL_TRUE; @@ -483,6 +496,7 @@ int main(int argc, char *argv[]) status += Test64Bit(verbose); status += TestCPUInfo(verbose); status += TestAssertions(verbose); + status += TestAssume(verbose); SDLTest_CommonDestroyState(state);