Skip to main content

rustc_middle/ty/
mod.rs

1//! Defines how the compiler represents types internally.
2//!
3//! Two important entities in this module are:
4//!
5//! - [`rustc_middle::ty::Ty`], used to represent the semantics of a type.
6//! - [`rustc_middle::ty::TyCtxt`], the central data structure in the compiler.
7//!
8//! For more information, see ["The `ty` module: representing types"] in the rustc-dev-guide.
9//!
10//! ["The `ty` module: representing types"]: https://rustc-dev-guide.rust-lang.org/ty.html
11
12#![allow(rustc::usage_of_ty_tykind)]
13
14use std::cmp::Ordering;
15use std::fmt::Debug;
16use std::hash::{Hash, Hasher};
17use std::marker::PhantomData;
18use std::num::NonZero;
19use std::ptr::NonNull;
20use std::{assert_matches, fmt, iter, str};
21
22pub use adt::*;
23pub use assoc::*;
24pub use generic_args::{GenericArgKind, TermKind, *};
25pub use generics::*;
26pub use intrinsic::IntrinsicDef;
27use rustc_abi::{
28    Align, FieldIdx, Integer, IntegerType, ReprFlags, ReprOptions, ScalableElt, VariantIdx,
29};
30use rustc_ast as ast;
31use rustc_ast::expand::typetree::{FncTree, Kind, Type, TypeTree};
32use rustc_ast::node_id::NodeMap;
33pub use rustc_ast_ir::{Movability, Mutability, try_visit};
34use rustc_data_structures::fx::{FxHashSet, FxIndexMap, FxIndexSet};
35use rustc_data_structures::intern::Interned;
36use rustc_data_structures::stable_hasher::{HashStable, HashStableContext, StableHasher};
37use rustc_data_structures::steal::Steal;
38use rustc_data_structures::unord::{UnordMap, UnordSet};
39use rustc_errors::{Diag, ErrorGuaranteed, LintBuffer};
40use rustc_hir as hir;
41use rustc_hir::attrs::StrippedCfgItem;
42use rustc_hir::def::{CtorKind, CtorOf, DefKind, DocLinkResMap, LifetimeRes, Res};
43use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, LocalDefIdMap};
44use rustc_hir::definitions::PerParentDisambiguatorState;
45use rustc_hir::{LangItem, attrs as attr, find_attr};
46use rustc_index::IndexVec;
47use rustc_index::bit_set::BitMatrix;
48use rustc_macros::{
49    BlobDecodable, Decodable, Encodable, HashStable, TyDecodable, TyEncodable, TypeFoldable,
50    TypeVisitable, extension,
51};
52use rustc_serialize::{Decodable, Encodable};
53use rustc_session::config::OptLevel;
54pub use rustc_session::lint::RegisteredTools;
55use rustc_span::hygiene::MacroKind;
56use rustc_span::{DUMMY_SP, ExpnId, ExpnKind, Ident, Span, Symbol};
57use rustc_target::callconv::FnAbi;
58pub use rustc_type_ir::data_structures::{DelayedMap, DelayedSet};
59pub use rustc_type_ir::fast_reject::DeepRejectCtxt;
60#[allow(
61    hidden_glob_reexports,
62    rustc::usage_of_type_ir_inherent,
63    rustc::non_glob_import_of_type_ir_inherent
64)]
65use rustc_type_ir::inherent;
66pub use rustc_type_ir::relate::VarianceDiagInfo;
67pub use rustc_type_ir::solve::{CandidatePreferenceMode, SizedTraitKind};
68pub use rustc_type_ir::*;
69#[allow(hidden_glob_reexports, unused_imports)]
70use rustc_type_ir::{InferCtxtLike, Interner};
71use tracing::{debug, instrument, trace};
72pub use vtable::*;
73
74pub use self::closure::{
75    BorrowKind, CAPTURE_STRUCT_LOCAL, CaptureInfo, CapturedPlace, ClosureTypeInfo,
76    MinCaptureInformationMap, MinCaptureList, RootVariableMinCaptureList, UpvarCapture, UpvarId,
77    UpvarPath, analyze_coroutine_closure_captures, is_ancestor_or_same_capture,
78    place_to_string_for_capture,
79};
80pub use self::consts::{
81    AtomicOrdering, Const, ConstInt, ConstKind, ConstToValTreeResult, Expr, ExprKind,
82    LitToConstInput, ScalarInt, SimdAlign, UnevaluatedConst, ValTree, ValTreeKindExt, Value,
83    const_lit_matches_ty,
84};
85pub use self::context::{
86    CtxtInterners, CurrentGcx, Feed, FreeRegionInfo, GlobalCtxt, Lift, TyCtxt, TyCtxtFeed, tls,
87};
88pub use self::fold::*;
89pub use self::instance::{Instance, InstanceKind, ReifyReason};
90pub(crate) use self::list::RawList;
91pub use self::list::{List, ListWithCachedTypeInfo};
92pub use self::opaque_types::OpaqueTypeKey;
93pub use self::pattern::{Pattern, PatternKind};
94pub use self::predicate::{
95    AliasTerm, AliasTermKind, ArgOutlivesPredicate, Clause, ClauseKind, CoercePredicate,
96    ExistentialPredicate, ExistentialPredicateStableCmpExt, ExistentialProjection,
97    ExistentialTraitRef, HostEffectPredicate, NormalizesTo, OutlivesPredicate, PolyCoercePredicate,
98    PolyExistentialPredicate, PolyExistentialProjection, PolyExistentialTraitRef,
99    PolyProjectionPredicate, PolyRegionOutlivesPredicate, PolySubtypePredicate, PolyTraitPredicate,
100    PolyTraitRef, PolyTypeOutlivesPredicate, Predicate, PredicateKind, ProjectionPredicate,
101    RegionConstraint, RegionEqPredicate, RegionOutlivesPredicate, SubtypePredicate, TraitPredicate,
102    TraitRef, TypeOutlivesPredicate,
103};
104pub use self::region::{
105    EarlyParamRegion, LateParamRegion, LateParamRegionKind, Region, RegionKind, RegionVid,
106};
107pub use self::sty::{
108    AliasTy, AliasTyKind, Article, Binder, BoundConst, BoundRegion, BoundRegionKind, BoundTy,
109    BoundTyKind, BoundVariableKind, CanonicalPolyFnSig, CoroutineArgsExt, EarlyBinder, FnSig,
110    FnSigKind, InlineConstArgs, InlineConstArgsParts, ParamConst, ParamTy, PlaceholderConst,
111    PlaceholderRegion, PlaceholderType, PolyFnSig, TyKind, TypeAndMut, TypingMode,
112    TypingModeEqWrapper, Unnormalized, UpvarArgs,
113};
114pub use self::trait_def::TraitDef;
115pub use self::typeck_results::{
116    CanonicalUserType, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations, IsIdentity,
117    Rust2024IncompatiblePatInfo, TypeckResults, UserType, UserTypeAnnotationIndex, UserTypeKind,
118};
119use crate::error::{OpaqueHiddenTypeMismatch, TypeMismatchReason};
120use crate::metadata::{AmbigModChild, ModChild};
121use crate::middle::privacy::EffectiveVisibilities;
122use crate::mir::{Body, CoroutineLayout, CoroutineSavedLocal, SourceInfo};
123use crate::query::{IntoQueryKey, Providers};
124use crate::ty;
125use crate::ty::codec::{TyDecoder, TyEncoder};
126pub use crate::ty::diagnostics::*;
127use crate::ty::fast_reject::SimplifiedType;
128use crate::ty::layout::{FnAbiError, LayoutError};
129use crate::ty::util::Discr;
130use crate::ty::walk::TypeWalker;
131
132pub mod abstract_const;
133pub mod adjustment;
134pub mod cast;
135pub mod codec;
136pub mod error;
137pub mod fast_reject;
138pub mod inhabitedness;
139pub mod layout;
140pub mod normalize_erasing_regions;
141pub mod offload_meta;
142pub mod pattern;
143pub mod print;
144pub mod relate;
145pub mod significant_drop_order;
146pub mod trait_def;
147pub mod util;
148pub mod vtable;
149
150mod adt;
151mod assoc;
152mod closure;
153mod consts;
154mod context;
155mod diagnostics;
156mod elaborate_impl;
157mod erase_regions;
158mod fold;
159mod generic_args;
160mod generics;
161mod impls_ty;
162mod instance;
163mod intrinsic;
164mod list;
165mod opaque_types;
166mod predicate;
167mod region;
168mod structural_impls;
169#[allow(hidden_glob_reexports)]
170mod sty;
171mod typeck_results;
172mod visit;
173
174// Data types
175
176#[derive(#[automatically_derived]
impl ::core::fmt::Debug for ResolverGlobalCtxt {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["visibilities_for_hashing", "expn_that_defined",
                        "effective_visibilities", "extern_crate_map",
                        "maybe_unused_trait_imports", "module_children",
                        "ambig_module_children", "glob_map", "main_def",
                        "trait_impls", "proc_macros",
                        "confused_type_with_std_module", "doc_link_resolutions",
                        "doc_link_traits_in_scope", "all_macro_rules",
                        "stripped_cfg_items"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.visibilities_for_hashing, &self.expn_that_defined,
                        &self.effective_visibilities, &self.extern_crate_map,
                        &self.maybe_unused_trait_imports, &self.module_children,
                        &self.ambig_module_children, &self.glob_map, &self.main_def,
                        &self.trait_impls, &self.proc_macros,
                        &self.confused_type_with_std_module,
                        &self.doc_link_resolutions, &self.doc_link_traits_in_scope,
                        &self.all_macro_rules, &&self.stripped_cfg_items];
        ::core::fmt::Formatter::debug_struct_fields_finish(f,
            "ResolverGlobalCtxt", names, values)
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hasher::HashStable for
            ResolverGlobalCtxt {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    ResolverGlobalCtxt {
                        visibilities_for_hashing: ref __binding_0,
                        expn_that_defined: ref __binding_1,
                        effective_visibilities: ref __binding_2,
                        extern_crate_map: ref __binding_3,
                        maybe_unused_trait_imports: ref __binding_4,
                        module_children: ref __binding_5,
                        ambig_module_children: ref __binding_6,
                        glob_map: ref __binding_7,
                        main_def: ref __binding_8,
                        trait_impls: ref __binding_9,
                        proc_macros: ref __binding_10,
                        confused_type_with_std_module: ref __binding_11,
                        doc_link_resolutions: ref __binding_12,
                        doc_link_traits_in_scope: ref __binding_13,
                        all_macro_rules: ref __binding_14,
                        stripped_cfg_items: ref __binding_15 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                        { __binding_2.hash_stable(__hcx, __hasher); }
                        { __binding_3.hash_stable(__hcx, __hasher); }
                        { __binding_4.hash_stable(__hcx, __hasher); }
                        { __binding_5.hash_stable(__hcx, __hasher); }
                        { __binding_6.hash_stable(__hcx, __hasher); }
                        { __binding_7.hash_stable(__hcx, __hasher); }
                        { __binding_8.hash_stable(__hcx, __hasher); }
                        { __binding_9.hash_stable(__hcx, __hasher); }
                        { __binding_10.hash_stable(__hcx, __hasher); }
                        { __binding_11.hash_stable(__hcx, __hasher); }
                        { __binding_12.hash_stable(__hcx, __hasher); }
                        { __binding_13.hash_stable(__hcx, __hasher); }
                        { __binding_14.hash_stable(__hcx, __hasher); }
                        { __binding_15.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable)]
177pub struct ResolverGlobalCtxt {
178    pub visibilities_for_hashing: Vec<(LocalDefId, Visibility)>,
179    /// Item with a given `LocalDefId` was defined during macro expansion with ID `ExpnId`.
180    pub expn_that_defined: UnordMap<LocalDefId, ExpnId>,
181    pub effective_visibilities: EffectiveVisibilities,
182    pub extern_crate_map: UnordMap<LocalDefId, CrateNum>,
183    pub maybe_unused_trait_imports: FxIndexSet<LocalDefId>,
184    pub module_children: LocalDefIdMap<Vec<ModChild>>,
185    pub ambig_module_children: LocalDefIdMap<Vec<AmbigModChild>>,
186    pub glob_map: FxIndexMap<LocalDefId, FxIndexSet<Symbol>>,
187    pub main_def: Option<MainDefinition>,
188    pub trait_impls: FxIndexMap<DefId, Vec<LocalDefId>>,
189    /// A list of proc macro LocalDefIds, written out in the order in which
190    /// they are declared in the static array generated by proc_macro_harness.
191    pub proc_macros: Vec<LocalDefId>,
192    /// Mapping from ident span to path span for paths that don't exist as written, but that
193    /// exist under `std`. For example, wrote `str::from_utf8` instead of `std::str::from_utf8`.
194    pub confused_type_with_std_module: FxIndexMap<Span, Span>,
195    pub doc_link_resolutions: FxIndexMap<LocalDefId, DocLinkResMap>,
196    pub doc_link_traits_in_scope: FxIndexMap<LocalDefId, Vec<DefId>>,
197    pub all_macro_rules: UnordSet<Symbol>,
198    pub stripped_cfg_items: Vec<StrippedCfgItem>,
199}
200
201/// Resolutions that should only be used for lowering.
202/// This struct is meant to be consumed by lowering.
203#[derive(#[automatically_derived]
impl<'tcx> ::core::fmt::Debug for ResolverAstLowering<'tcx> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["partial_res_map", "import_res_map", "label_res_map",
                        "lifetimes_res_map", "extra_lifetime_params_map",
                        "next_node_id", "node_id_to_def_id", "trait_map",
                        "lifetime_elision_allowed", "lint_buffer",
                        "delegation_infos", "disambiguators"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.partial_res_map, &self.import_res_map,
                        &self.label_res_map, &self.lifetimes_res_map,
                        &self.extra_lifetime_params_map, &self.next_node_id,
                        &self.node_id_to_def_id, &self.trait_map,
                        &self.lifetime_elision_allowed, &self.lint_buffer,
                        &self.delegation_infos, &&self.disambiguators];
        ::core::fmt::Formatter::debug_struct_fields_finish(f,
            "ResolverAstLowering", names, values)
    }
}Debug)]
204pub struct ResolverAstLowering<'tcx> {
205    /// Resolutions for nodes that have a single resolution.
206    pub partial_res_map: NodeMap<hir::def::PartialRes>,
207    /// Resolutions for import nodes, which have multiple resolutions in different namespaces.
208    pub import_res_map: NodeMap<hir::def::PerNS<Option<Res<ast::NodeId>>>>,
209    /// Resolutions for labels (node IDs of their corresponding blocks or loops).
210    pub label_res_map: NodeMap<ast::NodeId>,
211    /// Resolutions for lifetimes.
212    pub lifetimes_res_map: NodeMap<LifetimeRes>,
213    /// Lifetime parameters that lowering will have to introduce.
214    pub extra_lifetime_params_map: NodeMap<Vec<(Ident, ast::NodeId, LifetimeRes)>>,
215
216    pub next_node_id: ast::NodeId,
217
218    pub node_id_to_def_id: NodeMap<LocalDefId>,
219
220    pub trait_map: NodeMap<&'tcx [hir::TraitCandidate<'tcx>]>,
221    /// List functions and methods for which lifetime elision was successful.
222    pub lifetime_elision_allowed: FxHashSet<ast::NodeId>,
223
224    /// Lints that were emitted by the resolver and early lints.
225    pub lint_buffer: Steal<LintBuffer>,
226
227    // Information about delegations which is used when handling recursive delegations
228    pub delegation_infos: LocalDefIdMap<DelegationInfo>,
229
230    pub disambiguators: LocalDefIdMap<Steal<PerParentDisambiguatorState>>,
231}
232
233#[derive(#[automatically_derived]
impl ::core::fmt::Debug for DelegationInfo {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field1_finish(f,
            "DelegationInfo", "resolution_node", &&self.resolution_node)
    }
}Debug)]
234pub struct DelegationInfo {
235    // NodeId (either delegation.id or item_id in case of a trait impl) for signature resolution,
236    // for details see https://github.com/rust-lang/rust/issues/118212#issuecomment-2160686914
237    pub resolution_node: ast::NodeId,
238}
239
240#[derive(#[automatically_derived]
impl ::core::clone::Clone for MainDefinition {
    #[inline]
    fn clone(&self) -> MainDefinition {
        let _: ::core::clone::AssertParamIsClone<Res<ast::NodeId>>;
        let _: ::core::clone::AssertParamIsClone<bool>;
        let _: ::core::clone::AssertParamIsClone<Span>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for MainDefinition { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for MainDefinition {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f,
            "MainDefinition", "res", &self.res, "is_import", &self.is_import,
            "span", &&self.span)
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hasher::HashStable for
            MainDefinition {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    MainDefinition {
                        res: ref __binding_0,
                        is_import: ref __binding_1,
                        span: ref __binding_2 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                        { __binding_2.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable)]
241pub struct MainDefinition {
242    pub res: Res<ast::NodeId>,
243    pub is_import: bool,
244    pub span: Span,
245}
246
247impl MainDefinition {
248    pub fn opt_fn_def_id(self) -> Option<DefId> {
249        if let Res::Def(DefKind::Fn, def_id) = self.res { Some(def_id) } else { None }
250    }
251}
252
253#[derive(#[automatically_derived]
impl<'tcx> ::core::marker::Copy for ImplTraitHeader<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for ImplTraitHeader<'tcx> {
    #[inline]
    fn clone(&self) -> ImplTraitHeader<'tcx> {
        let _:
                ::core::clone::AssertParamIsClone<ty::EarlyBinder<'tcx,
                ty::TraitRef<'tcx>>>;
        let _: ::core::clone::AssertParamIsClone<ImplPolarity>;
        let _: ::core::clone::AssertParamIsClone<hir::Safety>;
        let _: ::core::clone::AssertParamIsClone<hir::Constness>;
        *self
    }
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for ImplTraitHeader<'tcx> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f,
            "ImplTraitHeader", "trait_ref", &self.trait_ref, "polarity",
            &self.polarity, "safety", &self.safety, "constness",
            &&self.constness)
    }
}Debug, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for ImplTraitHeader<'tcx> {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    ImplTraitHeader {
                        trait_ref: ref __binding_0,
                        polarity: ref __binding_1,
                        safety: ref __binding_2,
                        constness: ref __binding_3 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                            __encoder);
                    }
                }
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for ImplTraitHeader<'tcx> {
            fn decode(__decoder: &mut __D) -> Self {
                ImplTraitHeader {
                    trait_ref: ::rustc_serialize::Decodable::decode(__decoder),
                    polarity: ::rustc_serialize::Decodable::decode(__decoder),
                    safety: ::rustc_serialize::Decodable::decode(__decoder),
                    constness: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };TyDecodable, const _: () =
    {
        impl<'tcx> ::rustc_data_structures::stable_hasher::HashStable for
            ImplTraitHeader<'tcx> {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    ImplTraitHeader {
                        trait_ref: ref __binding_0,
                        polarity: ref __binding_1,
                        safety: ref __binding_2,
                        constness: ref __binding_3 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                        { __binding_2.hash_stable(__hcx, __hasher); }
                        { __binding_3.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable)]
254pub struct ImplTraitHeader<'tcx> {
255    pub trait_ref: ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>>,
256    pub polarity: ImplPolarity,
257    pub safety: hir::Safety,
258    pub constness: hir::Constness,
259}
260
261#[derive(#[automatically_derived]
impl ::core::marker::Copy for Asyncness { }Copy, #[automatically_derived]
impl ::core::clone::Clone for Asyncness {
    #[inline]
    fn clone(&self) -> Asyncness { *self }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for Asyncness {
    #[inline]
    fn eq(&self, other: &Asyncness) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Asyncness {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for Asyncness {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state)
    }
}Hash, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for Asyncness {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        Asyncness::Yes => { 0usize }
                        Asyncness::No => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self { Asyncness::Yes => {} Asyncness::No => {} }
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for Asyncness {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { Asyncness::Yes }
                    1usize => { Asyncness::No }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Asyncness`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable, const _: () =
    {
        impl ::rustc_data_structures::stable_hasher::HashStable for Asyncness
            {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                ::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
                match *self { Asyncness::Yes => {} Asyncness::No => {} }
            }
        }
    };HashStable, #[automatically_derived]
impl ::core::fmt::Debug for Asyncness {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self { Asyncness::Yes => "Yes", Asyncness::No => "No", })
    }
}Debug)]
262#[derive(const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            for Asyncness {
            fn try_fold_with<__F: ::rustc_middle::ty::FallibleTypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
                __folder: &mut __F) -> Result<Self, __F::Error> {
                Ok(match self {
                        Asyncness::Yes => { Asyncness::Yes }
                        Asyncness::No => { Asyncness::No }
                    })
            }
            fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    Asyncness::Yes => { Asyncness::Yes }
                    Asyncness::No => { Asyncness::No }
                }
            }
        }
    };TypeFoldable, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
            for Asyncness {
            fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self { Asyncness::Yes => {} Asyncness::No => {} }
                <__V::Result as ::rustc_middle::ty::VisitorResult>::output()
            }
        }
    };TypeVisitable, #[automatically_derived]
impl ::core::default::Default for Asyncness {
    #[inline]
    fn default() -> Asyncness { Self::No }
}Default)]
263pub enum Asyncness {
264    Yes,
265    #[default]
266    No,
267}
268
269impl Asyncness {
270    pub fn is_async(self) -> bool {
271        #[allow(non_exhaustive_omitted_patterns)] match self {
    Asyncness::Yes => true,
    _ => false,
}matches!(self, Asyncness::Yes)
272    }
273}
274
275#[derive(#[automatically_derived]
impl<Id: ::core::clone::Clone> ::core::clone::Clone for Visibility<Id> {
    #[inline]
    fn clone(&self) -> Visibility<Id> {
        match self {
            Visibility::Public => Visibility::Public,
            Visibility::Restricted(__self_0) =>
                Visibility::Restricted(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, #[automatically_derived]
impl<Id: ::core::fmt::Debug> ::core::fmt::Debug for Visibility<Id> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Visibility::Public =>
                ::core::fmt::Formatter::write_str(f, "Public"),
            Visibility::Restricted(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Restricted", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl<Id: ::core::cmp::PartialEq> ::core::cmp::PartialEq for Visibility<Id> {
    #[inline]
    fn eq(&self, other: &Visibility<Id>) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (Visibility::Restricted(__self_0),
                    Visibility::Restricted(__arg1_0)) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl<Id: ::core::cmp::Eq> ::core::cmp::Eq for Visibility<Id> {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Id>;
    }
}Eq, #[automatically_derived]
impl<Id: ::core::marker::Copy> ::core::marker::Copy for Visibility<Id> { }Copy, #[automatically_derived]
impl<Id: ::core::hash::Hash> ::core::hash::Hash for Visibility<Id> {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            Visibility::Restricted(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            _ => {}
        }
    }
}Hash, const _: () =
    {
        impl<Id, __E: ::rustc_span::SpanEncoder>
            ::rustc_serialize::Encodable<__E> for Visibility<Id> where
            Id: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        Visibility::Public => { 0usize }
                        Visibility::Restricted(ref __binding_0) => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    Visibility::Public => {}
                    Visibility::Restricted(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<Id, __D: ::rustc_span::BlobDecoder>
            ::rustc_serialize::Decodable<__D> for Visibility<Id> where
            Id: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { Visibility::Public }
                    1usize => {
                        Visibility::Restricted(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Visibility`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };BlobDecodable, const _: () =
    {
        impl<Id> ::rustc_data_structures::stable_hasher::HashStable for
            Visibility<Id> where
            Id: ::rustc_data_structures::stable_hasher::HashStable {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                ::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
                match *self {
                    Visibility::Public => {}
                    Visibility::Restricted(ref __binding_0) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable)]
276pub enum Visibility<Id = LocalDefId> {
277    /// Visible everywhere (including in other crates).
278    Public,
279    /// Visible only in the given crate-local module.
280    Restricted(Id),
281}
282
283impl Visibility {
284    pub fn to_string(self, def_id: LocalDefId, tcx: TyCtxt<'_>) -> String {
285        match self {
286            ty::Visibility::Restricted(restricted_id) => {
287                if restricted_id.is_top_level_module() {
288                    "pub(crate)".to_string()
289                } else if restricted_id == tcx.parent_module_from_def_id(def_id).to_local_def_id() {
290                    "pub(self)".to_string()
291                } else {
292                    ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("pub(in crate{0})",
                tcx.def_path(restricted_id.to_def_id()).to_string_no_crate_verbose()))
    })format!(
293                        "pub(in crate{})",
294                        tcx.def_path(restricted_id.to_def_id()).to_string_no_crate_verbose()
295                    )
296                }
297            }
298            ty::Visibility::Public => "pub".to_string(),
299        }
300    }
301}
302
303#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for ClosureSizeProfileData<'tcx> {
    #[inline]
    fn clone(&self) -> ClosureSizeProfileData<'tcx> {
        let _: ::core::clone::AssertParamIsClone<Ty<'tcx>>;
        let _: ::core::clone::AssertParamIsClone<Ty<'tcx>>;
        *self
    }
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for ClosureSizeProfileData<'tcx> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "ClosureSizeProfileData", "before_feature_tys",
            &self.before_feature_tys, "after_feature_tys",
            &&self.after_feature_tys)
    }
}Debug, #[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for ClosureSizeProfileData<'tcx> {
    #[inline]
    fn eq(&self, other: &ClosureSizeProfileData<'tcx>) -> bool {
        self.before_feature_tys == other.before_feature_tys &&
            self.after_feature_tys == other.after_feature_tys
    }
}PartialEq, #[automatically_derived]
impl<'tcx> ::core::cmp::Eq for ClosureSizeProfileData<'tcx> {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Ty<'tcx>>;
        let _: ::core::cmp::AssertParamIsEq<Ty<'tcx>>;
    }
}Eq, #[automatically_derived]
impl<'tcx> ::core::marker::Copy for ClosureSizeProfileData<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::hash::Hash for ClosureSizeProfileData<'tcx> {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.before_feature_tys, state);
        ::core::hash::Hash::hash(&self.after_feature_tys, state)
    }
}Hash, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for ClosureSizeProfileData<'tcx>
            {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    ClosureSizeProfileData {
                        before_feature_tys: ref __binding_0,
                        after_feature_tys: ref __binding_1 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                }
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for ClosureSizeProfileData<'tcx>
            {
            fn decode(__decoder: &mut __D) -> Self {
                ClosureSizeProfileData {
                    before_feature_tys: ::rustc_serialize::Decodable::decode(__decoder),
                    after_feature_tys: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };TyDecodable, const _: () =
    {
        impl<'tcx> ::rustc_data_structures::stable_hasher::HashStable for
            ClosureSizeProfileData<'tcx> {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    ClosureSizeProfileData {
                        before_feature_tys: ref __binding_0,
                        after_feature_tys: ref __binding_1 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable)]
304#[derive(const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            for ClosureSizeProfileData<'tcx> {
            fn try_fold_with<__F: ::rustc_middle::ty::FallibleTypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
                __folder: &mut __F) -> Result<Self, __F::Error> {
                Ok(match self {
                        ClosureSizeProfileData {
                            before_feature_tys: __binding_0,
                            after_feature_tys: __binding_1 } => {
                            ClosureSizeProfileData {
                                before_feature_tys: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                after_feature_tys: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                            }
                        }
                    })
            }
            fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    ClosureSizeProfileData {
                        before_feature_tys: __binding_0,
                        after_feature_tys: __binding_1 } => {
                        ClosureSizeProfileData {
                            before_feature_tys: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            after_feature_tys: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
            for ClosureSizeProfileData<'tcx> {
            fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    ClosureSizeProfileData {
                        before_feature_tys: ref __binding_0,
                        after_feature_tys: ref __binding_1 } => {
                        {
                            match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_middle::ty::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_1,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_middle::ty::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as ::rustc_middle::ty::VisitorResult>::output()
            }
        }
    };TypeVisitable)]
