[PATCH] D123305: [demangler] Fold expressions of .* and ->*
Nathan Sidwell via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 7 06:10:54 PDT 2022
urnathan created this revision.
urnathan added reviewers: dblaikie, libc++abi, iains.
Herald added a project: All.
urnathan requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
(Exitingly) a fold expression's operators include .* and ->*, but we failed to demangle them as we categorize those as MemberExprs, not BinaryExprs.
There is existing practice in the demangler to go looking at the actual token to perform specific actions, hence the peeking of the '*' char to distingish between MemberExpr alternatives here.
https://reviews.llvm.org/D123305
Files:
libcxxabi/src/demangle/ItaniumDemangle.h
libcxxabi/test/test_demangle.pass.cpp
llvm/include/llvm/Demangle/ItaniumDemangle.h
Index: llvm/include/llvm/Demangle/ItaniumDemangle.h
===================================================================
--- llvm/include/llvm/Demangle/ItaniumDemangle.h
+++ llvm/include/llvm/Demangle/ItaniumDemangle.h
@@ -4423,7 +4423,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();
Index: libcxxabi/test/test_demangle.pass.cpp
===================================================================
--- libcxxabi/test/test_demangle.pass.cpp
+++ libcxxabi/test/test_demangle.pass.cpp
@@ -29958,6 +29958,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&>(S&)"},
@@ -30168,6 +30170,9 @@
"_ZN1fIiEEvNTUt_E",
"_ZNDTUt_Ev",
+ "_Z1fIXfLpt1x1yEEvv",
+ "_Z1fIXfLdt1x1yEEvv",
+
"_ZN1fIXawLi0EEEEvv",
"_ZNWUt_3FOOEv",
Index: libcxxabi/src/demangle/ItaniumDemangle.h
===================================================================
--- libcxxabi/src/demangle/ItaniumDemangle.h
+++ libcxxabi/src/demangle/ItaniumDemangle.h
@@ -4423,7 +4423,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();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D123305.421178.patch
Type: text/x-patch
Size: 2070 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220407/34e7093c/attachment.bin>
More information about the llvm-commits
mailing list