Closed

Description
In loops that are detected to happen more than once, the true error error[E0381]: borrow of possibly uninitialized variable:
is overwritten by another error that doesn't seem to actually apply at all: error[E0382]: borrow of moved value:
.
This happens possibly due to #52669 having been fixed.
Simple example (playground) follows, which is showing the fake error error[E0382]: borrow of moved value:
; to see true error just uncomment the last break;
line:
#![allow(unused_variables)]
#![allow(dead_code)]
struct NewType(i32);
fn main() {
let mut v:Vec<NewType>=Vec::new();
loop {
//for i in 1..1 {
//println!("iter{}",i);
let a:NewType;
//let mut a:NewType;
//let a:NewType=NewType(3);
//let mut a:NewType=NewType(3);//no errors with this line
change(&mut a);//true but only happens without the "v.push(a)" below : "borrow of possibly uninitialized variable: `a`"
v.push(a); //if this is uncommented then true error "borrow of possibly uninitialized variable: `a`" is overwritten by "borrow of moved value: `a`" and "value moved here, in previous iteration of loop"
if 1==1 { //this breaks loop detection as happening only once(which a non-if break would do)
break;
}
//break; //XXX uncomment this to see true error!
}
}
fn change(i: &mut NewType) {
*i=NewType(1);
}
Tested with rust nightly 2018, 11 Jan 2019 version, on playground.
Pedantic example on playground