Skip to main content

rustc_lint/
lints.rs

1// ignore-tidy-file-filelength
2
3use std::num::NonZero;
4
5use rustc_data_structures::fx::FxIndexMap;
6use rustc_errors::codes::*;
7use rustc_errors::formatting::DiagMessageAddArg;
8use rustc_errors::{
9    Applicability, Diag, DiagCtxtHandle, DiagMessage, DiagStyledString, Diagnostic,
10    EmissionGuarantee, Level, Subdiagnostic, SuggestionStyle, msg,
11};
12use rustc_hir as hir;
13use rustc_hir::def_id::DefId;
14use rustc_hir::intravisit::VisitorExt;
15use rustc_macros::{Diagnostic, Subdiagnostic};
16use rustc_middle::ty::inhabitedness::InhabitedPredicate;
17use rustc_middle::ty::{Clause, PolyExistentialTraitRef, Ty, TyCtxt};
18use rustc_session::Session;
19use rustc_span::edition::Edition;
20use rustc_span::{Ident, Span, Symbol, sym};
21
22use crate::LateContext;
23use crate::builtin::{InitError, ShorthandAssocTyCollector, TypeAliasBounds};
24use crate::diagnostics::{OverruledAttributeSub, RequestedLevel};
25use crate::lifetime_syntax::LifetimeSyntaxCategories;
26
27// array_into_iter.rs
28#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            ShadowedIntoIterDiag where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    ShadowedIntoIterDiag {
                        target: __binding_0,
                        edition: __binding_1,
                        suggestion: __binding_2,
                        sub: __binding_3 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this method call resolves to `<&{$target} as IntoIterator>::into_iter` (due to backwards compatibility), but will resolve to `<{$target} as IntoIterator>::into_iter` in Rust {$edition}")));
                        let __code_4 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("iter"))
                                            })].into_iter();
                        ;
                        diag.arg("target", __binding_0);
                        diag.arg("edition", __binding_1);
                        diag.span_suggestions_with_style(__binding_2,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `.iter()` instead of `.into_iter()` to avoid ambiguity")),
                            __code_4, rustc_errors::Applicability::MachineApplicable,
                            rustc_errors::SuggestionStyle::ShowCode);
                        if let Some(__binding_3) = __binding_3 {
                            diag.subdiagnostic(__binding_3);
                        }
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
29#[diag(
30    "this method call resolves to `<&{$target} as IntoIterator>::into_iter` (due to backwards compatibility), but will resolve to `<{$target} as IntoIterator>::into_iter` in Rust {$edition}"
31)]
32pub(crate) struct ShadowedIntoIterDiag {
33    pub target: &'static str,
34    pub edition: &'static str,
35    #[suggestion(
36        "use `.iter()` instead of `.into_iter()` to avoid ambiguity",
37        code = "iter",
38        applicability = "machine-applicable"
39    )]
40    pub suggestion: Span,
41    #[subdiagnostic]
42    pub sub: Option<ShadowedIntoIterDiagSub>,
43}
44
45#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for ShadowedIntoIterDiagSub {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    ShadowedIntoIterDiagSub::RemoveIntoIter { span: __binding_0
                        } => {
                        let __code_5 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!(""))
                                            })].into_iter();
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("or remove `.into_iter()` to iterate by value")),
                                &sub_args);
                        diag.span_suggestions_with_style(__binding_0, __message,
                            __code_5, rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowCode);
                    }
                    ShadowedIntoIterDiagSub::UseExplicitIntoIter {
                        start_span: __binding_0, end_span: __binding_1 } => {
                        let mut suggestions = Vec::new();
                        let __code_6 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("IntoIterator::into_iter("))
                                });
                        let __code_7 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!(")"))
                                });
                        suggestions.push((__binding_0, __code_6));
                        suggestions.push((__binding_1, __code_7));
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("or use `IntoIterator::into_iter(..)` instead of `.into_iter()` to explicitly iterate by value")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowCode);
                    }
                }
            }
        }
    };Subdiagnostic)]
46pub(crate) enum ShadowedIntoIterDiagSub {
47    #[suggestion(
48        "or remove `.into_iter()` to iterate by value",
49        code = "",
50        applicability = "maybe-incorrect"
51    )]
52    RemoveIntoIter {
53        #[primary_span]
54        span: Span,
55    },
56    #[multipart_suggestion(
57        "or use `IntoIterator::into_iter(..)` instead of `.into_iter()` to explicitly iterate by value",
58        applicability = "maybe-incorrect"
59    )]
60    UseExplicitIntoIter {
61        #[suggestion_part(code = "IntoIterator::into_iter(")]
62        start_span: Span,
63        #[suggestion_part(code = ")")]
64        end_span: Span,
65    },
66}
67
68// autorefs.rs
69#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            ImplicitUnsafeAutorefsDiag<'a> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    ImplicitUnsafeAutorefsDiag {
                        raw_ptr_span: __binding_0,
                        raw_ptr_ty: __binding_1,
                        origin: __binding_2,
                        method: __binding_3,
                        suggestion: __binding_4 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("implicit autoref creates a reference to the dereference of a raw pointer")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("creating a reference requires the pointer target to be valid and imposes aliasing requirements")));
                        ;
                        diag.arg("raw_ptr_ty", __binding_1);
                        diag.span_label(__binding_0,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this raw pointer has type `{$raw_ptr_ty}`")));
                        diag.subdiagnostic(__binding_2);
                        if let Some(__binding_3) = __binding_3 {
                            diag.subdiagnostic(__binding_3);
                        }
                        diag.subdiagnostic(__binding_4);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
70#[diag("implicit autoref creates a reference to the dereference of a raw pointer")]
71#[note(
72    "creating a reference requires the pointer target to be valid and imposes aliasing requirements"
73)]
74pub(crate) struct ImplicitUnsafeAutorefsDiag<'a> {
75    #[label("this raw pointer has type `{$raw_ptr_ty}`")]
76    pub raw_ptr_span: Span,
77    pub raw_ptr_ty: Ty<'a>,
78    #[subdiagnostic]
79    pub origin: ImplicitUnsafeAutorefsOrigin<'a>,
80    #[subdiagnostic]
81    pub method: Option<ImplicitUnsafeAutorefsMethodNote>,
82    #[subdiagnostic]
83    pub suggestion: ImplicitUnsafeAutorefsSuggestion,
84}
85
86#[derive(const _: () =
    {
        impl<'a> rustc_errors::Subdiagnostic for
            ImplicitUnsafeAutorefsOrigin<'a> {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    ImplicitUnsafeAutorefsOrigin::Autoref {
                        autoref_span: __binding_0, autoref_ty: __binding_1 } => {
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        sub_args.insert("autoref_ty".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_1,
                                &mut diag.long_ty_path));
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("autoref is being applied to this expression, resulting in: `{$autoref_ty}`")),
                                &sub_args);
                        diag.span_note(__binding_0, __message);
                    }
                    ImplicitUnsafeAutorefsOrigin::OverloadedDeref => {
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("references are created through calls to explicit `Deref(Mut)::deref(_mut)` implementations")),
                                &sub_args);
                        diag.note(__message);
                    }
                }
            }
        }
    };Subdiagnostic)]
87pub(crate) enum ImplicitUnsafeAutorefsOrigin<'a> {
88    #[note("autoref is being applied to this expression, resulting in: `{$autoref_ty}`")]
89    Autoref {
90        #[primary_span]
91        autoref_span: Span,
92        autoref_ty: Ty<'a>,
93    },
94    #[note(
95        "references are created through calls to explicit `Deref(Mut)::deref(_mut)` implementations"
96    )]
97    OverloadedDeref,
98}
99
100#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for ImplicitUnsafeAutorefsMethodNote
            {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    ImplicitUnsafeAutorefsMethodNote {
                        def_span: __binding_0, method_name: __binding_1 } => {
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        sub_args.insert("method_name".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_1,
                                &mut diag.long_ty_path));
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("method calls to `{$method_name}` require a reference")),
                                &sub_args);
                        diag.span_note(__binding_0, __message);
                    }
                }
            }
        }
    };Subdiagnostic)]
101#[note("method calls to `{$method_name}` require a reference")]
102pub(crate) struct ImplicitUnsafeAutorefsMethodNote {
103    #[primary_span]
104    pub def_span: Span,
105    pub method_name: Symbol,
106}
107
108#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for ImplicitUnsafeAutorefsSuggestion
            {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    ImplicitUnsafeAutorefsSuggestion {
                        mutbl: __binding_0,
                        deref: __binding_1,
                        start_span: __binding_2,
                        end_span: __binding_3 } => {
                        let mut suggestions = Vec::new();
                        let __code_8 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("({1}{0}", __binding_1,
                                            __binding_0))
                                });
                        let __code_9 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!(")"))
                                });
                        suggestions.push((__binding_2, __code_8));
                        suggestions.push((__binding_3, __code_9));
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("try using a raw pointer method instead; or if this reference is intentional, make it explicit")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowCode);
                    }
                }
            }
        }
    };Subdiagnostic)]
109#[multipart_suggestion(
110    "try using a raw pointer method instead; or if this reference is intentional, make it explicit",
111    applicability = "maybe-incorrect"
112)]
113pub(crate) struct ImplicitUnsafeAutorefsSuggestion {
114    pub mutbl: &'static str,
115    pub deref: &'static str,
116    #[suggestion_part(code = "({mutbl}{deref}")]
117    pub start_span: Span,
118    #[suggestion_part(code = ")")]
119    pub end_span: Span,
120}
121
122// builtin.rs
123#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            BuiltinWhileTrue where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    BuiltinWhileTrue {
                        suggestion: __binding_0, replace: __binding_1 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("denote infinite loops with `loop {\"{\"} ... {\"}\"}`")));
                        let __code_10 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("{0}", __binding_1))
                                            })].into_iter();
                        ;
                        diag.span_suggestions_with_style(__binding_0,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `loop`")),
                            __code_10, rustc_errors::Applicability::MachineApplicable,
                            rustc_errors::SuggestionStyle::HideCodeInline);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
124#[diag("denote infinite loops with `loop {\"{\"} ... {\"}\"}`")]
125pub(crate) struct BuiltinWhileTrue {
126    #[suggestion(
127        "use `loop`",
128        style = "short",
129        code = "{replace}",
130        applicability = "machine-applicable"
131    )]
132    pub suggestion: Span,
133    pub replace: String,
134}
135
136#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            BuiltinNonShorthandFieldPatterns where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    BuiltinNonShorthandFieldPatterns {
                        ident: __binding_0,
                        suggestion: __binding_1,
                        prefix: __binding_2 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the `{$ident}:` in this pattern is redundant")));
                        let __code_11 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("{1}{0}", __binding_0,
                                                        __binding_2))
                                            })].into_iter();
                        ;
                        diag.arg("ident", __binding_0);
                        diag.span_suggestions_with_style(__binding_1,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use shorthand field pattern")),
                            __code_11, rustc_errors::Applicability::MachineApplicable,
                            rustc_errors::SuggestionStyle::ShowCode);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
137#[diag("the `{$ident}:` in this pattern is redundant")]
138pub(crate) struct BuiltinNonShorthandFieldPatterns {
139    pub ident: Ident,
140    #[suggestion(
141        "use shorthand field pattern",
142        code = "{prefix}{ident}",
143        applicability = "machine-applicable"
144    )]
145    pub suggestion: Span,
146    pub prefix: &'static str,
147}
148
149#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for BuiltinUnsafe
            where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    BuiltinUnsafe::AllowInternalUnsafe => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`allow_internal_unsafe` allows defining macros using unsafe without triggering the `unsafe_code` lint at their call site")));
                        ;
                        diag
                    }
                    BuiltinUnsafe::UnsafeBlock => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("usage of an `unsafe` block")));
                        ;
                        diag
                    }
                    BuiltinUnsafe::UnsafeExternBlock => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("usage of an `unsafe extern` block")));
                        ;
                        diag
                    }
                    BuiltinUnsafe::UnsafeTrait => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("declaration of an `unsafe` trait")));
                        ;
                        diag
                    }
                    BuiltinUnsafe::UnsafeImpl => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("implementation of an `unsafe` trait")));
                        ;
                        diag
                    }
                    BuiltinUnsafe::DeclUnsafeFn => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("declaration of an `unsafe` function")));
                        ;
                        diag
                    }
                    BuiltinUnsafe::DeclUnsafeMethod => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("declaration of an `unsafe` method")));
                        ;
                        diag
                    }
                    BuiltinUnsafe::ImplUnsafeMethod => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("implementation of an `unsafe` method")));
                        ;
                        diag
                    }
                    BuiltinUnsafe::GlobalAsm => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("usage of `core::arch::global_asm`")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("using this macro is unsafe even though it does not need an `unsafe` block")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
150pub(crate) enum BuiltinUnsafe {
151    #[diag(
152        "`allow_internal_unsafe` allows defining macros using unsafe without triggering the `unsafe_code` lint at their call site"
153    )]
154    AllowInternalUnsafe,
155    #[diag("usage of an `unsafe` block")]
156    UnsafeBlock,
157    #[diag("usage of an `unsafe extern` block")]
158    UnsafeExternBlock,
159    #[diag("declaration of an `unsafe` trait")]
160    UnsafeTrait,
161    #[diag("implementation of an `unsafe` trait")]
162    UnsafeImpl,
163    #[diag("declaration of an `unsafe` function")]
164    DeclUnsafeFn,
165    #[diag("declaration of an `unsafe` method")]
166    DeclUnsafeMethod,
167    #[diag("implementation of an `unsafe` method")]
168    ImplUnsafeMethod,
169    #[diag("usage of `core::arch::global_asm`")]
170    #[note("using this macro is unsafe even though it does not need an `unsafe` block")]
171    GlobalAsm,
172}
173
174#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            BuiltinMissingDoc<'a> where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    BuiltinMissingDoc { article: __binding_0, desc: __binding_1
                        } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("missing documentation for {$article} {$desc}")));
                        ;
                        diag.arg("article", __binding_0);
                        diag.arg("desc", __binding_1);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
175#[diag("missing documentation for {$article} {$desc}")]
176pub(crate) struct BuiltinMissingDoc<'a> {
177    pub article: &'a str,
178    pub desc: &'a str,
179}
180
181#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            BuiltinMissingCopyImpl where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    BuiltinMissingCopyImpl => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("type could implement `Copy`; consider adding `impl Copy`")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
182#[diag("type could implement `Copy`; consider adding `impl Copy`")]
183pub(crate) struct BuiltinMissingCopyImpl;
184
185pub(crate) struct BuiltinMissingDebugImpl<'a> {
186    pub tcx: TyCtxt<'a>,
187    pub def_id: DefId,
188}
189
190// Needed for def_path_str
191impl<'a> Diagnostic<'a, ()> for BuiltinMissingDebugImpl<'_> {
192    fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, ()> {
193        let Self { tcx, def_id } = self;
194        Diag::new(
195            dcx,
196            level,
197            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("type does not implement `{$debug}`; consider adding `#[derive(Debug)]` or a manual implementation"))msg!("type does not implement `{$debug}`; consider adding `#[derive(Debug)]` or a manual implementation"),
198        ).with_arg("debug", tcx.def_path_str(def_id))
199    }
200}
201
202#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            BuiltinAnonymousParams<'a> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    BuiltinAnonymousParams {
                        suggestion: __binding_0, ty_snip: __binding_1 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("anonymous parameters are deprecated and will be removed in the next edition")));
                        let __code_12 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("_: {0}", __binding_1))
                                            })].into_iter();
                        ;
                        diag.span_suggestions_with_style(__binding_0.0,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("try naming the parameter or explicitly ignoring it")),
                            __code_12, __binding_0.1,
                            rustc_errors::SuggestionStyle::ShowCode);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
203#[diag("anonymous parameters are deprecated and will be removed in the next edition")]
204pub(crate) struct BuiltinAnonymousParams<'a> {
205    #[suggestion("try naming the parameter or explicitly ignoring it", code = "_: {ty_snip}")]
206    pub suggestion: (Span, Applicability),
207    pub ty_snip: &'a str,
208}
209
210#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            BuiltinUnusedDocComment<'a> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    BuiltinUnusedDocComment {
                        kind: __binding_0, label: __binding_1, sub: __binding_2 } =>
                        {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("unused doc comment")));
                        ;
                        diag.arg("kind", __binding_0);
                        diag.span_label(__binding_1,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("rustdoc does not generate documentation for {$kind}")));
                        diag.subdiagnostic(__binding_2);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
211#[diag("unused doc comment")]
212pub(crate) struct BuiltinUnusedDocComment<'a> {
213    pub kind: &'a str,
214    #[label("rustdoc does not generate documentation for {$kind}")]
215    pub label: Span,
216    #[subdiagnostic]
217    pub sub: BuiltinUnusedDocCommentSub,
218}
219
220#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for BuiltinUnusedDocCommentSub {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    BuiltinUnusedDocCommentSub::PlainHelp => {
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `//` for a plain comment")),
                                &sub_args);
                        diag.help(__message);
                    }
                    BuiltinUnusedDocCommentSub::BlockHelp => {
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `/* */` for a plain comment")),
                                &sub_args);
                        diag.help(__message);
                    }
                }
            }
        }
    };Subdiagnostic)]
221pub(crate) enum BuiltinUnusedDocCommentSub {
222    #[help("use `//` for a plain comment")]
223    PlainHelp,
224    #[help("use `/* */` for a plain comment")]
225    BlockHelp,
226}
227
228#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            BuiltinNoMangleGeneric where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    BuiltinNoMangleGeneric { suggestion: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("functions generic over types or consts must be mangled")));
                        let __code_13 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!(""))
                                            })].into_iter();
                        ;
                        diag.span_suggestions_with_style(__binding_0,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("remove this attribute")),
                            __code_13, rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::HideCodeInline);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
229#[diag("functions generic over types or consts must be mangled")]
230pub(crate) struct BuiltinNoMangleGeneric {
231    // Use of `#[no_mangle]` suggests FFI intent; correct
232    // fix may be to monomorphize source by hand
233    #[suggestion(
234        "remove this attribute",
235        style = "short",
236        code = "",
237        applicability = "maybe-incorrect"
238    )]
239    pub suggestion: Span,
240}
241
242#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            BuiltinConstNoMangle where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    BuiltinConstNoMangle { suggestion: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("const items should never be `#[no_mangle]`")));
                        let __code_14 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("pub static "))
                                            })].into_iter();
                        ;
                        if let Some(__binding_0) = __binding_0 {
                            diag.span_suggestions_with_style(__binding_0,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("try a static value")),
                                __code_14, rustc_errors::Applicability::MachineApplicable,
                                rustc_errors::SuggestionStyle::ShowCode);
                        }
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
243#[diag("const items should never be `#[no_mangle]`")]
244pub(crate) struct BuiltinConstNoMangle {
245    #[suggestion("try a static value", code = "pub static ", applicability = "machine-applicable")]
246    pub suggestion: Option<Span>,
247}
248
249#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            BuiltinMutablesTransmutes where G: rustc_errors::EmissionGuarantee
            {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    BuiltinMutablesTransmutes => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("transmuting &T to &mut T is undefined behavior, even if the reference is unused, consider instead using an UnsafeCell")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
250#[diag(
251    "transmuting &T to &mut T is undefined behavior, even if the reference is unused, consider instead using an UnsafeCell"
252)]
253pub(crate) struct BuiltinMutablesTransmutes;
254
255#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            BuiltinUnstableFeatures where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    BuiltinUnstableFeatures => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use of an unstable feature")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
256#[diag("use of an unstable feature")]
257pub(crate) struct BuiltinUnstableFeatures;
258
259// lint_ungated_async_fn_track_caller
260pub(crate) struct BuiltinUngatedAsyncFnTrackCaller<'a> {
261    pub label: Span,
262    pub session: &'a Session,
263}
264
265impl<'a> Diagnostic<'a, ()> for BuiltinUngatedAsyncFnTrackCaller<'_> {
266    fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, ()> {
267        let mut diag = Diag::new(dcx, level, "`#[track_caller]` on async functions is a no-op")
268            .with_span_label(self.label, "this function will not propagate the caller location");
269        rustc_session::diagnostics::add_feature_diagnostics(
270            &mut diag,
271            self.session,
272            sym::async_fn_track_caller,
273        );
274        diag
275    }
276}
277
278#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            BuiltinUnreachablePub<'a> where G: rustc_errors::EmissionGuarantee
            {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    BuiltinUnreachablePub {
                        what: __binding_0,
                        new_vis: __binding_1,
                        suggestion: __binding_2,
                        help: __binding_3 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("unreachable `pub` {$what}")));
                        let __code_15 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("{0}", __binding_1))
                                            })].into_iter();
                        ;
                        diag.arg("what", __binding_0);
                        diag.span_suggestions_with_style(__binding_2.0,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("consider restricting its visibility")),
                            __code_15, __binding_2.1,
                            rustc_errors::SuggestionStyle::ShowCode);
                        if __binding_3 {
                            diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("or consider exporting it for use by other crates")));
                        }
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
279#[diag("unreachable `pub` {$what}")]
280pub(crate) struct BuiltinUnreachablePub<'a> {
281    pub what: &'a str,
282    pub new_vis: &'a str,
283    #[suggestion("consider restricting its visibility", code = "{new_vis}")]
284    pub suggestion: (Span, Applicability),
285    #[help("or consider exporting it for use by other crates")]
286    pub help: bool,
287}
288
289#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            MacroExprFragment2024 where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    MacroExprFragment2024 { suggestion: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the `expr` fragment specifier will accept more expressions in the 2024 edition")));
                        let __code_16 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("expr_2021"))
                                            })].into_iter();
                        ;
                        diag.span_suggestions_with_style(__binding_0,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("to keep the existing behavior, use the `expr_2021` fragment specifier")),
                            __code_16, rustc_errors::Applicability::MachineApplicable,
                            rustc_errors::SuggestionStyle::ShowCode);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
290#[diag("the `expr` fragment specifier will accept more expressions in the 2024 edition")]
291pub(crate) struct MacroExprFragment2024 {
292    #[suggestion(
293        "to keep the existing behavior, use the `expr_2021` fragment specifier",
294        code = "expr_2021",
295        applicability = "machine-applicable"
296    )]
297    pub suggestion: Span,
298}
299
300pub(crate) struct BuiltinTypeAliasBounds<'hir> {
301    pub in_where_clause: bool,
302    pub label: Span,
303    pub enable_feat_help: bool,
304    pub suggestions: Vec<(Span, String)>,
305    pub preds: &'hir [hir::WherePredicate<'hir>],
306    pub ty: Option<&'hir hir::Ty<'hir>>,
307}
308
309impl<'a> Diagnostic<'a, ()> for BuiltinTypeAliasBounds<'_> {
310    fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, ()> {
311        let mut diag = Diag::new(dcx, level, if self.in_where_clause {
312            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("where clauses on type aliases are not enforced"))msg!("where clauses on type aliases are not enforced")
313        } else {
314            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("bounds on generic parameters in type aliases are not enforced"))msg!("bounds on generic parameters in type aliases are not enforced")
315        })
316            .with_span_label(self.label, rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("will not be checked at usage sites of the type alias"))msg!("will not be checked at usage sites of the type alias"))
317            .with_note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this is a known limitation of the type checker that may be lifted in a future edition.\n                see issue #112792 <https://github.com/rust-lang/rust/issues/112792> for more information"))msg!(
318                "this is a known limitation of the type checker that may be lifted in a future edition.
319                see issue #112792 <https://github.com/rust-lang/rust/issues/112792> for more information"
320            ));
321        if self.enable_feat_help {
322            diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("add `#![feature(checked_type_aliases)]` to the crate attributes to enable the desired semantics"))msg!("add `#![feature(checked_type_aliases)]` to the crate attributes to enable the desired semantics"));
323        }
324
325        // We perform the walk in here instead of in `<TypeAliasBounds as LateLintPass>` to
326        // avoid doing throwaway work in case the lint ends up getting suppressed.
327        let mut collector = ShorthandAssocTyCollector { qselves: Vec::new() };
328        if let Some(ty) = self.ty {
329            collector.visit_ty_unambig(ty);
330        }
331
332        let affect_object_lifetime_defaults = self
333            .preds
334            .iter()
335            .filter(|pred| pred.kind.in_where_clause() == self.in_where_clause)
336            .any(|pred| TypeAliasBounds::affects_object_lifetime_defaults(pred));
337
338        // If there are any shorthand assoc tys, then the bounds can't be removed automatically.
339        // The user first needs to fully qualify the assoc tys.
340        let applicability = if !collector.qselves.is_empty() || affect_object_lifetime_defaults {
341            Applicability::MaybeIncorrect
342        } else {
343            Applicability::MachineApplicable
344        };
345
346        diag.arg("count", self.suggestions.len());
347        diag.multipart_suggestion(
348            if self.in_where_clause {
349                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("remove this where clause"))msg!("remove this where clause")
350            } else {
351                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("remove {$count ->\n                        [one] this bound\n                        *[other] these bounds\n                    }"))msg!(
352                    "remove {$count ->
353                        [one] this bound
354                        *[other] these bounds
355                    }"
356                )
357            },
358            self.suggestions,
359            applicability,
360        );
361
362        // Suggest fully qualifying paths of the form `T::Assoc` with `T` type param via
363        // `<T as /* Trait */>::Assoc` to remove their reliance on any type param bounds.
364        //
365        // Instead of attempting to figure out the necessary trait ref, just use a
366        // placeholder. Since we don't record type-dependent resolutions for non-body
367        // items like type aliases, we can't simply deduce the corresp. trait from
368        // the HIR path alone without rerunning parts of HIR ty lowering here
369        // (namely `probe_single_ty_param_bound_for_assoc_ty`) which is infeasible.
370        //
371        // (We could employ some simple heuristics but that's likely not worth it).
372        for qself in collector.qselves {
373            diag.multipart_suggestion(
374                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("fully qualify this associated type"))msg!("fully qualify this associated type"),
375                ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
        [(qself.shrink_to_lo(), "<".into()),
                (qself.shrink_to_hi(), " as /* Trait */>".into())]))vec![
376                    (qself.shrink_to_lo(), "<".into()),
377                    (qself.shrink_to_hi(), " as /* Trait */>".into()),
378                ],
379                Applicability::HasPlaceholders,
380            );
381        }
382        diag
383    }
384}
385
386#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            BuiltinTrivialBounds<'a> where G: rustc_errors::EmissionGuarantee
            {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    BuiltinTrivialBounds {
                        predicate_kind_name: __binding_0, predicate: __binding_1 }
                        => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("{$predicate_kind_name} bound {$predicate} does not depend on any type or lifetime parameters")));
                        ;
                        diag.arg("predicate_kind_name", __binding_0);
                        diag.arg("predicate", __binding_1);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
387#[diag(
388    "{$predicate_kind_name} bound {$predicate} does not depend on any type or lifetime parameters"
389)]
390pub(crate) struct BuiltinTrivialBounds<'a> {
391    pub predicate_kind_name: &'a str,
392    pub predicate: Clause<'a>,
393}
394
395#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            BuiltinDoubleNegations where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    BuiltinDoubleNegations { add_parens: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use of a double negation")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the prefix `--` could be misinterpreted as a decrement operator which exists in other languages")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `-= 1` if you meant to decrement the value")));
                        ;
                        diag.subdiagnostic(__binding_0);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
396#[diag("use of a double negation")]
397#[note(
398    "the prefix `--` could be misinterpreted as a decrement operator which exists in other languages"
399)]
400#[note("use `-= 1` if you meant to decrement the value")]
401pub(crate) struct BuiltinDoubleNegations {
402    #[subdiagnostic]
403    pub add_parens: BuiltinDoubleNegationsAddParens,
404}
405
406#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for BuiltinDoubleNegationsAddParens {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    BuiltinDoubleNegationsAddParens {
                        start_span: __binding_0, end_span: __binding_1 } => {
                        let mut suggestions = Vec::new();
                        let __code_17 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("("))
                                });
                        let __code_18 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!(")"))
                                });
                        suggestions.push((__binding_0, __code_17));
                        suggestions.push((__binding_1, __code_18));
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("add parentheses for clarity")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowCode);
                    }
                }
            }
        }
    };Subdiagnostic)]
