https://gcc.gnu.org/g:b47dee55b1b990f17788f74179a9a062fa4730d5

commit b47dee55b1b990f17788f74179a9a062fa4730d5
Author: Pierre-Emmanuel Patry <pierre-emmanuel.pa...@embecosm.com>
Date:   Wed Oct 18 15:30:57 2023 +0200

    Allow variadic NamedFunctionParam
    
    This was made to align NamedFunctionParam with FunctionParam.
    
    gcc/rust/ChangeLog:
    
            * ast/rust-item.h (class NamedFunctionParam): Add variadic boolean 
and
            another constructor.
            * hir/rust-ast-lower-extern.h: Avoid last parameter when variadic.
    
    Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.pa...@embecosm.com>

Diff:
---
 gcc/rust/ast/rust-item.h             | 25 ++++++++++++++++++++++---
 gcc/rust/hir/rust-ast-lower-extern.h | 13 +++++++++----
 2 files changed, 31 insertions(+), 7 deletions(-)

diff --git a/gcc/rust/ast/rust-item.h b/gcc/rust/ast/rust-item.h
index c4653d95fb49..90249351c2d3 100644
--- a/gcc/rust/ast/rust-item.h
+++ b/gcc/rust/ast/rust-item.h
@@ -4166,6 +4166,7 @@ class NamedFunctionParam
 
   NodeId node_id;
   location_t locus;
+  bool variadic;
 
 public:
   /* Returns whether the named function parameter has a name (i.e. name is not
@@ -4178,7 +4179,7 @@ public:
   bool is_error () const
   {
     // also if identifier is "" but that is probably more costly to compute
-    return param_type == nullptr;
+    return param_type == nullptr && !variadic;
   }
 
   std::string get_name () const { return name; }
@@ -4195,17 +4196,35 @@ public:
                      std::vector<Attribute> outer_attrs, location_t locus)
     : name (std::move (name)), param_type (std::move (param_type)),
       outer_attrs (std::move (outer_attrs)),
-      node_id (Analysis::Mappings::get ()->get_next_node_id ()), locus (locus)
+      node_id (Analysis::Mappings::get ()->get_next_node_id ()), locus (locus),
+      variadic (false)
+  {}
+
+  NamedFunctionParam (std::string name, std::vector<Attribute> outer_attrs,
+                     location_t locus)
+    : name (std::move (name)), param_type (nullptr),
+      outer_attrs (std::move (outer_attrs)),
+      node_id (Analysis::Mappings::get ()->get_next_node_id ()), locus (locus),
+      variadic (true)
+  {}
+
+  NamedFunctionParam (std::vector<Attribute> outer_attrs, location_t locus)
+    : name (""), param_type (nullptr), outer_attrs (std::move (outer_attrs)),
+      node_id (Analysis::Mappings::get ()->get_next_node_id ()), locus (locus),
+      variadic (true)
   {}
 
   // Copy constructor
   NamedFunctionParam (NamedFunctionParam const &other)
-    : name (other.name), outer_attrs (other.outer_attrs)
+    : name (other.name), outer_attrs (other.outer_attrs),
+      variadic (other.variadic)
   {
     node_id = other.node_id;
     // guard to prevent null dereference (only required if error state)
     if (other.param_type != nullptr)
       param_type = other.param_type->clone_type ();
+    else
+      param_type = nullptr;
   }
 
   ~NamedFunctionParam () = default;
diff --git a/gcc/rust/hir/rust-ast-lower-extern.h 
b/gcc/rust/hir/rust-ast-lower-extern.h
index 7690a77864ed..1a0ba3d5c7d9 100644
--- a/gcc/rust/hir/rust-ast-lower-extern.h
+++ b/gcc/rust/hir/rust-ast-lower-extern.h
@@ -79,15 +79,20 @@ public:
          ? ASTLoweringType::translate (function.get_return_type ().get ())
          : nullptr;
 
+    bool is_variadic = function.is_variadic ();
+    auto begin = function.get_function_params ().begin ();
+    auto end = is_variadic ? function.get_function_params ().end () - 1
+                          : function.get_function_params ().end ();
+
     std::vector<HIR::NamedFunctionParam> function_params;
-    for (auto &param : function.get_function_params ())
+    for (auto it = begin; it != end; it++)
       {
        HIR::Type *param_type
-         = ASTLoweringType::translate (param.get_type ().get ());
-       Identifier param_name = param.get_name ();
+         = ASTLoweringType::translate (it->get_type ().get ());
+       Identifier param_name = it->get_name ();
 
        auto crate_num = mappings->get_current_crate ();
-       Analysis::NodeMapping mapping (crate_num, param.get_node_id (),
+       Analysis::NodeMapping mapping (crate_num, it->get_node_id (),
                                       mappings->get_next_hir_id (crate_num),
                                       mappings->get_next_localdef_id (
                                         crate_num));

Reply via email to