From: Pierre-Emmanuel Patry Date: Fri, 8 Nov 2024 11:01:15 +0000 (+0100) Subject: gccrs: Fix Generic type retrieval X-Git-Tag: basepoints/gcc-16~1023 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a99d29095028be7a68c876d6124b8e845fc80fef;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/rust/hir/rust-ast-lower-type.cc b/gcc/rust/hir/rust-ast-lower-type.cc index 7d6ac5ddffa..5836c1ac148 100644 --- a/gcc/rust/hir/rust-ast-lower-type.cc +++ b/gcc/rust/hir/rust-ast-lower-type.cc @@ -17,6 +17,7 @@ // . #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 ( + 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), - 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 f81f1eae134..cff06d35269 100644 --- a/gcc/rust/hir/tree/rust-hir-item.cc +++ b/gcc/rust/hir/tree/rust-hir-item.cc @@ -17,6 +17,7 @@ // . #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> type_param_bounds, - std::unique_ptr, AST::AttrVec outer_attrs) + tl::optional> 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> & diff --git a/gcc/rust/hir/tree/rust-hir-item.h b/gcc/rust/hir/tree/rust-hir-item.h index bb300e9ed23..0fda1672b74 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> type_param_bounds; // inlined form - // bool has_type; - std::unique_ptr type; + tl::optional> 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> type_param_bounds = std::vector> (), - std::unique_ptr type = nullptr, + tl::optional> type = tl::nullopt, AST::AttrVec outer_attrs = std::vector ()); // 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 bccfc526164..c20d69d2146 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;