use rustc_errors::MultiSpan; use rustc_macros::{Diagnostic, LintDiagnostic, Subdiagnostic}; use rustc_middle::ty::{GenericArg, Ty}; use rustc_span::Span; use crate::diagnostics::RegionName; #[derive(Diagnostic)] #[diag(borrowck_move_unsized, code = "E0161")] pub(crate) struct MoveUnsized<'tcx> { pub ty: Ty<'tcx>, #[primary_span] #[label] pub span: Span, } #[derive(Diagnostic)] #[diag(borrowck_higher_ranked_lifetime_error)] pub(crate) struct HigherRankedLifetimeError { #[subdiagnostic] pub cause: Option, #[primary_span] pub span: Span, } #[derive(Subdiagnostic)] pub(crate) enum HigherRankedErrorCause { #[note(borrowck_could_not_prove)] CouldNotProve { predicate: String }, #[note(borrowck_could_not_normalize)] CouldNotNormalize { value: String }, } #[derive(Diagnostic)] #[diag(borrowck_higher_ranked_subtype_error)] pub(crate) struct HigherRankedSubtypeError { #[primary_span] pub span: Span, } #[derive(Diagnostic)] #[diag(borrowck_generic_does_not_live_long_enough)] pub(crate) struct GenericDoesNotLiveLongEnough { pub kind: String, #[primary_span] pub span: Span, } #[derive(LintDiagnostic)] #[diag(borrowck_var_does_not_need_mut)] pub(crate) struct VarNeedNotMut { #[suggestion(style = "short", applicability = "machine-applicable", code = "")] pub span: Span, } #[derive(Diagnostic)] #[diag(borrowck_var_cannot_escape_closure)] #[note] #[note(borrowck_cannot_escape)] pub(crate) struct FnMutError { #[primary_span] pub span: Span, #[subdiagnostic] pub ty_err: FnMutReturnTypeErr, } #[derive(Subdiagnostic)] pub(crate) enum VarHereDenote { #[label(borrowck_var_here_captured)] Captured { #[primary_span] span: Span, }, #[label(borrowck_var_here_defined)] Defined { #[primary_span] span: Span, }, #[label(borrowck_closure_inferred_mut)] FnMutInferred { #[primary_span] span: Span, }, } #[derive(Subdiagnostic)] pub(crate) enum FnMutReturnTypeErr { #[label(borrowck_returned_closure_escaped)] ReturnClosure { #[primary_span] span: Span, }, #[label(borrowck_returned_async_block_escaped)] ReturnAsyncBlock { #[primary_span] span: Span, }, #[label(borrowck_returned_ref_escaped)] ReturnRef { #[primary_span] span: Span, }, } #[derive(Diagnostic)] #[diag(borrowck_lifetime_constraints_error)] pub(crate) struct LifetimeOutliveErr { #[primary_span] pub span: Span, } #[derive(Subdiagnostic)] pub(crate) enum LifetimeReturnCategoryErr<'a> { #[label(borrowck_returned_lifetime_wrong)] WrongReturn { #[primary_span] span: Span, mir_def_name: &'a str, outlived_fr_name: RegionName, fr_name: &'a RegionName, }, #[label(borrowck_returned_lifetime_short)] ShortReturn { #[primary_span] span: Span, category_desc: &'static str, free_region_name: &'a RegionName, outlived_fr_name: RegionName, }, } #[derive(Subdiagnostic)] pub(crate) enum RequireStaticErr { #[note(borrowck_used_impl_require_static)] UsedImpl { #[primary_span] multi_span: MultiSpan, }, } #[derive(Subdiagnostic)] pub(crate) enum CaptureVarPathUseCause { #[label(borrowck_borrow_due_to_use_generator)] BorrowInGenerator { #[primary_span] path_span: Span, }, #[label(borrowck_use_due_to_use_generator)] UseInGenerator { #[primary_span] path_span: Span, }, #[label(borrowck_assign_due_to_use_generator)] AssignInGenerator { #[primary_span] path_span: Span, }, #[label(borrowck_assign_part_due_to_use_generator)] AssignPartInGenerator { #[primary_span] path_span: Span, }, #[label(borrowck_borrow_due_to_use_closure)] BorrowInClosure { #[primary_span] path_span: Span, }, #[label(borrowck_use_due_to_use_closure)] UseInClosure { #[primary_span] path_span: Span, }, #[label(borrowck_assign_due_to_use_closure)] AssignInClosure { #[primary_span] path_span: Span, }, #[label(borrowck_assign_part_due_to_use_closure)] AssignPartInClosure { #[primary_span] path_span: Span, }, } #[derive(Subdiagnostic)] pub(crate) enum CaptureVarKind { #[label(borrowck_capture_immute)] Immute { #[primary_span] kind_span: Span, }, #[label(borrowck_capture_mut)] Mut { #[primary_span] kind_span: Span, }, #[label(borrowck_capture_move)] Move { #[primary_span] kind_span: Span, }, } #[derive(Subdiagnostic)] pub(crate) enum CaptureVarCause { #[label(borrowck_var_borrow_by_use_place_in_generator)] BorrowUsePlaceGenerator { place: String, #[primary_span] var_span: Span, }, #[label(borrowck_var_borrow_by_use_place_in_closure)] BorrowUsePlaceClosure { place: String, #[primary_span] var_span: Span, }, } #[derive(Diagnostic)] #[diag(borrowck_cannot_move_when_borrowed, code = "E0505")] pub(crate) struct MoveBorrow<'a> { pub place: &'a str, pub borrow_place: &'a str, pub value_place: &'a str, #[primary_span] #[label(borrowck_move_label)] pub span: Span, #[label] pub borrow_span: Span, } #[derive(Diagnostic)] #[diag(borrowck_opaque_type_non_generic_param, code = "E0792")] pub(crate) struct NonGenericOpaqueTypeParam<'a, 'tcx> { pub ty: GenericArg<'tcx>, pub kind: &'a str, #[primary_span] pub span: Span, #[label] pub param_span: Span, }