1 use crate::thir::pattern::MatchCheckCtxt;
2 use rustc_errors::Handler;
4 error_code, Applicability, DiagnosticBuilder, ErrorGuaranteed, IntoDiagnostic, MultiSpan,
6 use rustc_macros::{Diagnostic, LintDiagnostic, Subdiagnostic};
7 use rustc_middle::ty::{self, Ty};
8 use rustc_span::{symbol::Ident, Span};
10 #[derive(LintDiagnostic)]
11 #[diag(mir_build_unconditional_recursion)]
13 pub struct UnconditionalRecursion {
16 #[label(mir_build_unconditional_recursion_call_site_label)]
17 pub call_sites: Vec<Span>,
20 #[derive(LintDiagnostic)]
21 #[diag(mir_build_unsafe_op_in_unsafe_fn_call_to_unsafe_fn_requires_unsafe)]
23 pub struct UnsafeOpInUnsafeFnCallToUnsafeFunctionRequiresUnsafe<'a> {
26 pub function: &'a str,
29 #[derive(LintDiagnostic)]
30 #[diag(mir_build_unsafe_op_in_unsafe_fn_call_to_unsafe_fn_requires_unsafe_nameless)]
32 pub struct UnsafeOpInUnsafeFnCallToUnsafeFunctionRequiresUnsafeNameless {
37 #[derive(LintDiagnostic)]
38 #[diag(mir_build_unsafe_op_in_unsafe_fn_inline_assembly_requires_unsafe)]
40 pub struct UnsafeOpInUnsafeFnUseOfInlineAssemblyRequiresUnsafe {
45 #[derive(LintDiagnostic)]
46 #[diag(mir_build_unsafe_op_in_unsafe_fn_initializing_type_with_requires_unsafe)]
48 pub struct UnsafeOpInUnsafeFnInitializingTypeWithRequiresUnsafe {
53 #[derive(LintDiagnostic)]
54 #[diag(mir_build_unsafe_op_in_unsafe_fn_mutable_static_requires_unsafe)]
56 pub struct UnsafeOpInUnsafeFnUseOfMutableStaticRequiresUnsafe {
61 #[derive(LintDiagnostic)]
62 #[diag(mir_build_unsafe_op_in_unsafe_fn_extern_static_requires_unsafe)]
64 pub struct UnsafeOpInUnsafeFnUseOfExternStaticRequiresUnsafe {
69 #[derive(LintDiagnostic)]
70 #[diag(mir_build_unsafe_op_in_unsafe_fn_deref_raw_pointer_requires_unsafe)]
72 pub struct UnsafeOpInUnsafeFnDerefOfRawPointerRequiresUnsafe {
77 #[derive(LintDiagnostic)]
78 #[diag(mir_build_unsafe_op_in_unsafe_fn_union_field_requires_unsafe)]
80 pub struct UnsafeOpInUnsafeFnAccessToUnionFieldRequiresUnsafe {
85 #[derive(LintDiagnostic)]
86 #[diag(mir_build_unsafe_op_in_unsafe_fn_mutation_of_layout_constrained_field_requires_unsafe)]
88 pub struct UnsafeOpInUnsafeFnMutationOfLayoutConstrainedFieldRequiresUnsafe {
93 #[derive(LintDiagnostic)]
94 #[diag(mir_build_unsafe_op_in_unsafe_fn_borrow_of_layout_constrained_field_requires_unsafe)]
95 pub struct UnsafeOpInUnsafeFnBorrowOfLayoutConstrainedFieldRequiresUnsafe {
100 #[derive(LintDiagnostic)]
101 #[diag(mir_build_unsafe_op_in_unsafe_fn_call_to_fn_with_requires_unsafe)]
103 pub struct UnsafeOpInUnsafeFnCallToFunctionWithRequiresUnsafe<'a> {
106 pub function: &'a str,
109 #[derive(Diagnostic)]
110 #[diag(mir_build_call_to_unsafe_fn_requires_unsafe, code = "E0133")]
112 pub struct CallToUnsafeFunctionRequiresUnsafe<'a> {
116 pub function: &'a str,
119 #[derive(Diagnostic)]
120 #[diag(mir_build_call_to_unsafe_fn_requires_unsafe_nameless, code = "E0133")]
122 pub struct CallToUnsafeFunctionRequiresUnsafeNameless {
128 #[derive(Diagnostic)]
129 #[diag(mir_build_call_to_unsafe_fn_requires_unsafe_unsafe_op_in_unsafe_fn_allowed, code = "E0133")]
131 pub struct CallToUnsafeFunctionRequiresUnsafeUnsafeOpInUnsafeFnAllowed<'a> {
135 pub function: &'a str,
138 #[derive(Diagnostic)]
140 mir_build_call_to_unsafe_fn_requires_unsafe_nameless_unsafe_op_in_unsafe_fn_allowed,
144 pub struct CallToUnsafeFunctionRequiresUnsafeNamelessUnsafeOpInUnsafeFnAllowed {
150 #[derive(Diagnostic)]
151 #[diag(mir_build_inline_assembly_requires_unsafe, code = "E0133")]
153 pub struct UseOfInlineAssemblyRequiresUnsafe {
159 #[derive(Diagnostic)]
160 #[diag(mir_build_inline_assembly_requires_unsafe_unsafe_op_in_unsafe_fn_allowed, code = "E0133")]
162 pub struct UseOfInlineAssemblyRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
168 #[derive(Diagnostic)]
169 #[diag(mir_build_initializing_type_with_requires_unsafe, code = "E0133")]
171 pub struct InitializingTypeWithRequiresUnsafe {
177 #[derive(Diagnostic)]
179 mir_build_initializing_type_with_requires_unsafe_unsafe_op_in_unsafe_fn_allowed,
183 pub struct InitializingTypeWithRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
189 #[derive(Diagnostic)]
190 #[diag(mir_build_mutable_static_requires_unsafe, code = "E0133")]
192 pub struct UseOfMutableStaticRequiresUnsafe {
198 #[derive(Diagnostic)]
199 #[diag(mir_build_mutable_static_requires_unsafe_unsafe_op_in_unsafe_fn_allowed, code = "E0133")]
201 pub struct UseOfMutableStaticRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
207 #[derive(Diagnostic)]
208 #[diag(mir_build_extern_static_requires_unsafe, code = "E0133")]
210 pub struct UseOfExternStaticRequiresUnsafe {
216 #[derive(Diagnostic)]
217 #[diag(mir_build_extern_static_requires_unsafe_unsafe_op_in_unsafe_fn_allowed, code = "E0133")]
219 pub struct UseOfExternStaticRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
225 #[derive(Diagnostic)]
226 #[diag(mir_build_deref_raw_pointer_requires_unsafe, code = "E0133")]
228 pub struct DerefOfRawPointerRequiresUnsafe {
234 #[derive(Diagnostic)]
235 #[diag(mir_build_deref_raw_pointer_requires_unsafe_unsafe_op_in_unsafe_fn_allowed, code = "E0133")]
237 pub struct DerefOfRawPointerRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
243 #[derive(Diagnostic)]
244 #[diag(mir_build_union_field_requires_unsafe, code = "E0133")]
246 pub struct AccessToUnionFieldRequiresUnsafe {
252 #[derive(Diagnostic)]
253 #[diag(mir_build_union_field_requires_unsafe_unsafe_op_in_unsafe_fn_allowed, code = "E0133")]
255 pub struct AccessToUnionFieldRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
261 #[derive(Diagnostic)]
262 #[diag(mir_build_mutation_of_layout_constrained_field_requires_unsafe, code = "E0133")]
264 pub struct MutationOfLayoutConstrainedFieldRequiresUnsafe {
270 #[derive(Diagnostic)]
272 mir_build_mutation_of_layout_constrained_field_requires_unsafe_unsafe_op_in_unsafe_fn_allowed,
276 pub struct MutationOfLayoutConstrainedFieldRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
282 #[derive(Diagnostic)]
283 #[diag(mir_build_borrow_of_layout_constrained_field_requires_unsafe, code = "E0133")]
285 pub struct BorrowOfLayoutConstrainedFieldRequiresUnsafe {
291 #[derive(Diagnostic)]
293 mir_build_borrow_of_layout_constrained_field_requires_unsafe_unsafe_op_in_unsafe_fn_allowed,
297 pub struct BorrowOfLayoutConstrainedFieldRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
303 #[derive(Diagnostic)]
304 #[diag(mir_build_call_to_fn_with_requires_unsafe, code = "E0133")]
306 pub struct CallToFunctionWithRequiresUnsafe<'a> {
310 pub function: &'a str,
313 #[derive(Diagnostic)]
314 #[diag(mir_build_call_to_fn_with_requires_unsafe_unsafe_op_in_unsafe_fn_allowed, code = "E0133")]
316 pub struct CallToFunctionWithRequiresUnsafeUnsafeOpInUnsafeFnAllowed<'a> {
320 pub function: &'a str,
323 #[derive(LintDiagnostic)]
324 #[diag(mir_build_unused_unsafe)]
325 pub struct UnusedUnsafe {
329 pub enclosing: Option<UnusedUnsafeEnclosing>,
332 #[derive(Subdiagnostic)]
333 pub enum UnusedUnsafeEnclosing {
334 #[label(mir_build_unused_unsafe_enclosing_block_label)]
339 #[label(mir_build_unused_unsafe_enclosing_fn_label)]
346 pub(crate) struct NonExhaustivePatternsTypeNotEmpty<'p, 'tcx, 'm> {
347 pub cx: &'m MatchCheckCtxt<'p, 'tcx>,
353 impl<'a> IntoDiagnostic<'a> for NonExhaustivePatternsTypeNotEmpty<'_, '_, '_> {
354 fn into_diagnostic(self, handler: &'a Handler) -> DiagnosticBuilder<'_, ErrorGuaranteed> {
355 let mut diag = handler.struct_span_err_with_code(
357 rustc_errors::fluent::mir_build_non_exhaustive_patterns_type_not_empty,
361 let peeled_ty = self.ty.peel_refs();
362 diag.set_arg("ty", self.ty);
363 diag.set_arg("peeled_ty", peeled_ty);
365 if let ty::Adt(def, _) = peeled_ty.kind() {
370 .get_if_local(def.did())
371 .and_then(|node| node.ident())
372 .map(|ident| ident.span)
373 .unwrap_or_else(|| self.cx.tcx.def_span(def.did()));
375 // workaround to make test pass
376 let mut span: MultiSpan = def_span.into();
377 span.push_span_label(def_span, "");
379 diag.span_note(span, rustc_errors::fluent::def_note);
382 let is_variant_list_non_exhaustive = match self.ty.kind() {
383 ty::Adt(def, _) if def.is_variant_list_non_exhaustive() && !def.did().is_local() => {
389 if is_variant_list_non_exhaustive {
390 diag.note(rustc_errors::fluent::non_exhaustive_type_note);
392 diag.note(rustc_errors::fluent::type_note);
395 if let ty::Ref(_, sub_ty, _) = self.ty.kind() {
396 if !sub_ty.is_inhabited_from(self.cx.tcx, self.cx.module, self.cx.param_env) {
397 diag.note(rustc_errors::fluent::reference_note);
401 let mut suggestion = None;
402 let sm = self.cx.tcx.sess.source_map();
403 if self.span.eq_ctxt(self.expr_span) {
404 // Get the span for the empty match body `{}`.
405 let (indentation, more) = if let Some(snippet) = sm.indentation_before(self.span) {
406 (format!("\n{}", snippet), " ")
408 (" ".to_string(), "")
411 self.span.shrink_to_hi().with_hi(self.expr_span.hi()),
413 " {{{indentation}{more}_ => todo!(),{indentation}}}",
414 indentation = indentation,
420 if let Some((span, sugg)) = suggestion {
421 diag.span_suggestion_verbose(
423 rustc_errors::fluent::suggestion,
425 Applicability::HasPlaceholders,
428 diag.help(rustc_errors::fluent::help);
435 #[derive(Diagnostic)]
436 #[diag(mir_build_static_in_pattern, code = "E0158")]
437 pub struct StaticInPattern {
442 #[derive(Diagnostic)]
443 #[diag(mir_build_assoc_const_in_pattern, code = "E0158")]
444 pub struct AssocConstInPattern {
449 #[derive(Diagnostic)]
450 #[diag(mir_build_const_param_in_pattern, code = "E0158")]
451 pub struct ConstParamInPattern {
456 #[derive(Diagnostic)]
457 #[diag(mir_build_non_const_path, code = "E0080")]
458 pub struct NonConstPath {
463 #[derive(LintDiagnostic)]
464 #[diag(mir_build_unreachable_pattern)]
465 pub struct UnreachablePattern {
467 pub span: Option<Span>,
468 #[label(catchall_label)]
469 pub catchall: Option<Span>,
472 #[derive(Diagnostic)]
473 #[diag(mir_build_const_pattern_depends_on_generic_parameter)]
474 pub struct ConstPatternDependsOnGenericParameter {
479 #[derive(Diagnostic)]
480 #[diag(mir_build_could_not_eval_const_pattern)]
481 pub struct CouldNotEvalConstPattern {
486 #[derive(Diagnostic)]
487 #[diag(mir_build_lower_range_bound_must_be_less_than_or_equal_to_upper, code = "E0030")]
488 pub struct LowerRangeBoundMustBeLessThanOrEqualToUpper {
493 pub teach: Option<()>,
496 #[derive(Diagnostic)]
497 #[diag(mir_build_lower_range_bound_must_be_less_than_upper, code = "E0579")]
498 pub struct LowerRangeBoundMustBeLessThanUpper {
503 #[derive(LintDiagnostic)]
504 #[diag(mir_build_leading_irrefutable_let_patterns)]
507 pub struct LeadingIrrefutableLetPatterns {
511 #[derive(LintDiagnostic)]
512 #[diag(mir_build_trailing_irrefutable_let_patterns)]
515 pub struct TrailingIrrefutableLetPatterns {
519 #[derive(LintDiagnostic)]
520 #[diag(mir_build_bindings_with_variant_name, code = "E0170")]
521 pub struct BindingsWithVariantName {
522 #[suggestion(code = "{ty_path}::{ident}", applicability = "machine-applicable")]
523 pub suggestion: Option<Span>,
528 #[derive(LintDiagnostic)]
529 #[diag(mir_build_irrefutable_let_patterns_generic_let)]
532 pub struct IrrefutableLetPatternsGenericLet {
536 #[derive(LintDiagnostic)]
537 #[diag(mir_build_irrefutable_let_patterns_if_let)]
540 pub struct IrrefutableLetPatternsIfLet {
544 #[derive(LintDiagnostic)]
545 #[diag(mir_build_irrefutable_let_patterns_if_let_guard)]
548 pub struct IrrefutableLetPatternsIfLetGuard {
552 #[derive(LintDiagnostic)]
553 #[diag(mir_build_irrefutable_let_patterns_let_else)]
556 pub struct IrrefutableLetPatternsLetElse {
560 #[derive(LintDiagnostic)]
561 #[diag(mir_build_irrefutable_let_patterns_while_let)]
564 pub struct IrrefutableLetPatternsWhileLet {
568 #[derive(Diagnostic)]
569 #[diag(mir_build_borrow_of_moved_value)]
570 pub struct BorrowOfMovedValue<'tcx> {
574 #[label(occurs_because_label)]
575 pub binding_span: Span,
576 #[label(value_borrowed_label)]
577 pub conflicts_ref: Vec<Span>,
580 #[suggestion(code = "ref ", applicability = "machine-applicable")]
581 pub suggest_borrowing: Option<Span>,
584 #[derive(Diagnostic)]
585 #[diag(mir_build_multiple_mut_borrows)]
586 pub struct MultipleMutBorrows {
590 pub binding_span: Span,
592 pub occurences: Vec<MultipleMutBorrowOccurence>,
596 #[derive(Subdiagnostic)]
597 pub enum MultipleMutBorrowOccurence {
598 #[label(mutable_borrow)]
604 #[label(immutable_borrow)]