aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>2023-10-18 14:24:31 +0200
committerPhilip Herron <philip.herron@embecosm.com>2023-11-09 15:39:45 +0000
commit203f1927078b5c331cb34a3cf228c9af8d8903db (patch)
tree525402eedad234f5ac043405e67a7b6141e8290a /gcc
parent2c862b96f1663d568e84643d58df0b6e4e320d91 (diff)
downloadgcc-203f1927078b5c331cb34a3cf228c9af8d8903db.zip
gcc-203f1927078b5c331cb34a3cf228c9af8d8903db.tar.gz
gcc-203f1927078b5c331cb34a3cf228c9af8d8903db.tar.bz2
Change FunctionParam to represent variadic params
Variadic were represented at the function level while retaining most informations of a given parameter. gcc/rust/ChangeLog: * ast/rust-item.h (class FunctionParam): Add some informations to function parameters in order to be able to store variadic argument as a function parameter. Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/ast/rust-item.h29
1 files changed, 27 insertions, 2 deletions
diff --git a/gcc/rust/ast/rust-item.h b/gcc/rust/ast/rust-item.h
index ac16b55..74dd8c1 100644
--- a/gcc/rust/ast/rust-item.h
+++ b/gcc/rust/ast/rust-item.h
@@ -528,6 +528,7 @@ class FunctionParam
location_t locus;
std::unique_ptr<Pattern> param_name;
std::unique_ptr<Type> type;
+ bool variadic;
public:
FunctionParam (std::unique_ptr<Pattern> param_name,
@@ -535,12 +536,26 @@ public:
std::vector<Attribute> outer_attrs, location_t locus)
: outer_attrs (std::move (outer_attrs)), locus (locus),
param_name (std::move (param_name)), type (std::move (param_type)),
+ variadic (false),
+ node_id (Analysis::Mappings::get ()->get_next_node_id ())
+ {}
+
+ FunctionParam (std::vector<Attribute> outer_attrs, location_t locus)
+ : outer_attrs (std::move (outer_attrs)), locus (locus),
+ param_name (nullptr), type (nullptr), variadic (true),
+ node_id (Analysis::Mappings::get ()->get_next_node_id ())
+ {}
+
+ FunctionParam (std::unique_ptr<Pattern> param_name,
+ std::vector<Attribute> outer_attrs, location_t locus)
+ : outer_attrs (std::move (outer_attrs)), locus (locus),
+ param_name (std::move (param_name)), type (nullptr), variadic (true),
node_id (Analysis::Mappings::get ()->get_next_node_id ())
{}
// Copy constructor uses clone
FunctionParam (FunctionParam const &other)
- : locus (other.locus), node_id (other.node_id)
+ : locus (other.locus), variadic (other.variadic), node_id (other.node_id)
{
// guard to prevent nullptr dereference
if (other.param_name != nullptr)
@@ -554,6 +569,7 @@ public:
{
locus = other.locus;
node_id = other.node_id;
+ variadic = other.variadic;
// guard to prevent nullptr dereference
if (other.param_name != nullptr)
@@ -573,7 +589,13 @@ public:
FunctionParam &operator= (FunctionParam &&other) = default;
// Returns whether FunctionParam is in an invalid state.
- bool is_error () const { return param_name == nullptr || type == nullptr; }
+ bool is_error () const
+ {
+ if (variadic)
+ return false;
+ else
+ return param_name == nullptr || type == nullptr;
+ }
// Creates an error FunctionParam.
static FunctionParam create_error ()
@@ -602,6 +624,9 @@ public:
rust_assert (type != nullptr);
return type;
}
+
+ bool is_variadic () const { return variadic; }
+
NodeId get_node_id () const { return node_id; }
protected: