aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2021-11-07 11:58:32 +0000
committerGitHub <noreply@github.com>2021-11-07 11:58:32 +0000
commitd11a50eca3773fb29430db6d3ea3ccc2bb4335fa (patch)
tree6d459b779636d255a9539fd42508263f8836452d /gcc
parent57b10aef62e8759afc413df8882fcd4fb5f098bf (diff)
parentbc858da45c3c0b445d57ed9f3bf9d2122076171e (diff)
downloadgcc-d11a50eca3773fb29430db6d3ea3ccc2bb4335fa.zip
gcc-d11a50eca3773fb29430db6d3ea3ccc2bb4335fa.tar.gz
gcc-d11a50eca3773fb29430db6d3ea3ccc2bb4335fa.tar.bz2
Merge #798
798: Add missing const folding r=philberty a=philberty Add some more missing constant-folding operations Co-authored-by: Philip Herron <philip.herron@embecosm.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/typecheck/rust-hir-const-fold.h60
1 files changed, 58 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..b3a53eb 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,38 @@ 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 ());
+ }
+
+ void visit (HIR::GroupedExpr &expr) override
+ {
+ folded = ConstFoldExpr::fold (expr.get_expr_in_parens ().get ());
+ }
+
private:
ConstFoldExpr ()
: ConstFoldBase (), folded (ctx->get_backend ()->error_expression ())