summary refs log tree commit diff stats
path: root/tests/ui/no_uaf_2.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/no_uaf_2.rs')
-rw-r--r--tests/ui/no_uaf_2.rs33
1 files changed, 33 insertions, 0 deletions
diff --git a/tests/ui/no_uaf_2.rs b/tests/ui/no_uaf_2.rs
new file mode 100644
index 0000000..eb6b7d3
--- /dev/null
+++ b/tests/ui/no_uaf_2.rs
@@ -0,0 +1,33 @@
+// 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
+    });
+}