Skip to content

Commit 522ed38

Browse files
committed
[ItaniumDemangle] Set InConstraintExpr to true when demangling a constraint expression
1 parent 07bef02 commit 522ed38

File tree

3 files changed

+21
-6
lines changed

3 files changed

+21
-6
lines changed

libcxxabi/src/demangle/ItaniumDemangle.h

Lines changed: 10 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,8 @@ 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(
4822+
HasIncompleteTemplateParameterTracking, true);
48224823
return getDerived().parseExpr();
48234824
}
48244825

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

@@ -5737,6 +5738,12 @@ Node *AbstractManglingParser<Derived, Alloc>::parseTemplateParamDecl(
57375738
}
57385739

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

libcxxabi/test/test_demangle.pass.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30137,6 +30137,7 @@ const char* cases[][2] =
3013730137
{"_ZZN5test71fIiEEvvENKUlTyQaa1CIT_E1CITL0__ET0_E0_clIiiEEDaS3_Qaa1CIDtfp_EELb1E", "auto void test7::f<int>()::'lambda0'<typename $T> requires C<T> && C<TL0_> (auto)::operator()<int, int>(auto) const requires C<decltype(fp)> && true"},
3013830138
{"_ZZN5test71fIiEEvvENKUlTyQaa1CIT_E1CITL0__ET0_E1_clIiiEEDaS3_Q1CIDtfp_EE", "auto void test7::f<int>()::'lambda1'<typename $T> requires C<T> && C<TL0_> (auto)::operator()<int, int>(auto) const requires C<decltype(fp)>"},
3013930139
{"_ZZN5test71fIiEEvvENKUlTyT0_E_clIiiEEDaS1_", "auto void test7::f<int>()::'lambda'<typename $T>(auto)::operator()<int, int>(auto) const"},
30140+
{"_ZN3FooIiE6methodITk4TrueIT_EiEEvS3_", "void Foo<int>::method<int>(T)"},
3014030141

3014130142
// C++20 requires expressions, see https://github.com/itanium-cxx-abi/cxx-abi/issues/24.
3014230143
{"_Z1fIiEviQrqXcvT__EXfp_Xeqfp_cvS0__EXplcvS0__ELi1ER5SmallXmicvS0__ELi1ENXmlcvS0__ELi2ENR11SmallerThanILi1234EETS0_T1XIS0_ETNS3_4typeETS2_IiEQ11SmallerThanIS0_Li256EEE", "void f<int>(int) requires requires { (T)(); fp; fp == (T)(); {(T)() + 1} -> Small; {(T)() - 1} noexcept; {(T)() * 2} noexcept -> SmallerThan<1234>; typename T; typename X<T>; typename X<T>::type; typename X<int>; requires SmallerThan<T, 256>; }"},

llvm/include/llvm/Demangle/ItaniumDemangle.h

Lines changed: 10 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,8 @@ 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(
4822+
HasIncompleteTemplateParameterTracking, true);
48224823
return getDerived().parseExpr();
48234824
}
48244825

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

@@ -5737,6 +5738,12 @@ Node *AbstractManglingParser<Derived, Alloc>::parseTemplateParamDecl(
57375738
}
57385739

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

0 commit comments

Comments
 (0)