diff --git a/tests/ui/nll/polonius/iterating-updating-mutref.nll.stderr b/tests/ui/nll/polonius/iterating-updating-mutref.nll.stderr index 941c736d8d258..11305f85fc66c 100644 --- a/tests/ui/nll/polonius/iterating-updating-mutref.nll.stderr +++ b/tests/ui/nll/polonius/iterating-updating-mutref.nll.stderr @@ -1,5 +1,5 @@ error[E0499]: cannot borrow `self.buf_read` as mutable more than once at a time - --> $DIR/iterating-updating-mutref.rs:61:23 + --> $DIR/iterating-updating-mutref.rs:76:23 | LL | pub fn next<'a>(&'a mut self) -> &'a str { | -- lifetime `'a` defined here diff --git a/tests/ui/nll/polonius/iterating-updating-mutref.rs b/tests/ui/nll/polonius/iterating-updating-mutref.rs index a315bf66279c6..c55fcd56b92a5 100644 --- a/tests/ui/nll/polonius/iterating-updating-mutref.rs +++ b/tests/ui/nll/polonius/iterating-updating-mutref.rs @@ -49,6 +49,21 @@ fn to_refs2(mut list: &mut List) -> Vec<&mut T> { result } +// In a-mir-formality, the local `cursor` was (incorrectly) considered live +// on a second borrowck pass, resulting in an incorrect error. +fn to_refs3<'a, T>(list: &'a mut List) -> &'a mut T { + let mut result: &'a mut T; + let mut cursor: &'a mut List = &mut *list; + loop { + result = &mut cursor.value; + if let Some(n) = cursor.next.as_mut() { + cursor = n; + } else { + return result; + } + } +} + // Another MCVE from the same issue, but was rejected by NLLs. pub struct Decoder { buf_read: BufRead,