https://gcc.gnu.org/g:b276fbcc9d8ad078f1bc652e9bc02b214ff521e1

commit r17-4088-gb276fbcc9d8ad078f1bc652e9bc02b214ff521e1
Author: Owen Avery <[email protected]>
Date:   Sat Aug 1 11:26:54 2026 -0400

    gccrs: Make ExpandVisitor visit more attributes
    
    Makes ExpandVisitor rely more on functions provided by PointerVisitor.
    More can be done in this area, but this is enough for now to fix an
    issue compiling core.
    
    gcc/rust/ChangeLog:
    
            * expand/rust-expand-visitor.cc
            (ExpandVisitor::expand_struct_fields): Remove function
            definition.
            (ExpandVisitor::expand_tuple_fields): Likewise.
            (ExpandVisitor::visit (Function)): Visit outer attributes, add
            comment about inner attribute visiting.
            (ExpandVisitor::visit (StructStruct)): Remove function
            definition.
            (ExpandVisitor::visit (TupleStruct)): Likewise.
            (ExpandVisitor::visit (EnumItemTuple)): Likewise.
            (ExpandVisitor::visit (EnumItemStruct)): Likewise.
            (ExpandVisitor::visit (Union)): Likewise.
            (ExpandVisitor::visit (ExternalStaticItem)): Likewise.
            * expand/rust-expand-visitor.h
            (ExpandVisitor::visit (StructStruct)): Remove function
            declaration.
            (ExpandVisitor::visit (TupleStruct)): Likewise.
            (ExpandVisitor::visit (EnumItemTuple)): Likewise.
            (ExpandVisitor::visit (EnumItemStruct)): Likewise.
            (ExpandVisitor::visit (Union)): Likewise.
            (ExpandVisitor::visit (ExternalStaticItem)): Likewise.
            (ExpandVisitor::expand_fields): Likewise.
    
    gcc/testsuite/ChangeLog:
    
            * rust/compile/doc_macro_2.rs: New test.
    
    Signed-off-by: Owen Avery <[email protected]>

Diff:
---
 gcc/rust/expand/rust-expand-visitor.cc    | 66 ++-----------------------------
 gcc/rust/expand/rust-expand-visitor.h     | 16 --------
 gcc/testsuite/rust/compile/doc_macro_2.rs | 24 +++++++++++
 3 files changed, 27 insertions(+), 79 deletions(-)

diff --git a/gcc/rust/expand/rust-expand-visitor.cc 
b/gcc/rust/expand/rust-expand-visitor.cc
index 64a4f7a2dd37..3a042ac9a9c3 100644
--- a/gcc/rust/expand/rust-expand-visitor.cc
+++ b/gcc/rust/expand/rust-expand-visitor.cc
@@ -431,18 +431,6 @@ ExpandVisitor::maybe_expand_pattern 
(std::unique_ptr<AST::Pattern> &pattern)
     pattern = final_fragment.take_pattern_fragment ();
 }
 
