• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use rustc_errors::MultiSpan;
2 use rustc_macros::{Diagnostic, LintDiagnostic, Subdiagnostic};
3 use rustc_middle::ty::{GenericArg, Ty};
4 use rustc_span::Span;
5 
6 use crate::diagnostics::RegionName;
7 
8 #[derive(Diagnostic)]
9 #[diag(borrowck_move_unsized, code = "E0161")]
10 pub(crate) struct MoveUnsized<'tcx> {
11     pub ty: Ty<'tcx>,
12     #[primary_span]
13     #[label]
14     pub span: Span,
15 }
16 
17 #[derive(Diagnostic)]
18 #[diag(borrowck_higher_ranked_lifetime_error)]
19 pub(crate) struct HigherRankedLifetimeError {
20     #[subdiagnostic]
21     pub cause: Option<HigherRankedErrorCause>,
22     #[primary_span]
23     pub span: Span,
24 }
25 
26 #[derive(Subdiagnostic)]
27 pub(crate) enum HigherRankedErrorCause {
28     #[note(borrowck_could_not_prove)]
29     CouldNotProve { predicate: String },
30     #[note(borrowck_could_not_normalize)]
31     CouldNotNormalize { value: String },
32 }
33 
34 #[derive(Diagnostic)]
35 #[diag(borrowck_higher_ranked_subtype_error)]
36 pub(crate) struct HigherRankedSubtypeError {
37     #[primary_span]
38     pub span: Span,
39 }
40 
41 #[derive(Diagnostic)]
42 #[diag(borrowck_generic_does_not_live_long_enough)]
43 pub(crate) struct GenericDoesNotLiveLongEnough {
44     pub kind: String,
45     #[primary_span]
46     pub span: Span,
47 }
48 
49 #[derive(LintDiagnostic)]
50 #[diag(borrowck_var_does_not_need_mut)]
51 pub(crate) struct VarNeedNotMut {
52     #[suggestion(style = "short", applicability = "machine-applicable", code = "")]
53     pub span: Span,
54 }
55 #[derive(Diagnostic)]
56 #[diag(borrowck_var_cannot_escape_closure)]
57 #[note]
58 #[note(borrowck_cannot_escape)]
59 pub(crate) struct FnMutError {
60     #[primary_span]
61     pub span: Span,
62     #[subdiagnostic]
63     pub ty_err: FnMutReturnTypeErr,
64 }
65 
66 #[derive(Subdiagnostic)]
67 pub(crate) enum VarHereDenote {
68     #[label(borrowck_var_here_captured)]
69     Captured {
70         #[primary_span]
71         span: Span,
72     },
73     #[label(borrowck_var_here_defined)]
74     Defined {
75         #[primary_span]
76         span: Span,
77     },
78     #[label(borrowck_closure_inferred_mut)]
79     FnMutInferred {
80         #[primary_span]
81         span: Span,
82     },
83 }
84 
85 #[derive(Subdiagnostic)]
86 pub(crate) enum FnMutReturnTypeErr {
87     #[label(borrowck_returned_closure_escaped)]
88     ReturnClosure {
89         #[primary_span]
90         span: Span,
91     },
92     #[label(borrowck_returned_async_block_escaped)]
93     ReturnAsyncBlock {
94         #[primary_span]
95         span: Span,
96     },
97     #[label(borrowck_returned_ref_escaped)]
98     ReturnRef {
99         #[primary_span]
100         span: Span,
101     },
102 }
103 
104 #[derive(Diagnostic)]
105 #[diag(borrowck_lifetime_constraints_error)]
106 pub(crate) struct LifetimeOutliveErr {
107     #[primary_span]
108     pub span: Span,
109 }
110 
111 #[derive(Subdiagnostic)]
112 pub(crate) enum LifetimeReturnCategoryErr<'a> {
113     #[label(borrowck_returned_lifetime_wrong)]
114     WrongReturn {
115         #[primary_span]
116         span: Span,
117         mir_def_name: &'a str,
118         outlived_fr_name: RegionName,
119         fr_name: &'a RegionName,
120     },
121     #[label(borrowck_returned_lifetime_short)]
122     ShortReturn {
123         #[primary_span]
124         span: Span,
125         category_desc: &'static str,
126         free_region_name: &'a RegionName,
127         outlived_fr_name: RegionName,
128     },
129 }
130 
131 #[derive(Subdiagnostic)]
132 pub(crate) enum RequireStaticErr {
133     #[note(borrowck_used_impl_require_static)]
134     UsedImpl {
135         #[primary_span]
136         multi_span: MultiSpan,
137     },
138 }
139 
140 #[derive(Subdiagnostic)]
141 pub(crate) enum CaptureVarPathUseCause {
142     #[label(borrowck_borrow_due_to_use_generator)]
143     BorrowInGenerator {
144         #[primary_span]
145         path_span: Span,
146     },
147     #[label(borrowck_use_due_to_use_generator)]
148     UseInGenerator {
149         #[primary_span]
150         path_span: Span,
151     },
152     #[label(borrowck_assign_due_to_use_generator)]
153     AssignInGenerator {
154         #[primary_span]
155         path_span: Span,
156     },
157     #[label(borrowck_assign_part_due_to_use_generator)]
158     AssignPartInGenerator {
159         #[primary_span]
160         path_span: Span,
161     },
162     #[label(borrowck_borrow_due_to_use_closure)]
163     BorrowInClosure {
164         #[primary_span]
165         path_span: Span,
166     },
167     #[label(borrowck_use_due_to_use_closure)]
168     UseInClosure {
169         #[primary_span]
170         path_span: Span,
171     },
172     #[label(borrowck_assign_due_to_use_closure)]
173     AssignInClosure {
174         #[primary_span]
175         path_span: Span,
176     },
177     #[label(borrowck_assign_part_due_to_use_closure)]
178     AssignPartInClosure {
179         #[primary_span]
180         path_span: Span,
181     },
182 }
183 
184 #[derive(Subdiagnostic)]
185 pub(crate) enum CaptureVarKind {
186     #[label(borrowck_capture_immute)]
187     Immut {
188         #[primary_span]
189         kind_span: Span,
190     },
191     #[label(borrowck_capture_mut)]
192     Mut {
193         #[primary_span]
194         kind_span: Span,
195     },
196     #[label(borrowck_capture_move)]
197     Move {
198         #[primary_span]
199         kind_span: Span,
200     },
201 }
202 
203 #[derive(Subdiagnostic)]
204 pub(crate) enum CaptureVarCause {
205     #[label(borrowck_var_borrow_by_use_place_in_generator)]
206     BorrowUsePlaceGenerator {
207         is_single_var: bool,
208         place: String,
209         #[primary_span]
210         var_span: Span,
211     },
212     #[label(borrowck_var_borrow_by_use_place_in_closure)]
213     BorrowUsePlaceClosure {
214         is_single_var: bool,
215         place: String,
216         #[primary_span]
217         var_span: Span,
218     },
219     #[label(borrowck_var_borrow_by_use_in_generator)]
220     BorrowUseInGenerator {
221         #[primary_span]
222         var_span: Span,
223     },
224     #[label(borrowck_var_borrow_by_use_in_closure)]
225     BorrowUseInClosure {
226         #[primary_span]
227         var_span: Span,
228     },
229     #[label(borrowck_var_move_by_use_in_generator)]
230     MoveUseInGenerator {
231         #[primary_span]
232         var_span: Span,
233     },
234     #[label(borrowck_var_move_by_use_in_closure)]
235     MoveUseInClosure {
236         #[primary_span]
237         var_span: Span,
238     },
239     #[label(borrowck_var_first_borrow_by_use_place_in_generator)]
240     FirstBorrowUsePlaceGenerator {
241         place: String,
242         #[primary_span]
243         var_span: Span,
244     },
245     #[label(borrowck_var_first_borrow_by_use_place_in_closure)]
246     FirstBorrowUsePlaceClosure {
247         place: String,
248         #[primary_span]
249         var_span: Span,
250     },
251     #[label(borrowck_var_second_borrow_by_use_place_in_generator)]
252     SecondBorrowUsePlaceGenerator {
253         place: String,
254         #[primary_span]
255         var_span: Span,
256     },
257     #[label(borrowck_var_second_borrow_by_use_place_in_closure)]
258     SecondBorrowUsePlaceClosure {
259         place: String,
260         #[primary_span]
261         var_span: Span,
262     },
263     #[label(borrowck_var_mutable_borrow_by_use_place_in_closure)]
264     MutableBorrowUsePlaceClosure {
265         place: String,
266         #[primary_span]
267         var_span: Span,
268     },
269     #[label(borrowck_partial_var_move_by_use_in_generator)]
270     PartialMoveUseInGenerator {
271         #[primary_span]
272         var_span: Span,
273         is_partial: bool,
274     },
275     #[label(borrowck_partial_var_move_by_use_in_closure)]
276     PartialMoveUseInClosure {
277         #[primary_span]
278         var_span: Span,
279         is_partial: bool,
280     },
281 }
282 
283 #[derive(Diagnostic)]
284 #[diag(borrowck_cannot_move_when_borrowed, code = "E0505")]
285 pub(crate) struct MoveBorrow<'a> {
286     pub place: &'a str,
287     pub borrow_place: &'a str,
288     pub value_place: &'a str,
289     #[primary_span]
290     #[label(borrowck_move_label)]
291     pub span: Span,
292     #[label]
293     pub borrow_span: Span,
294 }
295 
296 #[derive(Diagnostic)]
297 #[diag(borrowck_opaque_type_non_generic_param, code = "E0792")]
298 pub(crate) struct NonGenericOpaqueTypeParam<'a, 'tcx> {
299     pub ty: GenericArg<'tcx>,
300     pub kind: &'a str,
301     #[primary_span]
302     pub span: Span,
303     #[label]
304     pub param_span: Span,
305 }
306 
307 #[derive(Subdiagnostic)]
308 pub(crate) enum CaptureReasonLabel<'a> {
309     #[label(borrowck_moved_due_to_call)]
310     Call {
311         #[primary_span]
312         fn_call_span: Span,
313         place_name: &'a str,
314         is_partial: bool,
315         is_loop_message: bool,
316     },
317     #[label(borrowck_moved_due_to_usage_in_operator)]
318     OperatorUse {
319         #[primary_span]
320         fn_call_span: Span,
321         place_name: &'a str,
322         is_partial: bool,
323         is_loop_message: bool,
324     },
325     #[label(borrowck_moved_due_to_implicit_into_iter_call)]
326     ImplicitCall {
327         #[primary_span]
328         fn_call_span: Span,
329         place_name: &'a str,
330         is_partial: bool,
331         is_loop_message: bool,
332     },
333     #[label(borrowck_moved_due_to_method_call)]
334     MethodCall {
335         #[primary_span]
336         fn_call_span: Span,
337         place_name: &'a str,
338         is_partial: bool,
339         is_loop_message: bool,
340     },
341     #[label(borrowck_moved_due_to_await)]
342     Await {
343         #[primary_span]
344         fn_call_span: Span,
345         place_name: &'a str,
346         is_partial: bool,
347         is_loop_message: bool,
348     },
349     #[label(borrowck_value_moved_here)]
350     MovedHere {
351         #[primary_span]
352         move_span: Span,
353         is_partial: bool,
354         is_move_msg: bool,
355         is_loop_message: bool,
356     },
357     #[label(borrowck_consider_borrow_type_contents)]
358     BorrowContent {
359         #[primary_span]
360         var_span: Span,
361     },
362 }
363 
364 #[derive(Subdiagnostic)]
365 pub(crate) enum CaptureReasonNote {
366     #[note(borrowck_moved_a_fn_once_in_call)]
367     FnOnceMoveInCall {
368         #[primary_span]
369         var_span: Span,
370     },
371     #[note(borrowck_calling_operator_moves_lhs)]
372     LhsMoveByOperator {
373         #[primary_span]
374         span: Span,
375     },
376     #[note(borrowck_func_take_self_moved_place)]
377     FuncTakeSelf {
378         func: String,
379         place_name: String,
380         #[primary_span]
381         span: Span,
382     },
383 }
384 
385 #[derive(Subdiagnostic)]
386 pub(crate) enum CaptureReasonSuggest<'tcx> {
387     #[suggestion(
388         borrowck_suggest_iterate_over_slice,
389         applicability = "maybe-incorrect",
390         code = "&",
391         style = "verbose"
392     )]
393     IterateSlice {
394         ty: Ty<'tcx>,
395         #[primary_span]
396         span: Span,
397     },
398     #[suggestion(
399         borrowck_suggest_create_freash_reborrow,
400         applicability = "maybe-incorrect",
401         code = "as_mut().",
402         style = "verbose"
403     )]
404     FreshReborrow {
405         #[primary_span]
406         span: Span,
407     },
408 }
409 
410 #[derive(Subdiagnostic)]
411 pub(crate) enum CaptureArgLabel {
412     #[label(borrowck_value_capture_here)]
413     Capture {
414         is_within: bool,
415         #[primary_span]
416         args_span: Span,
417     },
418     #[label(borrowck_move_out_place_here)]
419     MoveOutPlace {
420         place: String,
421         #[primary_span]
422         args_span: Span,
423     },
424 }
425 
426 #[derive(Subdiagnostic)]
427 pub(crate) enum OnClosureNote<'a> {
428     #[note(borrowck_closure_invoked_twice)]
429     InvokedTwice {
430         place_name: &'a str,
431         #[primary_span]
432         span: Span,
433     },
434     #[note(borrowck_closure_moved_twice)]
435     MovedTwice {
436         place_name: &'a str,
437         #[primary_span]
438         span: Span,
439     },
440 }
441 
442 #[derive(Subdiagnostic)]
443 pub(crate) enum TypeNoCopy<'a, 'tcx> {
444     #[label(borrowck_ty_no_impl_copy)]
445     Label {
446         is_partial_move: bool,
447         ty: Ty<'tcx>,
448         place: &'a str,
449         #[primary_span]
450         span: Span,
451     },
452     #[note(borrowck_ty_no_impl_copy)]
453     Note { is_partial_move: bool, ty: Ty<'tcx>, place: &'a str },
454 }
455