summary refs log blame commit diff stats
path: root/tests/ui/no_uaf_2.rs
blob: eb6b7d38aebe52464c437ec20a64f25748681592 (plain) (tree)
































                                                                                               
// by steffahn

#![feature(pin_macro)]

use std::cell::Cell;
use std::pin::pin;

use selfref::opaque;
use selfref::{new_with_closure, Holder};

struct MyStruct<'this> {
    cell: Cell<&'this str>,
}

struct MyStructKey;

opaque! {
    impl Opaque for MyStructKey {
        type Kind<'this> = MyStruct<'this>;
    }
}

fn main() {
    let s =
        Holder::<'_, MyStructKey>::new_with(new_with_closure::<MyStructKey, _>(|[]| MyStruct {
            cell: Default::default(),
        }));
    let s = pin!(s);
    s.as_ref().operate_in(|r| {
        r.cell.set(&String::from("hello world")); // temporary dropped at end of this statement
        println!("{}", r.cell.get()) // accesses dropped `String` data
    });
}