[gcc r14-7558] gccrs: Add missing compile locals for constants and statics

Arthur Cohen cohenarthur@gcc.gnu.org
Tue Jan 16 17:40:28 GMT 2024


https://gcc.gnu.org/g:de9c1ff6d590c871eda5fe0da56efce0735e81fc

commit r14-7558-gde9c1ff6d590c871eda5fe0da56efce0735e81fc
Author: Philip Herron <herron.philip@googlemail.com>
Date:   Fri May 5 16:54:28 2023 +0100

    gccrs: Add missing compile locals for constants and statics
    
    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>

Diff:
---
 gcc/rust/backend/rust-compile-base.cc    | 11 +++++++++--
 gcc/testsuite/rust/compile/issue-2178.rs | 10 ++++++++++
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/gcc/rust/backend/rust-compile-base.cc b/gcc/rust/backend/rust-compile-base.cc
index 23ddc07738c..60ae25c87e3 100644
--- a/gcc/rust/backend/rust-compile-base.cc
+++ b/gcc/rust/backend/rust-compile-base.cc
@@ -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
index 00000000000..faa22288b2b
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-2178.rs
@@ -0,0 +1,10 @@
+const A: usize = {
+    // { dg-warning "unused name" "" { target *-*-* } .-1 }
+    let x = 23;
+    x
+};
+
+static B: usize = {
+    let x = 23;
+    x
+};


More information about the Gcc-cvs mailing list