[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