From: Philip Herron <herron.phi...@googlemail.com>

We need to reuse the existing compile_constant_item helper which handles
the case if this is a simple expression, fn-call or a block expression.
The patch extracts out this helper as a static method so this can be used
in more places.

Fixes Rust-GCC#3566

gcc/rust/ChangeLog:

        * backend/rust-compile-base.cc (HIRCompileBase::address_expression): 
new helper constexpr
        * backend/rust-compile-base.h: prototype
        * backend/rust-compile-type.cc (TyTyResolveCompile::visit): call 
constexpr helper

gcc/testsuite/ChangeLog:

        * rust/compile/issue-3566-1.rs: New test.
        * rust/compile/issue-3566-2.rs: New test.

Signed-off-by: Philip Herron <herron.phi...@googlemail.com>
---
 gcc/rust/backend/rust-compile-base.cc      | 12 ++++++++++++
 gcc/rust/backend/rust-compile-base.h       |  6 ++++++
 gcc/rust/backend/rust-compile-type.cc      | 12 +++++++++++-
 gcc/testsuite/rust/compile/issue-3566-1.rs |  8 ++++++++
 gcc/testsuite/rust/compile/issue-3566-2.rs | 22 ++++++++++++++++++++++
 5 files changed, 59 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/rust/compile/issue-3566-1.rs
 create mode 100644 gcc/testsuite/rust/compile/issue-3566-2.rs

diff --git a/gcc/rust/backend/rust-compile-base.cc 
b/gcc/rust/backend/rust-compile-base.cc
index bcc7fc4fcbf..b47711364e5 100644
--- a/gcc/rust/backend/rust-compile-base.cc
+++ b/gcc/rust/backend/rust-compile-base.cc
@@ -560,6 +560,18 @@ HIRCompileBase::address_expression (tree expr, location_t 
location)
   return build_fold_addr_expr_loc (location, expr);
 }
 
+tree
+HIRCompileBase::compile_constant_expr (
+  Context *ctx, HirId coercion_id, TyTy::BaseType *resolved_type,
+  TyTy::BaseType *expected_type, const Resolver::CanonicalPath &canonical_path,
+  HIR::Expr &const_value_expr, location_t locus, location_t expr_locus)
+{
+  HIRCompileBase c (ctx);
+  return c.compile_constant_item (coercion_id, resolved_type, expected_type,
+                                 canonical_path, const_value_expr, locus,
+                                 expr_locus);
+}
+
 tree
 HIRCompileBase::indirect_expression (tree expr, location_t locus)
 {
diff --git a/gcc/rust/backend/rust-compile-base.h 
b/gcc/rust/backend/rust-compile-base.h
index 9328a7f7483..109c8530321 100644
--- a/gcc/rust/backend/rust-compile-base.h
+++ b/gcc/rust/backend/rust-compile-base.h
@@ -31,6 +31,12 @@ public:
 
   static tree address_expression (tree expr, location_t locus);
 
+  static tree compile_constant_expr (
+    Context *ctx, HirId coercion_id, TyTy::BaseType *resolved_type,
+    TyTy::BaseType *expected_type,
+    const Resolver::CanonicalPath &canonical_path, HIR::Expr &const_value_expr,
+    location_t locus, location_t expr_locus);
+
 protected:
   HIRCompileBase (Context *ctx) : ctx (ctx) {}
 
diff --git a/gcc/rust/backend/rust-compile-type.cc 
b/gcc/rust/backend/rust-compile-type.cc
index d8af1d1af6b..73548011cd0 100644
--- a/gcc/rust/backend/rust-compile-type.cc
+++ b/gcc/rust/backend/rust-compile-type.cc
@@ -456,7 +456,17 @@ TyTyResolveCompile::visit (const TyTy::ArrayType &type)
     = TyTyResolveCompile::compile (ctx, type.get_element_type ());
 
   ctx->push_const_context ();
-  tree capacity_expr = CompileExpr::Compile (type.get_capacity_expr (), ctx);
+
+  HIR::Expr &hir_capacity_expr = type.get_capacity_expr ();
+  TyTy::BaseType *capacity_expr_ty = nullptr;
+  bool ok = ctx->get_tyctx ()->lookup_type (
+    hir_capacity_expr.get_mappings ().get_hirid (), &capacity_expr_ty);
+  rust_assert (ok);
+  tree capacity_expr = HIRCompileBase::compile_constant_expr (
+    ctx, hir_capacity_expr.get_mappings ().get_hirid (), capacity_expr_ty,
+    capacity_expr_ty, Resolver::CanonicalPath::create_empty (),
+    hir_capacity_expr, type.get_locus (), hir_capacity_expr.get_locus ());
+
   ctx->pop_const_context ();
 
   tree folded_capacity_expr = fold_expr (capacity_expr);
diff --git a/gcc/testsuite/rust/compile/issue-3566-1.rs 
b/gcc/testsuite/rust/compile/issue-3566-1.rs
new file mode 100644
index 00000000000..b7e5be0ab57
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3566-1.rs
@@ -0,0 +1,8 @@
+mod a {
+    pub mod b {
+
+        pub fn f(x: [u8; { 100 }]) -> [u8; { 100 }] {
+            x
+        }
+    }
+}
diff --git a/gcc/testsuite/rust/compile/issue-3566-2.rs 
b/gcc/testsuite/rust/compile/issue-3566-2.rs
new file mode 100644
index 00000000000..3f3ea73789a
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3566-2.rs
@@ -0,0 +1,22 @@
+// run-pass
+
+#![allow(H8)]
+#![allow(dead_code)]
+
+
+// pretty-expanded FIXME #23616
+
+mod a {
+    pub mod b {
+        pub type t = isize;
+
+        pub fn f(x: [u8; { let s = 17; 100 }]) -> [u8;  { let z = 18; 100 }] {
+    //~^ WARN unused variable: `s`
+    //~| WARN unused variable: `z`
+    x
+}
+    }
+}
+
+pub fn main() {    //~ ERROR cannot move out
+    }
-- 
2.49.0

Reply via email to