about summary refs log tree commit diff
path: root/tests/ui/consts/control-flow/drop-pass.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/consts/control-flow/drop-pass.rs')
-rw-r--r--tests/ui/consts/control-flow/drop-pass.rs46
1 files changed, 46 insertions, 0 deletions
diff --git a/tests/ui/consts/control-flow/drop-pass.rs b/tests/ui/consts/control-flow/drop-pass.rs
new file mode 100644
index 00000000000..2a6d12768c3
--- /dev/null
+++ b/tests/ui/consts/control-flow/drop-pass.rs
@@ -0,0 +1,46 @@
+// run-pass
+// revisions: stock precise
+
+#![allow(unused)]
+#![cfg_attr(precise, feature(const_precise_live_drops))]
+
+// `x` is always moved into the final value and is not dropped inside the initializer.
+const _: Option<Vec<i32>> = {
+    let y: Option<Vec<i32>> = None;
+    let x = Some(Vec::new());
+
+    if true {
+        x
+    } else {
+        x
+    }
+};
+
+const _: Option<Vec<i32>> = {
+    let x = Some(Vec::new());
+    match () {
+        () => x,
+    }
+};
+
+const _: Option<Vec<i32>> = {
+    let mut some = Some(Vec::new());
+    let mut tmp = None;
+
+    let mut i = 0;
+    while i < 10 {
+        tmp = some;
+        some = None;
+
+        // We can never exit the loop with `Some` in `tmp`.
+
+        some = tmp;
+        tmp = None;
+
+        i += 1;
+    }
+
+    some
+};
+
+fn main() {}