summaryrefslogtreecommitdiffstats
path: root/tests/ui/nll/ty-outlives/projection-no-regions-closure.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/nll/ty-outlives/projection-no-regions-closure.rs')
-rw-r--r--tests/ui/nll/ty-outlives/projection-no-regions-closure.rs55
1 files changed, 55 insertions, 0 deletions
diff --git a/tests/ui/nll/ty-outlives/projection-no-regions-closure.rs b/tests/ui/nll/ty-outlives/projection-no-regions-closure.rs
new file mode 100644
index 000000000..2d9c008c7
--- /dev/null
+++ b/tests/ui/nll/ty-outlives/projection-no-regions-closure.rs
@@ -0,0 +1,55 @@
+// compile-flags:-Zverbose
+
+// Tests closures that propagate an outlives relationship to their
+// creator where the subject is a projection with no regions (`<T as
+// Iterator>::Item`, to be exact).
+
+#![allow(warnings)]
+#![feature(rustc_attrs)]
+
+trait Anything { }
+
+impl<T> Anything for T { }
+
+fn with_signature<'a, T, F>(x: Box<T>, op: F) -> Box<dyn Anything + 'a>
+ where F: FnOnce(Box<T>) -> Box<dyn Anything + 'a>
+{
+ op(x)
+}
+
+#[rustc_regions]
+fn no_region<'a, T>(x: Box<T>) -> Box<dyn Anything + 'a>
+where
+ T: Iterator,
+{
+ with_signature(x, |mut y| Box::new(y.next()))
+ //~^ ERROR the associated type `<T as Iterator>::Item` may not live long enough
+}
+
+#[rustc_regions]
+fn correct_region<'a, T>(x: Box<T>) -> Box<dyn Anything + 'a>
+where
+ T: 'a + Iterator,
+{
+ with_signature(x, |mut y| Box::new(y.next()))
+}
+
+#[rustc_regions]
+fn wrong_region<'a, 'b, T>(x: Box<T>) -> Box<dyn Anything + 'a>
+where
+ T: 'b + Iterator,
+{
+ with_signature(x, |mut y| Box::new(y.next()))
+ //~^ ERROR the associated type `<T as Iterator>::Item` may not live long enough
+}
+
+#[rustc_regions]
+fn outlives_region<'a, 'b, T>(x: Box<T>) -> Box<dyn Anything + 'a>
+where
+ T: 'b + Iterator,
+ 'b: 'a,
+{
+ with_signature(x, |mut y| Box::new(y.next()))
+}
+
+fn main() {}