diff --git a/libcxxabi/src/demangle/ItaniumDemangle.h b/libcxxabi/src/demangle/ItaniumDemangle.h --- a/libcxxabi/src/demangle/ItaniumDemangle.h +++ b/libcxxabi/src/demangle/ItaniumDemangle.h @@ -4447,7 +4447,11 @@ ++First; const auto *Op = parseOperatorEncoding(); - if (!Op || Op->getKind() != OperatorInfo::Binary) + if (!Op) + return nullptr; + if (!(Op->getKind() == OperatorInfo::Binary + || (Op->getKind() == OperatorInfo::Member + && Op->getName().back() == '*'))) return nullptr; Node *Pack = getDerived().parseExpr(); diff --git a/libcxxabi/test/test_demangle.pass.cpp b/libcxxabi/test/test_demangle.pass.cpp --- a/libcxxabi/test/test_demangle.pass.cpp +++ b/libcxxabi/test/test_demangle.pass.cpp @@ -29963,6 +29963,8 @@ "void Partial<1, 2>::foldr<3, 4>(A<1 + (2 + ((3, 4) + ... + (1 + (2 + ((3, 4) + ...)))))>)"}, {"_ZN7PartialIJLi1ELi2EEE5foldrIJLi3ELi4EEEEv1AIXplplLi1ELi2EfRplT_plplLi1ELi2EflplT_EE", "void Partial<1, 2>::foldr<3, 4>(A<1 + 2 + ((3, 4) + ... + (1 + 2 + (... + (3, 4))))>)"}, + {"_Z1fIXfLpm1x1yEEvv", "void f<(x ->* ... ->* (y...))>()"}, + {"_Z1fIXfLds1x1yEEvv", "void f<(x .* ... .* (y...))>()"}, // reference collapsing: {"_Z1fIR1SEiOT_", "int f(S&)"}, @@ -30173,6 +30175,9 @@ "_ZN1fIiEEvNTUt_E", "_ZNDTUt_Ev", + "_Z1fIXfLpt1x1yEEvv", + "_Z1fIXfLdt1x1yEEvv", + "_ZN1fIXawLi0EEEEvv", "_ZNWUt_3FOOEv", diff --git a/llvm/include/llvm/Demangle/ItaniumDemangle.h b/llvm/include/llvm/Demangle/ItaniumDemangle.h --- a/llvm/include/llvm/Demangle/ItaniumDemangle.h +++ b/llvm/include/llvm/Demangle/ItaniumDemangle.h @@ -4447,7 +4447,11 @@ ++First; const auto *Op = parseOperatorEncoding(); - if (!Op || Op->getKind() != OperatorInfo::Binary) + if (!Op) + return nullptr; + if (!(Op->getKind() == OperatorInfo::Binary + || (Op->getKind() == OperatorInfo::Member + && Op->getName().back() == '*'))) return nullptr; Node *Pack = getDerived().parseExpr();