305pub struct ClosureSizeProfileData<'tcx> {
306    /// Tuple containing the types of closure captures before the feature `capture_disjoint_fields`
307    pub before_feature_tys: Ty<'tcx>,
308    /// Tuple containing the types of closure captures after the feature `capture_disjoint_fields`
309    pub after_feature_tys: Ty<'tcx>,
310}
311
312impl TyCtxt<'_> {
313    #[inline]
314    pub fn opt_parent(self, id: DefId) -> Option<DefId> {
315        self.def_key(id).parent.map(|index| DefId { index, ..id })
316    }
317
318    #[inline]
319    #[track_caller]
320    pub fn parent(self, id: DefId) -> DefId {
321        match self.opt_parent(id) {
322            Some(id) => id,
323            // not `unwrap_or_else` to avoid breaking caller tracking
324            None => crate::util::bug::bug_fmt(format_args!("{0:?} doesn\'t have a parent", id))bug!("{id:?} doesn't have a parent"),
325        }
326    }
327
328    #[inline]
329    #[track_caller]
330    pub fn opt_local_parent(self, id: LocalDefId) -> Option<LocalDefId> {
331        self.opt_parent(id.to_def_id()).map(DefId::expect_local)
332    }
333
334    #[inline]
335    #[track_caller]
336    pub fn local_parent(self, id: impl Into<LocalDefId>) -> LocalDefId {
337        self.parent(id.into().to_def_id()).expect_local()
338    }
339
340    /// Compare def-ids based on their position in def-id tree, ancestor def-ids are considered
341    /// larger than descendant def-ids, and two different def-ids are considered unordered if
342    /// neither of them is an ancestor of the other.
343    fn def_id_partial_cmp(self, lhs: DefId, rhs: DefId) -> Option<Ordering> {
344        // Def-ids from different crates are always unordered.
345        if lhs.krate != rhs.krate {
346            return None;
347        }
348
349        // Def-ids of parent nodes are always created before def-ids of child nodes
350        // and have a smaller index, so we only need to search in one direction,
351        // either from lhs to rhs, or vice versa.
352        let search = |mut start: DefId, finish: DefId, ord| {
353            while start.index != finish.index {
354                match self.opt_parent(start) {
355                    Some(parent) => start.index = parent.index,
356                    None => return None,
357                }
358            }
359            Some(ord)
360        };
361        match lhs.index.cmp(&rhs.index) {
362            Ordering::Equal => Some(Ordering::Equal),
363            Ordering::Less => search(rhs, lhs, Ordering::Greater),
364            Ordering::Greater => search(lhs, rhs, Ordering::Less),
365        }
366    }
367
368    pub fn is_descendant_of(self, descendant: DefId, ancestor: DefId) -> bool {
369        #[allow(non_exhaustive_omitted_patterns)] match self.def_id_partial_cmp(descendant,
        ancestor) {
    Some(Ordering::Less | Ordering::Equal) => true,
    _ => false,
}matches!(
370            self.def_id_partial_cmp(descendant, ancestor),
371            Some(Ordering::Less | Ordering::Equal)
372        )
373    }
374}
375
376impl<Id> Visibility<Id> {
377    pub fn is_public(self) -> bool {
378        #[allow(non_exhaustive_omitted_patterns)] match self {
    Visibility::Public => true,
    _ => false,
}matches!(self, Visibility::Public)
379    }
380
381    pub fn map_id<OutId>(self, f: impl FnOnce(Id) -> OutId) -> Visibility<OutId> {
382        match self {
383            Visibility::Public => Visibility::Public,
384            Visibility::Restricted(id) => Visibility::Restricted(f(id)),
385        }
386    }
387}
388
389impl<Id: Into<DefId>> Visibility<Id> {
390    pub fn to_def_id(self) -> Visibility<DefId> {
391        self.map_id(Into::into)
392    }
393
394    /// Returns `true` if an item with this visibility is accessible from the given module.
395    pub fn is_accessible_from(self, module: impl Into<DefId>, tcx: TyCtxt<'_>) -> bool {
396        match self {
397            // Public items are visible everywhere.
398            Visibility::Public => true,
399            Visibility::Restricted(id) => tcx.is_descendant_of(module.into(), id.into()),
400        }
401    }
402
403    pub fn partial_cmp(
404        self,
405        vis: Visibility<impl Into<DefId>>,
406        tcx: TyCtxt<'_>,
407    ) -> Option<Ordering> {
408        match (self, vis) {
409            (Visibility::Public, Visibility::Public) => Some(Ordering::Equal),
410            (Visibility::Public, Visibility::Restricted(_)) => Some(Ordering::Greater),
411            (Visibility::Restricted(_), Visibility::Public) => Some(Ordering::Less),
412            (Visibility::Restricted(lhs_id), Visibility::Restricted(rhs_id)) => {
413                let (lhs_id, rhs_id) = (lhs_id.into(), rhs_id.into());
414                tcx.def_id_partial_cmp(lhs_id, rhs_id)
415            }
416        }
417    }
418}
419
420impl<Id: Into<DefId> + Debug + Copy> Visibility<Id> {
421    /// Returns `true` if this visibility is strictly larger than the given visibility.
422    #[track_caller]
423    pub fn greater_than(
424        self,
425        vis: Visibility<impl Into<DefId> + Debug + Copy>,
426        tcx: TyCtxt<'_>,
427    ) -> bool {
428        match self.partial_cmp(vis, tcx) {
429            Some(ord) => ord.is_gt(),
430            None => {
431                tcx.dcx().delayed_bug(::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("unordered visibilities: {0:?} and {1:?}",
                self, vis))
    })format!("unordered visibilities: {self:?} and {vis:?}"));
432                false
433            }
434        }
435    }
436}
437
438impl Visibility<DefId> {
439    pub fn expect_local(self) -> Visibility {
440        self.map_id(|id| id.expect_local())
441    }
442
443    /// Returns `true` if this item is visible anywhere in the local crate.
444    pub fn is_visible_locally(self) -> bool {
445        match self {
446            Visibility::Public => true,
447            Visibility::Restricted(def_id) => def_id.is_local(),
448        }
449    }
450}
451
452/// The crate variances map is computed during typeck and contains the
453/// variance of every item in the local crate. You should not use it
454/// directly, because to do so will make your pass dependent on the
455/// HIR of every item in the local crate. Instead, use
456/// `tcx.variances_of()` to get the variance for a *particular*
457/// item.
458#[derive(const _: () =
    {
        impl<'tcx> ::rustc_data_structures::stable_hasher::HashStable for
            CrateVariancesMap<'tcx> {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    CrateVariancesMap { variances: ref __binding_0 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for CrateVariancesMap<'tcx> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field1_finish(f,
            "CrateVariancesMap", "variances", &&self.variances)
    }
}Debug)]
459pub struct CrateVariancesMap<'tcx> {
460    /// For each item with generics, maps to a vector of the variance
461    /// of its generics. If an item has no generics, it will have no
462    /// entry.
463    pub variances: DefIdMap<&'tcx [ty::Variance]>,
464}
465
466// Contains information needed to resolve types and (in the future) look up
467// the types of AST nodes.
468#[derive(#[automatically_derived]
impl ::core::marker::Copy for CReaderCacheKey { }Copy, #[automatically_derived]
impl ::core::clone::Clone for CReaderCacheKey {
    #[inline]
    fn clone(&self) -> CReaderCacheKey {
        let _: ::core::clone::AssertParamIsClone<Option<CrateNum>>;
        let _: ::core::clone::AssertParamIsClone<usize>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for CReaderCacheKey {
    #[inline]
    fn eq(&self, other: &CReaderCacheKey) -> bool {
        self.cnum == other.cnum && self.pos == other.pos
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for CReaderCacheKey {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Option<CrateNum>>;
        let _: ::core::cmp::AssertParamIsEq<usize>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for CReaderCacheKey {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.cnum, state);
        ::core::hash::Hash::hash(&self.pos, state)
    }
}Hash)]
469pub struct CReaderCacheKey {
470    pub cnum: Option<CrateNum>,
471    pub pos: usize,
472}
473
474/// Use this rather than `TyKind`, whenever possible.
475#[derive(#[automatically_derived]
impl<'tcx> ::core::marker::Copy for Ty<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for Ty<'tcx> {
    #[inline]
    fn clone(&self) -> Ty<'tcx> {
        let _:
                ::core::clone::AssertParamIsClone<Interned<'tcx,
                WithCachedTypeInfo<TyKind<'tcx>>>>;
        *self
    }
}Clone, #[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for Ty<'tcx> {
    #[inline]
    fn eq(&self, other: &Ty<'tcx>) -> bool { self.0 == other.0 }
}PartialEq, #[automatically_derived]
impl<'tcx> ::core::cmp::Eq for Ty<'tcx> {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _:
                ::core::cmp::AssertParamIsEq<Interned<'tcx,
                WithCachedTypeInfo<TyKind<'tcx>>>>;
    }
}Eq, #[automatically_derived]
impl<'tcx> ::core::hash::Hash for Ty<'tcx> {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}Hash, const _: () =
    {
        impl<'tcx> ::rustc_data_structures::stable_hasher::HashStable for
            Ty<'tcx> {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    Ty(ref __binding_0) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable)]
476#[rustc_diagnostic_item = "Ty"]
477#[rustc_pass_by_value]
478pub struct Ty<'tcx>(Interned<'tcx, WithCachedTypeInfo<TyKind<'tcx>>>);
479
480impl<'tcx> rustc_type_ir::inherent::IntoKind for Ty<'tcx> {
481    type Kind = TyKind<'tcx>;
482
483    fn kind(self) -> TyKind<'tcx> {
484        *self.kind()
485    }
486}
487
488impl<'tcx> rustc_type_ir::Flags for Ty<'tcx> {
489    fn flags(&self) -> TypeFlags {
490        self.0.flags
491    }
492
493    fn outer_exclusive_binder(&self) -> DebruijnIndex {
494        self.0.outer_exclusive_binder
495    }
496}
497
498/// The crate outlives map is computed during typeck and contains the
499/// outlives of every item in the local crate. You should not use it
500/// directly, because to do so will make your pass dependent on the
501/// HIR of every item in the local crate. Instead, use
502/// `tcx.inferred_outlives_of()` to get the outlives for a *particular*
503/// item.
504#[derive(const _: () =
    {
        impl<'tcx> ::rustc_data_structures::stable_hasher::HashStable for
            CratePredicatesMap<'tcx> {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    CratePredicatesMap { predicates: ref __binding_0 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for CratePredicatesMap<'tcx> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field1_finish(f,
            "CratePredicatesMap", "predicates", &&self.predicates)
    }
}Debug)]
505pub struct CratePredicatesMap<'tcx> {
506    /// For each struct with outlive bounds, maps to a vector of the
507    /// predicate of its outlive bounds. If an item has no outlives
508    /// bounds, it will have no entry.
509    pub predicates: DefIdMap<&'tcx [(Clause<'tcx>, Span)]>,
510}
511
512#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for Term<'tcx> {
    #[inline]
    fn clone(&self) -> Term<'tcx> {
        let _: ::core::clone::AssertParamIsClone<NonNull<()>>;
        let _:
                ::core::clone::AssertParamIsClone<PhantomData<(Ty<'tcx>,
                Const<'tcx>)>>;
        *self
    }
}Clone, #[automatically_derived]
impl<'tcx> ::core::marker::Copy for Term<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for Term<'tcx> {
    #[inline]
    fn eq(&self, other: &Term<'tcx>) -> bool {
        self.ptr == other.ptr && self.marker == other.marker
    }
}PartialEq, #[automatically_derived]
impl<'tcx> ::core::cmp::Eq for Term<'tcx> {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<NonNull<()>>;
        let _:
                ::core::cmp::AssertParamIsEq<PhantomData<(Ty<'tcx>,
                Const<'tcx>)>>;
    }
}Eq, #[automatically_derived]
impl<'tcx> ::core::cmp::PartialOrd for Term<'tcx> {
    #[inline]
    fn partial_cmp(&self, other: &Term<'tcx>)
        -> ::core::option::Option<::core::cmp::Ordering> {
        match ::core::cmp::PartialOrd::partial_cmp(&self.ptr, &other.ptr) {
            ::core::option::Option::Some(::core::cmp::Ordering::Equal) =>
                ::core::cmp::PartialOrd::partial_cmp(&self.marker,
                    &other.marker),
            cmp => cmp,
        }
    }
}PartialOrd, #[automatically_derived]
impl<'tcx> ::core::cmp::Ord for Term<'tcx> {
    #[inline]
    fn cmp(&self, other: &Term<'tcx>) -> ::core::cmp::Ordering {
        match ::core::cmp::Ord::cmp(&self.ptr, &other.ptr) {
            ::core::cmp::Ordering::Equal =>
                ::core::cmp::Ord::cmp(&self.marker, &other.marker),
            cmp => cmp,
        }
    }
}Ord, #[automatically_derived]
impl<'tcx> ::core::hash::Hash for Term<'tcx> {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.ptr, state);
        ::core::hash::Hash::hash(&self.marker, state)
    }
}Hash)]
513pub struct Term<'tcx> {
514    ptr: NonNull<()>,
515    marker: PhantomData<(Ty<'tcx>, Const<'tcx>)>,
516}
517
518impl<'tcx> rustc_type_ir::inherent::Term<TyCtxt<'tcx>> for Term<'tcx> {}
519
520impl<'tcx> rustc_type_ir::inherent::IntoKind for Term<'tcx> {
521    type Kind = TermKind<'tcx>;
522
523    fn kind(self) -> Self::Kind {
524        self.kind()
525    }
526}
527
528unsafe impl<'tcx> rustc_data_structures::sync::DynSend for Term<'tcx> where
529    &'tcx (Ty<'tcx>, Const<'tcx>): rustc_data_structures::sync::DynSend
530{
531}
532unsafe impl<'tcx> rustc_data_structures::sync::DynSync for Term<'tcx> where
533    &'tcx (Ty<'tcx>, Const<'tcx>): rustc_data_structures::sync::DynSync
534{
535}
536unsafe impl<'tcx> Send for Term<'tcx> where &'tcx (Ty<'tcx>, Const<'tcx>): Send {}
537unsafe impl<'tcx> Sync for Term<'tcx> where &'tcx (Ty<'tcx>, Const<'tcx>): Sync {}
538
539impl Debug for Term<'_> {
540    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
541        match self.kind() {
542            TermKind::Ty(ty) => f.write_fmt(format_args!("Term::Ty({0:?})", ty))write!(f, "Term::Ty({ty:?})"),
543            TermKind::Const(ct) => f.write_fmt(format_args!("Term::Const({0:?})", ct))write!(f, "Term::Const({ct:?})"),
544        }
545    }
546}
547
548impl<'tcx> From<Ty<'tcx>> for Term<'tcx> {
549    fn from(ty: Ty<'tcx>) -> Self {
550        TermKind::Ty(ty).pack()
551    }
552}
553
554impl<'tcx> From<Const<'tcx>> for Term<'tcx> {
555    fn from(c: Const<'tcx>) -> Self {
556        TermKind::Const(c).pack()
557    }
558}
559
560impl<'tcx> HashStable for Term<'tcx> {
561    fn hash_stable<Hcx: HashStableContext>(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
562        self.kind().hash_stable(hcx, hasher);
563    }
564}
565
566impl<'tcx> TypeFoldable<TyCtxt<'tcx>> for Term<'tcx> {
567    fn try_fold_with<F: FallibleTypeFolder<TyCtxt<'tcx>>>(
568        self,
569        folder: &mut F,
570    ) -> Result<Self, F::Error> {
571        match self.kind() {
572            ty::TermKind::Ty(ty) => ty.try_fold_with(folder).map(Into::into),
573            ty::TermKind::Const(ct) => ct.try_fold_with(folder).map(Into::into),
574        }
575    }
576
577    fn fold_with<F: TypeFolder<TyCtxt<'tcx>>>(self, folder: &mut F) -> Self {
578        match self.kind() {
579            ty::TermKind::Ty(ty) => ty.fold_with(folder).into(),
580            ty::TermKind::Const(ct) => ct.fold_with(folder).into(),
581        }
582    }
583}
584
585impl<'tcx> TypeVisitable<TyCtxt<'tcx>> for Term<'tcx> {
586    fn visit_with<V: TypeVisitor<TyCtxt<'tcx>>>(&self, visitor: &mut V) -> V::Result {
587        match self.kind() {
588            ty::TermKind::Ty(ty) => ty.visit_with(visitor),
589            ty::TermKind::Const(ct) => ct.visit_with(visitor),
590        }
591    }
592}
593
594impl<'tcx, E: TyEncoder<'tcx>> Encodable<E> for Term<'tcx> {
595    fn encode(&self, e: &mut E) {
596        self.kind().encode(e)
597    }
598}
599
600impl<'tcx, D: TyDecoder<'tcx>> Decodable<D> for Term<'tcx> {
601    fn decode(d: &mut D) -> Self {
602        let res: TermKind<'tcx> = Decodable::decode(d);
603        res.pack()
604    }
605}
606
607impl<'tcx> Term<'tcx> {
608    #[inline]
609    pub fn kind(self) -> TermKind<'tcx> {
610        let ptr =
611            unsafe { self.ptr.map_addr(|addr| NonZero::new_unchecked(addr.get() & !TAG_MASK)) };
612        // SAFETY: use of `Interned::new_unchecked` here is ok because these
613        // pointers were originally created from `Interned` types in `pack()`,
614        // and this is just going in the other direction.
615        unsafe {
616            match self.ptr.addr().get() & TAG_MASK {
617                TYPE_TAG => TermKind::Ty(Ty(Interned::new_unchecked(
618                    ptr.cast::<WithCachedTypeInfo<ty::TyKind<'tcx>>>().as_ref(),
619                ))),
620                CONST_TAG => TermKind::Const(ty::Const(Interned::new_unchecked(
621                    ptr.cast::<WithCachedTypeInfo<ty::ConstKind<'tcx>>>().as_ref(),
622                ))),
623                _ => core::intrinsics::unreachable(),
624            }
625        }
626    }
627
628    pub fn as_type(&self) -> Option<Ty<'tcx>> {
629        if let TermKind::Ty(ty) = self.kind() { Some(ty) } else { None }
630    }
631
632    pub fn expect_type(&self) -> Ty<'tcx> {
633        self.as_type().expect("expected a type, but found a const")
634    }
635
636    pub fn as_const(&self) -> Option<Const<'tcx>> {
637        if let TermKind::Const(c) = self.kind() { Some(c) } else { None }
638    }
639
640    pub fn expect_const(&self) -> Const<'tcx> {
641        self.as_const().expect("expected a const, but found a type")
642    }
643
644    pub fn into_arg(self) -> GenericArg<'tcx> {
645        match self.kind() {
646            TermKind::Ty(ty) => ty.into(),
647            TermKind::Const(c) => c.into(),
648        }
649    }
650
651    pub fn to_alias_term(self, tcx: TyCtxt<'tcx>) -> Option<AliasTerm<'tcx>> {
652        match self.kind() {
653            TermKind::Ty(ty) => match *ty.kind() {
654                ty::Alias(alias_ty) => Some(alias_ty.into()),
655                _ => None,
656            },
657            TermKind::Const(ct) => match ct.kind() {
658                ConstKind::Unevaluated(uv) => Some(AliasTerm::from_unevaluated_const(tcx, uv)),
659                _ => None,
660            },
661        }
662    }
663
664    pub fn is_infer(&self) -> bool {
665        match self.kind() {
666            TermKind::Ty(ty) => ty.is_ty_var(),
667            TermKind::Const(ct) => ct.is_ct_infer(),
668        }
669    }
670
671    pub fn is_trivially_wf(&self, tcx: TyCtxt<'tcx>) -> bool {
672        match self.kind() {
673            TermKind::Ty(ty) => ty.is_trivially_wf(tcx),
674            TermKind::Const(ct) => ct.is_trivially_wf(),
675        }
676    }
677
678    /// Iterator that walks `self` and any types reachable from
679    /// `self`, in depth-first order. Note that just walks the types
680    /// that appear in `self`, it does not descend into the fields of
681    /// structs or variants. For example:
682    ///
683    /// ```text
684    /// isize => { isize }
685    /// Foo<Bar<isize>> => { Foo<Bar<isize>>, Bar<isize>, isize }
686    /// [isize] => { [isize], isize }
687    /// ```
688    pub fn walk(self) -> TypeWalker<TyCtxt<'tcx>> {
689        TypeWalker::new(self.into())
690    }
691}
692
693const TAG_MASK: usize = 0b11;
694const TYPE_TAG: usize = 0b00;
695const CONST_TAG: usize = 0b01;
696
697impl<'tcx> TermKindPackExt<'tcx> for TermKind<'tcx> {
    #[inline]
    fn pack(self) -> Term<'tcx> {
        let (tag, ptr) =
            match self {
                TermKind::Ty(ty) => {
                    match (&(align_of_val(&*ty.0.0) & TAG_MASK), &0) {
                        (left_val, right_val) => {
                            if !(*left_val == *right_val) {
                                let kind = ::core::panicking::AssertKind::Eq;
                                ::core::panicking::assert_failed(kind, &*left_val,
                                    &*right_val, ::core::option::Option::None);
                            }
                        }
                    };
                    (TYPE_TAG, NonNull::from(ty.0.0).cast())
                }
                TermKind::Const(ct) => {
                    match (&(align_of_val(&*ct.0.0) & TAG_MASK), &0) {
                        (left_val, right_val) => {
                            if !(*left_val == *right_val) {
                                let kind = ::core::panicking::AssertKind::Eq;
                                ::core::panicking::assert_failed(kind, &*left_val,
                                    &*right_val, ::core::option::Option::None);
                            }
                        }
                    };
                    (CONST_TAG, NonNull::from(ct.0.0).cast())
                }
            };
        Term { ptr: ptr.map_addr(|addr| addr | tag), marker: PhantomData }
    }
}#[extension(pub trait TermKindPackExt<'tcx>)]
698impl<'tcx> TermKind<'tcx> {
699    #[inline]
700    fn pack(self) -> Term<'tcx> {
701        let (tag, ptr) = match self {
702            TermKind::Ty(ty) => {
703                // Ensure we can use the tag bits.
704                assert_eq!(align_of_val(&*ty.0.0) & TAG_MASK, 0);
705                (TYPE_TAG, NonNull::from(ty.0.0).cast())
706            }
707            TermKind::Const(ct) => {
708                // Ensure we can use the tag bits.
709                assert_eq!(align_of_val(&*ct.0.0) & TAG_MASK, 0);
710                (CONST_TAG, NonNull::from(ct.0.0).cast())
711            }
712        };
713
714        Term { ptr: ptr.map_addr(|addr| addr | tag), marker: PhantomData }
715    }
716}
717
718/// Represents the bounds declared on a particular set of type
719/// parameters. Should eventually be generalized into a flag list of
720/// where-clauses. You can obtain an `InstantiatedPredicates` list from a
721/// `GenericPredicates` by using the `instantiate` method. Note that this method
722/// reflects an important semantic invariant of `InstantiatedPredicates`: while
723/// the `GenericPredicates` are expressed in terms of the bound type
724/// parameters of the impl/trait/whatever, an `InstantiatedPredicates` instance
725/// represented a set of bounds for some particular instantiation,
726/// meaning that the generic parameters have been instantiated with
727/// their values.
728///
729/// Example:
730/// ```ignore (illustrative)
731/// struct Foo<T, U: Bar<T>> { ... }
732/// ```
733/// Here, the `GenericPredicates` for `Foo` would contain a list of bounds like
734/// `[[], [U:Bar<T>]]`. Now if there were some particular reference
735/// like `Foo<isize,usize>`, then the `InstantiatedPredicates` would be `[[],
736/// [usize:Bar<isize>]]`.
737#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for InstantiatedPredicates<'tcx> {
    #[inline]
    fn clone(&self) -> InstantiatedPredicates<'tcx> {
        InstantiatedPredicates {
            predicates: ::core::clone::Clone::clone(&self.predicates),
            spans: ::core::clone::Clone::clone(&self.spans),
        }
    }
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for InstantiatedPredicates<'tcx> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "InstantiatedPredicates", "predicates", &self.predicates, "spans",
            &&self.spans)
    }
}Debug)]
738pub struct InstantiatedPredicates<'tcx> {
739    pub predicates: Vec<Unnormalized<'tcx, Clause<'tcx>>>,
740    pub spans: Vec<Span>,
741}
742
743impl<'tcx> InstantiatedPredicates<'tcx> {
744    pub fn empty() -> InstantiatedPredicates<'tcx> {
745        InstantiatedPredicates { predicates: ::alloc::vec::Vec::new()vec![], spans: ::alloc::vec::Vec::new()vec![] }
746    }
747
748    pub fn is_empty(&self) -> bool {
749        self.predicates.is_empty()
750    }
751
752    pub fn iter(&self) -> <&Self as IntoIterator>::IntoIter {
753        self.into_iter()
754    }
755}
756
757impl<'tcx> IntoIterator for InstantiatedPredicates<'tcx> {
758    type Item = (Unnormalized<'tcx, Clause<'tcx>>, Span);
759
760    type IntoIter = std::iter::Zip<
761        std::vec::IntoIter<Unnormalized<'tcx, Clause<'tcx>>>,
762        std::vec::IntoIter<Span>,
763    >;
764
765    fn into_iter(self) -> Self::IntoIter {
766        if true {
    match (&self.predicates.len(), &self.spans.len()) {
        (left_val, right_val) => {
            if !(*left_val == *right_val) {
                let kind = ::core::panicking::AssertKind::Eq;
                ::core::panicking::assert_failed(kind, &*left_val,
                    &*right_val, ::core::option::Option::None);
            }
        }
    };
};debug_assert_eq!(self.predicates.len(), self.spans.len());
767        std::iter::zip(self.predicates, self.spans)
768    }
769}
770
771impl<'a, 'tcx> IntoIterator for &'a InstantiatedPredicates<'tcx> {
772    type Item = (Unnormalized<'tcx, Clause<'tcx>>, Span);
773
774    type IntoIter = std::iter::Zip<
775        std::iter::Copied<std::slice::Iter<'a, Unnormalized<'tcx, Clause<'tcx>>>>,
776        std::iter::Copied<std::slice::Iter<'a, Span>>,
777    >;
778
779    fn into_iter(self) -> Self::IntoIter {
780        if true {
    match (&self.predicates.len(), &self.spans.len()) {
        (left_val, right_val) => {
            if !(*left_val == *right_val) {
                let kind = ::core::panicking::AssertKind::Eq;
                ::core::panicking::assert_failed(kind, &*left_val,
                    &*right_val, ::core::option::Option::None);
            }
        }
    };
};debug_assert_eq!(self.predicates.len(), self.spans.len());
781        std::iter::zip(self.predicates.iter().copied(), self.spans.iter().copied())
782    }
783}
784
785#[derive(#[automatically_derived]
impl<'tcx> ::core::marker::Copy for ProvisionalHiddenType<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for ProvisionalHiddenType<'tcx> {
    #[inline]
    fn clone(&self) -> ProvisionalHiddenType<'tcx> {
        let _: ::core::clone::AssertParamIsClone<Span>;
        let _: ::core::clone::AssertParamIsClone<Ty<'tcx>>;
        *self
    }
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for ProvisionalHiddenType<'tcx> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "ProvisionalHiddenType", "span", &self.span, "ty", &&self.ty)
    }
}Debug, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            for ProvisionalHiddenType<'tcx> {
            fn try_fold_with<__F: ::rustc_middle::ty::FallibleTypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
                __folder: &mut __F) -> Result<Self, __F::Error> {
                Ok(match self {
                        ProvisionalHiddenType { span: __binding_0, ty: __binding_1 }
                            => {
                            ProvisionalHiddenType {
                                span: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                ty: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                            }
                        }
                    })
            }
            fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    ProvisionalHiddenType { span: __binding_0, ty: __binding_1 }
                        => {
                        ProvisionalHiddenType {
                            span: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            ty: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
            for ProvisionalHiddenType<'tcx> {
            fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    ProvisionalHiddenType {
                        span: ref __binding_0, ty: ref __binding_1 } => {
                        {
                            match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_middle::ty::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_1,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_middle::ty::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as ::rustc_middle::ty::VisitorResult>::output()
            }
        }
    };TypeVisitable, const _: () =
    {
        impl<'tcx> ::rustc_data_structures::stable_hasher::HashStable for
            ProvisionalHiddenType<'tcx> {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    ProvisionalHiddenType {
                        span: ref __binding_0, ty: ref __binding_1 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for ProvisionalHiddenType<'tcx>
            {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    ProvisionalHiddenType {
                        span: ref __binding_0, ty: ref __binding_1 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                }
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for ProvisionalHiddenType<'tcx>
            {
            fn decode(__decoder: &mut __D) -> Self {
                ProvisionalHiddenType {
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    ty: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };TyDecodable)]
786pub struct ProvisionalHiddenType<'tcx> {
787    /// The span of this particular definition of the opaque type. So
788    /// for example:
789    ///
790    /// ```ignore (incomplete snippet)
791    /// type Foo = impl Baz;
792    /// fn bar() -> Foo {
793    /// //          ^^^ This is the span we are looking for!
794    /// }
795    /// ```
796    ///
797    /// In cases where the fn returns `(impl Trait, impl Trait)` or
798    /// other such combinations, the result is currently
799    /// over-approximated, but better than nothing.
800    pub span: Span,
801
802    /// The type variable that represents the value of the opaque type
803    /// that we require. In other words, after we compile this function,
804    /// we will be created a constraint like:
805    /// ```ignore (pseudo-rust)
806    /// Foo<'a, T> = ?C
807    /// ```
808    /// where `?C` is the value of this type variable. =) It may
809    /// naturally refer to the type and lifetime parameters in scope
810    /// in this function, though ultimately it should only reference
811    /// those that are arguments to `Foo` in the constraint above. (In
812    /// other words, `?C` should not include `'b`, even though it's a
813    /// lifetime parameter on `foo`.)
814    pub ty: Ty<'tcx>,
815}
816
817/// Whether we're currently in HIR typeck or MIR borrowck.
818#[derive(#[automatically_derived]
impl ::core::fmt::Debug for DefiningScopeKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                DefiningScopeKind::HirTypeck => "HirTypeck",
                DefiningScopeKind::MirBorrowck => "MirBorrowck",
            })
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for DefiningScopeKind {
    #[inline]
    fn clone(&self) -> DefiningScopeKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for DefiningScopeKind { }Copy)]
