aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2021-11-05 14:05:22 +0000
committerPhilip Herron <philip.herron@embecosm.com>2021-11-05 14:05:22 +0000
commitb22ec9216067a03b2093da35ea5a33f3960e4fe2 (patch)
tree1727dffe5b1d38504b16449a931967dfc4867848 /gcc
parent8e992e371bbd896c8b605e1ebade5cad80b1b411 (diff)
downloadgcc-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.h55
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 ())