]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Add missing name resolution to static items in blocks
authorPhilip Herron <herron.philip@googlemail.com>
Mon, 13 Jan 2025 11:51:51 +0000 (11:51 +0000)
committerArthur Cohen <arthur.cohen@embecosm.com>
Fri, 21 Mar 2025 11:56:57 +0000 (12:56 +0100)
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>
gcc/rust/hir/rust-ast-lower-stmt.cc
gcc/rust/hir/rust-ast-lower-stmt.h
gcc/rust/resolve/rust-ast-resolve-stmt.cc
gcc/rust/resolve/rust-ast-resolve-stmt.h
gcc/testsuite/rust/compile/issue-3350.rs [new file with mode: 0644]

index 8244e8ae2ba4e797f1858177d94fef9c8e58e025..fd2cdfb0f115bc2564f71c8252c683541f5e060d 100644 (file)
@@ -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
index 5b1e1b9c99ad3da580a625bc8ee07abd8802c55c..737a5f8dc4be9575e708f4292e56ad987157f872 100644 (file)
@@ -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) {}
index 28852910c713e3f47d453f20151d5b4de3705874..226d8e8e2f4c9159b1865a0e764fab6a8eb34f03 100644 (file)
@@ -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
index 8e64a7691d93f9f608e28201e5b4700b1eea8267..6dfac9179d70c6625c5bd85e949a2a042ecc2515 100644 (file)
@@ -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 (file)
index 0000000..8880659
--- /dev/null
@@ -0,0 +1,10 @@
+static FOO: i32 = 0;
+
+pub fn bar() -> i32 {
+    FOO
+}
+
+pub fn baz() -> i32 {
+    static QUX: i32 = 0;
+    QUX
+}