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