diff options
author | Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com> | 2023-06-09 17:13:41 +0200 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2024-01-16 18:46:29 +0100 |
commit | 0974798a3f5259b14b95edf9ddbe9c81af76ecff (patch) | |
tree | 49b893f06ac1e6cf53a300b3f5eaec73542a7aee /gcc/rust | |
parent | 9035128b75b9c8b4465e33bafed43649046534b6 (diff) | |
download | gcc-0974798a3f5259b14b95edf9ddbe9c81af76ecff.zip gcc-0974798a3f5259b14b95edf9ddbe9c81af76ecff.tar.gz gcc-0974798a3f5259b14b95edf9ddbe9c81af76ecff.tar.bz2 |
gccrs: expand: Add tail expr expansion
Tail expression may contain attribute and thus should be expanded.
gcc/rust/ChangeLog:
* ast/rust-expr.h: Add a function to take tail expr as well
as a function to set a tail expression.
* expand/rust-expand-visitor.cc (expand_tail_expr): Add tail
expression expansion function.
(ExpandVisitor::visit): Add call to tail expr expansion in for
BlockExpr.
Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Diffstat (limited to 'gcc/rust')
-rw-r--r-- | gcc/rust/ast/rust-expr.h | 11 | ||||
-rw-r--r-- | gcc/rust/expand/rust-expand-visitor.cc | 38 |
2 files changed, 47 insertions, 2 deletions
diff --git a/gcc/rust/ast/rust-expr.h b/gcc/rust/ast/rust-expr.h index adf9b68..2791a8c 100644 --- a/gcc/rust/ast/rust-expr.h +++ b/gcc/rust/ast/rust-expr.h @@ -2487,6 +2487,17 @@ public: return expr; } + std::unique_ptr<Expr> take_tail_expr () + { + rust_assert (has_tail_expr ()); + return std::move (expr); + } + + void set_tail_expr (std::unique_ptr<Expr> expr) + { + this->expr = std::move (expr); + } + // Removes the tail expression from the block. void strip_tail_expr () { expr = nullptr; } // Normalizes a trailing statement without a semicolon to a tail expression. diff --git a/gcc/rust/expand/rust-expand-visitor.cc b/gcc/rust/expand/rust-expand-visitor.cc index e9eefdb..6df9f7c 100644 --- a/gcc/rust/expand/rust-expand-visitor.cc +++ b/gcc/rust/expand/rust-expand-visitor.cc @@ -149,9 +149,9 @@ expand_item_attribute (AST::Item &item, AST::SimplePath &name, return result; } +template <typename T> static std::vector<std::unique_ptr<AST::Stmt>> -expand_stmt_attribute (AST::Item &item, AST::SimplePath &name, - MacroExpander &expander) +expand_stmt_attribute (T &item, AST::SimplePath &name, MacroExpander &expander) { std::vector<std::unique_ptr<AST::Stmt>> result; auto frag = expander.expand_attribute_proc_macro (item, name); @@ -173,6 +173,39 @@ expand_stmt_attribute (AST::Item &item, AST::SimplePath &name, } void +expand_tail_expr (AST::BlockExpr &item, MacroExpander &expander) +{ + if (item.has_tail_expr ()) + { + auto tail = item.take_tail_expr (); + auto attrs = tail->get_outer_attrs (); + bool changed = false; + for (auto it = attrs.begin (); it != attrs.end ();) + { + auto current = *it; + if (is_builtin (current)) + { + it++; + } + else + { + it = attrs.erase (it); + changed = true; + auto new_stmts + = expand_stmt_attribute (item, current.get_path (), expander); + auto &stmts = item.get_statements (); + std::move (new_stmts.begin (), new_stmts.end (), + std::inserter (stmts, stmts.end ())); + } + } + if (changed) + item.strip_tail_expr (); + else + item.set_tail_expr (std::move (tail)); + } +} + +void ExpandVisitor::expand_inner_items ( std::vector<std::unique_ptr<AST::Item>> &items) { @@ -799,6 +832,7 @@ ExpandVisitor::visit (AST::BlockExpr &expr) { expand_inner_stmts (expr.get_statements ()); + expand_tail_expr (expr, expander); if (expr.has_tail_expr ()) maybe_expand_expr (expr.get_tail_expr ()); } |