NodeId node_id;
location_t locus;
+ bool variadic;
public:
/* Returns whether the named function parameter has a name (i.e. name is not
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; }
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;
? 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));