407#[multipart_suggestion("add parentheses for clarity", applicability = "maybe-incorrect")]
408pub(crate) struct BuiltinDoubleNegationsAddParens {
409    #[suggestion_part(code = "(")]
410    pub start_span: Span,
411    #[suggestion_part(code = ")")]
412    pub end_span: Span,
413}
414
415#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            BuiltinEllipsisInclusiveRangePatternsLint where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    BuiltinEllipsisInclusiveRangePatternsLint::Parenthesise {
                        suggestion: __binding_0, replace: __binding_1 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`...` range patterns are deprecated")));
                        let __code_19 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("{0}", __binding_1))
                                            })].into_iter();
                        ;
                        diag.span_suggestions_with_style(__binding_0,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `..=` for an inclusive range")),
                            __code_19, rustc_errors::Applicability::MachineApplicable,
                            rustc_errors::SuggestionStyle::ShowCode);
                        diag
                    }
                    BuiltinEllipsisInclusiveRangePatternsLint::NonParenthesise {
                        suggestion: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`...` range patterns are deprecated")));
                        let __code_20 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("..="))
                                            })].into_iter();
                        ;
                        diag.span_suggestions_with_style(__binding_0,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `..=` for an inclusive range")),
                            __code_20, rustc_errors::Applicability::MachineApplicable,
                            rustc_errors::SuggestionStyle::HideCodeInline);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
416pub(crate) enum BuiltinEllipsisInclusiveRangePatternsLint {
417    #[diag("`...` range patterns are deprecated")]
418    Parenthesise {
419        #[suggestion(
420            "use `..=` for an inclusive range",
421            code = "{replace}",
422            applicability = "machine-applicable"
423        )]
424        suggestion: Span,
425        replace: String,
426    },
427    #[diag("`...` range patterns are deprecated")]
428    NonParenthesise {
429        #[suggestion(
430            "use `..=` for an inclusive range",
431            style = "short",
432            code = "..=",
433            applicability = "machine-applicable"
434        )]
435        suggestion: Span,
436    },
437}
438
439#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            BuiltinKeywordIdents where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    BuiltinKeywordIdents {
                        kw: __binding_0,
                        next: __binding_1,
                        suggestion: __binding_2,
                        prefix: __binding_3 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`{$kw}` is a keyword in the {$next} edition")));
                        let __code_21 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("{1}r#{0}", __binding_0,
                                                        __binding_3))
                                            })].into_iter();
                        ;
                        diag.arg("kw", __binding_0);
                        diag.arg("next", __binding_1);
                        diag.span_suggestions_with_style(__binding_2,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("you can use a raw identifier to stay compatible")),
                            __code_21, rustc_errors::Applicability::MachineApplicable,
                            rustc_errors::SuggestionStyle::ShowCode);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
440#[diag("`{$kw}` is a keyword in the {$next} edition")]
441pub(crate) struct BuiltinKeywordIdents {
442    pub kw: Ident,
443    pub next: Edition,
444    #[suggestion(
445        "you can use a raw identifier to stay compatible",
446        code = "{prefix}r#{kw}",
447        applicability = "machine-applicable"
448    )]
449    pub suggestion: Span,
450    pub prefix: &'static str,
451}
452
453#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            BuiltinExplicitOutlives where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    BuiltinExplicitOutlives { suggestion: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("outlives requirements can be inferred")));
                        ;
                        diag.subdiagnostic(__binding_0);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
454#[diag("outlives requirements can be inferred")]
455pub(crate) struct BuiltinExplicitOutlives {
456    #[subdiagnostic]
457    pub suggestion: BuiltinExplicitOutlivesSuggestion,
458}
459
460#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for BuiltinExplicitOutlivesSuggestion
            {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    BuiltinExplicitOutlivesSuggestion {
                        spans: __binding_0,
                        applicability: __binding_1,
                        count: __binding_2 } => {
                        let mut suggestions = Vec::new();
                        let __code_22 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!(""))
                                });
                        for __binding_0 in __binding_0 {
                            suggestions.push((__binding_0, __code_22.clone()));
                        }
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        sub_args.insert("count".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_2,
                                &mut diag.long_ty_path));
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("remove {$count ->\n        [one] this bound\n        *[other] these bounds\n    }")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            __binding_1, rustc_errors::SuggestionStyle::ShowCode);
                    }
                }
            }
        }
    };Subdiagnostic)]
461#[multipart_suggestion(
462    "remove {$count ->
463        [one] this bound
464        *[other] these bounds
465    }"
466)]
467pub(crate) struct BuiltinExplicitOutlivesSuggestion {
468    #[suggestion_part(code = "")]
469    pub spans: Vec<Span>,
470    #[applicability]
471    pub applicability: Applicability,
472    pub count: usize,
473}
474
475#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            BuiltinIncompleteFeatures where G: rustc_errors::EmissionGuarantee
            {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    BuiltinIncompleteFeatures {
                        name: __binding_0, note: __binding_1, help: __binding_2 } =>
                        {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the feature `{$name}` is incomplete and may not be safe to use and/or cause compiler crashes")));
                        ;
                        diag.arg("name", __binding_0);
                        if let Some(__binding_1) = __binding_1 {
                            diag.subdiagnostic(__binding_1);
                        }
                        if let Some(__binding_2) = __binding_2 {
                            diag.subdiagnostic(__binding_2);
                        }
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
476#[diag(
477    "the feature `{$name}` is incomplete and may not be safe to use and/or cause compiler crashes"
478)]
479pub(crate) struct BuiltinIncompleteFeatures {
480    pub name: Symbol,
481    #[subdiagnostic]
482    pub note: Option<BuiltinFeatureIssueNote>,
483    #[subdiagnostic]
484    pub help: Option<BuiltinIncompleteFeaturesHelp>,
485}
486
487#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            BuiltinInternalFeatures where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    BuiltinInternalFeatures { name: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the feature `{$name}` is internal to the compiler or standard library")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("using it is strongly discouraged")));
                        ;
                        diag.arg("name", __binding_0);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
488#[diag("the feature `{$name}` is internal to the compiler or standard library")]
489#[note("using it is strongly discouraged")]
490pub(crate) struct BuiltinInternalFeatures {
491    pub name: Symbol,
492}
493
494#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for BuiltinIncompleteFeaturesHelp {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    BuiltinIncompleteFeaturesHelp { name: __binding_0 } => {
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        sub_args.insert("name".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_0,
                                &mut diag.long_ty_path));
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("consider using `min_{$name}` instead, which is more stable and complete")),
                                &sub_args);
                        diag.help(__message);
                    }
                }
            }
        }
    };Subdiagnostic)]
495#[help("consider using `min_{$name}` instead, which is more stable and complete")]
496pub(crate) struct BuiltinIncompleteFeaturesHelp {
497    pub name: Symbol,
498}
499
500#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for BuiltinFeatureIssueNote {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    BuiltinFeatureIssueNote { n: __binding_0 } => {
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        sub_args.insert("n".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_0,
                                &mut diag.long_ty_path));
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("see issue #{$n} <https://github.com/rust-lang/rust/issues/{$n}> for more information")),
                                &sub_args);
                        diag.note(__message);
                    }
                }
            }
        }
    };Subdiagnostic)]
501#[note("see issue #{$n} <https://github.com/rust-lang/rust/issues/{$n}> for more information")]
502pub(crate) struct BuiltinFeatureIssueNote {
503    pub n: NonZero<u32>,
504}
505
506pub(crate) struct BuiltinUnpermittedTypeInit<'a> {
507    pub msg: DiagMessage,
508    pub ty: Ty<'a>,
509    pub label: Span,
510    pub sub: BuiltinUnpermittedTypeInitSub,
511    pub tcx: TyCtxt<'a>,
512}
513
514impl<'a> Diagnostic<'a, ()> for BuiltinUnpermittedTypeInit<'_> {
515    fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, ()> {
516        let mut diag = Diag::new(dcx, level, self.msg)
517            .with_arg("ty", self.ty)
518            .with_span_label(self.label, rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this code causes undefined behavior when executed"))msg!("this code causes undefined behavior when executed"));
519        if let InhabitedPredicate::True = self.ty.inhabited_predicate(self.tcx) {
520            // Only suggest late `MaybeUninit::assume_init` initialization if the type is inhabited.
521            diag.span_label(
522                self.label,
523                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done"))msg!("help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done"),
524            );
525        }
526        self.sub.add_to_diag(&mut diag);
527        diag
528    }
529}
530
531// FIXME(davidtwco): make translatable
532pub(crate) struct BuiltinUnpermittedTypeInitSub {
533    pub err: InitError,
534}
535
536impl Subdiagnostic for BuiltinUnpermittedTypeInitSub {
537    fn add_to_diag<G: EmissionGuarantee>(self, diag: &mut Diag<'_, G>) {
538        let mut err = self.err;
539        loop {
540            if let Some(span) = err.span {
541                diag.span_note(span, err.message);
542            } else {
543                diag.note(err.message);
544            }
545            if let Some(e) = err.nested {
546                err = *e;
547            } else {
548                break;
549            }
550        }
551    }
552}
553
554#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            BuiltinClashingExtern<'a> where G: rustc_errors::EmissionGuarantee
            {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    BuiltinClashingExtern::SameName {
                        this: __binding_0,
                        orig: __binding_1,
                        previous_decl_label: __binding_2,
                        mismatch_label: __binding_3,
                        sub: __binding_4 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`{$this}` redeclared with a different signature")));
                        ;
                        diag.arg("this", __binding_0);
                        diag.arg("orig", __binding_1);
                        diag.span_label(__binding_2,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`{$orig}` previously declared here")));
                        diag.span_label(__binding_3,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this signature doesn't match the previous declaration")));
                        diag.subdiagnostic(__binding_4);
                        diag
                    }
                    BuiltinClashingExtern::DiffName {
                        this: __binding_0,
                        orig: __binding_1,
                        previous_decl_label: __binding_2,
                        mismatch_label: __binding_3,
                        sub: __binding_4 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`{$this}` redeclares `{$orig}` with a different signature")));
                        ;
                        diag.arg("this", __binding_0);
                        diag.arg("orig", __binding_1);
                        diag.span_label(__binding_2,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`{$orig}` previously declared here")));
                        diag.span_label(__binding_3,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this signature doesn't match the previous declaration")));
                        diag.subdiagnostic(__binding_4);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
555pub(crate) enum BuiltinClashingExtern<'a> {
556    #[diag("`{$this}` redeclared with a different signature")]
557    SameName {
558        this: Symbol,
559        orig: Symbol,
560        #[label("`{$orig}` previously declared here")]
561        previous_decl_label: Span,
562        #[label("this signature doesn't match the previous declaration")]
563        mismatch_label: Span,
564        #[subdiagnostic]
565        sub: BuiltinClashingExternSub<'a>,
566    },
567    #[diag("`{$this}` redeclares `{$orig}` with a different signature")]
568    DiffName {
569        this: Symbol,
570        orig: Symbol,
571        #[label("`{$orig}` previously declared here")]
572        previous_decl_label: Span,
573        #[label("this signature doesn't match the previous declaration")]
574        mismatch_label: Span,
575        #[subdiagnostic]
576        sub: BuiltinClashingExternSub<'a>,
577    },
578}
579
580// FIXME(davidtwco): translatable expected/found
581pub(crate) struct BuiltinClashingExternSub<'a> {
582    pub tcx: TyCtxt<'a>,
583    pub expected: Ty<'a>,
584    pub found: Ty<'a>,
585}
586
587impl Subdiagnostic for BuiltinClashingExternSub<'_> {
588    fn add_to_diag<G: EmissionGuarantee>(self, diag: &mut Diag<'_, G>) {
589        let mut expected_str = DiagStyledString::new();
590        expected_str.push(self.expected.fn_sig(self.tcx).to_string(), false);
591        let mut found_str = DiagStyledString::new();
592        found_str.push(self.found.fn_sig(self.tcx).to_string(), true);
593        diag.note_expected_found("", expected_str, "", found_str);
594    }
595}
596
597#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            BuiltinDerefNullptr where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    BuiltinDerefNullptr { label: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("dereferencing a null pointer")));
                        ;
                        diag.span_label(__binding_0,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this code causes undefined behavior when executed")));
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
598#[diag("dereferencing a null pointer")]
599pub(crate) struct BuiltinDerefNullptr {
600    #[label("this code causes undefined behavior when executed")]
601    pub label: Span,
602}
603
604#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            BuiltinSpecialModuleNameUsed where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    BuiltinSpecialModuleNameUsed::Lib => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("found module declaration for lib.rs")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("lib.rs is the root of this crate's library target")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("to refer to it from other targets, use the library's name as the path")));
                        ;
                        diag
                    }
                    BuiltinSpecialModuleNameUsed::Main => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("found module declaration for main.rs")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("a binary crate cannot be used as library")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
605pub(crate) enum BuiltinSpecialModuleNameUsed {
606    #[diag("found module declaration for lib.rs")]
607    #[note("lib.rs is the root of this crate's library target")]
608    #[help("to refer to it from other targets, use the library's name as the path")]
609    Lib,
610    #[diag("found module declaration for main.rs")]
611    #[note("a binary crate cannot be used as library")]
612    Main,
613}
614
615// c_void_return.rs
616#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for CVoidReturn
            where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    CVoidReturn { suggestion: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`c_void` should not be used as a return type")));
                        let __code_23 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!(""))
                                            })].into_iter();
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("returning `()` in Rust is equivalent to returning `void` in C")));
                        ;
                        diag.span_suggestions_with_style(__binding_0,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("remove the return type to implicitly return `()`")),
                            __code_23, rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowCode);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
617#[diag("`c_void` should not be used as a return type")]
618#[help("returning `()` in Rust is equivalent to returning `void` in C")]
619pub(crate) struct CVoidReturn {
620    #[suggestion(
621        "remove the return type to implicitly return `()`",
622        code = "",
623        applicability = "maybe-incorrect"
624    )]
625    pub suggestion: Span,
626}
627
628// c_void_return.rs
629#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            ExternCVoidReturn where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    ExternCVoidReturn { suggestion: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("declarations returning `c_void` are not compatible with C functions returning `void`")));
                        let __code_24 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!(""))
                                            })].into_iter();
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("returning `()` in Rust is equivalent to returning `void` in C")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`c_void` is only used through raw pointers for compatibility with `void` pointers")));
                        ;
                        diag.span_suggestions_with_style(__binding_0,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("remove the return type to implicitly return `()`")),
                            __code_24, rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowCode);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
630#[diag("declarations returning `c_void` are not compatible with C functions returning `void`")]
631#[help("returning `()` in Rust is equivalent to returning `void` in C")]
632#[note("`c_void` is only used through raw pointers for compatibility with `void` pointers")]
633pub(crate) struct ExternCVoidReturn {
634    #[suggestion(
635        "remove the return type to implicitly return `()`",
636        code = "",
637        applicability = "maybe-incorrect"
638    )]
639    pub suggestion: Span,
640}
641
642// deref_into_dyn_supertrait.rs
643#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            SupertraitAsDerefTarget<'a> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    SupertraitAsDerefTarget {
                        self_ty: __binding_0,
                        supertrait_principal: __binding_1,
                        target_principal: __binding_2,
                        label: __binding_3,
                        label2: __binding_4 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this `Deref` implementation is covered by an implicit supertrait coercion")));
                        ;
                        diag.arg("self_ty", __binding_0);
                        diag.arg("supertrait_principal", __binding_1);
                        diag.arg("target_principal", __binding_2);
                        diag.span_label(__binding_3,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`{$self_ty}` implements `Deref<Target = dyn {$target_principal}>` which conflicts with supertrait `{$supertrait_principal}`")));
                        if let Some(__binding_4) = __binding_4 {
                            diag.subdiagnostic(__binding_4);
                        }
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
644#[diag("this `Deref` implementation is covered by an implicit supertrait coercion")]
645pub(crate) struct SupertraitAsDerefTarget<'a> {
646    pub self_ty: Ty<'a>,
647    pub supertrait_principal: PolyExistentialTraitRef<'a>,
648    pub target_principal: PolyExistentialTraitRef<'a>,
649    #[label(
650        "`{$self_ty}` implements `Deref<Target = dyn {$target_principal}>` which conflicts with supertrait `{$supertrait_principal}`"
651    )]
652    pub label: Span,
653    #[subdiagnostic]
654    pub label2: Option<SupertraitAsDerefTargetLabel<'a>>,
655}
656
657#[derive(const _: () =
    {
        impl<'a> rustc_errors::Subdiagnostic for
            SupertraitAsDerefTargetLabel<'a> {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    SupertraitAsDerefTargetLabel {
                        label: __binding_0, self_ty: __binding_1 } => {
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        sub_args.insert("self_ty".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_1,
                                &mut diag.long_ty_path));
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("target type is a supertrait of `{$self_ty}`")),
                                &sub_args);
                        diag.span_label(__binding_0, __message);
                    }
                }
            }
        }
    };Subdiagnostic)]
658#[label("target type is a supertrait of `{$self_ty}`")]
659pub(crate) struct SupertraitAsDerefTargetLabel<'a> {
660    #[primary_span]
661    pub label: Span,
662    pub self_ty: Ty<'a>,
663}
664
665// enum_intrinsics_non_enums.rs
666#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            EnumIntrinsicsMemDiscriminate<'a> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    EnumIntrinsicsMemDiscriminate {
                        ty_param: __binding_0, note: __binding_1 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the return value of `mem::discriminant` is unspecified when called with a non-enum type")));
                        ;
                        diag.arg("ty_param", __binding_0);
                        diag.span_note(__binding_1,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the argument to `discriminant` should be a reference to an enum, but it was passed a reference to a `{$ty_param}`, which is not an enum")));
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
667#[diag("the return value of `mem::discriminant` is unspecified when called with a non-enum type")]
668pub(crate) struct EnumIntrinsicsMemDiscriminate<'a> {
669    pub ty_param: Ty<'a>,
670    #[note(
671        "the argument to `discriminant` should be a reference to an enum, but it was passed a reference to a `{$ty_param}`, which is not an enum"
672    )]
673    pub note: Span,
674}
675
676#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            EnumIntrinsicsMemVariant<'a> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    EnumIntrinsicsMemVariant { ty_param: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the return value of `mem::variant_count` is unspecified when called with a non-enum type")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the type parameter of `variant_count` should be an enum, but it was instantiated with the type `{$ty_param}`, which is not an enum")));
                        ;
                        diag.arg("ty_param", __binding_0);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
677#[diag("the return value of `mem::variant_count` is unspecified when called with a non-enum type")]
678#[note(
679    "the type parameter of `variant_count` should be an enum, but it was instantiated with the type `{$ty_param}`, which is not an enum"
680)]
681pub(crate) struct EnumIntrinsicsMemVariant<'a> {
682    pub ty_param: Ty<'a>,
683}
684
685// expect.rs
686#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for Expectation
            where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    Expectation { rationale: __binding_0, note: __binding_1 } =>
                        {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this lint expectation is unfulfilled")));
                        ;
                        if let Some(__binding_0) = __binding_0 {
                            diag.subdiagnostic(__binding_0);
                        }
                        if __binding_1 {
                            diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the `unfulfilled_lint_expectations` lint can't be expected and will always produce this message")));
                        }
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
687#[diag("this lint expectation is unfulfilled")]
688pub(crate) struct Expectation {
689    #[subdiagnostic]
690    pub rationale: Option<ExpectationNote>,
691    #[note(
692        "the `unfulfilled_lint_expectations` lint can't be expected and will always produce this message"
693    )]
694    pub note: bool,
695}
696
697#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for ExpectationNote {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    ExpectationNote { rationale: __binding_0 } => {
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        sub_args.insert("rationale".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_0,
                                &mut diag.long_ty_path));
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("{$rationale}")),
                                &sub_args);
                        diag.note(__message);
                    }
                }
            }
        }
    };Subdiagnostic)]
698#[note("{$rationale}")]
699pub(crate) struct ExpectationNote {
700    pub rationale: Symbol,
701}
702
703// ptr_nulls.rs
704#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            UselessPtrNullChecksDiag<'a> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    UselessPtrNullChecksDiag::FnPtr {
                        orig_ty: __binding_0, label: __binding_1 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("function pointers are not nullable, so checking them for null will always return false")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("wrap the function pointer inside an `Option` and use `Option::is_none` to check for null pointer value")));
                        ;
                        diag.arg("orig_ty", __binding_0);
                        diag.span_label(__binding_1,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("expression has type `{$orig_ty}`")));
                        diag
                    }
                    UselessPtrNullChecksDiag::Ref {
                        orig_ty: __binding_0, label: __binding_1 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("references are not nullable, so checking them for null will always return false")));
                        ;
                        diag.arg("orig_ty", __binding_0);
                        diag.span_label(__binding_1,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("expression has type `{$orig_ty}`")));
                        diag
                    }
                    UselessPtrNullChecksDiag::FnRet { fn_name: __binding_0 } =>
                        {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("returned pointer of `{$fn_name}` call is never null, so checking it for null will always return false")));
                        ;
                        diag.arg("fn_name", __binding_0);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
705pub(crate) enum UselessPtrNullChecksDiag<'a> {
706    #[diag(
707        "function pointers are not nullable, so checking them for null will always return false"
708    )]
709    #[help(
710        "wrap the function pointer inside an `Option` and use `Option::is_none` to check for null pointer value"
711    )]
712    FnPtr {
713        orig_ty: Ty<'a>,
714        #[label("expression has type `{$orig_ty}`")]
715        label: Span,
716    },
717    #[diag("references are not nullable, so checking them for null will always return false")]
718    Ref {
719        orig_ty: Ty<'a>,
720        #[label("expression has type `{$orig_ty}`")]
721        label: Span,
722    },
723    #[diag(
724        "returned pointer of `{$fn_name}` call is never null, so checking it for null will always return false"
725    )]
726    FnRet { fn_name: Ident },
727}
728
729#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            InvalidNullArgumentsDiag where G: rustc_errors::EmissionGuarantee
            {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    InvalidNullArgumentsDiag::NullPtrInline {
                        null_span: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("calling this function with a null pointer is undefined behavior, even if the result of the function is unused")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("for more information, visit <https://doc.rust-lang.org/std/ptr/index.html> and <https://doc.rust-lang.org/reference/behavior-considered-undefined.html>")));
                        ;
                        diag.span_label(__binding_0,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("null pointer originates from here")));
                        diag
                    }
                    InvalidNullArgumentsDiag::NullPtrThroughBinding {
                        null_span: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("calling this function with a null pointer is undefined behavior, even if the result of the function is unused")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("for more information, visit <https://doc.rust-lang.org/std/ptr/index.html> and <https://doc.rust-lang.org/reference/behavior-considered-undefined.html>")));
                        ;
                        diag.span_note(__binding_0,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("null pointer originates from here")));
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
730pub(crate) enum InvalidNullArgumentsDiag {
731    #[diag(
732        "calling this function with a null pointer is undefined behavior, even if the result of the function is unused"
733    )]
734    #[help(
735        "for more information, visit <https://doc.rust-lang.org/std/ptr/index.html> and <https://doc.rust-lang.org/reference/behavior-considered-undefined.html>"
736    )]
737    NullPtrInline {
738        #[label("null pointer originates from here")]
739        null_span: Span,
740    },
741    #[diag(
742        "calling this function with a null pointer is undefined behavior, even if the result of the function is unused"
743    )]
744    #[help(
745        "for more information, visit <https://doc.rust-lang.org/std/ptr/index.html> and <https://doc.rust-lang.org/reference/behavior-considered-undefined.html>"
746    )]
747    NullPtrThroughBinding {
748        #[note("null pointer originates from here")]
749        null_span: Span,
750    },
751}
752
753// for_loops_over_fallibles.rs
754#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            ForLoopsOverFalliblesDiag<'a> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    ForLoopsOverFalliblesDiag {
                        article: __binding_0,
                        ref_prefix: __binding_1,
                        ty: __binding_2,
                        sub: __binding_3,
                        question_mark: __binding_4,
                        suggestion: __binding_5 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("for loop over {$article} `{$ref_prefix}{$ty}`. This is more readably written as an `if let` statement")));
                        ;
                        diag.arg("article", __binding_0);
                        diag.arg("ref_prefix", __binding_1);
                        diag.arg("ty", __binding_2);
                        diag.subdiagnostic(__binding_3);
                        if let Some(__binding_4) = __binding_4 {
                            diag.subdiagnostic(__binding_4);
                        }
                        diag.subdiagnostic(__binding_5);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
755#[diag(
756    "for loop over {$article} `{$ref_prefix}{$ty}`. This is more readably written as an `if let` statement"
757)]
758pub(crate) struct ForLoopsOverFalliblesDiag<'a> {
759    pub article: &'static str,
760    pub ref_prefix: &'static str,
761    pub ty: &'static str,
762    #[subdiagnostic]
763    pub sub: ForLoopsOverFalliblesLoopSub<'a>,
764    #[subdiagnostic]
765    pub question_mark: Option<ForLoopsOverFalliblesQuestionMark>,
766    #[subdiagnostic]
767    pub suggestion: ForLoopsOverFalliblesSuggestion<'a>,
768}
769
770#[derive(const _: () =
    {
        impl<'a> rustc_errors::Subdiagnostic for
            ForLoopsOverFalliblesLoopSub<'a> {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    ForLoopsOverFalliblesLoopSub::RemoveNext {
                        suggestion: __binding_0, recv_snip: __binding_1 } => {
                        let __code_25 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!(".by_ref()"))
                                            })].into_iter();
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        sub_args.insert("recv_snip".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_1,
                                &mut diag.long_ty_path));
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("to iterate over `{$recv_snip}` remove the call to `next`")),
                                &sub_args);
                        diag.span_suggestions_with_style(__binding_0, __message,
                            __code_25, rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowCode);
                    }
                    ForLoopsOverFalliblesLoopSub::UseWhileLet {
                        start_span: __binding_0,
                        end_span: __binding_1,
                        var: __binding_2 } => {
                        let mut suggestions = Vec::new();
                        let __code_26 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("while let {0}(",
                                            __binding_2))
                                });
                        let __code_27 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!(") = "))
                                });
                        suggestions.push((__binding_0, __code_26));
                        suggestions.push((__binding_1, __code_27));
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("to check pattern in a loop use `while let`")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowCode);
                    }
                }
            }
        }
    };Subdiagnostic)]
771pub(crate) enum ForLoopsOverFalliblesLoopSub<'a> {
772    #[suggestion(
773        "to iterate over `{$recv_snip}` remove the call to `next`",
774        code = ".by_ref()",
775        applicability = "maybe-incorrect"
776    )]
777    RemoveNext {
778        #[primary_span]
779        suggestion: Span,
780        recv_snip: String,
781    },
782    #[multipart_suggestion(
783        "to check pattern in a loop use `while let`",
784        applicability = "maybe-incorrect"
785    )]
786    UseWhileLet {
787        #[suggestion_part(code = "while let {var}(")]
788        start_span: Span,
789        #[suggestion_part(code = ") = ")]
790        end_span: Span,
791        var: &'a str,
792    },
793}
794
795#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for ForLoopsOverFalliblesQuestionMark
            {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    ForLoopsOverFalliblesQuestionMark { suggestion: __binding_0
                        } => {
                        let __code_28 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("?"))
                                            })].into_iter();
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("consider unwrapping the `Result` with `?` to iterate over its contents")),
                                &sub_args);
                        diag.span_suggestions_with_style(__binding_0, __message,
                            __code_28, rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowCode);
                    }
                }
            }
        }
    };Subdiagnostic)]
796#[suggestion(
797    "consider unwrapping the `Result` with `?` to iterate over its contents",
798    code = "?",
799    applicability = "maybe-incorrect"
800)]
801pub(crate) struct ForLoopsOverFalliblesQuestionMark {
802    #[primary_span]
803    pub suggestion: Span,
804}
805
806#[derive(const _: () =
    {
        impl<'a> rustc_errors::Subdiagnostic for
            ForLoopsOverFalliblesSuggestion<'a> {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    ForLoopsOverFalliblesSuggestion {
                        var: __binding_0,
                        start_span: __binding_1,
                        end_span: __binding_2 } => {
                        let mut suggestions = Vec::new();
                        let __code_29 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("if let {0}(",
                                            __binding_0))
                                });
                        let __code_30 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!(") = "))
                                });
                        suggestions.push((__binding_1, __code_29));
                        suggestions.push((__binding_2, __code_30));
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("consider using `if let` to clear intent")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowCode);
                    }
                }
            }
        }
    };Subdiagnostic)]
807#[multipart_suggestion(
808    "consider using `if let` to clear intent",
809    applicability = "maybe-incorrect"
810)]
811pub(crate) struct ForLoopsOverFalliblesSuggestion<'a> {
812    pub var: &'a str,
813    #[suggestion_part(code = "if let {var}(")]
814    pub start_span: Span,
815    #[suggestion_part(code = ") = ")]
816    pub end_span: Span,
817}
818
819#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for UseLetUnderscoreIgnoreSuggestion
            {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    UseLetUnderscoreIgnoreSuggestion::Note => {
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `let _ = ...` to ignore the expression or result")),
                                &sub_args);
                        diag.note(__message);
                    }
                    UseLetUnderscoreIgnoreSuggestion::Suggestion {
                        start_span: __binding_0, end_span: __binding_1 } => {
                        let mut suggestions = Vec::new();
                        let __code_31 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("let _ = "))
                                });
                        let __code_32 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!(""))
                                });
                        suggestions.push((__binding_0, __code_31));
                        suggestions.push((__binding_1, __code_32));
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `let _ = ...` to ignore the expression or result")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowAlways);
                    }
                }
            }
        }
    };Subdiagnostic)]
820pub(crate) enum UseLetUnderscoreIgnoreSuggestion {
821    #[note("use `let _ = ...` to ignore the expression or result")]
822    Note,
823    #[multipart_suggestion(
824        "use `let _ = ...` to ignore the expression or result",
825        style = "verbose",
826        applicability = "maybe-incorrect"
827    )]
828    Suggestion {
829        #[suggestion_part(code = "let _ = ")]
830        start_span: Span,
831        #[suggestion_part(code = "")]
832        end_span: Span,
833    },
834}
835
836// runtime_symbols.rs
837#[derive(const _: () =
    {
        impl<'_sess, 'tcx, G> rustc_errors::Diagnostic<'_sess, G> for
            RedefiningRuntimeSymbolsDiag<'tcx> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    RedefiningRuntimeSymbolsDiag::Invalid {
                        symbol_name: __binding_0,
                        expected_fn_sig: __binding_1,
                        found_fn_sig: __binding_2 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("invalid definition of the runtime `{$symbol_name}` symbol used by the standard library")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("expected `{$expected_fn_sig}`\n    found    `{$found_fn_sig}`")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("either fix the signature or remove any attributes like `#[unsafe(no_mangle)]`, `#[unsafe(export_name = \"{$symbol_name}\")]`, or `#[link_name = \"{$symbol_name}\"]`")));
                        ;
                        diag.arg("symbol_name", __binding_0);
                        diag.arg("expected_fn_sig", __binding_1);
                        diag.arg("found_fn_sig", __binding_2);
                        diag
                    }
                    RedefiningRuntimeSymbolsDiag::Suspicious {
                        symbol_name: __binding_0,
                        expected_fn_sig: __binding_1,
                        found_fn_sig: __binding_2 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("suspicious definition of the runtime `{$symbol_name}` symbol used by the standard library")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("expected `{$expected_fn_sig}`\n    found    `{$found_fn_sig}`")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("either fix the signature or remove any attributes like `#[unsafe(no_mangle)]`, `#[unsafe(export_name = \"{$symbol_name}\")]`, or `#[link_name = \"{$symbol_name}\"]`")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("allow this lint if the signature is compatible")));
                        ;
                        diag.arg("symbol_name", __binding_0);
                        diag.arg("expected_fn_sig", __binding_1);
                        diag.arg("found_fn_sig", __binding_2);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
838pub(crate) enum RedefiningRuntimeSymbolsDiag<'tcx> {
839    #[diag(
840        "invalid definition of the runtime `{$symbol_name}` symbol used by the standard library"
841    )]
842    #[note(
843        "expected `{$expected_fn_sig}`
844    found    `{$found_fn_sig}`"
845    )]
846    #[help(
847        "either fix the signature or remove any attributes like `#[unsafe(no_mangle)]`, `#[unsafe(export_name = \"{$symbol_name}\")]`, or `#[link_name = \"{$symbol_name}\"]`"
848    )]
849    Invalid { symbol_name: String, expected_fn_sig: Ty<'tcx>, found_fn_sig: Ty<'tcx> },
850    #[diag(
851        "suspicious definition of the runtime `{$symbol_name}` symbol used by the standard library"
852    )]
853    #[note(
854        "expected `{$expected_fn_sig}`
855    found    `{$found_fn_sig}`"
856    )]
857    #[help(
858        "either fix the signature or remove any attributes like `#[unsafe(no_mangle)]`, `#[unsafe(export_name = \"{$symbol_name}\")]`, or `#[link_name = \"{$symbol_name}\"]`"
859    )]
860    #[help("allow this lint if the signature is compatible")]
861    Suspicious { symbol_name: String, expected_fn_sig: Ty<'tcx>, found_fn_sig: Ty<'tcx> },
862}
863
864// drop_forget_useless.rs
865#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            DropRefDiag<'a> where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    DropRefDiag {
                        arg_ty: __binding_0, label: __binding_1, sugg: __binding_2 }
                        => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("calls to `std::mem::drop` with a reference instead of an owned value does nothing")));
                        ;
                        diag.arg("arg_ty", __binding_0);
                        diag.span_label(__binding_1,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("argument has type `{$arg_ty}`")));
                        diag.subdiagnostic(__binding_2);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
866#[diag("calls to `std::mem::drop` with a reference instead of an owned value does nothing")]
867pub(crate) struct DropRefDiag<'a> {
868    pub arg_ty: Ty<'a>,
869    #[label("argument has type `{$arg_ty}`")]
870    pub label: Span,
871    #[subdiagnostic]
872    pub sugg: UseLetUnderscoreIgnoreSuggestion,
873}
874
875#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            DropCopyDiag<'a> where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    DropCopyDiag {
                        arg_ty: __binding_0, label: __binding_1, sugg: __binding_2 }
                        => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("calls to `std::mem::drop` with a value that implements `Copy` does nothing")));
                        ;
                        diag.arg("arg_ty", __binding_0);
                        diag.span_label(__binding_1,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("argument has type `{$arg_ty}`")));
                        diag.subdiagnostic(__binding_2);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
876#[diag("calls to `std::mem::drop` with a value that implements `Copy` does nothing")]
877pub(crate) struct DropCopyDiag<'a> {
878    pub arg_ty: Ty<'a>,
879    #[label("argument has type `{$arg_ty}`")]
880    pub label: Span,
881    #[subdiagnostic]
882    pub sugg: UseLetUnderscoreIgnoreSuggestion,
883}
884
885#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            ForgetRefDiag<'a> where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    ForgetRefDiag {
                        arg_ty: __binding_0, label: __binding_1, sugg: __binding_2 }
                        => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("calls to `std::mem::forget` with a reference instead of an owned value does nothing")));
                        ;
                        diag.arg("arg_ty", __binding_0);
                        diag.span_label(__binding_1,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("argument has type `{$arg_ty}`")));
                        diag.subdiagnostic(__binding_2);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
886#[diag("calls to `std::mem::forget` with a reference instead of an owned value does nothing")]
887pub(crate) struct ForgetRefDiag<'a> {
888    pub arg_ty: Ty<'a>,
889    #[label("argument has type `{$arg_ty}`")]
890    pub label: Span,
891    #[subdiagnostic]
892    pub sugg: UseLetUnderscoreIgnoreSuggestion,
893}
894
895#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            ForgetCopyDiag<'a> where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    ForgetCopyDiag {
                        arg_ty: __binding_0, label: __binding_1, sugg: __binding_2 }
                        => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("calls to `std::mem::forget` with a value that implements `Copy` does nothing")));
                        ;
                        diag.arg("arg_ty", __binding_0);
                        diag.span_label(__binding_1,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("argument has type `{$arg_ty}`")));
                        diag.subdiagnostic(__binding_2);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
896#[diag("calls to `std::mem::forget` with a value that implements `Copy` does nothing")]
897pub(crate) struct ForgetCopyDiag<'a> {
898    pub arg_ty: Ty<'a>,
899    #[label("argument has type `{$arg_ty}`")]
900    pub label: Span,
901    #[subdiagnostic]
902    pub sugg: UseLetUnderscoreIgnoreSuggestion,
903}
904
905#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            UndroppedManuallyDropsDiag<'a> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    UndroppedManuallyDropsDiag {
                        arg_ty: __binding_0,
                        label: __binding_1,
                        suggestion: __binding_2 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("calls to `std::mem::drop` with `std::mem::ManuallyDrop` instead of the inner value does nothing")));
                        ;
                        diag.arg("arg_ty", __binding_0);
                        diag.span_label(__binding_1,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("argument has type `{$arg_ty}`")));
                        diag.subdiagnostic(__binding_2);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
906#[diag(
907    "calls to `std::mem::drop` with `std::mem::ManuallyDrop` instead of the inner value does nothing"
908)]
909pub(crate) struct UndroppedManuallyDropsDiag<'a> {
910    pub arg_ty: Ty<'a>,
911    #[label("argument has type `{$arg_ty}`")]
912    pub label: Span,
913    #[subdiagnostic]
914    pub suggestion: UndroppedManuallyDropsSuggestion,
915}
916
917#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for UndroppedManuallyDropsSuggestion
            {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    UndroppedManuallyDropsSuggestion {
                        start_span: __binding_0, end_span: __binding_1 } => {
                        let mut suggestions = Vec::new();
                        let __code_33 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("std::mem::ManuallyDrop::into_inner("))
                                });
                        let __code_34 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!(")"))
                                });
                        suggestions.push((__binding_0, __code_33));
                        suggestions.push((__binding_1, __code_34));
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `std::mem::ManuallyDrop::into_inner` to get the inner value")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            rustc_errors::Applicability::MachineApplicable,
                            rustc_errors::SuggestionStyle::ShowCode);
                    }
                }
            }
        }
    };Subdiagnostic)]
918#[multipart_suggestion(
919    "use `std::mem::ManuallyDrop::into_inner` to get the inner value",
920    applicability = "machine-applicable"
921)]
922pub(crate) struct UndroppedManuallyDropsSuggestion {
923    #[suggestion_part(code = "std::mem::ManuallyDrop::into_inner(")]
924    pub start_span: Span,
925    #[suggestion_part(code = ")")]
926    pub end_span: Span,
927}
928
929// invalid_from_utf8.rs
930#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            InvalidFromUtf8Diag where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    InvalidFromUtf8Diag::Unchecked {
                        method: __binding_0,
                        valid_up_to: __binding_1,
                        label: __binding_2 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("calls to `{$method}` with an invalid literal are undefined behavior")));
                        ;
                        diag.arg("method", __binding_0);
                        diag.arg("valid_up_to", __binding_1);
                        diag.span_label(__binding_2,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the literal was valid UTF-8 up to the {$valid_up_to} bytes")));
                        diag
                    }
                    InvalidFromUtf8Diag::Checked {
                        method: __binding_0,
                        valid_up_to: __binding_1,
                        label: __binding_2 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("calls to `{$method}` with an invalid literal always return an error")));
                        ;
                        diag.arg("method", __binding_0);
                        diag.arg("valid_up_to", __binding_1);
                        diag.span_label(__binding_2,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the literal was valid UTF-8 up to the {$valid_up_to} bytes")));
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
931pub(crate) enum InvalidFromUtf8Diag {
932    #[diag("calls to `{$method}` with an invalid literal are undefined behavior")]
933    Unchecked {
934        method: String,
935        valid_up_to: usize,
936        #[label("the literal was valid UTF-8 up to the {$valid_up_to} bytes")]
937        label: Span,
938    },
939    #[diag("calls to `{$method}` with an invalid literal always return an error")]
940    Checked {
941        method: String,
942        valid_up_to: usize,
943        #[label("the literal was valid UTF-8 up to the {$valid_up_to} bytes")]
944        label: Span,
945    },
946}
947
948// interior_mutable_consts.rs
949#[derive(const _: () =
    {
        impl<'_sess, 'tcx, G> rustc_errors::Diagnostic<'_sess, G> for
            ConstItemInteriorMutationsDiag<'tcx> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    ConstItemInteriorMutationsDiag {
                        method_name: __binding_0,
                        const_name: __binding_1,
                        const_ty: __binding_2,
                        receiver_span: __binding_3,
                        sugg_static: __binding_4 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("mutation of an interior mutable `const` item with call to `{$method_name}`")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("each usage of a `const` item creates a new temporary")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("only the temporaries and never the original `const {$const_name}` will be modified")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("for more details on interior mutability see <https://doc.rust-lang.org/reference/interior-mutability.html>")));
                        ;
                        diag.arg("method_name", __binding_0);
                        diag.arg("const_name", __binding_1);
                        diag.arg("const_ty", __binding_2);
                        diag.span_label(__binding_3,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`{$const_name}` is a interior mutable `const` item of type `{$const_ty}`")));
                        if let Some(__binding_4) = __binding_4 {
                            diag.subdiagnostic(__binding_4);
                        }
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
950#[diag("mutation of an interior mutable `const` item with call to `{$method_name}`")]
951#[note("each usage of a `const` item creates a new temporary")]
952#[note("only the temporaries and never the original `const {$const_name}` will be modified")]
953#[help(
954    "for more details on interior mutability see <https://doc.rust-lang.org/reference/interior-mutability.html>"
955)]
956pub(crate) struct ConstItemInteriorMutationsDiag<'tcx> {
957    pub method_name: Ident,
958    pub const_name: Ident,
959    pub const_ty: Ty<'tcx>,
960    #[label("`{$const_name}` is a interior mutable `const` item of type `{$const_ty}`")]
961    pub receiver_span: Span,
962    #[subdiagnostic]
963    pub sugg_static: Option<ConstItemInteriorMutationsSuggestionStatic>,
964}
965
966#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for
            ConstItemInteriorMutationsSuggestionStatic {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    ConstItemInteriorMutationsSuggestionStatic::Spanful {
                        const_: __binding_0,
                        before: __binding_1,
                        const_name: __binding_2 } => {
                        let __code_35 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("{0}static ",
                                                        __binding_1))
                                            })].into_iter();
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        sub_args.insert("const_name".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_2,
                                &mut diag.long_ty_path));
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("for a shared instance of `{$const_name}`, consider making it a `static` item instead")),
                                &sub_args);
                        diag.span_suggestions_with_style(__binding_0, __message,
                            __code_35, rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowAlways);
                    }
                    ConstItemInteriorMutationsSuggestionStatic::Spanless {
                        const_name: __binding_0 } => {
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        sub_args.insert("const_name".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_0,
                                &mut diag.long_ty_path));
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("for a shared instance of `{$const_name}`, consider making it a `static` item instead")),
                                &sub_args);
                        diag.help(__message);
                    }
                }
            }
        }
    };Subdiagnostic)]
967pub(crate) enum ConstItemInteriorMutationsSuggestionStatic {
968    #[suggestion(
969        "for a shared instance of `{$const_name}`, consider making it a `static` item instead",
970        code = "{before}static ",
971        style = "verbose",
972        applicability = "maybe-incorrect"
973    )]
974    Spanful {
975        #[primary_span]
976        const_: Span,
977        before: &'static str,
978        const_name: Ident,
979    },
980    #[help("for a shared instance of `{$const_name}`, consider making it a `static` item instead")]
981    Spanless { const_name: Ident },
982}
983
984// reference_casting.rs
985#[derive(const _: () =
    {
        impl<'_sess, 'tcx, G> rustc_errors::Diagnostic<'_sess, G> for
            InvalidReferenceCastingDiag<'tcx> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    InvalidReferenceCastingDiag::BorrowAsMut {
                        orig_cast: __binding_0,
                        ty_has_interior_mutability: __binding_1 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("casting `&T` to `&mut T` is undefined behavior, even if the reference is unused, consider instead using an `UnsafeCell`")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("for more information, visit <https://doc.rust-lang.org/book/ch15-05-interior-mutability.html>")));
                        ;
                        if let Some(__binding_0) = __binding_0 {
                            diag.span_label(__binding_0,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("casting happened here")));
                        }
                        if __binding_1 {
                            diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("even for types with interior mutability, the only legal way to obtain a mutable pointer from a shared reference is through `UnsafeCell::get`")));
                        }
                        diag
                    }
                    InvalidReferenceCastingDiag::AssignToRef {
                        orig_cast: __binding_0,
                        ty_has_interior_mutability: __binding_1 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("assigning to `&T` is undefined behavior, consider using an `UnsafeCell`")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("for more information, visit <https://doc.rust-lang.org/book/ch15-05-interior-mutability.html>")));
                        ;
                        if let Some(__binding_0) = __binding_0 {
                            diag.span_label(__binding_0,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("casting happened here")));
                        }
                        if __binding_1 {
                            diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("even for types with interior mutability, the only legal way to obtain a mutable pointer from a shared reference is through `UnsafeCell::get`")));
                        }
                        diag
                    }
                    InvalidReferenceCastingDiag::BiggerLayout {
                        orig_cast: __binding_0,
                        alloc: __binding_1,
                        from_ty: __binding_2,
                        from_size: __binding_3,
                        to_ty: __binding_4,
                        to_size: __binding_5 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("casting references to a bigger memory layout than the backing allocation is undefined behavior, even if the reference is unused")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("casting from `{$from_ty}` ({$from_size} bytes) to `{$to_ty}` ({$to_size} bytes)")));
                        ;
                        diag.arg("from_ty", __binding_2);
                        diag.arg("from_size", __binding_3);
                        diag.arg("to_ty", __binding_4);
                        diag.arg("to_size", __binding_5);
                        if let Some(__binding_0) = __binding_0 {
                            diag.span_label(__binding_0,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("casting happened here")));
                        }
                        diag.span_label(__binding_1,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("backing allocation comes from here")));
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
986pub(crate) enum InvalidReferenceCastingDiag<'tcx> {
987    #[diag(
988        "casting `&T` to `&mut T` is undefined behavior, even if the reference is unused, consider instead using an `UnsafeCell`"
989    )]
990    #[note(
991        "for more information, visit <https://doc.rust-lang.org/book/ch15-05-interior-mutability.html>"
992    )]
993    BorrowAsMut {
994        #[label("casting happened here")]
995        orig_cast: Option<Span>,
996        #[note(
997            "even for types with interior mutability, the only legal way to obtain a mutable pointer from a shared reference is through `UnsafeCell::get`"
998        )]
999        ty_has_interior_mutability: bool,
1000    },
1001    #[diag("assigning to `&T` is undefined behavior, consider using an `UnsafeCell`")]
1002    #[note(
1003        "for more information, visit <https://doc.rust-lang.org/book/ch15-05-interior-mutability.html>"
1004    )]
1005    AssignToRef {
1006        #[label("casting happened here")]
1007        orig_cast: Option<Span>,
1008        #[note(
1009            "even for types with interior mutability, the only legal way to obtain a mutable pointer from a shared reference is through `UnsafeCell::get`"
1010        )]
1011        ty_has_interior_mutability: bool,
1012    },
1013    #[diag(
1014        "casting references to a bigger memory layout than the backing allocation is undefined behavior, even if the reference is unused"
1015    )]
1016    #[note("casting from `{$from_ty}` ({$from_size} bytes) to `{$to_ty}` ({$to_size} bytes)")]
1017    BiggerLayout {
1018        #[label("casting happened here")]
1019        orig_cast: Option<Span>,
1020        #[label("backing allocation comes from here")]
1021        alloc: Span,
1022        from_ty: Ty<'tcx>,
1023        from_size: u64,
1024        to_ty: Ty<'tcx>,
1025        to_size: u64,
1026    },
1027}
1028
1029// map_unit_fn.rs
1030#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for MappingToUnit
            where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    MappingToUnit {
                        function_label: __binding_0,
                        argument_label: __binding_1,
                        map_label: __binding_2,
                        suggestion: __binding_3 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`Iterator::map` call that discard the iterator's values")));
                        let __code_36 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("for_each"))
                                            })].into_iter();
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`Iterator::map`, like many of the methods on `Iterator`, gets executed lazily, meaning that its effects won't be visible until it is iterated")));
                        ;
                        diag.span_label(__binding_0,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this function returns `()`, which is likely not what you wanted")));
                        diag.span_label(__binding_1,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("called `Iterator::map` with callable that returns `()`")));
                        diag.span_label(__binding_2,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("after this call to map, the resulting iterator is `impl Iterator<Item = ()>`, which means the only information carried by the iterator is the number of items")));
                        diag.span_suggestions_with_style(__binding_3,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("you might have meant to use `Iterator::for_each`")),
                            __code_36, rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowAlways);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1031#[diag("`Iterator::map` call that discard the iterator's values")]
1032#[note(
1033    "`Iterator::map`, like many of the methods on `Iterator`, gets executed lazily, meaning that its effects won't be visible until it is iterated"
1034)]
1035pub(crate) struct MappingToUnit {
1036    #[label("this function returns `()`, which is likely not what you wanted")]
1037    pub function_label: Span,
1038    #[label("called `Iterator::map` with callable that returns `()`")]
1039    pub argument_label: Span,
1040    #[label(
1041        "after this call to map, the resulting iterator is `impl Iterator<Item = ()>`, which means the only information carried by the iterator is the number of items"
1042    )]
1043    pub map_label: Span,
1044    #[suggestion(
1045        "you might have meant to use `Iterator::for_each`",
1046        style = "verbose",
1047        code = "for_each",
1048        applicability = "maybe-incorrect"
1049    )]
1050    pub suggestion: Span,
1051}
1052
1053// internal.rs
1054#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            DefaultHashTypesDiag<'a> where G: rustc_errors::EmissionGuarantee
            {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    DefaultHashTypesDiag {
                        preferred: __binding_0, used: __binding_1 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("prefer `{$preferred}` over `{$used}`, it has better performance")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("a `use rustc_data_structures::fx::{$preferred}` may be necessary")));
                        ;
                        diag.arg("preferred", __binding_0);
                        diag.arg("used", __binding_1);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1055#[diag("prefer `{$preferred}` over `{$used}`, it has better performance")]
1056#[note("a `use rustc_data_structures::fx::{$preferred}` may be necessary")]
1057pub(crate) struct DefaultHashTypesDiag<'a> {
1058    pub preferred: &'a str,
1059    pub used: Symbol,
1060}
1061
1062#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            QueryInstability where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    QueryInstability { query: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("using `{$query}` can result in unstable query results")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("if you believe this case to be fine, allow this lint and add a comment explaining your rationale")));
                        ;
                        diag.arg("query", __binding_0);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1063#[diag("using `{$query}` can result in unstable query results")]
1064#[note(
1065    "if you believe this case to be fine, allow this lint and add a comment explaining your rationale"
1066)]
1067pub(crate) struct QueryInstability {
1068    pub query: Symbol,
1069}
1070
1071#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for QueryUntracked
            where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    QueryUntracked { method: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`{$method}` accesses information that is not tracked by the query system")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("if you believe this case to be fine, allow this lint and add a comment explaining your rationale")));
                        ;
                        diag.arg("method", __binding_0);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1072#[diag("`{$method}` accesses information that is not tracked by the query system")]
1073#[note(
1074    "if you believe this case to be fine, allow this lint and add a comment explaining your rationale"
1075)]
1076pub(crate) struct QueryUntracked {
1077    pub method: Symbol,
1078}
1079
1080#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            SpanUseEqCtxtDiag where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    SpanUseEqCtxtDiag => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `.eq_ctxt()` instead of `.ctxt() == .ctxt()`")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1081#[diag("use `.eq_ctxt()` instead of `.ctxt() == .ctxt()`")]
1082pub(crate) struct SpanUseEqCtxtDiag;
1083
1084#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            SymbolInternStringLiteralDiag where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    SymbolInternStringLiteralDiag => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("using `Symbol::intern` on a string literal")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("consider adding the symbol to `compiler/rustc_span/src/symbol.rs`")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1085#[diag("using `Symbol::intern` on a string literal")]
1086#[help("consider adding the symbol to `compiler/rustc_span/src/symbol.rs`")]
1087pub(crate) struct SymbolInternStringLiteralDiag;
1088
1089#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for TykindKind
            where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    TykindKind { suggestion: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("usage of `ty::TyKind::<kind>`")));
                        let __code_37 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("ty"))
                                            })].into_iter();
                        ;
                        diag.span_suggestions_with_style(__binding_0,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("try using `ty::<kind>` directly")),
                            __code_37, rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowCode);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1090#[diag("usage of `ty::TyKind::<kind>`")]
1091pub(crate) struct TykindKind {
1092    #[suggestion(
1093        "try using `ty::<kind>` directly",
1094        code = "ty",
1095        applicability = "maybe-incorrect"
1096    )]
1097    pub suggestion: Span,
1098}
1099
1100#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for TykindDiag
            where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    TykindDiag => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("usage of `ty::TyKind`")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("try using `Ty` instead")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1101#[diag("usage of `ty::TyKind`")]
1102#[help("try using `Ty` instead")]
1103pub(crate) struct TykindDiag;
1104
1105#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for TyQualified
            where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    TyQualified { ty: __binding_0, suggestion: __binding_1 } =>
                        {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("usage of qualified `ty::{$ty}`")));
                        let __code_38 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("{0}", __binding_0))
                                            })].into_iter();
                        ;
                        diag.arg("ty", __binding_0);
                        diag.span_suggestions_with_style(__binding_1,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("try importing it and using it unqualified")),
                            __code_38, rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowCode);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1106#[diag("usage of qualified `ty::{$ty}`")]
1107pub(crate) struct TyQualified {
1108    pub ty: String,
1109    #[suggestion(
1110        "try importing it and using it unqualified",
1111        code = "{ty}",
1112        applicability = "maybe-incorrect"
1113    )]
1114    pub suggestion: Span,
1115}
1116
1117#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            TypeIrInherentUsage where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    TypeIrInherentUsage => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("do not use `rustc_type_ir::inherent` unless you're inside of the trait solver")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the method or struct you're looking for is likely defined somewhere else downstream in the compiler")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1118#[diag("do not use `rustc_type_ir::inherent` unless you're inside of the trait solver")]
1119#[note(
1120    "the method or struct you're looking for is likely defined somewhere else downstream in the compiler"
1121)]
1122pub(crate) struct TypeIrInherentUsage;
1123
1124#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            TypeIrTraitUsage where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    TypeIrTraitUsage => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("do not use `rustc_type_ir::Interner` or `rustc_type_ir::InferCtxtLike` unless you're inside of the trait solver")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the method or struct you're looking for is likely defined somewhere else downstream in the compiler")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1125#[diag(
1126    "do not use `rustc_type_ir::Interner` or `rustc_type_ir::InferCtxtLike` unless you're inside of the trait solver"
1127)]
1128#[note(
1129    "the method or struct you're looking for is likely defined somewhere else downstream in the compiler"
1130)]
1131pub(crate) struct TypeIrTraitUsage;
1132
1133#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            TypeIrDirectUse where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    TypeIrDirectUse => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("do not use `rustc_type_ir` unless you are implementing type system internals")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `rustc_middle::ty` instead")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1134#[diag("do not use `rustc_type_ir` unless you are implementing type system internals")]
1135#[note("use `rustc_middle::ty` instead")]
1136pub(crate) struct TypeIrDirectUse;
1137
1138#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            NonGlobImportTypeIrInherent where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    NonGlobImportTypeIrInherent {
                        suggestion: __binding_0, snippet: __binding_1 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("non-glob import of `rustc_type_ir::inherent`")));
                        let __code_39 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("{0}", __binding_1))
                                            })].into_iter();
                        ;
                        if let Some(__binding_0) = __binding_0 {
                            diag.span_suggestions_with_style(__binding_0,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("try using a glob import instead")),
                                __code_39, rustc_errors::Applicability::MaybeIncorrect,
                                rustc_errors::SuggestionStyle::ShowCode);
                        }
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1139#[diag("non-glob import of `rustc_type_ir::inherent`")]
1140pub(crate) struct NonGlobImportTypeIrInherent {
1141    #[suggestion(
1142        "try using a glob import instead",
1143        code = "{snippet}",
1144        applicability = "maybe-incorrect"
1145    )]
1146    pub suggestion: Option<Span>,
1147    pub snippet: &'static str,
1148}
1149
1150#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for LintPassByHand
            where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    LintPassByHand => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("implementing `LintPass` by hand")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("try using `declare_lint_pass!` or `impl_lint_pass!` instead")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1151#[diag("implementing `LintPass` by hand")]
1152#[help("try using `declare_lint_pass!` or `impl_lint_pass!` instead")]
1153pub(crate) struct LintPassByHand;
1154
1155#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            BadOptAccessDiag<'a> where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    BadOptAccessDiag { msg: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("{$msg}")));
                        ;
                        diag.arg("msg", __binding_0);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1156#[diag("{$msg}")]
1157pub(crate) struct BadOptAccessDiag<'a> {
1158    pub msg: &'a str,
1159}
1160
1161#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            ImplicitSysrootCrateImportDiag<'a> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    ImplicitSysrootCrateImportDiag { name: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("dangerous use of `extern crate {$name}` which is not guaranteed to exist exactly once in the sysroot")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("try using a cargo dependency or using a re-export of the dependency provided by a rustc_* crate")));
                        ;
                        diag.arg("name", __binding_0);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1162#[diag(
1163    "dangerous use of `extern crate {$name}` which is not guaranteed to exist exactly once in the sysroot"
1164)]
1165#[help(
1166    "try using a cargo dependency or using a re-export of the dependency provided by a rustc_* crate"
1167)]
1168pub(crate) struct ImplicitSysrootCrateImportDiag<'a> {
1169    pub name: &'a str,
1170}
1171
1172#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            AttributeKindInFindAttr where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    AttributeKindInFindAttr => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use of `AttributeKind` in `find_attr!(...)` invocation")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`find_attr!(...)` already imports `AttributeKind::*`")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("remove `AttributeKind`")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1173#[diag("use of `AttributeKind` in `find_attr!(...)` invocation")]
1174#[note("`find_attr!(...)` already imports `AttributeKind::*`")]
1175#[help("remove `AttributeKind`")]
1176pub(crate) struct AttributeKindInFindAttr;
1177
1178#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            RustcMustMatchExhaustivelyNotExhaustive where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    RustcMustMatchExhaustivelyNotExhaustive {
                        attr_span: __binding_0,
                        pat_span: __binding_1,
                        message: __binding_2 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("match is not exhaustive")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("explicitly list all variants of the enum in a `match`")));
                        ;
                        diag.arg("message", __binding_2);
                        diag.span_label(__binding_0,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("required because of this attribute")));
                        diag.span_note(__binding_1,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("{$message}")));
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1179#[diag("match is not exhaustive")]
1180#[help("explicitly list all variants of the enum in a `match`")]
1181pub(crate) struct RustcMustMatchExhaustivelyNotExhaustive {
1182    #[label("required because of this attribute")]
1183    pub attr_span: Span,
1184
1185    #[note("{$message}")]
1186    pub pat_span: Span,
1187    pub message: &'static str,
1188}
1189
1190// let_underscore.rs
1191#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for NonBindingLet
            where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    NonBindingLet::SyncLock { pat: __binding_0, sub: __binding_1
                        } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("non-binding let on a synchronization lock")));
                        ;
                        diag.span_label(__binding_0,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this lock is not assigned to a binding and is immediately dropped")));
                        diag.subdiagnostic(__binding_1);
                        diag
                    }
                    NonBindingLet::DropType { sub: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("non-binding let on a type that has a destructor")));
                        ;
                        diag.subdiagnostic(__binding_0);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1192pub(crate) enum NonBindingLet {
1193    #[diag("non-binding let on a synchronization lock")]
1194    SyncLock {
1195        #[label("this lock is not assigned to a binding and is immediately dropped")]
1196        pat: Span,
1197        #[subdiagnostic]
1198        sub: NonBindingLetSub,
1199    },
1200    #[diag("non-binding let on a type that has a destructor")]
1201    DropType {
1202        #[subdiagnostic]
1203        sub: NonBindingLetSub,
1204    },
1205}
1206
1207pub(crate) struct NonBindingLetSub {
1208    pub suggestion: Span,
1209    pub drop_fn_start_end: Option<(Span, Span)>,
1210    pub is_assign_desugar: bool,
1211}
1212
1213impl Subdiagnostic for NonBindingLetSub {
1214    fn add_to_diag<G: EmissionGuarantee>(self, diag: &mut Diag<'_, G>) {
1215        let can_suggest_binding = self.drop_fn_start_end.is_some() || !self.is_assign_desugar;
1216
1217        if can_suggest_binding {
1218            let prefix = if self.is_assign_desugar { "let " } else { "" };
1219            diag.span_suggestion_verbose(
1220                self.suggestion,
1221                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("consider binding to an unused variable to avoid immediately dropping the value"))msg!(
1222                    "consider binding to an unused variable to avoid immediately dropping the value"
1223                ),
1224                ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("{0}_unused", prefix))
    })format!("{prefix}_unused"),
1225                Applicability::MachineApplicable,
1226            );
1227        } else {
1228            diag.span_help(
1229                self.suggestion,
1230                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("consider binding to an unused variable to avoid immediately dropping the value"))msg!(
1231                    "consider binding to an unused variable to avoid immediately dropping the value"
1232                ),
1233            );
1234        }
1235        if let Some(drop_fn_start_end) = self.drop_fn_start_end {
1236            diag.multipart_suggestion(
1237                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("consider immediately dropping the value"))msg!("consider immediately dropping the value"),
1238                ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
        [(drop_fn_start_end.0, "drop(".to_string()),
                (drop_fn_start_end.1, ")".to_string())]))vec![
1239                    (drop_fn_start_end.0, "drop(".to_string()),
1240                    (drop_fn_start_end.1, ")".to_string()),
1241                ],
1242                Applicability::MachineApplicable,
1243            );
1244        } else {
1245            diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("consider immediately dropping the value using `drop(..)` after the `let` statement"))msg!(
1246                "consider immediately dropping the value using `drop(..)` after the `let` statement"
1247            ));
1248        }
1249    }
1250}
1251
1252// levels.rs
1253#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            OverruledAttributeLint<'a> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    OverruledAttributeLint {
                        overruled: __binding_0,
                        lint_level: __binding_1,
                        lint_source: __binding_2,
                        sub: __binding_3 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("{$lint_level}({$lint_source}) incompatible with previous forbid")));
                        ;
                        diag.arg("lint_level", __binding_1);
                        diag.arg("lint_source", __binding_2);
                        diag.span_label(__binding_0,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("overruled by previous forbid")));
                        diag.subdiagnostic(__binding_3);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1254#[diag("{$lint_level}({$lint_source}) incompatible with previous forbid")]
1255pub(crate) struct OverruledAttributeLint<'a> {
1256    #[label("overruled by previous forbid")]
1257    pub overruled: Span,
1258    pub lint_level: &'a str,
1259    pub lint_source: Symbol,
1260    #[subdiagnostic]
1261    pub sub: OverruledAttributeSub,
1262}
1263
1264#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            DeprecatedLintName<'a> where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    DeprecatedLintName {
                        name: __binding_0,
                        suggestion: __binding_1,
                        replace: __binding_2 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("lint name `{$name}` is deprecated and may not have an effect in the future")));
                        let __code_40 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("{0}", __binding_2))
                                            })].into_iter();
                        ;
                        diag.arg("name", __binding_0);
                        diag.span_suggestions_with_style(__binding_1,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("change it to")),
                            __code_40, rustc_errors::Applicability::MachineApplicable,
                            rustc_errors::SuggestionStyle::ShowCode);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1265#[diag("lint name `{$name}` is deprecated and may not have an effect in the future")]
1266pub(crate) struct DeprecatedLintName<'a> {
1267    pub name: String,
1268    #[suggestion("change it to", code = "{replace}", applicability = "machine-applicable")]
1269    pub suggestion: Span,
1270    pub replace: &'a str,
1271}
1272
1273#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            DeprecatedLintNameFromCommandLine<'a> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    DeprecatedLintNameFromCommandLine {
                        name: __binding_0,
                        replace: __binding_1,
                        requested_level: __binding_2 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("lint name `{$name}` is deprecated and may not have an effect in the future")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("change it to {$replace}")));
                        ;
                        diag.arg("name", __binding_0);
                        diag.arg("replace", __binding_1);
                        diag.subdiagnostic(__binding_2);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1274#[diag("lint name `{$name}` is deprecated and may not have an effect in the future")]
1275#[help("change it to {$replace}")]
1276pub(crate) struct DeprecatedLintNameFromCommandLine<'a> {
1277    pub name: String,
1278    pub replace: &'a str,
1279    #[subdiagnostic]
1280    pub requested_level: RequestedLevel<'a>,
1281}
1282
1283#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            RenamedLint<'a> where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    RenamedLint {
                        name: __binding_0,
                        replace: __binding_1,
                        suggestion: __binding_2 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("lint `{$name}` has been renamed to `{$replace}`")));
                        ;
                        diag.arg("name", __binding_0);
                        diag.arg("replace", __binding_1);
                        diag.subdiagnostic(__binding_2);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1284#[diag("lint `{$name}` has been renamed to `{$replace}`")]
1285pub(crate) struct RenamedLint<'a> {
1286    pub name: &'a str,
1287    pub replace: &'a str,
1288    #[subdiagnostic]
1289    pub suggestion: RenamedLintSuggestion<'a>,
1290}
1291
1292#[derive(const _: () =
    {
        impl<'a> rustc_errors::Subdiagnostic for RenamedLintSuggestion<'a> {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    RenamedLintSuggestion::WithSpan {
                        suggestion: __binding_0, replace: __binding_1 } => {
                        let __code_41 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("{0}", __binding_1))
                                            })].into_iter();
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use the new name")),
                                &sub_args);
                        diag.span_suggestions_with_style(__binding_0, __message,
                            __code_41, rustc_errors::Applicability::MachineApplicable,
                            rustc_errors::SuggestionStyle::ShowCode);
                    }
                    RenamedLintSuggestion::WithoutSpan { replace: __binding_0 }
                        => {
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        sub_args.insert("replace".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_0,
                                &mut diag.long_ty_path));
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use the new name `{$replace}`")),
                                &sub_args);
                        diag.help(__message);
                    }
                }
            }
        }
    };Subdiagnostic)]
1293pub(crate) enum RenamedLintSuggestion<'a> {
1294    #[suggestion("use the new name", code = "{replace}", applicability = "machine-applicable")]
1295    WithSpan {
1296        #[primary_span]
1297        suggestion: Span,
1298        replace: &'a str,
1299    },
1300    #[help("use the new name `{$replace}`")]
1301    WithoutSpan { replace: &'a str },
1302}
1303
1304#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            RenamedLintFromCommandLine<'a> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    RenamedLintFromCommandLine {
                        name: __binding_0,
                        replace: __binding_1,
                        suggestion: __binding_2,
                        requested_level: __binding_3 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("lint `{$name}` has been renamed to `{$replace}`")));
                        ;
                        diag.arg("name", __binding_0);
                        diag.arg("replace", __binding_1);
                        diag.subdiagnostic(__binding_2);
                        diag.subdiagnostic(__binding_3);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1305#[diag("lint `{$name}` has been renamed to `{$replace}`")]
1306pub(crate) struct RenamedLintFromCommandLine<'a> {
1307    pub name: &'a str,
1308    pub replace: &'a str,
1309    #[subdiagnostic]
1310    pub suggestion: RenamedLintSuggestion<'a>,
1311    #[subdiagnostic]
1312    pub requested_level: RequestedLevel<'a>,
1313}
1314
1315#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            RemovedLint<'a> where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    RemovedLint { name: __binding_0, reason: __binding_1 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("lint `{$name}` has been removed: {$reason}")));
                        ;
                        diag.arg("name", __binding_0);
                        diag.arg("reason", __binding_1);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1316#[diag("lint `{$name}` has been removed: {$reason}")]
1317pub(crate) struct RemovedLint<'a> {
1318    pub name: &'a str,
1319    pub reason: &'a str,
1320}
1321
1322#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            RemovedLintFromCommandLine<'a> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    RemovedLintFromCommandLine {
                        name: __binding_0,
                        reason: __binding_1,
                        requested_level: __binding_2 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("lint `{$name}` has been removed: {$reason}")));
                        ;
                        diag.arg("name", __binding_0);
                        diag.arg("reason", __binding_1);
                        diag.subdiagnostic(__binding_2);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1323#[diag("lint `{$name}` has been removed: {$reason}")]
1324pub(crate) struct RemovedLintFromCommandLine<'a> {
1325    pub name: &'a str,
1326    pub reason: &'a str,
1327    #[subdiagnostic]
1328    pub requested_level: RequestedLevel<'a>,
1329}
1330
1331#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for UnknownLint
            where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    UnknownLint { name: __binding_0, suggestion: __binding_1 }
                        => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("unknown lint: `{$name}`")));
                        ;
                        diag.arg("name", __binding_0);
                        if let Some(__binding_1) = __binding_1 {
                            diag.subdiagnostic(__binding_1);
                        }
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1332#[diag("unknown lint: `{$name}`")]
1333pub(crate) struct UnknownLint {
1334    pub name: String,
1335    #[subdiagnostic]
1336    pub suggestion: Option<UnknownLintSuggestion>,
1337}
1338
1339#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for UnknownLintSuggestion {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    UnknownLintSuggestion::WithSpan {
                        suggestion: __binding_0,
                        replace: __binding_1,
                        from_rustc: __binding_2 } => {
                        let __code_42 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("{0}", __binding_1))
                                            })].into_iter();
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        sub_args.insert("from_rustc".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_2,
                                &mut diag.long_ty_path));
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("{$from_rustc ->\n            [true] a lint with a similar name exists in `rustc` lints\n            *[false] did you mean\n        }")),
                                &sub_args);
                        diag.span_suggestions_with_style(__binding_0, __message,
                            __code_42, rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowCode);
                    }
                    UnknownLintSuggestion::WithoutSpan {
                        replace: __binding_0, from_rustc: __binding_1 } => {
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        sub_args.insert("replace".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_0,
                                &mut diag.long_ty_path));
                        sub_args.insert("from_rustc".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_1,
                                &mut diag.long_ty_path));
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("{$from_rustc ->\n            [true] a lint with a similar name exists in `rustc` lints: `{$replace}`\n            *[false] did you mean: `{$replace}`\n        }")),
                                &sub_args);
                        diag.help(__message);
                    }
                }
            }
        }
    };Subdiagnostic)]
1340pub(crate) enum UnknownLintSuggestion {
1341    #[suggestion(
1342        "{$from_rustc ->
1343            [true] a lint with a similar name exists in `rustc` lints
1344            *[false] did you mean
1345        }",
1346        code = "{replace}",
1347        applicability = "maybe-incorrect"
1348    )]
1349    WithSpan {
1350        #[primary_span]
1351        suggestion: Span,
1352        replace: Symbol,
1353        from_rustc: bool,
1354    },
1355    #[help(
1356        "{$from_rustc ->
1357            [true] a lint with a similar name exists in `rustc` lints: `{$replace}`
1358            *[false] did you mean: `{$replace}`
1359        }"
1360    )]
1361    WithoutSpan { replace: Symbol, from_rustc: bool },
1362}
1363
1364#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            UnknownLintFromCommandLine<'a> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    UnknownLintFromCommandLine {
                        name: __binding_0,
                        suggestion: __binding_1,
                        requested_level: __binding_2 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("unknown lint: `{$name}`")));
                        diag.code(E0602);
                        ;
                        diag.arg("name", __binding_0);
                        if let Some(__binding_1) = __binding_1 {
                            diag.subdiagnostic(__binding_1);
                        }
                        diag.subdiagnostic(__binding_2);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1365#[diag("unknown lint: `{$name}`", code = E0602)]
1366pub(crate) struct UnknownLintFromCommandLine<'a> {
1367    pub name: String,
1368    #[subdiagnostic]
1369    pub suggestion: Option<UnknownLintSuggestion>,
1370    #[subdiagnostic]
1371    pub requested_level: RequestedLevel<'a>,
1372}
1373
1374#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            IgnoredUnlessCrateSpecified<'a> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    IgnoredUnlessCrateSpecified {
                        level: __binding_0, name: __binding_1 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("{$level}({$name}) is ignored unless specified at crate level")));
                        ;
                        diag.arg("level", __binding_0);
                        diag.arg("name", __binding_1);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1375#[diag("{$level}({$name}) is ignored unless specified at crate level")]
1376pub(crate) struct IgnoredUnlessCrateSpecified<'a> {
1377    pub level: &'a str,
1378    pub name: Symbol,
1379}
1380
1381// dangling.rs
1382#[derive(const _: () =
    {
        impl<'_sess, 'tcx, G> rustc_errors::Diagnostic<'_sess, G> for
            DanglingPointersFromTemporaries<'tcx> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    DanglingPointersFromTemporaries {
                        callee: __binding_0,
                        ty: __binding_1,
                        ptr_span: __binding_2,
                        temporary_span: __binding_3 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this creates a dangling pointer because temporary `{$ty}` is dropped at end of statement")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("bind the `{$ty}` to a variable such that it outlives the pointer returned by `{$callee}`")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("a dangling pointer is safe, but dereferencing one is undefined behavior")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("returning a pointer to a local variable will always result in a dangling pointer")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("for more information, see <https://doc.rust-lang.org/reference/destructors.html>")));
                        ;
                        diag.arg("callee", __binding_0);
                        diag.arg("ty", __binding_1);
                        diag.span_label(__binding_2,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("pointer created here")));
                        diag.span_label(__binding_3,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this `{$ty}` is dropped at end of statement")));
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1383#[diag("this creates a dangling pointer because temporary `{$ty}` is dropped at end of statement")]
1384#[help("bind the `{$ty}` to a variable such that it outlives the pointer returned by `{$callee}`")]
1385#[note("a dangling pointer is safe, but dereferencing one is undefined behavior")]
1386#[note("returning a pointer to a local variable will always result in a dangling pointer")]
1387#[note("for more information, see <https://doc.rust-lang.org/reference/destructors.html>")]
1388// FIXME: put #[primary_span] on `ptr_span` once it does not cause conflicts
1389pub(crate) struct DanglingPointersFromTemporaries<'tcx> {
1390    pub callee: Ident,
1391    pub ty: Ty<'tcx>,
1392    #[label("pointer created here")]
1393    pub ptr_span: Span,
1394    #[label("this `{$ty}` is dropped at end of statement")]
1395    pub temporary_span: Span,
1396}
1397
1398#[derive(const _: () =
    {
        impl<'_sess, 'tcx, G> rustc_errors::Diagnostic<'_sess, G> for
            DanglingPointersFromLocals<'tcx> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    DanglingPointersFromLocals {
                        ret_ty: __binding_0,
                        ret_ty_span: __binding_1,
                        fn_kind: __binding_2,
                        local_var: __binding_3,
                        local_var_name: __binding_4,
                        local_var_ty: __binding_5,
                        created_at: __binding_6 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("{$fn_kind} returns a dangling pointer to dropped local variable `{$local_var_name}`")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("a dangling pointer is safe, but dereferencing one is undefined behavior")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("for more information, see <https://doc.rust-lang.org/reference/destructors.html>")));
                        ;
                        diag.arg("ret_ty", __binding_0);
                        diag.arg("fn_kind", __binding_2);
                        diag.arg("local_var_name", __binding_4);
                        diag.span_label(__binding_1,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("return type is `{$ret_ty}`")));
                        diag.span_label(__binding_3,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("local variable `{$local_var_name}` is dropped at the end of the {$fn_kind}")));
                        if let Some(__binding_6) = __binding_6 {
                            diag.span_label(__binding_6,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("dangling pointer created here")));
                        }
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1399#[diag("{$fn_kind} returns a dangling pointer to dropped local variable `{$local_var_name}`")]
1400#[note("a dangling pointer is safe, but dereferencing one is undefined behavior")]
1401#[note("for more information, see <https://doc.rust-lang.org/reference/destructors.html>")]
1402pub(crate) struct DanglingPointersFromLocals<'tcx> {
1403    pub ret_ty: Ty<'tcx>,
1404    #[label("return type is `{$ret_ty}`")]
1405    pub ret_ty_span: Span,
1406    pub fn_kind: &'static str,
1407    #[label("local variable `{$local_var_name}` is dropped at the end of the {$fn_kind}")]
1408    pub local_var: Span,
1409    pub local_var_name: Ident,
1410    pub local_var_ty: Ty<'tcx>,
1411    #[label("dangling pointer created here")]
1412    pub created_at: Option<Span>,
1413}
1414
1415// multiple_supertrait_upcastable.rs
1416#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            MultipleSupertraitUpcastable where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    MultipleSupertraitUpcastable { ident: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`{$ident}` is dyn-compatible and has multiple supertraits")));
                        ;
                        diag.arg("ident", __binding_0);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1417#[diag("`{$ident}` is dyn-compatible and has multiple supertraits")]
1418pub(crate) struct MultipleSupertraitUpcastable {
1419    pub ident: Ident,
1420}
1421
1422// non_ascii_idents.rs
1423#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            IdentifierNonAsciiChar where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    IdentifierNonAsciiChar => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("identifier contains non-ASCII characters")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1424#[diag("identifier contains non-ASCII characters")]
1425pub(crate) struct IdentifierNonAsciiChar;
1426
1427#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            IdentifierUncommonCodepoints where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    IdentifierUncommonCodepoints {
                        codepoints: __binding_0,
                        codepoints_len: __binding_1,
                        identifier_type: __binding_2 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("identifier contains {$codepoints_len ->\n        [one] { $identifier_type ->\n            [Exclusion] a character from an archaic script\n            [Technical] a character that is for non-linguistic, specialized usage\n            [Limited_Use] a character from a script in limited use\n            [Not_NFKC] a non normalized (NFKC) character\n            *[other] an uncommon character\n        }\n        *[other] { $identifier_type ->\n            [Exclusion] {$codepoints_len} characters from archaic scripts\n            [Technical] {$codepoints_len} characters that are for non-linguistic, specialized usage\n            [Limited_Use] {$codepoints_len} characters from scripts in limited use\n            [Not_NFKC] {$codepoints_len} non normalized (NFKC) characters\n            *[other] uncommon characters\n        }\n    }: {$codepoints}")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("{$codepoints_len ->\n        [one] this character is\n        *[other] these characters are\n    } included in the{$identifier_type ->\n        [Restricted] {\"\"}\n        *[other] {\" \"}{$identifier_type}\n    } Unicode general security profile")));
                        ;
                        diag.arg("codepoints", __binding_0);
                        diag.arg("codepoints_len", __binding_1);
                        diag.arg("identifier_type", __binding_2);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1428#[diag(
1429    "identifier contains {$codepoints_len ->
1430        [one] { $identifier_type ->
1431            [Exclusion] a character from an archaic script
1432            [Technical] a character that is for non-linguistic, specialized usage
1433            [Limited_Use] a character from a script in limited use
1434            [Not_NFKC] a non normalized (NFKC) character
1435            *[other] an uncommon character
1436        }
1437        *[other] { $identifier_type ->
1438            [Exclusion] {$codepoints_len} characters from archaic scripts
1439            [Technical] {$codepoints_len} characters that are for non-linguistic, specialized usage
1440            [Limited_Use] {$codepoints_len} characters from scripts in limited use
1441            [Not_NFKC] {$codepoints_len} non normalized (NFKC) characters
1442            *[other] uncommon characters
1443        }
1444    }: {$codepoints}"
1445)]
1446#[note(
1447    r#"{$codepoints_len ->
1448        [one] this character is
1449        *[other] these characters are
1450    } included in the{$identifier_type ->
1451        [Restricted] {""}
1452        *[other] {" "}{$identifier_type}
1453    } Unicode general security profile"#
1454)]
1455pub(crate) struct IdentifierUncommonCodepoints {
1456    pub codepoints: Vec<char>,
1457    pub codepoints_len: usize,
1458    pub identifier_type: &'static str,
1459}
1460
1461#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            ConfusableIdentifierPair where G: rustc_errors::EmissionGuarantee
            {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    ConfusableIdentifierPair {
                        existing_sym: __binding_0,
                        sym: __binding_1,
                        label: __binding_2,
                        main_label: __binding_3 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("found both `{$existing_sym}` and `{$sym}` as identifiers, which look alike")));
                        ;
                        diag.arg("existing_sym", __binding_0);
                        diag.arg("sym", __binding_1);
                        diag.span_label(__binding_2,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("other identifier used here")));
                        diag.span_label(__binding_3,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this identifier can be confused with `{$existing_sym}`")));
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1462#[diag("found both `{$existing_sym}` and `{$sym}` as identifiers, which look alike")]
1463pub(crate) struct ConfusableIdentifierPair {
1464    pub existing_sym: Symbol,
1465    pub sym: Symbol,
1466    #[label("other identifier used here")]
1467    pub label: Span,
1468    #[label("this identifier can be confused with `{$existing_sym}`")]
1469    pub main_label: Span,
1470}
1471
1472#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            MixedScriptConfusables where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    MixedScriptConfusables {
                        set: __binding_0, includes: __binding_1 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the usage of Script Group `{$set}` in this crate consists solely of mixed script confusables")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the usage includes {$includes}")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("please recheck to make sure their usages are indeed what you want")));
                        ;
                        diag.arg("set", __binding_0);
                        diag.arg("includes", __binding_1);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1473#[diag(
