Closed
Description
Spawned off of #53220 (comment)
In this code (play), we report "borrow used here in later iteration of loop" for the members.len()
call that is not within the loop.
#![feature(nll)]
struct Archive;
struct ArchiveIterator<'a> { x: &'a Archive }
struct ArchiveChild<'a> { x: &'a Archive }
struct A { raw: &'static mut Archive }
struct Iter<'a> { raw: &'a mut ArchiveIterator<'a> }
struct C<'a> { raw: &'a mut ArchiveChild<'a> }
impl A { pub fn iter(&self) -> Iter<'_> { panic!() } }
impl Drop for A { fn drop(&mut self) { } }
impl<'a> Drop for C<'a> { fn drop(&mut self) { } }
impl<'a> Iterator for Iter<'a> {
type Item = C<'a>;
fn next(&mut self) -> Option<C<'a>> { panic!() }
}
fn error(archive: &A) {
let mut members: Vec<&mut ArchiveChild<'_>> = vec![];
for child in archive.iter() {
members.push(child.raw);
}
members.len();
}
fn main() { }
(I assume this is due to some bug in how we are attempting to reverse-engineer the existence of a loop by analyzing the basic-block control-flow of MIR alone.)