From: Pierre-Emmanuel Patry Date: Thu, 30 Mar 2023 14:35:53 +0000 (+0200) Subject: gccrs: expand: Add inner attribute expansion stubs X-Git-Tag: basepoints/gcc-15~2686 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0c985f7d309d321482833d409df8864820c778eb;p=thirdparty%2Fgcc.git gccrs: expand: Add inner attribute expansion stubs Add function stubs for inner attribute proc macros expansion. gcc/rust/ChangeLog: * expand/rust-expand-visitor.cc (ExpandVisitor::visit): Add call to inner attribute stub. (ExpandVisitor::expand_inner_attribute): Expand one single attribute. (ExpandVisitor::visit_inner_using_attrs): Expand a given item using a vector of attributes. (ExpandVisitor::visit_inner_attrs): Visit inner attributes of a given item. * expand/rust-expand-visitor.h: Add function prototypes. Signed-off-by: Pierre-Emmanuel Patry --- diff --git a/gcc/rust/expand/rust-expand-visitor.cc b/gcc/rust/expand/rust-expand-visitor.cc index 966194824678..b2d1cf3e0c3d 100644 --- a/gcc/rust/expand/rust-expand-visitor.cc +++ b/gcc/rust/expand/rust-expand-visitor.cc @@ -762,8 +762,11 @@ void ExpandVisitor::visit (AST::Module &module) { if (module.get_kind () == AST::Module::ModuleKind::LOADED) - for (auto &item : module.get_items ()) - visit (item); + { + visit_inner_attrs (module); + for (auto &item : module.get_items ()) + visit (item); + } } void @@ -789,6 +792,8 @@ ExpandVisitor::visit (AST::UseDeclaration &use_decl) void ExpandVisitor::visit (AST::Function &function) { + visit_inner_using_attrs (function, + function.get_definition ()->get_inner_attrs ()); for (auto ¶m : function.get_generic_params ()) visit (param); @@ -954,6 +959,7 @@ ExpandVisitor::visit (AST::Trait &trait) void ExpandVisitor::visit (AST::InherentImpl &impl) { + visit_inner_attrs (impl); // just expand sub-stuff - can't actually strip generic params themselves for (auto &generic : impl.get_generic_params ()) visit (generic); @@ -978,6 +984,7 @@ ExpandVisitor::visit (AST::InherentImpl &impl) void ExpandVisitor::visit (AST::TraitImpl &impl) { + visit_inner_attrs (impl); // just expand sub-stuff - can't actually strip generic params themselves for (auto ¶m : impl.get_generic_params ()) visit (param); @@ -1035,6 +1042,7 @@ ExpandVisitor::visit (AST::ExternalFunctionItem &item) void ExpandVisitor::visit (AST::ExternBlock &block) { + visit_inner_attrs (block); std::function (AST::SingleASTNode)> extractor = [] (AST::SingleASTNode node) { return node.take_external_item (); }; @@ -1341,6 +1349,35 @@ ExpandVisitor::visit (AST::BareFunctionType &type) visit (type.get_return_type ()); } +template +void +ExpandVisitor::expand_inner_attribute (T &item, AST::SimplePath &path) +{ + // TODO: Warn about instability ? + // FIXME: Implement expansion for that particular path +} + +template +void +ExpandVisitor::visit_inner_using_attrs (T &item, + std::vector &attrs) +{ + for (auto it = attrs.begin (); it != attrs.end (); /* erase => No increment*/) + { + auto current = *it; + + it = attrs.erase (it); + expand_inner_attribute (item, current.get_path ()); + } +} + +template +void +ExpandVisitor::visit_inner_attrs (T &item) +{ + visit_inner_using_attrs (item, item.get_inner_attrs ()); +} + template void ExpandVisitor::expand_derive (const T &item, diff --git a/gcc/rust/expand/rust-expand-visitor.h b/gcc/rust/expand/rust-expand-visitor.h index 613251dfbbea..66dc1870628c 100644 --- a/gcc/rust/expand/rust-expand-visitor.h +++ b/gcc/rust/expand/rust-expand-visitor.h @@ -313,6 +313,14 @@ public: void visit (AST::InferredType &) override; void visit (AST::BareFunctionType &type) override; + template + void expand_inner_attribute (T &item, AST::SimplePath &Path); + + template + void visit_inner_using_attrs (T &item, std::vector &attrs); + + template void visit_inner_attrs (T &item); + bool is_derive (AST::Attribute &attr); template