1474    "the usage of Script Group `{$set}` in this crate consists solely of mixed script confusables"
1475)]
1476#[note("the usage includes {$includes}")]
1477#[note("please recheck to make sure their usages are indeed what you want")]
1478pub(crate) struct MixedScriptConfusables {
1479    pub set: String,
1480    pub includes: String,
1481}
1482
1483// non_fmt_panic.rs
1484pub(crate) struct NonFmtPanicUnused {
1485    pub count: usize,
1486    pub suggestion: Option<Span>,
1487}
1488
1489// Used because of two suggestions based on one Option<Span>
1490impl<'a> Diagnostic<'a, ()> for NonFmtPanicUnused {
1491    fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, ()> {
1492        let mut diag = Diag::new(dcx, level, rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("panic message contains {$count ->\n                [one] an unused\n                *[other] unused\n            } formatting {$count ->\n                [one] placeholder\n                *[other] placeholders\n            }"))msg!(
1493            "panic message contains {$count ->
1494                [one] an unused
1495                *[other] unused
1496            } formatting {$count ->
1497                [one] placeholder
1498                *[other] placeholders
1499            }"
1500        ))
1501            .with_arg("count", self.count)
1502            .with_note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this message is not used as a format string when given without arguments, but will be in Rust 2021"))msg!("this message is not used as a format string when given without arguments, but will be in Rust 2021"));
1503        if let Some(span) = self.suggestion {
1504            diag.span_suggestion(
1505                span.shrink_to_hi(),
1506                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("add the missing {$count ->\n                        [one] argument\n                        *[other] arguments\n                    }"))msg!(
1507                    "add the missing {$count ->
1508                        [one] argument
1509                        *[other] arguments
1510                    }"
1511                ),
1512                ", ...",
1513                Applicability::HasPlaceholders,
1514            );
1515            diag.span_suggestion(
1516                span.shrink_to_lo(),
1517                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("or add a \"{\"{\"}{\"}\"}\" format string to use the message literally"))msg!(r#"or add a "{"{"}{"}"}" format string to use the message literally"#),
1518                "\"{}\", ",
1519                Applicability::MachineApplicable,
1520            );
1521        }
1522        diag
1523    }
1524}
1525
1526#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            NonFmtPanicBraces where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    NonFmtPanicBraces {
                        count: __binding_0, suggestion: __binding_1 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("panic message contains {$count ->\n        [one] a brace\n        *[other] braces\n    }")));
                        let __code_43 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("\"{{}}\", "))
                                            })].into_iter();
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this message is not used as a format string, but will be in Rust 2021")));
                        ;
                        diag.arg("count", __binding_0);
                        if let Some(__binding_1) = __binding_1 {
                            diag.span_suggestions_with_style(__binding_1,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("add a \"{\"{\"}{\"}\"}\" format string to use the message literally")),
                                __code_43, rustc_errors::Applicability::MachineApplicable,
                                rustc_errors::SuggestionStyle::ShowCode);
                        }
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1527#[diag(
1528    "panic message contains {$count ->
1529        [one] a brace
1530        *[other] braces
1531    }"
1532)]
1533#[note("this message is not used as a format string, but will be in Rust 2021")]
1534pub(crate) struct NonFmtPanicBraces {
1535    pub count: usize,
1536    #[suggestion(
1537        "add a \"{\"{\"}{\"}\"}\" format string to use the message literally",
1538        code = "\"{{}}\", ",
1539        applicability = "machine-applicable"
1540    )]
1541    pub suggestion: Option<Span>,
1542}
1543
1544// nonstandard_style.rs
1545#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            NonCamelCaseType<'a> where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    NonCamelCaseType {
                        sort: __binding_0, name: __binding_1, sub: __binding_2 } =>
                        {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("{$sort} `{$name}` should have an upper camel case name")));
                        ;
                        diag.arg("sort", __binding_0);
                        diag.arg("name", __binding_1);
                        diag.subdiagnostic(__binding_2);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1546#[diag("{$sort} `{$name}` should have an upper camel case name")]
1547pub(crate) struct NonCamelCaseType<'a> {
1548    pub sort: &'a str,
1549    pub name: &'a str,
1550    #[subdiagnostic]
1551    pub sub: NonCamelCaseTypeSub,
1552}
1553
1554#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for NonCamelCaseTypeSub {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    NonCamelCaseTypeSub::Label { span: __binding_0 } => {
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("should have an UpperCamelCase name")),
                                &sub_args);
                        diag.span_label(__binding_0, __message);
                    }
                    NonCamelCaseTypeSub::Suggestion {
                        span: __binding_0, replace: __binding_1 } => {
                        let __code_44 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("{0}", __binding_1))
                                            })].into_iter();
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("convert the identifier to upper camel case")),
                                &sub_args);
                        diag.span_suggestions_with_style(__binding_0, __message,
                            __code_44, rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowCode);
                    }
                }
            }
        }
    };Subdiagnostic)]
1555pub(crate) enum NonCamelCaseTypeSub {
1556    #[label("should have an UpperCamelCase name")]
1557    Label {
1558        #[primary_span]
1559        span: Span,
1560    },
1561    #[suggestion(
1562        "convert the identifier to upper camel case",
1563        code = "{replace}",
1564        applicability = "maybe-incorrect"
1565    )]
1566    Suggestion {
1567        #[primary_span]
1568        span: Span,
1569        replace: String,
1570    },
1571}
1572
1573#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            NonSnakeCaseDiag<'a> where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    NonSnakeCaseDiag {
                        sort: __binding_0, name: __binding_1, sub: __binding_2 } =>
                        {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("{$sort} `{$name}` should have a snake case name")));
                        ;
                        diag.arg("sort", __binding_0);
                        diag.arg("name", __binding_1);
                        diag.subdiagnostic(__binding_2);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1574#[diag("{$sort} `{$name}` should have a snake case name")]
1575pub(crate) struct NonSnakeCaseDiag<'a> {
1576    pub sort: &'a str,
1577    pub name: &'a str,
1578    #[subdiagnostic]
1579    pub sub: NonSnakeCaseDiagSub,
1580}
1581
1582pub(crate) enum NonSnakeCaseDiagSub {
1583    Label { span: Span },
1584    Help { sc: String },
1585    RenameOrConvertSuggestion { span: Span, suggestion: Ident },
1586    ConvertSuggestion { span: Span, suggestion: String },
1587    SuggestionAndNote { sc: String, span: Span },
1588}
1589
1590impl Subdiagnostic for NonSnakeCaseDiagSub {
1591    fn add_to_diag<G: EmissionGuarantee>(self, diag: &mut Diag<'_, G>) {
1592        match self {
1593            NonSnakeCaseDiagSub::Label { span } => {
1594                diag.span_label(span, rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("should have a snake_case name"))msg!("should have a snake_case name"));
1595            }
1596            NonSnakeCaseDiagSub::Help { sc } => {
1597                diag.arg("sc", sc);
1598                diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("convert the identifier to snake case: `{$sc}`"))msg!("convert the identifier to snake case: `{$sc}`"));
1599            }
1600            NonSnakeCaseDiagSub::ConvertSuggestion { span, suggestion } => {
1601                diag.span_suggestion(
1602                    span,
1603                    rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("convert the identifier to snake case"))msg!("convert the identifier to snake case"),
1604                    suggestion,
1605                    Applicability::MaybeIncorrect,
1606                );
1607            }
1608            NonSnakeCaseDiagSub::RenameOrConvertSuggestion { span, suggestion } => {
1609                diag.span_suggestion(
1610                    span,
1611                    rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("rename the identifier or convert it to a snake case raw identifier"))msg!("rename the identifier or convert it to a snake case raw identifier"),
1612                    suggestion,
1613                    Applicability::MaybeIncorrect,
1614                );
1615            }
1616            NonSnakeCaseDiagSub::SuggestionAndNote { sc, span } => {
1617                diag.arg("sc", sc);
1618                diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`{$sc}` cannot be used as a raw identifier"))msg!("`{$sc}` cannot be used as a raw identifier"));
1619                diag.span_suggestion(
1620                    span,
1621                    rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("rename the identifier"))msg!("rename the identifier"),
1622                    "",
1623                    Applicability::MaybeIncorrect,
1624                );
1625            }
1626        }
1627    }
1628}
1629
1630#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            NonUpperCaseGlobal<'a> where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    NonUpperCaseGlobal {
                        sort: __binding_0,
                        name: __binding_1,
                        sub: __binding_2,
                        usages: __binding_3 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("{$sort} `{$name}` should have an upper case name")));
                        ;
                        diag.arg("sort", __binding_0);
                        diag.arg("name", __binding_1);
                        diag.subdiagnostic(__binding_2);
                        for __binding_3 in __binding_3 {
                            diag.subdiagnostic(__binding_3);
                        }
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1631#[diag("{$sort} `{$name}` should have an upper case name")]
1632pub(crate) struct NonUpperCaseGlobal<'a> {
1633    pub sort: &'a str,
1634    pub name: &'a str,
1635    #[subdiagnostic]
1636    pub sub: NonUpperCaseGlobalSub,
1637    #[subdiagnostic]
1638    pub usages: Vec<NonUpperCaseGlobalSubTool>,
1639}
1640
1641#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for NonUpperCaseGlobalSub {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    NonUpperCaseGlobalSub::Label { span: __binding_0 } => {
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("should have an UPPER_CASE name")),
                                &sub_args);
                        diag.span_label(__binding_0, __message);
                    }
                    NonUpperCaseGlobalSub::Suggestion {
                        span: __binding_0,
                        applicability: __binding_1,
                        replace: __binding_2 } => {
                        let __code_45 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("{0}", __binding_2))
                                            })].into_iter();
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("convert the identifier to upper case")),
                                &sub_args);
                        diag.span_suggestions_with_style(__binding_0, __message,
                            __code_45, __binding_1,
                            rustc_errors::SuggestionStyle::ShowCode);
                    }
                }
            }
        }
    };Subdiagnostic)]
1642pub(crate) enum NonUpperCaseGlobalSub {
1643    #[label("should have an UPPER_CASE name")]
1644    Label {
1645        #[primary_span]
1646        span: Span,
1647    },
1648    #[suggestion("convert the identifier to upper case", code = "{replace}")]
1649    Suggestion {
1650        #[primary_span]
1651        span: Span,
1652        #[applicability]
1653        applicability: Applicability,
1654        replace: String,
1655    },
1656}
1657
1658#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for NonUpperCaseGlobalSubTool {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    NonUpperCaseGlobalSubTool {
                        span: __binding_0, replace: __binding_1 } => {
                        let __code_46 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("{0}", __binding_1))
                                            })].into_iter();
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("convert the identifier to upper case")),
                                &sub_args);
                        diag.span_suggestions_with_style(__binding_0, __message,
                            __code_46, rustc_errors::Applicability::MachineApplicable,
                            rustc_errors::SuggestionStyle::CompletelyHidden);
                    }
                }
            }
        }
    };Subdiagnostic)]
1659#[suggestion(
1660    "convert the identifier to upper case",
1661    code = "{replace}",
1662    applicability = "machine-applicable",
1663    style = "tool-only"
1664)]
1665pub(crate) struct NonUpperCaseGlobalSubTool {
1666    #[primary_span]
1667    pub(crate) span: Span,
1668    pub(crate) replace: String,
1669}
1670
1671// noop_method_call.rs
1672#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            NoopMethodCallDiag<'a> where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    NoopMethodCallDiag {
                        method: __binding_0,
                        orig_ty: __binding_1,
                        trait_: __binding_2,
                        label: __binding_3,
                        suggest_derive: __binding_4 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("call to `.{$method}()` on a reference in this situation does nothing")));
                        let __code_47 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!(""))
                                            })].into_iter();
                        let __code_48 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("#[derive(Clone)]\n"))
                                            })].into_iter();
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the type `{$orig_ty}` does not implement `{$trait_}`, so calling `{$method}` on `&{$orig_ty}` copies the reference, which does not do anything and can be removed")));
                        ;
                        diag.arg("method", __binding_0);
                        diag.arg("orig_ty", __binding_1);
                        diag.arg("trait_", __binding_2);
                        diag.span_suggestions_with_style(__binding_3,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("remove this redundant call")),
                            __code_47, rustc_errors::Applicability::MachineApplicable,
                            rustc_errors::SuggestionStyle::ShowCode);
                        if let Some(__binding_4) = __binding_4 {
                            diag.span_suggestions_with_style(__binding_4,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("if you meant to clone `{$orig_ty}`, implement `Clone` for it")),
                                __code_48, rustc_errors::Applicability::MaybeIncorrect,
                                rustc_errors::SuggestionStyle::ShowCode);
                        }
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1673#[diag("call to `.{$method}()` on a reference in this situation does nothing")]
1674#[note(
1675    "the type `{$orig_ty}` does not implement `{$trait_}`, so calling `{$method}` on `&{$orig_ty}` copies the reference, which does not do anything and can be removed"
1676)]
1677pub(crate) struct NoopMethodCallDiag<'a> {
1678    pub method: Ident,
1679    pub orig_ty: Ty<'a>,
1680    pub trait_: Symbol,
1681    #[suggestion("remove this redundant call", code = "", applicability = "machine-applicable")]
1682    pub label: Span,
1683    #[suggestion(
1684        "if you meant to clone `{$orig_ty}`, implement `Clone` for it",
1685        code = "#[derive(Clone)]\n",
1686        applicability = "maybe-incorrect"
1687    )]
1688    pub suggest_derive: Option<Span>,
1689}
1690
1691#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            SuspiciousDoubleRefDerefDiag<'a> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    SuspiciousDoubleRefDerefDiag { ty: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("using `.deref()` on a double reference, which returns `{$ty}` instead of dereferencing the inner type")));
                        ;
                        diag.arg("ty", __binding_0);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1692#[diag(
1693    "using `.deref()` on a double reference, which returns `{$ty}` instead of dereferencing the inner type"
1694)]
1695pub(crate) struct SuspiciousDoubleRefDerefDiag<'a> {
1696    pub ty: Ty<'a>,
1697}
1698
1699#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            SuspiciousDoubleRefCloneDiag<'a> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    SuspiciousDoubleRefCloneDiag { ty: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("using `.clone()` on a double reference, which returns `{$ty}` instead of cloning the inner type")));
                        ;
                        diag.arg("ty", __binding_0);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1700#[diag(
1701    "using `.clone()` on a double reference, which returns `{$ty}` instead of cloning the inner type"
1702)]
1703pub(crate) struct SuspiciousDoubleRefCloneDiag<'a> {
1704    pub ty: Ty<'a>,
1705}
1706
1707// non_local_defs.rs
1708pub(crate) enum NonLocalDefinitionsDiag {
1709    Impl {
1710        depth: u32,
1711        body_kind_descr: &'static str,
1712        body_name: String,
1713        cargo_update: Option<NonLocalDefinitionsCargoUpdateNote>,
1714        const_anon: Option<Option<Span>>,
1715        doctest: bool,
1716        macro_to_change: Option<(String, &'static str)>,
1717    },
1718    MacroRules {
1719        depth: u32,
1720        body_kind_descr: &'static str,
1721        body_name: String,
1722        doctest: bool,
1723        cargo_update: Option<NonLocalDefinitionsCargoUpdateNote>,
1724    },
1725}
1726
1727impl<'a> Diagnostic<'a, ()> for NonLocalDefinitionsDiag {
1728    fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, ()> {
1729        let mut diag = Diag::new(dcx, level, "");
1730        match self {
1731            NonLocalDefinitionsDiag::Impl {
1732                depth,
1733                body_kind_descr,
1734                body_name,
1735                cargo_update,
1736                const_anon,
1737                doctest,
1738                macro_to_change,
1739            } => {
1740                diag.primary_message(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("non-local `impl` definition, `impl` blocks should be written at the same level as their item"))msg!("non-local `impl` definition, `impl` blocks should be written at the same level as their item"));
1741                diag.arg("depth", depth);
1742                diag.arg("body_kind_descr", body_kind_descr);
1743                diag.arg("body_name", body_name);
1744
1745                if let Some((macro_to_change, macro_kind)) = macro_to_change {
1746                    diag.arg("macro_to_change", macro_to_change);
1747                    diag.arg("macro_kind", macro_kind);
1748                    diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the {$macro_kind} `{$macro_to_change}` defines the non-local `impl`, and may need to be changed"))msg!("the {$macro_kind} `{$macro_to_change}` defines the non-local `impl`, and may need to be changed"));
1749                }
1750                if let Some(cargo_update) = cargo_update {
1751                    diag.subdiagnostic(cargo_update);
1752                }
1753
1754                diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("an `impl` is never scoped, even when it is nested inside an item, as it may impact type checking outside of that item, which can be the case if neither the trait or the self type are at the same nesting level as the `impl`"))msg!("an `impl` is never scoped, even when it is nested inside an item, as it may impact type checking outside of that item, which can be the case if neither the trait or the self type are at the same nesting level as the `impl`"));
1755
1756                if doctest {
1757                    diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("make this doc-test a standalone test with its own `fn main() {\"{\"} ... {\"}\"}`"))msg!("make this doc-test a standalone test with its own `fn main() {\"{\"} ... {\"}\"}`"));
1758                }
1759
1760                if let Some(const_anon) = const_anon {
1761                    diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("items in an anonymous const item (`const _: () = {\"{\"} ... {\"}\"}`) are treated as in the same scope as the anonymous const's declaration for the purpose of this lint"))msg!("items in an anonymous const item (`const _: () = {\"{\"} ... {\"}\"}`) are treated as in the same scope as the anonymous const's declaration for the purpose of this lint"));
1762                    if let Some(const_anon) = const_anon {
1763                        diag.span_suggestion(
1764                            const_anon,
1765                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use a const-anon item to suppress this lint"))msg!("use a const-anon item to suppress this lint"),
1766                            "_",
1767                            Applicability::MachineApplicable,
1768                        );
1769                    }
1770                }
1771            }
1772            NonLocalDefinitionsDiag::MacroRules {
1773                depth,
1774                body_kind_descr,
1775                body_name,
1776                doctest,
1777                cargo_update,
1778            } => {
1779                diag.primary_message(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("non-local `macro_rules!` definition, `#[macro_export]` macro should be written at top level module"))msg!("non-local `macro_rules!` definition, `#[macro_export]` macro should be written at top level module"));
1780                diag.arg("depth", depth);
1781                diag.arg("body_kind_descr", body_kind_descr);
1782                diag.arg("body_name", body_name);
1783
1784                if doctest {
1785                    diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("remove the `#[macro_export]` or make this doc-test a standalone test with its own `fn main() {\"{\"} ... {\"}\"}`"))msg!(r#"remove the `#[macro_export]` or make this doc-test a standalone test with its own `fn main() {"{"} ... {"}"}`"#));
1786                } else {
1787                    diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("remove the `#[macro_export]` or move this `macro_rules!` outside the of the current {$body_kind_descr} {$depth ->\n                            [one] `{$body_name}`\n                            *[other] `{$body_name}` and up {$depth} bodies\n                        }"))msg!(
1788                        "remove the `#[macro_export]` or move this `macro_rules!` outside the of the current {$body_kind_descr} {$depth ->
1789                            [one] `{$body_name}`
1790                            *[other] `{$body_name}` and up {$depth} bodies
1791                        }"
1792                    ));
1793                }
1794
1795                diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("a `macro_rules!` definition is non-local if it is nested inside an item and has a `#[macro_export]` attribute"))msg!("a `macro_rules!` definition is non-local if it is nested inside an item and has a `#[macro_export]` attribute"));
1796
1797                if let Some(cargo_update) = cargo_update {
1798                    diag.subdiagnostic(cargo_update);
1799                }
1800            }
1801        }
1802        diag
1803    }
1804}
1805
1806#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for
            NonLocalDefinitionsCargoUpdateNote {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    NonLocalDefinitionsCargoUpdateNote {
                        macro_kind: __binding_0,
                        macro_name: __binding_1,
                        crate_name: __binding_2 } => {
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        sub_args.insert("macro_kind".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_0,
                                &mut diag.long_ty_path));
                        sub_args.insert("macro_name".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_1,
                                &mut diag.long_ty_path));
                        sub_args.insert("crate_name".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_2,
                                &mut diag.long_ty_path));
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the {$macro_kind} `{$macro_name}` may come from an old version of the `{$crate_name}` crate, try updating your dependency with `cargo update -p {$crate_name}`")),
                                &sub_args);
                        diag.note(__message);
                    }
                }
            }
        }
    };Subdiagnostic)]
1807#[note(
1808    "the {$macro_kind} `{$macro_name}` may come from an old version of the `{$crate_name}` crate, try updating your dependency with `cargo update -p {$crate_name}`"
1809)]
1810pub(crate) struct NonLocalDefinitionsCargoUpdateNote {
1811    pub macro_kind: &'static str,
1812    pub macro_name: Symbol,
1813    pub crate_name: Symbol,
1814}
1815
1816// precedence.rs
1817#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            AmbiguousNegativeLiteralsDiag where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    AmbiguousNegativeLiteralsDiag {
                        negative_literal: __binding_0, current_behavior: __binding_1
                        } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`-` has lower precedence than method calls, which might be unexpected")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("e.g. `-4.abs()` equals `-4`; while `(-4).abs()` equals `4`")));
                        ;
                        diag.subdiagnostic(__binding_0);
                        diag.subdiagnostic(__binding_1);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1818#[diag("`-` has lower precedence than method calls, which might be unexpected")]
1819#[note("e.g. `-4.abs()` equals `-4`; while `(-4).abs()` equals `4`")]
1820pub(crate) struct AmbiguousNegativeLiteralsDiag {
1821    #[subdiagnostic]
1822    pub negative_literal: AmbiguousNegativeLiteralsNegativeLiteralSuggestion,
1823    #[subdiagnostic]
1824    pub current_behavior: AmbiguousNegativeLiteralsCurrentBehaviorSuggestion,
1825}
1826
1827#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for
            AmbiguousNegativeLiteralsNegativeLiteralSuggestion {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    AmbiguousNegativeLiteralsNegativeLiteralSuggestion {
                        start_span: __binding_0, end_span: __binding_1 } => {
                        let mut suggestions = Vec::new();
                        let __code_49 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("("))
                                });
                        let __code_50 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!(")"))
                                });
                        suggestions.push((__binding_0, __code_49));
                        suggestions.push((__binding_1, __code_50));
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("add parentheses around the `-` and the literal to call the method on a negative literal")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowCode);
                    }
                }
            }
        }
    };Subdiagnostic)]
1828#[multipart_suggestion(
1829    "add parentheses around the `-` and the literal to call the method on a negative literal",
1830    applicability = "maybe-incorrect"
1831)]
1832pub(crate) struct AmbiguousNegativeLiteralsNegativeLiteralSuggestion {
1833    #[suggestion_part(code = "(")]
1834    pub start_span: Span,
1835    #[suggestion_part(code = ")")]
1836    pub end_span: Span,
1837}
1838
1839#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for
            AmbiguousNegativeLiteralsCurrentBehaviorSuggestion {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    AmbiguousNegativeLiteralsCurrentBehaviorSuggestion {
                        start_span: __binding_0, end_span: __binding_1 } => {
                        let mut suggestions = Vec::new();
                        let __code_51 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("("))
                                });
                        let __code_52 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!(")"))
                                });
                        suggestions.push((__binding_0, __code_51));
                        suggestions.push((__binding_1, __code_52));
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("add parentheses around the literal and the method call to keep the current behavior")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowCode);
                    }
                }
            }
        }
    };Subdiagnostic)]
1840#[multipart_suggestion(
1841    "add parentheses around the literal and the method call to keep the current behavior",
1842    applicability = "maybe-incorrect"
1843)]
1844pub(crate) struct AmbiguousNegativeLiteralsCurrentBehaviorSuggestion {
1845    #[suggestion_part(code = "(")]
1846    pub start_span: Span,
1847    #[suggestion_part(code = ")")]
1848    pub end_span: Span,
1849}
1850
1851// disallowed_pass_by_ref.rs
1852#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            DisallowedPassByRefDiag where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    DisallowedPassByRefDiag {
                        ty: __binding_0, suggestion: __binding_1 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("passing `{$ty}` by reference")));
                        let __code_53 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("{0}", __binding_0))
                                            })].into_iter();
                        ;
                        diag.arg("ty", __binding_0);
                        diag.span_suggestions_with_style(__binding_1,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("try passing by value")),
                            __code_53, rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowCode);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1853#[diag("passing `{$ty}` by reference")]
1854pub(crate) struct DisallowedPassByRefDiag {
1855    pub ty: String,
1856    #[suggestion("try passing by value", code = "{ty}", applicability = "maybe-incorrect")]
1857    pub suggestion: Span,
1858}
1859
1860// redundant_semicolon.rs
1861#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            RedundantSemicolonsDiag where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    RedundantSemicolonsDiag {
                        multiple: __binding_0, suggestion: __binding_1 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("unnecessary trailing {$multiple ->\n        [true] semicolons\n        *[false] semicolon\n    }")));
                        ;
                        diag.arg("multiple", __binding_0);
                        if let Some(__binding_1) = __binding_1 {
                            diag.subdiagnostic(__binding_1);
                        }
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1862#[diag(
1863    "unnecessary trailing {$multiple ->
1864        [true] semicolons
1865        *[false] semicolon
1866    }"
1867)]
1868pub(crate) struct RedundantSemicolonsDiag {
1869    pub multiple: bool,
1870    #[subdiagnostic]
1871    pub suggestion: Option<RedundantSemicolonsSuggestion>,
1872}
1873
1874#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for RedundantSemicolonsSuggestion {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    RedundantSemicolonsSuggestion {
                        multiple_semicolons: __binding_0, span: __binding_1 } => {
                        let __code_54 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!(""))
                                            })].into_iter();
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        sub_args.insert("multiple_semicolons".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_0,
                                &mut diag.long_ty_path));
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("remove {$multiple_semicolons ->\n        [true] these semicolons\n        *[false] this semicolon\n    }")),
                                &sub_args);
                        diag.span_suggestions_with_style(__binding_1, __message,
                            __code_54, rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowCode);
                    }
                }
            }
        }
    };Subdiagnostic)]
1875#[suggestion(
1876    "remove {$multiple_semicolons ->
1877        [true] these semicolons
1878        *[false] this semicolon
1879    }",
1880    code = "",
1881    applicability = "maybe-incorrect"
1882)]
1883pub(crate) struct RedundantSemicolonsSuggestion {
1884    pub multiple_semicolons: bool,
1885    #[primary_span]
1886    pub span: Span,
1887}
1888
1889// traits.rs
1890pub(crate) struct DropTraitConstraintsDiag<'a> {
1891    pub predicate: Clause<'a>,
1892    pub tcx: TyCtxt<'a>,
1893    pub def_id: DefId,
1894}
1895
1896// Needed for def_path_str
1897impl<'a> Diagnostic<'a, ()> for DropTraitConstraintsDiag<'_> {
1898    fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, ()> {
1899        Diag::new(dcx, level, rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("bounds on `{$predicate}` are most likely incorrect, consider instead using `{$needs_drop}` to detect whether a type can be trivially dropped"))msg!("bounds on `{$predicate}` are most likely incorrect, consider instead using `{$needs_drop}` to detect whether a type can be trivially dropped"))
1900            .with_arg("predicate", self.predicate)
1901            .with_arg("needs_drop", self.tcx.def_path_str(self.def_id))
1902    }
1903}
1904
1905pub(crate) struct DropGlue<'a> {
1906    pub tcx: TyCtxt<'a>,
1907    pub def_id: DefId,
1908}
1909
1910// Needed for def_path_str
1911impl<'a> Diagnostic<'a, ()> for DropGlue<'_> {
1912    fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, ()> {
1913        Diag::new(dcx, level, rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("types that do not implement `Drop` can still have drop glue, consider instead using `{$needs_drop}` to detect whether a type is trivially dropped"))msg!("types that do not implement `Drop` can still have drop glue, consider instead using `{$needs_drop}` to detect whether a type is trivially dropped"))
1914            .with_arg("needs_drop", self.tcx.def_path_str(self.def_id))
1915    }
1916}
1917
1918// transmute.rs
1919#[derive(const _: () =
    {
        impl<'_sess, 'tcx, G> rustc_errors::Diagnostic<'_sess, G> for
            IntegerToPtrTransmutes<'tcx> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    IntegerToPtrTransmutes { suggestion: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("transmuting an integer to a pointer creates a pointer without provenance")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this is dangerous because dereferencing the resulting pointer is undefined behavior")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("exposed provenance semantics can be used to create a pointer based on some previously exposed provenance")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("if you truly mean to create a pointer without provenance, use `std::ptr::without_provenance_mut`")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("for more information about transmute, see <https://doc.rust-lang.org/std/mem/fn.transmute.html#transmutation-between-pointers-and-integers>")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("for more information about exposed provenance, see <https://doc.rust-lang.org/std/ptr/index.html#exposed-provenance>")));
                        ;
                        if let Some(__binding_0) = __binding_0 {
                            diag.subdiagnostic(__binding_0);
                        }
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1920#[diag("transmuting an integer to a pointer creates a pointer without provenance")]
1921#[note("this is dangerous because dereferencing the resulting pointer is undefined behavior")]
1922#[note(
1923    "exposed provenance semantics can be used to create a pointer based on some previously exposed provenance"
1924)]
1925#[help(
1926    "if you truly mean to create a pointer without provenance, use `std::ptr::without_provenance_mut`"
1927)]
1928#[help(
1929    "for more information about transmute, see <https://doc.rust-lang.org/std/mem/fn.transmute.html#transmutation-between-pointers-and-integers>"
1930)]
1931#[help(
1932    "for more information about exposed provenance, see <https://doc.rust-lang.org/std/ptr/index.html#exposed-provenance>"
1933)]
1934pub(crate) struct IntegerToPtrTransmutes<'tcx> {
1935    #[subdiagnostic]
1936    pub suggestion: Option<IntegerToPtrTransmutesSuggestion<'tcx>>,
1937}
1938
1939#[derive(const _: () =
    {
        impl<'tcx> rustc_errors::Subdiagnostic for
            IntegerToPtrTransmutesSuggestion<'tcx> {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    IntegerToPtrTransmutesSuggestion::ToPtr {
                        dst: __binding_0,
                        suffix: __binding_1,
                        start_call: __binding_2 } => {
                        let mut suggestions = Vec::new();
                        let __code_55 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("std::ptr::with_exposed_provenance{1}::<{0}>(",
                                            __binding_0, __binding_1))
                                });
                        suggestions.push((__binding_2, __code_55));
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        sub_args.insert("suffix".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_1,
                                &mut diag.long_ty_path));
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `std::ptr::with_exposed_provenance{$suffix}` instead to use a previously exposed provenance")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            rustc_errors::Applicability::MachineApplicable,
                            rustc_errors::SuggestionStyle::ShowAlways);
                    }
                    IntegerToPtrTransmutesSuggestion::ToRef {
                        dst: __binding_0,
                        suffix: __binding_1,
                        ref_mutbl: __binding_2,
                        start_call: __binding_3 } => {
                        let mut suggestions = Vec::new();
                        let __code_56 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("&{1}*std::ptr::with_exposed_provenance{2}::<{0}>(",
                                            __binding_0, __binding_2, __binding_1))
                                });
                        suggestions.push((__binding_3, __code_56));
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        sub_args.insert("suffix".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_1,
                                &mut diag.long_ty_path));
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `std::ptr::with_exposed_provenance{$suffix}` instead to use a previously exposed provenance")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            rustc_errors::Applicability::MachineApplicable,
                            rustc_errors::SuggestionStyle::ShowAlways);
                    }
                }
            }
        }
    };Subdiagnostic)]
