aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPhilip Herron <herron.philip@googlemail.com>2025-01-13 11:51:51 +0000
committerPhilip Herron <philip.herron@embecosm.com>2025-01-13 13:13:19 +0000
commit0a935444fbf9e99c7a3eff026e2a7ab910e77151 (patch)
tree5ecdf9959186d46547708b720795ffda009b1222 /gcc
parent5db9ab5426ab234ed9cda01ceebc444c90631f6a (diff)
downloadgcc-0a935444fbf9e99c7a3eff026e2a7ab910e77151.zip
gcc-0a935444fbf9e99c7a3eff026e2a7ab910e77151.tar.gz
gcc-0a935444fbf9e99c7a3eff026e2a7ab910e77151.tar.bz2
gccrs: Add missing name resolution to static items in blocks
We need to add name resolution and hir lowering for items as part of blocks in order to typecheck and compile them correctly. Fixes Rust-GCC#3350 gcc/rust/ChangeLog: * hir/rust-ast-lower-stmt.cc (ASTLoweringStmt::visit): hir lowering * hir/rust-ast-lower-stmt.h: likewise * resolve/rust-ast-resolve-stmt.cc (ResolveStmt::visit): name resolution * resolve/rust-ast-resolve-stmt.h: likewise gcc/testsuite/ChangeLog: * rust/compile/issue-3350.rs: New test. Signed-off-by: Philip Herron <herron.philip@googlemail.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/hir/rust-ast-lower-stmt.cc6
-rw-r--r--gcc/rust/hir/rust-ast-lower-stmt.h1
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-stmt.cc21
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-stmt.h1
-rw-r--r--gcc/testsuite/rust/compile/issue-3350.rs10
5 files changed, 39 insertions, 0 deletions
diff --git a/gcc/rust/hir/rust-ast-lower-stmt.cc b/gcc/rust/hir/rust-ast-lower-stmt.cc
index 29da916..761a638 100644
--- a/gcc/rust/hir/rust-ast-lower-stmt.cc
+++ b/gcc/rust/hir/rust-ast-lower-stmt.cc
@@ -163,5 +163,11 @@ ASTLoweringStmt::visit (AST::TraitImpl &impl_block)
translated = ASTLoweringItem::translate (impl_block);
}
+void
+ASTLoweringStmt::visit (AST::StaticItem &var)
+{
+ translated = ASTLoweringItem::translate (var);
+}
+
} // namespace HIR
} // namespace Rust
diff --git a/gcc/rust/hir/rust-ast-lower-stmt.h b/gcc/rust/hir/rust-ast-lower-stmt.h
index 111990d..ed39512 100644
--- a/gcc/rust/hir/rust-ast-lower-stmt.h
+++ b/gcc/rust/hir/rust-ast-lower-stmt.h
@@ -45,6 +45,7 @@ public:
void visit (AST::Trait &trait) override;
void visit (AST::InherentImpl &impl_block) override;
void visit (AST::TraitImpl &impl_block) override;
+ void visit (AST::StaticItem &var) override;
private:
ASTLoweringStmt () : translated (nullptr), terminated (false) {}
diff --git a/gcc/rust/resolve/rust-ast-resolve-stmt.cc b/gcc/rust/resolve/rust-ast-resolve-stmt.cc
index 7b62d1f..ecd1976 100644
--- a/gcc/rust/resolve/rust-ast-resolve-stmt.cc
+++ b/gcc/rust/resolve/rust-ast-resolve-stmt.cc
@@ -56,5 +56,26 @@ ResolveStmt::visit (AST::TraitImpl &impl_block)
ResolveItem::go (impl_block, prefix, canonical_prefix);
}
+void
+ResolveStmt::visit (AST::StaticItem &var)
+{
+ auto decl = CanonicalPath::new_seg (var.get_node_id (),
+ var.get_identifier ().as_string ());
+ auto path = decl;
+ auto cpath = canonical_prefix.append (decl);
+ mappings.insert_canonical_path (var.get_node_id (), cpath);
+
+ resolver->get_name_scope ().insert (
+ path, var.get_node_id (), var.get_locus (), false, Rib::ItemType::Static,
+ [&] (const CanonicalPath &, NodeId, location_t locus) -> void {
+ rich_location r (line_table, var.get_locus ());
+ r.add_range (locus);
+ rust_error_at (r, "redefined multiple times");
+ });
+
+ ResolveType::go (var.get_type ());
+ ResolveExpr::go (var.get_expr (), path, cpath);
+}
+
} // namespace Resolver
} // namespace Rust
diff --git a/gcc/rust/resolve/rust-ast-resolve-stmt.h b/gcc/rust/resolve/rust-ast-resolve-stmt.h
index 7118b70..fd9880c 100644
--- a/gcc/rust/resolve/rust-ast-resolve-stmt.h
+++ b/gcc/rust/resolve/rust-ast-resolve-stmt.h
@@ -388,6 +388,7 @@ public:
void visit (AST::Trait &trait) override;
void visit (AST::InherentImpl &impl_block) override;
void visit (AST::TraitImpl &impl_block) override;
+ void visit (AST::StaticItem &var) override;
private:
ResolveStmt (const CanonicalPath &prefix,
diff --git a/gcc/testsuite/rust/compile/issue-3350.rs b/gcc/testsuite/rust/compile/issue-3350.rs
new file mode 100644
index 0000000..8880659
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3350.rs
@@ -0,0 +1,10 @@
+static FOO: i32 = 0;
+
+pub fn bar() -> i32 {
+ FOO
+}
+
+pub fn baz() -> i32 {
+ static QUX: i32 = 0;
+ QUX
+}