[libcxx-commits] [libcxxabi] b03f175 - [demangler] More properly save and restore the template parameter state
Richard Smith via libcxx-commits
libcxx-commits at lists.llvm.org
Thu Jul 9 21:13:06 PDT 2020
Author: Richard Smith
Date: 2020-07-09T21:12:51-07:00
New Revision: b03f1756fb4fd5ac5d606a7e4fd8aea1d9f18541
URL: https://github.com/llvm/llvm-project/commit/b03f1756fb4fd5ac5d606a7e4fd8aea1d9f18541
DIFF: https://github.com/llvm/llvm-project/commit/b03f1756fb4fd5ac5d606a7e4fd8aea1d9f18541.diff
LOG: [demangler] More properly save and restore the template parameter state
when parsing an encoding.
Added:
Modified:
libcxxabi/src/demangle/ItaniumDemangle.h
libcxxabi/test/test_demangle.pass.cpp
llvm/include/llvm/Demangle/ItaniumDemangle.h
Removed:
################################################################################
diff --git a/libcxxabi/src/demangle/ItaniumDemangle.h b/libcxxabi/src/demangle/ItaniumDemangle.h
index 0f81675f244d..6ab873218386 100644
--- a/libcxxabi/src/demangle/ItaniumDemangle.h
+++ b/libcxxabi/src/demangle/ItaniumDemangle.h
@@ -5096,7 +5096,21 @@ Node *AbstractManglingParser<Derived, Alloc>::parseSpecialName() {
// ::= <special-name>
template <typename Derived, typename Alloc>
Node *AbstractManglingParser<Derived, Alloc>::parseEncoding() {
- ScopedTemplateParamList EncodingTemplateParams(this);
+ // The template parameters of an encoding are unrelated to those of the
+ // enclosing context.
+ class SaveTemplateParams {
+ AbstractManglingParser *Parser;
+ decltype(TemplateParams) OldParams;
+
+ public:
+ SaveTemplateParams(AbstractManglingParser *Parser) : Parser(Parser) {
+ OldParams = std::move(Parser->TemplateParams);
+ Parser->TemplateParams.clear();
+ }
+ ~SaveTemplateParams() {
+ Parser->TemplateParams = std::move(OldParams);
+ }
+ } SaveTemplateParams(this);
if (look() == 'G' || look() == 'T')
return getDerived().parseSpecialName();
diff --git a/libcxxabi/test/test_demangle.pass.cpp b/libcxxabi/test/test_demangle.pass.cpp
index b8b2ad51a994..ef75b61a94af 100644
--- a/libcxxabi/test/test_demangle.pass.cpp
+++ b/libcxxabi/test/test_demangle.pass.cpp
@@ -29796,6 +29796,7 @@ const char* cases[][2] =
// FIXME: This is wrong, should demangle to the same as the previous entry.
// See https://github.com/itanium-cxx-abi/cxx-abi/issues/106.
{"_ZN1XIZ1fIiEvOT_EUlS2_DpT0_E_EclIJEEEvDpT_", "void X<void f<int>(int&&)::'lambda'(int&&, auto...)>::operator()<>()"},
+ {"_ZZZZN6abcdef9abcdefghi29abcdefabcdefabcdefabcefabcdef27xxxxxxxxxxxxxxxxxxxxxxxxxxxEN4absl8DurationERKNSt3__u12basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEEPNS1_19yyyyyyyyyyyyyyyyyyyEENK3$_5clEvENKUlvE_clEvE6zzzzzz", "abcdef::abcdefghi::abcdefabcdefabcdefabcefabcdef::xxxxxxxxxxxxxxxxxxxxxxxxxxx(absl::Duration, std::__u::basic_string<char, std::__u::char_traits<char>, std::__u::allocator<char> > const&, abcdef::abcdefghi::abcdefabcdefabcdefabcefabcdef::yyyyyyyyyyyyyyyyyyy*)::$_5::operator()() const::'lambda'()::operator()() const::zzzzzz"},
// FIXME: This is wrong; the S2_ backref should expand to OT_ and then to
// "double&&". But we can't cope with a substitution that represents a
diff --git a/llvm/include/llvm/Demangle/ItaniumDemangle.h b/llvm/include/llvm/Demangle/ItaniumDemangle.h
index 0f81675f244d..6ab873218386 100644
--- a/llvm/include/llvm/Demangle/ItaniumDemangle.h
+++ b/llvm/include/llvm/Demangle/ItaniumDemangle.h
@@ -5096,7 +5096,21 @@ Node *AbstractManglingParser<Derived, Alloc>::parseSpecialName() {
// ::= <special-name>
template <typename Derived, typename Alloc>
Node *AbstractManglingParser<Derived, Alloc>::parseEncoding() {
- ScopedTemplateParamList EncodingTemplateParams(this);
+ // The template parameters of an encoding are unrelated to those of the
+ // enclosing context.
+ class SaveTemplateParams {
+ AbstractManglingParser *Parser;
+ decltype(TemplateParams) OldParams;
+
+ public:
+ SaveTemplateParams(AbstractManglingParser *Parser) : Parser(Parser) {
+ OldParams = std::move(Parser->TemplateParams);
+ Parser->TemplateParams.clear();
+ }
+ ~SaveTemplateParams() {
+ Parser->TemplateParams = std::move(OldParams);
+ }
+ } SaveTemplateParams(this);
if (look() == 'G' || look() == 'T')
return getDerived().parseSpecialName();
More information about the libcxx-commits
mailing list