diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2021-09-14 15:00:47 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-14 15:00:47 +0000 |
commit | c8ffaa101c936822f5853a276d530da09c96cf52 (patch) | |
tree | d393eecd5333696158e868e907ae93f7530de8ec /gcc/rust/backend | |
parent | c644ee4c4351e3590f5396e94ec24ad7b828a954 (diff) | |
parent | 002313b343746f8c72b62522e48e04fa0953b2d0 (diff) | |
download | gcc-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.cc | 26 |
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 |