[libcxx-commits] [libcxxabi] [llvm] [ItaniumDemangle] Add Named flag to "pm" operator (PR #136862)

Michael Buch via libcxx-commits libcxx-commits at lists.llvm.org
Fri Apr 25 02:21:57 PDT 2025


https://github.com/Michael137 updated https://github.com/llvm/llvm-project/pull/136862

>From e54c1cdd83bc0d8772d121b57006b6df18d80483 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Wed, 23 Apr 2025 14:17:45 +0100
Subject: [PATCH 1/4] [ItaniumDemangle] Remove Named flag from
 OperatorInfo::Member entries

---
 libcxxabi/src/demangle/ItaniumDemangle.h     | 11 ++++-------
 libcxxabi/test/test_demangle.pass.cpp        |  4 ++++
 llvm/include/llvm/Demangle/ItaniumDemangle.h | 11 ++++-------
 3 files changed, 12 insertions(+), 14 deletions(-)

diff --git a/libcxxabi/src/demangle/ItaniumDemangle.h b/libcxxabi/src/demangle/ItaniumDemangle.h
index 69932e63669bf..67cc4560f061d 100644
--- a/libcxxabi/src/demangle/ItaniumDemangle.h
+++ b/libcxxabi/src/demangle/ItaniumDemangle.h
@@ -3389,9 +3389,9 @@ const typename AbstractManglingParser<
     {"de", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator*"},
     {"dl", OperatorInfo::Del, /*Ary*/ false, Node::Prec::Unary,
      "operator delete"},
-    {"ds", OperatorInfo::Member, /*Named*/ false, Node::Prec::PtrMem,
+    {"ds", OperatorInfo::Member, false, Node::Prec::PtrMem,
      "operator.*"},
-    {"dt", OperatorInfo::Member, /*Named*/ false, Node::Prec::Postfix,
+    {"dt", OperatorInfo::Member, false, Node::Prec::Postfix,
      "operator."},
     {"dv", OperatorInfo::Binary, false, Node::Prec::Assign, "operator/"},
     {"eO", OperatorInfo::Binary, false, Node::Prec::Assign, "operator^="},
@@ -3421,11 +3421,11 @@ const typename AbstractManglingParser<
     {"or", OperatorInfo::Binary, false, Node::Prec::Ior, "operator|"},
     {"pL", OperatorInfo::Binary, false, Node::Prec::Assign, "operator+="},
     {"pl", OperatorInfo::Binary, false, Node::Prec::Additive, "operator+"},
-    {"pm", OperatorInfo::Member, /*Named*/ false, Node::Prec::PtrMem,
+    {"pm", OperatorInfo::Member, false, Node::Prec::PtrMem,
      "operator->*"},
     {"pp", OperatorInfo::Postfix, false, Node::Prec::Postfix, "operator++"},
     {"ps", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator+"},
-    {"pt", OperatorInfo::Member, /*Named*/ true, Node::Prec::Postfix,
+    {"pt", OperatorInfo::Member, false, Node::Prec::Postfix,
      "operator->"},
     {"qu", OperatorInfo::Conditional, false, Node::Prec::Conditional,
      "operator?"},
@@ -3499,9 +3499,6 @@ AbstractManglingParser<Derived, Alloc>::parseOperatorName(NameState *State) {
     if (Op->getKind() >= OperatorInfo::Unnameable)
       /* Not a nameable operator.  */
       return nullptr;
-    if (Op->getKind() == OperatorInfo::Member && !Op->getFlag())
-      /* Not a nameable MemberExpr */
-      return nullptr;
 
     return make<NameType>(Op->getName());
   }
diff --git a/libcxxabi/test/test_demangle.pass.cpp b/libcxxabi/test/test_demangle.pass.cpp
index 53da1bf6765e7..22b39fb06458d 100644
--- a/libcxxabi/test/test_demangle.pass.cpp
+++ b/libcxxabi/test/test_demangle.pass.cpp
@@ -30246,6 +30246,10 @@ const char* cases[][2] = {
 
     {"_Z3fooPU9__ptrauthILj3ELb1ELj234EEPi", "foo(int* __ptrauth<3u, true, 234u>*)"},
     {"_Z3fooIPU9__ptrauthILj1ELb0ELj64EEPiEvT_", "void foo<int* __ptrauth<1u, false, 64u>*>(int* __ptrauth<1u, false, 64u>*)"},
+
+    {"_ZN1CpmEi", "C::operator->*(int)"},
+    {"_ZN1CdtEi", "C::operator.(int)"},
+    {"_ZN1CdsEi", "C::operator.*(int)"},
     // clang-format on
 };
 
diff --git a/llvm/include/llvm/Demangle/ItaniumDemangle.h b/llvm/include/llvm/Demangle/ItaniumDemangle.h
index b4a4c72021fd1..f75e309b06e0a 100644
--- a/llvm/include/llvm/Demangle/ItaniumDemangle.h
+++ b/llvm/include/llvm/Demangle/ItaniumDemangle.h
@@ -3389,9 +3389,9 @@ const typename AbstractManglingParser<
     {"de", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator*"},
     {"dl", OperatorInfo::Del, /*Ary*/ false, Node::Prec::Unary,
      "operator delete"},
-    {"ds", OperatorInfo::Member, /*Named*/ false, Node::Prec::PtrMem,
+    {"ds", OperatorInfo::Member, false, Node::Prec::PtrMem,
      "operator.*"},
-    {"dt", OperatorInfo::Member, /*Named*/ false, Node::Prec::Postfix,
+    {"dt", OperatorInfo::Member, false, Node::Prec::Postfix,
      "operator."},
     {"dv", OperatorInfo::Binary, false, Node::Prec::Assign, "operator/"},
     {"eO", OperatorInfo::Binary, false, Node::Prec::Assign, "operator^="},
@@ -3421,11 +3421,11 @@ const typename AbstractManglingParser<
     {"or", OperatorInfo::Binary, false, Node::Prec::Ior, "operator|"},
     {"pL", OperatorInfo::Binary, false, Node::Prec::Assign, "operator+="},
     {"pl", OperatorInfo::Binary, false, Node::Prec::Additive, "operator+"},
-    {"pm", OperatorInfo::Member, /*Named*/ false, Node::Prec::PtrMem,
+    {"pm", OperatorInfo::Member, false, Node::Prec::PtrMem,
      "operator->*"},
     {"pp", OperatorInfo::Postfix, false, Node::Prec::Postfix, "operator++"},
     {"ps", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator+"},
-    {"pt", OperatorInfo::Member, /*Named*/ true, Node::Prec::Postfix,
+    {"pt", OperatorInfo::Member, false, Node::Prec::Postfix,
      "operator->"},
     {"qu", OperatorInfo::Conditional, false, Node::Prec::Conditional,
      "operator?"},
@@ -3499,9 +3499,6 @@ AbstractManglingParser<Derived, Alloc>::parseOperatorName(NameState *State) {
     if (Op->getKind() >= OperatorInfo::Unnameable)
       /* Not a nameable operator.  */
       return nullptr;
-    if (Op->getKind() == OperatorInfo::Member && !Op->getFlag())
-      /* Not a nameable MemberExpr */
-      return nullptr;
 
     return make<NameType>(Op->getName());
   }

>From 36e52b1eadabd6a5eae9b6efd7545422b33d2b37 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Wed, 23 Apr 2025 15:04:20 +0100
Subject: [PATCH 2/4] fixup! clang-format

---
 libcxxabi/src/demangle/ItaniumDemangle.h     | 12 ++++--------
 llvm/include/llvm/Demangle/ItaniumDemangle.h | 12 ++++--------
 2 files changed, 8 insertions(+), 16 deletions(-)

diff --git a/libcxxabi/src/demangle/ItaniumDemangle.h b/libcxxabi/src/demangle/ItaniumDemangle.h
index 67cc4560f061d..d8d79cd9c082e 100644
--- a/libcxxabi/src/demangle/ItaniumDemangle.h
+++ b/libcxxabi/src/demangle/ItaniumDemangle.h
@@ -3389,10 +3389,8 @@ const typename AbstractManglingParser<
     {"de", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator*"},
     {"dl", OperatorInfo::Del, /*Ary*/ false, Node::Prec::Unary,
      "operator delete"},
-    {"ds", OperatorInfo::Member, false, Node::Prec::PtrMem,
-     "operator.*"},
-    {"dt", OperatorInfo::Member, false, Node::Prec::Postfix,
-     "operator."},
+    {"ds", OperatorInfo::Member, false, Node::Prec::PtrMem, "operator.*"},
+    {"dt", OperatorInfo::Member, false, Node::Prec::Postfix, "operator."},
     {"dv", OperatorInfo::Binary, false, Node::Prec::Assign, "operator/"},
     {"eO", OperatorInfo::Binary, false, Node::Prec::Assign, "operator^="},
     {"eo", OperatorInfo::Binary, false, Node::Prec::Xor, "operator^"},
@@ -3421,12 +3419,10 @@ const typename AbstractManglingParser<
     {"or", OperatorInfo::Binary, false, Node::Prec::Ior, "operator|"},
     {"pL", OperatorInfo::Binary, false, Node::Prec::Assign, "operator+="},
     {"pl", OperatorInfo::Binary, false, Node::Prec::Additive, "operator+"},
-    {"pm", OperatorInfo::Member, false, Node::Prec::PtrMem,
-     "operator->*"},
+    {"pm", OperatorInfo::Member, false, Node::Prec::PtrMem, "operator->*"},
     {"pp", OperatorInfo::Postfix, false, Node::Prec::Postfix, "operator++"},
     {"ps", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator+"},
-    {"pt", OperatorInfo::Member, false, Node::Prec::Postfix,
-     "operator->"},
+    {"pt", OperatorInfo::Member, false, Node::Prec::Postfix, "operator->"},
     {"qu", OperatorInfo::Conditional, false, Node::Prec::Conditional,
      "operator?"},
     {"rM", OperatorInfo::Binary, false, Node::Prec::Assign, "operator%="},
diff --git a/llvm/include/llvm/Demangle/ItaniumDemangle.h b/llvm/include/llvm/Demangle/ItaniumDemangle.h
index f75e309b06e0a..51f697b539ada 100644
--- a/llvm/include/llvm/Demangle/ItaniumDemangle.h
+++ b/llvm/include/llvm/Demangle/ItaniumDemangle.h
@@ -3389,10 +3389,8 @@ const typename AbstractManglingParser<
     {"de", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator*"},
     {"dl", OperatorInfo::Del, /*Ary*/ false, Node::Prec::Unary,
      "operator delete"},
-    {"ds", OperatorInfo::Member, false, Node::Prec::PtrMem,
-     "operator.*"},
-    {"dt", OperatorInfo::Member, false, Node::Prec::Postfix,
-     "operator."},
+    {"ds", OperatorInfo::Member, false, Node::Prec::PtrMem, "operator.*"},
+    {"dt", OperatorInfo::Member, false, Node::Prec::Postfix, "operator."},
     {"dv", OperatorInfo::Binary, false, Node::Prec::Assign, "operator/"},
     {"eO", OperatorInfo::Binary, false, Node::Prec::Assign, "operator^="},
     {"eo", OperatorInfo::Binary, false, Node::Prec::Xor, "operator^"},
@@ -3421,12 +3419,10 @@ const typename AbstractManglingParser<
     {"or", OperatorInfo::Binary, false, Node::Prec::Ior, "operator|"},
     {"pL", OperatorInfo::Binary, false, Node::Prec::Assign, "operator+="},
     {"pl", OperatorInfo::Binary, false, Node::Prec::Additive, "operator+"},
-    {"pm", OperatorInfo::Member, false, Node::Prec::PtrMem,
-     "operator->*"},
+    {"pm", OperatorInfo::Member, false, Node::Prec::PtrMem, "operator->*"},
     {"pp", OperatorInfo::Postfix, false, Node::Prec::Postfix, "operator++"},
     {"ps", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator+"},
-    {"pt", OperatorInfo::Member, false, Node::Prec::Postfix,
-     "operator->"},
+    {"pt", OperatorInfo::Member, false, Node::Prec::Postfix, "operator->"},
     {"qu", OperatorInfo::Conditional, false, Node::Prec::Conditional,
      "operator?"},
     {"rM", OperatorInfo::Binary, false, Node::Prec::Assign, "operator%="},

>From c545ebd60097f92a426984a1870cb5e24fafaafd Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Fri, 25 Apr 2025 09:01:41 +0100
Subject: [PATCH 3/4] fixup! restore condition; mark "pm" as Named

---
 libcxxabi/src/demangle/ItaniumDemangle.h     | 15 +++++++++++----
 libcxxabi/test/test_demangle.pass.cpp        |  4 ++--
 llvm/include/llvm/Demangle/ItaniumDemangle.h | 15 +++++++++++----
 3 files changed, 24 insertions(+), 10 deletions(-)

diff --git a/libcxxabi/src/demangle/ItaniumDemangle.h b/libcxxabi/src/demangle/ItaniumDemangle.h
index d8d79cd9c082e..b8c7f9ecc8e06 100644
--- a/libcxxabi/src/demangle/ItaniumDemangle.h
+++ b/libcxxabi/src/demangle/ItaniumDemangle.h
@@ -3389,8 +3389,10 @@ const typename AbstractManglingParser<
     {"de", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator*"},
     {"dl", OperatorInfo::Del, /*Ary*/ false, Node::Prec::Unary,
      "operator delete"},
-    {"ds", OperatorInfo::Member, false, Node::Prec::PtrMem, "operator.*"},
-    {"dt", OperatorInfo::Member, false, Node::Prec::Postfix, "operator."},
+    {"ds", OperatorInfo::Member, /*Named*/ false, Node::Prec::PtrMem,
+     "operator.*"},
+    {"dt", OperatorInfo::Member, /*Named*/ false, Node::Prec::Postfix,
+     "operator."},
     {"dv", OperatorInfo::Binary, false, Node::Prec::Assign, "operator/"},
     {"eO", OperatorInfo::Binary, false, Node::Prec::Assign, "operator^="},
     {"eo", OperatorInfo::Binary, false, Node::Prec::Xor, "operator^"},
@@ -3419,10 +3421,12 @@ const typename AbstractManglingParser<
     {"or", OperatorInfo::Binary, false, Node::Prec::Ior, "operator|"},
     {"pL", OperatorInfo::Binary, false, Node::Prec::Assign, "operator+="},
     {"pl", OperatorInfo::Binary, false, Node::Prec::Additive, "operator+"},
-    {"pm", OperatorInfo::Member, false, Node::Prec::PtrMem, "operator->*"},
+    {"pm", OperatorInfo::Member, /*Named*/ true, Node::Prec::PtrMem,
+     "operator->*"},
     {"pp", OperatorInfo::Postfix, false, Node::Prec::Postfix, "operator++"},
     {"ps", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator+"},
-    {"pt", OperatorInfo::Member, false, Node::Prec::Postfix, "operator->"},
+    {"pt", OperatorInfo::Member, /*Named*/ true, Node::Prec::Postfix,
+     "operator->"},
     {"qu", OperatorInfo::Conditional, false, Node::Prec::Conditional,
      "operator?"},
     {"rM", OperatorInfo::Binary, false, Node::Prec::Assign, "operator%="},
@@ -3495,6 +3499,9 @@ AbstractManglingParser<Derived, Alloc>::parseOperatorName(NameState *State) {
     if (Op->getKind() >= OperatorInfo::Unnameable)
       /* Not a nameable operator.  */
       return nullptr;
+    if (Op->getKind() == OperatorInfo::Member && !Op->getFlag())
+      /* Not a nameable MemberExpr */
+      return nullptr;
 
     return make<NameType>(Op->getName());
   }
diff --git a/libcxxabi/test/test_demangle.pass.cpp b/libcxxabi/test/test_demangle.pass.cpp
index 22b39fb06458d..ece3130a71a8d 100644
--- a/libcxxabi/test/test_demangle.pass.cpp
+++ b/libcxxabi/test/test_demangle.pass.cpp
@@ -30248,8 +30248,6 @@ const char* cases[][2] = {
     {"_Z3fooIPU9__ptrauthILj1ELb0ELj64EEPiEvT_", "void foo<int* __ptrauth<1u, false, 64u>*>(int* __ptrauth<1u, false, 64u>*)"},
 
     {"_ZN1CpmEi", "C::operator->*(int)"},
-    {"_ZN1CdtEi", "C::operator.(int)"},
-    {"_ZN1CdsEi", "C::operator.*(int)"},
     // clang-format on
 };
 
@@ -30353,6 +30351,8 @@ const char *invalid_cases[] = {
     "_ZGI3Foo",
     "_ZGIW3Foov",
     "W1x",
+    "_ZN1CdtEi",
+    "_ZN1CdsEi",
     // clang-format on
 };
 
diff --git a/llvm/include/llvm/Demangle/ItaniumDemangle.h b/llvm/include/llvm/Demangle/ItaniumDemangle.h
index 51f697b539ada..7bc0c01403b9f 100644
--- a/llvm/include/llvm/Demangle/ItaniumDemangle.h
+++ b/llvm/include/llvm/Demangle/ItaniumDemangle.h
@@ -3389,8 +3389,10 @@ const typename AbstractManglingParser<
     {"de", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator*"},
     {"dl", OperatorInfo::Del, /*Ary*/ false, Node::Prec::Unary,
      "operator delete"},
-    {"ds", OperatorInfo::Member, false, Node::Prec::PtrMem, "operator.*"},
-    {"dt", OperatorInfo::Member, false, Node::Prec::Postfix, "operator."},
+    {"ds", OperatorInfo::Member, /*Named*/ false, Node::Prec::PtrMem,
+     "operator.*"},
+    {"dt", OperatorInfo::Member, /*Named*/ false, Node::Prec::Postfix,
+     "operator."},
     {"dv", OperatorInfo::Binary, false, Node::Prec::Assign, "operator/"},
     {"eO", OperatorInfo::Binary, false, Node::Prec::Assign, "operator^="},
     {"eo", OperatorInfo::Binary, false, Node::Prec::Xor, "operator^"},
@@ -3419,10 +3421,12 @@ const typename AbstractManglingParser<
     {"or", OperatorInfo::Binary, false, Node::Prec::Ior, "operator|"},
     {"pL", OperatorInfo::Binary, false, Node::Prec::Assign, "operator+="},
     {"pl", OperatorInfo::Binary, false, Node::Prec::Additive, "operator+"},
-    {"pm", OperatorInfo::Member, false, Node::Prec::PtrMem, "operator->*"},
+    {"pm", OperatorInfo::Member, /*Named*/ true, Node::Prec::PtrMem,
+     "operator->*"},
     {"pp", OperatorInfo::Postfix, false, Node::Prec::Postfix, "operator++"},
     {"ps", OperatorInfo::Prefix, false, Node::Prec::Unary, "operator+"},
-    {"pt", OperatorInfo::Member, false, Node::Prec::Postfix, "operator->"},
+    {"pt", OperatorInfo::Member, /*Named*/ true, Node::Prec::Postfix,
+     "operator->"},
     {"qu", OperatorInfo::Conditional, false, Node::Prec::Conditional,
      "operator?"},
     {"rM", OperatorInfo::Binary, false, Node::Prec::Assign, "operator%="},
@@ -3495,6 +3499,9 @@ AbstractManglingParser<Derived, Alloc>::parseOperatorName(NameState *State) {
     if (Op->getKind() >= OperatorInfo::Unnameable)
       /* Not a nameable operator.  */
       return nullptr;
+    if (Op->getKind() == OperatorInfo::Member && !Op->getFlag())
+      /* Not a nameable MemberExpr */
+      return nullptr;
 
     return make<NameType>(Op->getName());
   }

>From b4de2db6461df46e08dc1f0171eaa9821f2832f3 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Fri, 25 Apr 2025 10:21:37 +0100
Subject: [PATCH 4/4] fixup! clang-format

---
 libcxxabi/test/test_demangle.pass.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libcxxabi/test/test_demangle.pass.cpp b/libcxxabi/test/test_demangle.pass.cpp
index ece3130a71a8d..8cdd19fd02b0b 100644
--- a/libcxxabi/test/test_demangle.pass.cpp
+++ b/libcxxabi/test/test_demangle.pass.cpp
@@ -30293,7 +30293,7 @@ const unsigned NF = sizeof(fp_literal_cases) / sizeof(fp_literal_cases[0]);
 const unsigned NEF = sizeof(fp_literal_cases[0].expecting) /
                      sizeof(fp_literal_cases[0].expecting[0]);
 
-const char *invalid_cases[] = {
+const char* invalid_cases[] = {
     // clang-format off
     "_ZIPPreEncode",
     "Agentt",



More information about the libcxx-commits mailing list