1940pub(crate) enum IntegerToPtrTransmutesSuggestion<'tcx> {
1941    #[multipart_suggestion(
1942        "use `std::ptr::with_exposed_provenance{$suffix}` instead to use a previously exposed provenance",
1943        applicability = "machine-applicable",
1944        style = "verbose"
1945    )]
1946    ToPtr {
1947        dst: Ty<'tcx>,
1948        suffix: &'static str,
1949        #[suggestion_part(code = "std::ptr::with_exposed_provenance{suffix}::<{dst}>(")]
1950        start_call: Span,
1951    },
1952    #[multipart_suggestion(
1953        "use `std::ptr::with_exposed_provenance{$suffix}` instead to use a previously exposed provenance",
1954        applicability = "machine-applicable",
1955        style = "verbose"
1956    )]
1957    ToRef {
1958        dst: Ty<'tcx>,
1959        suffix: &'static str,
1960        ref_mutbl: &'static str,
1961        #[suggestion_part(
1962            code = "&{ref_mutbl}*std::ptr::with_exposed_provenance{suffix}::<{dst}>("
1963        )]
1964        start_call: Span,
1965    },
1966}
1967
1968// types.rs
1969#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            RangeEndpointOutOfRange<'a> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    RangeEndpointOutOfRange { ty: __binding_0, sub: __binding_1
                        } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("range endpoint is out of range for `{$ty}`")));
                        ;
                        diag.arg("ty", __binding_0);
                        diag.subdiagnostic(__binding_1);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
1970#[diag("range endpoint is out of range for `{$ty}`")]
1971pub(crate) struct RangeEndpointOutOfRange<'a> {
1972    pub ty: &'a str,
1973    #[subdiagnostic]
1974    pub sub: UseInclusiveRange<'a>,
1975}
1976
1977#[derive(const _: () =
    {
        impl<'a> rustc_errors::Subdiagnostic for UseInclusiveRange<'a> {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    UseInclusiveRange::WithoutParen {
                        sugg: __binding_0,
                        start: __binding_1,
                        literal: __binding_2,
                        suffix: __binding_3 } => {
                        let __code_57 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("{1}..={0}{2}",
                                                        __binding_2, __binding_1, __binding_3))
                                            })].into_iter();
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use an inclusive range instead")),
                                &sub_args);
                        diag.span_suggestions_with_style(__binding_0, __message,
                            __code_57, rustc_errors::Applicability::MachineApplicable,
                            rustc_errors::SuggestionStyle::ShowCode);
                    }
                    UseInclusiveRange::WithParen {
                        eq_sugg: __binding_0,
                        lit_sugg: __binding_1,
                        literal: __binding_2,
                        suffix: __binding_3 } => {
                        let mut suggestions = Vec::new();
                        let __code_58 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("="))
                                });
                        let __code_59 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("{0}{1}", __binding_2,
                                            __binding_3))
                                });
                        suggestions.push((__binding_0, __code_58));
                        suggestions.push((__binding_1, __code_59));
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use an inclusive range instead")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            rustc_errors::Applicability::MachineApplicable,
                            rustc_errors::SuggestionStyle::ShowCode);
                    }
                }
            }
        }
    };Subdiagnostic)]
1978pub(crate) enum UseInclusiveRange<'a> {
1979    #[suggestion(
1980        "use an inclusive range instead",
1981        code = "{start}..={literal}{suffix}",
1982        applicability = "machine-applicable"
1983    )]
1984    WithoutParen {
1985        #[primary_span]
1986        sugg: Span,
1987        start: String,
1988        literal: u128,
1989        suffix: &'a str,
1990    },
1991    #[multipart_suggestion("use an inclusive range instead", applicability = "machine-applicable")]
1992    WithParen {
1993        #[suggestion_part(code = "=")]
1994        eq_sugg: Span,
1995        #[suggestion_part(code = "{literal}{suffix}")]
1996        lit_sugg: Span,
1997        literal: u128,
1998        suffix: &'a str,
1999    },
2000}
2001
2002#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            OverflowingBinHex<'a> where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    OverflowingBinHex {
                        ty: __binding_0,
                        sign: __binding_1,
                        sub: __binding_2,
                        sign_bit_sub: __binding_3 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("literal out of range for `{$ty}`")));
                        ;
                        diag.arg("ty", __binding_0);
                        diag.subdiagnostic(__binding_1);
                        if let Some(__binding_2) = __binding_2 {
                            diag.subdiagnostic(__binding_2);
                        }
                        if let Some(__binding_3) = __binding_3 {
                            diag.subdiagnostic(__binding_3);
                        }
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2003#[diag("literal out of range for `{$ty}`")]
2004pub(crate) struct OverflowingBinHex<'a> {
2005    pub ty: &'a str,
2006    #[subdiagnostic]
2007    pub sign: OverflowingBinHexSign<'a>,
2008    #[subdiagnostic]
2009    pub sub: Option<OverflowingBinHexSub<'a>>,
2010    #[subdiagnostic]
2011    pub sign_bit_sub: Option<OverflowingBinHexSignBitSub<'a>>,
2012}
2013
2014#[derive(const _: () =
    {
        impl<'a> rustc_errors::Subdiagnostic for OverflowingBinHexSign<'a> {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    OverflowingBinHexSign::Positive {
                        lit: __binding_0,
                        ty: __binding_1,
                        actually: __binding_2,
                        dec: __binding_3 } => {
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        sub_args.insert("lit".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_0,
                                &mut diag.long_ty_path));
                        sub_args.insert("ty".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_1,
                                &mut diag.long_ty_path));
                        sub_args.insert("actually".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_2,
                                &mut diag.long_ty_path));
                        sub_args.insert("dec".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_3,
                                &mut diag.long_ty_path));
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the literal `{$lit}` (decimal `{$dec}`) does not fit into the type `{$ty}` and will become `{$actually}{$ty}`")),
                                &sub_args);
                        diag.note(__message);
                    }
                    OverflowingBinHexSign::Negative {
                        lit: __binding_0,
                        ty: __binding_1,
                        actually: __binding_2,
                        dec: __binding_3 } => {
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        sub_args.insert("lit".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_0,
                                &mut diag.long_ty_path));
                        sub_args.insert("ty".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_1,
                                &mut diag.long_ty_path));
                        sub_args.insert("actually".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_2,
                                &mut diag.long_ty_path));
                        sub_args.insert("dec".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_3,
                                &mut diag.long_ty_path));
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the literal `{$lit}` (decimal `{$dec}`) does not fit into the type `{$ty}`")),
                                &sub_args);
                        diag.note(__message);
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("and the value `-{$lit}` will become `{$actually}{$ty}`")),
                                &sub_args);
                        diag.note(__message);
                    }
                }
            }
        }
    };Subdiagnostic)]
2015pub(crate) enum OverflowingBinHexSign<'a> {
2016    #[note(
2017        "the literal `{$lit}` (decimal `{$dec}`) does not fit into the type `{$ty}` and will become `{$actually}{$ty}`"
2018    )]
2019    Positive { lit: String, ty: &'a str, actually: String, dec: u128 },
2020    #[note("the literal `{$lit}` (decimal `{$dec}`) does not fit into the type `{$ty}`")]
2021    #[note("and the value `-{$lit}` will become `{$actually}{$ty}`")]
2022    Negative { lit: String, ty: &'a str, actually: String, dec: u128 },
2023}
2024
2025#[derive(const _: () =
    {
        impl<'a> rustc_errors::Subdiagnostic for OverflowingBinHexSub<'a> {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    OverflowingBinHexSub::Suggestion {
                        span: __binding_0,
                        suggestion_ty: __binding_1,
                        sans_suffix: __binding_2 } => {
                        let __code_60 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("{0}{1}", __binding_2,
                                                        __binding_1))
                                            })].into_iter();
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        sub_args.insert("suggestion_ty".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_1,
                                &mut diag.long_ty_path));
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("consider using the type `{$suggestion_ty}` instead")),
                                &sub_args);
                        diag.span_suggestions_with_style(__binding_0, __message,
                            __code_60, rustc_errors::Applicability::MachineApplicable,
                            rustc_errors::SuggestionStyle::ShowCode);
                    }
                    OverflowingBinHexSub::Help { suggestion_ty: __binding_0 } =>
                        {
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        sub_args.insert("suggestion_ty".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_0,
                                &mut diag.long_ty_path));
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("consider using the type `{$suggestion_ty}` instead")),
                                &sub_args);
                        diag.help(__message);
                    }
                }
            }
        }
    };Subdiagnostic)]
2026pub(crate) enum OverflowingBinHexSub<'a> {
2027    #[suggestion(
2028        "consider using the type `{$suggestion_ty}` instead",
2029        code = "{sans_suffix}{suggestion_ty}",
2030        applicability = "machine-applicable"
2031    )]
2032    Suggestion {
2033        #[primary_span]
2034        span: Span,
2035        suggestion_ty: &'a str,
2036        sans_suffix: &'a str,
2037    },
2038    #[help("consider using the type `{$suggestion_ty}` instead")]
2039    Help { suggestion_ty: &'a str },
2040}
2041
2042#[derive(const _: () =
    {
        impl<'a> rustc_errors::Subdiagnostic for
            OverflowingBinHexSignBitSub<'a> {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    OverflowingBinHexSignBitSub {
                        span: __binding_0,
                        lit_no_suffix: __binding_1,
                        negative_val: __binding_2,
                        uint_ty: __binding_3,
                        int_ty: __binding_4 } => {
                        let __code_61 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("{1}{2} as {0}",
                                                        __binding_4, __binding_1, __binding_3))
                                            })].into_iter();
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        sub_args.insert("negative_val".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_2,
                                &mut diag.long_ty_path));
                        sub_args.insert("uint_ty".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_3,
                                &mut diag.long_ty_path));
                        sub_args.insert("int_ty".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_4,
                                &mut diag.long_ty_path));
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("to use as a negative number (decimal `{$negative_val}`), consider using the type `{$uint_ty}` for the literal and cast it to `{$int_ty}`")),
                                &sub_args);
                        diag.span_suggestions_with_style(__binding_0, __message,
                            __code_61, rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowCode);
                    }
                }
            }
        }
    };Subdiagnostic)]
2043#[suggestion(
2044    "to use as a negative number (decimal `{$negative_val}`), consider using the type `{$uint_ty}` for the literal and cast it to `{$int_ty}`",
2045    code = "{lit_no_suffix}{uint_ty} as {int_ty}",
2046    applicability = "maybe-incorrect"
2047)]
2048pub(crate) struct OverflowingBinHexSignBitSub<'a> {
2049    #[primary_span]
2050    pub span: Span,
2051    pub lit_no_suffix: &'a str,
2052    pub negative_val: String,
2053    pub uint_ty: &'a str,
2054    pub int_ty: &'a str,
2055}
2056
2057#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            OverflowingInt<'a> where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    OverflowingInt {
                        ty: __binding_0,
                        lit: __binding_1,
                        min: __binding_2,
                        max: __binding_3,
                        help: __binding_4 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("literal out of range for `{$ty}`")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the literal `{$lit}` does not fit into the type `{$ty}` whose range is `{$min}..={$max}`")));
                        ;
                        diag.arg("ty", __binding_0);
                        diag.arg("lit", __binding_1);
                        diag.arg("min", __binding_2);
                        diag.arg("max", __binding_3);
                        if let Some(__binding_4) = __binding_4 {
                            diag.subdiagnostic(__binding_4);
                        }
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2058#[diag("literal out of range for `{$ty}`")]
2059#[note("the literal `{$lit}` does not fit into the type `{$ty}` whose range is `{$min}..={$max}`")]
2060pub(crate) struct OverflowingInt<'a> {
2061    pub ty: &'a str,
2062    pub lit: String,
2063    pub min: i128,
2064    pub max: u128,
2065    #[subdiagnostic]
2066    pub help: Option<OverflowingIntHelp<'a>>,
2067}
2068
2069#[derive(const _: () =
    {
        impl<'a> rustc_errors::Subdiagnostic for OverflowingIntHelp<'a> {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    OverflowingIntHelp { suggestion_ty: __binding_0 } => {
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        sub_args.insert("suggestion_ty".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_0,
                                &mut diag.long_ty_path));
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("consider using the type `{$suggestion_ty}` instead")),
                                &sub_args);
                        diag.help(__message);
                    }
                }
            }
        }
    };Subdiagnostic)]
2070#[help("consider using the type `{$suggestion_ty}` instead")]
2071pub(crate) struct OverflowingIntHelp<'a> {
2072    pub suggestion_ty: &'a str,
2073}
2074
2075#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            OnlyCastu8ToChar where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    OnlyCastu8ToChar { span: __binding_0, literal: __binding_1 }
                        => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("only `u8` can be cast into `char`")));
                        let __code_62 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("\'\\u{{{0:X}}}\'",
                                                        __binding_1))
                                            })].into_iter();
                        ;
                        diag.span_suggestions_with_style(__binding_0,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use a `char` literal instead")),
                            __code_62, rustc_errors::Applicability::MachineApplicable,
                            rustc_errors::SuggestionStyle::ShowCode);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2076#[diag("only `u8` can be cast into `char`")]
2077pub(crate) struct OnlyCastu8ToChar {
2078    #[suggestion(
2079        "use a `char` literal instead",
2080        code = "'\\u{{{literal:X}}}'",
2081        applicability = "machine-applicable"
2082    )]
2083    pub span: Span,
2084    pub literal: u128,
2085}
2086
2087#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            OverflowingUInt<'a> where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    OverflowingUInt {
                        ty: __binding_0,
                        lit: __binding_1,
                        min: __binding_2,
                        max: __binding_3 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("literal out of range for `{$ty}`")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the literal `{$lit}` does not fit into the type `{$ty}` whose range is `{$min}..={$max}`")));
                        ;
                        diag.arg("ty", __binding_0);
                        diag.arg("lit", __binding_1);
                        diag.arg("min", __binding_2);
                        diag.arg("max", __binding_3);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2088#[diag("literal out of range for `{$ty}`")]
2089#[note("the literal `{$lit}` does not fit into the type `{$ty}` whose range is `{$min}..={$max}`")]
2090pub(crate) struct OverflowingUInt<'a> {
2091    pub ty: &'a str,
2092    pub lit: String,
2093    pub min: u128,
2094    pub max: u128,
2095}
2096
2097#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            OverflowingLiteral<'a> where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    OverflowingLiteral { ty: __binding_0, lit: __binding_1 } =>
                        {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("literal out of range for `{$ty}`")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the literal `{$lit}` does not fit into the type `{$ty}` and will be converted to `{$ty}::INFINITY`")));
                        ;
                        diag.arg("ty", __binding_0);
                        diag.arg("lit", __binding_1);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2098#[diag("literal out of range for `{$ty}`")]
2099#[note(
2100    "the literal `{$lit}` does not fit into the type `{$ty}` and will be converted to `{$ty}::INFINITY`"
2101)]
2102pub(crate) struct OverflowingLiteral<'a> {
2103    pub ty: &'a str,
2104    pub lit: String,
2105}
2106
2107#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            SurrogateCharCast where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    SurrogateCharCast { literal: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("surrogate values are not valid for `char`")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`0xD800..=0xDFFF` are reserved for Unicode surrogates and are not valid `char` values")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2108#[diag("surrogate values are not valid for `char`")]
2109#[note("`0xD800..=0xDFFF` are reserved for Unicode surrogates and are not valid `char` values")]
2110pub(crate) struct SurrogateCharCast {
2111    pub literal: u128,
2112}
2113
2114#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            TooLargeCharCast where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    TooLargeCharCast { literal: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("value exceeds maximum `char` value")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("maximum valid `char` value is `0x10FFFF`")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2115#[diag("value exceeds maximum `char` value")]
2116#[note("maximum valid `char` value is `0x10FFFF`")]
2117pub(crate) struct TooLargeCharCast {
2118    pub literal: u128,
2119}
2120
2121#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            UsesPowerAlignment where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    UsesPowerAlignment => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("repr(C) does not follow the power alignment rule. This may affect platform C ABI compatibility for this type")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2122#[diag(
2123    "repr(C) does not follow the power alignment rule. This may affect platform C ABI compatibility for this type"
2124)]
2125pub(crate) struct UsesPowerAlignment;
2126
2127#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            UnusedComparisons where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    UnusedComparisons => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("comparison is useless due to type limits")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2128#[diag("comparison is useless due to type limits")]
2129pub(crate) struct UnusedComparisons;
2130
2131#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            InvalidNanComparisons where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    InvalidNanComparisons::EqNe { suggestion: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("incorrect NaN comparison, NaN cannot be directly compared to itself")));
                        ;
                        diag.subdiagnostic(__binding_0);
                        diag
                    }
                    InvalidNanComparisons::LtLeGtGe => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("incorrect NaN comparison, NaN is not orderable")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2132pub(crate) enum InvalidNanComparisons {
2133    #[diag("incorrect NaN comparison, NaN cannot be directly compared to itself")]
2134    EqNe {
2135        #[subdiagnostic]
2136        suggestion: InvalidNanComparisonsSuggestion,
2137    },
2138    #[diag("incorrect NaN comparison, NaN is not orderable")]
2139    LtLeGtGe,
2140}
2141
2142#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for InvalidNanComparisonsSuggestion {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    InvalidNanComparisonsSuggestion::Spanful {
                        neg: __binding_0,
                        float: __binding_1,
                        nan_plus_binop: __binding_2 } => {
                        let mut suggestions = Vec::new();
                        let __code_63 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("!"))
                                });
                        let __code_64 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!(".is_nan()"))
                                });
                        let __code_65 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!(""))
                                });
                        if let Some(__binding_0) = __binding_0 {
                            suggestions.push((__binding_0, __code_63));
                        }
                        suggestions.push((__binding_1, __code_64));
                        suggestions.push((__binding_2, __code_65));
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `f32::is_nan()` or `f64::is_nan()` instead")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            rustc_errors::Applicability::MachineApplicable,
                            rustc_errors::SuggestionStyle::ShowAlways);
                    }
                    InvalidNanComparisonsSuggestion::Spanless => {
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `f32::is_nan()` or `f64::is_nan()` instead")),
                                &sub_args);
                        diag.help(__message);
                    }
                }
            }
        }
    };Subdiagnostic)]
2143pub(crate) enum InvalidNanComparisonsSuggestion {
2144    #[multipart_suggestion(
2145        "use `f32::is_nan()` or `f64::is_nan()` instead",
2146        style = "verbose",
2147        applicability = "machine-applicable"
2148    )]
2149    Spanful {
2150        #[suggestion_part(code = "!")]
2151        neg: Option<Span>,
2152        #[suggestion_part(code = ".is_nan()")]
2153        float: Span,
2154        #[suggestion_part(code = "")]
2155        nan_plus_binop: Span,
2156    },
2157    #[help("use `f32::is_nan()` or `f64::is_nan()` instead")]
2158    Spanless,
2159}
2160
2161#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            AmbiguousWidePointerComparisons<'a> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    AmbiguousWidePointerComparisons::SpanfulEq {
                        addr_suggestion: __binding_0,
                        addr_metadata_suggestion: __binding_1 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("ambiguous wide pointer comparison, the comparison includes metadata which may not be expected")));
                        ;
                        diag.subdiagnostic(__binding_0);
                        if let Some(__binding_1) = __binding_1 {
                            diag.subdiagnostic(__binding_1);
                        }
                        diag
                    }
                    AmbiguousWidePointerComparisons::SpanfulCmp {
                        cast_suggestion: __binding_0, expect_suggestion: __binding_1
                        } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("ambiguous wide pointer comparison, the comparison includes metadata which may not be expected")));
                        ;
                        diag.subdiagnostic(__binding_0);
                        diag.subdiagnostic(__binding_1);
                        diag
                    }
                    AmbiguousWidePointerComparisons::Spanless => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("ambiguous wide pointer comparison, the comparison includes metadata which may not be expected")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use explicit `std::ptr::eq` method to compare metadata and addresses")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `std::ptr::addr_eq` or untyped pointers to only compare their addresses")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2162pub(crate) enum AmbiguousWidePointerComparisons<'a> {
2163    #[diag(
2164        "ambiguous wide pointer comparison, the comparison includes metadata which may not be expected"
2165    )]
2166    SpanfulEq {
2167        #[subdiagnostic]
2168        addr_suggestion: AmbiguousWidePointerComparisonsAddrSuggestion<'a>,
2169        #[subdiagnostic]
2170        addr_metadata_suggestion: Option<AmbiguousWidePointerComparisonsAddrMetadataSuggestion<'a>>,
2171    },
2172    #[diag(
2173        "ambiguous wide pointer comparison, the comparison includes metadata which may not be expected"
2174    )]
2175    SpanfulCmp {
2176        #[subdiagnostic]
2177        cast_suggestion: AmbiguousWidePointerComparisonsCastSuggestion<'a>,
2178        #[subdiagnostic]
2179        expect_suggestion: AmbiguousWidePointerComparisonsExpectSuggestion<'a>,
2180    },
2181    #[diag(
2182        "ambiguous wide pointer comparison, the comparison includes metadata which may not be expected"
2183    )]
2184    #[help("use explicit `std::ptr::eq` method to compare metadata and addresses")]
2185    #[help("use `std::ptr::addr_eq` or untyped pointers to only compare their addresses")]
2186    Spanless,
2187}
2188
2189#[derive(const _: () =
    {
        impl<'a> rustc_errors::Subdiagnostic for
            AmbiguousWidePointerComparisonsAddrMetadataSuggestion<'a> {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    AmbiguousWidePointerComparisonsAddrMetadataSuggestion {
                        ne: __binding_0,
                        deref_left: __binding_1,
                        deref_right: __binding_2,
                        l_modifiers: __binding_3,
                        r_modifiers: __binding_4,
                        left: __binding_5,
                        middle: __binding_6,
                        right: __binding_7 } => {
                        let mut suggestions = Vec::new();
                        let __code_66 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("{1}std::ptr::eq({0}",
                                            __binding_1, __binding_0))
                                });
                        let __code_67 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("{1}, {0}", __binding_2,
                                            __binding_3))
                                });
                        let __code_68 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("{0})", __binding_4))
                                });
                        suggestions.push((__binding_5, __code_66));
                        suggestions.push((__binding_6, __code_67));
                        suggestions.push((__binding_7, __code_68));
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use explicit `std::ptr::eq` method to compare metadata and addresses")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowAlways);
                    }
                }
            }
        }
    };Subdiagnostic)]
2190#[multipart_suggestion(
2191    "use explicit `std::ptr::eq` method to compare metadata and addresses",
2192    style = "verbose",
2193    // FIXME(#53934): make machine-applicable again
2194    applicability = "maybe-incorrect"
2195)]
2196pub(crate) struct AmbiguousWidePointerComparisonsAddrMetadataSuggestion<'a> {
2197    pub ne: &'a str,
2198    pub deref_left: &'a str,
2199    pub deref_right: &'a str,
2200    pub l_modifiers: &'a str,
2201    pub r_modifiers: &'a str,
2202    #[suggestion_part(code = "{ne}std::ptr::eq({deref_left}")]
2203    pub left: Span,
2204    #[suggestion_part(code = "{l_modifiers}, {deref_right}")]
2205    pub middle: Span,
2206    #[suggestion_part(code = "{r_modifiers})")]
2207    pub right: Span,
2208}
2209
2210#[derive(const _: () =
    {
        impl<'a> rustc_errors::Subdiagnostic for
            AmbiguousWidePointerComparisonsAddrSuggestion<'a> {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    AmbiguousWidePointerComparisonsAddrSuggestion {
                        ne: __binding_0,
                        deref_left: __binding_1,
                        deref_right: __binding_2,
                        l_modifiers: __binding_3,
                        r_modifiers: __binding_4,
                        left: __binding_5,
                        middle: __binding_6,
                        right: __binding_7 } => {
                        let mut suggestions = Vec::new();
                        let __code_69 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("{1}std::ptr::addr_eq({0}",
                                            __binding_1, __binding_0))
                                });
                        let __code_70 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("{1}, {0}", __binding_2,
                                            __binding_3))
                                });
                        let __code_71 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("{0})", __binding_4))
                                });
                        suggestions.push((__binding_5, __code_69));
                        suggestions.push((__binding_6, __code_70));
                        suggestions.push((__binding_7, __code_71));
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `std::ptr::addr_eq` or untyped pointers to only compare their addresses")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowAlways);
                    }
                }
            }
        }
    };Subdiagnostic)]
2211#[multipart_suggestion(
2212    "use `std::ptr::addr_eq` or untyped pointers to only compare their addresses",
2213    style = "verbose",
2214    // FIXME(#53934): make machine-applicable again
2215    applicability = "maybe-incorrect"
2216)]
2217pub(crate) struct AmbiguousWidePointerComparisonsAddrSuggestion<'a> {
2218    pub(crate) ne: &'a str,
2219    pub(crate) deref_left: &'a str,
2220    pub(crate) deref_right: &'a str,
2221    pub(crate) l_modifiers: &'a str,
2222    pub(crate) r_modifiers: &'a str,
2223    #[suggestion_part(code = "{ne}std::ptr::addr_eq({deref_left}")]
2224    pub(crate) left: Span,
2225    #[suggestion_part(code = "{l_modifiers}, {deref_right}")]
2226    pub(crate) middle: Span,
2227    #[suggestion_part(code = "{r_modifiers})")]
2228    pub(crate) right: Span,
2229}
2230
2231#[derive(const _: () =
    {
        impl<'a> rustc_errors::Subdiagnostic for
            AmbiguousWidePointerComparisonsCastSuggestion<'a> {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    AmbiguousWidePointerComparisonsCastSuggestion {
                        deref_left: __binding_0,
                        deref_right: __binding_1,
                        paren_left: __binding_2,
                        paren_right: __binding_3,
                        l_modifiers: __binding_4,
                        r_modifiers: __binding_5,
                        left_before: __binding_6,
                        left_after: __binding_7,
                        right_before: __binding_8,
                        right_after: __binding_9 } => {
                        let mut suggestions = Vec::new();
                        let __code_72 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("({0}", __binding_0))
                                });
                        let __code_73 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("{0}{1}.cast::<()>()",
                                            __binding_4, __binding_2))
                                });
                        let __code_74 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("({0}", __binding_1))
                                });
                        let __code_75 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("{1}{0}.cast::<()>()",
                                            __binding_3, __binding_5))
                                });
                        if let Some(__binding_6) = __binding_6 {
                            suggestions.push((__binding_6, __code_72));
                        }
                        suggestions.push((__binding_7, __code_73));
                        if let Some(__binding_8) = __binding_8 {
                            suggestions.push((__binding_8, __code_74));
                        }
                        suggestions.push((__binding_9, __code_75));
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use untyped pointers to only compare their addresses")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowAlways);
                    }
                }
            }
        }
    };Subdiagnostic)]