-void
-ExpandVisitor::expand_struct_fields (std::vector<AST::StructField> &fields)
-{
-  expand_fields (fields);
-}
-
-void
-ExpandVisitor::expand_tuple_fields (std::vector<AST::TupleField> &fields)
-{
-  expand_fields (fields);
-}
-
 // FIXME: This can definitely be refactored with the method above
 void
 ExpandVisitor::expand_function_params (
@@ -742,6 +730,9 @@ ExpandVisitor::visit (AST::UseDeclaration &use_decl)
 void
 ExpandVisitor::visit (AST::Function &function)
 {
+  visit_outer_attrs (function);
+  // TODO: handle body inner attributes more regularly?
+  //       apparently, they should be applied to this function
   if (function.has_body ())
     visit_inner_using_attrs (
       function, function.get_definition ().value ()->get_inner_attrs ());
@@ -760,61 +751,16 @@ ExpandVisitor::visit (AST::Function &function)
     visit (*function.get_definition ());
 }
 
-void
-ExpandVisitor::visit (AST::StructStruct &struct_item)
-{
-  for (auto &generic : struct_item.get_generic_params ())
-    visit (generic);
-
-  if (struct_item.has_where_clause ())
-    expand_where_clause (struct_item.get_where_clause ());
-
-  expand_struct_fields (struct_item.get_fields ());
-}
-
-void
-ExpandVisitor::visit (AST::TupleStruct &tuple_struct)
-{
-  for (auto &generic : tuple_struct.get_generic_params ())
-    visit (generic);
-
-  if (tuple_struct.has_where_clause ())
-    expand_where_clause (tuple_struct.get_where_clause ());
-
-  expand_tuple_fields (tuple_struct.get_fields ());
-}
-
 void
 ExpandVisitor::visit (AST::EnumItem &item)
 {}
 
-void
-ExpandVisitor::visit (AST::EnumItemTuple &item)
-{
-  expand_tuple_fields (item.get_tuple_fields ());
-}
-
-void
-ExpandVisitor::visit (AST::EnumItemStruct &item)
-{
-  expand_struct_fields (item.get_struct_fields ());
-}
-
 void
 ExpandVisitor::visit (AST::EnumItemDiscriminant &item)
 {
   maybe_expand_expr (item.get_expr_ptr ());
 }
 
-void
-ExpandVisitor::visit (AST::Union &union_item)
-{
-  for (auto &generic : union_item.get_generic_params ())
-    visit (generic);
-
-  expand_struct_fields (union_item.get_variants ());
-}
-
 void
 ExpandVisitor::visit (AST::Trait &trait)
 {
@@ -888,12 +834,6 @@ void
 ExpandVisitor::visit (AST::ExternalTypeItem &item)
 {}
 
-void
-ExpandVisitor::visit (AST::ExternalStaticItem &static_item)
-{
-  maybe_expand_type (static_item.get_type_ptr ());
-}
-
 void
 ExpandVisitor::visit (AST::ExternBlock &block)
 {
diff --git a/gcc/rust/expand/rust-expand-visitor.h 
b/gcc/rust/expand/rust-expand-visitor.h
index 6faf825ae3e7..f387d28a1fbe 100644
--- a/gcc/rust/expand/rust-expand-visitor.h
+++ b/gcc/rust/expand/rust-expand-visitor.h
@@ -257,18 +257,12 @@ public:
   void visit (AST::UseTreeRebind &) override;
   void visit (AST::UseDeclaration &use_decl) override;
   void visit (AST::Function &function) override;
-  void visit (AST::StructStruct &struct_item) override;
-  void visit (AST::TupleStruct &tuple_struct) override;
   void visit (AST::EnumItem &item) override;
-  void visit (AST::EnumItemTuple &item) override;
-  void visit (AST::EnumItemStruct &item) override;
   void visit (AST::EnumItemDiscriminant &item) override;
-  void visit (AST::Union &union_item) override;
   void visit (AST::Trait &trait) override;
   void visit (AST::InherentImpl &impl) override;
   void visit (AST::TraitImpl &impl) override;
   void visit (AST::ExternalTypeItem &item) override;
-  void visit (AST::ExternalStaticItem &item) override;
   void visit (AST::ExternBlock &block) override;
 
   // I don't think it would be possible to strip macros without expansion
@@ -297,16 +291,6 @@ public:
 private:
   MacroExpander &expander;
   NodeId macro_invoc_expect_id;
-
-  /**
-   * Helper to expand all macro invocations in lieu of types within a vector of
-   * fields (StructField or TupleField).
-   */
-  template <typename T> void expand_fields (std::vector<T> &fields)
-  {
-    for (auto &field : fields)
-      maybe_expand_type (field.get_field_type_ptr ());
-  }
 };
 
 } // namespace Rust
diff --git a/gcc/testsuite/rust/compile/doc_macro_2.rs 
b/gcc/testsuite/rust/compile/doc_macro_2.rs
new file mode 100644
index 000000000000..82101ec614f6
--- /dev/null
+++ b/gcc/testsuite/rust/compile/doc_macro_2.rs
@@ -0,0 +1,24 @@
+// { dg-additional-options "-w" }
+#![feature(no_core)]
+#![no_core]
+
+macro_rules! foo {
+    ($e:expr, $($t:tt)*) => {
+        #[doc = $e]
+        $($t)*
+    }
+}
+
+macro_rules! bar {
+    () => { "bar" }
+}
+
+struct S;
+
+trait T {
+    fn f();
+}
+
+impl T for S {
+    foo!(bar!(), fn f() {});
+}

Reply via email to