public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/rust/master] Const fold ref,pointer,borrow+deref
@ 2022-06-08 11:48 Thomas Schwinge
0 siblings, 0 replies; only message in thread
From: Thomas Schwinge @ 2022-06-08 11:48 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:b22ec9216067a03b2093da35ea5a33f3960e4fe2
commit b22ec9216067a03b2093da35ea5a33f3960e4fe2
Author: Philip Herron <philip.herron@embecosm.com>
Date: Fri Nov 5 14:05:22 2021 +0000
Const fold ref,pointer,borrow+deref
Diff:
---
gcc/rust/typecheck/rust-hir-const-fold.h | 55 ++++++++++++++++++++++++++++++--
1 file 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 2bf0f2cb59b..111bd382b98 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 ())
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-06-08 11:48 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-08 11:48 [gcc/devel/rust/master] Const fold ref,pointer,borrow+deref Thomas Schwinge
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).