summary refs log blame commit diff stats
path: root/tests/ui/no_uaf_1.rs
blob: 1d9411e9038198f690021d517c337815f2ddf438 (plain) (tree)
1
2
3


                     
















                                        






                                                                  












                                     
use core::cell::Cell;

use selfref::Holder;
use selfref::opaque;

mod bad {
    use super::*;
    use std::rc::Rc;
    struct Foo<'a> {
        x: String,
        y: Rc<Cell<&'a str>>,
    }
    struct FooOpaque;
    opaque! {
        impl Opaque for FooOpaque {
            type Kind<'a> = Foo<'a>;
        }
    }
    pub fn test() {
        let rc = Rc::new(Cell::new(""));
        let rc_clone = rc.clone();
        let x = Holder::<'_, FooOpaque>::new_with(move |builder| {
            builder.build(Foo {
                x: "Hello".to_owned(),
                y: rc_clone,
            });
        });
        let x = Box::pin(x);
        x.as_ref().operate_in(|foo| {
            let foo = foo.get_ref();
            foo.y.set(&foo.x);
        });
        dbg!(&rc);
        drop(x);
        dbg!(&rc);
    }
}
fn main() {
    bad::test();
}