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