[libcxx-commits] [clang] [libcxxabi] [llvm] [WIP][Clang] Mangling of pack indexing type and expression for itanium (PR #123513)

via libcxx-commits libcxx-commits at lists.llvm.org
Sun Jan 19 06:13:23 PST 2025


github-actions[bot] wrote:

<!--LLVM CODE FORMAT COMMENT: {clang-format}-->


:warning: C/C++ code formatter, clang-format found issues in your code. :warning:

<details>
<summary>
You can test this locally with the following command:
</summary>

``````````bash
git-clang-format --diff 7dd34baf5505d689161c3a8678322a394d7a2929 1b016f8b86eb004568e2779d19cc030e8c487762 --extensions cpp,h -- clang/lib/AST/ItaniumMangle.cpp libcxxabi/src/demangle/ItaniumDemangle.h libcxxabi/test/test_demangle.pass.cpp llvm/include/llvm/Demangle/ItaniumDemangle.h
``````````

</details>

<details>
<summary>
View the diff from clang-format here.
</summary>

``````````diff
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index e870942539..ddf401f993 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -603,7 +603,7 @@ private:
   void mangleInitListElements(const InitListExpr *InitList);
   void mangleRequirement(SourceLocation RequiresExprLoc,
                          const concepts::Requirement *Req);
-  void mangleReferenceToPack(const NamedDecl* ND);
+  void mangleReferenceToPack(const NamedDecl *ND);
   void mangleExpression(const Expr *E, unsigned Arity = UnknownArity,
                         bool AsTemplateArg = false);
   void mangleCXXCtorType(CXXCtorType T, const CXXRecordDecl *InheritedFrom);
@@ -4354,8 +4354,7 @@ void CXXNameMangler::mangleType(const PackIndexingType *T) {
     Out << "Dy";
     mangleType(T->getPattern());
     mangleExpression(T->getIndexExpr());
-  }
-  else
+  } else
     mangleType(T->getSelectedType());
 }
 
@@ -4790,49 +4789,65 @@ void CXXNameMangler::mangleRequirement(SourceLocation RequiresExprLoc,
   }
 }
 
-void CXXNameMangler::mangleReferenceToPack(const NamedDecl* Pack) {
-    if (const TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Pack))
-        mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
-    else if (const NonTypeTemplateParmDecl *NTTP
-              = dyn_cast<NonTypeTemplateParmDecl>(Pack))
-        mangleTemplateParameter(NTTP->getDepth(), NTTP->getIndex());
-    else if (const TemplateTemplateParmDecl *TempTP
-                                  = dyn_cast<TemplateTemplateParmDecl>(Pack))
-        mangleTemplateParameter(TempTP->getDepth(), TempTP->getIndex());
-    else
-        mangleFunctionParam(cast<ParmVarDecl>(Pack));
+void CXXNameMangler::mangleReferenceToPack(const NamedDecl *Pack) {
+  if (const TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Pack))
+    mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
+  else if (const NonTypeTemplateParmDecl *NTTP =
+               dyn_cast<NonTypeTemplateParmDecl>(Pack))
+    mangleTemplateParameter(NTTP->getDepth(), NTTP->getIndex());
+  else if (const TemplateTemplateParmDecl *TempTP =
+               dyn_cast<TemplateTemplateParmDecl>(Pack))
+    mangleTemplateParameter(TempTP->getDepth(), TempTP->getIndex());
+  else
+    mangleFunctionParam(cast<ParmVarDecl>(Pack));
 }
 
 void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity,
                                       bool AsTemplateArg) {
   // <expression> ::= <unary operator-name> <expression>
   //              ::= <binary operator-name> <expression> <expression>
-  //              ::= <trinary operator-name> <expression> <expression> <expression>
-  //              ::= cv <type> expression           # conversion with one argument
-  //              ::= cv <type> _ <expression>* E # conversion with a different number of arguments
-  //              ::= dc <type> <expression>         # dynamic_cast<type> (expression)
-  //              ::= sc <type> <expression>         # static_cast<type> (expression)
-  //              ::= cc <type> <expression>         # const_cast<type> (expression)
-  //              ::= rc <type> <expression>         # reinterpret_cast<type> (expression)
+  //              ::= <trinary operator-name> <expression> <expression>
+  //              <expression>
+  //              ::= cv <type> expression           # conversion with one
+  //              argument
+  //              ::= cv <type> _ <expression>* E # conversion with a different
+  //              number of arguments
+  //              ::= dc <type> <expression>         # dynamic_cast<type>
+  //              (expression)
+  //              ::= sc <type> <expression>         # static_cast<type>
+  //              (expression)
+  //              ::= cc <type> <expression>         # const_cast<type>
+  //              (expression)
+  //              ::= rc <type> <expression>         # reinterpret_cast<type>
+  //              (expression)
   //              ::= st <type>                      # sizeof (a type)
   //              ::= at <type>                      # alignof (a type)
   //              ::= <template-param>
   //              ::= <function-param>
-  //              ::= fpT                            # 'this' expression (part of <function-param>)
-  //              ::= sr <type> <unqualified-name>                   # dependent name
-  //              ::= sr <type> <unqualified-name> <template-args>   # dependent template-id
-  //              ::= sy <expression> <expression>                   # pack indexing expression
-  //              ::= ds <expression> <expression>                   # expr.*expr
-  //              ::= sZ <template-param>                            # size of a parameter pack
+  //              ::= fpT                            # 'this' expression (part
+  //              of <function-param>)
+  //              ::= sr <type> <unqualified-name>                   # dependent
+  //              name
+  //              ::= sr <type> <unqualified-name> <template-args>   # dependent
+  //              template-id
+  //              ::= sy <expression> <expression>                   # pack
+  //              indexing expression
+  //              ::= ds <expression> <expression>                   #
+  //              expr.*expr
+  //              ::= sZ <template-param>                            # size of a
+  //              parameter pack
   //              ::= sZ <function-param>    # size of a function parameter pack
-  //              ::= u <source-name> <template-arg>* E # vendor extended expression
+  //              ::= u <source-name> <template-arg>* E # vendor extended
+  //              expression
   //              ::= <expr-primary>
   // <expr-primary> ::= L <type> <value number> E    # integer literal
   //                ::= L <type> <value float> E     # floating literal
   //                ::= L <type> <string type> E     # string literal
   //                ::= L <nullptr type> E           # nullptr literal "LDnE"
-  //                ::= L <pointer type> 0 E         # null pointer template argument
-  //                ::= L <type> <real-part float> _ <imag-part float> E    # complex floating point literal (C99); not used by clang
+  //                ::= L <pointer type> 0 E         # null pointer template
+  //                argument
+  //                ::= L <type> <real-part float> _ <imag-part float> E    #
+  //                complex floating point literal (C99); not used by clang
   //                ::= L <mangled-name> E           # external name
   QualType ImplicitlyConvertedToType;
 
@@ -5837,16 +5852,16 @@ recurse:
   }
 
   case Expr::PackIndexingExprClass: {
-      auto *PE = cast<PackIndexingExpr>(E);
-      if(PE->isFullySubstituted()) {
-          E = PE->getSelectedExpr();
-          goto recurse;
-      }
-      NotPrimaryExpr();
-      Out << "sy";
-      mangleReferenceToPack(PE->getPackDecl());
-      mangleExpression(PE->getIndexExpr());
-      break;
+    auto *PE = cast<PackIndexingExpr>(E);
+    if (PE->isFullySubstituted()) {
+      E = PE->getSelectedExpr();
+      goto recurse;
+    }
+    NotPrimaryExpr();
+    Out << "sy";
+    mangleReferenceToPack(PE->getPackDecl());
+    mangleExpression(PE->getIndexExpr());
+    break;
   }
 
   case Expr::CXXThisExprClass:
