From c0e5ca327ba69655de7eae9628b85ad5a615dd77 Mon Sep 17 00:00:00 2001 From: Philip Herron Date: Fri, 11 Feb 2022 14:51:22 +0000 Subject: Support deref_mut lang item during method resolution When we have method resolution we need to look at any deref lang items for the receiver. The precise rules need to be tested rigorously to ensure this is right. Fixes #890 --- gcc/rust/backend/rust-compile-base.h | 3 +++ gcc/rust/backend/rust-compile-expr.cc | 39 +++++++++++++++++++---------------- 2 files changed, 24 insertions(+), 18 deletions(-) (limited to 'gcc/rust/backend') diff --git a/gcc/rust/backend/rust-compile-base.h b/gcc/rust/backend/rust-compile-base.h index a52886c..54116da 100644 --- a/gcc/rust/backend/rust-compile-base.h +++ b/gcc/rust/backend/rust-compile-base.h @@ -67,6 +67,9 @@ protected: tree resolve_deref_adjustment (Resolver::Adjustment &adjustment, tree expression, Location locus); + tree resolve_indirection_adjustment (Resolver::Adjustment &adjustment, + tree expression, Location locus); + static void setup_attributes_on_fndecl ( tree fndecl, bool is_main_entry_point, bool has_visibility, const HIR::FunctionQualifiers &qualifiers, const AST::AttrVec &attrs); diff --git a/gcc/rust/backend/rust-compile-expr.cc b/gcc/rust/backend/rust-compile-expr.cc index a592e35..65f159e 100644 --- a/gcc/rust/backend/rust-compile-expr.cc +++ b/gcc/rust/backend/rust-compile-expr.cc @@ -1199,9 +1199,14 @@ HIRCompileBase::resolve_adjustements ( e = address_expression (e, locus); break; - case Resolver::Adjustment::AdjustmentType::DEREF_REF: + case Resolver::Adjustment::AdjustmentType::DEREF: + case Resolver::Adjustment::AdjustmentType::DEREF_MUT: e = resolve_deref_adjustment (adjustment, e, locus); break; + + case Resolver::Adjustment::AdjustmentType::INDIRECTION: + e = resolve_indirection_adjustment (adjustment, e, locus); + break; } } @@ -1212,17 +1217,9 @@ tree HIRCompileBase::resolve_deref_adjustment (Resolver::Adjustment &adjustment, tree expression, Location locus) { - rust_assert (adjustment.is_deref_adjustment ()); - - tree expected_type - = TyTyResolveCompile::compile (ctx, adjustment.get_expected ()); - if (!adjustment.has_operator_overload ()) - { - return ctx->get_backend ()->indirect_expression (expected_type, - expression, - true, /* known_valid*/ - locus); - } + rust_assert (adjustment.is_deref_adjustment () + || adjustment.is_deref_mut_adjustment ()); + rust_assert (adjustment.has_operator_overload ()); TyTy::FnType *lookup = adjustment.get_deref_operator_fn (); HIR::ImplItem *resolved_item = adjustment.get_deref_hir_item (); @@ -1246,13 +1243,19 @@ HIRCompileBase::resolve_deref_adjustment (Resolver::Adjustment &adjustment, // make the call auto fncontext = ctx->peek_fn (); - tree deref_call - = ctx->get_backend ()->call_expression (fncontext.fndecl, fn_address, - {adjusted_argument}, nullptr, - locus); + return ctx->get_backend ()->call_expression (fncontext.fndecl, fn_address, + {adjusted_argument}, nullptr, + locus); +} + +tree +HIRCompileBase::resolve_indirection_adjustment ( + Resolver::Adjustment &adjustment, tree expression, Location locus) +{ + tree expected_type + = TyTyResolveCompile::compile (ctx, adjustment.get_expected ()); - // do the indirect expression - return ctx->get_backend ()->indirect_expression (expected_type, deref_call, + return ctx->get_backend ()->indirect_expression (expected_type, expression, true, /* known_valid*/ locus); } -- cgit v1.1