1 #![allow(deprecated)]
2 
3 mod argument {
4     use pin_project::{pin_project, project};
5 
6     #[pin_project]
7     struct A(#[pin] ());
8 
9     #[project]
unexpected_local1()10     fn unexpected_local1() {
11         let mut x = A(());
12         #[project()] //~ ERROR unexpected token
13         let A(_) = Pin::new(&mut x).project();
14     }
15 
16     #[project]
unexpected_local1()17     fn unexpected_local1() {
18         let mut x = A(());
19         #[project(foo)] //~ ERROR unexpected token
20         let A(_) = Pin::new(&mut x).project();
21     }
22 
23     #[project]
unexpected_expr1()24     fn unexpected_expr1() {
25         let mut x = A(());
26         #[project()] //~ ERROR unexpected token
27         match Pin::new(&mut x).project() {
28             A(_) => {}
29         }
30     }
31 
32     #[project]
unexpected_expr1()33     fn unexpected_expr1() {
34         let mut x = A(());
35         #[project(foo)] //~ ERROR unexpected token
36         match Pin::new(&mut x).project() {
37             A(_) => {}
38         }
39     }
40 
41     #[project()] // Ok
unexpected_item1()42     fn unexpected_item1() {}
43 
44     #[project(foo)] //~ ERROR unexpected token
unexpected_item2()45     fn unexpected_item2() {}
46 }
47 
48 mod attribute {
49     use pin_project::{pin_project, project, project_ref, project_replace};
50 
51     #[pin_project(project_replace)]
52     struct A(#[pin] ());
53 
54     #[project]
duplicate_stmt_project()55     fn duplicate_stmt_project() {
56         let mut x = A(());
57         #[project]
58         #[project] //~ ERROR duplicate #[project] attribute
59         let A(_) = Pin::new(&mut x).project();
60     }
61 
62     #[project_ref]
duplicate_stmt_project_ref()63     fn duplicate_stmt_project_ref() {
64         let mut x = A(());
65         #[project_ref]
66         #[project_ref] //~ ERROR duplicate #[project_ref] attribute
67         let A(_) = Pin::new(&mut x).project();
68     }
69 
70     #[project_replace]
duplicate_stmt_project_replace()71     fn duplicate_stmt_project_replace() {
72         let mut x = A(());
73         #[project_replace]
74         #[project_replace] //~ ERROR duplicate #[project_replace] attribute
75         let A(_) = Pin::new(&mut x).project();
76     }
77 
78     #[project]
combine_stmt_project1()79     fn combine_stmt_project1() {
80         let mut x = A(());
81         #[project]
82         #[project_ref] //~ ERROR are mutually exclusive
83         let A(_) = Pin::new(&mut x).project();
84     }
85 
86     #[project]
combine_stmt_project2()87     fn combine_stmt_project2() {
88         let mut x = A(());
89         #[project]
90         #[project_replace] //~ ERROR are mutually exclusive
91         let A(_) = Pin::new(&mut x).project();
92     }
93 
94     #[project]
combine_stmt_project3()95     fn combine_stmt_project3() {
96         let mut x = A(());
97         #[project_ref]
98         #[project_replace] //~ ERROR are mutually exclusive
99         let A(_) = Pin::new(&mut x).project();
100     }
101 
102     #[project_ref]
combine_stmt_project_ref1()103     fn combine_stmt_project_ref1() {
104         let mut x = A(());
105         #[project]
106         #[project_ref] //~ ERROR are mutually exclusive
107         let A(_) = Pin::new(&mut x).project();
108     }
109 
110     #[project_ref]
combine_stmt_project_ref2()111     fn combine_stmt_project_ref2() {
112         let mut x = A(());
113         #[project]
114         #[project_replace] //~ ERROR are mutually exclusive
115         let A(_) = Pin::new(&mut x).project();
116     }
117 
118     #[project_ref]
combine_stmt_project_ref3()119     fn combine_stmt_project_ref3() {
120         let mut x = A(());
121         #[project_ref]
122         #[project_replace] //~ ERROR are mutually exclusive
123         let A(_) = Pin::new(&mut x).project();
124     }
125 
126     #[project_replace]
combine_stmt_project_replace1()127     fn combine_stmt_project_replace1() {
128         let mut x = A(());
129         #[project]
130         #[project_ref] //~ ERROR are mutually exclusive
131         let A(_) = Pin::new(&mut x).project();
132     }
133 
134     #[project_replace]
combine_stmt_project_replace2()135     fn combine_stmt_project_replace2() {
136         let mut x = A(());
137         #[project]
138         #[project_replace] //~ ERROR are mutually exclusive
139         let A(_) = Pin::new(&mut x).project();
140     }
141 
142     #[project_replace]
combine_stmt_project_replace3()143     fn combine_stmt_project_replace3() {
144         let mut x = A(());
145         #[project_ref]
146         #[project_replace] //~ ERROR are mutually exclusive
147         let A(_) = Pin::new(&mut x).project();
148     }
149 
150     #[project]
151     #[project] //~ ERROR duplicate #[project] attribute
duplicate_fn_project()152     fn duplicate_fn_project() {}
153 
154     #[project_ref]
155     #[project_ref] //~ ERROR duplicate #[project_ref] attribute
duplicate_fn_project_ref()156     fn duplicate_fn_project_ref() {}
157 
158     #[project_replace]
159     #[project_replace] //~ ERROR duplicate #[project_replace] attribute
duplicate_fn_project_replace()160     fn duplicate_fn_project_replace() {}
161 
162     #[project]
163     #[project] //~ ERROR duplicate #[project] attribute
164     impl A {}
165 
166     #[project_ref]
167     #[project_ref] //~ ERROR duplicate #[project_ref] attribute
168     impl A {}
169 
170     #[project_replace]
171     #[project_replace] //~ ERROR duplicate #[project_replace] attribute
172     impl A {}
173 
174     #[allow(unused_imports)]
175     mod use_ {
176         use pin_project::{project, project_ref, project_replace};
177 
178         #[project]
179         #[project] //~ ERROR duplicate #[project] attribute
180         use super::A;
181 
182         #[project_ref]
183         #[project_ref] //~ ERROR duplicate #[project_ref] attribute
184         use super::A;
185 
186         #[project_replace]
187         #[project_replace] //~ ERROR duplicate #[project_replace] attribute
188         use super::A;
189     }
190 }
191 
main()192 fn main() {}
193