let-else: add tests for moved expressions, copy out of non-copy · rust-lang/rust@61bcd8d (original) (raw)

2 files changed

lines changed

Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
1 +// run-pass
2 +//
3 +// This is derived from a change to compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs, in
4 +// preparation for adopting let-else within the compiler (thanks @est31):
5 +//
6 +// ```
7 +// - let place = if let mir::VarDebugInfoContents::Place(p) = var.value { p } else { continue };
8 +// + let mir::VarDebugInfoContents::Place(place) = var.value else { continue };
9 +// ```
10 +//
11 +// The move was due to mir::Place being Copy, but mir::VarDebugInfoContents not being Copy.
12 +
13 +#![feature(let_else)]
14 +
15 +#[derive(Copy, Clone)]
16 +struct Copyable;
17 +
18 +enum NonCopy {
19 +Thing(Copyable),
20 +#[allow(unused)]
21 +Other,
22 +}
23 +
24 +struct Wrapper {
25 +field: NonCopy,
26 +}
27 +
28 +fn let_else() {
29 +let vec = vec![Wrapper { field: NonCopy::Thing(Copyable) }];
30 +for item in &vec {
31 +let NonCopy::Thing(_copyable) = item.field else { continue };
32 +}
33 +}
34 +
35 +fn if_let() {
36 +let vec = vec![Wrapper { field: NonCopy::Thing(Copyable) }];
37 +for item in &vec {
38 +let _copyable = if let NonCopy::Thing(copyable) = item.field { copyable } else { continue };
39 +}
40 +}
41 +
42 +fn main() {
43 +let_else();
44 +if_let();
45 +}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
1 +// run-pass
2 +// issue #89688
3 +
4 +#![feature(let_else)]
5 +
6 +fn example_let_else(value: Option<String>) {
7 +let Some(inner) = value else {
8 +println!("other: {:?}", value); // OK
9 +return;
10 +};
11 +println!("inner: {}", inner);
12 +}
13 +
14 +fn main() {
15 +example_let_else(Some("foo".into()));
16 +example_let_else(None);
17 +}