From: Daniel Lehman dlehman25@gmail.com
--- dlls/msvcr120/msvcr120.spec | 2 +- dlls/msvcr120/tests/msvcr120.c | 34 +++++++++++++++++++++++++++++ dlls/msvcr120_app/msvcr120_app.spec | 2 +- dlls/msvcrt/math.c | 9 ++++++++ dlls/ucrtbase/ucrtbase.spec | 2 +- 5 files changed, 46 insertions(+), 3 deletions(-)
diff --git a/dlls/msvcr120/msvcr120.spec b/dlls/msvcr120/msvcr120.spec index 6b5f66bdf73..78420df3757 100644 --- a/dlls/msvcr120/msvcr120.spec +++ b/dlls/msvcr120/msvcr120.spec @@ -2148,7 +2148,7 @@ @ cdecl fegetenv(ptr) @ cdecl fegetexceptflag(ptr long) @ cdecl fegetround() -@ stub feholdexcept +@ cdecl feholdexcept(ptr) @ cdecl feof(ptr) @ cdecl feraiseexcept(long) @ cdecl ferror(ptr) diff --git a/dlls/msvcr120/tests/msvcr120.c b/dlls/msvcr120/tests/msvcr120.c index 656004f4826..0c5e8128ae4 100644 --- a/dlls/msvcr120/tests/msvcr120.c +++ b/dlls/msvcr120/tests/msvcr120.c @@ -213,6 +213,7 @@ static int (CDECL *p_fegetexceptflag)(fexcept_t*,int); static int (CDECL *p_fesetexceptflag)(const fexcept_t*,int); static int (CDECL *p_fetestexcept)(int); static int (CDECL *p_feclearexcept)(int); +static int (CDECL *p_feholdexcept)(fenv_t*); static int (CDECL *p_feupdateenv)(fenv_t*); static int (CDECL *p__clearfp)(void); static _locale_t (__cdecl *p_wcreate_locale)(int, const wchar_t *); @@ -315,6 +316,7 @@ static BOOL init(void) SET(p_fesetexceptflag, "fesetexceptflag"); SET(p_fetestexcept, "fetestexcept"); SET(p_feclearexcept, "feclearexcept"); + SET(p_feholdexcept, "feholdexcept"); SET(p_feupdateenv, "feupdateenv");
SET(p__clearfp, "_clearfp"); @@ -1082,6 +1084,38 @@ static void test_feenv(void) ret = _statusfp(); ok(ret == (_EM_ZERODIVIDE | _EM_INVALID), "_statusfp returned %x\n", ret); p__clearfp(); + + /* feholdexcept */ + ret = p_feholdexcept(&env); + ok(!ret, "feholdexcept returned %x\n", ret); + ok(env._Fe_ctl == (_EM_INEXACT|_EM_UNDERFLOW|_EM_OVERFLOW|_EM_ZERODIVIDE|_EM_INVALID), + "env._Fe_ctl = %lx\n", env._Fe_ctl); + todo_wine + ok(!env._Fe_stat, "env._Fe_stat = %lx\n", env._Fe_stat); + except = FE_ALL_EXCEPT; + ret = p_fesetexceptflag(&except, FE_INEXACT|FE_UNDERFLOW); + ok(!ret, "fesetexceptflag returned %x\n", ret); + except = p_fetestexcept(FE_ALL_EXCEPT); + ok(except == (FE_INEXACT|FE_UNDERFLOW), "expected %x, got %lx\n", FE_INEXACT|FE_UNDERFLOW, except); + ret = p_fesetenv(&env); + ok(!ret, "fesetenv returned %x\n", ret); + ret = p_fegetenv(&env); + ok(!ret, "feholdexcept returned %x\n", ret); + ok(env._Fe_ctl == (_EM_INEXACT|_EM_UNDERFLOW|_EM_OVERFLOW|_EM_ZERODIVIDE|_EM_INVALID), + "env._Fe_ctl = %lx\n", env._Fe_ctl); + todo_wine + ok(!env._Fe_stat, "env._Fe_stat = %lx\n", env._Fe_stat); + + except = FE_ALL_EXCEPT; + ret = p_fesetexceptflag(&except, FE_INEXACT|FE_UNDERFLOW); + ok(!ret, "fesetexceptflag returned %x\n", ret); + ret = p_feholdexcept(&env); + ok(!ret, "feholdexcept returned %x\n", ret); + ok(env._Fe_ctl == (_EM_INEXACT|_EM_UNDERFLOW|_EM_OVERFLOW|_EM_ZERODIVIDE|_EM_INVALID), + "env._Fe_ctl = %lx\n", env._Fe_ctl); + todo_wine + ok(env._Fe_stat == (FE_INEXACT|FE_UNDERFLOW), "env._Fe_stat = %lx\n", env._Fe_stat); + p__clearfp(); }
static void test__wcreate_locale(void) diff --git a/dlls/msvcr120_app/msvcr120_app.spec b/dlls/msvcr120_app/msvcr120_app.spec index 06521c8a4f5..c15de4d01ce 100644 --- a/dlls/msvcr120_app/msvcr120_app.spec +++ b/dlls/msvcr120_app/msvcr120_app.spec @@ -1815,7 +1815,7 @@ @ cdecl fegetenv(ptr) msvcr120.fegetenv @ cdecl fegetexceptflag(ptr long) msvcr120.fegetexceptflag @ cdecl fegetround() msvcr120.fegetround -@ stub feholdexcept +@ cdecl feholdexcept(ptr) msvcr120.feholdexcept @ cdecl feof(ptr) msvcr120.feof @ cdecl feraiseexcept(long) msvcr120.feraiseexcept @ cdecl ferror(ptr) msvcr120.ferror diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c index 6624696c30f..1c1d5227b1b 100644 --- a/dlls/msvcrt/math.c +++ b/dlls/msvcrt/math.c @@ -1563,6 +1563,15 @@ void CDECL _fpreset(void) }
#if _MSVCR_VER>=120 +/********************************************************************* + * feholdexcept (MSVCR120.@) + */ +int CDECL feholdexcept(fenv_t *env) +{ + FIXME( "(%p) stub\n", env ); + return 0; +} + /********************************************************************* * fesetenv (MSVCR120.@) */ diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec index 054fc4055f4..d70494dbc29 100644 --- a/dlls/ucrtbase/ucrtbase.spec +++ b/dlls/ucrtbase/ucrtbase.spec @@ -2293,7 +2293,7 @@ @ cdecl fegetenv(ptr) @ cdecl fegetexceptflag(ptr long) @ cdecl fegetround() -@ stub feholdexcept +@ cdecl feholdexcept(ptr) @ cdecl feof(ptr) @ cdecl ferror(ptr) @ cdecl fesetenv(ptr)
From: Daniel Lehman dlehman25@gmail.com
--- dlls/msvcr120/tests/msvcr120.c | 3 --- dlls/msvcrt/math.c | 5 +++-- 2 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/dlls/msvcr120/tests/msvcr120.c b/dlls/msvcr120/tests/msvcr120.c index 0c5e8128ae4..890fb4916e6 100644 --- a/dlls/msvcr120/tests/msvcr120.c +++ b/dlls/msvcr120/tests/msvcr120.c @@ -1090,7 +1090,6 @@ static void test_feenv(void) ok(!ret, "feholdexcept returned %x\n", ret); ok(env._Fe_ctl == (_EM_INEXACT|_EM_UNDERFLOW|_EM_OVERFLOW|_EM_ZERODIVIDE|_EM_INVALID), "env._Fe_ctl = %lx\n", env._Fe_ctl); - todo_wine ok(!env._Fe_stat, "env._Fe_stat = %lx\n", env._Fe_stat); except = FE_ALL_EXCEPT; ret = p_fesetexceptflag(&except, FE_INEXACT|FE_UNDERFLOW); @@ -1103,7 +1102,6 @@ static void test_feenv(void) ok(!ret, "feholdexcept returned %x\n", ret); ok(env._Fe_ctl == (_EM_INEXACT|_EM_UNDERFLOW|_EM_OVERFLOW|_EM_ZERODIVIDE|_EM_INVALID), "env._Fe_ctl = %lx\n", env._Fe_ctl); - todo_wine ok(!env._Fe_stat, "env._Fe_stat = %lx\n", env._Fe_stat);
except = FE_ALL_EXCEPT; @@ -1113,7 +1111,6 @@ static void test_feenv(void) ok(!ret, "feholdexcept returned %x\n", ret); ok(env._Fe_ctl == (_EM_INEXACT|_EM_UNDERFLOW|_EM_OVERFLOW|_EM_ZERODIVIDE|_EM_INVALID), "env._Fe_ctl = %lx\n", env._Fe_ctl); - todo_wine ok(env._Fe_stat == (FE_INEXACT|FE_UNDERFLOW), "env._Fe_stat = %lx\n", env._Fe_stat); p__clearfp(); } diff --git a/dlls/msvcrt/math.c b/dlls/msvcrt/math.c index 1c1d5227b1b..be345fb7a4a 100644 --- a/dlls/msvcrt/math.c +++ b/dlls/msvcrt/math.c @@ -1568,8 +1568,9 @@ void CDECL _fpreset(void) */ int CDECL feholdexcept(fenv_t *env) { - FIXME( "(%p) stub\n", env ); - return 0; + TRACE( "(%p)\n", env ); + fegetenv(env); + return feclearexcept(FE_ALL_EXCEPT); }
/*********************************************************************
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=147760
Your paranoid android.
=== debian11b (64 bit WoW report) ===
user32: input.c:4305: Test succeeded inside todo block: button_down_hwnd_todo 1: got MSG_TEST_WIN hwnd 00000000012700DC, msg WM_LBUTTONDOWN, wparam 0x1, lparam 0x320032
Piotr Caban (@piotr) commented about dlls/msvcr120/tests/msvcr120.c:
ret = _statusfp(); ok(ret == (_EM_ZERODIVIDE | _EM_INVALID), "_statusfp returned %x\n", ret); p__clearfp();
- /* feholdexcept */
- ret = p_feholdexcept(&env);
```suggestion:-0+0 memset(&env, 0xfe, sizeof(env)); ret = p_feholdexcept(&env); ```