aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/backend/rust-compile-expr.cc
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2022-02-12 16:35:24 +0000
committerGitHub <noreply@github.com>2022-02-12 16:35:24 +0000
commitb71cc52613219f353b054eb5520cd3886f354c10 (patch)
tree59405bd9b3abb50f0db69d80c6c924c0a4ed2c68 /gcc/rust/backend/rust-compile-expr.cc
parent9023bb8687347559702340c24cd72301f0656a59 (diff)
parentc0e5ca327ba69655de7eae9628b85ad5a615dd77 (diff)
downloadgcc-b71cc52613219f353b054eb5520cd3886f354c10.zip
gcc-b71cc52613219f353b054eb5520cd3886f354c10.tar.gz
gcc-b71cc52613219f353b054eb5520cd3886f354c10.tar.bz2
Merge #920
920: Support deref_mut lang item during method resolution r=philberty a=philberty This adds in the lookups for the DEREF_MUT lang item for operator overloading this needs more testing to ensure the behaviour is correct and is the same as rustc. Fixes #890 Co-authored-by: Philip Herron <philip.herron@embecosm.com>
Diffstat (limited to 'gcc/rust/backend/rust-compile-expr.cc')
-rw-r--r--gcc/rust/backend/rust-compile-expr.cc39
1 files changed, 21 insertions, 18 deletions
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);
}