1 #![allow(deprecated)]
2 #![feature(proc_macro_hygiene, stmt_expr_attributes)]
3 
4 use pin_project::{pin_project, project};
5 use std::pin::Pin;
6 
7 #[project]
type_mismatch()8 fn type_mismatch() {
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 foo = Enum::Variant1(1, 2);
21     let mut foo = Pin::new(&mut foo).project();
22 
23     #[project]
24     match &mut foo {
25         Enum::Variant1(x, y) => {
26             let x: &mut Pin<&mut i32> = x;
27             assert_eq!(**x, 1);
28 
29             let y: &mut &mut i32 = y;
30             assert_eq!(**y, 2);
31         }
32         Enum::Variant2 { field1, field2 } => {
33             let _x: &mut Pin<&mut i32> = field1;
34             let _y: &mut &mut i32 = field2;
35         }
36         None => {} //~ ERROR mismatched types
37     }
38 }
39 
type_mismatch_span_issue()40 fn type_mismatch_span_issue() {
41     #[pin_project]
42     enum Enum<A, B, C, D> {
43         Variant1(#[pin] A, B),
44         Variant2 {
45             #[pin]
46             field1: C,
47             field2: D,
48         },
49         None,
50     }
51 
52     let mut foo = Enum::Variant1(1, 2);
53     let mut foo = Pin::new(&mut foo).project();
54 
55     #[project]
56     match &mut foo {
57         Enum::Variant1(x, y) => {
58             let x: &mut Pin<&mut i32> = x;
59             assert_eq!(**x, 1);
60 
61             let y: &mut &mut i32 = y;
62             assert_eq!(**y, 2);
63         }
64         Enum::Variant2 { field1, field2 } => {
65             let _x: &mut Pin<&mut i32> = field1;
66             let _y: &mut &mut i32 = field2;
67         }
68         None => {} //~ ERROR mismatched types
69     }
70 }
71 
main()72 fn main() {}
73