diff options
author | Philip Herron <philip.herron@embecosm.com> | 2021-11-05 14:05:22 +0000 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2021-11-05 14:05:22 +0000 |
commit | b22ec9216067a03b2093da35ea5a33f3960e4fe2 (patch) | |
tree | 1727dffe5b1d38504b16449a931967dfc4867848 /gcc | |
parent | 8e992e371bbd896c8b605e1ebade5cad80b1b411 (diff) | |
download | gcc-b22ec9216067a03b2093da35ea5a33f3960e4fe2.zip gcc-b22ec9216067a03b2093da35ea5a33f3960e4fe2.tar.gz gcc-b22ec9216067a03b2093da35ea5a33f3960e4fe2.tar.bz2 |
Const fold ref,pointer,borrow+deref
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/typecheck/rust-hir-const-fold.h | 55 |
1 files changed, 53 insertions, 2 deletions
diff --git a/gcc/rust/typecheck/rust-hir-const-fold.h b/gcc/rust/typecheck/rust-hir-const-fold.h index 2bf0f2c..111bd38 100644 --- a/gcc/rust/typecheck/rust-hir-const-fold.h +++ b/gcc/rust/typecheck/rust-hir-const-fold.h @@ -47,9 +47,33 @@ public: translated = backend->array_type (element_ty, type.get_capacity ()); } - void visit (TyTy::ReferenceType &) override { gcc_unreachable (); } + void visit (TyTy::ReferenceType &type) override + { + Btype *base_compiled_type = ConstFoldType::fold (type.get_base (), backend); + if (type.is_mutable ()) + { + translated = backend->reference_type (base_compiled_type); + } + else + { + auto base = backend->immutable_type (base_compiled_type); + translated = backend->reference_type (base); + } + } - void visit (TyTy::PointerType &) override { gcc_unreachable (); } + void visit (TyTy::PointerType &type) override + { + Btype *base_compiled_type = ConstFoldType::fold (type.get_base (), backend); + if (type.is_mutable ()) + { + translated = backend->pointer_type (base_compiled_type); + } + else + { + auto base = backend->immutable_type (base_compiled_type); + translated = backend->pointer_type (base); + } + } void visit (TyTy::ParamType &) override { gcc_unreachable (); } @@ -436,6 +460,33 @@ public: expr.get_locus ()); } + void visit (HIR::BorrowExpr &expr) override + { + Bexpression *main_expr = ConstFoldExpr::fold (expr.get_expr ().get ()); + + folded + = ctx->get_backend ()->address_expression (main_expr, expr.get_locus ()); + } + + void visit (HIR::DereferenceExpr &expr) override + { + Bexpression *main_expr = ConstFoldExpr::fold (expr.get_expr ().get ()); + + TyTy::BaseType *tyty = nullptr; + if (!tyctx->lookup_type (expr.get_mappings ().get_hirid (), &tyty)) + { + rust_fatal_error (expr.get_locus (), + "did not resolve type for this TupleExpr"); + return; + } + + Btype *expected_type = ConstFoldType::fold (tyty, ctx->get_backend ()); + bool known_valid = true; + folded = ctx->get_backend ()->indirect_expression (expected_type, main_expr, + known_valid, + expr.get_locus ()); + } + private: ConstFoldExpr () : ConstFoldBase (), folded (ctx->get_backend ()->error_expression ()) |