2232#[multipart_suggestion(
2233    "use untyped pointers to only compare their addresses",
2234    style = "verbose",
2235    // FIXME(#53934): make machine-applicable again
2236    applicability = "maybe-incorrect"
2237)]
2238pub(crate) struct AmbiguousWidePointerComparisonsCastSuggestion<'a> {
2239    pub(crate) deref_left: &'a str,
2240    pub(crate) deref_right: &'a str,
2241    pub(crate) paren_left: &'a str,
2242    pub(crate) paren_right: &'a str,
2243    pub(crate) l_modifiers: &'a str,
2244    pub(crate) r_modifiers: &'a str,
2245    #[suggestion_part(code = "({deref_left}")]
2246    pub(crate) left_before: Option<Span>,
2247    #[suggestion_part(code = "{l_modifiers}{paren_left}.cast::<()>()")]
2248    pub(crate) left_after: Span,
2249    #[suggestion_part(code = "({deref_right}")]
2250    pub(crate) right_before: Option<Span>,
2251    #[suggestion_part(code = "{r_modifiers}{paren_right}.cast::<()>()")]
2252    pub(crate) right_after: Span,
2253}
2254
2255#[derive(const _: () =
    {
        impl<'a> rustc_errors::Subdiagnostic for
            AmbiguousWidePointerComparisonsExpectSuggestion<'a> {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    AmbiguousWidePointerComparisonsExpectSuggestion {
                        paren_left: __binding_0,
                        paren_right: __binding_1,
                        before: __binding_2,
                        after: __binding_3 } => {
                        let mut suggestions = Vec::new();
                        let __code_76 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("{{ #[expect(ambiguous_wide_pointer_comparisons, reason = \"...\")] {0}",
                                            __binding_0))
                                });
                        let __code_77 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("{0} }}", __binding_1))
                                });
                        suggestions.push((__binding_2, __code_76));
                        suggestions.push((__binding_3, __code_77));
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("or expect the lint to compare the pointers metadata and addresses")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowAlways);
                    }
                }
            }
        }
    };Subdiagnostic)]
2256#[multipart_suggestion(
2257    "or expect the lint to compare the pointers metadata and addresses",
2258    style = "verbose",
2259    // FIXME(#53934): make machine-applicable again
2260    applicability = "maybe-incorrect"
2261)]
2262pub(crate) struct AmbiguousWidePointerComparisonsExpectSuggestion<'a> {
2263    pub(crate) paren_left: &'a str,
2264    pub(crate) paren_right: &'a str,
2265    // FIXME(#127436): Adjust once resolved
2266    #[suggestion_part(
2267        code = r#"{{ #[expect(ambiguous_wide_pointer_comparisons, reason = "...")] {paren_left}"#
2268    )]
2269    pub(crate) before: Span,
2270    #[suggestion_part(code = "{paren_right} }}")]
2271    pub(crate) after: Span,
2272}
2273
2274#[derive(const _: () =
    {
        impl<'_sess, 'a, 'tcx, G> rustc_errors::Diagnostic<'_sess, G> for
            UnpredictableFunctionPointerComparisons<'a, 'tcx> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    UnpredictableFunctionPointerComparisons::Suggestion {
                        sugg: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("function pointer comparisons do not produce meaningful results since their addresses are not guaranteed to be unique")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the address of the same function can vary between different codegen units")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("furthermore, different functions could have the same address after being merged together")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("for more information visit <https://doc.rust-lang.org/nightly/core/ptr/fn.fn_addr_eq.html>")));
                        ;
                        diag.subdiagnostic(__binding_0);
                        diag
                    }
                    UnpredictableFunctionPointerComparisons::Warn => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("function pointer comparisons do not produce meaningful results since their addresses are not guaranteed to be unique")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the address of the same function can vary between different codegen units")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("furthermore, different functions could have the same address after being merged together")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("for more information visit <https://doc.rust-lang.org/nightly/core/ptr/fn.fn_addr_eq.html>")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2275pub(crate) enum UnpredictableFunctionPointerComparisons<'a, 'tcx> {
2276    #[diag(
2277        "function pointer comparisons do not produce meaningful results since their addresses are not guaranteed to be unique"
2278    )]
2279    #[note("the address of the same function can vary between different codegen units")]
2280    #[note(
2281        "furthermore, different functions could have the same address after being merged together"
2282    )]
2283    #[note(
2284        "for more information visit <https://doc.rust-lang.org/nightly/core/ptr/fn.fn_addr_eq.html>"
2285    )]
2286    Suggestion {
2287        #[subdiagnostic]
2288        sugg: UnpredictableFunctionPointerComparisonsSuggestion<'a, 'tcx>,
2289    },
2290    #[diag(
2291        "function pointer comparisons do not produce meaningful results since their addresses are not guaranteed to be unique"
2292    )]
2293    #[note("the address of the same function can vary between different codegen units")]
2294    #[note(
2295        "furthermore, different functions could have the same address after being merged together"
2296    )]
2297    #[note(
2298        "for more information visit <https://doc.rust-lang.org/nightly/core/ptr/fn.fn_addr_eq.html>"
2299    )]
2300    Warn,
2301}
2302
2303#[derive(const _: () =
    {
        impl<'a, 'tcx> rustc_errors::Subdiagnostic for
            UnpredictableFunctionPointerComparisonsSuggestion<'a, 'tcx> {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    UnpredictableFunctionPointerComparisonsSuggestion::FnAddrEq {
                        ne: __binding_0,
                        deref_left: __binding_1,
                        deref_right: __binding_2,
                        left: __binding_3,
                        middle: __binding_4,
                        right: __binding_5 } => {
                        let mut suggestions = Vec::new();
                        let __code_78 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("{1}std::ptr::fn_addr_eq({0}",
                                            __binding_1, __binding_0))
                                });
                        let __code_79 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!(", {0}", __binding_2))
                                });
                        let __code_80 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!(")"))
                                });
                        suggestions.push((__binding_3, __code_78));
                        suggestions.push((__binding_4, __code_79));
                        suggestions.push((__binding_5, __code_80));
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("refactor your code, or use `std::ptr::fn_addr_eq` to suppress the lint")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowAlways);
                    }
                    UnpredictableFunctionPointerComparisonsSuggestion::FnAddrEqWithCast {
                        ne: __binding_0,
                        deref_left: __binding_1,
                        deref_right: __binding_2,
                        fn_sig: __binding_3,
                        left: __binding_4,
                        middle: __binding_5,
                        right: __binding_6 } => {
                        let mut suggestions = Vec::new();
                        let __code_81 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("{1}std::ptr::fn_addr_eq({0}",
                                            __binding_1, __binding_0))
                                });
                        let __code_82 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!(", {0}", __binding_2))
                                });
                        let __code_83 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!(" as {0})", __binding_3))
                                });
                        suggestions.push((__binding_4, __code_81));
                        suggestions.push((__binding_5, __code_82));
                        suggestions.push((__binding_6, __code_83));
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("refactor your code, or use `std::ptr::fn_addr_eq` to suppress the lint")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowAlways);
                    }
                }
            }
        }
    };Subdiagnostic)]
2304pub(crate) enum UnpredictableFunctionPointerComparisonsSuggestion<'a, 'tcx> {
2305    #[multipart_suggestion(
2306        "refactor your code, or use `std::ptr::fn_addr_eq` to suppress the lint",
2307        style = "verbose",
2308        applicability = "maybe-incorrect"
2309    )]
2310    FnAddrEq {
2311        ne: &'a str,
2312        deref_left: &'a str,
2313        deref_right: &'a str,
2314        #[suggestion_part(code = "{ne}std::ptr::fn_addr_eq({deref_left}")]
2315        left: Span,
2316        #[suggestion_part(code = ", {deref_right}")]
2317        middle: Span,
2318        #[suggestion_part(code = ")")]
2319        right: Span,
2320    },
2321    #[multipart_suggestion(
2322        "refactor your code, or use `std::ptr::fn_addr_eq` to suppress the lint",
2323        style = "verbose",
2324        applicability = "maybe-incorrect"
2325    )]
2326    FnAddrEqWithCast {
2327        ne: &'a str,
2328        deref_left: &'a str,
2329        deref_right: &'a str,
2330        fn_sig: rustc_middle::ty::PolyFnSig<'tcx>,
2331        #[suggestion_part(code = "{ne}std::ptr::fn_addr_eq({deref_left}")]
2332        left: Span,
2333        #[suggestion_part(code = ", {deref_right}")]
2334        middle: Span,
2335        #[suggestion_part(code = " as {fn_sig})")]
2336        right: Span,
2337    },
2338}
2339
2340pub(crate) struct ImproperCTypes<'a> {
2341    pub ty: Ty<'a>,
2342    pub desc: &'a str,
2343    pub label: Span,
2344    pub help: Option<DiagMessage>,
2345    pub note: DiagMessage,
2346    pub span_note: Option<Span>,
2347}
2348
2349// Used because of the complexity of Option<DiagMessage>, DiagMessage, and Option<Span>
2350impl<'a> Diagnostic<'a, ()> for ImproperCTypes<'_> {
2351    fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, ()> {
2352        let mut diag = Diag::new(
2353            dcx,
2354            level,
2355            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`extern` {$desc} uses type `{$ty}`, which is not FFI-safe"))msg!("`extern` {$desc} uses type `{$ty}`, which is not FFI-safe"),
2356        )
2357        .with_arg("ty", self.ty)
2358        .with_arg("desc", self.desc)
2359        .with_span_label(self.label, rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("not FFI-safe"))msg!("not FFI-safe"));
2360        if let Some(help) = self.help {
2361            diag.help(help);
2362        }
2363        diag.note(self.note);
2364        if let Some(note) = self.span_note {
2365            diag.span_note(note, rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the type is defined here"))msg!("the type is defined here"));
2366        }
2367        diag
2368    }
2369}
2370
2371#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            ImproperGpuKernelArg<'a> where G: rustc_errors::EmissionGuarantee
            {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    ImproperGpuKernelArg { ty: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("passing type `{$ty}` to a function with \"gpu-kernel\" ABI may have unexpected behavior")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use primitive types and raw pointers to get reliable behavior")));
                        ;
                        diag.arg("ty", __binding_0);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2372#[diag("passing type `{$ty}` to a function with \"gpu-kernel\" ABI may have unexpected behavior")]
2373#[help("use primitive types and raw pointers to get reliable behavior")]
2374pub(crate) struct ImproperGpuKernelArg<'a> {
2375    pub ty: Ty<'a>,
2376}
2377
2378#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            MissingGpuKernelExportName where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    MissingGpuKernelExportName => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("function with the \"gpu-kernel\" ABI has a mangled name")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `unsafe(no_mangle)` or `unsafe(export_name = \"<name>\")`")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("mangled names make it hard to find the kernel, this is usually not intended")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2379#[diag("function with the \"gpu-kernel\" ABI has a mangled name")]
2380#[help("use `unsafe(no_mangle)` or `unsafe(export_name = \"<name>\")`")]
2381#[note("mangled names make it hard to find the kernel, this is usually not intended")]
2382pub(crate) struct MissingGpuKernelExportName;
2383
2384#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            VariantSizeDifferencesDiag where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    VariantSizeDifferencesDiag { largest: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("enum variant is more than three times larger ({$largest} bytes) than the next largest")));
                        ;
                        diag.arg("largest", __binding_0);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2385#[diag("enum variant is more than three times larger ({$largest} bytes) than the next largest")]
2386pub(crate) struct VariantSizeDifferencesDiag {
2387    pub largest: u64,
2388}
2389
2390#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            AtomicOrderingLoad where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    AtomicOrderingLoad => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("atomic loads cannot have `Release` or `AcqRel` ordering")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("consider using ordering modes `Acquire`, `SeqCst` or `Relaxed`")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2391#[diag("atomic loads cannot have `Release` or `AcqRel` ordering")]
2392#[help("consider using ordering modes `Acquire`, `SeqCst` or `Relaxed`")]
2393pub(crate) struct AtomicOrderingLoad;
2394
2395#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            AtomicOrderingStore where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    AtomicOrderingStore => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("atomic stores cannot have `Acquire` or `AcqRel` ordering")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("consider using ordering modes `Release`, `SeqCst` or `Relaxed`")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2396#[diag("atomic stores cannot have `Acquire` or `AcqRel` ordering")]
2397#[help("consider using ordering modes `Release`, `SeqCst` or `Relaxed`")]
2398pub(crate) struct AtomicOrderingStore;
2399
2400#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            AtomicOrderingFence where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    AtomicOrderingFence => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("memory fences cannot have `Relaxed` ordering")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("consider using ordering modes `Acquire`, `Release`, `AcqRel` or `SeqCst`")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2401#[diag("memory fences cannot have `Relaxed` ordering")]
2402#[help("consider using ordering modes `Acquire`, `Release`, `AcqRel` or `SeqCst`")]
2403pub(crate) struct AtomicOrderingFence;
2404
2405#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            InvalidAtomicOrderingDiag where G: rustc_errors::EmissionGuarantee
            {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    InvalidAtomicOrderingDiag {
                        method: __binding_0, fail_order_arg_span: __binding_1 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`{$method}`'s failure ordering may not be `Release` or `AcqRel`, since a failed `{$method}` does not result in a write")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("consider using `Acquire` or `Relaxed` failure ordering instead")));
                        ;
                        diag.arg("method", __binding_0);
                        diag.span_label(__binding_1,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("invalid failure ordering")));
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2406#[diag(
2407    "`{$method}`'s failure ordering may not be `Release` or `AcqRel`, since a failed `{$method}` does not result in a write"
2408)]
2409#[help("consider using `Acquire` or `Relaxed` failure ordering instead")]
2410pub(crate) struct InvalidAtomicOrderingDiag {
2411    pub method: Symbol,
2412    #[label("invalid failure ordering")]
2413    pub fail_order_arg_span: Span,
2414}
2415
2416// unused.rs
2417#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            UnusedOp<'a> where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    UnusedOp {
                        op: __binding_0, label: __binding_1, suggestion: __binding_2
                        } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("unused {$op} that must be used")));
                        ;
                        diag.arg("op", __binding_0);
                        diag.span_label(__binding_1,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the {$op} produces a value")));
                        diag.subdiagnostic(__binding_2);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2418#[diag("unused {$op} that must be used")]
2419pub(crate) struct UnusedOp<'a> {
2420    pub op: &'a str,
2421    #[label("the {$op} produces a value")]
2422    pub label: Span,
2423    #[subdiagnostic]
2424    pub suggestion: UnusedOpSuggestion,
2425}
2426
2427#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for UnusedOpSuggestion {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    UnusedOpSuggestion::NormalExpr { span: __binding_0 } => {
                        let __code_84 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("let _ = "))
                                            })].into_iter();
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `let _ = ...` to ignore the resulting value")),
                                &sub_args);
                        diag.span_suggestions_with_style(__binding_0, __message,
                            __code_84, rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowAlways);
                    }
                    UnusedOpSuggestion::BlockTailExpr {
                        before_span: __binding_0, after_span: __binding_1 } => {
                        let mut suggestions = Vec::new();
                        let __code_85 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("let _ = "))
                                });
                        let __code_86 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!(";"))
                                });
                        suggestions.push((__binding_0, __code_85));
                        suggestions.push((__binding_1, __code_86));
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `let _ = ...` to ignore the resulting value")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowAlways);
                    }
                }
            }
        }
    };Subdiagnostic)]
2428pub(crate) enum UnusedOpSuggestion {
2429    #[suggestion(
2430        "use `let _ = ...` to ignore the resulting value",
2431        style = "verbose",
2432        code = "let _ = ",
2433        applicability = "maybe-incorrect"
2434    )]
2435    NormalExpr {
2436        #[primary_span]
2437        span: Span,
2438    },
2439    #[multipart_suggestion(
2440        "use `let _ = ...` to ignore the resulting value",
2441        style = "verbose",
2442        applicability = "maybe-incorrect"
2443    )]
2444    BlockTailExpr {
2445        #[suggestion_part(code = "let _ = ")]
2446        before_span: Span,
2447        #[suggestion_part(code = ";")]
2448        after_span: Span,
2449    },
2450}
2451
2452#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            UnusedResult<'a> where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    UnusedResult { ty: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("unused result of type `{$ty}`")));
                        ;
                        diag.arg("ty", __binding_0);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2453#[diag("unused result of type `{$ty}`")]
2454pub(crate) struct UnusedResult<'a> {
2455    pub ty: Ty<'a>,
2456}
2457
2458// FIXME(davidtwco): this isn't properly translatable because of the
2459// pre/post strings
2460#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            UnusedClosure<'a> where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    UnusedClosure {
                        count: __binding_0, pre: __binding_1, post: __binding_2 } =>
                        {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("unused {$pre}{$count ->\n        [one] closure\n        *[other] closures\n    }{$post} that must be used")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("closures are lazy and do nothing unless called")));
                        ;
                        diag.arg("count", __binding_0);
                        diag.arg("pre", __binding_1);
                        diag.arg("post", __binding_2);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2461#[diag(
2462    "unused {$pre}{$count ->
2463        [one] closure
2464        *[other] closures
2465    }{$post} that must be used"
2466)]
2467#[note("closures are lazy and do nothing unless called")]
2468pub(crate) struct UnusedClosure<'a> {
2469    pub count: usize,
2470    pub pre: &'a str,
2471    pub post: &'a str,
2472}
2473
2474// FIXME(davidtwco): this isn't properly translatable because of the
2475// pre/post strings
2476#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            UnusedCoroutine<'a> where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    UnusedCoroutine {
                        count: __binding_0, pre: __binding_1, post: __binding_2 } =>
                        {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("unused {$pre}{$count ->\n        [one] coroutine\n        *[other] coroutine\n    }{$post} that must be used")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("coroutines are lazy and do nothing unless resumed")));
                        ;
                        diag.arg("count", __binding_0);
                        diag.arg("pre", __binding_1);
                        diag.arg("post", __binding_2);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2477#[diag(
2478    "unused {$pre}{$count ->
2479        [one] coroutine
2480        *[other] coroutine
2481    }{$post} that must be used"
2482)]
2483#[note("coroutines are lazy and do nothing unless resumed")]
2484pub(crate) struct UnusedCoroutine<'a> {
2485    pub count: usize,
2486    pub pre: &'a str,
2487    pub post: &'a str,
2488}
2489
2490// FIXME(davidtwco): this isn't properly translatable because of the pre/post
2491// strings
2492pub(crate) struct UnusedDef<'a, 'b> {
2493    pub pre: &'a str,
2494    pub post: &'a str,
2495    pub cx: &'a LateContext<'b>,
2496    pub def_id: DefId,
2497    pub note: Option<Symbol>,
2498    pub suggestion: Option<UnusedDefSuggestion>,
2499}
2500
2501#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for UnusedDefSuggestion {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    UnusedDefSuggestion::NormalExpr { span: __binding_0 } => {
                        let __code_87 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("let _ = "))
                                            })].into_iter();
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `let _ = ...` to ignore the resulting value")),
                                &sub_args);
                        diag.span_suggestions_with_style(__binding_0, __message,
                            __code_87, rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowAlways);
                    }
                    UnusedDefSuggestion::BlockTailExpr {
                        before_span: __binding_0, after_span: __binding_1 } => {
                        let mut suggestions = Vec::new();
                        let __code_88 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("let _ = "))
                                });
                        let __code_89 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!(";"))
                                });
                        suggestions.push((__binding_0, __code_88));
                        suggestions.push((__binding_1, __code_89));
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `let _ = ...` to ignore the resulting value")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowAlways);
                    }
                }
            }
        }
    };Subdiagnostic)]
2502pub(crate) enum UnusedDefSuggestion {
2503    #[suggestion(
2504        "use `let _ = ...` to ignore the resulting value",
2505        style = "verbose",
2506        code = "let _ = ",
2507        applicability = "maybe-incorrect"
2508    )]
2509    NormalExpr {
2510        #[primary_span]
2511        span: Span,
2512    },
2513    #[multipart_suggestion(
2514        "use `let _ = ...` to ignore the resulting value",
2515        style = "verbose",
2516        applicability = "maybe-incorrect"
2517    )]
2518    BlockTailExpr {
2519        #[suggestion_part(code = "let _ = ")]
2520        before_span: Span,
2521        #[suggestion_part(code = ";")]
2522        after_span: Span,
2523    },
2524}
2525
2526// Needed because of def_path_str
2527impl<'a> Diagnostic<'a, ()> for UnusedDef<'_, '_> {
2528    fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, ()> {
2529        let mut diag =
2530            Diag::new(dcx, level, rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("unused {$pre}`{$def}`{$post} that must be used"))msg!("unused {$pre}`{$def}`{$post} that must be used"))
2531                .with_arg("pre", self.pre)
2532                .with_arg("post", self.post)
2533                .with_arg("def", self.cx.tcx.def_path_str(self.def_id));
2534        // check for #[must_use = "..."]
2535        if let Some(note) = self.note {
2536            diag.note(note.to_string());
2537        }
2538        if let Some(sugg) = self.suggestion {
2539            diag.subdiagnostic(sugg);
2540        }
2541        diag
2542    }
2543}
2544
2545#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            PathStatementDrop where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    PathStatementDrop { sub: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("path statement drops value")));
                        ;
                        diag.subdiagnostic(__binding_0);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2546#[diag("path statement drops value")]
2547pub(crate) struct PathStatementDrop {
2548    #[subdiagnostic]
2549    pub sub: PathStatementDropSub,
2550}
2551
2552#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for PathStatementDropSub {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    PathStatementDropSub::Suggestion {
                        span: __binding_0, snippet: __binding_1 } => {
                        let __code_90 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!("drop({0});",
                                                        __binding_1))
                                            })].into_iter();
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `drop` to clarify the intent")),
                                &sub_args);
                        diag.span_suggestions_with_style(__binding_0, __message,
                            __code_90, rustc_errors::Applicability::MachineApplicable,
                            rustc_errors::SuggestionStyle::ShowCode);
                    }
                    PathStatementDropSub::Help { span: __binding_0 } => {
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `drop` to clarify the intent")),
                                &sub_args);
                        diag.span_help(__binding_0, __message);
                    }
                }
            }
        }
    };Subdiagnostic)]
2553pub(crate) enum PathStatementDropSub {
2554    #[suggestion(
2555        "use `drop` to clarify the intent",
2556        code = "drop({snippet});",
2557        applicability = "machine-applicable"
2558    )]
2559    Suggestion {
2560        #[primary_span]
2561        span: Span,
2562        snippet: String,
2563    },
2564    #[help("use `drop` to clarify the intent")]
2565    Help {
2566        #[primary_span]
2567        span: Span,
2568    },
2569}
2570
2571#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            PathStatementNoEffect where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    PathStatementNoEffect => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("path statement with no effect")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2572#[diag("path statement with no effect")]
2573pub(crate) struct PathStatementNoEffect;
2574
2575#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            UnusedDelim<'a> where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    UnusedDelim {
                        delim: __binding_0,
                        item: __binding_1,
                        suggestion: __binding_2 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("unnecessary {$delim} around {$item}")));
                        ;
                        diag.arg("delim", __binding_0);
                        diag.arg("item", __binding_1);
                        if let Some(__binding_2) = __binding_2 {
                            diag.subdiagnostic(__binding_2);
                        }
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2576#[diag("unnecessary {$delim} around {$item}")]
2577pub(crate) struct UnusedDelim<'a> {
2578    pub delim: &'static str,
2579    pub item: &'a str,
2580    #[subdiagnostic]
2581    pub suggestion: Option<UnusedDelimSuggestion>,
2582}
2583
2584#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for UnusedDelimSuggestion {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    UnusedDelimSuggestion {
                        start_span: __binding_0,
                        start_replace: __binding_1,
                        end_span: __binding_2,
                        end_replace: __binding_3,
                        delim: __binding_4 } => {
                        let mut suggestions = Vec::new();
                        let __code_91 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("{0}", __binding_1))
                                });
                        let __code_92 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("{0}", __binding_3))
                                });
                        suggestions.push((__binding_0, __code_91));
                        suggestions.push((__binding_2, __code_92));
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        sub_args.insert("delim".into(),
                            rustc_errors::IntoDiagArg::into_diag_arg(__binding_4,
                                &mut diag.long_ty_path));
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("remove these {$delim}")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            rustc_errors::Applicability::MachineApplicable,
                            rustc_errors::SuggestionStyle::ShowCode);
                    }
                }
            }
        }
    };Subdiagnostic)]
2585#[multipart_suggestion("remove these {$delim}", applicability = "machine-applicable")]
2586pub(crate) struct UnusedDelimSuggestion {
2587    #[suggestion_part(code = "{start_replace}")]
2588    pub start_span: Span,
2589    pub start_replace: &'static str,
2590    #[suggestion_part(code = "{end_replace}")]
2591    pub end_span: Span,
2592    pub end_replace: &'static str,
2593    pub delim: &'static str,
2594}
2595
2596#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            UnusedImportBracesDiag where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    UnusedImportBracesDiag { node: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("braces around {$node} is unnecessary")));
                        ;
                        diag.arg("node", __binding_0);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2597#[diag("braces around {$node} is unnecessary")]
