From: Philip Herron <[email protected]>

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 <[email protected]>
---
This change was merged into the gccrs repository and is posted here for
upstream visibility and potential drive-by review, as requested by GCC
release managers.
Each commit email contains a link to its details on github from where you can
find the Pull-Request and associated discussions.


Commit on github: 
https://github.com/Rust-GCC/gccrs/commit/7620b4e8c45fef22b046a3c299ffcd8a56443553

The commit has been mentioned in the following issue(s):
 - Rust-GCC/gccrs#3585: https://github.com/Rust-GCC/gccrs/issues/3585

The commit has been mentioned in the following pull-request(s):
 - https://github.com/Rust-GCC/gccrs/pull/4779

 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 892a35648..7e10ef750 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 4ca56d139..e670cbe21 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 000000000..2e901363a
--- /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 000000000..1da358f9c
--- /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();
+}

base-commit: d09ba8e4ece68d9c6d76ad1f49483ae46f29e0f4
-- 
2.54.0

Reply via email to