summaryrefslogtreecommitdiffstats
path: root/src/test/ui/dropck/cleanup-arm-conditional.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/dropck/cleanup-arm-conditional.rs')
-rw-r--r--src/test/ui/dropck/cleanup-arm-conditional.rs39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/test/ui/dropck/cleanup-arm-conditional.rs b/src/test/ui/dropck/cleanup-arm-conditional.rs
new file mode 100644
index 000000000..38c717089
--- /dev/null
+++ b/src/test/ui/dropck/cleanup-arm-conditional.rs
@@ -0,0 +1,39 @@
+// run-pass
+
+#![allow(stable_features)]
+#![allow(unused_imports)]
+// Test that cleanup scope for temporaries created in a match
+// arm is confined to the match arm itself.
+
+// pretty-expanded FIXME #23616
+
+#![feature(os)]
+
+use std::os;
+
+struct Test { x: isize }
+
+impl Test {
+ fn get_x(&self) -> Option<Box<isize>> {
+ Some(Box::new(self.x))
+ }
+}
+
+fn do_something(t: &Test) -> isize {
+
+ // The cleanup scope for the result of `t.get_x()` should be the
+ // arm itself and not the match, otherwise we'll (potentially) get
+ // a crash trying to free an uninitialized stack slot.
+
+ match t {
+ &Test { x: 2 } if t.get_x().is_some() => {
+ t.x * 2
+ }
+ _ => { 22 }
+ }
+}
+
+pub fn main() {
+ let t = Test { x: 1 };
+ do_something(&t);
+}