]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Add missing compile locals for constants and statics
authorPhilip Herron <herron.philip@googlemail.com>
Fri, 5 May 2023 15:54:28 +0000 (16:54 +0100)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 17:37:15 +0000 (18:37 +0100)
When we have a block expression for cosntants or statics we need to ensure
we compile the locals for the implicit function we generate in GIMPLE
before feeding it directly into the constant folder to evaluate the data.

Fixes #2178

gcc/rust/ChangeLog:

* backend/rust-compile-base.cc: add missing compile_locals call

gcc/testsuite/ChangeLog:

* rust/compile/issue-2178.rs: New test.

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
gcc/rust/backend/rust-compile-base.cc
gcc/testsuite/rust/compile/issue-2178.rs [new file with mode: 0644]

index 23ddc07738c010b3a5cba901e8e1e46ff4d2bfc3..60ae25c87e39926385afcb6f3d04a95f9f682ec0 100644 (file)
@@ -666,8 +666,8 @@ HIRCompileBase::compile_constant_item (
     = ctx->get_backend ()->function (compiled_fn_type, ident, "", 0, locus);
   TREE_READONLY (fndecl) = 1;
 
+  std::vector<Bvariable *> locals;
   tree enclosing_scope = NULL_TREE;
-
   Location start_location = const_value_expr->get_locus ();
   Location end_location = const_value_expr->get_locus ();
   if (is_block_expr)
@@ -676,9 +676,16 @@ HIRCompileBase::compile_constant_item (
        = static_cast<HIR::BlockExpr *> (const_value_expr);
       start_location = function_body->get_locus ();
       end_location = function_body->get_end_locus ();
+
+      Resolver::Rib *rib = nullptr;
+      bool ok = ctx->get_resolver ()->find_name_rib (
+       function_body->get_mappings ().get_nodeid (), &rib);
+      rust_assert (ok);
+
+      locals = compile_locals_for_block (ctx, *rib, fndecl);
     }
 
-  tree code_block = ctx->get_backend ()->block (fndecl, enclosing_scope, {},
+  tree code_block = ctx->get_backend ()->block (fndecl, enclosing_scope, locals,
                                                start_location, end_location);
   ctx->push_block (code_block);
 
diff --git a/gcc/testsuite/rust/compile/issue-2178.rs b/gcc/testsuite/rust/compile/issue-2178.rs
new file mode 100644 (file)
index 0000000..faa2228
--- /dev/null
@@ -0,0 +1,10 @@
+const A: usize = {
+    // { dg-warning "unused name" "" { target *-*-* } .-1 }
+    let x = 23;
+    x
+};
+
+static B: usize = {
+    let x = 23;
+    x
+};