summaryrefslogtreecommitdiffstats
path: root/src/test/ui/try-block/try-block-maybe-bad-lifetime.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/test/ui/try-block/try-block-maybe-bad-lifetime.rs44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/test/ui/try-block/try-block-maybe-bad-lifetime.rs b/src/test/ui/try-block/try-block-maybe-bad-lifetime.rs
new file mode 100644
index 000000000..cd2ddf63a
--- /dev/null
+++ b/src/test/ui/try-block/try-block-maybe-bad-lifetime.rs
@@ -0,0 +1,44 @@
+// compile-flags: --edition 2018
+
+#![feature(try_blocks)]
+
+#[inline(never)]
+fn do_something_with<T>(_x: T) {}
+
+// This test checks that borrows made and returned inside try blocks are properly constrained
+pub fn main() {
+ {
+ // Test that a borrow which *might* be returned still freezes its referent
+ let mut i = 222;
+ let x: Result<&i32, ()> = try {
+ Err(())?;
+ &i
+ };
+ i = 0; //~ ERROR cannot assign to `i` because it is borrowed
+ let _ = i;
+ do_something_with(x);
+ }
+
+ {
+ let x = String::new();
+ let _y: Result<(), ()> = try {
+ Err(())?;
+ ::std::mem::drop(x);
+ };
+ println!("{}", x); //~ ERROR borrow of moved value: `x`
+ }
+
+ {
+ // Test that a borrow which *might* be assigned to an outer variable still freezes
+ // its referent
+ let mut i = 222;
+ let mut j = &-1;
+ let _x: Result<(), ()> = try {
+ Err(())?;
+ j = &i;
+ };
+ i = 0; //~ ERROR cannot assign to `i` because it is borrowed
+ let _ = i;
+ do_something_with(j);
+ }
+}