about summary refs log tree commit diff
path: root/tests/ui/nll/mir_check_cast_reify.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/nll/mir_check_cast_reify.rs')
-rw-r--r--tests/ui/nll/mir_check_cast_reify.rs39
1 files changed, 39 insertions, 0 deletions
diff --git a/tests/ui/nll/mir_check_cast_reify.rs b/tests/ui/nll/mir_check_cast_reify.rs
new file mode 100644
index 00000000000..951459911e7
--- /dev/null
+++ b/tests/ui/nll/mir_check_cast_reify.rs
@@ -0,0 +1,39 @@
+#![allow(dead_code)]
+
+// Test that we relate the type of the fn type to the type of the fn
+// ptr when doing a `ReifyFnPointer` cast.
+//
+// This test is a bit tortured, let me explain:
+//
+
+// The `where 'a: 'a` clause here ensures that `'a` is early bound,
+// which is needed below to ensure that this test hits the path we are
+// concerned with.
+fn foo<'a>(x: &'a u32) -> &'a u32
+where
+    'a: 'a,
+{
+    panic!()
+}
+
+fn bar<'a>(x: &'a u32) -> &'static u32 {
+    // Here, the type of `foo` is `typeof(foo::<'x>)` for some fresh variable `'x`.
+    // During NLL region analysis, this will get renumbered to `typeof(foo::<'?0>)`
+    // where `'?0` is a new region variable.
+    //
+    // (Note that if `'a` on `foo` were late-bound, the type would be
+    // `typeof(foo)`, which would interact differently with because
+    // the renumbering later.)
+    //
+    // This type is then coerced to a fn type `fn(&'?1 u32) -> &'?2
+    // u32`. Here, the `'?1` and `'?2` will have been created during
+    // the NLL region renumbering.
+    //
+    // The MIR type checker must therefore relate `'?0` to `'?1` and `'?2`
+    // as part of checking the `ReifyFnPointer`.
+    let f: fn(_) -> _ = foo;
+    f(x)
+    //~^ ERROR lifetime may not live long enough
+}
+
+fn main() {}