diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/ast/rust-item.h | 25 | ||||
-rw-r--r-- | 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 109680a..7cdbc8b 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 54047d3..422e902 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 ¶m : 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)); |