about summary refs log tree commit diff
diff options
context:
space:
mode:
authorCormac Relf <web@cormacrelf.net>2021-10-13 18:34:29 +1100
committerCormac Relf <web@cormacrelf.net>2021-12-13 14:02:41 +1100
commit61bcd8d3075471b3867428788c49f54fffe53f52 (patch)
tree10c515cb88d6bd23bcf1d0e8545fdaa67a9d5fe0
parent34a98192d513dea6b5ea4aaa74fec5b84b0fe6ee (diff)
downloadrust-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.rs45
-rw-r--r--src/test/ui/let-else/let-else-source-expr-nomove-pass.rs17
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);
+}