| //@ check-pass |
| |
| #![feature(thread_local)] |
| #![deny(tail_expr_drop_order)] |
| |
| use std::marker::PhantomData; |
| use std::ops::{Deref, DerefMut}; |
| |
| pub struct Global; |
| |
| #[thread_local] |
| static REENTRANCY_STATE: State<Global> = State { marker: PhantomData, controller: Global }; |
| |
| pub struct Token(PhantomData<*mut ()>); |
| |
| pub fn with_mut<T>(f: impl FnOnce(&mut Token) -> T) -> T { |
| f(&mut REENTRANCY_STATE.borrow_mut()) |
| } |
| |
| pub struct State<T: ?Sized = Global> { |
| marker: PhantomData<*mut ()>, |
| controller: T, |
| } |
| |
| impl<T: ?Sized> State<T> { |
| pub fn borrow_mut(&self) -> TokenMut<'_, T> { |
| todo!() |
| } |
| } |
| |
| pub struct TokenMut<'a, T: ?Sized = Global> { |
| state: &'a State<T>, |
| token: Token, |
| } |
| |
| impl<T> Deref for TokenMut<'_, T> { |
| type Target = Token; |
| |
| fn deref(&self) -> &Self::Target { |
| todo!() |
| } |
| } |
| |
| impl<T> DerefMut for TokenMut<'_, T> { |
| fn deref_mut(&mut self) -> &mut Self::Target { |
| todo!() |
| } |
| } |
| |
| impl<T: ?Sized> Drop for TokenMut<'_, T> { |
| fn drop(&mut self) { |
| todo!() |
| } |
| } |
| |
| fn main() {} |