diff options
| author | Cormac Relf <web@cormacrelf.net> | 2021-10-13 18:34:29 +1100 |
|---|---|---|
| committer | Cormac Relf <web@cormacrelf.net> | 2021-12-13 14:02:41 +1100 |
| commit | 61bcd8d3075471b3867428788c49f54fffe53f52 (patch) | |
| tree | 10c515cb88d6bd23bcf1d0e8545fdaa67a9d5fe0 | |
| parent | 34a98192d513dea6b5ea4aaa74fec5b84b0fe6ee (diff) | |
| download | rust-61bcd8d3075471b3867428788c49f54fffe53f52.tar.gz rust-61bcd8d3075471b3867428788c49f54fffe53f52.zip | |
let-else: add tests for moved expressions, copy out of non-copy
| -rw-r--r-- | src/test/ui/let-else/let-else-non-copy.rs | 45 | ||||
| -rw-r--r-- | src/test/ui/let-else/let-else-source-expr-nomove-pass.rs | 17 |
2 files changed, 62 insertions, 0 deletions
diff --git a/src/test/ui/let-else/let-else-non-copy.rs b/src/test/ui/let-else/let-else-non-copy.rs new file mode 100644 index 00000000000..79ed82dd124 --- /dev/null +++ b/src/test/ui/let-else/let-else-non-copy.rs @@ -0,0 +1,45 @@ +// run-pass +// +// This is derived from a change to compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs, in +// preparation for adopting let-else within the compiler (thanks @est31): +// +// ``` +// - let place = if let mir::VarDebugInfoContents::Place(p) = var.value { p } else { continue }; +// + let mir::VarDebugInfoContents::Place(place) = var.value else { continue }; +// ``` +// +// The move was due to mir::Place being Copy, but mir::VarDebugInfoContents not being Copy. + +#![feature(let_else)] + +#[derive(Copy, Clone)] +struct Copyable; + +enum NonCopy { + Thing(Copyable), + #[allow(unused)] + Other, +} + +struct Wrapper { + field: NonCopy, +} + +fn let_else() { + let vec = vec![Wrapper { field: NonCopy::Thing(Copyable) }]; + for item in &vec { + let NonCopy::Thing(_copyable) = item.field else { continue }; + } +} + +fn if_let() { + let vec = vec![Wrapper { field: NonCopy::Thing(Copyable) }]; + for item in &vec { + let _copyable = if let NonCopy::Thing(copyable) = item.field { copyable } else { continue }; + } +} + +fn main() { + let_else(); + if_let(); +} diff --git a/src/test/ui/let-else/let-else-source-expr-nomove-pass.rs b/src/test/ui/let-else/let-else-source-expr-nomove-pass.rs new file mode 100644 index 00000000000..2aa17ae8ceb --- /dev/null +++ b/src/test/ui/let-else/let-else-source-expr-nomove-pass.rs @@ -0,0 +1,17 @@ +// run-pass +// issue #89688 + +#![feature(let_else)] + +fn example_let_else(value: Option<String>) { + let Some(inner) = value else { + println!("other: {:?}", value); // OK + return; + }; + println!("inner: {}", inner); +} + +fn main() { + example_let_else(Some("foo".into())); + example_let_else(None); +} |
