1 use pin_utils::{unsafe_pinned, unsafe_unpinned, pin_mut};
2 use std::pin::Pin;
3 use std::marker::Unpin;
4
5 struct Foo<T1, T2> {
6 field1: T1,
7 field2: T2,
8 }
9
10 impl<T1, T2> Foo<T1, T2> {
11 unsafe_pinned!(field1: T1);
12 unsafe_unpinned!(field2: T2);
13 }
14
15 impl<T1: Unpin, T2> Unpin for Foo<T1, T2> {} // Conditional Unpin impl
16
17 #[test]
projection()18 fn projection() {
19 let foo = Foo { field1: 1, field2: 2 };
20 pin_mut!(foo);
21
22 let x1: Pin<&mut i32> = foo.as_mut().field1();
23 assert_eq!(*x1, 1);
24
25 let x2: &mut i32 = foo.as_mut().field2();
26 assert_eq!(*x2, 2);
27 }
28