summaryrefslogtreecommitdiffstats
path: root/src/test/ui/functions-closures/implied-bounds-closure-arg-outlives.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/functions-closures/implied-bounds-closure-arg-outlives.rs')
-rw-r--r--src/test/ui/functions-closures/implied-bounds-closure-arg-outlives.rs35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/test/ui/functions-closures/implied-bounds-closure-arg-outlives.rs b/src/test/ui/functions-closures/implied-bounds-closure-arg-outlives.rs
new file mode 100644
index 000000000..4ac07123d
--- /dev/null
+++ b/src/test/ui/functions-closures/implied-bounds-closure-arg-outlives.rs
@@ -0,0 +1,35 @@
+// run-pass
+// Test that we are able to handle the relationships between free
+// regions bound in a closure callback.
+
+#[derive(Copy, Clone)]
+struct MyCx<'short, 'long: 'short> {
+ short: &'short u32,
+ long: &'long u32,
+}
+
+impl<'short, 'long> MyCx<'short, 'long> {
+ fn short(self) -> &'short u32 { self.short }
+ fn long(self) -> &'long u32 { self.long }
+ fn set_short(&mut self, v: &'short u32) { self.short = v; }
+}
+
+fn with<F, R>(op: F) -> R
+where
+ F: for<'short, 'long> FnOnce(MyCx<'short, 'long>) -> R,
+{
+ op(MyCx {
+ short: &22,
+ long: &22,
+ })
+}
+
+fn main() {
+ with(|mut cx| {
+ // For this to type-check, we need to be able to deduce that
+ // the lifetime of `l` can be `'short`, even though it has
+ // input from `'long`.
+ let l = if true { cx.long() } else { cx.short() };
+ cx.set_short(l);
+ });
+}