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:
parent
41f480d16d
commit
df4e37c7dc
2 changed files with 31 additions and 7 deletions
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Add table
Reference in a new issue