From: Eric Pouech eric.pouech@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@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@std@@QAE@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@Vbbb@@", "_aaa<class bbb>"}, /* 102 */ {"?$aaa@Vbbb@ccc@@Vddd@2@", "aaa<class ccc::bbb,class ccc::ddd>"}, /* 103 */ { "??0?$Foo@P6GHPAX0@Z@@QAE@PAD@Z", "public: __thiscall Foo<int (__stdcall*)(void *,void *)>::Foo<int (__stdcall*)(void *,void *)>(char *)"}, -/* 104 */ { "??0?$Foo@P6GHPAX0@Z@@QAE@PAD@Z", "__thiscall Foo<int (__stdcall*)(void *,void *)>::Foo<int (__stdcall*)(void *,void *)>(char *)", NULL, 0x880}, +/* 104 */ { "??0?$Foo@P6GHPAX0@Z@@QAE@PAD@Z", "__thiscall Foo<int (__stdcall*)(void *,void *)>::Foo<int (__stdcall*)(void *,void *)>(char *)", NULL, NULL, 0x880}, /* 105 */ { "?Qux@Bar@@0PAP6AHPAV1@AAH1PAH@ZA", "private: static int (__cdecl** Bar::Qux)(class Bar *,int &,int &,int *)" }, -/* 106 */ { "?Qux@Bar@@0PAP6AHPAV1@AAH1PAH@ZA", "Bar::Qux", NULL, 0x1800}, +/* 106 */ { "?Qux@Bar@@0PAP6AHPAV1@AAH1PAH@ZA", "Bar::Qux", NULL, NULL, 0x1800}, /* 107 */ {"?$AAA@$DBAB@", "AAA<`template-parameter257'>"}, /* 108 */ {"?$AAA@?C@", "AAA<`template-parameter-2'>"}, /* 109 */ {"?$AAA@PAUBBB@@", "AAA<struct BBB *>"}, @@ -1281,11 +1288,11 @@ static void test_demangle(void) /* 125 */ {"?_dispatch@_impl_Engine@SalomeApp@@$R4CE@BA@PPPPPPPM@7AE_NAAVomniCallHandle@@@Z", "[thunk]:public: virtual bool __thiscall SalomeApp::_impl_Engine::_dispatch`vtordispex{36,16,4294967292,8}' (class omniCallHandle &)", "?_dispatch@_impl_Engine@SalomeApp@@$R4CE@BA@PPPPPPPM@7AE_NAAVomniCallHandle@@@Z"}, -/* 126 */ {"?_Doraise@bad_cast@std@@MEBAXXZ", "protected: virtual void __cdecl std::bad_cast::_Doraise(void)", NULL, 0x60}, -/* 127 */ {"??Xstd@@YAAEAV?$complex@M@0@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@bad_cast@std@@MEBAXXZ", "protected: virtual void __cdecl std::bad_cast::_Doraise(void)", NULL, NULL, 0x60}, +/* 127 */ {"??Xstd@@YAAEAV?$complex@M@0@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@M@0@AEAV10@AEBV10@@Z", "class std::complex<float> & std::operator*=(class std::complex<float> &,class std::complex<float> const &)", - "??Xstd@@YAAEAV?$complex@M@0@AEAV10@AEBV10@@Z", 2}, + "??Xstd@@YAAEAV?$complex@M@0@AEAV10@AEBV10@@Z", NULL, 2}, /* 129 */ {"??$run@XVTask_Render_Preview@@@QtConcurrent@@YA?AV?$QFuture@X@@PEAVTask_Render_Preview@@P82@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@XVTask_Render_Preview@@@QtConcurrent@@YA?AV?$QFuture@X@@PEAVTask_Render_Preview@@P82@EAAXXZ@Z"}, @@ -1298,6 +1305,8 @@ static void test_demangle(void) /* 136 */ {"??$?0AEAVzzz@BB4@AA@@AEAV012@$0A@@?$pair@Vzzz@BB4@AA@@V123@@std@@QEAA@AEAVzzz@BB4@AA@@0@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@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;