diff --git a/dlls/msvcp70/msvcp70.spec b/dlls/msvcp70/msvcp70.spec index 749e64a30e9..7067efad88d 100644 --- a/dlls/msvcp70/msvcp70.spec +++ b/dlls/msvcp70/msvcp70.spec @@ -2103,9 +2103,9 @@ @ stub ?_Isinf@?$_Ctraits@M@std@@SA_NM@Z @ stub ?_Isinf@?$_Ctraits@N@std@@SA_NN@Z @ stub ?_Isinf@?$_Ctraits@O@std@@SA_NO@Z -@ stub ?_Isnan@?$_Ctraits@M@std@@SA_NM@Z -@ stub ?_Isnan@?$_Ctraits@N@std@@SA_NN@Z -@ stub ?_Isnan@?$_Ctraits@O@std@@SA_NO@Z +@ cdecl ?_Isnan@?$_Ctraits@M@std@@SA_NM@Z(float) std_Ctraits_float__Isnan +@ cdecl ?_Isnan@?$_Ctraits@N@std@@SA_NN@Z(double) std_Ctraits_double__Isnan +@ cdecl ?_Isnan@?$_Ctraits@O@std@@SA_NO@Z(double) std_Ctraits_long_double__Isnan @ stub -arch=win32 ?_Loc_atexit@std@@YA_NP6AXXZ@Z @ stub -arch=win32 ?_Makpat@?$_Mpunct@D@std@@AAEXAAUpattern@money_base@2@III@Z @ stub -arch=win64 ?_Makpat@?$_Mpunct@D@std@@AEAAXAEAUpattern@money_base@2@III@Z diff --git a/dlls/msvcp71/msvcp71.spec b/dlls/msvcp71/msvcp71.spec index 1b56e177f35..0bac67cde51 100644 --- a/dlls/msvcp71/msvcp71.spec +++ b/dlls/msvcp71/msvcp71.spec @@ -2300,9 +2300,9 @@ @ stub ?_Isinf@?$_Ctraits@M@std@@SA_NM@Z @ stub ?_Isinf@?$_Ctraits@N@std@@SA_NN@Z @ stub ?_Isinf@?$_Ctraits@O@std@@SA_NO@Z -@ stub ?_Isnan@?$_Ctraits@M@std@@SA_NM@Z -@ stub ?_Isnan@?$_Ctraits@N@std@@SA_NN@Z -@ stub ?_Isnan@?$_Ctraits@O@std@@SA_NO@Z +@ cdecl ?_Isnan@?$_Ctraits@M@std@@SA_NM@Z(float) std_Ctraits_float__Isnan +@ cdecl ?_Isnan@?$_Ctraits@N@std@@SA_NN@Z(double) std_Ctraits_double__Isnan +@ cdecl ?_Isnan@?$_Ctraits@O@std@@SA_NO@Z(double) std_Ctraits_long_double__Isnan @ thiscall -arch=win32 ?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ(ptr) basic_streambuf_char__Lock @ cdecl -arch=win64 ?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAAXXZ(ptr) basic_streambuf_char__Lock @ thiscall -arch=win32 ?_Lock@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEXXZ(ptr) basic_streambuf_wchar__Lock diff --git a/dlls/msvcp80/msvcp80.spec b/dlls/msvcp80/msvcp80.spec index 31e5e6014ea..11654911a2f 100644 --- a/dlls/msvcp80/msvcp80.spec +++ b/dlls/msvcp80/msvcp80.spec @@ -2557,9 +2557,9 @@ @ stub ?_Isinf@?$_Ctraits@M@std@@SA_NM@Z @ stub ?_Isinf@?$_Ctraits@N@std@@SA_NN@Z @ stub ?_Isinf@?$_Ctraits@O@std@@SA_NO@Z -@ stub ?_Isnan@?$_Ctraits@M@std@@SA_NM@Z -@ stub ?_Isnan@?$_Ctraits@N@std@@SA_NN@Z -@ stub ?_Isnan@?$_Ctraits@O@std@@SA_NO@Z +@ cdecl ?_Isnan@?$_Ctraits@M@std@@SA_NM@Z(float) std_Ctraits_float__Isnan +@ cdecl ?_Isnan@?$_Ctraits@N@std@@SA_NN@Z(double) std_Ctraits_double__Isnan +@ cdecl ?_Isnan@?$_Ctraits@O@std@@SA_NO@Z(double) std_Ctraits_long_double__Isnan @ cdecl -arch=win32 ?_Locimp_Addfac@_Locimp@locale@std@@CAXPAV123@PAVfacet@23@I@Z(ptr ptr long) locale__Locimp__Locimp_Addfac @ cdecl -arch=win64 ?_Locimp_Addfac@_Locimp@locale@std@@CAXPEAV123@PEAVfacet@23@_K@Z(ptr ptr long) locale__Locimp__Locimp_Addfac @ cdecl -arch=win32 ?_Locimp_ctor@_Locimp@locale@std@@CAXPAV123@ABV123@@Z(ptr ptr) locale__Locimp__Locimp_ctor diff --git a/dlls/msvcp90/math.c b/dlls/msvcp90/math.c index 7ea6b698fe2..439865a197f 100644 --- a/dlls/msvcp90/math.c +++ b/dlls/msvcp90/math.c @@ -815,6 +815,15 @@ std_Ctraits * __thiscall std_Ctraits_op_assign( std_Ctraits *this, std_Ctraits * return this; } +/* ?_Isnan@?$_Ctraits@M@std@@SA_NM@Z -> public: static bool __cdecl std::_Ctraits::_Isnan(float) */ +BOOLEAN __cdecl std_Ctraits_float__Isnan( float x ) { return _isnan(x); } + +/* ?_Isnan@?$_Ctraits@N@std@@SA_NN@Z -> public: static bool __cdecl std::_Ctraits::_Isnan(double) */ +BOOLEAN __cdecl std_Ctraits_double__Isnan( double x ) { return _isnan(x); } + +/* ?_Isnan@?$_Ctraits@O@std@@SA_NO@Z -> public: static bool __cdecl std::_Ctraits::_Isnan(long double) */ +BOOLEAN __cdecl std_Ctraits_long_double__Isnan( LDOUBLE x ) { return _isnan(x); } + /* ?atan2@?$_Ctraits@M@std@@SAMMM@Z -> public: static float __cdecl std::_Ctraits::atan2(float,float) */ float __cdecl std_Ctraits_float_atan2( float y, float x ) { return atan2f( y, x ); } diff --git a/dlls/msvcp90/msvcp90.spec b/dlls/msvcp90/msvcp90.spec index 52717370afc..edb984b2b51 100644 --- a/dlls/msvcp90/msvcp90.spec +++ b/dlls/msvcp90/msvcp90.spec @@ -2878,9 +2878,9 @@ @ stub ?_Isinf@?$_Ctraits@M@std@@SA_NM@Z @ stub ?_Isinf@?$_Ctraits@N@std@@SA_NN@Z @ stub ?_Isinf@?$_Ctraits@O@std@@SA_NO@Z -@ stub ?_Isnan@?$_Ctraits@M@std@@SA_NM@Z -@ stub ?_Isnan@?$_Ctraits@N@std@@SA_NN@Z -@ stub ?_Isnan@?$_Ctraits@O@std@@SA_NO@Z +@ cdecl ?_Isnan@?$_Ctraits@M@std@@SA_NM@Z(float) std_Ctraits_float__Isnan +@ cdecl ?_Isnan@?$_Ctraits@N@std@@SA_NN@Z(double) std_Ctraits_double__Isnan +@ cdecl ?_Isnan@?$_Ctraits@O@std@@SA_NO@Z(double) std_Ctraits_long_double__Isnan @ cdecl -arch=win32 ?_Locimp_Addfac@_Locimp@locale@std@@CAXPAV123@PAVfacet@23@I@Z(ptr ptr long) locale__Locimp__Locimp_Addfac @ cdecl -arch=win64 ?_Locimp_Addfac@_Locimp@locale@std@@CAXPEAV123@PEAVfacet@23@_K@Z(ptr ptr long) locale__Locimp__Locimp_Addfac @ cdecl -arch=win32 ?_Locimp_ctor@_Locimp@locale@std@@CAXPAV123@ABV123@@Z(ptr ptr) locale__Locimp__Locimp_ctor diff --git a/dlls/msvcp90/tests/misc.c b/dlls/msvcp90/tests/misc.c index 26cafc95d9d..a4e07d7dabf 100644 --- a/dlls/msvcp90/tests/misc.c +++ b/dlls/msvcp90/tests/misc.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -26,6 +27,8 @@ #include #include "wine/test.h" +typedef double LDOUBLE; /* long double is just a double */ + typedef struct { LCID handle; unsigned page; @@ -110,6 +113,10 @@ static void (__thiscall *p_basic_ostringstream_char_dtor)(/*basic_ostringstream_ static void (__thiscall *p_basic_ostringstream_char_vbase_dtor)(/*basic_ostringstream_char*/void*); static void (__thiscall *p_basic_ios_char_dtor)(/*basic_ios_char*/void*); +static BOOL (__cdecl *p_std_Ctraits_float__Isnan)(float); +static BOOL (__cdecl *p_std_Ctraits_double__Isnan)(double); +static BOOL (__cdecl *p_std_Ctraits_long_double__Isnan)(LDOUBLE); + static complex_float* (__thiscall *p_complex_float_ctor)(complex_float*, const float*, const float*); static complex_float* (__cdecl *p_complex_float_add)(complex_float*, const complex_float*, const complex_float*); static complex_float* (__cdecl *p_complex_float_div)(complex_float*, const complex_float*, const complex_float*); @@ -216,6 +223,11 @@ static BOOL init(void) SET(p_wctrans, "wctrans"); SET(p_towctrans, "towctrans"); SET(basic_ostringstream_char_vbtable, "??_8?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@7B@"); + + SET(p_std_Ctraits_float__Isnan, "?_Isnan@?$_Ctraits@M@std@@SA_NM@Z"); + SET(p_std_Ctraits_double__Isnan, "?_Isnan@?$_Ctraits@N@std@@SA_NN@Z"); + SET(p_std_Ctraits_long_double__Isnan, "?_Isnan@?$_Ctraits@O@std@@SA_NO@Z"); + if(sizeof(void*) == 8) { /* 64-bit initialization */ SET(p_char_assign, "?assign@?$char_traits@D@std@@SAXAEADAEBD@Z"); SET(p_wchar_assign, "?assign@?$char_traits@_W@std@@SAXAEA_WAEB_W@Z"); @@ -688,6 +700,41 @@ static BOOL almost_eq(float f1, float f2) return f1 < 0.0001; } +static void test_Ctraits_math_functions(void) +{ + BYTE ret; + + ret = p_std_Ctraits_float__Isnan(0.0); + ok(ret == FALSE, "ret = %d\n", ret); + + ret = p_std_Ctraits_float__Isnan(0.0 / 0.0); + ok(ret == TRUE, "ret = %d\n", ret); + + ret = p_std_Ctraits_float__Isnan(1.0 / 0.0); + ok(ret == FALSE, "ret = %d\n", ret); + + ret = p_std_Ctraits_float__Isnan(-1.0 / 0.0); + ok(ret == FALSE, "ret = %d\n", ret); + + ret = p_std_Ctraits_float__Isnan(log(-1.0)); + ok(ret == TRUE, "ret = %d\n", ret); + + ret = p_std_Ctraits_float__Isnan(sqrt(-1.0)); + ok(ret == TRUE, "ret = %d\n", ret); + + ret = p_std_Ctraits_double__Isnan(3.14159 / 0.0); + ok(ret == FALSE, "ret = %d\n", ret); + + ret = p_std_Ctraits_double__Isnan(log(-3.14159)); + ok(ret == TRUE, "ret = %d\n", ret); + + ret = p_std_Ctraits_long_double__Isnan(3.14159 / 0.0); + ok(ret == FALSE, "ret = %d\n", ret); + + ret = p_std_Ctraits_long_double__Isnan(sqrt(-3.14159)); + ok(ret == TRUE, "ret = %d\n", ret); +} + static void test_complex(void) { complex_float c1, c2, c3; @@ -935,6 +982,7 @@ START_TEST(misc) test_virtual_call(); test_virtual_base_dtors(); test_allocator_char(); + test_Ctraits_math_functions(); test_complex(); ok(!invalid_parameter, "invalid_parameter_handler was invoked too many times\n");