From: Theodoros Chatzigiannakis <tchatzigiannakis@gmail.com> --- dlls/msvcp90/tests/ios.c | 43 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/dlls/msvcp90/tests/ios.c b/dlls/msvcp90/tests/ios.c index 498a19f7c7c..e5fbcfcf280 100644 --- a/dlls/msvcp90/tests/ios.c +++ b/dlls/msvcp90/tests/ios.c @@ -491,6 +491,7 @@ static basic_istream_char* (*__thiscall p_basic_istream_char_seekg_fpos)(basic_i static int (*__thiscall p_basic_istream_char_peek)(basic_istream_char*); static fpos_int* (*__thiscall p_basic_istream_char_tellg)(basic_istream_char*, fpos_int*); static basic_istream_char* (*__cdecl p_basic_istream_char_getline_bstr_delim)(basic_istream_char*, basic_string_char*, char); +static basic_istream_char* (*__thiscall p_basic_istream_char_assign)(basic_istream_char*, basic_istream_char*); static basic_istream_wchar* (*__thiscall p_basic_istream_wchar_read_uint64)(basic_istream_wchar*, unsigned __int64*); static basic_istream_wchar* (*__thiscall p_basic_istream_wchar_read_double)(basic_istream_wchar*, double *); @@ -650,6 +651,7 @@ static void init_thiscall_thunk(void) #endif /* __i386__ */ static HMODULE msvcr, msvcp; +static HMODULE msvcp140_mod; #define SETNOFAIL(x,y) x = (void*)GetProcAddress(msvcp,y) #define SET(x,y) do { SETNOFAIL(x,y); ok(x != NULL, "Export '%s' not found\n", y); } while(0) static BOOL init(void) @@ -1157,6 +1159,16 @@ static BOOL init(void) "@@ABAHAAV?$istreambuf_iterator@DU?$char_traits@D@std@@@2@0HHAAH@Z"); } + msvcp140_mod = LoadLibraryA("msvcp140.dll"); + if(msvcp140_mod) { + if(sizeof(void*) == 8) + p_basic_istream_char_assign = (void*)GetProcAddress(msvcp140_mod, + "??4?$basic_istream@DU?$char_traits@D@std@@@std@@IEAAAEAV01@$$QEAV01@@Z"); + else + p_basic_istream_char_assign = (void*)GetProcAddress(msvcp140_mod, + "??4?$basic_istream@DU?$char_traits@D@std@@@std@@IAEAAV01@$$QAV01@@Z"); + } + init_thiscall_thunk(); return TRUE; } @@ -2608,6 +2620,35 @@ static void test_time_get__Getint(void) call_func1(p_time_get_char_dtor, &time_get); } +static void test_istream_assign(void) +{ + basic_stringstream_char ss1, ss2; + basic_string_char str; + + if(!p_basic_istream_char_assign) { + skip("basic_istream_char_assign not found\n"); + return; + } + + call_func2(p_basic_string_char_ctor_cstr, &str, "hello"); + call_func4(p_basic_stringstream_char_ctor_str, &ss1, &str, OPENMODE_out|OPENMODE_in, TRUE); + call_func4(p_basic_stringstream_char_ctor_str, &ss2, &str, OPENMODE_out|OPENMODE_in, TRUE); + call_func1(p_basic_string_char_dtor, &str); + + /* advance ss1's read count by reading one character */ + call_func1(p_basic_istream_char_get, &ss1.base.base1); + ok(ss1.base.base1.count == 1, "expected count 1, got %d\n", (int)ss1.base.base1.count); + ok(ss2.base.base1.count == 0, "expected count 0, got %d\n", (int)ss2.base.base1.count); + + /* move-assign ss2 into ss1: the count field is swapped */ + call_func2(p_basic_istream_char_assign, &ss1.base.base1, &ss2.base.base1); + ok(ss1.base.base1.count == 0, "expected count 0, got %d\n", (int)ss1.base.base1.count); + ok(ss2.base.base1.count == 1, "expected count 1, got %d\n", (int)ss2.base.base1.count); + + call_func1(p_basic_stringstream_char_vbase_dtor, &ss1); + call_func1(p_basic_stringstream_char_vbase_dtor, &ss2); +} + START_TEST(ios) { if(!init()) @@ -2636,9 +2677,11 @@ START_TEST(ios) test_istream_read_complex_double(); test_basic_ios(); test_time_get__Getint(); + test_istream_assign(); ok(!invalid_parameter, "invalid_parameter_handler was invoked too many times\n"); FreeLibrary(msvcr); FreeLibrary(msvcp); + if(msvcp140_mod) FreeLibrary(msvcp140_mod); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10636