1 use crate::thir::pattern::MatchCheckCtxt;
2 use rustc_errors::{error_code, Applicability, DiagnosticBuilder, ErrorGuaranteed, MultiSpan};
3 use rustc_macros::{LintDiagnostic, SessionDiagnostic, SessionSubdiagnostic};
4 use rustc_middle::ty::{self, Ty};
5 use rustc_session::{parse::ParseSess, SessionDiagnostic};
8 #[derive(LintDiagnostic)]
9 #[diag(mir_build::unconditional_recursion)]
11 pub struct UnconditionalRecursion {
14 #[label(mir_build::unconditional_recursion_call_site_label)]
15 pub call_sites: Vec<Span>,
18 #[derive(LintDiagnostic)]
19 #[diag(mir_build::unsafe_op_in_unsafe_fn_call_to_unsafe_fn_requires_unsafe)]
21 pub struct UnsafeOpInUnsafeFnCallToUnsafeFunctionRequiresUnsafe<'a> {
24 pub function: &'a str,
27 #[derive(LintDiagnostic)]
28 #[diag(mir_build::unsafe_op_in_unsafe_fn_call_to_unsafe_fn_requires_unsafe_nameless)]
30 pub struct UnsafeOpInUnsafeFnCallToUnsafeFunctionRequiresUnsafeNameless {
35 #[derive(LintDiagnostic)]
36 #[diag(mir_build::unsafe_op_in_unsafe_fn_inline_assembly_requires_unsafe)]
38 pub struct UnsafeOpInUnsafeFnUseOfInlineAssemblyRequiresUnsafe {
43 #[derive(LintDiagnostic)]
44 #[diag(mir_build::unsafe_op_in_unsafe_fn_initializing_type_with_requires_unsafe)]
46 pub struct UnsafeOpInUnsafeFnInitializingTypeWithRequiresUnsafe {
51 #[derive(LintDiagnostic)]
52 #[diag(mir_build::unsafe_op_in_unsafe_fn_mutable_static_requires_unsafe)]
54 pub struct UnsafeOpInUnsafeFnUseOfMutableStaticRequiresUnsafe {
59 #[derive(LintDiagnostic)]
60 #[diag(mir_build::unsafe_op_in_unsafe_fn_extern_static_requires_unsafe)]
62 pub struct UnsafeOpInUnsafeFnUseOfExternStaticRequiresUnsafe {
67 #[derive(LintDiagnostic)]
68 #[diag(mir_build::unsafe_op_in_unsafe_fn_deref_raw_pointer_requires_unsafe)]
70 pub struct UnsafeOpInUnsafeFnDerefOfRawPointerRequiresUnsafe {
75 #[derive(LintDiagnostic)]
76 #[diag(mir_build::unsafe_op_in_unsafe_fn_union_field_requires_unsafe)]
78 pub struct UnsafeOpInUnsafeFnAccessToUnionFieldRequiresUnsafe {
83 #[derive(LintDiagnostic)]
84 #[diag(mir_build::unsafe_op_in_unsafe_fn_mutation_of_layout_constrained_field_requires_unsafe)]
86 pub struct UnsafeOpInUnsafeFnMutationOfLayoutConstrainedFieldRequiresUnsafe {
91 #[derive(LintDiagnostic)]
92 #[diag(mir_build::unsafe_op_in_unsafe_fn_borrow_of_layout_constrained_field_requires_unsafe)]
93 pub struct UnsafeOpInUnsafeFnBorrowOfLayoutConstrainedFieldRequiresUnsafe {
98 #[derive(LintDiagnostic)]
99 #[diag(mir_build::unsafe_op_in_unsafe_fn_call_to_fn_with_requires_unsafe)]
101 pub struct UnsafeOpInUnsafeFnCallToFunctionWithRequiresUnsafe<'a> {
104 pub function: &'a str,
107 #[derive(SessionDiagnostic)]
108 #[diag(mir_build::call_to_unsafe_fn_requires_unsafe, code = "E0133")]
110 pub struct CallToUnsafeFunctionRequiresUnsafe<'a> {
114 pub function: &'a str,
117 #[derive(SessionDiagnostic)]
118 #[diag(mir_build::call_to_unsafe_fn_requires_unsafe_nameless, code = "E0133")]
120 pub struct CallToUnsafeFunctionRequiresUnsafeNameless {
126 #[derive(SessionDiagnostic)]
127 #[diag(mir_build::call_to_unsafe_fn_requires_unsafe_unsafe_op_in_unsafe_fn_allowed, code = "E0133")]
129 pub struct CallToUnsafeFunctionRequiresUnsafeUnsafeOpInUnsafeFnAllowed<'a> {
133 pub function: &'a str,
136 #[derive(SessionDiagnostic)]
138 mir_build::call_to_unsafe_fn_requires_unsafe_nameless_unsafe_op_in_unsafe_fn_allowed,
142 pub struct CallToUnsafeFunctionRequiresUnsafeNamelessUnsafeOpInUnsafeFnAllowed {
148 #[derive(SessionDiagnostic)]
149 #[diag(mir_build::inline_assembly_requires_unsafe, code = "E0133")]
151 pub struct UseOfInlineAssemblyRequiresUnsafe {
157 #[derive(SessionDiagnostic)]
158 #[diag(mir_build::inline_assembly_requires_unsafe_unsafe_op_in_unsafe_fn_allowed, code = "E0133")]
160 pub struct UseOfInlineAssemblyRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
166 #[derive(SessionDiagnostic)]
167 #[diag(mir_build::initializing_type_with_requires_unsafe, code = "E0133")]
169 pub struct InitializingTypeWithRequiresUnsafe {
175 #[derive(SessionDiagnostic)]
177 mir_build::initializing_type_with_requires_unsafe_unsafe_op_in_unsafe_fn_allowed,
181 pub struct InitializingTypeWithRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
187 #[derive(SessionDiagnostic)]
188 #[diag(mir_build::mutable_static_requires_unsafe, code = "E0133")]
190 pub struct UseOfMutableStaticRequiresUnsafe {
196 #[derive(SessionDiagnostic)]
197 #[diag(mir_build::mutable_static_requires_unsafe_unsafe_op_in_unsafe_fn_allowed, code = "E0133")]
199 pub struct UseOfMutableStaticRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
205 #[derive(SessionDiagnostic)]
206 #[diag(mir_build::extern_static_requires_unsafe, code = "E0133")]
208 pub struct UseOfExternStaticRequiresUnsafe {
214 #[derive(SessionDiagnostic)]
215 #[diag(mir_build::extern_static_requires_unsafe_unsafe_op_in_unsafe_fn_allowed, code = "E0133")]
217 pub struct UseOfExternStaticRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
223 #[derive(SessionDiagnostic)]
224 #[diag(mir_build::deref_raw_pointer_requires_unsafe, code = "E0133")]
226 pub struct DerefOfRawPointerRequiresUnsafe {
232 #[derive(SessionDiagnostic)]
233 #[diag(mir_build::deref_raw_pointer_requires_unsafe_unsafe_op_in_unsafe_fn_allowed, code = "E0133")]
235 pub struct DerefOfRawPointerRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
241 #[derive(SessionDiagnostic)]
242 #[diag(mir_build::union_field_requires_unsafe, code = "E0133")]
244 pub struct AccessToUnionFieldRequiresUnsafe {
250 #[derive(SessionDiagnostic)]
251 #[diag(mir_build::union_field_requires_unsafe_unsafe_op_in_unsafe_fn_allowed, code = "E0133")]
253 pub struct AccessToUnionFieldRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
259 #[derive(SessionDiagnostic)]
260 #[diag(mir_build::mutation_of_layout_constrained_field_requires_unsafe, code = "E0133")]
262 pub struct MutationOfLayoutConstrainedFieldRequiresUnsafe {
268 #[derive(SessionDiagnostic)]
270 mir_build::mutation_of_layout_constrained_field_requires_unsafe_unsafe_op_in_unsafe_fn_allowed,
274 pub struct MutationOfLayoutConstrainedFieldRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
280 #[derive(SessionDiagnostic)]
281 #[diag(mir_build::borrow_of_layout_constrained_field_requires_unsafe, code = "E0133")]
283 pub struct BorrowOfLayoutConstrainedFieldRequiresUnsafe {
289 #[derive(SessionDiagnostic)]
291 mir_build::borrow_of_layout_constrained_field_requires_unsafe_unsafe_op_in_unsafe_fn_allowed,
295 pub struct BorrowOfLayoutConstrainedFieldRequiresUnsafeUnsafeOpInUnsafeFnAllowed {
301 #[derive(SessionDiagnostic)]
302 #[diag(mir_build::call_to_fn_with_requires_unsafe, code = "E0133")]
304 pub struct CallToFunctionWithRequiresUnsafe<'a> {
308 pub function: &'a str,
311 #[derive(SessionDiagnostic)]
312 #[diag(mir_build::call_to_fn_with_requires_unsafe_unsafe_op_in_unsafe_fn_allowed, code = "E0133")]
314 pub struct CallToFunctionWithRequiresUnsafeUnsafeOpInUnsafeFnAllowed<'a> {
318 pub function: &'a str,
321 #[derive(LintDiagnostic)]
322 #[diag(mir_build::unused_unsafe)]
323 pub struct UnusedUnsafe {
327 pub enclosing: Option<UnusedUnsafeEnclosing>,
330 #[derive(SessionSubdiagnostic)]
331 pub enum UnusedUnsafeEnclosing {
332 #[label(mir_build::unused_unsafe_enclosing_block_label)]
337 #[label(mir_build::unused_unsafe_enclosing_fn_label)]
344 pub(crate) struct NonExhaustivePatternsTypeNotEmpty<'p, 'tcx, 'm> {
345 pub cx: &'m MatchCheckCtxt<'p, 'tcx>,
351 impl<'a> SessionDiagnostic<'a> for NonExhaustivePatternsTypeNotEmpty<'_, '_, '_> {
352 fn into_diagnostic(self, sess: &'a ParseSess) -> DiagnosticBuilder<'_, ErrorGuaranteed> {
353 let mut diag = sess.span_diagnostic.struct_span_err_with_code(
355 rustc_errors::fluent::mir_build::non_exhaustive_patterns_type_not_empty,
359 let peeled_ty = self.ty.peel_refs();
360 diag.set_arg("ty", self.ty);
361 diag.set_arg("peeled_ty", peeled_ty);
363 if let ty::Adt(def, _) = peeled_ty.kind() {
368 .get_if_local(def.did())
369 .and_then(|node| node.ident())
370 .map(|ident| ident.span)
371 .unwrap_or_else(|| self.cx.tcx.def_span(def.did()));
373 // workaround to make test pass
374 let mut span: MultiSpan = def_span.into();
375 span.push_span_label(def_span, "");
377 diag.span_note(span, rustc_errors::fluent::mir_build::def_note);
380 let is_variant_list_non_exhaustive = match self.ty.kind() {
381 ty::Adt(def, _) if def.is_variant_list_non_exhaustive() && !def.did().is_local() => {
387 if is_variant_list_non_exhaustive {
388 diag.note(rustc_errors::fluent::mir_build::non_exhaustive_type_note);
390 diag.note(rustc_errors::fluent::mir_build::type_note);
393 if let ty::Ref(_, sub_ty, _) = self.ty.kind() {
394 if self.cx.tcx.is_ty_uninhabited_from(self.cx.module, *sub_ty, self.cx.param_env) {
395 diag.note(rustc_errors::fluent::mir_build::reference_note);
399 let mut suggestion = None;
400 let sm = self.cx.tcx.sess.source_map();
401 if self.span.eq_ctxt(self.expr_span) {
402 // Get the span for the empty match body `{}`.
403 let (indentation, more) = if let Some(snippet) = sm.indentation_before(self.span) {
404 (format!("\n{}", snippet), " ")
406 (" ".to_string(), "")
409 self.span.shrink_to_hi().with_hi(self.expr_span.hi()),
411 " {{{indentation}{more}_ => todo!(),{indentation}}}",
412 indentation = indentation,
418 if let Some((span, sugg)) = suggestion {
419 diag.span_suggestion_verbose(
421 rustc_errors::fluent::mir_build::suggestion,
423 Applicability::HasPlaceholders,
426 diag.help(rustc_errors::fluent::mir_build::help);
433 #[derive(SessionDiagnostic)]
434 #[diag(mir_build::static_in_pattern, code = "E0158")]
435 pub struct StaticInPattern {
440 #[derive(SessionDiagnostic)]
441 #[diag(mir_build::assoc_const_in_pattern, code = "E0158")]
442 pub struct AssocConstInPattern {
447 #[derive(SessionDiagnostic)]
448 #[diag(mir_build::const_param_in_pattern, code = "E0158")]
449 pub struct ConstParamInPattern {
454 #[derive(SessionDiagnostic)]
455 #[diag(mir_build::non_const_path, code = "E0080")]
456 pub struct NonConstPath {
461 #[derive(LintDiagnostic)]
462 #[diag(mir_build::unreachable_pattern)]
463 pub struct UnreachablePattern {
465 pub span: Option<Span>,
466 #[label(mir_build::catchall_label)]
467 pub catchall: Option<Span>,