819pub enum DefiningScopeKind {
820    /// During writeback in typeck, we don't care about regions and simply
821    /// erase them. This means we also don't check whether regions are
822    /// universal in the opaque type key. This will only be checked in
823    /// MIR borrowck.
824    HirTypeck,
825    MirBorrowck,
826}
827
828impl<'tcx> ProvisionalHiddenType<'tcx> {
829    pub fn new_error(tcx: TyCtxt<'tcx>, guar: ErrorGuaranteed) -> ProvisionalHiddenType<'tcx> {
830        ProvisionalHiddenType { span: DUMMY_SP, ty: Ty::new_error(tcx, guar) }
831    }
832
833    pub fn build_mismatch_error(
834        &self,
835        other: &Self,
836        tcx: TyCtxt<'tcx>,
837    ) -> Result<Diag<'tcx>, ErrorGuaranteed> {
838        (self.ty, other.ty).error_reported()?;
839        // Found different concrete types for the opaque type.
840        let sub_diag = if self.span == other.span {
841            TypeMismatchReason::ConflictType { span: self.span }
842        } else {
843            TypeMismatchReason::PreviousUse { span: self.span }
844        };
845        Ok(tcx.dcx().create_err(OpaqueHiddenTypeMismatch {
846            self_ty: self.ty,
847            other_ty: other.ty,
848            other_span: other.span,
849            sub: sub_diag,
850        }))
851    }
852
853    x;#[instrument(level = "debug", skip(tcx), ret)]
854    pub fn remap_generic_params_to_declaration_params(
855        self,
856        opaque_type_key: OpaqueTypeKey<'tcx>,
857        tcx: TyCtxt<'tcx>,
858        defining_scope_kind: DefiningScopeKind,
859    ) -> DefinitionSiteHiddenType<'tcx> {
860        let OpaqueTypeKey { def_id, args } = opaque_type_key;
861
862        // Use args to build up a reverse map from regions to their
863        // identity mappings. This is necessary because of `impl
864        // Trait` lifetimes are computed by replacing existing
865        // lifetimes with 'static and remapping only those used in the
866        // `impl Trait` return type, resulting in the parameters
867        // shifting.
868        let id_args = GenericArgs::identity_for_item(tcx, def_id);
869        debug!(?id_args);
870
871        // This zip may have several times the same lifetime in `args` paired with a different
872        // lifetime from `id_args`. Simply `collect`ing the iterator is the correct behaviour:
873        // it will pick the last one, which is the one we introduced in the impl-trait desugaring.
874        let map = args.iter().zip(id_args).collect();
875        debug!("map = {:#?}", map);
876
877        // Convert the type from the function into a type valid outside by mapping generic
878        // parameters to into the context of the opaque.
879        //
880        // We erase regions when doing this during HIR typeck. We manually use `fold_regions`
881        // here as we do not want to anonymize bound variables.
882        let ty = match defining_scope_kind {
883            DefiningScopeKind::HirTypeck => {
884                fold_regions(tcx, self.ty, |_, _| tcx.lifetimes.re_erased)
885            }
886            DefiningScopeKind::MirBorrowck => self.ty,
887        };
888        let result_ty = ty.fold_with(&mut opaque_types::ReverseMapper::new(tcx, map, self.span));
889        if cfg!(debug_assertions) && matches!(defining_scope_kind, DefiningScopeKind::HirTypeck) {
890            assert_eq!(result_ty, fold_regions(tcx, result_ty, |_, _| tcx.lifetimes.re_erased));
891        }
892        DefinitionSiteHiddenType { span: self.span, ty: ty::EarlyBinder::bind(result_ty) }
893    }
894}
895
896#[derive(#[automatically_derived]
impl<'tcx> ::core::marker::Copy for DefinitionSiteHiddenType<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for DefinitionSiteHiddenType<'tcx> {
    #[inline]
    fn clone(&self) -> DefinitionSiteHiddenType<'tcx> {
        let _: ::core::clone::AssertParamIsClone<Span>;
        let _:
                ::core::clone::AssertParamIsClone<ty::EarlyBinder<'tcx,
                Ty<'tcx>>>;
        *self
    }
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for DefinitionSiteHiddenType<'tcx> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "DefinitionSiteHiddenType", "span", &self.span, "ty", &&self.ty)
    }
}Debug, const _: () =
    {
        impl<'tcx> ::rustc_data_structures::stable_hasher::HashStable for
            DefinitionSiteHiddenType<'tcx> {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    DefinitionSiteHiddenType {
                        span: ref __binding_0, ty: ref __binding_1 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for
            DefinitionSiteHiddenType<'tcx> {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    DefinitionSiteHiddenType {
                        span: ref __binding_0, ty: ref __binding_1 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                }
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for
            DefinitionSiteHiddenType<'tcx> {
            fn decode(__decoder: &mut __D) -> Self {
                DefinitionSiteHiddenType {
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    ty: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };TyDecodable)]
897pub struct DefinitionSiteHiddenType<'tcx> {
898    /// The span of the definition of the opaque type. So for example:
899    ///
900    /// ```ignore (incomplete snippet)
901    /// type Foo = impl Baz;
902    /// fn bar() -> Foo {
903    /// //          ^^^ This is the span we are looking for!
904    /// }
905    /// ```
906    ///
907    /// In cases where the fn returns `(impl Trait, impl Trait)` or
908    /// other such combinations, the result is currently
909    /// over-approximated, but better than nothing.
910    pub span: Span,
911
912    /// The final type of the opaque.
913    pub ty: ty::EarlyBinder<'tcx, Ty<'tcx>>,
914}
915
916impl<'tcx> DefinitionSiteHiddenType<'tcx> {
917    pub fn new_error(tcx: TyCtxt<'tcx>, guar: ErrorGuaranteed) -> DefinitionSiteHiddenType<'tcx> {
918        DefinitionSiteHiddenType {
919            span: DUMMY_SP,
920            ty: ty::EarlyBinder::bind(Ty::new_error(tcx, guar)),
921        }
922    }
923
924    pub fn build_mismatch_error(
925        &self,
926        other: &Self,
927        tcx: TyCtxt<'tcx>,
928    ) -> Result<Diag<'tcx>, ErrorGuaranteed> {
929        let self_ty = self.ty.instantiate_identity().skip_norm_wip();
930        let other_ty = other.ty.instantiate_identity().skip_norm_wip();
931        (self_ty, other_ty).error_reported()?;
932        // Found different concrete types for the opaque type.
933        let sub_diag = if self.span == other.span {
934            TypeMismatchReason::ConflictType { span: self.span }
935        } else {
936            TypeMismatchReason::PreviousUse { span: self.span }
937        };
938        Ok(tcx.dcx().create_err(OpaqueHiddenTypeMismatch {
939            self_ty,
940            other_ty,
941            other_span: other.span,
942            sub: sub_diag,
943        }))
944    }
945}
946
947pub type Clauses<'tcx> = &'tcx ListWithCachedTypeInfo<Clause<'tcx>>;
948
949impl<'tcx> rustc_type_ir::Flags for Clauses<'tcx> {
950    fn flags(&self) -> TypeFlags {
951        (**self).flags()
952    }
953
954    fn outer_exclusive_binder(&self) -> DebruijnIndex {
955        (**self).outer_exclusive_binder()
956    }
957}
958
959/// When interacting with the type system we must provide information about the
960/// environment. `ParamEnv` is the type that represents this information. See the
961/// [dev guide chapter][param_env_guide] for more information.
962///
963/// [param_env_guide]: https://rustc-dev-guide.rust-lang.org/typing_parameter_envs.html
964#[derive(#[automatically_derived]
impl<'tcx> ::core::fmt::Debug for ParamEnv<'tcx> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field1_finish(f, "ParamEnv",
            "caller_bounds", &&self.caller_bounds)
    }
}Debug, #[automatically_derived]
impl<'tcx> ::core::marker::Copy for ParamEnv<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for ParamEnv<'tcx> {
    #[inline]
    fn clone(&self) -> ParamEnv<'tcx> {
        let _: ::core::clone::AssertParamIsClone<Clauses<'tcx>>;
        *self
    }
}Clone, #[automatically_derived]
impl<'tcx> ::core::hash::Hash for ParamEnv<'tcx> {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.caller_bounds, state)
    }
}Hash, #[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for ParamEnv<'tcx> {
    #[inline]
    fn eq(&self, other: &ParamEnv<'tcx>) -> bool {
        self.caller_bounds == other.caller_bounds
    }
}PartialEq, #[automatically_derived]
impl<'tcx> ::core::cmp::Eq for ParamEnv<'tcx> {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Clauses<'tcx>>;
    }
}Eq)]
965#[derive(const _: () =
    {
        impl<'tcx> ::rustc_data_structures::stable_hasher::HashStable for
            ParamEnv<'tcx> {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    ParamEnv { caller_bounds: ref __binding_0 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
            for ParamEnv<'tcx> {
            fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    ParamEnv { caller_bounds: ref __binding_0 } => {
                        {
                            match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_middle::ty::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as ::rustc_middle::ty::VisitorResult>::output()
            }
        }
    };TypeVisitable, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            for ParamEnv<'tcx> {
            fn try_fold_with<__F: ::rustc_middle::ty::FallibleTypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
                __folder: &mut __F) -> Result<Self, __F::Error> {
                Ok(match self {
                        ParamEnv { caller_bounds: __binding_0 } => {
                            ParamEnv {
                                caller_bounds: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                            }
                        }
                    })
            }
            fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    ParamEnv { caller_bounds: __binding_0 } => {
                        ParamEnv {
                            caller_bounds: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable)]
