Skip to content

Commit c0e3e24

Browse files
committed
Fix incorrect demangling of call operator of lambda with explicit
template parameters due to registering template parameters twice. git-svn-id: https://llvm.org/svn/llvm-project/libcxxabi/trunk@371469 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 2daf732 commit c0e3e24

File tree

2 files changed

+6
-5
lines changed

2 files changed

+6
-5
lines changed

src/demangle/ItaniumDemangle.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2358,9 +2358,6 @@ template <typename Derived, typename Alloc> struct AbstractManglingParser {
23582358
assert(Parser->TemplateParams.size() >= OldNumTemplateParamLists);
23592359
Parser->TemplateParams.dropBack(OldNumTemplateParamLists);
23602360
}
2361-
void push_back(Node *Param) {
2362-
Params.push_back(Param);
2363-
}
23642361
};
23652362

23662363
// Template parameter table. Like the above, but referenced like "T42_".
@@ -2702,7 +2699,6 @@ AbstractManglingParser<Derived, Alloc>::parseUnnamedTypeName(NameState *State) {
27022699
Node *T = parseTemplateParamDecl();
27032700
if (!T)
27042701
return nullptr;
2705-
LambdaTemplateParams.push_back(T);
27062702
Names.push_back(T);
27072703
}
27082704
NodeArray TempParams = popTrailingNodeArray(ParamsBegin);

test/test_demangle.pass.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29784,9 +29784,14 @@ const char* cases[][2] =
2978429784
{"_ZNK1xMUlTyT_E_clIiEEDaS_", "auto x::'lambda'<typename $T>($T)::operator()<int>(x) const"},
2978529785
{"_ZNK1xMUlTnPA3_ivE_clILS0_0EEEDav", "auto x::'lambda'<int (*$N) [3]>()::operator()<(int [3])0>() const"},
2978629786
{"_ZNK1xMUlTyTtTyTnT_TpTnPA3_TL0__ETpTyvE_clIi1XJfEEEDav", "auto x::'lambda'<typename $T, template<typename $T0, $T $N, $T0 (*...$N0) [3]> typename $TT, typename ...$T1>()::operator()<int, X, float>() const"},
29787-
{"_ZN1AIiE1fIfEEvDTLUlTyTtTyTnTL1__ETL0_1_T_TL0__E_EE", "void A<int>::f<float>(decltype([]<typename $T, template<typename $T0, $T0 $N> typename $TT>($TT, float, $T){...}))"},
29787+
{"_ZN1AIiE1fIfEEvDTLUlTyTtTyTnTL1__ETL0_1_T_TL0__E_EE", "void A<int>::f<float>(decltype([]<typename $T, template<typename $T0, $T0 $N> typename $TT>(auto, float, $T){...}))"},
2978829788
{"_ZN1S1fILb1EEEv1XILUlvE_EE", "void S::f<true>(X<[](){...}>)"},
2978929789
{"_ZN1S1fILb1EEEv1XILUlvE0_EE", "void S::f<true>(X<[](){...}>)"},
29790+
// FIXME: Consider special-casing the call operator of a lambda and
29791+
// producing something like
29792+
// "auto inline_func()::'lambda'<int, int>(int, int) const"
29793+
{"_ZZ11inline_funcvENKUlTyTyT_T0_E_clIiiEEDaS_S0_", "auto inline_func()::'lambda'<typename $T, typename $T0>($T, $T0)::operator()<int, int>($T, $T0) const"},
29794+
{"_ZZ11inline_funcvENKUlTyTyT_T1_T0_E_clIiiiEEDaS_S0_S1_", "auto inline_func()::'lambda'<typename $T, typename $T0>($T, auto, $T0)::operator()<int, int, int>($T, auto, $T0) const"},
2979029795
};
2979129796

2979229797
const unsigned N = sizeof(cases) / sizeof(cases[0]);

0 commit comments

Comments
 (0)