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)