966pub struct ParamEnv<'tcx> {
967    /// Caller bounds are `Obligation`s that the caller must satisfy. This is
968    /// basically the set of bounds on the in-scope type parameters, translated
969    /// into `Obligation`s, and elaborated and normalized.
970    ///
971    /// Use the `caller_bounds()` method to access.
972    caller_bounds: Clauses<'tcx>,
973}
974
975impl<'tcx> rustc_type_ir::inherent::ParamEnv<TyCtxt<'tcx>> for ParamEnv<'tcx> {
976    fn caller_bounds(self) -> impl inherent::SliceLike<Item = ty::Clause<'tcx>> {
977        self.caller_bounds()
978    }
979}
980
981impl<'tcx> ParamEnv<'tcx> {
982    /// Construct a trait environment suitable for contexts where there are
983    /// no where-clauses in scope. In the majority of cases it is incorrect
984    /// to use an empty environment. See the [dev guide section][param_env_guide]
985    /// for information on what a `ParamEnv` is and how to acquire one.
986    ///
987    /// [param_env_guide]: https://rustc-dev-guide.rust-lang.org/typing_parameter_envs.html
988    #[inline]
989    pub fn empty() -> Self {
990        Self::new(ListWithCachedTypeInfo::empty())
991    }
992
993    #[inline]
994    pub fn caller_bounds(self) -> Clauses<'tcx> {
995        self.caller_bounds
996    }
997
998    /// Construct a trait environment with the given set of predicates.
999    #[inline]
1000    pub fn new(caller_bounds: Clauses<'tcx>) -> Self {
1001        ParamEnv { caller_bounds }
1002    }
1003
1004    /// Creates a pair of param-env and value for use in queries.
1005    pub fn and<T: TypeVisitable<TyCtxt<'tcx>>>(self, value: T) -> ParamEnvAnd<'tcx, T> {
1006        ParamEnvAnd { param_env: self, value }
1007    }
1008}
1009
1010#[derive(#[automatically_derived]
impl<'tcx, T: ::core::marker::Copy> ::core::marker::Copy for
    ParamEnvAnd<'tcx, T> {
}Copy, #[automatically_derived]
impl<'tcx, T: ::core::clone::Clone> ::core::clone::Clone for
    ParamEnvAnd<'tcx, T> {
    #[inline]
    fn clone(&self) -> ParamEnvAnd<'tcx, T> {
        ParamEnvAnd {
            param_env: ::core::clone::Clone::clone(&self.param_env),
            value: ::core::clone::Clone::clone(&self.value),
        }
    }
}Clone, #[automatically_derived]
impl<'tcx, T: ::core::fmt::Debug> ::core::fmt::Debug for ParamEnvAnd<'tcx, T>
    {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "ParamEnvAnd",
            "param_env", &self.param_env, "value", &&self.value)
    }
}Debug, #[automatically_derived]
impl<'tcx, T: ::core::cmp::PartialEq> ::core::cmp::PartialEq for
    ParamEnvAnd<'tcx, T> {
    #[inline]
    fn eq(&self, other: &ParamEnvAnd<'tcx, T>) -> bool {
        self.param_env == other.param_env && self.value == other.value
    }
}PartialEq, #[automatically_derived]
impl<'tcx, T: ::core::cmp::Eq> ::core::cmp::Eq for ParamEnvAnd<'tcx, T> {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<ParamEnv<'tcx>>;
        let _: ::core::cmp::AssertParamIsEq<T>;
    }
}Eq, #[automatically_derived]
impl<'tcx, T: ::core::hash::Hash> ::core::hash::Hash for ParamEnvAnd<'tcx, T>
    {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.param_env, state);
        ::core::hash::Hash::hash(&self.value, state)
    }
}Hash, const _: () =
    {
        impl<'tcx, T>
            ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            for ParamEnvAnd<'tcx, T> where
            T: ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            {
            fn try_fold_with<__F: ::rustc_middle::ty::FallibleTypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
                __folder: &mut __F) -> Result<Self, __F::Error> {
                Ok(match self {
                        ParamEnvAnd { param_env: __binding_0, value: __binding_1 }
                            => {
                            ParamEnvAnd {
                                param_env: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                value: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                            }
                        }
                    })
            }
            fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    ParamEnvAnd { param_env: __binding_0, value: __binding_1 }
                        => {
                        ParamEnvAnd {
                            param_env: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            value: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable, const _: () =
    {
        impl<'tcx, T>
            ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
            for ParamEnvAnd<'tcx, T> where
            T: ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
            {
            fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    ParamEnvAnd {
                        param_env: ref __binding_0, value: ref __binding_1 } => {
                        {
                            match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_middle::ty::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_1,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_middle::ty::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as ::rustc_middle::ty::VisitorResult>::output()
            }
        }
    };TypeVisitable)]
1011#[derive(const _: () =
    {
        impl<'tcx, T> ::rustc_data_structures::stable_hasher::HashStable for
            ParamEnvAnd<'tcx, T> where
            T: ::rustc_data_structures::stable_hasher::HashStable {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    ParamEnvAnd {
                        param_env: ref __binding_0, value: ref __binding_1 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable)]
1012pub struct ParamEnvAnd<'tcx, T> {
1013    pub param_env: ParamEnv<'tcx>,
1014    pub value: T,
1015}
1016
1017/// The environment in which to do trait solving.
1018///
1019/// Most of the time you only need to care about the `ParamEnv`
1020/// as the `TypingMode` is simply stored in the `InferCtxt`.
1021///
1022/// However, there are some places which rely on trait solving
1023/// without using an `InferCtxt` themselves. For these to be
1024/// able to use the trait system they have to be able to initialize
1025/// such an `InferCtxt` with the right `typing_mode`, so they need
1026/// to track both.
1027#[derive(#[automatically_derived]
impl<'tcx> ::core::marker::Copy for TypingEnv<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for TypingEnv<'tcx> {
    #[inline]
    fn clone(&self) -> TypingEnv<'tcx> {
        let _: ::core::clone::AssertParamIsClone<TypingModeEqWrapper<'tcx>>;
        let _: ::core::clone::AssertParamIsClone<ParamEnv<'tcx>>;
        *self
    }
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for TypingEnv<'tcx> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "TypingEnv",
            "typing_mode", &self.typing_mode, "param_env", &&self.param_env)
    }
}Debug, #[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for TypingEnv<'tcx> {
    #[inline]
    fn eq(&self, other: &TypingEnv<'tcx>) -> bool {
        self.typing_mode == other.typing_mode &&
            self.param_env == other.param_env
    }
}PartialEq, #[automatically_derived]
impl<'tcx> ::core::cmp::Eq for TypingEnv<'tcx> {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<TypingModeEqWrapper<'tcx>>;
        let _: ::core::cmp::AssertParamIsEq<ParamEnv<'tcx>>;
    }
}Eq, #[automatically_derived]
impl<'tcx> ::core::hash::Hash for TypingEnv<'tcx> {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.typing_mode, state);
        ::core::hash::Hash::hash(&self.param_env, state)
    }
}Hash, const _: () =
    {
        impl<'tcx> ::rustc_data_structures::stable_hasher::HashStable for
            TypingEnv<'tcx> {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    TypingEnv {
                        typing_mode: ref __binding_0, param_env: ref __binding_1 }
                        => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable)]
1028#[derive(const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
            for TypingEnv<'tcx> {
            fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    TypingEnv { param_env: ref __binding_1, .. } => {
                        {
                            match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_1,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_middle::ty::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as ::rustc_middle::ty::VisitorResult>::output()
            }
        }
    };TypeVisitable, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            for TypingEnv<'tcx> {
            fn try_fold_with<__F: ::rustc_middle::ty::FallibleTypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
                __folder: &mut __F) -> Result<Self, __F::Error> {
                Ok(match self {
                        TypingEnv { typing_mode: __binding_0, param_env: __binding_1
                            } => {
                            TypingEnv {
                                typing_mode: __binding_0,
                                param_env: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                            }
                        }
                    })
            }
            fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    TypingEnv { typing_mode: __binding_0, param_env: __binding_1
                        } => {
                        TypingEnv {
                            typing_mode: __binding_0,
                            param_env: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable)]
