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