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).