1029pub struct TypingEnv<'tcx> {
1030    #[type_foldable(identity)]
1031    #[type_visitable(ignore)]
1032    typing_mode: TypingModeEqWrapper<'tcx>,
1033    pub param_env: ParamEnv<'tcx>,
1034}
1035
1036impl<'tcx> TypingEnv<'tcx> {
1037    pub fn new(param_env: ParamEnv<'tcx>, typing_mode: TypingMode<'tcx>) -> Self {
1038        Self { typing_mode: TypingModeEqWrapper(typing_mode), param_env }
1039    }
1040
1041    pub fn typing_mode(&self) -> TypingMode<'tcx> {
1042        self.typing_mode.0
1043    }
1044
1045    /// Create a typing environment with no where-clauses in scope
1046    /// where all opaque types and default associated items are revealed.
1047    ///
1048    /// This is only suitable for monomorphized, post-typeck environments.
1049    /// Do not use this for MIR optimizations, as even though they also
1050    /// use `TypingMode::PostAnalysis`, they may still have where-clauses
1051    /// in scope.
1052    pub fn fully_monomorphized() -> TypingEnv<'tcx> {
1053        Self::new(ParamEnv::empty(), TypingMode::PostAnalysis)
1054    }
1055
1056    /// Create a typing environment for use during analysis outside of a body.
1057    ///
1058    /// Using a typing environment inside of bodies is not supported as the body
1059    /// may define opaque types. In this case the used functions have to be
1060    /// converted to use proper canonical inputs instead.
1061    pub fn non_body_analysis(
1062        tcx: TyCtxt<'tcx>,
1063        def_id: impl IntoQueryKey<DefId>,
1064    ) -> TypingEnv<'tcx> {
1065        let def_id = def_id.into_query_key();
1066        Self::new(tcx.param_env(def_id), TypingMode::non_body_analysis())
1067    }
1068
1069    pub fn post_analysis(tcx: TyCtxt<'tcx>, def_id: impl IntoQueryKey<DefId>) -> TypingEnv<'tcx> {
1070        let def_id = def_id.into_query_key();
1071        tcx.typing_env_normalized_for_post_analysis(def_id)
1072    }
1073
1074    /// Modify the `typing_mode` to `PostAnalysis` and eagerly reveal all
1075    /// opaque types in the `param_env`.
1076    pub fn with_post_analysis_normalized(self, tcx: TyCtxt<'tcx>) -> TypingEnv<'tcx> {
1077        let TypingEnv { typing_mode, param_env } = self;
1078        match typing_mode.0 {
1079            TypingMode::Coherence
1080            | TypingMode::Analysis { .. }
1081            | TypingMode::Borrowck { .. }
1082            | TypingMode::PostBorrowckAnalysis { .. } => {}
1083            TypingMode::PostAnalysis => return self,
1084        }
1085
1086        // No need to reveal opaques with the new solver enabled,
1087        // since we have lazy norm.
1088        let param_env = if tcx.next_trait_solver_globally() {
1089            param_env
1090        } else {
1091            ParamEnv::new(tcx.reveal_opaque_types_in_bounds(param_env.caller_bounds()))
1092        };
1093        TypingEnv { typing_mode: TypingModeEqWrapper(TypingMode::PostAnalysis), param_env }
1094    }
1095
1096    /// Combine this typing environment with the given `value` to be used by
1097    /// not (yet) canonicalized queries. This only works if the value does not
1098    /// contain anything local to some `InferCtxt`, i.e. inference variables or
1099    /// placeholders.
1100    pub fn as_query_input<T>(self, value: T) -> PseudoCanonicalInput<'tcx, T>
1101    where
1102        T: TypeVisitable<TyCtxt<'tcx>>,
1103    {
1104        // FIXME(#132279): We should assert that the value does not contain any placeholders
1105        // as these placeholders are also local to the current inference context. However, we
1106        // currently use pseudo-canonical queries in the trait solver, which replaces params
1107        // with placeholders during canonicalization. We should also simply not use pseudo-
1108        // canonical queries in the trait solver, at which point we can readd this assert.
1109        //
1110        // As of writing this comment, this is only used when normalizing consts that mention
1111        // params.
1112        /* debug_assert!(
1113            !value.has_placeholders(),
1114            "{value:?} which has placeholder shouldn't be pseudo-canonicalized"
1115        ); */
1116        PseudoCanonicalInput { typing_env: self, value }
1117    }
1118}
1119
1120/// Similar to `CanonicalInput`, this carries the `typing_mode` and the environment
1121/// necessary to do any kind of trait solving inside of nested queries.
1122///
1123/// Unlike proper canonicalization, this requires the `param_env` and the `value` to not
1124/// contain anything local to the `infcx` of the caller, so we don't actually canonicalize
1125/// anything.
1126///
1127/// This should be created by using `infcx.pseudo_canonicalize_query(param_env, value)`
1128/// or by using `typing_env.as_query_input(value)`.
1129#[derive(#[automatically_derived]
impl<'tcx, T: ::core::marker::Copy> ::core::marker::Copy for
    PseudoCanonicalInput<'tcx, T> {
}Copy, #[automatically_derived]
impl<'tcx, T: ::core::clone::Clone> ::core::clone::Clone for
    PseudoCanonicalInput<'tcx, T> {
    #[inline]
    fn clone(&self) -> PseudoCanonicalInput<'tcx, T> {
        PseudoCanonicalInput {
            typing_env: ::core::clone::Clone::clone(&self.typing_env),
            value: ::core::clone::Clone::clone(&self.value),
        }
    }
}Clone, #[automatically_derived]
impl<'tcx, T: ::core::fmt::Debug> ::core::fmt::Debug for
    PseudoCanonicalInput<'tcx, T> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "PseudoCanonicalInput", "typing_env", &self.typing_env, "value",
            &&self.value)
    }
}Debug, #[automatically_derived]
impl<'tcx, T: ::core::cmp::PartialEq> ::core::cmp::PartialEq for
    PseudoCanonicalInput<'tcx, T> {
    #[inline]
    fn eq(&self, other: &PseudoCanonicalInput<'tcx, T>) -> bool {
        self.typing_env == other.typing_env && self.value == other.value
    }
}PartialEq, #[automatically_derived]
impl<'tcx, T: ::core::cmp::Eq> ::core::cmp::Eq for
    PseudoCanonicalInput<'tcx, T> {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<TypingEnv<'tcx>>;
        let _: ::core::cmp::AssertParamIsEq<T>;
    }
}Eq, #[automatically_derived]
impl<'tcx, T: ::core::hash::Hash> ::core::hash::Hash for
    PseudoCanonicalInput<'tcx, T> {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.typing_env, state);
        ::core::hash::Hash::hash(&self.value, state)
    }
}Hash)]
1130#[derive(const _: () =
    {
        impl<'tcx, T> ::rustc_data_structures::stable_hasher::HashStable for
            PseudoCanonicalInput<'tcx, T> where
            T: ::rustc_data_structures::stable_hasher::HashStable {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    PseudoCanonicalInput {
                        typing_env: ref __binding_0, value: ref __binding_1 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable, const _: () =
    {
        impl<'tcx, T>
            ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
            for PseudoCanonicalInput<'tcx, T> where
            T: ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
            {
            fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    PseudoCanonicalInput {
                        typing_env: ref __binding_0, value: ref __binding_1 } => {
                        {
                            match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_middle::ty::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_1,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_middle::ty::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as ::rustc_middle::ty::VisitorResult>::output()
            }
        }
    };TypeVisitable, const _: () =
    {
        impl<'tcx, T>
            ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            for PseudoCanonicalInput<'tcx, T> where
            T: ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            {
            fn try_fold_with<__F: ::rustc_middle::ty::FallibleTypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
                __folder: &mut __F) -> Result<Self, __F::Error> {
                Ok(match self {
                        PseudoCanonicalInput {
                            typing_env: __binding_0, value: __binding_1 } => {
                            PseudoCanonicalInput {
                                typing_env: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                value: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                            }
                        }
                    })
            }
            fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    PseudoCanonicalInput {
                        typing_env: __binding_0, value: __binding_1 } => {
                        PseudoCanonicalInput {
                            typing_env: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            value: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable)]
1131pub struct PseudoCanonicalInput<'tcx, T> {
1132    pub typing_env: TypingEnv<'tcx>,
1133    pub value: T,
1134}
1135
1136#[derive(#[automatically_derived]
impl ::core::marker::Copy for Destructor { }Copy, #[automatically_derived]
impl ::core::clone::Clone for Destructor {
    #[inline]
    fn clone(&self) -> Destructor {
        let _: ::core::clone::AssertParamIsClone<DefId>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for Destructor {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field1_finish(f, "Destructor",
            "did", &&self.did)
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hasher::HashStable for Destructor
            {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    Destructor { did: ref __binding_0 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Destructor {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    Destructor { did: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Destructor {
            fn decode(__decoder: &mut __D) -> Self {
                Destructor {
                    did: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable)]
1137pub struct Destructor {
1138    /// The `DefId` of the destructor method
1139    pub did: DefId,
1140}
1141
1142// FIXME: consider combining this definition with regular `Destructor`
1143#[derive(#[automatically_derived]
impl ::core::marker::Copy for AsyncDestructor { }Copy, #[automatically_derived]
impl ::core::clone::Clone for AsyncDestructor {
    #[inline]
    fn clone(&self) -> AsyncDestructor {
        let _: ::core::clone::AssertParamIsClone<DefId>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for AsyncDestructor {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field1_finish(f,
            "AsyncDestructor", "impl_did", &&self.impl_did)
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hasher::HashStable for
            AsyncDestructor {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    AsyncDestructor { impl_did: ref __binding_0 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for AsyncDestructor {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    AsyncDestructor { impl_did: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for AsyncDestructor {
            fn decode(__decoder: &mut __D) -> Self {
                AsyncDestructor {
                    impl_did: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable)]
1144pub struct AsyncDestructor {
1145    /// The `DefId` of the `impl AsyncDrop`
1146    pub impl_did: DefId,
1147}
1148
1149#[derive(#[automatically_derived]
impl ::core::clone::Clone for VariantFlags {
    #[inline]
    fn clone(&self) -> VariantFlags {
        let _: ::core::clone::AssertParamIsClone<u8>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for VariantFlags { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for VariantFlags {
    #[inline]
    fn eq(&self, other: &VariantFlags) -> bool { self.0 == other.0 }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for VariantFlags {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<u8>;
    }
}Eq, const _: () =
    {
        impl ::rustc_data_structures::stable_hasher::HashStable for
            VariantFlags {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    VariantFlags(ref __binding_0) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for VariantFlags {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    VariantFlags(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for VariantFlags {
            fn decode(__decoder: &mut __D) -> Self {
                VariantFlags(::rustc_serialize::Decodable::decode(__decoder))
            }
        }
    };TyDecodable)]
1150pub struct VariantFlags(u8);
1151impl VariantFlags {
    #[allow(deprecated, non_upper_case_globals,)]
    pub const NO_VARIANT_FLAGS: Self = Self::from_bits_retain(0);
    #[doc =
    r" Indicates whether the field list of this variant is `#[non_exhaustive]`."]
    #[allow(deprecated, non_upper_case_globals,)]
    pub const IS_FIELD_LIST_NON_EXHAUSTIVE: Self =
        Self::from_bits_retain(1 << 0);
}
impl ::bitflags::Flags for VariantFlags {
    const FLAGS: &'static [::bitflags::Flag<VariantFlags>] =
        &[{

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("NO_VARIANT_FLAGS",
                            VariantFlags::NO_VARIANT_FLAGS)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("IS_FIELD_LIST_NON_EXHAUSTIVE",
                            VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE)
                    }];
    type Bits = u8;
    fn bits(&self) -> u8 { VariantFlags::bits(self) }
    fn from_bits_retain(bits: u8) -> VariantFlags {
        VariantFlags::from_bits_retain(bits)
    }
}
#[allow(dead_code, deprecated, unused_doc_comments, unused_attributes,
unused_mut, unused_imports, non_upper_case_globals, clippy ::
assign_op_pattern, clippy :: iter_without_into_iter,)]
const _: () =
    {
        #[allow(dead_code, deprecated, unused_attributes)]
        impl VariantFlags {
            /// Get a flags value with all bits unset.
            #[inline]
            pub const fn empty() -> Self {
                Self(<u8 as ::bitflags::Bits>::EMPTY)
            }
            /// Get a flags value with all known bits set.
            #[inline]
            pub const fn all() -> Self {
                let mut truncated = <u8 as ::bitflags::Bits>::EMPTY;
                let mut i = 0;
                {
                    {
                        let flag =
                            <VariantFlags as
                                            ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <VariantFlags as
                                            ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                let _ = i;
                Self(truncated)
            }
            /// Get the underlying bits value.
            ///
            /// The returned value is exactly the bits set in this flags value.
            #[inline]
            pub const fn bits(&self) -> u8 { self.0 }
            /// Convert from a bits value.
            ///
            /// This method will return `None` if any unknown bits are set.
            #[inline]
            pub const fn from_bits(bits: u8)
                -> ::bitflags::__private::core::option::Option<Self> {
                let truncated = Self::from_bits_truncate(bits).0;
                if truncated == bits {
                    ::bitflags::__private::core::option::Option::Some(Self(bits))
                } else { ::bitflags::__private::core::option::Option::None }
            }
            /// Convert from a bits value, unsetting any unknown bits.
            #[inline]
            pub const fn from_bits_truncate(bits: u8) -> Self {
                Self(bits & Self::all().0)
            }
            /// Convert from a bits value exactly.
            #[inline]
            pub const fn from_bits_retain(bits: u8) -> Self { Self(bits) }
            /// Get a flags value with the bits of a flag with the given name set.
            ///
            /// This method will return `None` if `name` is empty or doesn't
            /// correspond to any named flag.
            #[inline]
            pub fn from_name(name: &str)
                -> ::bitflags::__private::core::option::Option<Self> {
                {
                    if name == "NO_VARIANT_FLAGS" {
                        return ::bitflags::__private::core::option::Option::Some(Self(VariantFlags::NO_VARIANT_FLAGS.bits()));
                    }
                };
                ;
                {
                    if name == "IS_FIELD_LIST_NON_EXHAUSTIVE" {
                        return ::bitflags::__private::core::option::Option::Some(Self(VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE.bits()));
                    }
                };
                ;
                let _ = name;
                ::bitflags::__private::core::option::Option::None
            }
            /// Whether all bits in this flags value are unset.
            #[inline]
            pub const fn is_empty(&self) -> bool {
                self.0 == <u8 as ::bitflags::Bits>::EMPTY
            }
            /// Whether all known bits in this flags value are set.
            #[inline]
            pub const fn is_all(&self) -> bool {
                Self::all().0 | self.0 == self.0
            }
            /// Whether any set bits in a source flags value are also set in a target flags value.
            #[inline]
            pub const fn intersects(&self, other: Self) -> bool {
                self.0 & other.0 != <u8 as ::bitflags::Bits>::EMPTY
            }
            /// Whether all set bits in a source flags value are also set in a target flags value.
            #[inline]
            pub const fn contains(&self, other: Self) -> bool {
                self.0 & other.0 == other.0
            }
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            pub fn insert(&mut self, other: Self) {
                *self = Self(self.0).union(other);
            }
            /// The intersection of a source flags value with the complement of a target flags
            /// value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `remove` won't truncate `other`, but the `!` operator will.
            #[inline]
            pub fn remove(&mut self, other: Self) {
                *self = Self(self.0).difference(other);
            }
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            pub fn toggle(&mut self, other: Self) {
                *self = Self(self.0).symmetric_difference(other);
            }
            /// Call `insert` when `value` is `true` or `remove` when `value` is `false`.
            #[inline]
            pub fn set(&mut self, other: Self, value: bool) {
                if value { self.insert(other); } else { self.remove(other); }
            }
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn intersection(self, other: Self) -> Self {
                Self(self.0 & other.0)
            }
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn union(self, other: Self) -> Self {
                Self(self.0 | other.0)
            }
            /// The intersection of a source flags value with the complement of a target flags
            /// value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            #[must_use]
            pub const fn difference(self, other: Self) -> Self {
                Self(self.0 & !other.0)
            }
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn symmetric_difference(self, other: Self) -> Self {
                Self(self.0 ^ other.0)
            }
            /// The bitwise negation (`!`) of the bits in a flags value, truncating the result.
            #[inline]
            #[must_use]
            pub const fn complement(self) -> Self {
                Self::from_bits_truncate(!self.0)
            }
        }
        impl ::bitflags::__private::core::fmt::Binary for VariantFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::Binary::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::Octal for VariantFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::Octal::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::LowerHex for VariantFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::LowerHex::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::UpperHex for VariantFlags {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::UpperHex::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::ops::BitOr for VariantFlags {
            type Output = Self;
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            fn bitor(self, other: VariantFlags) -> Self { self.union(other) }
        }
        impl ::bitflags::__private::core::ops::BitOrAssign for VariantFlags {
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            fn bitor_assign(&mut self, other: Self) { self.insert(other); }
        }
        impl ::bitflags::__private::core::ops::BitXor for VariantFlags {
            type Output = Self;
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            fn bitxor(self, other: Self) -> Self {
                self.symmetric_difference(other)
            }
        }
        impl ::bitflags::__private::core::ops::BitXorAssign for VariantFlags {
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            fn bitxor_assign(&mut self, other: Self) { self.toggle(other); }
        }
        impl ::bitflags::__private::core::ops::BitAnd for VariantFlags {
            type Output = Self;
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            fn bitand(self, other: Self) -> Self { self.intersection(other) }
        }
        impl ::bitflags::__private::core::ops::BitAndAssign for VariantFlags {
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            fn bitand_assign(&mut self, other: Self) {
                *self =
                    Self::from_bits_retain(self.bits()).intersection(other);
            }
        }
        impl ::bitflags::__private::core::ops::Sub for VariantFlags {
            type Output = Self;
            /// The intersection of a source flags value with the complement of a target flags value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            fn sub(self, other: Self) -> Self { self.difference(other) }
        }
        impl ::bitflags::__private::core::ops::SubAssign for VariantFlags {
            /// The intersection of a source flags value with the complement of a target flags value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            fn sub_assign(&mut self, other: Self) { self.remove(other); }
        }
        impl ::bitflags::__private::core::ops::Not for VariantFlags {
            type Output = Self;
            /// The bitwise negation (`!`) of the bits in a flags value, truncating the result.
            #[inline]
            fn not(self) -> Self { self.complement() }
        }
        impl ::bitflags::__private::core::iter::Extend<VariantFlags> for
            VariantFlags {
            /// The bitwise or (`|`) of the bits in each flags value.
            fn extend<T: ::bitflags::__private::core::iter::IntoIterator<Item
                = Self>>(&mut self, iterator: T) {
                for item in iterator { self.insert(item) }
            }
        }
        impl ::bitflags::__private::core::iter::FromIterator<VariantFlags> for
            VariantFlags {
            /// The bitwise or (`|`) of the bits in each flags value.
            fn from_iter<T: ::bitflags::__private::core::iter::IntoIterator<Item
                = Self>>(iterator: T) -> Self {
                use ::bitflags::__private::core::iter::Extend;
                let mut result = Self::empty();
                result.extend(iterator);
                result
            }
        }
        impl VariantFlags {
            /// Yield a set of contained flags values.
            ///
            /// Each yielded flags value will correspond to a defined named flag. Any unknown bits
            /// will be yielded together as a final flags value.
            #[inline]
            pub const fn iter(&self) -> ::bitflags::iter::Iter<VariantFlags> {
                ::bitflags::iter::Iter::__private_const_new(<VariantFlags as
                        ::bitflags::Flags>::FLAGS,
                    VariantFlags::from_bits_retain(self.bits()),
                    VariantFlags::from_bits_retain(self.bits()))
            }
            /// Yield a set of contained named flags values.
            ///
            /// This method is like [`iter`](#method.iter), except only yields bits in contained named flags.
            /// Any unknown bits, or bits not corresponding to a contained flag will not be yielded.
            #[inline]
            pub const fn iter_names(&self)
                -> ::bitflags::iter::IterNames<VariantFlags> {
                ::bitflags::iter::IterNames::__private_const_new(<VariantFlags
                        as ::bitflags::Flags>::FLAGS,
                    VariantFlags::from_bits_retain(self.bits()),
                    VariantFlags::from_bits_retain(self.bits()))
            }
        }
        impl ::bitflags::__private::core::iter::IntoIterator for VariantFlags
            {
            type Item = VariantFlags;
            type IntoIter = ::bitflags::iter::Iter<VariantFlags>;
            fn into_iter(self) -> Self::IntoIter { self.iter() }
        }
    };bitflags::bitflags! {
1152    impl VariantFlags: u8 {
1153        const NO_VARIANT_FLAGS        = 0;
1154        /// Indicates whether the field list of this variant is `#[non_exhaustive]`.
1155        const IS_FIELD_LIST_NON_EXHAUSTIVE = 1 << 0;
1156    }
1157}
1158impl ::std::fmt::Debug for VariantFlags {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        ::bitflags::parser::to_writer(self, f)
    }
}rustc_data_structures::external_bitflags_debug! { VariantFlags }
1159
1160/// Definition of a variant -- a struct's fields or an enum variant.
1161#[derive(#[automatically_derived]
impl ::core::fmt::Debug for VariantDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["def_id", "ctor", "name", "discr", "fields", "tainted",
                        "flags"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.def_id, &self.ctor, &self.name, &self.discr, &self.fields,
                        &self.tainted, &&self.flags];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "VariantDef",
            names, values)
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hasher::HashStable for VariantDef
            {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    VariantDef {
                        def_id: ref __binding_0,
                        ctor: ref __binding_1,
                        name: ref __binding_2,
                        discr: ref __binding_3,
                        fields: ref __binding_4,
                        tainted: ref __binding_5,
                        flags: ref __binding_6 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                        { __binding_2.hash_stable(__hcx, __hasher); }
                        { __binding_3.hash_stable(__hcx, __hasher); }
                        { __binding_4.hash_stable(__hcx, __hasher); }
                        { __binding_5.hash_stable(__hcx, __hasher); }
                        { __binding_6.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for VariantDef {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    VariantDef {
                        def_id: ref __binding_0,
                        ctor: ref __binding_1,
                        name: ref __binding_2,
                        discr: ref __binding_3,
                        fields: ref __binding_4,
                        tainted: ref __binding_5,
                        flags: ref __binding_6 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_5,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_6,
                            __encoder);
                    }
                }
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for VariantDef {
            fn decode(__decoder: &mut __D) -> Self {
                VariantDef {
                    def_id: ::rustc_serialize::Decodable::decode(__decoder),
                    ctor: ::rustc_serialize::Decodable::decode(__decoder),
                    name: ::rustc_serialize::Decodable::decode(__decoder),
                    discr: ::rustc_serialize::Decodable::decode(__decoder),
                    fields: ::rustc_serialize::Decodable::decode(__decoder),
                    tainted: ::rustc_serialize::Decodable::decode(__decoder),
                    flags: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };TyDecodable)]
1162pub struct VariantDef {
1163    /// `DefId` that identifies the variant itself.
1164    /// If this variant belongs to a struct or union, then this is a copy of its `DefId`.
1165    pub def_id: DefId,
1166    /// `DefId` that identifies the variant's constructor.
1167    /// If this variant is a struct variant, then this is `None`.
1168    pub ctor: Option<(CtorKind, DefId)>,
1169    /// Variant or struct name.
1170    pub name: Symbol,
1171    /// Discriminant of this variant.
1172    pub discr: VariantDiscr,
1173    /// Fields of this variant.
1174    pub fields: IndexVec<FieldIdx, FieldDef>,
1175    /// The error guarantees from parser, if any.
1176    tainted: Option<ErrorGuaranteed>,
1177    /// Flags of the variant (e.g. is field list non-exhaustive)?
1178    flags: VariantFlags,
1179}
1180
1181impl VariantDef {
1182    /// Creates a new `VariantDef`.
1183    ///
1184    /// `variant_did` is the `DefId` that identifies the enum variant (if this `VariantDef`
1185    /// represents an enum variant).
1186    ///
1187    /// `ctor_did` is the `DefId` that identifies the constructor of unit or
1188    /// tuple-variants/structs. If this is a `struct`-variant then this should be `None`.
1189    ///
1190    /// `parent_did` is the `DefId` of the `AdtDef` representing the enum or struct that
1191    /// owns this variant. It is used for checking if a struct has `#[non_exhaustive]` w/out having
1192    /// to go through the redirect of checking the ctor's attributes - but compiling a small crate
1193    /// requires loading the `AdtDef`s for all the structs in the universe (e.g., coherence for any
1194    /// built-in trait), and we do not want to load attributes twice.
1195    ///
1196    /// If someone speeds up attribute loading to not be a performance concern, they can
1197    /// remove this hack and use the constructor `DefId` everywhere.
1198    #[allow(clippy :: suspicious_else_formatting)]
{
    let __tracing_attr_span;
    let __tracing_attr_guard;
    if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::DEBUG <=
                    ::tracing::level_filters::LevelFilter::current() ||
            { false } {
        __tracing_attr_span =
            {
                use ::tracing::__macro_support::Callsite as _;
                static __CALLSITE: ::tracing::callsite::DefaultCallsite =
                    {
                        static META: ::tracing::Metadata<'static> =
                            {
                                ::tracing_core::metadata::Metadata::new("new",
                                    "rustc_middle::ty", ::tracing::Level::DEBUG,
                                    ::tracing_core::__macro_support::Option::Some("compiler/rustc_middle/src/ty/mod.rs"),
                                    ::tracing_core::__macro_support::Option::Some(1198u32),
                                    ::tracing_core::__macro_support::Option::Some("rustc_middle::ty"),
                                    ::tracing_core::field::FieldSet::new(&["name",
                                                    "variant_did", "ctor", "discr", "fields", "parent_did",
                                                    "recover_tainted", "is_field_list_non_exhaustive"],
                                        ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                    ::tracing::metadata::Kind::SPAN)
                            };
                        ::tracing::callsite::DefaultCallsite::new(&META)
                    };
                let mut interest = ::tracing::subscriber::Interest::never();
                if ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::STATIC_MAX_LEVEL &&
                                ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::LevelFilter::current() &&
                            { interest = __CALLSITE.interest(); !interest.is_never() }
                        &&
                        ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                            interest) {
                    let meta = __CALLSITE.metadata();
                    ::tracing::Span::new(meta,
                        &{
                                #[allow(unused_imports)]
                                use ::tracing::field::{debug, display, Value};
                                let mut iter = meta.fields().iter();
                                meta.fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
                                                    ::tracing::__macro_support::Option::Some(&::tracing::field::debug(&name)
                                                            as &dyn Value)),
                                                (&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
                                                    ::tracing::__macro_support::Option::Some(&::tracing::field::debug(&variant_did)
                                                            as &dyn Value)),
                                                (&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
                                                    ::tracing::__macro_support::Option::Some(&::tracing::field::debug(&ctor)
                                                            as &dyn Value)),
                                                (&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
                                                    ::tracing::__macro_support::Option::Some(&::tracing::field::debug(&discr)
                                                            as &dyn Value)),
                                                (&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
                                                    ::tracing::__macro_support::Option::Some(&::tracing::field::debug(&fields)
                                                            as &dyn Value)),
                                                (&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
                                                    ::tracing::__macro_support::Option::Some(&::tracing::field::debug(&parent_did)
                                                            as &dyn Value)),
                                                (&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
                                                    ::tracing::__macro_support::Option::Some(&::tracing::field::debug(&recover_tainted)
                                                            as &dyn Value)),
                                                (&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
                                                    ::tracing::__macro_support::Option::Some(&is_field_list_non_exhaustive
                                                            as &dyn Value))])
                            })
                } else {
                    let span =
                        ::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
                    {};
                    span
                }
            };
        __tracing_attr_guard = __tracing_attr_span.enter();
    }

    #[warn(clippy :: suspicious_else_formatting)]
    {

        #[allow(unknown_lints, unreachable_code, clippy ::
        diverging_sub_expression, clippy :: empty_loop, clippy ::
        let_unit_value, clippy :: let_with_type_underscore, clippy ::
        needless_return, clippy :: unreachable)]
        if false {
            let __tracing_attr_fake_return: Self = loop {};
            return __tracing_attr_fake_return;
        }
        {
            let mut flags = VariantFlags::NO_VARIANT_FLAGS;
            if is_field_list_non_exhaustive {
                flags |= VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE;
            }
            VariantDef {
                def_id: variant_did.unwrap_or(parent_did),
                ctor,
                name,
                discr,
                fields,
                flags,
                tainted: recover_tainted,
            }
        }
    }
}#[instrument(level = "debug")]
1199    pub fn new(
1200        name: Symbol,
1201        variant_did: Option<DefId>,
1202        ctor: Option<(CtorKind, DefId)>,
1203        discr: VariantDiscr,
1204        fields: IndexVec<FieldIdx, FieldDef>,
1205        parent_did: DefId,
1206        recover_tainted: Option<ErrorGuaranteed>,
1207        is_field_list_non_exhaustive: bool,
1208    ) -> Self {
1209        let mut flags = VariantFlags::NO_VARIANT_FLAGS;
1210        if is_field_list_non_exhaustive {
1211            flags |= VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE;
1212        }
1213
1214        VariantDef {
1215            def_id: variant_did.unwrap_or(parent_did),
1216            ctor,
1217            name,
1218            discr,
1219            fields,
1220            flags,
1221            tainted: recover_tainted,
1222        }
1223    }
1224
1225    /// Returns `true` if the field list of this variant is `#[non_exhaustive]`.
1226    ///
1227    /// Note that this function will return `true` even if the type has been
1228    /// defined in the crate currently being compiled. If that's not what you
1229    /// want, see [`Self::field_list_has_applicable_non_exhaustive`].
1230    #[inline]
1231    pub fn is_field_list_non_exhaustive(&self) -> bool {
1232        self.flags.intersects(VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE)
1233    }
1234
1235    /// Returns `true` if the field list of this variant is `#[non_exhaustive]`
1236    /// and the type has been defined in another crate.
1237    #[inline]
1238    pub fn field_list_has_applicable_non_exhaustive(&self) -> bool {
1239        self.is_field_list_non_exhaustive() && !self.def_id.is_local()
1240    }
1241
1242    /// Computes the `Ident` of this variant by looking up the `Span`
1243    pub fn ident(&self, tcx: TyCtxt<'_>) -> Ident {
1244        Ident::new(self.name, tcx.def_ident_span(self.def_id).unwrap())
1245    }
1246
1247    /// Was this variant obtained as part of recovering from a syntactic error?
1248    #[inline]
1249    pub fn has_errors(&self) -> Result<(), ErrorGuaranteed> {
1250        self.tainted.map_or(Ok(()), Err)
1251    }
1252
1253    #[inline]
1254    pub fn ctor_kind(&self) -> Option<CtorKind> {
1255        self.ctor.map(|(kind, _)| kind)
1256    }
1257
1258    #[inline]
1259    pub fn ctor_def_id(&self) -> Option<DefId> {
1260        self.ctor.map(|(_, def_id)| def_id)
1261    }
1262
1263    /// Returns the one field in this variant.
1264    ///
1265    /// `panic!`s if there are no fields or multiple fields.
1266    #[inline]
1267    pub fn single_field(&self) -> &FieldDef {
1268        if !(self.fields.len() == 1) {
    ::core::panicking::panic("assertion failed: self.fields.len() == 1")
};assert!(self.fields.len() == 1);
1269
1270        &self.fields[FieldIdx::ZERO]
1271    }
1272
1273    /// Returns the last field in this variant, if present.
1274    #[inline]
1275    pub fn tail_opt(&self) -> Option<&FieldDef> {
1276        self.fields.raw.last()
1277    }
1278
1279    /// Returns the last field in this variant.
1280    ///
1281    /// # Panics
1282    ///
1283    /// Panics, if the variant has no fields.
1284    #[inline]
1285    pub fn tail(&self) -> &FieldDef {
1286        self.tail_opt().expect("expected unsized ADT to have a tail field")
1287    }
1288
1289    /// Returns whether this variant has unsafe fields.
1290    pub fn has_unsafe_fields(&self) -> bool {
1291        self.fields.iter().any(|x| x.safety.is_unsafe())
1292    }
1293}
1294
1295impl PartialEq for VariantDef {
1296    #[inline]
1297    fn eq(&self, other: &Self) -> bool {
1298        // There should be only one `VariantDef` for each `def_id`, therefore
1299        // it is fine to implement `PartialEq` only based on `def_id`.
1300        //
1301        // Below, we exhaustively destructure `self` and `other` so that if the
1302        // definition of `VariantDef` changes, a compile-error will be produced,
1303        // reminding us to revisit this assumption.
1304
1305        let Self {
1306            def_id: lhs_def_id,
1307            ctor: _,
1308            name: _,
1309            discr: _,
1310            fields: _,
1311            flags: _,
1312            tainted: _,
1313        } = &self;
1314        let Self {
1315            def_id: rhs_def_id,
1316            ctor: _,
1317            name: _,
1318            discr: _,
1319            fields: _,
1320            flags: _,
1321            tainted: _,
1322        } = other;
1323
1324        let res = lhs_def_id == rhs_def_id;
1325
1326        // Double check that implicit assumption detailed above.
1327        if truecfg!(debug_assertions) && res {
1328            let deep = self.ctor == other.ctor
1329                && self.name == other.name
1330                && self.discr == other.discr
1331                && self.fields == other.fields
1332                && self.flags == other.flags;
1333            if !deep {
    {
        ::core::panicking::panic_fmt(format_args!("VariantDef for the same def-id has differing data"));
    }
};assert!(deep, "VariantDef for the same def-id has differing data");
1334        }
1335
1336        res
1337    }
1338}
1339
1340impl Eq for VariantDef {}
1341
1342impl Hash for VariantDef {
1343    #[inline]
1344    fn hash<H: Hasher>(&self, s: &mut H) {
1345        // There should be only one `VariantDef` for each `def_id`, therefore
1346        // it is fine to implement `Hash` only based on `def_id`.
1347        //
1348        // Below, we exhaustively destructure `self` so that if the definition
1349        // of `VariantDef` changes, a compile-error will be produced, reminding
1350        // us to revisit this assumption.
1351
1352        let Self { def_id, ctor: _, name: _, discr: _, fields: _, flags: _, tainted: _ } = &self;
1353        def_id.hash(s)
1354    }
1355}
1356
1357#[derive(#[automatically_derived]
impl ::core::marker::Copy for VariantDiscr { }Copy, #[automatically_derived]
impl ::core::clone::Clone for VariantDiscr {
    #[inline]
    fn clone(&self) -> VariantDiscr {
        let _: ::core::clone::AssertParamIsClone<DefId>;
        let _: ::core::clone::AssertParamIsClone<u32>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for VariantDiscr {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            VariantDiscr::Explicit(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Explicit", &__self_0),
            VariantDiscr::Relative(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Relative", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for VariantDiscr {
    #[inline]
    fn eq(&self, other: &VariantDiscr) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (VariantDiscr::Explicit(__self_0),
                    VariantDiscr::Explicit(__arg1_0)) => __self_0 == __arg1_0,
                (VariantDiscr::Relative(__self_0),
                    VariantDiscr::Relative(__arg1_0)) => __self_0 == __arg1_0,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for VariantDiscr {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<DefId>;
        let _: ::core::cmp::AssertParamIsEq<u32>;
    }
}Eq, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for VariantDiscr {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        VariantDiscr::Explicit(ref __binding_0) => { 0usize }
                        VariantDiscr::Relative(ref __binding_0) => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    VariantDiscr::Explicit(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    VariantDiscr::Relative(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for VariantDiscr {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        VariantDiscr::Explicit(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        VariantDiscr::Relative(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `VariantDiscr`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable, const _: () =
    {
        impl ::rustc_data_structures::stable_hasher::HashStable for
            VariantDiscr {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                ::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
                match *self {
                    VariantDiscr::Explicit(ref __binding_0) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                    VariantDiscr::Relative(ref __binding_0) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable)]
1358pub enum VariantDiscr {
1359    /// Explicit value for this variant, i.e., `X = 123`.
1360    /// The `DefId` corresponds to the embedded constant.
1361    Explicit(DefId),
1362
1363    /// The previous variant's discriminant plus one.
1364    /// For efficiency reasons, the distance from the
1365    /// last `Explicit` discriminant is being stored,
1366    /// or `0` for the first variant, if it has none.
1367    Relative(u32),
1368}
1369
1370#[derive(#[automatically_derived]
impl ::core::fmt::Debug for FieldDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f, "FieldDef",
            "did", &self.did, "name", &self.name, "vis", &self.vis, "safety",
            &self.safety, "value", &&self.value)
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hasher::HashStable for FieldDef {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    FieldDef {
                        did: ref __binding_0,
                        name: ref __binding_1,
                        vis: ref __binding_2,
                        safety: ref __binding_3,
                        value: ref __binding_4 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                        { __binding_2.hash_stable(__hcx, __hasher); }
                        { __binding_3.hash_stable(__hcx, __hasher); }
                        { __binding_4.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for FieldDef {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    FieldDef {
                        did: ref __binding_0,
                        name: ref __binding_1,
                        vis: ref __binding_2,
                        safety: ref __binding_3,
                        value: ref __binding_4 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                            __encoder);
                    }
                }
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for FieldDef {
            fn decode(__decoder: &mut __D) -> Self {
                FieldDef {
                    did: ::rustc_serialize::Decodable::decode(__decoder),
                    name: ::rustc_serialize::Decodable::decode(__decoder),
                    vis: ::rustc_serialize::Decodable::decode(__decoder),
                    safety: ::rustc_serialize::Decodable::decode(__decoder),
                    value: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };TyDecodable)]
1371pub struct FieldDef {
1372    pub did: DefId,
1373    pub name: Symbol,
1374    pub vis: Visibility<DefId>,
1375    pub safety: hir::Safety,
1376    pub value: Option<DefId>,
1377}
1378
1379impl PartialEq for FieldDef {
1380    #[inline]
1381    fn eq(&self, other: &Self) -> bool {
1382        // There should be only one `FieldDef` for each `did`, therefore it is
1383        // fine to implement `PartialEq` only based on `did`.
1384        //
1385        // Below, we exhaustively destructure `self` so that if the definition
1386        // of `FieldDef` changes, a compile-error will be produced, reminding
1387        // us to revisit this assumption.
1388
1389        let Self { did: lhs_did, name: _, vis: _, safety: _, value: _ } = &self;
1390
1391        let Self { did: rhs_did, name: _, vis: _, safety: _, value: _ } = other;
1392
1393        let res = lhs_did == rhs_did;
1394
1395        // Double check that implicit assumption detailed above.
1396        if truecfg!(debug_assertions) && res {
1397            let deep =
1398                self.name == other.name && self.vis == other.vis && self.safety == other.safety;
1399            if !deep {
    {
        ::core::panicking::panic_fmt(format_args!("FieldDef for the same def-id has differing data"));
    }
};assert!(deep, "FieldDef for the same def-id has differing data");
1400        }
1401
1402        res
1403    }
1404}
1405
1406impl Eq for FieldDef {}
1407
1408impl Hash for FieldDef {
1409    #[inline]
1410    fn hash<H: Hasher>(&self, s: &mut H) {
1411        // There should be only one `FieldDef` for each `did`, therefore it is
1412        // fine to implement `Hash` only based on `did`.
1413        //
1414        // Below, we exhaustively destructure `self` so that if the definition
1415        // of `FieldDef` changes, a compile-error will be produced, reminding
1416        // us to revisit this assumption.
1417
1418        let Self { did, name: _, vis: _, safety: _, value: _ } = &self;
1419
1420        did.hash(s)
1421    }
1422}
1423
1424impl<'tcx> FieldDef {
1425    /// Returns the type of this field. The resulting type is not normalized. The `arg` is
1426    /// typically obtained via the second field of [`TyKind::Adt`].
1427    pub fn ty(&self, tcx: TyCtxt<'tcx>, args: GenericArgsRef<'tcx>) -> Ty<'tcx> {
1428        tcx.type_of(self.did).instantiate(tcx, args).skip_norm_wip()
1429    }
1430
1431    /// Computes the `Ident` of this variant by looking up the `Span`
1432    pub fn ident(&self, tcx: TyCtxt<'_>) -> Ident {
1433        Ident::new(self.name, tcx.def_ident_span(self.did).unwrap())
1434    }
1435}
1436
1437#[derive(#[automatically_derived]
impl ::core::fmt::Debug for ImplOverlapKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            ImplOverlapKind::Permitted { marker: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "Permitted", "marker", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for ImplOverlapKind {
    #[inline]
    fn eq(&self, other: &ImplOverlapKind) -> bool {
        match (self, other) {
            (ImplOverlapKind::Permitted { marker: __self_0 },
                ImplOverlapKind::Permitted { marker: __arg1_0 }) =>
                __self_0 == __arg1_0,
        }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ImplOverlapKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<bool>;
    }
}Eq)]
1438pub enum ImplOverlapKind {
1439    /// These impls are always allowed to overlap.
1440    Permitted {
1441        /// Whether or not the impl is permitted due to the trait being a `#[marker]` trait
1442        marker: bool,
1443    },
1444}
1445
1446/// Useful source information about where a desugared associated type for an
1447/// RPITIT originated from.
1448#[derive(#[automatically_derived]
impl ::core::clone::Clone for ImplTraitInTraitData {
    #[inline]
    fn clone(&self) -> ImplTraitInTraitData {
        let _: ::core::clone::AssertParamIsClone<DefId>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for ImplTraitInTraitData { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for ImplTraitInTraitData {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            ImplTraitInTraitData::Trait {
                fn_def_id: __self_0, opaque_def_id: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f, "Trait",
                    "fn_def_id", __self_0, "opaque_def_id", &__self_1),
            ImplTraitInTraitData::Impl { fn_def_id: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Impl",
                    "fn_def_id", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for ImplTraitInTraitData {
    #[inline]
    fn eq(&self, other: &ImplTraitInTraitData) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (ImplTraitInTraitData::Trait {
                    fn_def_id: __self_0, opaque_def_id: __self_1 },
                    ImplTraitInTraitData::Trait {
                    fn_def_id: __arg1_0, opaque_def_id: __arg1_1 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (ImplTraitInTraitData::Impl { fn_def_id: __self_0 },
                    ImplTraitInTraitData::Impl { fn_def_id: __arg1_0 }) =>
                    __self_0 == __arg1_0,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ImplTraitInTraitData {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<DefId>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for ImplTraitInTraitData {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            ImplTraitInTraitData::Trait {
                fn_def_id: __self_0, opaque_def_id: __self_1 } => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            ImplTraitInTraitData::Impl { fn_def_id: __self_0 } =>
                ::core::hash::Hash::hash(__self_0, state),
        }
    }
}Hash, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ImplTraitInTraitData {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        ImplTraitInTraitData::Trait {
                            fn_def_id: ref __binding_0, opaque_def_id: ref __binding_1 }
                            => {
                            0usize
                        }
                        ImplTraitInTraitData::Impl { fn_def_id: ref __binding_0 } =>
                            {
                            1usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    ImplTraitInTraitData::Trait {
                        fn_def_id: ref __binding_0, opaque_def_id: ref __binding_1 }
                        => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ImplTraitInTraitData::Impl { fn_def_id: ref __binding_0 } =>
                        {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ImplTraitInTraitData {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        ImplTraitInTraitData::Trait {
                            fn_def_id: ::rustc_serialize::Decodable::decode(__decoder),
                            opaque_def_id: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    1usize => {
                        ImplTraitInTraitData::Impl {
                            fn_def_id: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `ImplTraitInTraitData`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, const _: () =
    {
        impl ::rustc_data_structures::stable_hasher::HashStable for
            ImplTraitInTraitData {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                ::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
                match *self {
                    ImplTraitInTraitData::Trait {
                        fn_def_id: ref __binding_0, opaque_def_id: ref __binding_1 }
                        => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                    ImplTraitInTraitData::Impl { fn_def_id: ref __binding_0 } =>
                        {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable)]
1449pub enum ImplTraitInTraitData {
1450    Trait { fn_def_id: DefId, opaque_def_id: DefId },
1451    Impl { fn_def_id: DefId },
1452}
1453
1454impl<'tcx> TyCtxt<'tcx> {
1455    pub fn typeck_body(self, body: hir::BodyId) -> &'tcx TypeckResults<'tcx> {
1456        self.typeck(self.hir_body_owner_def_id(body))
1457    }
1458
1459    pub fn provided_trait_methods(self, id: DefId) -> impl 'tcx + Iterator<Item = &'tcx AssocItem> {
1460        self.associated_items(id)
1461            .in_definition_order()
1462            .filter(move |item| item.is_fn() && item.defaultness(self).has_value())
1463    }
1464
1465    pub fn repr_options_of_def(self, did: LocalDefId) -> ReprOptions {
1466        let mut flags = ReprFlags::empty();
1467        let mut size = None;
1468        let mut max_align: Option<Align> = None;
1469        let mut min_pack: Option<Align> = None;
1470
1471        // Generate a deterministically-derived seed from the item's path hash
1472        // to allow for cross-crate compilation to actually work
1473        let mut field_shuffle_seed = self.def_path_hash(did.to_def_id()).0.to_smaller_hash();
1474
1475        // If the user defined a custom seed for layout randomization, xor the item's
1476        // path hash with the user defined seed, this will allowing determinism while
1477        // still allowing users to further randomize layout generation for e.g. fuzzing
1478        if let Some(user_seed) = self.sess.opts.unstable_opts.layout_seed {
1479            field_shuffle_seed ^= user_seed;
1480        }
1481
1482        let elt = {
    {
        'done:
            {
            for i in ::rustc_hir::attrs::HasAttrs::get_attrs(did, &self) {
                #[allow(unused_imports)]
                use rustc_hir::attrs::AttributeKind::*;
                let i: &rustc_hir::Attribute = i;
                match i {
                    rustc_hir::Attribute::Parsed(RustcScalableVector {
                        element_count, .. }) => {
                        break 'done Some(element_count);
                    }
                    rustc_hir::Attribute::Unparsed(..) =>
                        {}
                        #[deny(unreachable_patterns)]
                        _ => {}
                }
            }
            None
        }
    }
}find_attr!(self, did, RustcScalableVector { element_count, .. } => element_count
1483        )
1484        .map(|elt| match elt {
1485            Some(n) => ScalableElt::ElementCount(*n),
1486            None => ScalableElt::Container,
1487        });
1488        if elt.is_some() {
1489            flags.insert(ReprFlags::IS_SCALABLE);
1490        }
1491        if let Some(reprs) = {
    {
        'done:
            {
            for i in ::rustc_hir::attrs::HasAttrs::get_attrs(did, &self) {
                #[allow(unused_imports)]
                use rustc_hir::attrs::AttributeKind::*;
                let i: &rustc_hir::Attribute = i;
                match i {
                    rustc_hir::Attribute::Parsed(Repr { reprs, .. }) => {
                        break 'done Some(reprs);
                    }
                    rustc_hir::Attribute::Unparsed(..) =>
                        {}
                        #[deny(unreachable_patterns)]
                        _ => {}
                }
            }
            None
        }
    }
}find_attr!(self, did, Repr { reprs, .. } => reprs) {
1492            for (r, _) in reprs {
1493                flags.insert(match *r {
1494                    attr::ReprRust => ReprFlags::empty(),
1495                    attr::ReprC => ReprFlags::IS_C,
1496                    attr::ReprPacked(pack) => {
1497                        min_pack = Some(if let Some(min_pack) = min_pack {
1498                            min_pack.min(pack)
1499                        } else {
1500                            pack
1501                        });
1502                        ReprFlags::empty()
1503                    }
1504                    attr::ReprTransparent => ReprFlags::IS_TRANSPARENT,
1505                    attr::ReprSimd => ReprFlags::IS_SIMD,
1506                    attr::ReprInt(i) => {
1507                        size = Some(match i {
1508                            attr::IntType::SignedInt(x) => match x {
1509                                ast::IntTy::Isize => IntegerType::Pointer(true),
1510                                ast::IntTy::I8 => IntegerType::Fixed(Integer::I8, true),
1511                                ast::IntTy::I16 => IntegerType::Fixed(Integer::I16, true),
1512                                ast::IntTy::I32 => IntegerType::Fixed(Integer::I32, true),
1513                                ast::IntTy::I64 => IntegerType::Fixed(Integer::I64, true),
1514                                ast::IntTy::I128 => IntegerType::Fixed(Integer::I128, true),
1515                            },
1516                            attr::IntType::UnsignedInt(x) => match x {
1517                                ast::UintTy::Usize => IntegerType::Pointer(false),
1518                                ast::UintTy::U8 => IntegerType::Fixed(Integer::I8, false),
1519                                ast::UintTy::U16 => IntegerType::Fixed(Integer::I16, false),
1520                                ast::UintTy::U32 => IntegerType::Fixed(Integer::I32, false),
1521                                ast::UintTy::U64 => IntegerType::Fixed(Integer::I64, false),
1522                                ast::UintTy::U128 => IntegerType::Fixed(Integer::I128, false),
1523                            },
1524                        });
1525                        ReprFlags::empty()
1526                    }
1527                    attr::ReprAlign(align) => {
1528                        max_align = max_align.max(Some(align));
1529                        ReprFlags::empty()
1530                    }
1531                });
1532            }
1533        }
1534
1535        // If `-Z randomize-layout` was enabled for the type definition then we can
1536        // consider performing layout randomization
1537        if self.sess.opts.unstable_opts.randomize_layout {
1538            flags.insert(ReprFlags::RANDOMIZE_LAYOUT);
1539        }
1540
1541        // box is special, on the one hand the compiler assumes an ordered layout, with the pointer
1542        // always at offset zero. On the other hand we want scalar abi optimizations.
1543        let is_box = self.is_lang_item(did.to_def_id(), LangItem::OwnedBox);
1544
1545        // This is here instead of layout because the choice must make it into metadata.
1546        if is_box {
1547            flags.insert(ReprFlags::IS_LINEAR);
1548        }
1549
1550        // See `TyAndLayout::pass_indirectly_in_non_rustic_abis` for details.
1551        if {
        {
            'done:
                {
                for i in ::rustc_hir::attrs::HasAttrs::get_attrs(did, &self) {
                    #[allow(unused_imports)]
                    use rustc_hir::attrs::AttributeKind::*;
                    let i: &rustc_hir::Attribute = i;
                    match i {
                        rustc_hir::Attribute::Parsed(RustcPassIndirectlyInNonRusticAbis(..))
                            => {
                            break 'done Some(());
                        }
                        rustc_hir::Attribute::Unparsed(..) =>
                            {}
                            #[deny(unreachable_patterns)]
                            _ => {}
                    }
                }
                None
            }
        }
    }.is_some()find_attr!(self, did, RustcPassIndirectlyInNonRusticAbis(..)) {
1552            flags.insert(ReprFlags::PASS_INDIRECTLY_IN_NON_RUSTIC_ABIS);
1553        }
1554
1555        ReprOptions {
1556            int: size,
1557            align: max_align,
1558            pack: min_pack,
1559            flags,
1560            field_shuffle_seed,
1561            scalable: elt,
1562        }
1563    }
1564
1565    /// Look up the name of a definition across crates. This does not look at HIR.
1566    pub fn opt_item_name(self, def_id: impl IntoQueryKey<DefId>) -> Option<Symbol> {
1567        let def_id = def_id.into_query_key();
1568        if let Some(cnum) = def_id.as_crate_root() {
1569            Some(self.crate_name(cnum))
1570        } else {
1571            let def_key = self.def_key(def_id);
1572            match def_key.disambiguated_data.data {
1573                // The name of a constructor is that of its parent.
1574                rustc_hir::definitions::DefPathData::Ctor => self
1575                    .opt_item_name(DefId { krate: def_id.krate, index: def_key.parent.unwrap() }),
1576                _ => def_key.get_opt_name(),
1577            }
1578        }
1579    }
1580
1581    /// Look up the name of a definition across crates. This does not look at HIR.
1582    ///
1583    /// This method will ICE if the corresponding item does not have a name. In these cases, use
1584    /// [`opt_item_name`] instead.
1585    ///
1586    /// [`opt_item_name`]: Self::opt_item_name
1587    pub fn item_name(self, id: impl IntoQueryKey<DefId>) -> Symbol {
1588        let id = id.into_query_key();
1589        self.opt_item_name(id).unwrap_or_else(|| {
1590            crate::util::bug::bug_fmt(format_args!("item_name: no name for {0:?}",
        self.def_path(id)));bug!("item_name: no name for {:?}", self.def_path(id));
1591        })
1592    }
1593
1594    /// Look up the name and span of a definition.
1595    ///
1596    /// See [`item_name`][Self::item_name] for more information.
1597    pub fn opt_item_ident(self, def_id: impl IntoQueryKey<DefId>) -> Option<Ident> {
1598        let def_id = def_id.into_query_key();
1599        let def = self.opt_item_name(def_id)?;
1600        let span = self
1601            .def_ident_span(def_id)
1602            .unwrap_or_else(|| crate::util::bug::bug_fmt(format_args!("missing ident span for {0:?}",
        def_id))bug!("missing ident span for {def_id:?}"));
1603        Some(Ident::new(def, span))
1604    }
1605
1606    /// Look up the name and span of a definition.
1607    ///
1608    /// See [`item_name`][Self::item_name] for more information.
1609    pub fn item_ident(self, def_id: impl IntoQueryKey<DefId>) -> Ident {
1610        let def_id = def_id.into_query_key();
1611        self.opt_item_ident(def_id).unwrap_or_else(|| {
1612            crate::util::bug::bug_fmt(format_args!("item_ident: no name for {0:?}",
        self.def_path(def_id)));bug!("item_ident: no name for {:?}", self.def_path(def_id));
1613        })
1614    }
1615
1616    pub fn opt_associated_item(self, def_id: DefId) -> Option<AssocItem> {
1617        if let DefKind::AssocConst { .. } | DefKind::AssocFn | DefKind::AssocTy =
1618            self.def_kind(def_id)
1619        {
1620            Some(self.associated_item(def_id))
1621        } else {
1622            None
1623        }
1624    }
1625
1626    /// If the `def_id` is an associated type that was desugared from a
1627    /// return-position `impl Trait` from a trait, then provide the source info
1628    /// about where that RPITIT came from.
1629    pub fn opt_rpitit_info(self, def_id: DefId) -> Option<ImplTraitInTraitData> {
1630        if let DefKind::AssocTy = self.def_kind(def_id)
1631            && let AssocKind::Type { data: AssocTypeData::Rpitit(rpitit_info) } =
1632                self.associated_item(def_id).kind
1633        {
1634            Some(rpitit_info)
1635        } else {
1636            None
1637        }
1638    }
1639
1640    pub fn find_field_index(self, ident: Ident, variant: &VariantDef) -> Option<FieldIdx> {
1641        variant.fields.iter_enumerated().find_map(|(i, field)| {
1642            self.hygienic_eq(ident, field.ident(self), variant.def_id).then_some(i)
1643        })
1644    }
1645
1646    /// Returns `Some` if the impls are the same polarity and the trait either
1647    /// has no items or is annotated `#[marker]` and prevents item overrides.
1648    x;#[instrument(level = "debug", skip(self), ret)]
1649    pub fn impls_are_allowed_to_overlap(
1650        self,
1651        def_id1: DefId,
1652        def_id2: DefId,
1653    ) -> Option<ImplOverlapKind> {
1654        let impl1 = self.impl_trait_header(def_id1);
1655        let impl2 = self.impl_trait_header(def_id2);
1656
1657        let trait_ref1 = impl1.trait_ref.skip_binder();
1658        let trait_ref2 = impl2.trait_ref.skip_binder();
1659
1660        // If either trait impl references an error, they're allowed to overlap,
1661        // as one of them essentially doesn't exist.
1662        if trait_ref1.references_error() || trait_ref2.references_error() {
1663            return Some(ImplOverlapKind::Permitted { marker: false });
1664        }
1665
1666        match (impl1.polarity, impl2.polarity) {
1667            (ImplPolarity::Reservation, _) | (_, ImplPolarity::Reservation) => {
1668                // `#[rustc_reservation_impl]` impls don't overlap with anything
1669                return Some(ImplOverlapKind::Permitted { marker: false });
1670            }
1671            (ImplPolarity::Positive, ImplPolarity::Negative)
1672            | (ImplPolarity::Negative, ImplPolarity::Positive) => {
1673                // `impl AutoTrait for Type` + `impl !AutoTrait for Type`
1674                return None;
1675            }
1676            (ImplPolarity::Positive, ImplPolarity::Positive)
1677            | (ImplPolarity::Negative, ImplPolarity::Negative) => {}
1678        };
1679
1680        let is_marker_impl = |trait_ref: TraitRef<'_>| self.trait_def(trait_ref.def_id).is_marker;
1681        let is_marker_overlap = is_marker_impl(trait_ref1) && is_marker_impl(trait_ref2);
1682
1683        if is_marker_overlap {
1684            return Some(ImplOverlapKind::Permitted { marker: true });
1685        }
1686
1687        None
1688    }
1689
1690    /// Returns `ty::VariantDef` if `res` refers to a struct,
1691    /// or variant or their constructors, panics otherwise.
1692    pub fn expect_variant_res(self, res: Res) -> &'tcx VariantDef {
1693        match res {
1694            Res::Def(DefKind::Variant, did) => {
1695                let enum_did = self.parent(did);
1696                self.adt_def(enum_did).variant_with_id(did)
1697            }
1698            Res::Def(DefKind::Struct | DefKind::Union, did) => self.adt_def(did).non_enum_variant(),
1699            Res::Def(DefKind::Ctor(CtorOf::Variant, ..), variant_ctor_did) => {
1700                let variant_did = self.parent(variant_ctor_did);
1701                let enum_did = self.parent(variant_did);
1702                self.adt_def(enum_did).variant_with_ctor_id(variant_ctor_did)
1703            }
1704            Res::Def(DefKind::Ctor(CtorOf::Struct, ..), ctor_did) => {
1705                let struct_did = self.parent(ctor_did);
1706                self.adt_def(struct_did).non_enum_variant()
1707            }
1708            _ => crate::util::bug::bug_fmt(format_args!("expect_variant_res used with unexpected res {0:?}",
        res))bug!("expect_variant_res used with unexpected res {:?}", res),
1709        }
1710    }
1711
1712    /// Returns the possibly-auto-generated MIR of a [`ty::InstanceKind`].
1713    #[allow(clippy :: suspicious_else_formatting)]
{
    let __tracing_attr_span;
    let __tracing_attr_guard;
    if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::DEBUG <=
                    ::tracing::level_filters::LevelFilter::current() ||
            { false } {
        __tracing_attr_span =
            {
                use ::tracing::__macro_support::Callsite as _;
                static __CALLSITE: ::tracing::callsite::DefaultCallsite =
                    {
                        static META: ::tracing::Metadata<'static> =
                            {
                                ::tracing_core::metadata::Metadata::new("instance_mir",
                                    "rustc_middle::ty", ::tracing::Level::DEBUG,
                                    ::tracing_core::__macro_support::Option::Some("compiler/rustc_middle/src/ty/mod.rs"),
                                    ::tracing_core::__macro_support::Option::Some(1713u32),
                                    ::tracing_core::__macro_support::Option::Some("rustc_middle::ty"),
                                    ::tracing_core::field::FieldSet::new(&["instance"],
                                        ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                    ::tracing::metadata::Kind::SPAN)
                            };
                        ::tracing::callsite::DefaultCallsite::new(&META)
                    };
                let mut interest = ::tracing::subscriber::Interest::never();
                if ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::STATIC_MAX_LEVEL &&
                                ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::LevelFilter::current() &&
                            { interest = __CALLSITE.interest(); !interest.is_never() }
                        &&
                        ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                            interest) {
                    let meta = __CALLSITE.metadata();
                    ::tracing::Span::new(meta,
                        &{
                                #[allow(unused_imports)]
                                use ::tracing::field::{debug, display, Value};
                                let mut iter = meta.fields().iter();
                                meta.fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
                                                    ::tracing::__macro_support::Option::Some(&::tracing::field::debug(&instance)
                                                            as &dyn Value))])
                            })
                } else {
                    let span =
                        ::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
                    {};
                    span
                }
            };
        __tracing_attr_guard = __tracing_attr_span.enter();
    }

    #[warn(clippy :: suspicious_else_formatting)]
    {

        #[allow(unknown_lints, unreachable_code, clippy ::
        diverging_sub_expression, clippy :: empty_loop, clippy ::
        let_unit_value, clippy :: let_with_type_underscore, clippy ::
        needless_return, clippy :: unreachable)]
        if false {
            let __tracing_attr_fake_return: &'tcx Body<'tcx> = loop {};
            return __tracing_attr_fake_return;
        }
        {
            match instance {
                ty::InstanceKind::Item(def) => {
                    {
                        use ::tracing::__macro_support::Callsite as _;
                        static __CALLSITE: ::tracing::callsite::DefaultCallsite =
                            {
                                static META: ::tracing::Metadata<'static> =
                                    {
                                        ::tracing_core::metadata::Metadata::new("event compiler/rustc_middle/src/ty/mod.rs:1717",
                                            "rustc_middle::ty", ::tracing::Level::DEBUG,
                                            ::tracing_core::__macro_support::Option::Some("compiler/rustc_middle/src/ty/mod.rs"),
                                            ::tracing_core::__macro_support::Option::Some(1717u32),
                                            ::tracing_core::__macro_support::Option::Some("rustc_middle::ty"),
                                            ::tracing_core::field::FieldSet::new(&["message"],
                                                ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                            ::tracing::metadata::Kind::EVENT)
                                    };
                                ::tracing::callsite::DefaultCallsite::new(&META)
                            };
                        let enabled =
                            ::tracing::Level::DEBUG <=
                                        ::tracing::level_filters::STATIC_MAX_LEVEL &&
                                    ::tracing::Level::DEBUG <=
                                        ::tracing::level_filters::LevelFilter::current() &&
                                {
                                    let interest = __CALLSITE.interest();
                                    !interest.is_never() &&
                                        ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                                            interest)
                                };
                        if enabled {
                            (|value_set: ::tracing::field::ValueSet|
                                        {
                                            let meta = __CALLSITE.metadata();
                                            ::tracing::Event::dispatch(meta, &value_set);
                                            ;
                                        })({
                                    #[allow(unused_imports)]
                                    use ::tracing::field::{debug, display, Value};
                                    let mut iter = __CALLSITE.metadata().fields().iter();
                                    __CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
                                                        ::tracing::__macro_support::Option::Some(&format_args!("calling def_kind on def: {0:?}",
                                                                        def) as &dyn Value))])
                                });
                        } else { ; }
                    };
                    let def_kind = self.def_kind(def);
                    {
                        use ::tracing::__macro_support::Callsite as _;
                        static __CALLSITE: ::tracing::callsite::DefaultCallsite =
                            {
                                static META: ::tracing::Metadata<'static> =
                                    {
                                        ::tracing_core::metadata::Metadata::new("event compiler/rustc_middle/src/ty/mod.rs:1719",
                                            "rustc_middle::ty", ::tracing::Level::DEBUG,
                                            ::tracing_core::__macro_support::Option::Some("compiler/rustc_middle/src/ty/mod.rs"),
                                            ::tracing_core::__macro_support::Option::Some(1719u32),
                                            ::tracing_core::__macro_support::Option::Some("rustc_middle::ty"),
                                            ::tracing_core::field::FieldSet::new(&["message"],
                                                ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                            ::tracing::metadata::Kind::EVENT)
                                    };
                                ::tracing::callsite::DefaultCallsite::new(&META)
                            };
                        let enabled =
                            ::tracing::Level::DEBUG <=
                                        ::tracing::level_filters::STATIC_MAX_LEVEL &&
                                    ::tracing::Level::DEBUG <=
                                        ::tracing::level_filters::LevelFilter::current() &&
                                {
                                    let interest = __CALLSITE.interest();
                                    !interest.is_never() &&
                                        ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                                            interest)
                                };
                        if enabled {
                            (|value_set: ::tracing::field::ValueSet|
                                        {
                                            let meta = __CALLSITE.metadata();
                                            ::tracing::Event::dispatch(meta, &value_set);
                                            ;
                                        })({
                                    #[allow(unused_imports)]
                                    use ::tracing::field::{debug, display, Value};
                                    let mut iter = __CALLSITE.metadata().fields().iter();
                                    __CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
                                                        ::tracing::__macro_support::Option::Some(&format_args!("returned from def_kind: {0:?}",
                                                                        def_kind) as &dyn Value))])
                                });
                        } else { ; }
                    };
                    match def_kind {
                        DefKind::Const { .. } | DefKind::Static { .. } |
                            DefKind::AssocConst { .. } | DefKind::Ctor(..) |
                            DefKind::AnonConst | DefKind::InlineConst =>
                            self.mir_for_ctfe(def),
                        _ => self.optimized_mir(def),
                    }
                }
                ty::InstanceKind::VTableShim(..) |
                    ty::InstanceKind::ReifyShim(..) |
                    ty::InstanceKind::Intrinsic(..) |
                    ty::InstanceKind::FnPtrShim(..) |
                    ty::InstanceKind::Virtual(..) |
                    ty::InstanceKind::ClosureOnceShim { .. } |
                    ty::InstanceKind::ConstructCoroutineInClosureShim { .. } |
                    ty::InstanceKind::FutureDropPollShim(..) |
                    ty::InstanceKind::DropGlue(..) |
                    ty::InstanceKind::CloneShim(..) |
                    ty::InstanceKind::ThreadLocalShim(..) |
                    ty::InstanceKind::FnPtrAddrShim(..) |
                    ty::InstanceKind::AsyncDropGlueCtorShim(..) |
                    ty::InstanceKind::AsyncDropGlue(..) =>
                    self.mir_shims(instance),
            }
        }
    }
}#[instrument(skip(self), level = "debug")]
1714    pub fn instance_mir(self, instance: ty::InstanceKind<'tcx>) -> &'tcx Body<'tcx> {
1715        match instance {
1716            ty::InstanceKind::Item(def) => {
1717                debug!("calling def_kind on def: {:?}", def);
1718                let def_kind = self.def_kind(def);
1719                debug!("returned from def_kind: {:?}", def_kind);
1720                match def_kind {
1721                    DefKind::Const { .. }
1722                    | DefKind::Static { .. }
1723                    | DefKind::AssocConst { .. }
1724                    | DefKind::Ctor(..)
1725                    | DefKind::AnonConst
1726                    | DefKind::InlineConst => self.mir_for_ctfe(def),
1727                    // If the caller wants `mir_for_ctfe` of a function they should not be using
1728                    // `instance_mir`, so we'll assume const fn also wants the optimized version.
1729                    _ => self.optimized_mir(def),
1730                }
1731            }
1732            ty::InstanceKind::VTableShim(..)
1733            | ty::InstanceKind::ReifyShim(..)
1734            | ty::InstanceKind::Intrinsic(..)
1735            | ty::InstanceKind::FnPtrShim(..)
1736            | ty::InstanceKind::Virtual(..)
1737            | ty::InstanceKind::ClosureOnceShim { .. }
1738            | ty::InstanceKind::ConstructCoroutineInClosureShim { .. }
1739            | ty::InstanceKind::FutureDropPollShim(..)
1740            | ty::InstanceKind::DropGlue(..)
1741            | ty::InstanceKind::CloneShim(..)
1742            | ty::InstanceKind::ThreadLocalShim(..)
1743            | ty::InstanceKind::FnPtrAddrShim(..)
1744            | ty::InstanceKind::AsyncDropGlueCtorShim(..)
1745            | ty::InstanceKind::AsyncDropGlue(..) => self.mir_shims(instance),
1746        }
1747    }
1748
1749    /// Gets all attributes with the given name.
1750    #[deprecated = "Though there are valid usecases for this method, especially when your attribute is not a parsed attribute, usually you want to call rustc_hir::find_attr! instead."]
1751    pub fn get_attrs(
1752        self,
1753        did: impl Into<DefId>,
1754        attr: Symbol,
1755    ) -> impl Iterator<Item = &'tcx hir::Attribute> {
1756        #[allow(deprecated)]
1757        self.get_all_attrs(did).iter().filter(move |a: &&hir::Attribute| a.has_name(attr))
1758    }
1759
1760    /// Gets all attributes.
1761    ///
1762    /// To see if an item has a specific attribute, you should use
1763    /// [`rustc_hir::find_attr!`] so you can use matching.
1764    #[deprecated = "Though there are valid usecases for this method, especially when your attribute is not a parsed attribute, usually you want to call rustc_hir::find_attr! instead."]
1765    pub fn get_all_attrs(self, did: impl Into<DefId>) -> &'tcx [hir::Attribute] {
1766        let did: DefId = did.into();
1767        if let Some(did) = did.as_local() {
1768            self.hir_attrs(self.local_def_id_to_hir_id(did))
1769        } else {
1770            self.attrs_for_def(did)
1771        }
1772    }
1773
1774    pub fn get_attrs_by_path(
1775        self,
1776        did: DefId,
1777        attr: &[Symbol],
1778    ) -> impl Iterator<Item = &'tcx hir::Attribute> {
1779        let filter_fn = move |a: &&hir::Attribute| a.path_matches(attr);
1780        if let Some(did) = did.as_local() {
1781            self.hir_attrs(self.local_def_id_to_hir_id(did)).iter().filter(filter_fn)
1782        } else {
1783            self.attrs_for_def(did).iter().filter(filter_fn)
1784        }
1785    }
1786
1787    /// Returns `true` if this is an `auto trait`.
1788    pub fn trait_is_auto(self, trait_def_id: DefId) -> bool {
1789        self.trait_def(trait_def_id).has_auto_impl
1790    }
1791
1792    /// Returns `true` if this is coinductive, either because it is
1793    /// an auto trait or because it has the `#[rustc_coinductive]` attribute.
1794    pub fn trait_is_coinductive(self, trait_def_id: DefId) -> bool {
1795        self.trait_def(trait_def_id).is_coinductive
1796    }
1797
1798    /// Returns `true` if this is a trait alias.
1799    pub fn trait_is_alias(self, trait_def_id: DefId) -> bool {
1800        self.def_kind(trait_def_id) == DefKind::TraitAlias
1801    }
1802
1803    /// Arena-alloc of LayoutError for coroutine layout
1804    fn layout_error(self, err: LayoutError<'tcx>) -> &'tcx LayoutError<'tcx> {
1805        self.arena.alloc(err)
1806    }
1807
1808    /// Returns layout of a non-async-drop coroutine. Layout might be unavailable if the
1809    /// coroutine is tainted by errors.
1810    ///
1811    /// Takes `coroutine_kind` which can be acquired from the `CoroutineArgs::kind_ty`,
1812    /// e.g. `args.as_coroutine().kind_ty()`.
1813    fn ordinary_coroutine_layout(
1814        self,
1815        def_id: DefId,
1816        args: GenericArgsRef<'tcx>,
1817    ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1818        let coroutine_kind_ty = args.as_coroutine().kind_ty();
1819        let mir = self.optimized_mir(def_id);
1820        let ty = || Ty::new_coroutine(self, def_id, args);
1821        // Regular coroutine
1822        if coroutine_kind_ty.is_unit() {
1823            mir.coroutine_layout_raw().ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1824        } else {
1825            // If we have a `Coroutine` that comes from an coroutine-closure,
1826            // then it may be a by-move or by-ref body.
1827            let ty::Coroutine(_, identity_args) =
1828                *self.type_of(def_id).instantiate_identity().skip_norm_wip().kind()
1829            else {
1830                ::core::panicking::panic("internal error: entered unreachable code");unreachable!();
1831            };
1832            let identity_kind_ty = identity_args.as_coroutine().kind_ty();
1833            // If the types differ, then we must be getting the by-move body of
1834            // a by-ref coroutine.
1835            if identity_kind_ty == coroutine_kind_ty {
1836                mir.coroutine_layout_raw()
1837                    .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1838            } else {
1839                {
    match coroutine_kind_ty.to_opt_closure_kind() {
        Some(ClosureKind::FnOnce) => {}
        ref left_val => {
            ::core::panicking::assert_matches_failed(left_val,
                "Some(ClosureKind::FnOnce)", ::core::option::Option::None);
        }
    }
};assert_matches!(coroutine_kind_ty.to_opt_closure_kind(), Some(ClosureKind::FnOnce));
1840                {
    match identity_kind_ty.to_opt_closure_kind() {
        Some(ClosureKind::Fn | ClosureKind::FnMut) => {}
        ref left_val => {
            ::core::panicking::assert_matches_failed(left_val,
                "Some(ClosureKind::Fn | ClosureKind::FnMut)",
                ::core::option::Option::None);
        }
    }
};assert_matches!(
1841                    identity_kind_ty.to_opt_closure_kind(),
1842                    Some(ClosureKind::Fn | ClosureKind::FnMut)
1843                );
1844                self.optimized_mir(self.coroutine_by_move_body_def_id(def_id))
1845                    .coroutine_layout_raw()
1846                    .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1847            }
1848        }
1849    }
1850
1851    /// Returns layout of a `async_drop_in_place::{closure}` coroutine
1852    ///   (returned from `async fn async_drop_in_place<T>(..)`).
1853    /// Layout might be unavailable if the coroutine is tainted by errors.
1854    fn async_drop_coroutine_layout(
1855        self,
1856        def_id: DefId,
1857        args: GenericArgsRef<'tcx>,
1858    ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1859        let ty = || Ty::new_coroutine(self, def_id, args);
1860        if args[0].has_placeholders() || args[0].has_non_region_param() {
1861            return Err(self.layout_error(LayoutError::TooGeneric(ty())));
1862        }
1863        let instance = InstanceKind::AsyncDropGlue(def_id, Ty::new_coroutine(self, def_id, args));
1864        self.mir_shims(instance)
1865            .coroutine_layout_raw()
1866            .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1867    }
1868
1869    /// Returns layout of a coroutine. Layout might be unavailable if the
1870    /// coroutine is tainted by errors.
1871    pub fn coroutine_layout(
1872        self,
1873        def_id: DefId,
1874        args: GenericArgsRef<'tcx>,
1875    ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1876        if self.is_async_drop_in_place_coroutine(def_id) {
1877            // layout of `async_drop_in_place<T>::{closure}` in case,
1878            // when T is a coroutine, contains this internal coroutine's ptr in upvars
1879            // and doesn't require any locals. Here is an `empty coroutine's layout`
1880            let arg_cor_ty = args.first().unwrap().expect_ty();
1881            if arg_cor_ty.is_coroutine() {
1882                let span = self.def_span(def_id);
1883                let source_info = SourceInfo::outermost(span);
1884                // Even minimal, empty coroutine has 3 states (RESERVED_VARIANTS),
1885                // so variant_fields and variant_source_info should have 3 elements.
1886                let variant_fields: IndexVec<VariantIdx, IndexVec<FieldIdx, CoroutineSavedLocal>> =
1887                    iter::repeat(IndexVec::new()).take(CoroutineArgs::RESERVED_VARIANTS).collect();
1888                let variant_source_info: IndexVec<VariantIdx, SourceInfo> =
1889                    iter::repeat(source_info).take(CoroutineArgs::RESERVED_VARIANTS).collect();
1890                let proxy_layout = CoroutineLayout {
1891                    field_tys: [].into(),
1892                    field_names: [].into(),
1893                    variant_fields,
1894                    variant_source_info,
1895                    storage_conflicts: BitMatrix::new(0, 0),
1896                };
1897                return Ok(self.arena.alloc(proxy_layout));
1898            } else {
1899                self.async_drop_coroutine_layout(def_id, args)
1900            }
1901        } else {
1902            self.ordinary_coroutine_layout(def_id, args)
1903        }
1904    }
1905
1906    /// If the given `DefId` is an associated item, returns the `DefId` and `DefKind` of the parent trait or impl.
1907    pub fn assoc_parent(self, def_id: DefId) -> Option<(DefId, DefKind)> {
1908        if !self.def_kind(def_id).is_assoc() {
1909            return None;
1910        }
1911        let parent = self.parent(def_id);
1912        let def_kind = self.def_kind(parent);
1913        Some((parent, def_kind))
1914    }
1915
1916    /// Returns the trait item that is implemented by the given item `DefId`.
1917    pub fn trait_item_of(self, def_id: impl IntoQueryKey<DefId>) -> Option<DefId> {
1918        let def_id = def_id.into_query_key();
1919        self.opt_associated_item(def_id)?.trait_item_def_id()
1920    }
1921
1922    /// If the given `DefId` is an associated item of a trait,
1923    /// returns the `DefId` of the trait; otherwise, returns `None`.
1924    pub fn trait_of_assoc(self, def_id: DefId) -> Option<DefId> {
1925        match self.assoc_parent(def_id) {
1926            Some((id, DefKind::Trait)) => Some(id),
1927            _ => None,
1928        }
1929    }
1930
1931    pub fn impl_is_of_trait(self, def_id: impl IntoQueryKey<DefId>) -> bool {
1932        let def_id = def_id.into_query_key();
1933        let DefKind::Impl { of_trait } = self.def_kind(def_id) else {
1934            {
    ::core::panicking::panic_fmt(format_args!("expected Impl for {0:?}",
            def_id));
};panic!("expected Impl for {def_id:?}");
1935        };
1936        of_trait
1937    }
1938
1939    /// If the given `DefId` is an associated item of an impl,
1940    /// returns the `DefId` of the impl; otherwise returns `None`.
1941    pub fn impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
1942        match self.assoc_parent(def_id) {
1943            Some((id, DefKind::Impl { .. })) => Some(id),
1944            _ => None,
1945        }
1946    }
1947
1948    /// If the given `DefId` is an associated item of an inherent impl,
1949    /// returns the `DefId` of the impl; otherwise, returns `None`.
1950    pub fn inherent_impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
1951        match self.assoc_parent(def_id) {
1952            Some((id, DefKind::Impl { of_trait: false })) => Some(id),
1953            _ => None,
1954        }
1955    }
1956
1957    /// If the given `DefId` is an associated item of a trait impl,
1958    /// returns the `DefId` of the impl; otherwise, returns `None`.
1959    pub fn trait_impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
1960        match self.assoc_parent(def_id) {
1961            Some((id, DefKind::Impl { of_trait: true })) => Some(id),
1962            _ => None,
1963        }
1964    }
1965
1966    pub fn impl_polarity(self, def_id: impl IntoQueryKey<DefId>) -> ty::ImplPolarity {
1967        let def_id = def_id.into_query_key();
1968        self.impl_trait_header(def_id).polarity
1969    }
1970
1971    /// Given an `impl_id`, return the trait it implements.
1972    pub fn impl_trait_ref(
1973        self,
1974        def_id: impl IntoQueryKey<DefId>,
1975    ) -> ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>> {
1976        let def_id = def_id.into_query_key();
1977        self.impl_trait_header(def_id).trait_ref
1978    }
1979
1980    /// Given an `impl_id`, return the trait it implements.
1981    /// Returns `None` if it is an inherent impl.
1982    pub fn impl_opt_trait_ref(
1983        self,
1984        def_id: impl IntoQueryKey<DefId>,
1985    ) -> Option<ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>>> {
1986        let def_id = def_id.into_query_key();
1987        self.impl_is_of_trait(def_id).then(|| self.impl_trait_ref(def_id))
1988    }
1989
1990    /// Given the `DefId` of an impl, returns the `DefId` of the trait it implements.
1991    pub fn impl_trait_id(self, def_id: impl IntoQueryKey<DefId>) -> DefId {
1992        let def_id = def_id.into_query_key();
1993        self.impl_trait_ref(def_id).skip_binder().def_id
1994    }
1995
1996    /// Given the `DefId` of an impl, returns the `DefId` of the trait it implements.
1997    /// Returns `None` if it is an inherent impl.
1998    pub fn impl_opt_trait_id(self, def_id: impl IntoQueryKey<DefId>) -> Option<DefId> {
1999        let def_id = def_id.into_query_key();
2000        self.impl_is_of_trait(def_id).then(|| self.impl_trait_id(def_id))
2001    }
2002
2003    pub fn is_exportable(self, def_id: DefId) -> bool {
2004        self.exportable_items(def_id.krate).contains(&def_id)
2005    }
2006
2007    /// Check if the given `DefId` is `#\[automatically_derived\]`, *and*
2008    /// whether it was produced by expanding a builtin derive macro.
2009    pub fn is_builtin_derived(self, def_id: DefId) -> bool {
2010        if self.is_automatically_derived(def_id)
2011            && let Some(def_id) = def_id.as_local()
2012            && let outer = self.def_span(def_id).ctxt().outer_expn_data()
2013            && #[allow(non_exhaustive_omitted_patterns)] match outer.kind {
    ExpnKind::Macro(MacroKind::Derive, _) => true,
    _ => false,
}matches!(outer.kind, ExpnKind::Macro(MacroKind::Derive, _))
2014            && {
        {
            'done:
                {
                for i in
                    ::rustc_hir::attrs::HasAttrs::get_attrs(outer.macro_def_id.unwrap(),
                        &self) {
                    #[allow(unused_imports)]
                    use rustc_hir::attrs::AttributeKind::*;
                    let i: &rustc_hir::Attribute = i;
                    match i {
                        rustc_hir::Attribute::Parsed(RustcBuiltinMacro { .. }) => {
                            break 'done Some(());
                        }
                        rustc_hir::Attribute::Unparsed(..) =>
                            {}
                            #[deny(unreachable_patterns)]
                            _ => {}
                    }
                }
                None
            }
        }
    }.is_some()find_attr!(self, outer.macro_def_id.unwrap(), RustcBuiltinMacro { .. })
2015        {
2016            true
2017        } else {
2018            false
2019        }
2020    }
2021
2022    /// Check if the given `DefId` is `#\[automatically_derived\]`.
2023    pub fn is_automatically_derived(self, def_id: DefId) -> bool {
2024        {
        {
            'done:
                {
                for i in
                    ::rustc_hir::attrs::HasAttrs::get_attrs(def_id, &self) {
                    #[allow(unused_imports)]
                    use rustc_hir::attrs::AttributeKind::*;
                    let i: &rustc_hir::Attribute = i;
                    match i {
                        rustc_hir::Attribute::Parsed(AutomaticallyDerived(..)) => {
                            break 'done Some(());
                        }
                        rustc_hir::Attribute::Unparsed(..) =>
                            {}
                            #[deny(unreachable_patterns)]
                            _ => {}
                    }
                }
                None
            }
        }
    }.is_some()find_attr!(self, def_id, AutomaticallyDerived(..))
2025    }
2026
2027    /// Looks up the span of `impl_did` if the impl is local; otherwise returns `Err`
2028    /// with the name of the crate containing the impl.
2029    pub fn span_of_impl(self, impl_def_id: DefId) -> Result<Span, Symbol> {
2030        if let Some(impl_def_id) = impl_def_id.as_local() {
2031            Ok(self.def_span(impl_def_id))
2032        } else {
2033            Err(self.crate_name(impl_def_id.krate))
2034        }
2035    }
2036
2037    /// Hygienically compares a use-site name (`use_name`) for a field or an associated item with
2038    /// its supposed definition name (`def_name`). The method also needs `DefId` of the supposed
2039    /// definition's parent/scope to perform comparison.
2040    pub fn hygienic_eq(self, use_ident: Ident, def_ident: Ident, def_parent_def_id: DefId) -> bool {
2041        // We could use `Ident::eq` here, but we deliberately don't. The identifier
2042        // comparison fails frequently, and we want to avoid the expensive
2043        // `normalize_to_macros_2_0()` calls required for the span comparison whenever possible.
2044        use_ident.name == def_ident.name
2045            && use_ident
2046                .span
2047                .ctxt()
2048                .hygienic_eq(def_ident.span.ctxt(), self.expn_that_defined(def_parent_def_id))
2049    }
2050
2051    pub fn adjust_ident(self, mut ident: Ident, scope: DefId) -> Ident {
2052        ident.span.normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope));
2053        ident
2054    }
2055
2056    // FIXME(vincenzopalazzo): move the HirId to a LocalDefId
2057    pub fn adjust_ident_and_get_scope(
2058        self,
2059        mut ident: Ident,
2060        scope: DefId,
2061        block: hir::HirId,
2062    ) -> (Ident, DefId) {
2063        let scope = ident
2064            .span
2065            .normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope))
2066            .and_then(|actual_expansion| actual_expansion.expn_data().parent_module)
2067            .unwrap_or_else(|| self.parent_module(block).to_def_id());
2068        (ident, scope)
2069    }
2070
2071    /// Checks whether this is a `const fn`. Returns `false` for non-functions.
2072    ///
2073    /// Even if this returns `true`, constness may still be unstable!
2074    #[inline]
2075    pub fn is_const_fn(self, def_id: DefId) -> bool {
2076        #[allow(non_exhaustive_omitted_patterns)] match self.def_kind(def_id) {
    DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(_, CtorKind::Fn) |
        DefKind::Closure => true,
    _ => false,
}matches!(
2077            self.def_kind(def_id),
2078            DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(_, CtorKind::Fn) | DefKind::Closure
2079        ) && self.constness(def_id) == hir::Constness::Const
2080    }
2081
2082    /// Whether this item is conditionally constant for the purposes of the
2083    /// effects implementation.
2084    ///
2085    /// This roughly corresponds to all const functions and other callable
2086    /// items, along with const impls and traits, and associated types within
2087    /// those impls and traits.
2088    pub fn is_conditionally_const(self, def_id: impl Into<DefId>) -> bool {
2089        let def_id: DefId = def_id.into();
2090        match self.def_kind(def_id) {
2091            DefKind::Impl { of_trait: true } => {
2092                let header = self.impl_trait_header(def_id);
2093                header.constness == hir::Constness::Const
2094                    && self.is_const_trait(header.trait_ref.skip_binder().def_id)
2095            }
2096            DefKind::Impl { of_trait: false } => self.constness(def_id) == hir::Constness::Const,
2097            DefKind::Fn | DefKind::Ctor(_, CtorKind::Fn) => {
2098                self.constness(def_id) == hir::Constness::Const
2099            }
2100            DefKind::TraitAlias | DefKind::Trait => self.is_const_trait(def_id),
2101            DefKind::AssocTy => {
2102                let parent_def_id = self.parent(def_id);
2103                match self.def_kind(parent_def_id) {
2104                    DefKind::Impl { of_trait: false } => false,
2105                    DefKind::Impl { of_trait: true } | DefKind::Trait => {
2106                        self.is_conditionally_const(parent_def_id)
2107                    }
2108                    _ => crate::util::bug::bug_fmt(format_args!("unexpected parent item of associated type: {0:?}",
        parent_def_id))bug!("unexpected parent item of associated type: {parent_def_id:?}"),
2109                }
2110            }
2111            DefKind::AssocFn => {
2112                let parent_def_id = self.parent(def_id);
2113                match self.def_kind(parent_def_id) {
2114                    DefKind::Impl { of_trait: false } => {
2115                        self.constness(def_id) == hir::Constness::Const
2116                    }
2117                    DefKind::Impl { of_trait: true } => {
2118                        let Some(trait_method_did) = self.trait_item_of(def_id) else {
2119                            return false;
2120                        };
2121                        self.constness(trait_method_did) == hir::Constness::Const
2122                            && self.is_conditionally_const(parent_def_id)
2123                    }
2124                    DefKind::Trait => {
2125                        self.constness(def_id) == hir::Constness::Const
2126                            && self.is_conditionally_const(parent_def_id)
2127                    }
2128                    _ => crate::util::bug::bug_fmt(format_args!("unexpected parent item of associated fn: {0:?}",
        parent_def_id))bug!("unexpected parent item of associated fn: {parent_def_id:?}"),
2129                }
2130            }
2131            DefKind::OpaqueTy => match self.opaque_ty_origin(def_id) {
2132                hir::OpaqueTyOrigin::FnReturn { parent, .. } => self.is_conditionally_const(parent),
2133                hir::OpaqueTyOrigin::AsyncFn { .. } => false,
2134                // FIXME(const_trait_impl): ATPITs could be conditionally const?
2135                hir::OpaqueTyOrigin::TyAlias { .. } => false,
2136            },
2137            DefKind::Closure => self.constness(def_id) == hir::Constness::Const,
2138            DefKind::Ctor(_, CtorKind::Const)
2139            | DefKind::Mod
2140            | DefKind::Struct
2141            | DefKind::Union
2142            | DefKind::Enum
2143            | DefKind::Variant
2144            | DefKind::TyAlias
2145            | DefKind::ForeignTy
2146            | DefKind::TyParam
2147            | DefKind::Const { .. }
2148            | DefKind::ConstParam
2149            | DefKind::Static { .. }
2150            | DefKind::AssocConst { .. }
2151            | DefKind::Macro(_)
2152            | DefKind::ExternCrate
2153            | DefKind::Use
2154            | DefKind::ForeignMod
2155            | DefKind::AnonConst
2156            | DefKind::InlineConst
2157            | DefKind::Field
2158            | DefKind::LifetimeParam
2159            | DefKind::GlobalAsm
2160            | DefKind::SyntheticCoroutineBody => false,
2161        }
2162    }
2163
2164    #[inline]
2165    pub fn is_const_trait(self, def_id: DefId) -> bool {
2166        self.trait_def(def_id).constness == hir::Constness::Const
2167    }
2168
2169    pub fn impl_method_has_trait_impl_trait_tys(self, def_id: DefId) -> bool {
2170        if self.def_kind(def_id) != DefKind::AssocFn {
2171            return false;
2172        }
2173
2174        let Some(item) = self.opt_associated_item(def_id) else {
2175            return false;
2176        };
2177
2178        let AssocContainer::TraitImpl(Ok(trait_item_def_id)) = item.container else {
2179            return false;
2180        };
2181
2182        !self.associated_types_for_impl_traits_in_associated_fn(trait_item_def_id).is_empty()
2183    }
2184
2185    /// Compute a `FnAbi` suitable for declaring/defining an `fn` instance, and for direct calls*
2186    /// to an `fn`. Indirectly-passed parameters in the returned ABI will include applicable
2187    /// codegen optimization attributes, including `ReadOnly` and `CapturesNone` -- deduction of
2188    /// which requires inspection of function bodies that can lead to cycles when performed during
2189    /// typeck. During typeck, you should therefore use instead the unoptimized ABI returned by
2190    /// `fn_abi_of_instance_no_deduced_attrs`.
2191    ///
2192    /// For performance reasons, you should prefer to call this inherent method rather than invoke
2193    /// the `fn_abi_of_instance_raw` query: it delegates to that query if necessary, but where
2194    /// possible delegates instead to the `fn_abi_of_instance_no_deduced_attrs` query (thus avoiding
2195    /// unnecessary query system overhead).
2196    ///
2197    /// * that includes virtual calls, which are represented by "direct calls" to an
2198    ///   `InstanceKind::Virtual` instance (of `<dyn Trait as Trait>::fn`).
2199    #[inline]
2200    pub fn fn_abi_of_instance(
2201        self,
2202        query: ty::PseudoCanonicalInput<'tcx, (ty::Instance<'tcx>, &'tcx ty::List<Ty<'tcx>>)>,
2203    ) -> Result<&'tcx FnAbi<'tcx, Ty<'tcx>>, &'tcx FnAbiError<'tcx>> {
2204        // Only deduce attrs in full, optimized builds. Otherwise, avoid the query system overhead
2205        // of ever invoking the `fn_abi_of_instance_raw` query.
2206        if self.sess.opts.optimize != OptLevel::No && self.sess.opts.incremental.is_none() {
2207            self.fn_abi_of_instance_raw(query)
2208        } else {
2209            self.fn_abi_of_instance_no_deduced_attrs(query)
2210        }
2211    }
2212}
2213
2214// `HasAttrs` impls: allow `find_attr!(tcx, id, ...)` to work with both DefId-like types and HirId.
2215
2216impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for DefId {
2217    fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2218        if let Some(did) = self.as_local() {
2219            tcx.hir_attrs(tcx.local_def_id_to_hir_id(did))
2220        } else {
2221            tcx.attrs_for_def(self)
2222        }
2223    }
2224}
2225
2226impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for LocalDefId {
2227    fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2228        tcx.hir_attrs(tcx.local_def_id_to_hir_id(self))
2229    }
2230}
2231
2232impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for hir::OwnerId {
2233    fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2234        hir::attrs::HasAttrs::get_attrs(self.def_id, tcx)
2235    }
2236}
2237
2238impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for hir::HirId {
2239    fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2240        tcx.hir_attrs(self)
2241    }
2242}
2243
2244pub fn provide(providers: &mut Providers) {
2245    closure::provide(providers);
2246    context::provide(providers);
2247    erase_regions::provide(providers);
2248    inhabitedness::provide(providers);
2249    util::provide(providers);
2250    print::provide(providers);
2251    super::util::bug::provide(providers);
2252    *providers = Providers {
2253        trait_impls_of: trait_def::trait_impls_of_provider,
2254        incoherent_impls: trait_def::incoherent_impls_provider,
2255        trait_impls_in_crate: trait_def::trait_impls_in_crate_provider,
2256        traits: trait_def::traits_provider,
2257        vtable_allocation: vtable::vtable_allocation_provider,
2258        ..*providers
2259    };
2260}
2261
2262/// A map for the local crate mapping each type to a vector of its
2263/// inherent impls. This is not meant to be used outside of coherence;
2264/// rather, you should request the vector for a specific type via
2265/// `tcx.inherent_impls(def_id)` so as to minimize your dependencies
2266/// (constructing this map requires touching the entire crate).
2267#[derive(#[automatically_derived]
impl ::core::clone::Clone for CrateInherentImpls {
    #[inline]
    fn clone(&self) -> CrateInherentImpls {
        CrateInherentImpls {
            inherent_impls: ::core::clone::Clone::clone(&self.inherent_impls),
            incoherent_impls: ::core::clone::Clone::clone(&self.incoherent_impls),
        }
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for CrateInherentImpls {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "CrateInherentImpls", "inherent_impls", &self.inherent_impls,
            "incoherent_impls", &&self.incoherent_impls)
    }
}Debug, #[automatically_derived]
impl ::core::default::Default for CrateInherentImpls {
    #[inline]
    fn default() -> CrateInherentImpls {
        CrateInherentImpls {
            inherent_impls: ::core::default::Default::default(),
            incoherent_impls: ::core::default::Default::default(),
        }
    }
}Default, const _: () =
    {
        impl ::rustc_data_structures::stable_hasher::HashStable for
            CrateInherentImpls {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    CrateInherentImpls {
                        inherent_impls: ref __binding_0,
                        incoherent_impls: ref __binding_1 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable)]
2268pub struct CrateInherentImpls {
2269    pub inherent_impls: FxIndexMap<LocalDefId, Vec<DefId>>,
2270    pub incoherent_impls: FxIndexMap<SimplifiedType, Vec<LocalDefId>>,
2271}
2272
2273#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for SymbolName<'tcx> {
    #[inline]
    fn clone(&self) -> SymbolName<'tcx> {
        let _: ::core::clone::AssertParamIsClone<&'tcx str>;
        *self
    }
}Clone, #[automatically_derived]
impl<'tcx> ::core::marker::Copy for SymbolName<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for SymbolName<'tcx> {
    #[inline]
    fn eq(&self, other: &SymbolName<'tcx>) -> bool { self.name == other.name }
}PartialEq, #[automatically_derived]
impl<'tcx> ::core::cmp::Eq for SymbolName<'tcx> {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<&'tcx str>;
    }
}Eq, #[automatically_derived]
impl<'tcx> ::core::cmp::PartialOrd for SymbolName<'tcx> {
    #[inline]
    fn partial_cmp(&self, other: &SymbolName<'tcx>)
        -> ::core::option::Option<::core::cmp::Ordering> {
        ::core::cmp::PartialOrd::partial_cmp(&self.name, &other.name)
    }
}PartialOrd, #[automatically_derived]
impl<'tcx> ::core::cmp::Ord for SymbolName<'tcx> {
    #[inline]
    fn cmp(&self, other: &SymbolName<'tcx>) -> ::core::cmp::Ordering {
        ::core::cmp::Ord::cmp(&self.name, &other.name)
    }
}Ord, #[automatically_derived]
impl<'tcx> ::core::hash::Hash for SymbolName<'tcx> {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.name, state)
    }
}Hash, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for SymbolName<'tcx> {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    SymbolName { name: __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx> ::rustc_data_structures::stable_hasher::HashStable for
            SymbolName<'tcx> {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    SymbolName { name: ref __binding_0 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable)]
2274pub struct SymbolName<'tcx> {
2275    /// `&str` gives a consistent ordering, which ensures reproducible builds.
2276    pub name: &'tcx str,
2277}
2278
2279impl<'tcx> SymbolName<'tcx> {
2280    pub fn new(tcx: TyCtxt<'tcx>, name: &str) -> SymbolName<'tcx> {
2281        SymbolName { name: tcx.arena.alloc_str(name) }
2282    }
2283}
2284
2285impl<'tcx> fmt::Display for SymbolName<'tcx> {
2286    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2287        fmt::Display::fmt(&self.name, fmt)
2288    }
2289}
2290
2291impl<'tcx> fmt::Debug for SymbolName<'tcx> {
2292    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2293        fmt::Display::fmt(&self.name, fmt)
2294    }
2295}
2296
2297/// The constituent parts of a type level constant of kind ADT or array.
2298#[derive(#[automatically_derived]
impl<'tcx> ::core::marker::Copy for DestructuredAdtConst<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for DestructuredAdtConst<'tcx> {
    #[inline]
    fn clone(&self) -> DestructuredAdtConst<'tcx> {
        let _: ::core::clone::AssertParamIsClone<VariantIdx>;
        let _: ::core::clone::AssertParamIsClone<&'tcx [ty::Const<'tcx>]>;
        *self
    }
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for DestructuredAdtConst<'tcx> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "DestructuredAdtConst", "variant", &self.variant, "fields",
            &&self.fields)
    }
}Debug, const _: () =
    {
        impl<'tcx> ::rustc_data_structures::stable_hasher::HashStable for
            DestructuredAdtConst<'tcx> {
            #[inline]
            fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    DestructuredAdtConst {
                        variant: ref __binding_0, fields: ref __binding_1 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable)]
2299pub struct DestructuredAdtConst<'tcx> {
2300    pub variant: VariantIdx,
2301    pub fields: &'tcx [ty::Const<'tcx>],
2302}
2303
2304/// Generate TypeTree information for autodiff.
2305/// This function creates TypeTree metadata that describes the memory layout
2306/// of function parameters and return types for Enzyme autodiff.
2307pub fn fnc_typetrees<'tcx>(tcx: TyCtxt<'tcx>, fn_ty: Ty<'tcx>) -> FncTree {
2308    // Check if TypeTrees are disabled via NoTT flag
2309    if tcx.sess.opts.unstable_opts.autodiff.contains(&rustc_session::config::AutoDiff::NoTT) {
2310        return FncTree { args: ::alloc::vec::Vec::new()vec![], ret: TypeTree::new() };
2311    }
2312
2313    // Check if this is actually a function type
2314    if !fn_ty.is_fn() {
2315        return FncTree { args: ::alloc::vec::Vec::new()vec![], ret: TypeTree::new() };
2316    }
2317
2318    // Get the function signature
2319    let fn_sig = fn_ty.fn_sig(tcx);
2320    let sig = tcx.instantiate_bound_regions_with_erased(fn_sig);
2321
2322    // Create TypeTrees for each input parameter
2323    let mut args = ::alloc::vec::Vec::new()vec![];
2324    for ty in sig.inputs().iter() {
2325        let type_tree = typetree_from_ty(tcx, *ty);
2326        args.push(type_tree);
2327    }
2328
2329    // Create TypeTree for return type
2330    let ret = typetree_from_ty(tcx, sig.output());
2331
2332    FncTree { args, ret }
2333}
2334
2335/// Generate TypeTree for a specific type.
2336/// This function analyzes a Rust type and creates appropriate TypeTree metadata.
2337pub fn typetree_from_ty<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> TypeTree {
2338    let mut visited = Vec::new();
2339    typetree_from_ty_inner(tcx, ty, 0, &mut visited)
2340}
2341
2342/// Maximum recursion depth for TypeTree generation to prevent stack overflow
2343/// from pathological deeply nested types. Combined with cycle detection.
2344const MAX_TYPETREE_DEPTH: usize = 6;
2345
2346/// Internal recursive function for TypeTree generation with cycle detection and depth limiting.
2347fn typetree_from_ty_inner<'tcx>(
2348    tcx: TyCtxt<'tcx>,
2349    ty: Ty<'tcx>,
2350    depth: usize,
2351    visited: &mut Vec<Ty<'tcx>>,
2352) -> TypeTree {
2353    if depth >= MAX_TYPETREE_DEPTH {
2354        {
    use ::tracing::__macro_support::Callsite as _;
    static __CALLSITE: ::tracing::callsite::DefaultCallsite =
        {
            static META: ::tracing::Metadata<'static> =
                {
                    ::tracing_core::metadata::Metadata::new("event compiler/rustc_middle/src/ty/mod.rs:2354",
                        "rustc_middle::ty", ::tracing::Level::TRACE,
                        ::tracing_core::__macro_support::Option::Some("compiler/rustc_middle/src/ty/mod.rs"),
                        ::tracing_core::__macro_support::Option::Some(2354u32),
                        ::tracing_core::__macro_support::Option::Some("rustc_middle::ty"),
                        ::tracing_core::field::FieldSet::new(&["message"],
                            ::tracing_core::callsite::Identifier(&__CALLSITE)),
                        ::tracing::metadata::Kind::EVENT)
                };
            ::tracing::callsite::DefaultCallsite::new(&META)
        };
    let enabled =
        ::tracing::Level::TRACE <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::TRACE <=
                    ::tracing::level_filters::LevelFilter::current() &&
            {
                let interest = __CALLSITE.interest();
                !interest.is_never() &&
                    ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                        interest)
            };
    if enabled {
        (|value_set: ::tracing::field::ValueSet|
                    {
                        let meta = __CALLSITE.metadata();
                        ::tracing::Event::dispatch(meta, &value_set);
                        ;
                    })({
                #[allow(unused_imports)]
                use ::tracing::field::{debug, display, Value};
                let mut iter = __CALLSITE.metadata().fields().iter();
                __CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
                                    ::tracing::__macro_support::Option::Some(&format_args!("typetree depth limit {0} reached for type: {1}",
                                                    MAX_TYPETREE_DEPTH, ty) as &dyn Value))])
            });
    } else { ; }
};trace!("typetree depth limit {} reached for type: {}", MAX_TYPETREE_DEPTH, ty);
2355        return TypeTree::new();
2356    }
2357
2358    if visited.contains(&ty) {
2359        return TypeTree::new();
2360    }
2361
2362    visited.push(ty);
2363    let result = typetree_from_ty_impl(tcx, ty, depth, visited);
2364    visited.pop();
2365    result
2366}
2367
2368/// Implementation of TypeTree generation logic.
2369fn typetree_from_ty_impl<'tcx>(
2370    tcx: TyCtxt<'tcx>,
2371    ty: Ty<'tcx>,
2372    depth: usize,
2373    visited: &mut Vec<Ty<'tcx>>,
2374) -> TypeTree {
2375    typetree_from_ty_impl_inner(tcx, ty, depth, visited, false)
2376}
2377
2378/// Internal implementation with context about whether this is for a reference target.
2379fn typetree_from_ty_impl_inner<'tcx>(
2380    tcx: TyCtxt<'tcx>,
2381    ty: Ty<'tcx>,
2382    depth: usize,
2383    visited: &mut Vec<Ty<'tcx>>,
2384    is_reference_target: bool,
2385) -> TypeTree {
2386    if ty.is_scalar() {
2387        let (kind, size) = if ty.is_integral() || ty.is_char() || ty.is_bool() {
2388            (Kind::Integer, ty.primitive_size(tcx).bytes_usize())
2389        } else if ty.is_floating_point() {
2390            match ty {
2391                x if x == tcx.types.f16 => (Kind::Half, 2),
2392                x if x == tcx.types.f32 => (Kind::Float, 4),
2393                x if x == tcx.types.f64 => (Kind::Double, 8),
2394                x if x == tcx.types.f128 => (Kind::F128, 16),
2395                _ => (Kind::Integer, 0),
2396            }
2397        } else {
2398            (Kind::Integer, 0)
2399        };
2400
2401        // Use offset 0 for scalars that are direct targets of references (like &f64)
2402        // Use offset -1 for scalars used directly (like function return types)
2403        let offset = if is_reference_target && !ty.is_array() { 0 } else { -1 };
2404        return TypeTree(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
        [Type { offset, size, kind, child: TypeTree::new() }]))vec![Type { offset, size, kind, child: TypeTree::new() }]);
2405    }
2406
2407    if ty.is_ref() || ty.is_raw_ptr() || ty.is_box() {
2408        let Some(inner_ty) = ty.builtin_deref(true) else {
2409            return TypeTree::new();
2410        };
2411
2412        let child = typetree_from_ty_impl_inner(tcx, inner_ty, depth + 1, visited, true);
2413        return TypeTree(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
        [Type {
                    offset: -1,
                    size: tcx.data_layout.pointer_size().bytes_usize(),
                    kind: Kind::Pointer,
                    child,
                }]))vec![Type {
2414            offset: -1,
2415            size: tcx.data_layout.pointer_size().bytes_usize(),
2416            kind: Kind::Pointer,
2417            child,
2418        }]);
2419    }
2420
2421    if ty.is_array() {
2422        if let ty::Array(element_ty, len_const) = ty.kind() {
2423            let len = len_const.try_to_target_usize(tcx).unwrap_or(0);
2424            if len == 0 {
2425                return TypeTree::new();
2426            }
2427            let element_tree =
2428                typetree_from_ty_impl_inner(tcx, *element_ty, depth + 1, visited, false);
2429            let mut types = Vec::new();
2430            for elem_type in &element_tree.0 {
2431                types.push(Type {
2432                    offset: -1,
2433                    size: elem_type.size,
2434                    kind: elem_type.kind,
2435                    child: elem_type.child.clone(),
2436                });
2437            }
2438
2439            return TypeTree(types);
2440        }
2441    }
2442
2443    if ty.is_slice() {
2444        if let ty::Slice(element_ty) = ty.kind() {
2445            let element_tree =
2446                typetree_from_ty_impl_inner(tcx, *element_ty, depth + 1, visited, false);
2447            return element_tree;
2448        }
2449    }
2450
2451    if let ty::Tuple(tuple_types) = ty.kind() {
2452        if tuple_types.is_empty() {
2453            return TypeTree::new();
2454        }
2455
2456        let mut types = Vec::new();
2457        let mut current_offset = 0;
2458
2459        for tuple_ty in tuple_types.iter() {
2460            let element_tree =
2461                typetree_from_ty_impl_inner(tcx, tuple_ty, depth + 1, visited, false);
2462
2463            let element_layout = tcx
2464                .layout_of(ty::TypingEnv::fully_monomorphized().as_query_input(tuple_ty))
2465                .ok()
2466                .map(|layout| layout.size.bytes_usize())
2467                .unwrap_or(0);
2468
2469            for elem_type in &element_tree.0 {
2470                types.push(Type {
2471                    offset: if elem_type.offset == -1 {
2472                        current_offset as isize
2473                    } else {
2474                        current_offset as isize + elem_type.offset
2475                    },
2476                    size: elem_type.size,
2477                    kind: elem_type.kind,
2478                    child: elem_type.child.clone(),
2479                });
2480            }
2481
2482            current_offset += element_layout;
2483        }
2484
2485        return TypeTree(types);
2486    }
2487
2488    if let ty::Adt(adt_def, args) = ty.kind() {
2489        if adt_def.is_struct() {
2490            let struct_layout =
2491                tcx.layout_of(ty::TypingEnv::fully_monomorphized().as_query_input(ty));
2492            if let Ok(layout) = struct_layout {
2493                let mut types = Vec::new();
2494
2495                for (field_idx, field_def) in adt_def.all_fields().enumerate() {
2496                    let field_ty = field_def.ty(tcx, args);
2497                    let field_tree =
2498                        typetree_from_ty_impl_inner(tcx, field_ty, depth + 1, visited, false);
2499
2500                    let field_offset = layout.fields.offset(field_idx).bytes_usize();
2501
2502                    for elem_type in &field_tree.0 {
2503                        types.push(Type {
2504                            offset: if elem_type.offset == -1 {
2505                                field_offset as isize
2506                            } else {
2507                                field_offset as isize + elem_type.offset
2508                            },
2509                            size: elem_type.size,
2510                            kind: elem_type.kind,
2511                            child: elem_type.child.clone(),
2512                        });
2513                    }
2514                }
2515
2516                return TypeTree(types);
2517            }
2518        }
2519    }
2520
2521    TypeTree::new()
2522}