error[E0382]: use of moved value --> $DIR/issue-83760.rs:5:20 | LL | while let Some(foo) = val { | ^^^ value moved here, in previous iteration of loop LL | if true { LL | val = None; | ---------- this reinitialization might get skipped | = note: move occurs because value has type `Struct`, which does not implement the `Copy` trait help: borrow this binding in the pattern to avoid moving the value | LL | while let Some(ref foo) = val { | +++ error[E0382]: use of moved value: `foo` --> $DIR/issue-83760.rs:21:14 | LL | let mut foo = Some(Struct); | ------- move occurs because `foo` has type `Option`, which does not implement the `Copy` trait LL | let _x = foo.unwrap(); | -------- `foo` moved due to this method call LL | if true { LL | foo = Some(Struct); | ------------------ this reinitialization might get skipped ... LL | let _y = foo; | ^^^ value used here after move | note: `Option::::unwrap` takes ownership of the receiver `self`, which moves `foo` --> $SRC_DIR/core/src/option.rs:LL:COL error[E0382]: use of moved value: `foo` --> $DIR/issue-83760.rs:37:14 | LL | let mut foo = Some(Struct); | ------- move occurs because `foo` has type `Option`, which does not implement the `Copy` trait LL | let _x = foo.unwrap(); | -------- `foo` moved due to this method call ... LL | let _y = foo; | ^^^ value used here after move | note: these 3 reinitializations and 1 other might get skipped --> $DIR/issue-83760.rs:30:9 | LL | foo = Some(Struct); | ^^^^^^^^^^^^^^^^^^ LL | } else if true { LL | foo = Some(Struct); | ^^^^^^^^^^^^^^^^^^ LL | } else if true { LL | foo = Some(Struct); | ^^^^^^^^^^^^^^^^^^ note: `Option::::unwrap` takes ownership of the receiver `self`, which moves `foo` --> $SRC_DIR/core/src/option.rs:LL:COL error: aborting due to 3 previous errors For more information about this error, try `rustc --explain E0382`.