From 968376d507d86e935cc0f61da9c206fbf9633bdb Mon Sep 17 00:00:00 2001 From: aerooneqq Date: Sun, 30 Nov 2025 22:03:21 +0300 Subject: [PATCH 1/2] Add label rib when visiting delegation body, add test --- compiler/rustc_resolve/src/late.rs | 6 +++++- tests/ui/delegation/ice-issue-148889.rs | 18 ++++++++++++++++++ tests/ui/delegation/ice-issue-148889.stderr | 13 +++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 tests/ui/delegation/ice-issue-148889.rs create mode 100644 tests/ui/delegation/ice-issue-148889.stderr diff --git a/compiler/rustc_resolve/src/late.rs b/compiler/rustc_resolve/src/late.rs index df620ddb66529..b689765bf6fa1 100644 --- a/compiler/rustc_resolve/src/late.rs +++ b/compiler/rustc_resolve/src/late.rs @@ -3689,7 +3689,11 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> { let ident = Ident::new(kw::SelfLower, span.normalize_to_macro_rules()); let res = Res::Local(delegation.id); this.innermost_rib_bindings(ValueNS).insert(ident, res); - this.visit_block(body); + + //As we lower target_expr_template body to a body of a function we need a label rib (#148889) + this.with_label_rib(RibKind::FnOrCoroutine, |this| { + this.visit_block(body); + }); }); } diff --git a/tests/ui/delegation/ice-issue-148889.rs b/tests/ui/delegation/ice-issue-148889.rs new file mode 100644 index 0000000000000..e5f9fa1cf4934 --- /dev/null +++ b/tests/ui/delegation/ice-issue-148889.rs @@ -0,0 +1,18 @@ +#![allow(incomplete_features)] +#![feature(fn_delegation)] + +trait Trait { + fn static_method2(x: i32, y: i32) -> i32 { + x + y + } +} + +struct S; +impl Trait for S {} + +pub fn main() { + 'foo: loop { + reuse ::static_method2 { loop { break 'foo; } } + //~^ ERROR use of unreachable label `'foo` + } +} diff --git a/tests/ui/delegation/ice-issue-148889.stderr b/tests/ui/delegation/ice-issue-148889.stderr new file mode 100644 index 0000000000000..2ebc7b3ec14e1 --- /dev/null +++ b/tests/ui/delegation/ice-issue-148889.stderr @@ -0,0 +1,13 @@ +error[E0767]: use of unreachable label `'foo` + --> $DIR/ice-issue-148889.rs:15:59 + | +LL | 'foo: loop { + | ---- unreachable label defined here +LL | reuse ::static_method2 { loop { break 'foo; } } + | ^^^^ unreachable label `'foo` + | + = note: labels are unreachable through functions, closures, async blocks and modules + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0767`. From 62fe6a01438ae919a04e2d91d22e4ffa632f5971 Mon Sep 17 00:00:00 2001 From: aerooneqq Date: Mon, 1 Dec 2025 15:30:53 +0300 Subject: [PATCH 2/2] Rename added test --- .../{ice-issue-148889.rs => unreachable-label-ice-148889.rs} | 0 ...-issue-148889.stderr => unreachable-label-ice-148889.stderr} | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename tests/ui/delegation/{ice-issue-148889.rs => unreachable-label-ice-148889.rs} (100%) rename tests/ui/delegation/{ice-issue-148889.stderr => unreachable-label-ice-148889.stderr} (90%) diff --git a/tests/ui/delegation/ice-issue-148889.rs b/tests/ui/delegation/unreachable-label-ice-148889.rs similarity index 100% rename from tests/ui/delegation/ice-issue-148889.rs rename to tests/ui/delegation/unreachable-label-ice-148889.rs diff --git a/tests/ui/delegation/ice-issue-148889.stderr b/tests/ui/delegation/unreachable-label-ice-148889.stderr similarity index 90% rename from tests/ui/delegation/ice-issue-148889.stderr rename to tests/ui/delegation/unreachable-label-ice-148889.stderr index 2ebc7b3ec14e1..2141962609183 100644 --- a/tests/ui/delegation/ice-issue-148889.stderr +++ b/tests/ui/delegation/unreachable-label-ice-148889.stderr @@ -1,5 +1,5 @@ error[E0767]: use of unreachable label `'foo` - --> $DIR/ice-issue-148889.rs:15:59 + --> $DIR/unreachable-label-ice-148889.rs:15:59 | LL | 'foo: loop { | ---- unreachable label defined here