16#if defined(ENABLE_CATCH)
18# include <catch2/catch_all.hpp>
25# if defined(__GLIBC__) && defined(FE_ALL_EXCEPT)
27TEST_CASE(
"fpu_guard masks FP traps inside its scope and survives a NaN op",
"[fpu_guard][fpu][3012]") {
28 std::feclearexcept(FE_ALL_EXCEPT);
29 feenableexcept(FE_INVALID);
35 CHECK((fegetexcept() & FE_INVALID) == 0);
36 volatile double zero = 0.0;
37 volatile double nan = zero / zero;
38 CHECK(std::isnan(nan));
42 CHECK((fegetexcept() & FE_INVALID) != 0);
45 CHECK(std::fetestexcept(FE_INVALID) == 0);
47 fedisableexcept(FE_ALL_EXCEPT);
48 std::feclearexcept(FE_ALL_EXCEPT);
51TEST_CASE(
"fpu_guard leaves an already-masked environment unchanged",
"[fpu_guard][fpu][3012]") {
52 fedisableexcept(FE_ALL_EXCEPT);
53 std::feclearexcept(FE_ALL_EXCEPT);
57 CHECK((fegetexcept() & FE_ALL_EXCEPT) == 0);
61 CHECK((fegetexcept() & FE_ALL_EXCEPT) == 0);
62 std::feclearexcept(FE_ALL_EXCEPT);
66TEST_CASE(
"fpu_guard is constructible and clears status flags on every platform",
"[fpu_guard][fpu][3012]") {
71 std::feclearexcept(FE_ALL_EXCEPT);
74 volatile double zero = 0.0;
75 volatile double nan = zero / zero;
76 CHECK(std::isnan(nan));
79 CHECK(std::fetestexcept(FE_INVALID) == 0);