Skip to content

NLL reports "borrow used here in later iteration of loop" in cases outside of loop #53773

Closed
@pnkfelix

Description

@pnkfelix

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.)

Metadata

Metadata

Assignees

Labels

A-NLLArea: Non-lexical lifetimes (NLL)NLL-diagnosticsWorking towards the "diagnostic parity" goalP-mediumMedium priority

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions