summaryrefslogtreecommitdiffstats
path: root/src/test/ui/impl-trait/can-return-unconstrained-closure.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/impl-trait/can-return-unconstrained-closure.rs')
-rw-r--r--src/test/ui/impl-trait/can-return-unconstrained-closure.rs23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/test/ui/impl-trait/can-return-unconstrained-closure.rs b/src/test/ui/impl-trait/can-return-unconstrained-closure.rs
new file mode 100644
index 000000000..7ae1ac4f5
--- /dev/null
+++ b/src/test/ui/impl-trait/can-return-unconstrained-closure.rs
@@ -0,0 +1,23 @@
+// Test that we are special casing "outlives" for opaque types.
+//
+// The return type of a closure is not required to outlive the closure. As such
+// the following code would not compile if we used a standard outlives check
+// when checking the return type, because the return type of the closure would
+// be `&ReEmpty i32`, and we don't allow `ReEmpty` to occur in the concrete
+// type used for an opaque type.
+//
+// However, opaque types are special cased to include check all regions in the
+// concrete type against the bound, which forces the return type to be
+// `&'static i32` here.
+
+// build-pass (FIXME(62277): could be check-pass?)
+
+fn make_identity() -> impl Sized {
+ |x: &'static i32| x
+}
+
+fn make_identity_static() -> impl Sized + 'static {
+ |x: &'static i32| x
+}
+
+fn main() {}