gccrs: 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.patry@embecosm.com>
This commit is contained in:
Pierre-Emmanuel Patry 2023-10-18 15:30:57 +02:00 committed by Arthur Cohen
parent 41f480d16d
commit df4e37c7dc
2 changed files with 31 additions and 7 deletions

View file

@ -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;

View file

@ -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));