summary refs log tree commit diff stats
path: root/tests/ui/no_uaf_2.rs
blob: 49694b2e1da96b432948d427cab6883dfc4bc113 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// by steffahn

#![feature(pin_macro)]

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

use selfref::opaque;
use selfref::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(|builder| builder.build(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
    });
}