Skip to content

Commit 36aabbe

Browse files
committed
[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](#89914).
1 parent 07bef02 commit 36aabbe

File tree

3 files changed

+21
-6
lines changed

3 files changed

+21
-6
lines changed

libcxxabi/src/demangle/ItaniumDemangle.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2677,7 +2677,7 @@ template <typename Derived, typename Alloc> struct AbstractManglingParser {
26772677

26782678
bool TryToParseTemplateArgs = true;
26792679
bool PermitForwardTemplateReferences = false;
2680-
bool InConstraintExpr = false;
2680+
bool HasIncompleteTemplateParameterTracking = false;
26812681
size_t ParsingLambdaParamsAtLevel = (size_t)-1;
26822682

26832683
unsigned NumSyntheticTemplateParameters[3] = {};
@@ -4818,7 +4818,7 @@ template <typename Derived, typename Alloc>
48184818
Node *AbstractManglingParser<Derived, Alloc>::parseConstraintExpr() {
48194819
// Within this expression, all enclosing template parameter lists are in
48204820
// scope.
4821-
ScopedOverride<bool> SaveInConstraintExpr(InConstraintExpr, true);
4821+
ScopedOverride<bool> SaveIncompleteTemplateParameterTracking(HasIncompleteTemplateParameterTracking, true);
48224822
return getDerived().parseExpr();
48234823
}
48244824

@@ -5676,7 +5676,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseTemplateParam() {
56765676
// substitute them all within a <constraint-expression>, so print the
56775677
// parameter numbering instead for now.
56785678
// TODO: Track all enclosing template parameters and substitute them here.
5679-
if (InConstraintExpr) {
5679+
if (HasIncompleteTemplateParameterTracking) {
56805680
return make<NameType>(std::string_view(Begin, First - 1 - Begin));
56815681
}
56825682

@@ -5737,6 +5737,12 @@ Node *AbstractManglingParser<Derived, Alloc>::parseTemplateParamDecl(
57375737
}
57385738

57395739
if (consumeIf("Tk")) {
5740+
// We don't track enclosing template parameter levels well enough to reliably
5741+
// demangle template parameter substitutions, so print an arbitrary
5742+
// string in place of a parameter for now.
5743+
// TODO: Track all enclosing template parameters and demangle substitutions.
5744+
ScopedOverride<bool> SaveIncompleteTemplateParameterTrackingExpr(
5745+
HasIncompleteTemplateParameterTracking, true);
57405746
Node *Constraint = getDerived().parseName();
57415747
if (!Constraint)
57425748
return nullptr;

llvm/include/llvm/Demangle/ItaniumDemangle.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2677,7 +2677,7 @@ template <typename Derived, typename Alloc> struct AbstractManglingParser {
26772677

26782678
bool TryToParseTemplateArgs = true;
26792679
bool PermitForwardTemplateReferences = false;
2680-
bool InConstraintExpr = false;
2680+
bool HasIncompleteTemplateParameterTracking = false;
26812681
size_t ParsingLambdaParamsAtLevel = (size_t)-1;
26822682

26832683
unsigned NumSyntheticTemplateParameters[3] = {};
@@ -4818,7 +4818,7 @@ template <typename Derived, typename Alloc>
48184818
Node *AbstractManglingParser<Derived, Alloc>::parseConstraintExpr() {
48194819
// Within this expression, all enclosing template parameter lists are in
48204820
// scope.
4821-
ScopedOverride<bool> SaveInConstraintExpr(InConstraintExpr, true);
4821+
ScopedOverride<bool> SaveIncompleteTemplateParameterTracking(HasIncompleteTemplateParameterTracking, true);
48224822
return getDerived().parseExpr();
48234823
}
48244824

@@ -5676,7 +5676,7 @@ Node *AbstractManglingParser<Derived, Alloc>::parseTemplateParam() {
56765676
// substitute them all within a <constraint-expression>, so print the
56775677
// parameter numbering instead for now.
56785678
// TODO: Track all enclosing template parameters and substitute them here.
5679-
if (InConstraintExpr) {
5679+
if (HasIncompleteTemplateParameterTracking) {
56805680
return make<NameType>(std::string_view(Begin, First - 1 - Begin));
56815681
}
56825682

@@ -5737,6 +5737,12 @@ Node *AbstractManglingParser<Derived, Alloc>::parseTemplateParamDecl(
57375737
}
57385738

57395739
if (consumeIf("Tk")) {
5740+
// We don't track enclosing template parameter levels well enough to reliably
5741+
// demangle template parameter substitutions, so print an arbitrary
5742+
// string in place of a parameter for now.
5743+
// TODO: Track all enclosing template parameters and demangle substitutions.
5744+
ScopedOverride<bool> SaveIncompleteTemplateParameterTrackingExpr(
5745+
HasIncompleteTemplateParameterTracking, true);
57405746
Node *Constraint = getDerived().parseName();
57415747
if (!Constraint)
57425748
return nullptr;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
RUN: llvm-cxxfilt -n _ZN3FooIiE6methodITk4TrueIT_EiEEvS3_ | FileCheck %s
2+
3+
CHECK: void Foo<int>::method<int>(T)

0 commit comments

Comments
 (0)