2598pub(crate) struct UnusedImportBracesDiag {
2599    pub node: Symbol,
2600}
2601
2602#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            UnusedAllocationDiag where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    UnusedAllocationDiag => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("unnecessary allocation, use `&` instead")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2603#[diag("unnecessary allocation, use `&` instead")]
2604pub(crate) struct UnusedAllocationDiag;
2605
2606#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            UnusedAllocationMutDiag where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    UnusedAllocationMutDiag => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("unnecessary allocation, use `&mut` instead")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2607#[diag("unnecessary allocation, use `&mut` instead")]
2608pub(crate) struct UnusedAllocationMutDiag;
2609
2610pub(crate) struct AsyncFnInTraitDiag {
2611    pub sugg: Option<Vec<(Span, String)>>,
2612}
2613
2614impl<'a> Diagnostic<'a, ()> for AsyncFnInTraitDiag {
2615    fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, ()> {
2616        let mut diag = Diag::new(
2617            dcx,
2618            level,
2619            "use of `async fn` in public traits is discouraged as auto trait bounds cannot be specified",
2620        );
2621        diag.note("you can suppress this lint if you plan to use the trait only in your own code, or do not care about auto traits like `Send` on the `Future`");
2622        if let Some(sugg) = self.sugg {
2623            diag.multipart_suggestion("you can alternatively desugar to a normal `fn` that returns `impl Future` and add any desired bounds such as `Send`, but these cannot be relaxed without a breaking API change", sugg, Applicability::MaybeIncorrect);
2624        }
2625        diag
2626    }
2627}
2628
2629#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            UnitBindingsDiag where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    UnitBindingsDiag { label: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("binding has unit type `()`")));
                        ;
                        diag.span_label(__binding_0,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this pattern is inferred to be the unit type `()`")));
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2630#[diag("binding has unit type `()`")]
2631pub(crate) struct UnitBindingsDiag {
2632    #[label("this pattern is inferred to be the unit type `()`")]
2633    pub label: Span,
2634}
2635
2636#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            InvalidAsmLabel where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    InvalidAsmLabel::Named { missing_precise_span: __binding_0 }
                        => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("avoid using named labels in inline assembly")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("only local labels of the form `<number>:` should be used in inline asm")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("see the asm section of Rust By Example <https://doc.rust-lang.org/nightly/rust-by-example/unsafe/asm.html#labels> for more information")));
                        ;
                        if __binding_0 {
                            diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the label may be declared in the expansion of a macro")));
                        }
                        diag
                    }
                    InvalidAsmLabel::FormatArg {
                        missing_precise_span: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("avoid using named labels in inline assembly")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("only local labels of the form `<number>:` should be used in inline asm")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("format arguments may expand to a non-numeric value")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("see the asm section of Rust By Example <https://doc.rust-lang.org/nightly/rust-by-example/unsafe/asm.html#labels> for more information")));
                        ;
                        if __binding_0 {
                            diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the label may be declared in the expansion of a macro")));
                        }
                        diag
                    }
                    InvalidAsmLabel::Binary {
                        missing_precise_span: __binding_0, span: __binding_1 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("avoid using labels containing only the digits `0` and `1` in inline assembly")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("start numbering with `2` instead")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("an LLVM bug makes these labels ambiguous with a binary literal number on x86")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("see <https://github.com/llvm/llvm-project/issues/99547> for more information")));
                        ;
                        if __binding_0 {
                            diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the label may be declared in the expansion of a macro")));
                        }
                        diag.span_label(__binding_1,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use a different label that doesn't start with `0` or `1`")));
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2637pub(crate) enum InvalidAsmLabel {
2638    #[diag("avoid using named labels in inline assembly")]
2639    #[help("only local labels of the form `<number>:` should be used in inline asm")]
2640    #[note(
2641        "see the asm section of Rust By Example <https://doc.rust-lang.org/nightly/rust-by-example/unsafe/asm.html#labels> for more information"
2642    )]
2643    Named {
2644        #[note("the label may be declared in the expansion of a macro")]
2645        missing_precise_span: bool,
2646    },
2647    #[diag("avoid using named labels in inline assembly")]
2648    #[help("only local labels of the form `<number>:` should be used in inline asm")]
2649    #[note("format arguments may expand to a non-numeric value")]
2650    #[note(
2651        "see the asm section of Rust By Example <https://doc.rust-lang.org/nightly/rust-by-example/unsafe/asm.html#labels> for more information"
2652    )]
2653    FormatArg {
2654        #[note("the label may be declared in the expansion of a macro")]
2655        missing_precise_span: bool,
2656    },
2657    #[diag("avoid using labels containing only the digits `0` and `1` in inline assembly")]
2658    #[help("start numbering with `2` instead")]
2659    #[note("an LLVM bug makes these labels ambiguous with a binary literal number on x86")]
2660    #[note("see <https://github.com/llvm/llvm-project/issues/99547> for more information")]
2661    Binary {
2662        #[note("the label may be declared in the expansion of a macro")]
2663        missing_precise_span: bool,
2664        // hack to get a label on the whole span, must match the emitted span
2665        #[label("use a different label that doesn't start with `0` or `1`")]
2666        span: Span,
2667    },
2668}
2669
2670#[derive(const _: () =
    {
        impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
            RefOfMutStatic<'a> where G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    RefOfMutStatic {
                        span: __binding_0,
                        sugg: __binding_1,
                        shared_label: __binding_2,
                        shared_note: __binding_3,
                        mut_note: __binding_4,
                        interior_mutability_help: __binding_5,
                        interior_mutability_sugg: __binding_6 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("creating a {$shared_label}reference to mutable static")));
                        ;
                        diag.arg("shared_label", __binding_2);
                        diag.span_label(__binding_0,
                            rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("{$shared_label}reference to mutable static")));
                        if let Some(__binding_1) = __binding_1 {
                            diag.subdiagnostic(__binding_1);
                        }
                        if __binding_3 {
                            diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("shared references to mutable statics are dangerous; it's undefined behavior if the static is mutated or if a mutable reference is created for it while the shared reference lives")));
                        }
                        if __binding_4 {
                            diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("mutable references to mutable statics are dangerous; it's undefined behavior if any other pointer to the static is used or if any other reference is created for the static while the mutable reference lives")));
                        }
                        if __binding_5 {
                            diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use a type that relies on \"interior mutability\" instead; to read more on this, visit <https://doc.rust-lang.org/reference/interior-mutability.html>")));
                        }
                        if let Some(__binding_6) = __binding_6 {
                            diag.subdiagnostic(__binding_6);
                        }
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2671#[diag("creating a {$shared_label}reference to mutable static")]
2672pub(crate) struct RefOfMutStatic<'a> {
2673    #[label("{$shared_label}reference to mutable static")]
2674    pub span: Span,
2675    #[subdiagnostic]
2676    pub sugg: Option<MutRefSugg>,
2677    pub shared_label: &'a str,
2678    #[note(
2679        "shared references to mutable statics are dangerous; it's undefined behavior if the static is mutated or if a mutable reference is created for it while the shared reference lives"
2680    )]
2681    pub shared_note: bool,
2682    #[note(
2683        "mutable references to mutable statics are dangerous; it's undefined behavior if any other pointer to the static is used or if any other reference is created for the static while the mutable reference lives"
2684    )]
2685    pub mut_note: bool,
2686    #[help(
2687        "use a type that relies on \"interior mutability\" instead; to read more on this, visit <https://doc.rust-lang.org/reference/interior-mutability.html>"
2688    )]
2689    pub interior_mutability_help: bool,
2690    #[subdiagnostic]
2691    pub interior_mutability_sugg: Option<StaticMutRefsInteriorMutabilitySugg>,
2692}
2693
2694#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for MutRefSugg {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    MutRefSugg::Shared { span: __binding_0 } => {
                        let mut suggestions = Vec::new();
                        let __code_93 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("&raw const "))
                                });
                        suggestions.push((__binding_0, __code_93));
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `&raw const` instead to create a raw pointer")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowAlways);
                    }
                    MutRefSugg::Mut { span: __binding_0 } => {
                        let mut suggestions = Vec::new();
                        let __code_94 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("&raw mut "))
                                });
                        suggestions.push((__binding_0, __code_94));
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `&raw mut` instead to create a raw pointer")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowAlways);
                    }
                }
            }
        }
    };Subdiagnostic)]
2695pub(crate) enum MutRefSugg {
2696    #[multipart_suggestion(
2697        "use `&raw const` instead to create a raw pointer",
2698        style = "verbose",
2699        applicability = "maybe-incorrect"
2700    )]
2701    Shared {
2702        #[suggestion_part(code = "&raw const ")]
2703        span: Span,
2704    },
2705    #[multipart_suggestion(
2706        "use `&raw mut` instead to create a raw pointer",
2707        style = "verbose",
2708        applicability = "maybe-incorrect"
2709    )]
2710    Mut {
2711        #[suggestion_part(code = "&raw mut ")]
2712        span: Span,
2713    },
2714}
2715
2716#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for
            StaticMutRefsInteriorMutabilitySugg {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    StaticMutRefsInteriorMutabilitySugg { span: __binding_0 } =>
                        {
                        let __code_95 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!(""))
                                            })].into_iter();
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this type already provides \"interior mutability\", so its binding doesn't need to be declared as mutable when borrowed with a shared reference")),
                                &sub_args);
                        diag.span_suggestions_with_style(__binding_0, __message,
                            __code_95, rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowAlways);
                    }
                }
            }
        }
    };Subdiagnostic)]
2717#[suggestion(
2718    "this type already provides \"interior mutability\", so its binding doesn't need to be declared as mutable when borrowed with a shared reference",
2719    style = "verbose",
2720    applicability = "maybe-incorrect",
2721    code = ""
2722)]
2723pub(crate) struct StaticMutRefsInteriorMutabilitySugg {
2724    #[primary_span]
2725    pub span: Span,
2726}
2727
2728#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            UnqualifiedLocalImportsDiag where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    UnqualifiedLocalImportsDiag => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`use` of a local item without leading `self::`, `super::`, or `crate::`")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2729#[diag("`use` of a local item without leading `self::`, `super::`, or `crate::`")]
2730pub(crate) struct UnqualifiedLocalImportsDiag;
2731
2732#[derive(const _: () =
    {
        impl<'_sess, 'tcx, G> rustc_errors::Diagnostic<'_sess, G> for
            FunctionCastsAsIntegerDiag<'tcx> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    FunctionCastsAsIntegerDiag { sugg: __binding_0 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("direct cast of function item into an integer")));
                        ;
                        diag.subdiagnostic(__binding_0);
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2733#[diag("direct cast of function item into an integer")]
2734pub(crate) struct FunctionCastsAsIntegerDiag<'tcx> {
2735    #[subdiagnostic]
2736    pub(crate) sugg: FunctionCastsAsIntegerSugg<'tcx>,
2737}
2738
2739#[derive(const _: () =
    {
        impl<'tcx> rustc_errors::Subdiagnostic for
            FunctionCastsAsIntegerSugg<'tcx> {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    FunctionCastsAsIntegerSugg {
                        suggestion: __binding_0, cast_to_ty: __binding_1 } => {
                        let __code_96 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!(" as *const ()"))
                                            })].into_iter();
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("first cast to a pointer `as *const ()`")),
                                &sub_args);
                        diag.span_suggestions_with_style(__binding_0, __message,
                            __code_96, rustc_errors::Applicability::MachineApplicable,
                            rustc_errors::SuggestionStyle::ShowAlways);
                    }
                }
            }
        }
    };Subdiagnostic)]
2740#[suggestion(
2741    "first cast to a pointer `as *const ()`",
2742    code = " as *const ()",
2743    applicability = "machine-applicable",
2744    style = "verbose"
2745)]
2746pub(crate) struct FunctionCastsAsIntegerSugg<'tcx> {
2747    #[primary_span]
2748    pub suggestion: Span,
2749    pub cast_to_ty: Ty<'tcx>,
2750}
2751
2752#[derive(#[automatically_derived]
impl ::core::fmt::Debug for MismatchedLifetimeSyntaxes {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f,
            "MismatchedLifetimeSyntaxes", "inputs", &self.inputs, "outputs",
            &self.outputs, "suggestions", &&self.suggestions)
    }
}Debug)]
2753pub(crate) struct MismatchedLifetimeSyntaxes {
2754    pub inputs: LifetimeSyntaxCategories<Vec<Span>>,
2755    pub outputs: LifetimeSyntaxCategories<Vec<Span>>,
2756
2757    pub suggestions: Vec<MismatchedLifetimeSyntaxesSuggestion>,
2758}
2759
2760impl<'a, G: EmissionGuarantee> Diagnostic<'a, G> for MismatchedLifetimeSyntaxes {
2761    fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, G> {
2762        let counts = self.inputs.len() + self.outputs.len();
2763        let message = match counts {
2764            LifetimeSyntaxCategories { hidden: 0, elided: 0, named: 0 } => {
2765                {
    ::core::panicking::panic_fmt(format_args!("No lifetime mismatch detected"));
}panic!("No lifetime mismatch detected")
2766            }
2767
2768            LifetimeSyntaxCategories { hidden: _, elided: _, named: 0 } => {
2769                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("hiding a lifetime that's elided elsewhere is confusing"))msg!("hiding a lifetime that's elided elsewhere is confusing")
2770            }
2771
2772            LifetimeSyntaxCategories { hidden: _, elided: 0, named: _ } => {
2773                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("hiding a lifetime that's named elsewhere is confusing"))msg!("hiding a lifetime that's named elsewhere is confusing")
2774            }
2775
2776            LifetimeSyntaxCategories { hidden: 0, elided: _, named: _ } => {
2777                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("eliding a lifetime that's named elsewhere is confusing"))msg!("eliding a lifetime that's named elsewhere is confusing")
2778            }
2779
2780            LifetimeSyntaxCategories { hidden: _, elided: _, named: _ } => {
2781                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("hiding or eliding a lifetime that's named elsewhere is confusing"))msg!("hiding or eliding a lifetime that's named elsewhere is confusing")
2782            }
2783        };
2784        let mut diag = Diag::new(dcx, level, message);
2785
2786        for s in self.inputs.hidden {
2787            diag.span_label(s, rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the lifetime is hidden here"))msg!("the lifetime is hidden here"));
2788        }
2789        for s in self.inputs.elided {
2790            diag.span_label(s, rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the lifetime is elided here"))msg!("the lifetime is elided here"));
2791        }
2792        for s in self.inputs.named {
2793            diag.span_label(s, rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the lifetime is named here"))msg!("the lifetime is named here"));
2794        }
2795
2796        let mut hidden_output_counts: FxIndexMap<Span, usize> = FxIndexMap::default();
2797        for s in self.outputs.hidden {
2798            *hidden_output_counts.entry(s).or_insert(0) += 1;
2799        }
2800        for (span, count) in hidden_output_counts {
2801            let label = rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the same {$count ->\n                    [one] lifetime\n                    *[other] lifetimes\n                } {$count ->\n                    [one] is\n                    *[other] are\n                } hidden here"))msg!(
2802                "the same {$count ->
2803                    [one] lifetime
2804                    *[other] lifetimes
2805                } {$count ->
2806                    [one] is
2807                    *[other] are
2808                } hidden here"
2809            )
2810            .arg("count", count)
2811            .format();
2812            diag.span_label(span, label);
2813        }
2814        for s in self.outputs.elided {
2815            diag.span_label(s, rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the same lifetime is elided here"))msg!("the same lifetime is elided here"));
2816        }
2817        for s in self.outputs.named {
2818            diag.span_label(s, rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the same lifetime is named here"))msg!("the same lifetime is named here"));
2819        }
2820
2821        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the same lifetime is referred to in inconsistent ways, making the signature confusing"))msg!(
2822            "the same lifetime is referred to in inconsistent ways, making the signature confusing"
2823        ));
2824
2825        let mut suggestions = self.suggestions.into_iter();
2826        if let Some(s) = suggestions.next() {
2827            diag.subdiagnostic(s);
2828
2829            for mut s in suggestions {
2830                s.make_optional_alternative();
2831                diag.subdiagnostic(s);
2832            }
2833        }
2834        diag
2835    }
2836}
2837
2838#[derive(#[automatically_derived]
impl ::core::fmt::Debug for MismatchedLifetimeSyntaxesSuggestion {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            MismatchedLifetimeSyntaxesSuggestion::Implicit {
                suggestions: __self_0, optional_alternative: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "Implicit", "suggestions", __self_0, "optional_alternative",
                    &__self_1),
            MismatchedLifetimeSyntaxesSuggestion::Mixed {
                implicit_suggestions: __self_0,
                explicit_anonymous_suggestions: __self_1,
                optional_alternative: __self_2 } =>
                ::core::fmt::Formatter::debug_struct_field3_finish(f, "Mixed",
                    "implicit_suggestions", __self_0,
                    "explicit_anonymous_suggestions", __self_1,
                    "optional_alternative", &__self_2),
            MismatchedLifetimeSyntaxesSuggestion::Explicit {
                lifetime_name: __self_0,
                suggestions: __self_1,
                optional_alternative: __self_2 } =>
                ::core::fmt::Formatter::debug_struct_field3_finish(f,
                    "Explicit", "lifetime_name", __self_0, "suggestions",
                    __self_1, "optional_alternative", &__self_2),
        }
    }
}Debug)]
2839pub(crate) enum MismatchedLifetimeSyntaxesSuggestion {
2840    Implicit {
2841        suggestions: Vec<Span>,
2842        optional_alternative: bool,
2843    },
2844
2845    Mixed {
2846        implicit_suggestions: Vec<Span>,
2847        explicit_anonymous_suggestions: Vec<(Span, String)>,
2848        optional_alternative: bool,
2849    },
2850
2851    Explicit {
2852        lifetime_name: String,
2853        suggestions: Vec<(Span, String)>,
2854        optional_alternative: bool,
2855    },
2856}
2857
2858impl MismatchedLifetimeSyntaxesSuggestion {
2859    fn make_optional_alternative(&mut self) {
2860        use MismatchedLifetimeSyntaxesSuggestion::*;
2861
2862        let optional_alternative = match self {
2863            Implicit { optional_alternative, .. }
2864            | Mixed { optional_alternative, .. }
2865            | Explicit { optional_alternative, .. } => optional_alternative,
2866        };
2867
2868        *optional_alternative = true;
2869    }
2870}
2871
2872impl Subdiagnostic for MismatchedLifetimeSyntaxesSuggestion {
2873    fn add_to_diag<G: EmissionGuarantee>(self, diag: &mut Diag<'_, G>) {
2874        use MismatchedLifetimeSyntaxesSuggestion::*;
2875
2876        let style = |optional_alternative| {
2877            if optional_alternative {
2878                SuggestionStyle::CompletelyHidden
2879            } else {
2880                SuggestionStyle::ShowAlways
2881            }
2882        };
2883
2884        let applicability = |optional_alternative| {
2885            // `cargo fix` can't handle more than one fix for the same issue,
2886            // so hide alternative suggestions from it by marking them as maybe-incorrect
2887            if optional_alternative {
2888                Applicability::MaybeIncorrect
2889            } else {
2890                Applicability::MachineApplicable
2891            }
2892        };
2893
2894        match self {
2895            Implicit { suggestions, optional_alternative } => {
2896                let suggestions = suggestions.into_iter().map(|s| (s, String::new())).collect();
2897                diag.multipart_suggestion_with_style(
2898                    rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("remove the lifetime name from references"))msg!("remove the lifetime name from references"),
2899                    suggestions,
2900                    applicability(optional_alternative),
2901                    style(optional_alternative),
2902                );
2903            }
2904
2905            Mixed {
2906                implicit_suggestions,
2907                explicit_anonymous_suggestions,
2908                optional_alternative,
2909            } => {
2910                let message = if implicit_suggestions.is_empty() {
2911                    rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `'_` for type paths"))msg!("use `'_` for type paths")
2912                } else {
2913                    rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("remove the lifetime name from references and use `'_` for type paths"))msg!("remove the lifetime name from references and use `'_` for type paths")
2914                };
2915
2916                let implicit_suggestions =
2917                    implicit_suggestions.into_iter().map(|s| (s, String::new()));
2918
2919                let suggestions =
2920                    implicit_suggestions.chain(explicit_anonymous_suggestions).collect();
2921
2922                diag.multipart_suggestion_with_style(
2923                    message,
2924                    suggestions,
2925                    applicability(optional_alternative),
2926                    style(optional_alternative),
2927                );
2928            }
2929
2930            Explicit { lifetime_name, suggestions, optional_alternative } => {
2931                let msg = rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("consistently use `{$lifetime_name}`"))msg!("consistently use `{$lifetime_name}`")
2932                    .arg("lifetime_name", lifetime_name)
2933                    .format();
2934                diag.multipart_suggestion_with_style(
2935                    msg,
2936                    suggestions,
2937                    applicability(optional_alternative),
2938                    style(optional_alternative),
2939                );
2940            }
2941        }
2942    }
2943}
2944
2945#[derive(const _: () =
    {
        impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
            EqInternalMethodImplemented where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    EqInternalMethodImplemented => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`Eq::assert_receiver_is_total_eq` should never be implemented by hand")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this method was used to add checks to the `Eq` derive macro")));
                        ;
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2946#[diag("`Eq::assert_receiver_is_total_eq` should never be implemented by hand")]
2947#[note("this method was used to add checks to the `Eq` derive macro")]
2948pub(crate) struct EqInternalMethodImplemented;
2949
2950#[derive(const _: () =
    {
        impl<'_sess, 'tcx, G> rustc_errors::Diagnostic<'_sess, G> for
            ImplicitProvenanceCastsInt2Ptr<'tcx> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    ImplicitProvenanceCastsInt2Ptr {
                        expr_ty: __binding_0,
                        cast_ty: __binding_1,
                        sugg: __binding_2 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("cast from `{$expr_ty}` to `{$cast_ty}` implicitly relies on exposed provenance")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("if conforming to strict provenance is not possible, use `std::ptr::with_exposed_provenance()`")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("for more information, visit <https://doc.rust-lang.org/std/ptr/index.html#provenance>")));
                        ;
                        diag.arg("expr_ty", __binding_0);
                        diag.arg("cast_ty", __binding_1);
                        if let Some(__binding_2) = __binding_2 {
                            diag.subdiagnostic(__binding_2);
                        }
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2951#[diag("cast from `{$expr_ty}` to `{$cast_ty}` implicitly relies on exposed provenance")]
2952#[help(
2953    "if conforming to strict provenance is not possible, use `std::ptr::with_exposed_provenance()`"
2954)]
2955#[note("for more information, visit <https://doc.rust-lang.org/std/ptr/index.html#provenance>")]
2956pub(crate) struct ImplicitProvenanceCastsInt2Ptr<'tcx> {
2957    pub expr_ty: Ty<'tcx>,
2958    pub cast_ty: Ty<'tcx>,
2959    #[subdiagnostic]
2960    pub sugg: Option<Int2PtrSuggestion>,
2961}
2962
2963#[derive(const _: () =
    {
        impl rustc_errors::Subdiagnostic for Int2PtrSuggestion {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    Int2PtrSuggestion { lo: __binding_0, hi: __binding_1 } => {
                        let mut suggestions = Vec::new();
                        let __code_97 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("(...).with_addr("))
                                });
                        let __code_98 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!(")"))
                                });
                        suggestions.push((__binding_0, __code_97));
                        suggestions.push((__binding_1, __code_98));
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `.with_addr()` to adjust the address of a valid pointer in the same allocation")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            rustc_errors::Applicability::HasPlaceholders,
                            rustc_errors::SuggestionStyle::ShowCode);
                    }
                }
            }
        }
    };Subdiagnostic)]
2964#[multipart_suggestion(
2965    "use `.with_addr()` to adjust the address of a valid pointer in the same allocation",
2966    applicability = "has-placeholders"
2967)]
2968pub(crate) struct Int2PtrSuggestion {
2969    #[suggestion_part(code = "(...).with_addr(")]
2970    pub lo: Span,
2971    #[suggestion_part(code = ")")]
2972    pub hi: Span,
2973}
2974
2975#[derive(const _: () =
    {
        impl<'_sess, 'tcx, G> rustc_errors::Diagnostic<'_sess, G> for
            ImplicitProvenanceCastsPtr2Int<'tcx> where
            G: rustc_errors::EmissionGuarantee {
            #[track_caller]
            fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
                level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
                match self {
                    ImplicitProvenanceCastsPtr2Int {
                        cast_from_ty: __binding_0,
                        cast_to_ty: __binding_1,
                        sugg: __binding_2 } => {
                        let mut diag =
                            rustc_errors::Diag::new(dcx, level,
                                rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("cast from `{$cast_from_ty}` to `{$cast_to_ty}` implicitly exposes pointer provenance")));
                        diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("if conforming to strict provenance is not possible, use `.expose_provenance()`")));
                        diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("for more information, visit <https://doc.rust-lang.org/std/ptr/index.html#provenance>")));
                        ;
                        diag.arg("cast_from_ty", __binding_0);
                        diag.arg("cast_to_ty", __binding_1);
                        if let Some(__binding_2) = __binding_2 {
                            diag.subdiagnostic(__binding_2);
                        }
                        diag
                    }
                }
            }
        }
    };Diagnostic)]
2976#[diag("cast from `{$cast_from_ty}` to `{$cast_to_ty}` implicitly exposes pointer provenance")]
2977#[help("if conforming to strict provenance is not possible, use `.expose_provenance()`")]
2978#[note("for more information, visit <https://doc.rust-lang.org/std/ptr/index.html#provenance>")]
2979pub(crate) struct ImplicitProvenanceCastsPtr2Int<'tcx> {
2980    pub cast_from_ty: Ty<'tcx>,
2981    pub cast_to_ty: Ty<'tcx>,
2982    #[subdiagnostic]
2983    pub sugg: Option<Ptr2IntSuggestion<'tcx>>,
2984}
2985
2986#[derive(const _: () =
    {
        impl<'tcx> rustc_errors::Subdiagnostic for Ptr2IntSuggestion<'tcx> {
            fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
                where __G: rustc_errors::EmissionGuarantee {
                match self {
                    Ptr2IntSuggestion::NeedsParensCast {
                        expr_span: __binding_0,
                        cast_span: __binding_1,
                        cast_to_ty: __binding_2 } => {
                        let mut suggestions = Vec::new();
                        let __code_99 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("("))
                                });
                        let __code_100 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!(").addr() as {0}",
                                            __binding_2))
                                });
                        suggestions.push((__binding_0, __code_99));
                        suggestions.push((__binding_1, __code_100));
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `.addr()` to obtain the address of a pointer")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowCode);
                    }
                    Ptr2IntSuggestion::NeedsParens {
                        expr_span: __binding_0, cast_span: __binding_1 } => {
                        let mut suggestions = Vec::new();
                        let __code_101 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!("("))
                                });
                        let __code_102 =
                            ::alloc::__export::must_use({
                                    ::alloc::fmt::format(format_args!(").addr()"))
                                });
                        suggestions.push((__binding_0, __code_101));
                        suggestions.push((__binding_1, __code_102));
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `.addr()` to obtain the address of a pointer")),
                                &sub_args);
                        diag.multipart_suggestion_with_style(__message, suggestions,
                            rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowCode);
                    }
                    Ptr2IntSuggestion::NeedsCast {
                        cast_span: __binding_0, cast_to_ty: __binding_1 } => {
                        let __code_103 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!(".addr() as {0}",
                                                        __binding_1))
                                            })].into_iter();
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `.addr()` to obtain the address of a pointer")),
                                &sub_args);
                        diag.span_suggestions_with_style(__binding_0, __message,
                            __code_103, rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowCode);
                    }
                    Ptr2IntSuggestion::Other { cast_span: __binding_0 } => {
                        let __code_104 =
                            [::alloc::__export::must_use({
                                                ::alloc::fmt::format(format_args!(".addr()"))
                                            })].into_iter();
                        let mut sub_args = rustc_errors::DiagArgMap::default();
                        let __message =
                            rustc_errors::format_diag_message(&rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `.addr()` to obtain the address of a pointer")),
                                &sub_args);
                        diag.span_suggestions_with_style(__binding_0, __message,
                            __code_104, rustc_errors::Applicability::MaybeIncorrect,
                            rustc_errors::SuggestionStyle::ShowCode);
                    }
                }
            }
        }
    };Subdiagnostic)]
2987pub(crate) enum Ptr2IntSuggestion<'tcx> {
2988    #[multipart_suggestion(
2989        "use `.addr()` to obtain the address of a pointer",
2990        applicability = "maybe-incorrect"
2991    )]
2992    NeedsParensCast {
2993        #[suggestion_part(code = "(")]
2994        expr_span: Span,
2995        #[suggestion_part(code = ").addr() as {cast_to_ty}")]
2996        cast_span: Span,
2997        cast_to_ty: Ty<'tcx>,
2998    },
2999    #[multipart_suggestion(
3000        "use `.addr()` to obtain the address of a pointer",
3001        applicability = "maybe-incorrect"
3002    )]
3003    NeedsParens {
3004        #[suggestion_part(code = "(")]
3005        expr_span: Span,
3006        #[suggestion_part(code = ").addr()")]
3007        cast_span: Span,
3008    },
3009    #[suggestion(
3010        "use `.addr()` to obtain the address of a pointer",
3011        code = ".addr() as {cast_to_ty}",
3012        applicability = "maybe-incorrect"
3013    )]
3014    NeedsCast {
3015        #[primary_span]
3016        cast_span: Span,
3017        cast_to_ty: Ty<'tcx>,
3018    },
3019    #[suggestion(
3020        "use `.addr()` to obtain the address of a pointer",
3021        code = ".addr()",
3022        applicability = "maybe-incorrect"
3023    )]
3024    Other {
3025        #[primary_span]
3026        cast_span: Span,
3027    },
3028}