summaryrefslogtreecommitdiffstats
path: root/src/test/ui/let-else/let-else-non-copy.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/let-else/let-else-non-copy.rs')
-rw-r--r--src/test/ui/let-else/let-else-non-copy.rs45
1 files changed, 45 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 000000000..79ed82dd1
--- /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();
+}