summaryrefslogtreecommitdiff
path: root/libcxxabi
diff options
context:
space:
mode:
authorMichael Buch <michaelbuch12@gmail.com>2023-03-07 13:18:07 +0000
committerMichael Buch <michaelbuch12@gmail.com>2023-03-19 11:03:54 +0000
commit4601bcdb7ed3168053aa6d70abedb17c3fffa0d2 (patch)
tree94fef7286b5d203ac5cab90db15e1df5a564d869 /libcxxabi
parent50b58e89a122fdc20616ad6d6dd3a802206454d2 (diff)
downloadllvm-4601bcdb7ed3168053aa6d70abedb17c3fffa0d2.tar.gz
[libcxxabi][Demangle] Don't drop ctor/dtor name for abi-tagged structures
Before this patch we would demangle abi-tagged structures as follows: ``` $ c++filt -n _ZN1SB5OuterC2Ev S[abi:Outer]:() $ c++filt -n _ZN1SB5OuterD2Ev S[abi:Outer]::~() ``` This is because `Node::getBaseName` was unimplemented for the `AbiTagAttr` node, which meant that when we tried printing `CtorDtorName` where its `Basename` `Node` was an `AbiTagAttr`, we'd drop the name. Addresses https://github.com/llvm/llvm-project/issues/61213 Differential Revision: https://reviews.llvm.org/D145492
Diffstat (limited to 'libcxxabi')
-rw-r--r--libcxxabi/src/demangle/ItaniumDemangle.h2
-rw-r--r--libcxxabi/test/test_demangle.pass.cpp2
2 files changed, 4 insertions, 0 deletions
diff --git a/libcxxabi/src/demangle/ItaniumDemangle.h b/libcxxabi/src/demangle/ItaniumDemangle.h
index 22a35a815299..fd66e9570e7a 100644
--- a/libcxxabi/src/demangle/ItaniumDemangle.h
+++ b/libcxxabi/src/demangle/ItaniumDemangle.h
@@ -544,6 +544,8 @@ struct AbiTagAttr : Node {
template<typename Fn> void match(Fn F) const { F(Base, Tag); }
+ StringView getBaseName() const override { return Base->getBaseName(); }
+
void printLeft(OutputBuffer &OB) const override {
Base->printLeft(OB);
OB += "[abi:";
diff --git a/libcxxabi/test/test_demangle.pass.cpp b/libcxxabi/test/test_demangle.pass.cpp
index 0607c4ef7efa..00592eede9a1 100644
--- a/libcxxabi/test/test_demangle.pass.cpp
+++ b/libcxxabi/test/test_demangle.pass.cpp
@@ -30112,6 +30112,8 @@ const char* cases[][2] =
"::basic_ostream()"},
{"_ZNSsC1Ev", "std::basic_string<char, std::char_traits<char>,"
" std::allocator<char>>::basic_string()"},
+ {"_ZN1SB8ctor_tagC2Ev", "S[abi:ctor_tag]::S()"},
+ {"_ZN1SB8ctor_tagD2Ev", "S[abi:ctor_tag]::~S()"},
};
const unsigned N = sizeof(cases) / sizeof(cases[0]);