From: Eric Pouech eric.pouech@gmail.com
Signed-off-by: Eric Pouech eric.pouech@gmail.com --- dlls/msvcrt/undname.c | 13 +++++++++++++ dlls/ucrtbase/tests/cpp.c | 28 +++++++++++++++------------- 2 files changed, 28 insertions(+), 13 deletions(-)
diff --git a/dlls/msvcrt/undname.c b/dlls/msvcrt/undname.c index d71738efd5f..b07fbeb068e 100644 --- a/dlls/msvcrt/undname.c +++ b/dlls/msvcrt/undname.c @@ -1488,6 +1488,19 @@ static BOOL symbol_demangle(struct parsed_symbol* sym) case 'V': function_name = "operator delete[]"; break; case 'X': function_name = "`placement delete closure'"; break; case 'Y': function_name = "`placement delete[] closure'"; break; + case '_': + switch (*++sym->current) + { + case 'K': + sym->current++; + function_name = str_printf(sym, "operator "" %s", get_literal_string(sym)); + --sym->current; + break; + default: + FIXME("Unknown operator: __%c\n", *sym->current); + return FALSE; + } + break; default: ERR("Unknown operator: _%c\n", *sym->current); return FALSE; diff --git a/dlls/ucrtbase/tests/cpp.c b/dlls/ucrtbase/tests/cpp.c index 77b06e7cd42..fcc95629f7e 100644 --- a/dlls/ucrtbase/tests/cpp.c +++ b/dlls/ucrtbase/tests/cpp.c @@ -192,19 +192,21 @@ static void test___std_type_info(void)
static void test___unDName(void) { - char *name; - - name = p___unDName(0, "??4QDnsDomainNameRecord@@QAEAAV0@$$QAV0@@Z", 0, malloc, free, 0); - ok(!strcmp(name, "public: class QDnsDomainNameRecord & __thiscall " - "QDnsDomainNameRecord::operator=(class QDnsDomainNameRecord &&)"), - "unDName returned %s\n", wine_dbgstr_a(name)); - free(name); - - name = p___unDName(0, "??4QDnsDomainNameRecord@@QAEAAV0@$$QEAV0@@Z", 0, malloc, free, 0); - ok(!strcmp(name, "public: class QDnsDomainNameRecord & __thiscall " - "QDnsDomainNameRecord::operator=(class QDnsDomainNameRecord && __ptr64)"), - "unDName returned %s\n", wine_dbgstr_a(name)); - free(name); + static struct {const char *in; const char *out;} und_tests[] = + { +/* 1 */ {"??4QDnsDomainNameRecord@@QAEAAV0@$$QAV0@@Z", + "public: class QDnsDomainNameRecord & __thiscall QDnsDomainNameRecord::operator=(class QDnsDomainNameRecord &&)"}, +/* 2 */ {"??4QDnsDomainNameRecord@@QAEAAV0@$$QEAV0@@Z", + "public: class QDnsDomainNameRecord & __thiscall QDnsDomainNameRecord::operator=(class QDnsDomainNameRecord && __ptr64)"}, +/* 3 */ {"??__K_l@@YA?AUCC@@I@Z", "struct CC __cdecl operator "" _l(unsigned int)"}, + }; + unsigned i; + for (i = 0; i < ARRAY_SIZE(und_tests); i++) + { + char *name = p___unDName(0, und_tests[i].in, 0, malloc, free, 0); + ok(!strcmp(name, und_tests[i].out), "unDName returned %s for #%u\n", wine_dbgstr_a(name), i); + free(name); + } }
START_TEST(cpp)