aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/backend
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2021-01-16 16:02:26 +0000
committerPhilip Herron <herron.philip@googlemail.com>2021-01-18 10:01:57 +0000
commit2b7518cf8ae5e34aec81dbb8efb6ea15bb95c68c (patch)
tree6698017f6a9d29113e9d2087152cda3e57712a5c /gcc/rust/backend
parent02132139efa60954c3f9d5aeb4d87210066b1b58 (diff)
downloadgcc-2b7518cf8ae5e34aec81dbb8efb6ea15bb95c68c.zip
gcc-2b7518cf8ae5e34aec81dbb8efb6ea15bb95c68c.tar.gz
gcc-2b7518cf8ae5e34aec81dbb8efb6ea15bb95c68c.tar.bz2
Add struct_field_expression support
This adds in struct field expressions and should be generic enough for tuples later on.
Diffstat (limited to 'gcc/rust/backend')
-rw-r--r--gcc/rust/backend/rust-compile-expr.h25
1 files changed, 25 insertions, 0 deletions
diff --git a/gcc/rust/backend/rust-compile-expr.h b/gcc/rust/backend/rust-compile-expr.h
index 682ff79..98e8ee1 100644
--- a/gcc/rust/backend/rust-compile-expr.h
+++ b/gcc/rust/backend/rust-compile-expr.h
@@ -433,6 +433,31 @@ public:
translated = CompileExpr::Compile (expr.get_expr_in_parens ().get (), ctx);
}
+ void visit (HIR::FieldAccessExpr &expr)
+ {
+ // resolve the receiver back to ADT type
+ TyTy::TyBase *receiver = nullptr;
+ if (!ctx->get_tyctx ()->lookup_type (
+ expr.get_receiver_expr ()->get_mappings ().get_hirid (), &receiver))
+ {
+ rust_error_at (expr.get_receiver_expr ()->get_locus_slow (),
+ "unresolved type for receiver");
+ return;
+ }
+ rust_assert (receiver->get_kind () == TyTy::TypeKind::ADT);
+
+ TyTy::ADTType *adt = (TyTy::ADTType *) receiver;
+ size_t index = 0;
+ adt->get_field (expr.get_field_name (), &index);
+
+ Bexpression *struct_ref
+ = CompileExpr::Compile (expr.get_receiver_expr ().get (), ctx);
+
+ translated
+ = ctx->get_backend ()->struct_field_expression (struct_ref, index,
+ expr.get_locus ());
+ }
+
private:
CompileExpr (Context *ctx) : HIRCompileBase (ctx), translated (nullptr) {}