diff options
author | Max Winkler <max.enrico.winkler@gmail.com> | 2024-07-04 10:17:32 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-04 10:17:32 -0700 |
commit | d1dc4169838381688a74f245cdaedbe9fce13848 (patch) | |
tree | d162c82bc14d163133be58dca6a20e006b796579 /llvm/lib/Demangle/MicrosoftDemangle.cpp | |
parent | 4f77677c3b383da99e46fdb29e7b8de63eb72447 (diff) | |
download | llvm-d1dc4169838381688a74f245cdaedbe9fce13848.zip llvm-d1dc4169838381688a74f245cdaedbe9fce13848.tar.gz llvm-d1dc4169838381688a74f245cdaedbe9fce13848.tar.bz2 |
Fix MSVC 1920+ auto NTTP mangling for pointers to members (#97007)
Fixes https://github.com/llvm/llvm-project/issues/70899.
This is a continuation of
https://github.com/llvm/llvm-project/pull/92477 for pointers to member
data and pointers to member functions.
The mangled name must be prefixed with `$M <mangled-type>` for the
deduced type of the nttp parameter.
Diffstat (limited to 'llvm/lib/Demangle/MicrosoftDemangle.cpp')
-rw-r--r-- | llvm/lib/Demangle/MicrosoftDemangle.cpp | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/llvm/lib/Demangle/MicrosoftDemangle.cpp b/llvm/lib/Demangle/MicrosoftDemangle.cpp index e18de9a..c5835e8 100644 --- a/llvm/lib/Demangle/MicrosoftDemangle.cpp +++ b/llvm/lib/Demangle/MicrosoftDemangle.cpp @@ -2343,12 +2343,13 @@ Demangler::demangleTemplateParameterList(std::string_view &MangledName) { TP.N = TPRN = Arena.alloc<TemplateParameterReferenceNode>(); TPRN->Symbol = parse(MangledName); TPRN->Affinity = PointerAffinity::Reference; - } else if (llvm::itanium_demangle::starts_with(MangledName, "$F") || - llvm::itanium_demangle::starts_with(MangledName, "$G")) { + } else if (startsWith(MangledName, "$F", "F", !IsAutoNTTP) || + startsWith(MangledName, "$G", "G", !IsAutoNTTP)) { TP.N = TPRN = Arena.alloc<TemplateParameterReferenceNode>(); // Data member pointer. - MangledName.remove_prefix(1); + if (!IsAutoNTTP) + MangledName.remove_prefix(1); // Remove leading '$' char InheritanceSpecifier = MangledName.front(); MangledName.remove_prefix(1); |