[COMMITTED 31/43] gccrs: Add missing context ast walker to check for free fn's

arthur.cohen@opensrcsec.com arthur.cohen@opensrcsec.com
Thu Sep 10 08:19:44 GMT 2026


From: Philip Herron <herron.philip@googlemail.com>

Fixes Rust-GCC/gccrs#3585

gcc/rust/ChangeLog:

	* ast/rust-ast-visitor.cc (ContextualASTVisitor::visit): missing visitor
	* ast/rust-ast-visitor.h: prototype

gcc/testsuite/ChangeLog:

	* rust/compile/issue-3585-1.rs: New test.
	* rust/compile/issue-3585-2.rs: New test.

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
---
 gcc/rust/ast/rust-ast-visitor.cc           |  8 +++++
 gcc/rust/ast/rust-ast-visitor.h            |  2 ++
 gcc/testsuite/rust/compile/issue-3585-1.rs | 15 ++++++++
 gcc/testsuite/rust/compile/issue-3585-2.rs | 42 ++++++++++++++++++++++
 4 files changed, 67 insertions(+)
 create mode 100644 gcc/testsuite/rust/compile/issue-3585-1.rs
 create mode 100644 gcc/testsuite/rust/compile/issue-3585-2.rs

diff --git a/gcc/rust/ast/rust-ast-visitor.cc b/gcc/rust/ast/rust-ast-visitor.cc
index 892a35648fc..7e10ef7508e 100644
--- a/gcc/rust/ast/rust-ast-visitor.cc
+++ b/gcc/rust/ast/rust-ast-visitor.cc
@@ -1536,5 +1536,13 @@ ContextualASTVisitor::visit (AST::Trait &trait)
   ctx.exit ();
 }
 
+void
+ContextualASTVisitor::visit (AST::Function &function)
+{
+  ctx.enter (Kind::FUNCTION);
+  DefaultASTVisitor::visit (function);
+  ctx.exit ();
+}
+
 } // namespace AST
 } // namespace Rust
diff --git a/gcc/rust/ast/rust-ast-visitor.h b/gcc/rust/ast/rust-ast-visitor.h
index 4ca56d139e9..e670cbe21aa 100644
--- a/gcc/rust/ast/rust-ast-visitor.h
+++ b/gcc/rust/ast/rust-ast-visitor.h
@@ -479,6 +479,8 @@ protected:
 
   virtual void visit (AST::Trait &trait) override;
 
+  virtual void visit (AST::Function &function) override;
+
   template <typename T> void visit (T &item)
   {
     DefaultASTVisitor::visit (item);
diff --git a/gcc/testsuite/rust/compile/issue-3585-1.rs b/gcc/testsuite/rust/compile/issue-3585-1.rs
new file mode 100644
index 00000000000..2e901363aad
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3585-1.rs
@@ -0,0 +1,15 @@
+#![feature(no_core)]
+#![no_core]
+
+macro_rules! mac_trait {
+    ($i:item) => {
+        trait T { $i }
+    }
+}
+
+mac_trait! {
+    fn foo() {
+    fn foo();
+    // { dg-error "free function without a body" "" { target *-*-* } .-1 }
+}
+}
diff --git a/gcc/testsuite/rust/compile/issue-3585-2.rs b/gcc/testsuite/rust/compile/issue-3585-2.rs
new file mode 100644
index 00000000000..1da358f9c3c
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3585-2.rs
@@ -0,0 +1,42 @@
+#![feature(no_core)]
+#![no_core]
+#![feature(lang_items)]
+
+#[lang = "sized"]
+trait Sized {}
+
+fn main() {}
+
+macro_rules! mac_impl {
+    ($i:item) => {
+        struct S;
+        impl S { $i }
+    }
+}
+
+mac_impl! {
+    fn foo() {}
+}
+
+macro_rules! mac_trait {
+    ($i:item) => {
+        trait T { $i }
+    }
+}
+
+mac_trait! {
+    fn foo() {
+    fn foo();
+    // { dg-error "free function without a body" "" { target *-*-* } .-1 }
+}
+}
+
+macro_rules! mac_extern {
+    ($i:item) => {
+        extern "C" { $i }
+    }
+}
+
+mac_extern! {
+    fn foo();
+}
-- 
2.50.1



More information about the Gcc-rust mailing list