diff --git a/libcxxabi/src/demangle/ItaniumDemangle.h b/libcxxabi/src/demangle/ItaniumDemangle.h
index a65de9fee4..374aae13ff 100644
--- a/libcxxabi/src/demangle/ItaniumDemangle.h
+++ b/libcxxabi/src/demangle/ItaniumDemangle.h
@@ -1529,9 +1529,7 @@ public:
   PackIndexing(const Node *Pattern_, const Node *Index_)
       : Node(KPackIndexing), Pattern(Pattern_), Index(Index_) {}
 
-  template <typename Fn> void match(Fn F) const {
-    F(Pattern, Index);
-  }
+  template <typename Fn> void match(Fn F) const { F(Pattern, Index); }
 
   void printLeft(OutputBuffer &OB) const override {
     OB.printOpen('(');
diff --git a/llvm/include/llvm/Demangle/ItaniumDemangle.h b/llvm/include/llvm/Demangle/ItaniumDemangle.h
index e62de5d06a..e05362fd83 100644
--- a/llvm/include/llvm/Demangle/ItaniumDemangle.h
+++ b/llvm/include/llvm/Demangle/ItaniumDemangle.h
@@ -1531,9 +1531,7 @@ public:
   PackIndexing(const Node *Pattern_, const Node *Index_)
       : Node(KPackIndexing), Pattern(Pattern_), Index(Index_) {}
 
-  template <typename Fn> void match(Fn F) const {
-    F(Pattern, Index);
-  }
+  template <typename Fn> void match(Fn F) const { F(Pattern, Index); }
 
   void printLeft(OutputBuffer &OB) const override {
     ParameterPackExpansion PPE(Pattern);
@@ -1544,7 +1542,6 @@ public:
   }
 };
 
-
 class TemplateArgs final : public Node {
   NodeArray Params;
   Node *Requires;
@@ -4537,9 +4534,8 @@ Node *AbstractManglingParser<Derived, Alloc>::parseType() {
     //           ::= Dy <type> <expression> # pack indexing (C++26)
     case 'y': {
       First += 2;
-      Node *Pattern = look() == 'T' ?
-                          getDerived().parseTemplateParam()
-                        : getDerived().parseFunctionParam();
+      Node *Pattern = look() == 'T' ? getDerived().parseTemplateParam()
+                                    : getDerived().parseFunctionParam();
       if (Pattern == nullptr)
         return nullptr;
       Node *Index = getDerived().parseExpr();
@@ -5393,11 +5389,10 @@ Node *AbstractManglingParser<Derived, Alloc>::parseExpr() {
     return make<ParameterPackExpansion>(Child);
   }
   if (consumeIf("sy")) {
-    Node *Pattern = look() == 'T' ?
-            getDerived().parseTemplateParam()
-          : getDerived().parseFunctionParam();
+    Node *Pattern = look() == 'T' ? getDerived().parseTemplateParam()
+                                  : getDerived().parseFunctionParam();
     if (Pattern == nullptr)
-        return nullptr;
+      return nullptr;
     Node *Index = getDerived().parseExpr();
     if (Index == nullptr)
       return nullptr;

``````````

</details>


https://github.com/llvm/llvm-project/pull/123513


More information about the libcxx-commits mailing list