From: Lucas Ly Ba Date: Sat, 27 Jun 2026 19:15:51 +0000 (+0200) Subject: gccrs: fix ICE on break with a label and a value X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=34f5c37de80098cee2f29718dbaaae81355c1fac;p=thirdparty%2Fgcc.git gccrs: fix ICE on break with a label and a value A `break 'label value` expression looks up a temporary variable associated with the labeled loop to hold the value, but labeled loops never registered that temporary, leading to an ICE in the code generator. Register the loop result temporary against the label. gcc/rust/ChangeLog: * backend/rust-compile-expr.cc (CompileExpr::visit): Associate the loop result temporary with the loop label. gcc/testsuite/ChangeLog: * rust/compile/break-label-loop.rs: New test. Signed-off-by: Lucas Ly Ba --- diff --git a/gcc/rust/backend/rust-compile-expr.cc b/gcc/rust/backend/rust-compile-expr.cc index 7fabc25a5f8..79fe6c49e85 100644 --- a/gcc/rust/backend/rust-compile-expr.cc +++ b/gcc/rust/backend/rust-compile-expr.cc @@ -794,6 +794,10 @@ CompileExpr::visit (HIR::LoopExpr &expr) ctx->add_statement (label_decl); ctx->insert_label_decl ( loop_label.get_lifetime ().get_mappings ().get_hirid (), label); + // Associate the loop's result temporary with the label so that a + // `break 'label value` can locate it (see visit (HIR::BreakExpr)). + ctx->insert_var_decl ( + loop_label.get_lifetime ().get_mappings ().get_hirid (), tmp); } tree loop_begin_label diff --git a/gcc/testsuite/rust/compile/break-label-loop.rs b/gcc/testsuite/rust/compile/break-label-loop.rs new file mode 100644 index 00000000000..60169e32d6f --- /dev/null +++ b/gcc/testsuite/rust/compile/break-label-loop.rs @@ -0,0 +1,10 @@ +// `break 'label loop {}` used to ICE in the code generator because the +// labeled loop never registered its result temporary against the label. +#![feature(no_core)] +#![no_core] + +pub fn foo() { + 'a: loop { + break 'a loop {}; + } +}