1 // NB: If you change this test, change 'stmt_expr_attributes.rs' at the same time.
2
3 #![allow(deprecated)]
4
5 use pin_project::{pin_project, project};
6 use std::pin::Pin;
7
project_stmt_expr_nightly()8 fn project_stmt_expr_nightly() {
9 #[pin_project]
10 enum Enum<A, B, C, D> {
11 Variant1(#[pin] A, B),
12 Variant2 {
13 #[pin]
14 field1: C,
15 field2: D,
16 },
17 None,
18 }
19
20 let mut baz = Enum::Variant1(1, 2);
21
22 let mut baz = Pin::new(&mut baz).project();
23
24 #[project] //~ ERROR E0658
25 match &mut baz {
26 Enum::Variant1(x, y) => {
27 let x: &mut Pin<&mut i32> = x;
28 assert_eq!(**x, 1);
29
30 let y: &mut &mut i32 = y;
31 assert_eq!(**y, 2);
32 }
33 Enum::Variant2 { field1, field2 } => {
34 let _x: &mut Pin<&mut i32> = field1;
35 let _y: &mut &mut i32 = field2;
36 }
37 Enum::None => {}
38 }
39
40 let () = #[project] //~ ERROR E0658
41 match &mut baz {
42 Enum::Variant1(x, y) => {
43 let x: &mut Pin<&mut i32> = x;
44 assert_eq!(**x, 1);
45
46 let y: &mut &mut i32 = y;
47 assert_eq!(**y, 2);
48 }
49 Enum::Variant2 { field1, field2 } => {
50 let _x: &mut Pin<&mut i32> = field1;
51 let _y: &mut &mut i32 = field2;
52 }
53 Enum::None => {}
54 };
55 }
56
main()57 fn main() {}
58