[gcc r17-2245] gccrs: fix ICE on break with a label and a value

Arthur Cohen via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:34f5c37de80098cee2f29718dbaaae81355c1fac

commit r17-2245-g34f5c37de80098cee2f29718dbaaae81355c1fac
Author: Lucas Ly Ba <[email protected]>
Date:   Sat Jun 27 21:15:51 2026 +0200

    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 <[email protected]>

Diff:
---
 gcc/rust/backend/rust-compile-expr.cc          |  4 ++++
 gcc/testsuite/rust/compile/break-label-loop.rs | 10 ++++++++++
 2 files changed, 14 insertions(+)

diff --git a/gcc/rust/backend/rust-compile-expr.cc b/gcc/rust/backend/rust-compile-expr.cc
index 7fabc25a5f8b..79fe6c49e857 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 000000000000..60169e32d6f2
--- /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 {};
+    }
+}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.