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() {}); +}
