diff options
author | Philip Herron <philip.herron@embecosm.com> | 2021-01-16 16:02:26 +0000 |
---|---|---|
committer | Philip Herron <herron.philip@googlemail.com> | 2021-01-18 10:01:57 +0000 |
commit | 2b7518cf8ae5e34aec81dbb8efb6ea15bb95c68c (patch) | |
tree | 6698017f6a9d29113e9d2087152cda3e57712a5c /gcc/rust/backend | |
parent | 02132139efa60954c3f9d5aeb4d87210066b1b58 (diff) | |
download | gcc-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.h | 25 |
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) {} |