From 2ace98429b9dd9676dd6d1f783f99df296022879 Mon Sep 17 00:00:00 2001 From: reucru01 Date: Fri, 27 Mar 2026 13:36:44 +0000 Subject: [PATCH 1/2] Adds test for issue 70044 Fails on NLL, passes on polonius alpha & legacy. --- ...nsitive-constraints-issue-70044.nll.stderr | 14 +++++++++++ ...ion-insensitive-constraints-issue-70044.rs | 24 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 tests/ui/nll/polonius/location-insensitive-constraints-issue-70044.nll.stderr create mode 100644 tests/ui/nll/polonius/location-insensitive-constraints-issue-70044.rs diff --git a/tests/ui/nll/polonius/location-insensitive-constraints-issue-70044.nll.stderr b/tests/ui/nll/polonius/location-insensitive-constraints-issue-70044.nll.stderr new file mode 100644 index 0000000000000..edb5bf5df413e --- /dev/null +++ b/tests/ui/nll/polonius/location-insensitive-constraints-issue-70044.nll.stderr @@ -0,0 +1,14 @@ +error[E0502]: cannot borrow `one` as immutable because it is also borrowed as mutable + --> $DIR/location-insensitive-constraints-issue-70044.rs:22:20 + | +LL | let mut y = &mut one; + | -------- mutable borrow occurs here +... +LL | println!("{}", one); + | ^^^ immutable borrow occurs here +LL | println!("{}", zero); + | ---- mutable borrow later used here + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0502`. diff --git a/tests/ui/nll/polonius/location-insensitive-constraints-issue-70044.rs b/tests/ui/nll/polonius/location-insensitive-constraints-issue-70044.rs new file mode 100644 index 0000000000000..f59ce5170ad4e --- /dev/null +++ b/tests/ui/nll/polonius/location-insensitive-constraints-issue-70044.rs @@ -0,0 +1,24 @@ +// This test is taken from https://github.com/rust-lang/rust/issues/70044. +// This test demonstrates how NLL's outlives constraints are flow-insensitive, +// and are wrongly expected to hold outside the inner scope. + +//@ ignore-compare-mode-polonius (explicit revisions) +//@ revisions: nll polonius legacy +//@ [polonius] check-pass +//@ [polonius] compile-flags: -Z polonius=next +//@ [legacy] check-pass +//@ [legacy] compile-flags: -Z polonius=legacy + +fn main() { + let mut zero = &mut 0; + let mut one = 1; + + { + let mut _r = &mut zero; + let mut y = &mut one; + _r = &mut y; + } + + println!("{}", one); //[nll]~ ERROR: cannot borrow `one` as immutable + println!("{}", zero); +} From 134aa1bafaa2ffb2b522cb1741b8976f1c7b494e Mon Sep 17 00:00:00 2001 From: Reuben Cruise Date: Tue, 14 Apr 2026 12:11:02 +0100 Subject: [PATCH 2/2] Adds test for NLL problem case 2: issue 92038 --- .../nll-problem-case-2-issue-92038.nll.stderr | 16 ++++++++++++++++ .../polonius/nll-problem-case-2-issue-92038.rs | 17 +++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 tests/ui/nll/polonius/nll-problem-case-2-issue-92038.nll.stderr create mode 100644 tests/ui/nll/polonius/nll-problem-case-2-issue-92038.rs diff --git a/tests/ui/nll/polonius/nll-problem-case-2-issue-92038.nll.stderr b/tests/ui/nll/polonius/nll-problem-case-2-issue-92038.nll.stderr new file mode 100644 index 0000000000000..62d66a900adbc --- /dev/null +++ b/tests/ui/nll/polonius/nll-problem-case-2-issue-92038.nll.stderr @@ -0,0 +1,16 @@ +error[E0499]: cannot borrow `*a` as mutable more than once at a time + --> $DIR/nll-problem-case-2-issue-92038.rs:16:26 + | +LL | fn reborrow(a: &mut u8) -> &mut u8 { + | - let's call the lifetime of this reference `'1` +LL | let b = &mut *a; + | ------- first mutable borrow occurs here +LL | if true { b } else { a } + | ---------------------^-- + | | | + | | second mutable borrow occurs here + | returning this value requires that `*a` is borrowed for `'1` + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0499`. diff --git a/tests/ui/nll/polonius/nll-problem-case-2-issue-92038.rs b/tests/ui/nll/polonius/nll-problem-case-2-issue-92038.rs new file mode 100644 index 0000000000000..4b55e67e7e0d8 --- /dev/null +++ b/tests/ui/nll/polonius/nll-problem-case-2-issue-92038.rs @@ -0,0 +1,17 @@ +#![crate_type = "lib"] + +// This test demonstrates a shortcoming of NLL known as problem case #2 +// https://rust-lang.github.io/rfcs/2094-nll.html#problem-case-2-conditional-control-flow +// This MCVE is copied from https://github.com/rust-lang/rust/issues/92038. + +//@ ignore-compare-mode-polonius (explicit revisions) +//@ revisions: nll polonius legacy +//@ [polonius] check-pass +//@ [polonius] compile-flags: -Z polonius=next +//@ [legacy] check-pass +//@ [legacy] compile-flags: -Z polonius=legacy + +fn reborrow(a: &mut u8) -> &mut u8 { + let b = &mut *a; + if true { b } else { a } //[nll]~ ERROR: cannot borrow `*a` as mutable more than once at a time +}