From cfc467d4c04f79b331a0febf0e840b254dbdfbb6 Mon Sep 17 00:00:00 2001 From: Viktoriia Bakalova Date: Tue, 10 Sep 2024 09:40:03 +0000 Subject: [PATCH] [ItaniumDemangle] Set InConstraintExpr to true when demangling a constraint expression. This prevents demangler failures until the TODO in the [demangler](https://github.com/llvm/llvm-project/blob/3e070906eff720dc44aee86e533e12aafc8bb14b/llvm/include/llvm/Demangle/ItaniumDemangle.h#L5678) is implemented. This is a temporary fix for [#89914](https://github.com/llvm/llvm-project/issues/89914). --- libcxxabi/src/demangle/ItaniumDemangle.h | 13 ++++++++++--- llvm/include/llvm/Demangle/ItaniumDemangle.h | 13 ++++++++++--- .../llvm-cxxfilt/demangle-constrained-template.test | 3 +++ 3 files changed, 23 insertions(+), 6 deletions(-) create mode 100644 llvm/test/tools/llvm-cxxfilt/demangle-constrained-template.test diff --git a/libcxxabi/src/demangle/ItaniumDemangle.h b/libcxxabi/src/demangle/ItaniumDemangle.h index 88de234a6e0b92..3b041efe3aac00 100644 --- a/libcxxabi/src/demangle/ItaniumDemangle.h +++ b/libcxxabi/src/demangle/ItaniumDemangle.h @@ -2677,7 +2677,7 @@ template struct AbstractManglingParser { bool TryToParseTemplateArgs = true; bool PermitForwardTemplateReferences = false; - bool InConstraintExpr = false; + bool HasIncompleteTemplateParameterTracking = false; size_t ParsingLambdaParamsAtLevel = (size_t)-1; unsigned NumSyntheticTemplateParameters[3] = {}; @@ -4818,7 +4818,8 @@ template Node *AbstractManglingParser::parseConstraintExpr() { // Within this expression, all enclosing template parameter lists are in // scope. - ScopedOverride SaveInConstraintExpr(InConstraintExpr, true); + ScopedOverride SaveIncompleteTemplateParameterTracking( + HasIncompleteTemplateParameterTracking, true); return getDerived().parseExpr(); } @@ -5676,7 +5677,7 @@ Node *AbstractManglingParser::parseTemplateParam() { // substitute them all within a , so print the // parameter numbering instead for now. // TODO: Track all enclosing template parameters and substitute them here. - if (InConstraintExpr) { + if (HasIncompleteTemplateParameterTracking) { return make(std::string_view(Begin, First - 1 - Begin)); } @@ -5737,6 +5738,12 @@ Node *AbstractManglingParser::parseTemplateParamDecl( } if (consumeIf("Tk")) { + // We don't track enclosing template parameter levels well enough to + // reliably demangle template parameter substitutions, so print an arbitrary + // string in place of a parameter for now. + // TODO: Track all enclosing template parameters and demangle substitutions. + ScopedOverride SaveIncompleteTemplateParameterTrackingExpr( + HasIncompleteTemplateParameterTracking, true); Node *Constraint = getDerived().parseName(); if (!Constraint) return nullptr; diff --git a/llvm/include/llvm/Demangle/ItaniumDemangle.h b/llvm/include/llvm/Demangle/ItaniumDemangle.h index fb2060fa07f724..0af0224bc83fa8 100644 --- a/llvm/include/llvm/Demangle/ItaniumDemangle.h +++ b/llvm/include/llvm/Demangle/ItaniumDemangle.h @@ -2677,7 +2677,7 @@ template struct AbstractManglingParser { bool TryToParseTemplateArgs = true; bool PermitForwardTemplateReferences = false; - bool InConstraintExpr = false; + bool HasIncompleteTemplateParameterTracking = false; size_t ParsingLambdaParamsAtLevel = (size_t)-1; unsigned NumSyntheticTemplateParameters[3] = {}; @@ -4818,7 +4818,8 @@ template Node *AbstractManglingParser::parseConstraintExpr() { // Within this expression, all enclosing template parameter lists are in // scope. - ScopedOverride SaveInConstraintExpr(InConstraintExpr, true); + ScopedOverride SaveIncompleteTemplateParameterTracking( + HasIncompleteTemplateParameterTracking, true); return getDerived().parseExpr(); } @@ -5676,7 +5677,7 @@ Node *AbstractManglingParser::parseTemplateParam() { // substitute them all within a , so print the // parameter numbering instead for now. // TODO: Track all enclosing template parameters and substitute them here. - if (InConstraintExpr) { + if (HasIncompleteTemplateParameterTracking) { return make(std::string_view(Begin, First - 1 - Begin)); } @@ -5737,6 +5738,12 @@ Node *AbstractManglingParser::parseTemplateParamDecl( } if (consumeIf("Tk")) { + // We don't track enclosing template parameter levels well enough to + // reliably demangle template parameter substitutions, so print an arbitrary + // string in place of a parameter for now. + // TODO: Track all enclosing template parameters and demangle substitutions. + ScopedOverride SaveIncompleteTemplateParameterTrackingExpr( + HasIncompleteTemplateParameterTracking, true); Node *Constraint = getDerived().parseName(); if (!Constraint) return nullptr; diff --git a/llvm/test/tools/llvm-cxxfilt/demangle-constrained-template.test b/llvm/test/tools/llvm-cxxfilt/demangle-constrained-template.test new file mode 100644 index 00000000000000..7a038ebb77a06d --- /dev/null +++ b/llvm/test/tools/llvm-cxxfilt/demangle-constrained-template.test @@ -0,0 +1,3 @@ +RUN: llvm-cxxfilt -n _ZN3FooIiE6methodITk4TrueIT_EiEEvS3_ | FileCheck %s + +CHECK: void Foo::method(T) \ No newline at end of file