aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/backend
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2021-09-14 15:00:47 +0000
committerGitHub <noreply@github.com>2021-09-14 15:00:47 +0000
commitc8ffaa101c936822f5853a276d530da09c96cf52 (patch)
treed393eecd5333696158e868e907ae93f7530de8ec /gcc/rust/backend
parentc644ee4c4351e3590f5396e94ec24ad7b828a954 (diff)
parent002313b343746f8c72b62522e48e04fa0953b2d0 (diff)
downloadgcc-c8ffaa101c936822f5853a276d530da09c96cf52.zip
gcc-c8ffaa101c936822f5853a276d530da09c96cf52.tar.gz
gcc-c8ffaa101c936822f5853a276d530da09c96cf52.tar.bz2
Merge #672
672: Initial autoderef support for method calls r=philberty a=philberty The commit message contains more detail but this reference is good: https://doc.rust-lang.org/nightly/nomicon/dot-operator.html This is not 100% complete since we do not yet support operator overloading so we will require an update to support the Deref operator overload for more complex types. Fixes: #241 Co-authored-by: Philip Herron <philip.herron@embecosm.com>
Diffstat (limited to 'gcc/rust/backend')
-rw-r--r--gcc/rust/backend/rust-compile.cc26
1 files changed, 26 insertions, 0 deletions
diff --git a/gcc/rust/backend/rust-compile.cc b/gcc/rust/backend/rust-compile.cc
index ef2c16a..5214b1d 100644
--- a/gcc/rust/backend/rust-compile.cc
+++ b/gcc/rust/backend/rust-compile.cc
@@ -277,6 +277,32 @@ CompileExpr::visit (HIR::MethodCallExpr &expr)
// method receiver
Bexpression *self = CompileExpr::Compile (expr.get_receiver ().get (), ctx);
rust_assert (self != nullptr);
+
+ // lookup the autoderef mappings
+ std::vector<Resolver::Adjustment> *adjustments = nullptr;
+ ok = ctx->get_tyctx ()->lookup_autoderef_mappings (
+ expr.get_mappings ().get_hirid (), &adjustments);
+ rust_assert (ok);
+
+ for (auto &adjustment : *adjustments)
+ {
+ switch (adjustment.get_type ())
+ {
+ case Resolver::Adjustment::AdjustmentType::IMM_REF:
+ case Resolver::Adjustment::AdjustmentType::MUT_REF:
+ self = ctx->get_backend ()->address_expression (
+ self, expr.get_receiver ()->get_locus ());
+ break;
+
+ case Resolver::Adjustment::AdjustmentType::DEREF_REF:
+ Btype *expected_type
+ = TyTyResolveCompile::compile (ctx, adjustment.get_expected ());
+ self = ctx->get_backend ()->indirect_expression (
+ expected_type, self, true, /* known_valid*/
+ expr.get_receiver ()->get_locus ());
+ break;
+ }
+ }
args.push_back (self);
// normal args