Hi Daniel, On 3/2/21 5:06 AM, Daniel Lehman wrote:
+ except = p_fetestexcept(tests2[i]); + ok(except == tests2[i], "expected %lx, got %lx\n", tests2[i], except); + } + + except = FE_ALL_EXCEPT; + ret = p_fesetexceptflag(&except, 0); + ok(!ret, "fesetexceptflag returned %x\n", ret); + except = p_fetestexcept(FE_ALL_EXCEPT); + ok(except == FE_ALL_EXCEPT, "expected %x, got %lx\n", FE_ALL_EXCEPT, except); There's no fpclear call before this test, it probably doesn't test what you wanted.
+/********************************************************************* + * fesetexceptflag (MSVCR120.@) + */ +int CDECL fesetexceptflag(const fexcept_t *status, int excepts) +{ + fenv_t env; + + if(!status) + return 0; You're adding a test that shows status == NULL crashes on Windows.
+ if(!*status) { + _clearfp(); + return 0; + } + + fegetenv(&env); + env._Fe_stat |= (*status & excepts & FE_ALL_EXCEPT); + return fesetenv(&env); I would expect the function to set all the fields specified by mask. Probably it should look like: excepts &= FE_ALL_EXCEPT; *status &= excepts; env._Fe_stat = (env._Fe_stat & ~excepts) | *status; Could you please add some tests that starts with non 0 status word? Also please test status on function exit, probably it should be set to new status word value.
Thanks, Piotr