From: Lishin <[email protected]>

Add CompileDrop::build_current_scope_drop_cleanup to build the drop
calls for the current scope as one statement tree.

This allows a follow-up patch to place the same cleanup tree in a
TRY_FINALLY_EXPR.

gcc/rust/ChangeLog:

        * backend/rust-compile-drop.cc
        (CompileDrop::build_current_scope_drop_cleanup): New function to
        build current scope drop calls as a statement tree.
        (CompileDrop::emit_current_scope_drop_calls): Use it.
        * backend/rust-compile-drop.h
        (CompileDrop::build_current_scope_drop_cleanup): Declare.

Signed-off-by: Lishin <[email protected]>
---
This change was merged into the gccrs repository and is posted here for
upstream visibility and potential drive-by review, as requested by GCC
release managers.
Each commit email contains a link to its details on github from where you can
find the Pull-Request and associated discussions.


Commit on github: 
https://github.com/Rust-GCC/gccrs/commit/6a983d07b20dac7014e21caaae865ed9504027a5

The commit has NOT been mentioned in any issue.

The commit has been mentioned in the following pull-request(s):
 - https://github.com/Rust-GCC/gccrs/pull/4685

 gcc/rust/backend/rust-compile-drop.cc | 21 ++++++++++++++++++---
 gcc/rust/backend/rust-compile-drop.h  |  1 +
 2 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/gcc/rust/backend/rust-compile-drop.cc 
b/gcc/rust/backend/rust-compile-drop.cc
index 5cb4db0e4..0062f30e2 100644
--- a/gcc/rust/backend/rust-compile-drop.cc
+++ b/gcc/rust/backend/rust-compile-drop.cc
@@ -90,9 +90,11 @@ CompileDrop::compile_drop_call (Bvariable *var, 
TyTy::BaseType *ty,
   return Backend::call_expression (fn_addr, {var_addr}, nullptr, locus);
 }
 
-void
-CompileDrop::emit_current_scope_drop_calls ()
+tree
+CompileDrop::build_current_scope_drop_cleanup ()
 {
+  std::vector<tree> drop_stmts;
+
   DropBuilder drop_builder (*ctx);
   auto &drop_candidates = drop_builder.peek_block_drop_candidates ();
 
@@ -109,8 +111,21 @@ CompileDrop::emit_current_scope_drop_calls ()
 
       tree drop_call = compile_drop_call (var, ty, it->locus);
       if (drop_call != NULL_TREE)
-       ctx->add_statement (convert_to_void (drop_call, ICV_STATEMENT));
+       drop_stmts.push_back (convert_to_void (drop_call, ICV_STATEMENT));
     }
+
+  if (drop_stmts.empty ())
+    return NULL_TREE;
+
+  return Backend::statement_list (drop_stmts);
+}
+
+void
+CompileDrop::emit_current_scope_drop_calls ()
+{
+  tree cleanup = build_current_scope_drop_cleanup ();
+  if (cleanup != NULL_TREE)
+    ctx->add_statement (cleanup);
 }
 
 } // namespace Compile
diff --git a/gcc/rust/backend/rust-compile-drop.h 
b/gcc/rust/backend/rust-compile-drop.h
index 55a09c5dd..dea3e1935 100644
--- a/gcc/rust/backend/rust-compile-drop.h
+++ b/gcc/rust/backend/rust-compile-drop.h
@@ -31,6 +31,7 @@ public:
 
   bool type_has_drop_impl (TyTy::BaseType *ty);
 
+  tree build_current_scope_drop_cleanup ();
   void emit_current_scope_drop_calls ();
 
 private:

base-commit: a9a86ed4b0370586700fa2112bf5736ed50a24b8
-- 
2.54.0

Reply via email to