1use pin_utils::{unsafe_pinned, unsafe_unpinned, pin_mut};
2use std::pin::Pin;
3use std::marker::Unpin;
4
5struct Foo<T1, T2> {
6 field1: T1,
7 field2: T2,
8}
9
10impl<T1, T2> Foo<T1, T2> {
11 unsafe_pinned!(field1: T1);
12 unsafe_unpinned!(field2: T2);
13}
14
15impl<T1: Unpin, T2> Unpin for Foo<T1, T2> {} // Conditional Unpin impl
16
17#[test]
18fn 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