Eric Pouech : msvcrt: Add support for C++11 operator "" in demangling.
Alexandre Julliard
julliard at winehq.org
Mon Jul 18 15:45:50 CDT 2022
Module: wine
Branch: master
Commit: e0b6ceeaacc0846b1853689a7e50c643f46f6434
URL: https://gitlab.winehq.org/wine/wine/-/commit/e0b6ceeaacc0846b1853689a7e50c643f46f6434
Author: Eric Pouech <eric.pouech at gmail.com>
Date: Sat Jul 16 12:20:25 2022 +0200
msvcrt: Add support for C++11 operator "" in demangling.
Signed-off-by: Eric Pouech <eric.pouech at gmail.com>
---
dlls/msvcrt/undname.c | 13 +++++++++++++
dlls/ucrtbase/tests/cpp.c | 31 ++++++++++++++++++-------------
2 files changed, 31 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..a22138889cb 100644
--- a/dlls/ucrtbase/tests/cpp.c
+++ b/dlls/ucrtbase/tests/cpp.c
@@ -192,19 +192,24 @@ 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; const char *broken;} 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 at Z", "struct CC __cdecl operator \"\" _l(unsigned int)",
+ "??__K_l@@YA?AUCC@@I at Z" /* W10 1507 fails on this :-( */},
+ };
+ 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) ||
+ (broken(und_tests[i].broken && !strcmp(und_tests[i].broken, name))),
+ "unDName returned %s for #%u\n", wine_dbgstr_a(name), i);
+ free(name);
+ }
}
START_TEST(cpp)
More information about the wine-cvs
mailing list