[gcc r14-8087] gccrs: borrowck: BIR continue
Arthur Cohen
cohenarthur@gcc.gnu.org
Tue Jan 16 18:17:32 GMT 2024
https://gcc.gnu.org/g:de90d4b531572db8b20b38d6f04492634c4a1f10
commit r14-8087-gde90d4b531572db8b20b38d6f04492634c4a1f10
Author: Jakub Dupak <dev@jakubdupak.com>
Date: Wed Oct 18 23:01:06 2023 +0200
gccrs: borrowck: BIR continue
gcc/rust/ChangeLog:
* checks/errors/borrowck/rust-bir-builder-expr-stmt.cc (ExprStmtBuilder::visit): Continue.
(ExprStmtBuilder::setup_loop): Continue.
Signed-off-by: Jakub Dupak <dev@jakubdupak.com>
Diff:
---
.../errors/borrowck/rust-bir-builder-expr-stmt.cc | 50 ++++++++++++++--------
1 file changed, 32 insertions(+), 18 deletions(-)
diff --git a/gcc/rust/checks/errors/borrowck/rust-bir-builder-expr-stmt.cc b/gcc/rust/checks/errors/borrowck/rust-bir-builder-expr-stmt.cc
index 67b98e2254f..9a850facff9 100644
--- a/gcc/rust/checks/errors/borrowck/rust-bir-builder-expr-stmt.cc
+++ b/gcc/rust/checks/errors/borrowck/rust-bir-builder-expr-stmt.cc
@@ -305,20 +305,32 @@ ExprStmtBuilder::visit (HIR::BlockExpr &block)
void
ExprStmtBuilder::visit (HIR::ContinueExpr &cont)
{
- // BuilderContext::LabelledBlockCtx loop_ctx;
- // NodeId label = UNKNOWN_NODEID;
- // if (cont.has_label ())
- // {
- // if (!resolve_label (cont.get_label (), label))
- // return;
- // }
- //
- // if (!find_block_ctx (label, loop_ctx))
- // {
- // rust_error_at (cont.get_locus (), "unresolved loop label");
- // }
- //
- // add_jump_to (loop_ctx.continue_bb);
+ BuilderContext::LoopAndLabelInfo info;
+ if (cont.has_label ())
+ {
+ NodeId label = resolve_label (cont.get_label ());
+ auto lookup
+ = std::find_if (ctx.loop_and_label_stack.rbegin (),
+ ctx.loop_and_label_stack.rend (),
+ [label] (const BuilderContext::LoopAndLabelInfo &info) {
+ return info.label == label;
+ });
+ rust_assert (lookup != ctx.loop_and_label_stack.rend ());
+ info = *lookup;
+ }
+ else
+ {
+ auto lookup
+ = std::find_if (ctx.loop_and_label_stack.rbegin (),
+ ctx.loop_and_label_stack.rend (),
+ [] (const BuilderContext::LoopAndLabelInfo &info) {
+ return info.is_loop;
+ });
+ rust_assert (lookup != ctx.loop_and_label_stack.rend ());
+ info = *lookup;
+ }
+ add_jump_to (info.continue_bb);
+ // No code allowed after continue. No BB starts - would be empty.
}
void
@@ -418,9 +430,10 @@ ExprStmtBuilder::visit (HIR::UnsafeBlockExpr &expr)
BuilderContext::LoopAndLabelInfo &
ExprStmtBuilder::setup_loop (HIR::BaseLoopExpr &expr)
{
- NodeId label = (expr.has_loop_label ())
- ? resolve_label (expr.get_loop_label ())
- : UNKNOWN_NODEID;
+ NodeId label
+ = (expr.has_loop_label ())
+ ? expr.get_loop_label ().get_lifetime ().get_mappings ().get_nodeid ()
+ : UNKNOWN_NODEID;
PlaceId label_var = ctx.place_db.add_temporary (lookup_type (expr));
BasicBlockId continue_bb = new_bb ();
@@ -439,7 +452,8 @@ ExprStmtBuilder::visit (HIR::LoopExpr &expr)
ctx.current_bb = loop.continue_bb;
(void) visit_expr (*expr.get_loop_block ());
- add_jump_to (loop.continue_bb);
+ if (!ctx.get_current_bb ().is_terminated ())
+ add_jump_to (loop.continue_bb);
ctx.current_bb = loop.break_bb;
}
More information about the Gcc-cvs
mailing list