From: Eric Pouech <eric.pouech(a)gmail.com> introduce support for reporting cases where builtin's demangling only differs with white space from native Signed-off-by: Eric Pouech <eric.pouech(a)gmail.com> --- dlls/msvcrt/tests/cpp.c | 28 ++++++++++++++++++++++------ dlls/msvcrt/undname.c | 4 ++-- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/dlls/msvcrt/tests/cpp.c b/dlls/msvcrt/tests/cpp.c index 5beaea3bd1a..4449392e9c9 100644 --- a/dlls/msvcrt/tests/cpp.c +++ b/dlls/msvcrt/tests/cpp.c @@ -1107,7 +1107,14 @@ static void test_demangle_datatype(void) static void test_demangle(void) { - static struct {const char* in; const char* out; const char *broken; unsigned int flags;} test[] = { + static struct { + const char* in; + const char* out; + const char *broken; + /* to report white space only discrepancies between wine & native */ + const char *wine_whitespace; + unsigned int flags; + } test[] = { /* 0 */ {"??0bad_alloc(a)std@@QAE(a)ABV01@@Z", "public: __thiscall std::bad_alloc::bad_alloc(class std::bad_alloc const &)", "public: __thiscall std::bad_alloc::bad_alloc(class bad_alloc::bad_alloc const &)"}, @@ -1246,9 +1253,9 @@ static void test_demangle(void) /* 101 */ {"?$_aaa(a)Vbbb@@", "_aaa<class bbb>"}, /* 102 */ {"?$aaa(a)Vbbb@ccc@@Vddd(a)2@", "aaa<class ccc::bbb,class ccc::ddd>"}, /* 103 */ { "??0?$Foo(a)P6GHPAX0@Z@@QAE(a)PAD@Z", "public: __thiscall Foo<int (__stdcall*)(void *,void *)>::Foo<int (__stdcall*)(void *,void *)>(char *)"}, -/* 104 */ { "??0?$Foo(a)P6GHPAX0@Z@@QAE(a)PAD@Z", "__thiscall Foo<int (__stdcall*)(void *,void *)>::Foo<int (__stdcall*)(void *,void *)>(char *)", NULL, 0x880}, +/* 104 */ { "??0?$Foo(a)P6GHPAX0@Z@@QAE(a)PAD@Z", "__thiscall Foo<int (__stdcall*)(void *,void *)>::Foo<int (__stdcall*)(void *,void *)>(char *)", NULL, NULL, 0x880}, /* 105 */ { "?Qux(a)Bar@@0PAP6AHPAV1(a)AAH1PAH@ZA", "private: static int (__cdecl** Bar::Qux)(class Bar *,int &,int &,int *)" }, -/* 106 */ { "?Qux(a)Bar@@0PAP6AHPAV1(a)AAH1PAH@ZA", "Bar::Qux", NULL, 0x1800}, +/* 106 */ { "?Qux(a)Bar@@0PAP6AHPAV1(a)AAH1PAH@ZA", "Bar::Qux", NULL, NULL, 0x1800}, /* 107 */ {"?$AAA@$DBAB@", "AAA<`template-parameter257'>"}, /* 108 */ {"?$AAA@?C@", "AAA<`template-parameter-2'>"}, /* 109 */ {"?$AAA(a)PAUBBB@@", "AAA<struct BBB *>"}, @@ -1281,11 +1288,11 @@ static void test_demangle(void) /* 125 */ {"?_dispatch(a)_impl_Engine@SalomeApp@@$R4CE(a)BA@PPPPPPPM(a)7AE_NAAVomniCallHandle@@@Z", "[thunk]:public: virtual bool __thiscall SalomeApp::_impl_Engine::_dispatch`vtordispex{36,16,4294967292,8}' (class omniCallHandle &)", "?_dispatch(a)_impl_Engine@SalomeApp@@$R4CE(a)BA@PPPPPPPM(a)7AE_NAAVomniCallHandle@@@Z"}, -/* 126 */ {"?_Doraise(a)bad_cast@std@@MEBAXXZ", "protected: virtual void __cdecl std::bad_cast::_Doraise(void)", NULL, 0x60}, -/* 127 */ {"??Xstd@@YAAEAV?$complex(a)M@0(a)AEAV10@AEBV10@@Z", "class std::complex<float> & ptr64 cdecl std::operator*=(class std::complex<float> & ptr64,class std::complex<float> const & ptr64)", NULL, 1}, +/* 126 */ {"?_Doraise(a)bad_cast@std@@MEBAXXZ", "protected: virtual void __cdecl std::bad_cast::_Doraise(void)", NULL, NULL, 0x60}, +/* 127 */ {"??Xstd@@YAAEAV?$complex(a)M@0(a)AEAV10@AEBV10@@Z", "class std::complex<float> & ptr64 cdecl std::operator*=(class std::complex<float> & ptr64,class std::complex<float> const & ptr64)", NULL, NULL, 1}, /* 128 */ {"??Xstd@@YAAEAV?$complex(a)M@0(a)AEAV10@AEBV10@@Z", "class std::complex<float> & std::operator*=(class std::complex<float> &,class std::complex<float> const &)", - "??Xstd@@YAAEAV?$complex(a)M@0(a)AEAV10@AEBV10@@Z", 2}, + "??Xstd@@YAAEAV?$complex(a)M@0(a)AEAV10@AEBV10@@Z", NULL, 2}, /* 129 */ {"??$run(a)XVTask_Render_Preview@@@QtConcurrent@@YA?AV?$QFuture(a)X@@PEAVTask_Render_Preview@@P82(a)EAAXXZ@Z", "class QFuture<void> __cdecl QtConcurrent::run<void,class Task_Render_Preview>(class Task_Render_Preview * __ptr64,void (__cdecl Task_Render_Preview::*)(void) __ptr64)", "??$run(a)XVTask_Render_Preview@@@QtConcurrent@@YA?AV?$QFuture(a)X@@PEAVTask_Render_Preview@@P82(a)EAAXXZ@Z"}, @@ -1298,6 +1305,8 @@ static void test_demangle(void) /* 136 */ {"??$?0AEAVzzz(a)BB4@AA@@AEAV012@$0A@@?$pair(a)Vzzz@BB4(a)AA@@V123@@std@@QEAA(a)AEAVzzz@BB4(a)AA@@0(a)Z", "public: __cdecl std::pair<class AA::BB4::zzz,class AA::BB4::zzz>::pair<class AA::BB4::zzz,class AA::BB4::zzz><class AA::BB4::zzz & __ptr64,class AA::BB4::zzz & __ptr64,0>(class AA::BB4::zzz & __ptr64,class AA::BB4::zzz & __ptr64) __ptr64"}, /* 137 */ {"??$?BH@?$foo(a)N@@QEAAHXZ", "public: __cdecl foo<double>::operator<int> int(void) __ptr64"}, +/* 138 */ {"??Bcastop@@QAEHXZ", "public: __thiscall castop::operator int(void)"}, +/* 139 */ {"??Bcastop@@QAE?BHXZ", "public: __thiscall castop::operator int const (void)", NULL, "public: __thiscall castop::operator int const(void)"}, }; int i, num_test = ARRAY_SIZE(test); char* name; @@ -1307,12 +1316,19 @@ static void test_demangle(void) name = p__unDName(0, test[i].in, 0, malloc, free, test[i].flags); ok(name != NULL, "%u: unDName failed\n", i); if (!name) continue; + todo_wine_if(test[i].wine_whitespace) ok( !strcmp(test[i].out, name) || broken(test[i].broken && !strcmp(test[i].broken, name)), "%u: Got name \"%s\"\n", i, name ); + todo_wine_if(test[i].wine_whitespace) ok( !strcmp(test[i].out, name) || broken(test[i].broken && !strcmp(test[i].broken, name)), "%u: Expected \"%s\"\n", i, test[i].out ); + if (test[i].wine_whitespace && !strcmp(winetest_platform, "wine")) + { + ok( !strcmp(test[i].wine_whitespace, name), "%u: Got name \"%s\"\n", i, name ); + ok( !strcmp(test[i].wine_whitespace, name), "%u: Expected (white space) \"%s\"\n", i, test[i].wine_whitespace ); + } free(name); } } diff --git a/dlls/msvcrt/undname.c b/dlls/msvcrt/undname.c index be736631626..c30b7ebb95b 100644 --- a/dlls/msvcrt/undname.c +++ b/dlls/msvcrt/undname.c @@ -1331,7 +1331,7 @@ static BOOL handle_method(struct parsed_symbol* sym, BOOL cast_op) ct_ret.left = ct_ret.right = NULL; if (cast_op) { - name = str_printf(sym, "%s%s%s", name, ct_ret.left, ct_ret.right); + name = str_printf(sym, "%s %s%s", name, ct_ret.left, ct_ret.right); ct_ret.left = ct_ret.right = NULL; } @@ -1406,7 +1406,7 @@ static BOOL symbol_demangle(struct parsed_symbol* sym) case '8': function_name = "operator=="; break; case '9': function_name = "operator!="; break; case 'A': function_name = "operator[]"; break; - case 'B': function_name = "operator "; do_after = 3; break; + case 'B': function_name = "operator"; do_after = 3; break; case 'C': function_name = "operator->"; break; case 'D': function_name = "operator*"; break; case 'E': function_name = "operator++"; break; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/492