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

commit r16-2947-gd957db9385c6ead39e61eb4d1dadc8595481ad65
Author: Owen Avery <powerboat9.ga...@gmail.com>
Date:   Fri Jul 18 21:44:09 2025 -0400

    gccrs: Specialize ExpandVisitor::expand_macro_children
    
    gcc/rust/ChangeLog:
    
            * expand/rust-expand-visitor.cc
            (ExpandVisitor::expand_inner_items): Adjust call to
            expand_macro_children.
            (ExpandVisitor::expand_inner_stmts): Likewise.
            (ExpandVisitor::visit): Likewise.
            * expand/rust-expand-visitor.h
            (ExpandVisitor::expand_macro_children): Take a pointer to member
            function instead of a std::function.
    
    Signed-off-by: Owen Avery <powerboat9.ga...@gmail.com>

Diff:
---
 gcc/rust/expand/rust-expand-visitor.cc | 37 +++++++++-------------------------
 gcc/rust/expand/rust-expand-visitor.h  |  6 +++---
 2 files changed, 13 insertions(+), 30 deletions(-)

diff --git a/gcc/rust/expand/rust-expand-visitor.cc 
b/gcc/rust/expand/rust-expand-visitor.cc
index ba7bac12ddf4..69959b541c7f 100644
--- a/gcc/rust/expand/rust-expand-visitor.cc
+++ b/gcc/rust/expand/rust-expand-visitor.cc
@@ -233,10 +233,7 @@ ExpandVisitor::expand_inner_items (
        }
     }
 
-  std::function<std::unique_ptr<AST::Item> (AST::SingleASTNode)> extractor
-    = [] (AST::SingleASTNode node) { return node.take_item (); };
-
-  expand_macro_children (items, extractor);
+  expand_macro_children (items, &AST::SingleASTNode::take_item);
 
   expander.pop_context ();
 }
@@ -324,10 +321,7 @@ ExpandVisitor::expand_inner_stmts (AST::BlockExpr &expr)
   if (!expr.has_tail_expr ())
     expr.normalize_tail_expr ();
 
-  std::function<std::unique_ptr<AST::Stmt> (AST::SingleASTNode)> extractor
-    = [] (AST::SingleASTNode node) { return node.take_stmt (); };
-
-  expand_macro_children (stmts, extractor);
+  expand_macro_children (stmts, &AST::SingleASTNode::take_stmt);
 
   expander.pop_context ();
 }
@@ -866,12 +860,9 @@ ExpandVisitor::visit (AST::Trait &trait)
 
   expander.push_context (MacroExpander::ContextType::TRAIT);
 
-  std::function<std::unique_ptr<AST::AssociatedItem> (AST::SingleASTNode)>
-    extractor
-    = [] (AST::SingleASTNode node) { return node.take_assoc_item (); };
-
   expand_macro_children (MacroExpander::ContextType::TRAIT,
-                        trait.get_trait_items (), extractor);
+                        trait.get_trait_items (),
+                        &AST::SingleASTNode::take_assoc_item);
 
   expander.pop_context ();
 }
@@ -894,12 +885,9 @@ ExpandVisitor::visit (AST::InherentImpl &impl)
   if (impl.has_where_clause ())
     expand_where_clause (impl.get_where_clause ());
 
-  std::function<std::unique_ptr<AST::AssociatedItem> (AST::SingleASTNode)>
-    extractor
-    = [] (AST::SingleASTNode node) { return node.take_assoc_item (); };
-
   expand_macro_children (MacroExpander::ContextType::IMPL,
-                        impl.get_impl_items (), extractor);
+                        impl.get_impl_items (),
+                        &AST::SingleASTNode::take_assoc_item);
 }
 
 void
@@ -922,12 +910,9 @@ ExpandVisitor::visit (AST::TraitImpl &impl)
   if (impl.has_where_clause ())
     expand_where_clause (impl.get_where_clause ());
 
-  std::function<std::unique_ptr<AST::AssociatedItem> (AST::SingleASTNode)>
-    extractor
-    = [] (AST::SingleASTNode node) { return node.take_assoc_item (); };
-
   expand_macro_children (MacroExpander::ContextType::TRAIT_IMPL,
-                        impl.get_impl_items (), extractor);
+                        impl.get_impl_items (),
+                        &AST::SingleASTNode::take_assoc_item);
 }
 
 void
@@ -944,12 +929,10 @@ void
 ExpandVisitor::visit (AST::ExternBlock &block)
 {
   visit_inner_attrs (block);
-  std::function<std::unique_ptr<AST::ExternalItem> (AST::SingleASTNode)>
-    extractor
-    = [] (AST::SingleASTNode node) { return node.take_external_item (); };
 
   expand_macro_children (MacroExpander::ContextType::EXTERN,
-                        block.get_extern_items (), extractor);
+                        block.get_extern_items (),
+                        &AST::SingleASTNode::take_external_item);
 }
 
 void
diff --git a/gcc/rust/expand/rust-expand-visitor.h 
b/gcc/rust/expand/rust-expand-visitor.h
index b82040c0878a..ef78404ae6bc 100644
--- a/gcc/rust/expand/rust-expand-visitor.h
+++ b/gcc/rust/expand/rust-expand-visitor.h
@@ -105,7 +105,7 @@ public:
    */
   template <typename T, typename U>
   void expand_macro_children (MacroExpander::ContextType ctx, T &values,
-                             std::function<U (AST::SingleASTNode)> extractor)
+                             U (AST::SingleASTNode::*extractor) (void))
   {
     expander.push_context (ctx);
 
@@ -121,7 +121,7 @@ public:
    */
   template <typename T, typename U>
   void expand_macro_children (T &values,
-                             std::function<U (AST::SingleASTNode)> extractor)
+                             U (AST::SingleASTNode::*extractor) (void))
   {
     for (auto it = values.begin (); it != values.end ();)
       {
@@ -138,7 +138,7 @@ public:
            it = values.erase (it);
            for (auto &node : final_fragment.get_nodes ())
              {
-               U new_node = extractor (node);
+               U new_node = (node.*extractor) ();
                if (new_node != nullptr)
                  {
                    it = values.insert (it, std::move (new_node));

Reply via email to