Change:
<ins> error[E0382]: use of moved value: `value` --> $DIR/issue-72649-uninit-in-loop.rs:20:22 | LL |         let value = NonCopy{}; |             ----- move occurs because `value` has type `NonCopy`, which does not implement the `Copy` trait LL | LL |         let _used = value; |                     ----- value moved here LL | LL |         let _used2 = value; |                      ^^^^^ value used here after move error[E0382]: use of moved value: `value` --> $DIR/issue-72649-uninit-in-loop.rs:32:26 | LL |     let value = NonCopy{}; |         ----- move occurs because `value` has type `NonCopy`, which does not implement the `Copy` trait ... LL |         let _used = value; |                     ----- value moved here ... LL |             let _used2 = value; |                          ^^^^^ value used here after move error[E0382]: use of moved value: `value` --> $DIR/issue-72649-uninit-in-loop.rs:42:21 | LL |     let value = NonCopy{}; |         ----- move occurs because `value` has type `NonCopy`, which does not implement the `Copy` trait ... LL |         let _used = value; |                     ^^^^^ value moved here, in previous iteration of loop error[E0382]: use of moved value: `value` --> $DIR/issue-72649-uninit-in-loop.rs:53:22 | LL |     let mut value = NonCopy{}; |         --------- move occurs because `value` has type `NonCopy`, which does not implement the `Copy` trait ... LL |         let _used2 = value; |                      ^^^^^ value moved here, in previous iteration of loop error[E0381]: use of possibly-uninitialized variable: `value` --> $DIR/issue-72649-uninit-in-loop.rs:61:21 | LL |         let _used = value; |                     ^^^^^ use of possibly-uninitialized `value` error[E0381]: use of possibly-uninitialized variable: `value` --> $DIR/issue-72649-uninit-in-loop.rs:69:21 | LL |         let _used = value; |                     ^^^^^ use of possibly-uninitialized `value` error: aborting due to 6 previous errors Some errors have detailed explanations: E0381, E0382. For more information about an error, try `rustc --explain E0381`. </ins>

Discussion:
Forgetting to initialize a non-Copy variable in a loop and then referring to it gives a 'borrowed after move' error, instead of a 'possibly-uninitialized variable' error: Using a type like does result in the right error: Tested with 1.43.0 (stable) and 1.45.0-nightly.
In both Ada and D languages (in different ways, in Ada it's more refined) there's a way to tell the type system that the input variable to that bla function is not initialized and that bla must initialize it, and inside bla you can't read it before it's initialized. This means you have a way to propagate the not initialized state in function arguments, and safety is preserved. In practice this is not a big problem for Rust because in Rust you can return tuples and now Rustc is getting logic to optimize this usage pattern.
Uh, this issue is just about the error message. That this code gives an error is fine.
I'd be interested in fixing this myself, but I'm not sure where to start.
This is an issue for a command line program I'm writing. At the beginning of a function, I declare some uninitialized variables, and then I have a loop for each one. In this loop, it will read user input, and if it is valid, assign the variable that value. The loop will never complete without the variable being initialized, but rustc refuses to compile because it thinks the variable could be uninitialized after the loop.
That sounds like a different issue. This issue is about a confusing error message. The example is supposed to not compile. If the compiler rejects correct code, that's another issue.
To add context, I find this example illustrates the problem more clearly for me: the same code with the same types, just outside a loop context: