diff options
author | Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com> | 2024-11-08 12:01:15 +0100 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2025-03-21 12:32:57 +0100 |
commit | a99d29095028be7a68c876d6124b8e845fc80fef (patch) | |
tree | 54a421727f0e52c525281ba70ce46d6039ce75c5 /gcc/rust/hir | |
parent | 6246f658336099f328078f92f277ed461c3bb7e5 (diff) | |
download | gcc-a99d29095028be7a68c876d6124b8e845fc80fef.zip gcc-a99d29095028be7a68c876d6124b8e845fc80fef.tar.gz gcc-a99d29095028be7a68c876d6124b8e845fc80fef.tar.bz2 |
gccrs: Fix Generic type retrieval
gcc/rust/ChangeLog:
* hir/rust-ast-lower-type.cc (ASTLowerGenericParam::visit): Forward
an optional to the constructor.
* hir/tree/rust-hir-item.cc (TypeParam::TypeParam): Use an optional
in the constructor.
(TypeParam::operator=): Ensure the TypeParam has a type properly.
(TypeParam::get_type_mappings): Likewise.
* hir/tree/rust-hir-item.h: Wrap the type smart pointer into an
optional.
* hir/tree/rust-hir.cc (TypeParam::as_string): Unwrap optional type
correctly.
Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Diffstat (limited to 'gcc/rust/hir')
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-type.cc | 10 | ||||
-rw-r--r-- | gcc/rust/hir/tree/rust-hir-item.cc | 19 | ||||
-rw-r--r-- | gcc/rust/hir/tree/rust-hir-item.h | 14 | ||||
-rw-r--r-- | gcc/rust/hir/tree/rust-hir.cc | 2 |
4 files changed, 25 insertions, 20 deletions
diff --git a/gcc/rust/hir/rust-ast-lower-type.cc b/gcc/rust/hir/rust-ast-lower-type.cc index 7d6ac5d..5836c1a 100644 --- a/gcc/rust/hir/rust-ast-lower-type.cc +++ b/gcc/rust/hir/rust-ast-lower-type.cc @@ -17,6 +17,7 @@ // <http://www.gnu.org/licenses/>. #include "rust-ast-lower-type.h" +#include "optional.h" #include "rust-attribute-values.h" namespace Rust { @@ -502,9 +503,9 @@ ASTLowerGenericParam::visit (AST::TypeParam ¶m) } } - HIR::Type *type = param.has_type () - ? ASTLoweringType::translate (param.get_type ()) - : nullptr; + auto type = param.has_type () ? tl::optional (std::unique_ptr<HIR::Type> ( + ASTLoweringType::translate (param.get_type ()))) + : tl::nullopt; auto crate_num = mappings.get_current_crate (); Analysis::NodeMapping mapping (crate_num, param.get_node_id (), @@ -514,8 +515,7 @@ ASTLowerGenericParam::visit (AST::TypeParam ¶m) translated = new HIR::TypeParam (mapping, param.get_type_representation (), param.get_locus (), std::move (type_param_bounds), - std::unique_ptr<Type> (type), - param.get_outer_attrs ()); + std::move (type), param.get_outer_attrs ()); } HIR::TypeParamBound * diff --git a/gcc/rust/hir/tree/rust-hir-item.cc b/gcc/rust/hir/tree/rust-hir-item.cc index f81f1ea..cff06d3 100644 --- a/gcc/rust/hir/tree/rust-hir-item.cc +++ b/gcc/rust/hir/tree/rust-hir-item.cc @@ -17,6 +17,7 @@ // <http://www.gnu.org/licenses/>. #include "rust-hir-item.h" +#include "optional.h" namespace Rust { namespace HIR { @@ -25,7 +26,7 @@ TypeParam::TypeParam ( Analysis::NodeMapping mappings, Identifier type_representation, location_t locus, std::vector<std::unique_ptr<TypeParamBound>> type_param_bounds, - std::unique_ptr<Type>, AST::AttrVec outer_attrs) + tl::optional<std::unique_ptr<Type>> type, AST::AttrVec outer_attrs) : GenericParam (mappings), outer_attrs (std::move (outer_attrs)), type_representation (std::move (type_representation)), type_param_bounds (std::move (type_param_bounds)), type (std::move (type)), @@ -37,8 +38,10 @@ TypeParam::TypeParam (TypeParam const &other) type_representation (other.type_representation), locus (other.locus) { // guard to prevent null pointer dereference - if (other.type != nullptr) - type = other.type->clone_type (); + if (other.has_type ()) + type = {other.type.value ()->clone_type ()}; + else + type = tl::nullopt; type_param_bounds.reserve (other.type_param_bounds.size ()); for (const auto &e : other.type_param_bounds) @@ -54,10 +57,10 @@ TypeParam::operator= (TypeParam const &other) mappings = other.mappings; // guard to prevent null pointer dereference - if (other.type != nullptr) - type = other.type->clone_type (); + if (other.has_type ()) + type = {other.type.value ()->clone_type ()}; else - type = nullptr; + type = tl::nullopt; type_param_bounds.reserve (other.type_param_bounds.size ()); for (const auto &e : other.type_param_bounds) @@ -69,8 +72,8 @@ TypeParam::operator= (TypeParam const &other) Analysis::NodeMapping TypeParam::get_type_mappings () const { - rust_assert (type != nullptr); - return type->get_mappings (); + rust_assert (type.has_value ()); + return type.value ()->get_mappings (); } std::vector<std::unique_ptr<TypeParamBound>> & diff --git a/gcc/rust/hir/tree/rust-hir-item.h b/gcc/rust/hir/tree/rust-hir-item.h index bb300e9..0fda167 100644 --- a/gcc/rust/hir/tree/rust-hir-item.h +++ b/gcc/rust/hir/tree/rust-hir-item.h @@ -19,6 +19,7 @@ #ifndef RUST_HIR_ITEM_H #define RUST_HIR_ITEM_H +#include "optional.h" #include "rust-abi.h" #include "rust-hir-stmt.h" #include "rust-common.h" @@ -102,14 +103,13 @@ class TypeParam : public GenericParam std::vector<std::unique_ptr<TypeParamBound>> type_param_bounds; // inlined form - // bool has_type; - std::unique_ptr<Type> type; + tl::optional<std::unique_ptr<Type>> type; location_t locus; public: // Returns whether the type of the type param has been specified. - bool has_type () const { return type != nullptr; } + bool has_type () const { return type.has_value (); } // Returns whether the type param has type param bounds. bool has_type_param_bounds () const { return !type_param_bounds.empty (); } @@ -122,7 +122,7 @@ public: location_t locus = UNDEF_LOCATION, std::vector<std::unique_ptr<TypeParamBound>> type_param_bounds = std::vector<std::unique_ptr<TypeParamBound>> (), - std::unique_ptr<Type> type = nullptr, + tl::optional<std::unique_ptr<Type>> type = tl::nullopt, AST::AttrVec outer_attrs = std::vector<AST::Attribute> ()); // Copy constructor uses clone @@ -130,8 +130,10 @@ public: // Overloaded assignment operator to clone TypeParam &operator= (TypeParam const &other); + // move constructors TypeParam (TypeParam &&other) = default; + TypeParam &operator= (TypeParam &&other) = default; std::string as_string () const override; @@ -144,8 +146,8 @@ public: Type &get_type () { - rust_assert (type); - return *type; + rust_assert (*type); + return *type.value (); } Analysis::NodeMapping get_type_mappings () const; diff --git a/gcc/rust/hir/tree/rust-hir.cc b/gcc/rust/hir/tree/rust-hir.cc index bccfc52..c20d69d 100644 --- a/gcc/rust/hir/tree/rust-hir.cc +++ b/gcc/rust/hir/tree/rust-hir.cc @@ -2178,7 +2178,7 @@ TypeParam::as_string () const } else { - str += type->as_string (); + str += type.value ()->as_string (); } return str; |