#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
use core::{marker::PhantomPinned, pin::Pin};
use pinned_init::*;
trait Bar<'a, const ID: usize = 0> {
fn bar(&mut self);
}
#[pin_data(PinnedDrop)]
struct Foo<'a, 'b: 'a, T: Bar<'b> + ?Sized + 'a, const SIZE: usize = 0>
where
T: Bar<'a, 1>,
{
array: [u8; 1024 * 1024],
r: &'b mut [&'a mut T; SIZE],
#[pin]
_pin: PhantomPinned,
}
#[pinned_drop]
impl<'a, 'b: 'a, T: Bar<'b> + ?Sized + 'a, const SIZE: usize> PinnedDrop for Foo<'a, 'b, T, SIZE>
where
T: Bar<'b, 1>,
{
fn drop(self: Pin<&mut Self>) {
let me = unsafe { Pin::get_unchecked_mut(self) };
for t in &mut *me.r {
Bar::<'a, 1>::bar(*t);
}
}
}
fn main() {}