From 843d7d7b46133fc471ed51d165a979c5af059aea Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Patry Date: Wed, 21 Feb 2024 16:45:18 +0100 Subject: [PATCH] Replace reference to unique pointer with reference Reference to unique pointers are a known anti pattern, only the element shall be taken by reference instead of the whole wrapper. gcc/rust/ChangeLog: * ast/rust-item.h: Change getter function prototype to return a reference directly instead of a reference to the wrapper type. * checks/errors/rust-ast-validation.cc (ASTValidation::visit): Fix the code to accept references instead. * hir/rust-ast-lower-base.cc (ASTLoweringBase::lower_self): Change function implementation to return a reference. * hir/rust-ast-lower-base.h: Accept a reference instead of a unique pointer reference. * resolve/rust-ast-resolve-item.cc (ResolveItem::visit): Adapt the code to a reference instead of a unique pointer. Signed-off-by: Pierre-Emmanuel Patry --- gcc/rust/ast/rust-item.h | 8 +++---- gcc/rust/checks/errors/rust-ast-validation.cc | 2 +- gcc/rust/hir/rust-ast-lower-base.cc | 24 +++++++++---------- gcc/rust/hir/rust-ast-lower-base.h | 2 +- gcc/rust/resolve/rust-ast-resolve-item.cc | 19 +++++++-------- 5 files changed, 27 insertions(+), 28 deletions(-) diff --git a/gcc/rust/ast/rust-item.h b/gcc/rust/ast/rust-item.h index 573888bea5aa..d09f45500629 100644 --- a/gcc/rust/ast/rust-item.h +++ b/gcc/rust/ast/rust-item.h @@ -1415,15 +1415,15 @@ class Function : public VisItem, public AssociatedItem, public ExternalItem return return_type; } - std::unique_ptr &get_self_param () + Param &get_self_param () { rust_assert (has_self_param ()); - return function_params[0]; + return *function_params[0]; } - const std::unique_ptr &get_self_param () const + const Param &get_self_param () const { rust_assert (has_self_param ()); - return function_params[0]; + return *function_params[0]; } // ExternalItem::node_id is same as Stmt::node_id diff --git a/gcc/rust/checks/errors/rust-ast-validation.cc b/gcc/rust/checks/errors/rust-ast-validation.cc index d1edb890ae61..d58920878893 100644 --- a/gcc/rust/checks/errors/rust-ast-validation.cc +++ b/gcc/rust/checks/errors/rust-ast-validation.cc @@ -100,7 +100,7 @@ ASTValidation::visit (AST::Function &function) && context.back () != Context::INHERENT_IMPL && function.has_self_param ()) rust_error_at ( - function.get_self_param ()->get_locus (), + function.get_self_param ().get_locus (), "% parameter is only allowed in associated functions"); if (function.is_external ()) diff --git a/gcc/rust/hir/rust-ast-lower-base.cc b/gcc/rust/hir/rust-ast-lower-base.cc index ff6ef25a3488..652530ae7a50 100644 --- a/gcc/rust/hir/rust-ast-lower-base.cc +++ b/gcc/rust/hir/rust-ast-lower-base.cc @@ -648,31 +648,31 @@ ASTLoweringBase::lower_generic_args (AST::GenericArgs &args) } HIR::SelfParam -ASTLoweringBase::lower_self (std::unique_ptr ¶m) +ASTLoweringBase::lower_self (AST::Param ¶m) { - rust_assert (param->is_self ()); + rust_assert (param.is_self ()); - auto self = static_cast (param.get ()); + auto self = static_cast (param); auto crate_num = mappings->get_current_crate (); - Analysis::NodeMapping mapping (crate_num, self->get_node_id (), + Analysis::NodeMapping mapping (crate_num, self.get_node_id (), mappings->get_next_hir_id (crate_num), mappings->get_next_localdef_id (crate_num)); - if (self->has_type ()) + if (self.has_type ()) { - HIR::Type *type = ASTLoweringType::translate (self->get_type ().get ()); + HIR::Type *type = ASTLoweringType::translate (self.get_type ().get ()); return HIR::SelfParam (mapping, std::unique_ptr (type), - self->get_is_mut (), self->get_locus ()); + self.get_is_mut (), self.get_locus ()); } - else if (!self->get_has_ref ()) + else if (!self.get_has_ref ()) { return HIR::SelfParam (mapping, std::unique_ptr (nullptr), - self->get_is_mut (), self->get_locus ()); + self.get_is_mut (), self.get_locus ()); } - AST::Lifetime l = self->get_lifetime (); - return HIR::SelfParam (mapping, lower_lifetime (l), self->get_is_mut (), - self->get_locus ()); + AST::Lifetime l = self.get_lifetime (); + return HIR::SelfParam (mapping, lower_lifetime (l), self.get_is_mut (), + self.get_locus ()); } HIR::Type * diff --git a/gcc/rust/hir/rust-ast-lower-base.h b/gcc/rust/hir/rust-ast-lower-base.h index c19e9c03b5f2..c01c7c857678 100644 --- a/gcc/rust/hir/rust-ast-lower-base.h +++ b/gcc/rust/hir/rust-ast-lower-base.h @@ -278,7 +278,7 @@ class ASTLoweringBase : public AST::ASTVisitor HIR::GenericArgsBinding lower_binding (AST::GenericArgsBinding &binding); - HIR::SelfParam lower_self (std::unique_ptr &self); + HIR::SelfParam lower_self (AST::Param &self); HIR::Type *lower_type_no_bounds (AST::TypeNoBounds *type); diff --git a/gcc/rust/resolve/rust-ast-resolve-item.cc b/gcc/rust/resolve/rust-ast-resolve-item.cc index a3f27b3e4a08..c65f112ea3b6 100644 --- a/gcc/rust/resolve/rust-ast-resolve-item.cc +++ b/gcc/rust/resolve/rust-ast-resolve-item.cc @@ -489,32 +489,31 @@ ResolveItem::visit (AST::Function &function) if (function.has_self_param ()) { // self turns into (self: Self) as a function param - std::unique_ptr &s_param = function.get_self_param (); - auto self_param = static_cast (s_param.get ()); + AST::Param &s_param = function.get_self_param (); + auto &self_param = static_cast (s_param); // FIXME: which location should be used for Rust::Identifier `self`? AST::IdentifierPattern self_pattern ( - self_param->get_node_id (), {"self"}, self_param->get_locus (), - self_param->get_has_ref (), self_param->get_is_mut (), + self_param.get_node_id (), {"self"}, self_param.get_locus (), + self_param.get_has_ref (), self_param.get_is_mut (), std::unique_ptr (nullptr)); PatternDeclaration::go (&self_pattern, Rib::ItemType::Param); - if (self_param->has_type ()) + if (self_param.has_type ()) { // This shouldn't happen the parser should already error for this - rust_assert (!self_param->get_has_ref ()); - ResolveType::go (self_param->get_type ().get ()); + rust_assert (!self_param.get_has_ref ()); + ResolveType::go (self_param.get_type ().get ()); } else { // here we implicitly make self have a type path of Self std::vector> segments; segments.push_back (std::unique_ptr ( - new AST::TypePathSegment ("Self", false, - self_param->get_locus ()))); + new AST::TypePathSegment ("Self", false, self_param.get_locus ()))); AST::TypePath self_type_path (std::move (segments), - self_param->get_locus ()); + self_param.get_locus ()); ResolveType::go (&self_type_path); } }