about summary refs log tree commit diff
path: root/src/test/ui/impl-trait/hidden-lifetimes.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/impl-trait/hidden-lifetimes.rs')
-rw-r--r--src/test/ui/impl-trait/hidden-lifetimes.rs63
1 files changed, 0 insertions, 63 deletions
diff --git a/src/test/ui/impl-trait/hidden-lifetimes.rs b/src/test/ui/impl-trait/hidden-lifetimes.rs
deleted file mode 100644
index ae07c892768..00000000000
--- a/src/test/ui/impl-trait/hidden-lifetimes.rs
+++ /dev/null
@@ -1,63 +0,0 @@
-// Test to show what happens if we were not careful and allowed invariant
-// lifetimes to escape though an impl trait.
-//
-// Specifically we swap a long lived and short lived reference, giving us a
-// dangling pointer.
-
-use std::cell::RefCell;
-use std::rc::Rc;
-
-trait Swap: Sized {
-    fn swap(self, other: Self);
-}
-
-impl<T> Swap for &mut T {
-    fn swap(self, other: Self) {
-        std::mem::swap(self, other);
-    }
-}
-
-impl<T> Swap for Rc<RefCell<T>> {
-    fn swap(self, other: Self) {
-        <RefCell<T>>::swap(&self, &other);
-    }
-}
-
-// Here we are hiding `'b` making the caller believe that `&'a mut &'s T` and
-// `&'a mut &'l T` are the same type.
-fn hide_ref<'a, 'b, T: 'static>(x: &'a mut &'b T) -> impl Swap + 'a {
-    x
-    //~^ ERROR hidden type
-}
-
-fn dangle_ref() -> &'static [i32; 3] {
-    let mut res = &[4, 5, 6];
-    let x = [1, 2, 3];
-    hide_ref(&mut res).swap(hide_ref(&mut &x));
-    res
-}
-
-// Here we are hiding `'b` making the caller believe that `Rc<RefCell<&'s T>>`
-// and `Rc<RefCell<&'l T>>` are the same type.
-//
-// This is different to the previous example because the concrete return type
-// only has a single lifetime.
-fn hide_rc_refcell<'a, 'b: 'a, T: 'static>(x: Rc<RefCell<&'b T>>) -> impl Swap + 'a {
-    x
-    //~^ ERROR hidden type
-}
-
-fn dangle_rc_refcell() -> &'static [i32; 3] {
-    let long = Rc::new(RefCell::new(&[4, 5, 6]));
-    let x = [1, 2, 3];
-    let short = Rc::new(RefCell::new(&x));
-    hide_rc_refcell(long.clone()).swap(hide_rc_refcell(short));
-    let res: &'static [i32; 3] = *long.borrow();
-    res
-}
-
-fn main() {
-    // both will print nonsense values.
-    println!("{:?}", dangle_ref());
-    println!("{:?}", dangle_rc_refcell())
-}