[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