diff options
author | Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com> | 2023-10-18 14:24:31 +0200 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2023-11-09 15:39:45 +0000 |
commit | 203f1927078b5c331cb34a3cf228c9af8d8903db (patch) | |
tree | 525402eedad234f5ac043405e67a7b6141e8290a /gcc | |
parent | 2c862b96f1663d568e84643d58df0b6e4e320d91 (diff) | |
download | gcc-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.h | 29 |
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: |