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::node_id::NodeMap;
31use rustc_ast::{self as ast, NodeId};
32pub use rustc_ast_ir::{Movability, Mutability, try_visit};
33use rustc_data_structures::fx::{FxIndexMap, FxIndexSet};
34use rustc_data_structures::intern::Interned;
35use rustc_data_structures::stable_hash::{StableHash, StableHashCtxt, StableHasher};
36use rustc_data_structures::steal::Steal;
37use rustc_data_structures::unord::{UnordMap, UnordSet};
38use rustc_errors::{Diag, ErrorGuaranteed, LintBuffer};
39use rustc_hir::attrs::StrippedCfgItem;
40use rustc_hir::def::{CtorKind, CtorOf, DefKind, DocLinkResMap, LifetimeRes, Res};
41use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, LocalDefIdMap};
42use rustc_hir::definitions::PerParentDisambiguatorState;
43use rustc_hir::{self as hir, LangItem, MissingLifetimeKind, attrs as attr, find_attr};
44use rustc_index::IndexVec;
45use rustc_index::bit_set::BitMatrix;
46use rustc_macros::{
47    BlobDecodable, Decodable, Encodable, StableHash, TyDecodable, TyEncodable, TypeFoldable,
48    TypeVisitable, extension,
49};
50use rustc_serialize::{Decodable, Encodable};
51use rustc_session::config::OptLevel;
52pub use rustc_session::lint::RegisteredTools;
53use rustc_span::def_id::{LocalModId, ModId};
54use rustc_span::hygiene::MacroKind;
55use rustc_span::{DUMMY_SP, ExpnId, ExpnKind, Ident, Span, Symbol};
56use rustc_target::callconv::FnAbi;
57pub use rustc_type_ir::data_structures::{DelayedMap, DelayedSet};
58pub use rustc_type_ir::fast_reject::DeepRejectCtxt;
59#[allow(
60    hidden_glob_reexports,
61    rustc::usage_of_type_ir_inherent,
62    rustc::non_glob_import_of_type_ir_inherent
63)]
64use rustc_type_ir::inherent;
65pub use rustc_type_ir::relate::VarianceDiagInfo;
66pub use rustc_type_ir::solve::{CandidatePreferenceMode, SizedTraitKind, VisibleForLeakCheck};
67pub use rustc_type_ir::*;
68#[allow(hidden_glob_reexports, unused_imports)]
69use rustc_type_ir::{InferCtxtLike, Interner};
70use tracing::{debug, instrument};
71pub use vtable::*;
72
73pub use self::closure::{
74    BorrowKind, CAPTURE_STRUCT_LOCAL, CaptureInfo, CapturedPlace, ClosureTypeInfo,
75    MinCaptureInformationMap, MinCaptureList, RootVariableMinCaptureList, UpvarCapture, UpvarId,
76    UpvarPath, analyze_coroutine_closure_captures, is_ancestor_or_same_capture,
77    place_to_string_for_capture,
78};
79pub use self::consts::{
80    AliasConst, AliasConstKind, AtomicOrdering, Const, ConstInt, ConstKind, ConstToValTreeResult,
81    Expr, ExprKind, LitToConstInput, ScalarInt, SimdAlign, ValTree, ValTreeKindExt, Value,
82    const_lit_matches_ty,
83};
84pub use self::context::{
85    CtxtInterners, CurrentGcx, FreeRegionInfo, GlobalCtxt, Lift, TyCtxt, TyCtxtFeed, tls,
86};
87pub use self::fold::*;
88pub use self::instance::{Instance, InstanceKind, ReifyReason, ShimKind};
89pub(crate) use self::list::RawList;
90pub use self::list::{List, ListWithCachedTypeInfo};
91pub use self::opaque_types::OpaqueTypeKey;
92pub use self::pattern::{Pattern, PatternKind};
93pub use self::predicate::{
94    AliasTerm, AliasTermKind, ArgOutlivesPredicate, Clause, ClauseKind, CoercePredicate,
95    ExistentialPredicate, ExistentialPredicateStableCmpExt, ExistentialProjection,
96    ExistentialTraitRef, HostEffectPredicate, NormalizesTo, OutlivesPredicate, PolyCoercePredicate,
97    PolyExistentialPredicate, PolyExistentialProjection, PolyExistentialTraitRef,
98    PolyProjectionPredicate, PolyRegionOutlivesPredicate, PolySubtypePredicate, PolyTraitPredicate,
99    PolyTraitRef, PolyTypeOutlivesPredicate, Predicate, PredicateKind, ProjectionPredicate,
100    RegionConstraint, RegionEqPredicate, RegionOutlivesPredicate, SubtypePredicate, TraitPredicate,
101    TraitRef, TypeOutlivesPredicate,
102};
103pub use self::region::{
104    EarlyParamRegion, LateParamRegion, LateParamRegionKind, Region, RegionKind, RegionVid,
105};
106pub use self::sty::{
107    Alias, AliasTy, AliasTyKind, Article, Binder, BoundConst, BoundRegion, BoundRegionKind,
108    BoundTy, BoundTyKind, BoundVariableKind, CanonicalPolyFnSig, CoroutineArgsExt, EarlyBinder,
109    FnSig, FnSigKind, FreeAliasTy, InherentAliasTy, InlineConstArgs, InlineConstArgsParts,
110    OpaqueAliasTy, ParamConst, ParamTy, PlaceholderConst, PlaceholderRegion, PlaceholderType,
111    PolyFnSig, ProjectionAliasTy, TyKind, TypeAndMut, TypingMode, TypingModeEqWrapper,
112    Unnormalized, UpvarArgs,
113};
114pub use self::trait_def::TraitDef;
115pub use self::typeck_results::{
116    CanonicalUserType, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations, IsIdentity,
117    Rust2024IncompatiblePatInfo, SplattedDef, TypeckResults, UserType, UserTypeAnnotationIndex,
118    UserTypeKind,
119};
120use crate::error::{OpaqueHiddenTypeMismatch, TypeMismatchReason};
121use crate::metadata::{AmbigModChild, ModChild};
122use crate::middle::privacy::EffectiveVisibilities;
123use crate::mir::{Body, CoroutineLayout, CoroutineSavedLocal, MirPhase, SourceInfo};
124use crate::query::{IntoQueryKey, Providers};
125use crate::ty;
126use crate::ty::codec::{TyDecoder, TyEncoder};
127pub use crate::ty::diagnostics::*;
128use crate::ty::fast_reject::SimplifiedType;
129use crate::ty::layout::{FnAbiError, LayoutError};
130use crate::ty::util::Discr;
131use crate::ty::walk::TypeWalker;
132
133pub mod abstract_const;
134pub mod adjustment;
135pub mod cast;
136pub mod codec;
137pub mod error;
138pub mod fast_reject;
139pub mod inhabitedness;
140pub mod layout;
141pub mod normalize_erasing_regions;
142pub mod offload_meta;
143pub mod pattern;
144pub mod print;
145pub mod relate;
146pub mod significant_drop_order;
147pub mod trait_def;
148pub mod typetree;
149pub mod util;
150pub mod vtable;
151
152mod adt;
153mod assoc;
154mod closure;
155mod consts;
156mod context;
157mod diagnostics;
158mod elaborate_impl;
159mod erase_regions;
160mod fold;
161mod generic_args;
162mod generics;
163mod impls_ty;
164mod instance;
165mod intrinsic;
166mod list;
167mod opaque_types;
168mod predicate;
169mod region;
170mod structural_impls;
171#[allow(hidden_glob_reexports)]
172mod sty;
173mod typeck_results;
174mod visit;
175
176// Data types
177
178#[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", "macro_reachable_adts",
                        "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", "delegation_infos"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.visibilities_for_hashing, &self.expn_that_defined,
                        &self.effective_visibilities, &self.macro_reachable_adts,
                        &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,
                        &&self.delegation_infos];
        ::core::fmt::Formatter::debug_struct_fields_finish(f,
            "ResolverGlobalCtxt", names, values)
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            ResolverGlobalCtxt {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    ResolverGlobalCtxt {
                        visibilities_for_hashing: ref __binding_0,
                        expn_that_defined: ref __binding_1,
                        effective_visibilities: ref __binding_2,
                        macro_reachable_adts: ref __binding_3,
                        extern_crate_map: ref __binding_4,
                        maybe_unused_trait_imports: ref __binding_5,
                        module_children: ref __binding_6,
                        ambig_module_children: ref __binding_7,
                        glob_map: ref __binding_8,
                        main_def: ref __binding_9,
                        trait_impls: ref __binding_10,
                        proc_macros: ref __binding_11,
                        confused_type_with_std_module: ref __binding_12,
                        doc_link_resolutions: ref __binding_13,
                        doc_link_traits_in_scope: ref __binding_14,
                        all_macro_rules: ref __binding_15,
                        stripped_cfg_items: ref __binding_16,
                        delegation_infos: ref __binding_17 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                        { __binding_3.stable_hash(__hcx, __hasher); }
                        { __binding_4.stable_hash(__hcx, __hasher); }
                        { __binding_5.stable_hash(__hcx, __hasher); }
                        { __binding_6.stable_hash(__hcx, __hasher); }
                        { __binding_7.stable_hash(__hcx, __hasher); }
                        { __binding_8.stable_hash(__hcx, __hasher); }
                        { __binding_9.stable_hash(__hcx, __hasher); }
                        { __binding_10.stable_hash(__hcx, __hasher); }
                        { __binding_11.stable_hash(__hcx, __hasher); }
                        { __binding_12.stable_hash(__hcx, __hasher); }
                        { __binding_13.stable_hash(__hcx, __hasher); }
                        { __binding_14.stable_hash(__hcx, __hasher); }
                        { __binding_15.stable_hash(__hcx, __hasher); }
                        { __binding_16.stable_hash(__hcx, __hasher); }
                        { __binding_17.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
179pub struct ResolverGlobalCtxt {
180    pub visibilities_for_hashing: Vec<(LocalDefId, Visibility)>,
181    /// Item with a given `LocalDefId` was defined during macro expansion with ID `ExpnId`.
182    pub expn_that_defined: UnordMap<LocalDefId, ExpnId>,
183    pub effective_visibilities: EffectiveVisibilities,
184    // FIXME: This table contains ADTs reachable from macro 2.0.
185    // Currently, reachability of a definition from a macro is determined by nominal visibility
186    // (see `compute_effective_visibilities`). This is incorrect and leads to the necessity
187    // of traversing ADT fields in `rustc_privacy`. Remove this workaround once the
188    // correct reachability logic is implemented for macros.
189    pub macro_reachable_adts: FxIndexMap<LocalDefId, FxIndexSet<LocalDefId>>,
190    pub extern_crate_map: UnordMap<LocalDefId, CrateNum>,
191    pub maybe_unused_trait_imports: FxIndexSet<LocalDefId>,
192    pub module_children: LocalDefIdMap<Vec<ModChild>>,
193    pub ambig_module_children: LocalDefIdMap<Vec<AmbigModChild>>,
194    pub glob_map: FxIndexMap<LocalDefId, FxIndexSet<Symbol>>,
195    pub main_def: Option<MainDefinition>,
196    pub trait_impls: FxIndexMap<DefId, Vec<LocalDefId>>,
197    /// A list of proc macro LocalDefIds, written out in the order in which
198    /// they are declared in the static array generated by proc_macro_harness.
199    pub proc_macros: Vec<LocalDefId>,
200    /// Mapping from ident span to path span for paths that don't exist as written, but that
201    /// exist under `std`. For example, wrote `str::from_utf8` instead of `std::str::from_utf8`.
202    pub confused_type_with_std_module: FxIndexMap<Span, Span>,
203    pub doc_link_resolutions: FxIndexMap<LocalModId, DocLinkResMap>,
204    pub doc_link_traits_in_scope: FxIndexMap<LocalModId, Vec<DefId>>,
205    pub all_macro_rules: UnordSet<Symbol>,
206    pub stripped_cfg_items: Vec<StrippedCfgItem>,
207    // Information about delegations which is used when handling recursive delegations
208    // and ensures easy access to delegation-only `LocalDefId`s.
209    pub delegation_infos: FxIndexMap<LocalDefId, DelegationInfo>,
210}
211
212#[derive(#[automatically_derived]
impl<'tcx> ::core::fmt::Debug for PerOwnerResolverData<'tcx> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["node_id_to_def_id", "lifetime_elision_allowed",
                        "label_res_map", "lifetimes_res_map", "trait_map",
                        "import_res", "extra_lifetime_params_map", "id", "def_id"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.node_id_to_def_id, &self.lifetime_elision_allowed,
                        &self.label_res_map, &self.lifetimes_res_map,
                        &self.trait_map, &self.import_res,
                        &self.extra_lifetime_params_map, &self.id, &&self.def_id];
        ::core::fmt::Formatter::debug_struct_fields_finish(f,
            "PerOwnerResolverData", names, values)
    }
}Debug)]
213pub struct PerOwnerResolverData<'tcx> {
214    pub node_id_to_def_id: NodeMap<LocalDefId> = Default::default(),
215    /// Whether lifetime elision was successful.
216    pub lifetime_elision_allowed: bool = false,
217    /// Resolutions for labels.
218    /// Maps from NodeId of the break/continue expression to the NodeId of their corresponding blocks or loops.
219    pub label_res_map: NodeMap<ast::NodeId> = Default::default(),
220    /// Resolutions for lifetimes.
221    pub lifetimes_res_map: NodeMap<LifetimeRes> = Default::default(),
222
223    pub trait_map: NodeMap<&'tcx [hir::TraitCandidate<'tcx>]> = Default::default(),
224
225    /// Resolution for import nodes, which have multiple resolutions in different namespaces.
226    pub import_res: hir::def::PerNS<Option<Res<ast::NodeId>>> = Default::default(),
227    /// Lifetime parameters that lowering will have to introduce.
228    pub extra_lifetime_params_map: NodeMap<Vec<(Ident, ast::NodeId, MissingLifetimeKind)>> = Default::default(),
229
230    /// The id of the owner
231    pub id: ast::NodeId,
232    /// The `DefId` of the owner, can't be found in `node_id_to_def_id`.
233    pub def_id: LocalDefId,
234}
235
236impl<'tcx> PerOwnerResolverData<'tcx> {
237    pub fn new(id: ast::NodeId, def_id: LocalDefId) -> PerOwnerResolverData<'tcx> {
238        PerOwnerResolverData { id, def_id, .. }
239    }
240
241    /// Obtains resolution for a label with the given `NodeId`.
242    pub fn get_label_res(&self, id: ast::NodeId) -> Option<ast::NodeId> {
243        self.label_res_map.get(&id).copied()
244    }
245
246    /// Obtains resolution for a lifetime with the given `NodeId`.
247    pub fn get_lifetime_res(&self, id: ast::NodeId) -> Option<LifetimeRes> {
248        self.lifetimes_res_map.get(&id).copied()
249    }
250
251    /// Obtain the list of lifetimes parameters to add to an item.
252    ///
253    /// Extra lifetime parameters should only be added in places that can appear
254    /// as a `binder` in `LifetimeRes`.
255    ///
256    /// The extra lifetimes that appear from the parenthesized `Fn`-trait desugaring
257    /// should appear at the enclosing `PolyTraitRef`.
258    pub fn extra_lifetime_params(&self, id: NodeId) -> &[(Ident, NodeId, MissingLifetimeKind)] {
259        self.extra_lifetime_params_map.get(&id).map_or(&[], |v| &v[..])
260    }
261}
262
263/// Resolutions that should only be used for lowering.
264/// This struct is meant to be consumed by lowering.
265#[derive(#[automatically_derived]
impl<'tcx> ::core::fmt::Debug for ResolverAstLowering<'tcx> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f,
            "ResolverAstLowering", "partial_res_map", &self.partial_res_map,
            "next_node_id", &self.next_node_id, "owners", &self.owners,
            "lint_buffer", &self.lint_buffer, "disambiguators",
            &&self.disambiguators)
    }
}Debug)]
266pub struct ResolverAstLowering<'tcx> {
267    /// Resolutions for nodes that have a single resolution.
268    pub partial_res_map: NodeMap<hir::def::PartialRes>,
269
270    pub next_node_id: ast::NodeId,
271
272    pub owners: NodeMap<PerOwnerResolverData<'tcx>>,
273
274    /// Lints that were emitted by the resolver and early lints.
275    pub lint_buffer: Steal<LintBuffer>,
276
277    pub disambiguators: LocalDefIdMap<Steal<PerParentDisambiguatorState>>,
278}
279
280#[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_id", &&self.resolution_id)
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            DelegationInfo {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    DelegationInfo { resolution_id: ref __binding_0 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
281pub struct DelegationInfo {
282    // `DefId` (either the resolution at delegation.id or item_id in case of a trait impl) for signature resolution,
283    // for details see https://github.com/rust-lang/rust/issues/118212#issuecomment-2160686914
284    /// Refers to the next element in a delegation resolution chain.
285    /// Usually points to the final resolution, as most "chains" are just
286    /// one step to a trait or an impl.
287    pub resolution_id: Result<DefId, ErrorGuaranteed>,
288}
289
290#[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_hash::StableHash for
            MainDefinition {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    MainDefinition {
                        res: ref __binding_0,
                        is_import: ref __binding_1,
                        span: ref __binding_2 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
291pub struct MainDefinition {
292    pub res: Res<ast::NodeId>,
293    pub is_import: bool,
294    pub span: Span,
295}
296
297impl MainDefinition {
298    pub fn opt_fn_def_id(self) -> Option<DefId> {
299        if let Res::Def(DefKind::Fn, def_id) = self.res { Some(def_id) } else { None }
300    }
301}
302
303#[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_hash::StableHash for
            ImplTraitHeader<'tcx> {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    ImplTraitHeader {
                        trait_ref: ref __binding_0,
                        polarity: ref __binding_1,
                        safety: ref __binding_2,
                        constness: ref __binding_3 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                        { __binding_3.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
304pub struct ImplTraitHeader<'tcx> {
305    pub trait_ref: ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>>,
306    pub polarity: ImplPolarity,
307    pub safety: hir::Safety,
308    pub constness: hir::Constness,
309}
310
311#[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_hash::StableHash for Asyncness {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self { Asyncness::Yes => {} Asyncness::No => {} }
            }
        }
    };StableHash, #[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)]
312#[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)]
313pub enum Asyncness {
314    Yes,
315    #[default]
316    No,
317}
318
319impl Asyncness {
320    pub fn is_async(self) -> bool {
321        #[allow(non_exhaustive_omitted_patterns)] match self {
    Asyncness::Yes => true,
    _ => false,
}matches!(self, Asyncness::Yes)
322    }
323}
324
325#[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_hash::StableHash for
            Visibility<Id> where
            Id: ::rustc_data_structures::stable_hash::StableHash {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    Visibility::Public => {}
                    Visibility::Restricted(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
326pub enum Visibility<Id = LocalModId> {
327    /// Visible everywhere (including in other crates).
328    Public,
329    /// Visible only in the given crate-local module.
330    Restricted(Id),
331}
332
333impl Visibility {
334    pub fn to_string(self, def_id: LocalDefId, tcx: TyCtxt<'_>) -> String {
335        match self {
336            ty::Visibility::Restricted(restricted_id) => {
337                if restricted_id.is_top_level_module() {
338                    "pub(crate)".to_string()
339                } else if restricted_id == tcx.parent_module_from_def_id(def_id) {
340                    "pub(self)".to_string()
341                } else {
342                    ::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!(
343                        "pub(in crate{})",
344                        tcx.def_path(restricted_id.to_def_id()).to_string_no_crate_verbose()
345                    )
346                }
347            }
348            ty::Visibility::Public => "pub".to_string(),
349        }
350    }
351}
352
353#[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_hash::StableHash for
            ClosureSizeProfileData<'tcx> {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    ClosureSizeProfileData {
                        before_feature_tys: ref __binding_0,
                        after_feature_tys: ref __binding_1 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
354#[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)]
355pub struct ClosureSizeProfileData<'tcx> {
356    /// Tuple containing the types of closure captures before the feature `capture_disjoint_fields`
357    pub before_feature_tys: Ty<'tcx>,
358    /// Tuple containing the types of closure captures after the feature `capture_disjoint_fields`
359    pub after_feature_tys: Ty<'tcx>,
360}
361
362impl TyCtxt<'_> {
363    #[inline]
364    pub fn opt_parent(self, id: DefId) -> Option<DefId> {
365        self.def_key(id).parent.map(|index| DefId { index, ..id })
366    }
367
368    #[inline]
369    #[track_caller]
370    pub fn parent(self, id: DefId) -> DefId {
371        match self.opt_parent(id) {
372            Some(id) => id,
373            // not `unwrap_or_else` to avoid breaking caller tracking
374            None => crate::util::bug::bug_fmt(format_args!("{0:?} doesn\'t have a parent", id))bug!("{id:?} doesn't have a parent"),
375        }
376    }
377
378    #[inline]
379    #[track_caller]
380    pub fn opt_local_parent(self, id: LocalDefId) -> Option<LocalDefId> {
381        self.opt_parent(id.to_def_id()).map(DefId::expect_local)
382    }
383
384    #[inline]
385    #[track_caller]
386    pub fn local_parent(self, id: impl Into<LocalDefId>) -> LocalDefId {
387        self.parent(id.into().to_def_id()).expect_local()
388    }
389
390    /// Compare def-ids based on their position in def-id tree, ancestor def-ids are considered
391    /// larger than descendant def-ids, and two different def-ids are considered unordered if
392    /// neither of them is an ancestor of the other.
393    fn def_id_partial_cmp(self, lhs: DefId, rhs: DefId) -> Option<Ordering> {
394        // Def-ids from different crates are always unordered.
395        if lhs.krate != rhs.krate {
396            return None;
397        }
398
399        // Def-ids of parent nodes are always created before def-ids of child nodes
400        // and have a smaller index, so we only need to search in one direction,
401        // either from lhs to rhs, or vice versa.
402        let search = |mut start: DefId, finish: DefId, ord| {
403            while start.index != finish.index {
404                match self.opt_parent(start) {
405                    Some(parent) => start.index = parent.index,
406                    None => return None,
407                }
408            }
409            Some(ord)
410        };
411        match lhs.index.cmp(&rhs.index) {
412            Ordering::Equal => Some(Ordering::Equal),
413            Ordering::Less => search(rhs, lhs, Ordering::Greater),
414            Ordering::Greater => search(lhs, rhs, Ordering::Less),
415        }
416    }
417
418    pub fn is_descendant_of(
419        self,
420        descendant: impl Into<DefId>,
421        ancestor: impl Into<DefId>,
422    ) -> bool {
423        #[allow(non_exhaustive_omitted_patterns)] match self.def_id_partial_cmp(descendant.into(),
        ancestor.into()) {
    Some(Ordering::Less | Ordering::Equal) => true,
    _ => false,
}matches!(
424            self.def_id_partial_cmp(descendant.into(), ancestor.into()),
425            Some(Ordering::Less | Ordering::Equal)
426        )
427    }
428}
429
430impl<Id> Visibility<Id> {
431    pub fn is_public(self) -> bool {
432        #[allow(non_exhaustive_omitted_patterns)] match self {
    Visibility::Public => true,
    _ => false,
}matches!(self, Visibility::Public)
433    }
434
435    pub fn map_id<OutId>(self, f: impl FnOnce(Id) -> OutId) -> Visibility<OutId> {
436        match self {
437            Visibility::Public => Visibility::Public,
438            Visibility::Restricted(id) => Visibility::Restricted(f(id)),
439        }
440    }
441}
442
443impl Visibility<LocalModId> {
444    pub fn to_mod_id(self) -> Visibility<ModId> {
445        self.map_id(LocalModId::to_mod_id)
446    }
447}
448
449impl<Id: Into<DefId>> Visibility<Id> {
450    /// Returns `true` if an item with this visibility is accessible from the given module.
451    pub fn is_accessible_from(self, module: impl Into<DefId>, tcx: TyCtxt<'_>) -> bool {
452        match self {
453            // Public items are visible everywhere.
454            Visibility::Public => true,
455            Visibility::Restricted(id) => tcx.is_descendant_of(module, id),
456        }
457    }
458
459    pub fn partial_cmp(
460        self,
461        vis: Visibility<impl Into<DefId>>,
462        tcx: TyCtxt<'_>,
463    ) -> Option<Ordering> {
464        match (self, vis) {
465            (Visibility::Public, Visibility::Public) => Some(Ordering::Equal),
466            (Visibility::Public, Visibility::Restricted(_)) => Some(Ordering::Greater),
467            (Visibility::Restricted(_), Visibility::Public) => Some(Ordering::Less),
468            (Visibility::Restricted(lhs_id), Visibility::Restricted(rhs_id)) => {
469                let (lhs_id, rhs_id) = (lhs_id.into(), rhs_id.into());
470                tcx.def_id_partial_cmp(lhs_id, rhs_id)
471            }
472        }
473    }
474}
475
476impl<Id: Into<DefId> + Debug + Copy> Visibility<Id> {
477    /// Returns `true` if this visibility is strictly larger than the given visibility.
478    #[track_caller]
479    pub fn greater_than(
480        self,
481        vis: Visibility<impl Into<DefId> + Debug + Copy>,
482        tcx: TyCtxt<'_>,
483    ) -> bool {
484        match self.partial_cmp(vis, tcx) {
485            Some(ord) => ord.is_gt(),
486            None => {
487                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:?}"));
488                false
489            }
490        }
491    }
492}
493
494impl Visibility<ModId> {
495    pub fn expect_local(self) -> Visibility {
496        self.map_id(|id| id.expect_local())
497    }
498
499    /// Returns `true` if this item is visible anywhere in the local crate.
500    pub fn is_visible_locally(self) -> bool {
501        match self {
502            Visibility::Public => true,
503            Visibility::Restricted(mod_id) => mod_id.is_local(),
504        }
505    }
506}
507
508/// The crate variances map is computed during typeck and contains the
509/// variance of every item in the local crate. You should not use it
510/// directly, because to do so will make your pass dependent on the
511/// HIR of every item in the local crate. Instead, use
512/// `tcx.variances_of()` to get the variance for a *particular*
513/// item.
514#[derive(const _: () =
    {
        impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
            CrateVariancesMap<'tcx> {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    CrateVariancesMap { variances: ref __binding_0 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, #[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)]
515pub struct CrateVariancesMap<'tcx> {
516    /// For each item with generics, maps to a vector of the variance
517    /// of its generics. If an item has no generics, it will have no
518    /// entry.
519    pub variances: DefIdMap<&'tcx [ty::Variance]>,
520}
521
522// Contains information needed to resolve types and (in the future) look up
523// the types of AST nodes.
524#[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)]
525pub struct CReaderCacheKey {
526    pub cnum: Option<CrateNum>,
527    pub pos: usize,
528}
529
530/// Use this rather than `TyKind`, whenever possible.
531#[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_hash::StableHash for
            Ty<'tcx> {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    Ty(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
532#[rustc_diagnostic_item = "Ty"]
533#[rustc_pass_by_value]
534pub struct Ty<'tcx>(Interned<'tcx, WithCachedTypeInfo<TyKind<'tcx>>>);
535
536impl<'tcx> rustc_type_ir::inherent::IntoKind for Ty<'tcx> {
537    type Kind = TyKind<'tcx>;
538
539    fn kind(self) -> TyKind<'tcx> {
540        *self.kind()
541    }
542}
543
544impl<'tcx> rustc_type_ir::Flags for Ty<'tcx> {
545    fn flags(&self) -> TypeFlags {
546        self.0.flags
547    }
548
549    fn outer_exclusive_binder(&self) -> DebruijnIndex {
550        self.0.outer_exclusive_binder
551    }
552}
553
554/// The crate outlives map is computed during typeck and contains the
555/// outlives of every item in the local crate. You should not use it
556/// directly, because to do so will make your pass dependent on the
557/// HIR of every item in the local crate. Instead, use
558/// `tcx.inferred_outlives_of()` to get the outlives for a *particular*
559/// item.
560#[derive(const _: () =
    {
        impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
            CratePredicatesMap<'tcx> {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    CratePredicatesMap { predicates: ref __binding_0 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, #[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)]
561pub struct CratePredicatesMap<'tcx> {
562    /// For each struct with outlive bounds, maps to a vector of the
563    /// predicate of its outlive bounds. If an item has no outlives
564    /// bounds, it will have no entry.
565    pub predicates: DefIdMap<&'tcx [(Clause<'tcx>, Span)]>,
566}
567
568#[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> {
        ::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
    }
}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)]
569pub struct Term<'tcx> {
570    ptr: NonNull<()>,
571    marker: PhantomData<(Ty<'tcx>, Const<'tcx>)>,
572}
573
574impl<'tcx> rustc_type_ir::inherent::Term<TyCtxt<'tcx>> for Term<'tcx> {}
575
576impl<'tcx> rustc_type_ir::inherent::IntoKind for Term<'tcx> {
577    type Kind = TermKind<'tcx>;
578
579    fn kind(self) -> Self::Kind {
580        self.kind()
581    }
582}
583
584unsafe impl<'tcx> rustc_data_structures::sync::DynSend for Term<'tcx> where
585    &'tcx (Ty<'tcx>, Const<'tcx>): rustc_data_structures::sync::DynSend
586{
587}
588unsafe impl<'tcx> rustc_data_structures::sync::DynSync for Term<'tcx> where
589    &'tcx (Ty<'tcx>, Const<'tcx>): rustc_data_structures::sync::DynSync
590{
591}
592unsafe impl<'tcx> Send for Term<'tcx> where &'tcx (Ty<'tcx>, Const<'tcx>): Send {}
593unsafe impl<'tcx> Sync for Term<'tcx> where &'tcx (Ty<'tcx>, Const<'tcx>): Sync {}
594
595impl Debug for Term<'_> {
596    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
597        match self.kind() {
598            TermKind::Ty(ty) => f.write_fmt(format_args!("Term::Ty({0:?})", ty))write!(f, "Term::Ty({ty:?})"),
599            TermKind::Const(ct) => f.write_fmt(format_args!("Term::Const({0:?})", ct))write!(f, "Term::Const({ct:?})"),
600        }
601    }
602}
603
604impl<'tcx> From<Ty<'tcx>> for Term<'tcx> {
605    fn from(ty: Ty<'tcx>) -> Self {
606        TermKind::Ty(ty).pack()
607    }
608}
609
610impl<'tcx> From<Const<'tcx>> for Term<'tcx> {
611    fn from(c: Const<'tcx>) -> Self {
612        TermKind::Const(c).pack()
613    }
614}
615
616impl<'tcx> StableHash for Term<'tcx> {
617    fn stable_hash<Hcx: StableHashCtxt>(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
618        self.kind().stable_hash(hcx, hasher);
619    }
620}
621
622impl<'tcx> TypeFoldable<TyCtxt<'tcx>> for Term<'tcx> {
623    fn try_fold_with<F: FallibleTypeFolder<TyCtxt<'tcx>>>(
624        self,
625        folder: &mut F,
626    ) -> Result<Self, F::Error> {
627        match self.kind() {
628            ty::TermKind::Ty(ty) => ty.try_fold_with(folder).map(Into::into),
629            ty::TermKind::Const(ct) => ct.try_fold_with(folder).map(Into::into),
630        }
631    }
632
633    fn fold_with<F: TypeFolder<TyCtxt<'tcx>>>(self, folder: &mut F) -> Self {
634        match self.kind() {
635            ty::TermKind::Ty(ty) => ty.fold_with(folder).into(),
636            ty::TermKind::Const(ct) => ct.fold_with(folder).into(),
637        }
638    }
639}
640
641impl<'tcx> TypeVisitable<TyCtxt<'tcx>> for Term<'tcx> {
642    fn visit_with<V: TypeVisitor<TyCtxt<'tcx>>>(&self, visitor: &mut V) -> V::Result {
643        match self.kind() {
644            ty::TermKind::Ty(ty) => ty.visit_with(visitor),
645            ty::TermKind::Const(ct) => ct.visit_with(visitor),
646        }
647    }
648}
649
650impl<'tcx, E: TyEncoder<'tcx>> Encodable<E> for Term<'tcx> {
651    fn encode(&self, e: &mut E) {
652        self.kind().encode(e)
653    }
654}
655
656impl<'tcx, D: TyDecoder<'tcx>> Decodable<D> for Term<'tcx> {
657    fn decode(d: &mut D) -> Self {
658        let res: TermKind<'tcx> = Decodable::decode(d);
659        res.pack()
660    }
661}
662
663impl<'tcx> Term<'tcx> {
664    #[inline]
665    pub fn kind(self) -> TermKind<'tcx> {
666        let ptr =
667            unsafe { self.ptr.map_addr(|addr| NonZero::new_unchecked(addr.get() & !TAG_MASK)) };
668        // SAFETY: use of `Interned::new_unchecked` here is ok because these
669        // pointers were originally created from `Interned` types in `pack()`,
670        // and this is just going in the other direction.
671        unsafe {
672            match self.ptr.addr().get() & TAG_MASK {
673                TYPE_TAG => TermKind::Ty(Ty(Interned::new_unchecked(
674                    ptr.cast::<WithCachedTypeInfo<ty::TyKind<'tcx>>>().as_ref(),
675                ))),
676                CONST_TAG => TermKind::Const(ty::Const(Interned::new_unchecked(
677                    ptr.cast::<WithCachedTypeInfo<ty::ConstKind<'tcx>>>().as_ref(),
678                ))),
679                _ => core::intrinsics::unreachable(),
680            }
681        }
682    }
683
684    pub fn as_type(&self) -> Option<Ty<'tcx>> {
685        if let TermKind::Ty(ty) = self.kind() { Some(ty) } else { None }
686    }
687
688    pub fn expect_type(&self) -> Ty<'tcx> {
689        self.as_type().expect("expected a type, but found a const")
690    }
691
692    pub fn as_const(&self) -> Option<Const<'tcx>> {
693        if let TermKind::Const(c) = self.kind() { Some(c) } else { None }
694    }
695
696    pub fn expect_const(&self) -> Const<'tcx> {
697        self.as_const().expect("expected a const, but found a type")
698    }
699
700    pub fn into_arg(self) -> GenericArg<'tcx> {
701        match self.kind() {
702            TermKind::Ty(ty) => ty.into(),
703            TermKind::Const(c) => c.into(),
704        }
705    }
706
707    pub fn to_alias_term(self) -> Option<AliasTerm<'tcx>> {
708        match self.kind() {
709            TermKind::Ty(ty) => match *ty.kind() {
710                ty::Alias(_, alias_ty) => Some(alias_ty.into()),
711                _ => None,
712            },
713            TermKind::Const(ct) => match ct.kind() {
714                ConstKind::Alias(_, alias_const) => Some(alias_const.into()),
715                _ => None,
716            },
717        }
718    }
719
720    pub fn is_non_rigid_alias(self) -> bool {
721        match self.kind() {
722            ty::TermKind::Ty(ty) => match ty.kind() {
723                ty::Alias(ty::IsRigid::No, _) => true,
724                _ => false,
725            },
726            ty::TermKind::Const(ct) => match ct.kind() {
727                ty::ConstKind::Alias(ty::IsRigid::No, _) => true,
728                _ => false,
729            },
730        }
731    }
732
733    pub fn is_infer(&self) -> bool {
734        match self.kind() {
735            TermKind::Ty(ty) => ty.is_ty_var(),
736            TermKind::Const(ct) => ct.is_ct_infer(),
737        }
738    }
739
740    pub fn is_trivially_wf(&self, tcx: TyCtxt<'tcx>) -> bool {
741        match self.kind() {
742            TermKind::Ty(ty) => ty.is_trivially_wf(tcx),
743            TermKind::Const(ct) => ct.is_trivially_wf(),
744        }
745    }
746
747    /// Iterator that walks `self` and any types reachable from
748    /// `self`, in depth-first order. Note that just walks the types
749    /// that appear in `self`, it does not descend into the fields of
750    /// structs or variants. For example:
751    ///
752    /// ```text
753    /// isize => { isize }
754    /// Foo<Bar<isize>> => { Foo<Bar<isize>>, Bar<isize>, isize }
755    /// [isize] => { [isize], isize }
756    /// ```
757    pub fn walk(self) -> TypeWalker<TyCtxt<'tcx>> {
758        TypeWalker::new(self.into())
759    }
760}
761
762const TAG_MASK: usize = 0b11;
763const TYPE_TAG: usize = 0b00;
764const CONST_TAG: usize = 0b01;
765
766impl<'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>)]
767impl<'tcx> TermKind<'tcx> {
768    #[inline]
769    fn pack(self) -> Term<'tcx> {
770        let (tag, ptr) = match self {
771            TermKind::Ty(ty) => {
772                // Ensure we can use the tag bits.
773                assert_eq!(align_of_val(&*ty.0.0) & TAG_MASK, 0);
774                (TYPE_TAG, NonNull::from(ty.0.0).cast())
775            }
776            TermKind::Const(ct) => {
777                // Ensure we can use the tag bits.
778                assert_eq!(align_of_val(&*ct.0.0) & TAG_MASK, 0);
779                (CONST_TAG, NonNull::from(ct.0.0).cast())
780            }
781        };
782
783        Term { ptr: ptr.map_addr(|addr| addr | tag), marker: PhantomData }
784    }
785}
786
787/// Represents the bounds declared on a particular set of type
788/// parameters. Should eventually be generalized into a flag list of
789/// where-clauses. You can obtain an `InstantiatedPredicates` list from a
790/// `GenericPredicates` by using the `instantiate` method. Note that this method
791/// reflects an important semantic invariant of `InstantiatedPredicates`: while
792/// the `GenericPredicates` are expressed in terms of the bound type
793/// parameters of the impl/trait/whatever, an `InstantiatedPredicates` instance
794/// represented a set of bounds for some particular instantiation,
795/// meaning that the generic parameters have been instantiated with
796/// their values.
797///
798/// Example:
799/// ```ignore (illustrative)
800/// struct Foo<T, U: Bar<T>> { ... }
801/// ```
802/// Here, the `GenericPredicates` for `Foo` would contain a list of bounds like
803/// `[[], [U:Bar<T>]]`. Now if there were some particular reference
804/// like `Foo<isize,usize>`, then the `InstantiatedPredicates` would be `[[],
805/// [usize:Bar<isize>]]`.
806#[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)]
807pub struct InstantiatedPredicates<'tcx> {
808    pub predicates: Vec<Unnormalized<'tcx, Clause<'tcx>>>,
809    pub spans: Vec<Span>,
810}
811
812impl<'tcx> InstantiatedPredicates<'tcx> {
813    pub fn empty() -> InstantiatedPredicates<'tcx> {
814        InstantiatedPredicates { predicates: ::alloc::vec::Vec::new()vec![], spans: ::alloc::vec::Vec::new()vec![] }
815    }
816
817    pub fn is_empty(&self) -> bool {
818        self.predicates.is_empty()
819    }
820
821    pub fn iter(&self) -> <&Self as IntoIterator>::IntoIter {
822        self.into_iter()
823    }
824}
825
826impl<'tcx> IntoIterator for InstantiatedPredicates<'tcx> {
827    type Item = (Unnormalized<'tcx, Clause<'tcx>>, Span);
828
829    type IntoIter = std::iter::Zip<
830        std::vec::IntoIter<Unnormalized<'tcx, Clause<'tcx>>>,
831        std::vec::IntoIter<Span>,
832    >;
833
834    fn into_iter(self) -> Self::IntoIter {
835        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());
836        std::iter::zip(self.predicates, self.spans)
837    }
838}
839
840impl<'a, 'tcx> IntoIterator for &'a InstantiatedPredicates<'tcx> {
841    type Item = (Unnormalized<'tcx, Clause<'tcx>>, Span);
842
843    type IntoIter = std::iter::Zip<
844        std::iter::Copied<std::slice::Iter<'a, Unnormalized<'tcx, Clause<'tcx>>>>,
845        std::iter::Copied<std::slice::Iter<'a, Span>>,
846    >;
847
848    fn into_iter(self) -> Self::IntoIter {
849        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());
850        std::iter::zip(self.predicates.iter().copied(), self.spans.iter().copied())
851    }
852}
853
854#[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_hash::StableHash for
            ProvisionalHiddenType<'tcx> {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    ProvisionalHiddenType {
                        span: ref __binding_0, ty: ref __binding_1 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, 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)]
855pub struct ProvisionalHiddenType<'tcx> {
856    /// The span of this particular definition of the opaque type. So
857    /// for example:
858    ///
859    /// ```ignore (incomplete snippet)
860    /// type Foo = impl Baz;
861    /// fn bar() -> Foo {
862    /// //          ^^^ This is the span we are looking for!
863    /// }
864    /// ```
865    ///
866    /// In cases where the fn returns `(impl Trait, impl Trait)` or
867    /// other such combinations, the result is currently
868    /// over-approximated, but better than nothing.
869    pub span: Span,
870
871    /// The type variable that represents the value of the opaque type
872    /// that we require. In other words, after we compile this function,
873    /// we will be created a constraint like:
874    /// ```ignore (pseudo-rust)
875    /// Foo<'a, T> = ?C
876    /// ```
877    /// where `?C` is the value of this type variable. =) It may
878    /// naturally refer to the type and lifetime parameters in scope
879    /// in this function, though ultimately it should only reference
880    /// those that are arguments to `Foo` in the constraint above. (In
881    /// other words, `?C` should not include `'b`, even though it's a
882    /// lifetime parameter on `foo`.)
883    pub ty: Ty<'tcx>,
884}
885
886/// Whether we're currently in HIR typeck or MIR borrowck.
887#[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)]
888pub enum DefiningScopeKind {
889    /// During writeback in typeck, we don't care about regions and simply
890    /// erase them. This means we also don't check whether regions are
891    /// universal in the opaque type key. This will only be checked in
892    /// MIR borrowck.
893    HirTypeck,
894    MirBorrowck,
895}
896
897impl<'tcx> ProvisionalHiddenType<'tcx> {
898    pub fn new_error(tcx: TyCtxt<'tcx>, guar: ErrorGuaranteed) -> ProvisionalHiddenType<'tcx> {
899        ProvisionalHiddenType { span: DUMMY_SP, ty: Ty::new_error(tcx, guar) }
900    }
901
902    pub fn build_mismatch_error(
903        &self,
904        other: &Self,
905        tcx: TyCtxt<'tcx>,
906    ) -> Result<Diag<'tcx>, ErrorGuaranteed> {
907        (self.ty, other.ty).error_reported()?;
908        // Found different concrete types for the opaque type.
909        let sub_diag = if self.span == other.span {
910            TypeMismatchReason::ConflictType { span: self.span }
911        } else {
912            TypeMismatchReason::PreviousUse { span: self.span }
913        };
914        Ok(tcx.dcx().create_err(OpaqueHiddenTypeMismatch {
915            self_ty: self.ty,
916            other_ty: other.ty,
917            other_span: other.span,
918            sub: sub_diag,
919        }))
920    }
921
922    x;#[instrument(level = "debug", skip(tcx), ret)]
923    pub fn remap_generic_params_to_declaration_params(
924        self,
925        opaque_type_key: OpaqueTypeKey<'tcx>,
926        tcx: TyCtxt<'tcx>,
927        defining_scope_kind: DefiningScopeKind,
928    ) -> DefinitionSiteHiddenType<'tcx> {
929        let OpaqueTypeKey { def_id, args } = opaque_type_key;
930
931        // Use args to build up a reverse map from regions to their
932        // identity mappings. This is necessary because of `impl
933        // Trait` lifetimes are computed by replacing existing
934        // lifetimes with 'static and remapping only those used in the
935        // `impl Trait` return type, resulting in the parameters
936        // shifting.
937        let id_args = GenericArgs::identity_for_item(tcx, def_id);
938        debug!(?id_args);
939
940        // This zip may have several times the same lifetime in `args` paired with a different
941        // lifetime from `id_args`. Simply `collect`ing the iterator is the correct behaviour:
942        // it will pick the last one, which is the one we introduced in the impl-trait desugaring.
943        let map = args.iter().zip(id_args).collect();
944        debug!("map = {:#?}", map);
945
946        // Convert the type from the function into a type valid outside by mapping generic
947        // parameters to into the context of the opaque.
948        //
949        // We erase regions when doing this during HIR typeck. We manually use `fold_regions`
950        // here as we do not want to anonymize bound variables.
951        let ty = match defining_scope_kind {
952            DefiningScopeKind::HirTypeck => {
953                fold_regions(tcx, self.ty, |_, _| tcx.lifetimes.re_erased)
954            }
955            DefiningScopeKind::MirBorrowck => self.ty,
956        };
957        let result_ty = ty.fold_with(&mut opaque_types::ReverseMapper::new(tcx, map, self.span));
958        if cfg!(debug_assertions) && matches!(defining_scope_kind, DefiningScopeKind::HirTypeck) {
959            assert_eq!(result_ty, fold_regions(tcx, result_ty, |_, _| tcx.lifetimes.re_erased));
960        }
961        DefinitionSiteHiddenType { span: self.span, ty: ty::EarlyBinder::bind(tcx, result_ty) }
962    }
963}
964
965#[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_hash::StableHash for
            DefinitionSiteHiddenType<'tcx> {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    DefinitionSiteHiddenType {
                        span: ref __binding_0, ty: ref __binding_1 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, 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)]
966pub struct DefinitionSiteHiddenType<'tcx> {
967    /// The span of the definition of the opaque type. So for example:
968    ///
969    /// ```ignore (incomplete snippet)
970    /// type Foo = impl Baz;
971    /// fn bar() -> Foo {
972    /// //          ^^^ This is the span we are looking for!
973    /// }
974    /// ```
975    ///
976    /// In cases where the fn returns `(impl Trait, impl Trait)` or
977    /// other such combinations, the result is currently
978    /// over-approximated, but better than nothing.
979    pub span: Span,
980
981    /// The final type of the opaque.
982    pub ty: ty::EarlyBinder<'tcx, Ty<'tcx>>,
983}
984
985impl<'tcx> DefinitionSiteHiddenType<'tcx> {
986    pub fn new_error(tcx: TyCtxt<'tcx>, guar: ErrorGuaranteed) -> DefinitionSiteHiddenType<'tcx> {
987        DefinitionSiteHiddenType {
988            span: DUMMY_SP,
989            ty: ty::EarlyBinder::bind(tcx, Ty::new_error(tcx, guar)),
990        }
991    }
992
993    pub fn build_mismatch_error(
994        &self,
995        other: &Self,
996        tcx: TyCtxt<'tcx>,
997    ) -> Result<Diag<'tcx>, ErrorGuaranteed> {
998        let self_ty = self.ty.instantiate_identity().skip_norm_wip();
999        let other_ty = other.ty.instantiate_identity().skip_norm_wip();
1000        (self_ty, other_ty).error_reported()?;
1001        // Found different concrete types for the opaque type.
1002        let sub_diag = if self.span == other.span {
1003            TypeMismatchReason::ConflictType { span: self.span }
1004        } else {
1005            TypeMismatchReason::PreviousUse { span: self.span }
1006        };
1007        Ok(tcx.dcx().create_err(OpaqueHiddenTypeMismatch {
1008            self_ty,
1009            other_ty,
1010            other_span: other.span,
1011            sub: sub_diag,
1012        }))
1013    }
1014}
1015
1016pub type Clauses<'tcx> = &'tcx ListWithCachedTypeInfo<Clause<'tcx>>;
1017
1018impl<'tcx> rustc_type_ir::Flags for Clauses<'tcx> {
1019    fn flags(&self) -> TypeFlags {
1020        (**self).flags()
1021    }
1022
1023    fn outer_exclusive_binder(&self) -> DebruijnIndex {
1024        (**self).outer_exclusive_binder()
1025    }
1026}
1027
1028/// When interacting with the type system we must provide information about the
1029/// environment. `ParamEnv` is the type that represents this information. See the
1030/// [dev guide chapter][param_env_guide] for more information.
1031///
1032/// [param_env_guide]: https://rustc-dev-guide.rust-lang.org/typing_parameter_envs.html
1033#[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)]
1034#[derive(const _: () =
    {
        impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
            ParamEnv<'tcx> {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    ParamEnv { caller_bounds: ref __binding_0 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, 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)]
1035pub struct ParamEnv<'tcx> {
1036    /// Caller bounds are `Obligation`s that the caller must satisfy. This is
1037    /// basically the set of bounds on the in-scope type parameters, translated
1038    /// into `Obligation`s, and elaborated and normalized.
1039    ///
1040    /// Use the `caller_bounds()` method to access.
1041    caller_bounds: Clauses<'tcx>,
1042}
1043
1044impl<'tcx> rustc_type_ir::inherent::ParamEnv<TyCtxt<'tcx>> for ParamEnv<'tcx> {
1045    fn caller_bounds(self) -> impl inherent::SliceLike<Item = ty::Clause<'tcx>> {
1046        self.caller_bounds()
1047    }
1048}
1049
1050impl<'tcx> ParamEnv<'tcx> {
1051    /// Construct a trait environment suitable for contexts where there are
1052    /// no where-clauses in scope. In the majority of cases it is incorrect
1053    /// to use an empty environment. See the [dev guide section][param_env_guide]
1054    /// for information on what a `ParamEnv` is and how to acquire one.
1055    ///
1056    /// [param_env_guide]: https://rustc-dev-guide.rust-lang.org/typing_parameter_envs.html
1057    #[inline]
1058    pub fn empty() -> Self {
1059        Self::new(ListWithCachedTypeInfo::empty())
1060    }
1061
1062    #[inline]
1063    pub fn caller_bounds(self) -> Clauses<'tcx> {
1064        self.caller_bounds
1065    }
1066
1067    /// Construct a trait environment with the given set of predicates.
1068    #[inline]
1069    pub fn new(caller_bounds: Clauses<'tcx>) -> Self {
1070        ParamEnv { caller_bounds }
1071    }
1072
1073    /// Creates a pair of param-env and value for use in queries.
1074    pub fn and<T: TypeVisitable<TyCtxt<'tcx>>>(self, value: T) -> ParamEnvAnd<'tcx, T> {
1075        ParamEnvAnd { param_env: self, value }
1076    }
1077
1078    /// Eagerly reveal all opaque types in the `param_env`.
1079    pub fn with_normalized(self, tcx: TyCtxt<'tcx>) -> ParamEnv<'tcx> {
1080        // No need to reveal opaques with the new solver enabled,
1081        // since we have lazy norm.
1082        if tcx.next_trait_solver_globally() {
1083            self
1084        } else {
1085            ParamEnv::new(tcx.reveal_opaque_types_in_bounds(self.caller_bounds))
1086        }
1087    }
1088}
1089
1090#[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)]
1091#[derive(const _: () =
    {
        impl<'tcx, T> ::rustc_data_structures::stable_hash::StableHash for
            ParamEnvAnd<'tcx, T> where
            T: ::rustc_data_structures::stable_hash::StableHash {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    ParamEnvAnd {
                        param_env: ref __binding_0, value: ref __binding_1 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
1092pub struct ParamEnvAnd<'tcx, T> {
1093    pub param_env: ParamEnv<'tcx>,
1094    pub value: T,
1095}
1096
1097/// The environment in which to do trait solving.
1098///
1099/// Most of the time you only need to care about the `ParamEnv`
1100/// as the `TypingMode` is simply stored in the `InferCtxt`.
1101///
1102/// However, there are some places which rely on trait solving
1103/// without using an `InferCtxt` themselves. For these to be
1104/// able to use the trait system they have to be able to initialize
1105/// such an `InferCtxt` with the right `typing_mode`, so they need
1106/// to track both.
1107#[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_hash::StableHash for
            TypingEnv<'tcx> {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    TypingEnv {
                        typing_mode: ref __binding_0, param_env: ref __binding_1 }
                        => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
1108#[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)]
1109pub struct TypingEnv<'tcx> {
1110    #[type_foldable(identity)]
1111    #[type_visitable(ignore)]
1112    typing_mode: TypingModeEqWrapper<'tcx>,
1113    pub param_env: ParamEnv<'tcx>,
1114}
1115
1116impl<'tcx> TypingEnv<'tcx> {
1117    pub fn new(param_env: ParamEnv<'tcx>, typing_mode: TypingMode<'tcx>) -> Self {
1118        Self { typing_mode: TypingModeEqWrapper(typing_mode), param_env }
1119    }
1120
1121    pub fn typing_mode(&self) -> TypingMode<'tcx> {
1122        self.typing_mode.0
1123    }
1124
1125    /// Create a typing environment with no where-clauses in scope
1126    /// where all opaque types and default associated items are revealed.
1127    ///
1128    /// This is only suitable for monomorphized, post-typeck environments.
1129    /// Do not use this for MIR optimizations, as even though they also
1130    /// use `TypingMode::PostAnalysis`, they may still have where-clauses
1131    /// in scope.
1132    pub fn fully_monomorphized() -> TypingEnv<'tcx> {
1133        Self::new(ParamEnv::empty(), TypingMode::Codegen)
1134    }
1135
1136    /// Create a typing environment for use during analysis outside of a body.
1137    ///
1138    /// Using a typing environment inside of bodies is not supported as the body
1139    /// may define opaque types. In this case the used functions have to be
1140    /// converted to use proper canonical inputs instead.
1141    pub fn non_body_analysis(
1142        tcx: TyCtxt<'tcx>,
1143        def_id: impl IntoQueryKey<DefId>,
1144    ) -> TypingEnv<'tcx> {
1145        let def_id = def_id.into_query_key();
1146        Self::new(tcx.param_env(def_id), TypingMode::non_body_analysis())
1147    }
1148
1149    /// Ideally we just use `TypingMode::PostTypeckUntilBorrowck`.
1150    /// But that's not compatible with the old solver yet.
1151    ///
1152    /// FIXME: this should not be needed in the long term.
1153    pub fn post_typeck_until_borrowck_for_mir_build(
1154        tcx: TyCtxt<'tcx>,
1155        def_id: LocalDefId,
1156    ) -> TypingEnv<'tcx> {
1157        if tcx.use_typing_mode_post_typeck_until_borrowck() {
1158            TypingEnv::new(tcx.param_env(def_id.to_def_id()), ty::TypingMode::borrowck(tcx, def_id))
1159        } else {
1160            // FIXME(#132279): We're in a body, we should use a typing
1161            // mode which reveals the opaque types defined by that body.
1162            TypingEnv::non_body_analysis(tcx, def_id)
1163        }
1164    }
1165
1166    pub fn post_analysis(tcx: TyCtxt<'tcx>, def_id: impl IntoQueryKey<DefId>) -> TypingEnv<'tcx> {
1167        TypingEnv::new(tcx.param_env_normalized_for_post_analysis(def_id), TypingMode::PostAnalysis)
1168    }
1169
1170    pub fn codegen(tcx: TyCtxt<'tcx>, def_id: impl IntoQueryKey<DefId>) -> TypingEnv<'tcx> {
1171        TypingEnv::new(tcx.param_env_normalized_for_post_analysis(def_id), TypingMode::Codegen)
1172    }
1173
1174    /// Modify the `typing_mode` to `PostAnalysis` or `Codegen` and eagerly reveal all opaque types
1175    /// in the `param_env`.
1176    pub fn with_post_analysis_normalized(self, tcx: TyCtxt<'tcx>) -> TypingEnv<'tcx> {
1177        let TypingEnv { typing_mode, param_env } = self;
1178        match typing_mode.0.assert_not_erased() {
1179            TypingMode::Coherence
1180            | TypingMode::Typeck { .. }
1181            | TypingMode::PostTypeckUntilBorrowck { .. }
1182            | TypingMode::PostBorrowck { .. } => {}
1183            TypingMode::PostAnalysis | TypingMode::Codegen => return self,
1184        }
1185
1186        let param_env = param_env.with_normalized(tcx);
1187        TypingEnv::new(param_env, TypingMode::PostAnalysis)
1188    }
1189
1190    /// Modify the `typing_mode` to `PostAnalysis` or `Codegen` and eagerly reveal all opaque types
1191    /// in the `param_env`.
1192    pub fn with_codegen_normalized(self, tcx: TyCtxt<'tcx>) -> TypingEnv<'tcx> {
1193        let TypingEnv { typing_mode, param_env } = self;
1194        match typing_mode.0.assert_not_erased() {
1195            TypingMode::Coherence
1196            | TypingMode::Typeck { .. }
1197            | TypingMode::PostTypeckUntilBorrowck { .. }
1198            | TypingMode::PostBorrowck { .. }
1199            | TypingMode::PostAnalysis => {}
1200            TypingMode::Codegen => return self,
1201        }
1202
1203        let param_env = param_env.with_normalized(tcx);
1204        TypingEnv::new(param_env, TypingMode::Codegen)
1205    }
1206
1207    /// Combine this typing environment with the given `value` to be used by
1208    /// not (yet) canonicalized queries. This only works if the value does not
1209    /// contain anything local to some `InferCtxt`, i.e. inference variables or
1210    /// placeholders.
1211    pub fn as_query_input<T>(self, value: T) -> PseudoCanonicalInput<'tcx, T>
1212    where
1213        T: TypeVisitable<TyCtxt<'tcx>>,
1214    {
1215        // FIXME(#132279): We should assert that the value does not contain any placeholders
1216        // as these placeholders are also local to the current inference context. However, we
1217        // currently use pseudo-canonical queries in the trait solver, which replaces params
1218        // with placeholders during canonicalization. We should also simply not use pseudo-
1219        // canonical queries in the trait solver, at which point we can readd this assert.
1220        //
1221        // As of writing this comment, this is only used when normalizing consts that mention
1222        // params.
1223        /* debug_assert!(
1224            !value.has_placeholders(),
1225            "{value:?} which has placeholder shouldn't be pseudo-canonicalized"
1226        ); */
1227        PseudoCanonicalInput { typing_env: self, value }
1228    }
1229}
1230
1231/// Similar to `CanonicalInput`, this carries the `typing_mode` and the environment
1232/// necessary to do any kind of trait solving inside of nested queries.
1233///
1234/// Unlike proper canonicalization, this requires the `param_env` and the `value` to not
1235/// contain anything local to the `infcx` of the caller, so we don't actually canonicalize
1236/// anything.
1237///
1238/// This should be created by using `infcx.pseudo_canonicalize_query(param_env, value)`
1239/// or by using `typing_env.as_query_input(value)`.
1240#[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)]
1241#[derive(const _: () =
    {
        impl<'tcx, T> ::rustc_data_structures::stable_hash::StableHash for
            PseudoCanonicalInput<'tcx, T> where
            T: ::rustc_data_structures::stable_hash::StableHash {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    PseudoCanonicalInput {
                        typing_env: ref __binding_0, value: ref __binding_1 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, 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)]
1242pub struct PseudoCanonicalInput<'tcx, T> {
1243    pub typing_env: TypingEnv<'tcx>,
1244    pub value: T,
1245}
1246
1247#[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_hash::StableHash for Destructor {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    Destructor { did: ref __binding_0 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, 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)]
1248pub struct Destructor {
1249    /// The `DefId` of the destructor method
1250    pub did: DefId,
1251}
1252
1253// FIXME: consider combining this definition with regular `Destructor`
1254#[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_hash::StableHash for
            AsyncDestructor {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    AsyncDestructor { impl_did: ref __binding_0 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, 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)]
1255pub struct AsyncDestructor {
1256    /// The `DefId` of the `impl AsyncDrop`
1257    pub impl_did: DefId,
1258}
1259
1260#[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_hash::StableHash for VariantFlags
            {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    VariantFlags(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, 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)]
1261pub struct VariantFlags(u8);
1262impl 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! {
1263    impl VariantFlags: u8 {
1264        const NO_VARIANT_FLAGS        = 0;
1265        /// Indicates whether the field list of this variant is `#[non_exhaustive]`.
1266        const IS_FIELD_LIST_NON_EXHAUSTIVE = 1 << 0;
1267    }
1268}
1269impl ::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 }
1270
1271/// Definition of a variant -- a struct's fields or an enum variant.
1272#[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_hash::StableHash for VariantDef {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::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.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                        { __binding_3.stable_hash(__hcx, __hasher); }
                        { __binding_4.stable_hash(__hcx, __hasher); }
                        { __binding_5.stable_hash(__hcx, __hasher); }
                        { __binding_6.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, 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)]
1273pub struct VariantDef {
1274    /// `DefId` that identifies the variant itself.
1275    /// If this variant belongs to a struct or union, then this is a copy of its `DefId`.
1276    pub def_id: DefId,
1277    /// `DefId` that identifies the variant's constructor.
1278    /// If this variant is a struct variant, then this is `None`.
1279    pub ctor: Option<(CtorKind, DefId)>,
1280    /// Variant or struct name.
1281    pub name: Symbol,
1282    /// Discriminant of this variant.
1283    pub discr: VariantDiscr,
1284    /// Fields of this variant.
1285    pub fields: IndexVec<FieldIdx, FieldDef>,
1286    /// The error guarantees from parser, if any.
1287    tainted: Option<ErrorGuaranteed>,
1288    /// Flags of the variant (e.g. is field list non-exhaustive)?
1289    flags: VariantFlags,
1290}
1291
1292impl VariantDef {
1293    /// Creates a new `VariantDef`.
1294    ///
1295    /// `variant_did` is the `DefId` that identifies the enum variant (if this `VariantDef`
1296    /// represents an enum variant).
1297    ///
1298    /// `ctor_did` is the `DefId` that identifies the constructor of unit or
1299    /// tuple-variants/structs. If this is a `struct`-variant then this should be `None`.
1300    ///
1301    /// `parent_did` is the `DefId` of the `AdtDef` representing the enum or struct that
1302    /// owns this variant. It is used for checking if a struct has `#[non_exhaustive]` w/out having
1303    /// to go through the redirect of checking the ctor's attributes - but compiling a small crate
1304    /// requires loading the `AdtDef`s for all the structs in the universe (e.g., coherence for any
1305    /// built-in trait), and we do not want to load attributes twice.
1306    ///
1307    /// If someone speeds up attribute loading to not be a performance concern, they can
1308    /// remove this hack and use the constructor `DefId` everywhere.
1309    #[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(1309u32),
                                    ::tracing_core::__macro_support::Option::Some("rustc_middle::ty"),
                                    ::tracing_core::field::FieldSet::new(&[{
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("name")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("name");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("variant_did")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("variant_did");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("ctor")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("ctor");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("discr")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("discr");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("fields")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("fields");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("parent_did")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("parent_did");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("recover_tainted")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("recover_tainted");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("is_field_list_non_exhaustive")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("is_field_list_non_exhaustive");
                                                        NAME.as_str()
                                                    }], ::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};
                                meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&name)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&variant_did)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&ctor)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&discr)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&fields)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&parent_did)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&recover_tainted)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&is_field_list_non_exhaustive
                                                            as &dyn ::tracing::field::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")]
1310    pub fn new(
1311        name: Symbol,
1312        variant_did: Option<DefId>,
1313        ctor: Option<(CtorKind, DefId)>,
1314        discr: VariantDiscr,
1315        fields: IndexVec<FieldIdx, FieldDef>,
1316        parent_did: DefId,
1317        recover_tainted: Option<ErrorGuaranteed>,
1318        is_field_list_non_exhaustive: bool,
1319    ) -> Self {
1320        let mut flags = VariantFlags::NO_VARIANT_FLAGS;
1321        if is_field_list_non_exhaustive {
1322            flags |= VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE;
1323        }
1324
1325        VariantDef {
1326            def_id: variant_did.unwrap_or(parent_did),
1327            ctor,
1328            name,
1329            discr,
1330            fields,
1331            flags,
1332            tainted: recover_tainted,
1333        }
1334    }
1335
1336    /// Returns `true` if the field list of this variant is `#[non_exhaustive]`.
1337    ///
1338    /// Note that this function will return `true` even if the type has been
1339    /// defined in the crate currently being compiled. If that's not what you
1340    /// want, see [`Self::field_list_has_applicable_non_exhaustive`].
1341    #[inline]
1342    pub fn is_field_list_non_exhaustive(&self) -> bool {
1343        self.flags.intersects(VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE)
1344    }
1345
1346    /// Returns `true` if the field list of this variant is `#[non_exhaustive]`
1347    /// and the type has been defined in another crate.
1348    #[inline]
1349    pub fn field_list_has_applicable_non_exhaustive(&self) -> bool {
1350        self.is_field_list_non_exhaustive() && !self.def_id.is_local()
1351    }
1352
1353    /// Computes the `Ident` of this variant by looking up the `Span`
1354    pub fn ident(&self, tcx: TyCtxt<'_>) -> Ident {
1355        Ident::new(self.name, tcx.def_ident_span(self.def_id).unwrap())
1356    }
1357
1358    /// Was this variant obtained as part of recovering from a syntactic error?
1359    #[inline]
1360    pub fn has_errors(&self) -> Result<(), ErrorGuaranteed> {
1361        self.tainted.map_or(Ok(()), Err)
1362    }
1363
1364    #[inline]
1365    pub fn ctor_kind(&self) -> Option<CtorKind> {
1366        self.ctor.map(|(kind, _)| kind)
1367    }
1368
1369    #[inline]
1370    pub fn ctor_def_id(&self) -> Option<DefId> {
1371        self.ctor.map(|(_, def_id)| def_id)
1372    }
1373
1374    /// Returns the one field in this variant.
1375    ///
1376    /// `panic!`s if there are no fields or multiple fields.
1377    #[inline]
1378    pub fn single_field(&self) -> &FieldDef {
1379        if !(self.fields.len() == 1) {
    ::core::panicking::panic("assertion failed: self.fields.len() == 1")
};assert!(self.fields.len() == 1);
1380
1381        &self.fields[FieldIdx::ZERO]
1382    }
1383
1384    /// Returns the last field in this variant, if present.
1385    #[inline]
1386    pub fn tail_opt(&self) -> Option<&FieldDef> {
1387        self.fields.raw.last()
1388    }
1389
1390    /// Returns the last field in this variant.
1391    ///
1392    /// # Panics
1393    ///
1394    /// Panics, if the variant has no fields.
1395    #[inline]
1396    pub fn tail(&self) -> &FieldDef {
1397        self.tail_opt().expect("expected unsized ADT to have a tail field")
1398    }
1399
1400    /// Returns whether this variant has unsafe fields.
1401    pub fn has_unsafe_fields(&self) -> bool {
1402        self.fields.iter().any(|x| x.safety.is_unsafe())
1403    }
1404}
1405
1406impl PartialEq for VariantDef {
1407    #[inline]
1408    fn eq(&self, other: &Self) -> bool {
1409        // There should be only one `VariantDef` for each `def_id`, therefore
1410        // it is fine to implement `PartialEq` only based on `def_id`.
1411        //
1412        // Below, we exhaustively destructure `self` and `other` so that if the
1413        // definition of `VariantDef` changes, a compile-error will be produced,
1414        // reminding us to revisit this assumption.
1415
1416        let Self {
1417            def_id: lhs_def_id,
1418            ctor: _,
1419            name: _,
1420            discr: _,
1421            fields: _,
1422            flags: _,
1423            tainted: _,
1424        } = &self;
1425        let Self {
1426            def_id: rhs_def_id,
1427            ctor: _,
1428            name: _,
1429            discr: _,
1430            fields: _,
1431            flags: _,
1432            tainted: _,
1433        } = other;
1434
1435        let res = lhs_def_id == rhs_def_id;
1436
1437        // Double check that implicit assumption detailed above.
1438        if truecfg!(debug_assertions) && res {
1439            let deep = self.ctor == other.ctor
1440                && self.name == other.name
1441                && self.discr == other.discr
1442                && self.fields == other.fields
1443                && self.flags == other.flags;
1444            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");
1445        }
1446
1447        res
1448    }
1449}
1450
1451impl Eq for VariantDef {}
1452
1453impl Hash for VariantDef {
1454    #[inline]
1455    fn hash<H: Hasher>(&self, s: &mut H) {
1456        // There should be only one `VariantDef` for each `def_id`, therefore
1457        // it is fine to implement `Hash` only based on `def_id`.
1458        //
1459        // Below, we exhaustively destructure `self` so that if the definition
1460        // of `VariantDef` changes, a compile-error will be produced, reminding
1461        // us to revisit this assumption.
1462
1463        let Self { def_id, ctor: _, name: _, discr: _, fields: _, flags: _, tainted: _ } = &self;
1464        def_id.hash(s)
1465    }
1466}
1467
1468#[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_hash::StableHash for VariantDiscr
            {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    VariantDiscr::Explicit(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    VariantDiscr::Relative(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
1469pub enum VariantDiscr {
1470    /// Explicit value for this variant, i.e., `X = 123`.
1471    /// The `DefId` corresponds to the embedded constant.
1472    Explicit(DefId),
1473
1474    /// The previous variant's discriminant plus one.
1475    /// For efficiency reasons, the distance from the
1476    /// last `Explicit` discriminant is being stored,
1477    /// or `0` for the first variant, if it has none.
1478    Relative(u32),
1479}
1480
1481#[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_hash::StableHash for FieldDef {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::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.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                        { __binding_3.stable_hash(__hcx, __hasher); }
                        { __binding_4.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, 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)]
1482pub struct FieldDef {
1483    pub did: DefId,
1484    pub name: Symbol,
1485    pub vis: Visibility<ModId>,
1486    pub safety: hir::Safety,
1487    pub value: Option<DefId>,
1488}
1489
1490impl PartialEq for FieldDef {
1491    #[inline]
1492    fn eq(&self, other: &Self) -> bool {
1493        // There should be only one `FieldDef` for each `did`, therefore it is
1494        // fine to implement `PartialEq` only based on `did`.
1495        //
1496        // Below, we exhaustively destructure `self` so that if the definition
1497        // of `FieldDef` changes, a compile-error will be produced, reminding
1498        // us to revisit this assumption.
1499
1500        let Self { did: lhs_did, name: _, vis: _, safety: _, value: _ } = &self;
1501
1502        let Self { did: rhs_did, name: _, vis: _, safety: _, value: _ } = other;
1503
1504        let res = lhs_did == rhs_did;
1505
1506        // Double check that implicit assumption detailed above.
1507        if truecfg!(debug_assertions) && res {
1508            let deep =
1509                self.name == other.name && self.vis == other.vis && self.safety == other.safety;
1510            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");
1511        }
1512
1513        res
1514    }
1515}
1516
1517impl Eq for FieldDef {}
1518
1519impl Hash for FieldDef {
1520    #[inline]
1521    fn hash<H: Hasher>(&self, s: &mut H) {
1522        // There should be only one `FieldDef` for each `did`, therefore it is
1523        // fine to implement `Hash` only based on `did`.
1524        //
1525        // Below, we exhaustively destructure `self` so that if the definition
1526        // of `FieldDef` changes, a compile-error will be produced, reminding
1527        // us to revisit this assumption.
1528
1529        let Self { did, name: _, vis: _, safety: _, value: _ } = &self;
1530
1531        did.hash(s)
1532    }
1533}
1534
1535impl<'tcx> FieldDef {
1536    /// Returns the type of this field. The `args` are typically obtained via
1537    /// the second field of [`TyKind::Adt`].
1538    pub fn ty(
1539        &self,
1540        tcx: TyCtxt<'tcx>,
1541        args: GenericArgsRef<'tcx>,
1542    ) -> Unnormalized<'tcx, Ty<'tcx>> {
1543        tcx.type_of(self.did).instantiate(tcx, args)
1544    }
1545
1546    /// Computes the `Ident` of this variant by looking up the `Span`
1547    pub fn ident(&self, tcx: TyCtxt<'_>) -> Ident {
1548        Ident::new(self.name, tcx.def_ident_span(self.did).unwrap())
1549    }
1550}
1551
1552#[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)]
1553pub enum ImplOverlapKind {
1554    /// These impls are always allowed to overlap.
1555    Permitted {
1556        /// Whether or not the impl is permitted due to the trait being a `#[marker]` trait
1557        marker: bool,
1558    },
1559}
1560
1561/// Useful source information about where a desugared associated type for an
1562/// RPITIT originated from.
1563#[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_hash::StableHash for
            ImplTraitInTraitData {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    ImplTraitInTraitData::Trait {
                        fn_def_id: ref __binding_0, opaque_def_id: ref __binding_1 }
                        => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    ImplTraitInTraitData::Impl { fn_def_id: ref __binding_0 } =>
                        {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
1564pub enum ImplTraitInTraitData {
1565    Trait { fn_def_id: DefId, opaque_def_id: DefId },
1566    Impl { fn_def_id: DefId },
1567}
1568
1569impl<'tcx> TyCtxt<'tcx> {
1570    pub fn typeck_body(self, body: hir::BodyId) -> &'tcx TypeckResults<'tcx> {
1571        self.typeck(self.hir_body_owner_def_id(body))
1572    }
1573
1574    pub fn provided_trait_methods(self, id: DefId) -> impl 'tcx + Iterator<Item = &'tcx AssocItem> {
1575        self.associated_items(id)
1576            .in_definition_order()
1577            .filter(move |item| item.is_fn() && item.defaultness(self).has_value())
1578    }
1579
1580    pub fn repr_options_of_def(self, did: LocalDefId) -> ReprOptions {
1581        let mut flags = ReprFlags::empty();
1582        let mut size = None;
1583        let mut max_align: Option<Align> = None;
1584        let mut min_pack: Option<Align> = None;
1585
1586        // Generate a deterministically-derived seed from the item's path hash
1587        // to allow for cross-crate compilation to actually work
1588        let mut field_shuffle_seed = self.def_path_hash(did.to_def_id()).0.to_smaller_hash();
1589
1590        // If the user defined a custom seed for layout randomization, xor the item's
1591        // path hash with the user defined seed, this will allowing determinism while
1592        // still allowing users to further randomize layout generation for e.g. fuzzing
1593        if let Some(user_seed) = self.sess.opts.unstable_opts.layout_seed {
1594            field_shuffle_seed ^= user_seed;
1595        }
1596
1597        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
1598        )
1599        .map(|elt| match elt {
1600            Some(n) => ScalableElt::ElementCount(*n),
1601            None => ScalableElt::Container,
1602        });
1603        if elt.is_some() {
1604            flags.insert(ReprFlags::IS_SCALABLE);
1605        }
1606        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) {
1607            for (r, _) in reprs {
1608                flags.insert(match *r {
1609                    attr::ReprRust => ReprFlags::empty(),
1610                    attr::ReprC => ReprFlags::IS_C,
1611                    attr::ReprPacked(pack) => {
1612                        min_pack = Some(if let Some(min_pack) = min_pack {
1613                            min_pack.min(pack)
1614                        } else {
1615                            pack
1616                        });
1617                        ReprFlags::empty()
1618                    }
1619                    attr::ReprTransparent => ReprFlags::IS_TRANSPARENT,
1620                    attr::ReprSimd => ReprFlags::IS_SIMD,
1621                    attr::ReprInt(i) => {
1622                        size = Some(match i {
1623                            attr::IntType::SignedInt(x) => match x {
1624                                ast::IntTy::Isize => IntegerType::Pointer(true),
1625                                ast::IntTy::I8 => IntegerType::Fixed(Integer::I8, true),
1626                                ast::IntTy::I16 => IntegerType::Fixed(Integer::I16, true),
1627                                ast::IntTy::I32 => IntegerType::Fixed(Integer::I32, true),
1628                                ast::IntTy::I64 => IntegerType::Fixed(Integer::I64, true),
1629                                ast::IntTy::I128 => IntegerType::Fixed(Integer::I128, true),
1630                            },
1631                            attr::IntType::UnsignedInt(x) => match x {
1632                                ast::UintTy::Usize => IntegerType::Pointer(false),
1633                                ast::UintTy::U8 => IntegerType::Fixed(Integer::I8, false),
1634                                ast::UintTy::U16 => IntegerType::Fixed(Integer::I16, false),
1635                                ast::UintTy::U32 => IntegerType::Fixed(Integer::I32, false),
1636                                ast::UintTy::U64 => IntegerType::Fixed(Integer::I64, false),
1637                                ast::UintTy::U128 => IntegerType::Fixed(Integer::I128, false),
1638                            },
1639                        });
1640                        ReprFlags::empty()
1641                    }
1642                    attr::ReprAlign(align) => {
1643                        max_align = max_align.max(Some(align));
1644                        ReprFlags::empty()
1645                    }
1646                });
1647            }
1648        }
1649
1650        // If `-Z randomize-layout` was enabled for the type definition then we can
1651        // consider performing layout randomization
1652        if self.sess.opts.unstable_opts.randomize_layout {
1653            flags.insert(ReprFlags::RANDOMIZE_LAYOUT);
1654        }
1655
1656        // box is special, on the one hand the compiler assumes an ordered layout, with the pointer
1657        // always at offset zero. On the other hand we want scalar abi optimizations.
1658        let is_box = self.is_lang_item(did.to_def_id(), LangItem::OwnedBox);
1659
1660        // This is here instead of layout because the choice must make it into metadata.
1661        if is_box {
1662            flags.insert(ReprFlags::IS_LINEAR);
1663        }
1664
1665        // See `TyAndLayout::pass_indirectly_in_non_rustic_abis` for details.
1666        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(..)) {
1667            flags.insert(ReprFlags::PASS_INDIRECTLY_IN_NON_RUSTIC_ABIS);
1668        }
1669
1670        ReprOptions {
1671            int: size,
1672            align: max_align,
1673            pack: min_pack,
1674            flags,
1675            field_shuffle_seed,
1676            scalable: elt,
1677        }
1678    }
1679
1680    /// Look up the name of a definition across crates. This does not look at HIR.
1681    pub fn opt_item_name(self, def_id: impl IntoQueryKey<DefId>) -> Option<Symbol> {
1682        let def_id = def_id.into_query_key();
1683        if let Some(cnum) = def_id.as_crate_root() {
1684            Some(self.crate_name(cnum))
1685        } else {
1686            let def_key = self.def_key(def_id);
1687            match def_key.disambiguated_data.data {
1688                // The name of a constructor is that of its parent.
1689                rustc_hir::definitions::DefPathData::Ctor => self
1690                    .opt_item_name(DefId { krate: def_id.krate, index: def_key.parent.unwrap() }),
1691                _ => def_key.get_opt_name(),
1692            }
1693        }
1694    }
1695
1696    /// Look up the name of a definition across crates. This does not look at HIR.
1697    ///
1698    /// This method will ICE if the corresponding item does not have a name. In these cases, use
1699    /// [`opt_item_name`] instead.
1700    ///
1701    /// [`opt_item_name`]: Self::opt_item_name
1702    pub fn item_name(self, id: impl IntoQueryKey<DefId>) -> Symbol {
1703        let id = id.into_query_key();
1704        self.opt_item_name(id).unwrap_or_else(|| {
1705            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));
1706        })
1707    }
1708
1709    /// Look up the name and span of a definition.
1710    ///
1711    /// See [`item_name`][Self::item_name] for more information.
1712    pub fn opt_item_ident(self, def_id: impl IntoQueryKey<DefId>) -> Option<Ident> {
1713        let def_id = def_id.into_query_key();
1714        let def = self.opt_item_name(def_id)?;
1715        let span = self
1716            .def_ident_span(def_id)
1717            .unwrap_or_else(|| crate::util::bug::bug_fmt(format_args!("missing ident span for {0:?}",
        def_id))bug!("missing ident span for {def_id:?}"));
1718        Some(Ident::new(def, span))
1719    }
1720
1721    /// Look up the name and span of a definition.
1722    ///
1723    /// See [`item_name`][Self::item_name] for more information.
1724    pub fn item_ident(self, def_id: impl IntoQueryKey<DefId>) -> Ident {
1725        let def_id = def_id.into_query_key();
1726        self.opt_item_ident(def_id).unwrap_or_else(|| {
1727            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));
1728        })
1729    }
1730
1731    pub fn opt_associated_item(self, def_id: DefId) -> Option<AssocItem> {
1732        if let DefKind::AssocConst { .. } | DefKind::AssocFn | DefKind::AssocTy =
1733            self.def_kind(def_id)
1734        {
1735            Some(self.associated_item(def_id))
1736        } else {
1737            None
1738        }
1739    }
1740
1741    /// If the `def_id` is an associated type that was desugared from a
1742    /// return-position `impl Trait` from a trait, then provide the source info
1743    /// about where that RPITIT came from.
1744    pub fn opt_rpitit_info(self, def_id: DefId) -> Option<ImplTraitInTraitData> {
1745        if let DefKind::AssocTy = self.def_kind(def_id)
1746            && let AssocKind::Type { data: AssocTypeData::Rpitit(rpitit_info) } =
1747                self.associated_item(def_id).kind
1748        {
1749            Some(rpitit_info)
1750        } else {
1751            None
1752        }
1753    }
1754
1755    pub fn find_field_index(self, ident: Ident, variant: &VariantDef) -> Option<FieldIdx> {
1756        variant.fields.iter_enumerated().find_map(|(i, field)| {
1757            self.hygienic_eq(ident, field.ident(self), variant.def_id).then_some(i)
1758        })
1759    }
1760
1761    /// Returns `Some` if the impls are the same polarity and the trait either
1762    /// has no items or is annotated `#[marker]` and prevents item overrides.
1763    x;#[instrument(level = "debug", skip(self), ret)]
1764    pub fn impls_are_allowed_to_overlap(
1765        self,
1766        def_id1: DefId,
1767        def_id2: DefId,
1768    ) -> Option<ImplOverlapKind> {
1769        let impl1 = self.impl_trait_header(def_id1);
1770        let impl2 = self.impl_trait_header(def_id2);
1771
1772        let trait_ref1 = impl1.trait_ref.skip_binder();
1773        let trait_ref2 = impl2.trait_ref.skip_binder();
1774
1775        // If either trait impl references an error, they're allowed to overlap,
1776        // as one of them essentially doesn't exist.
1777        if trait_ref1.references_error() || trait_ref2.references_error() {
1778            return Some(ImplOverlapKind::Permitted { marker: false });
1779        }
1780
1781        match (impl1.polarity, impl2.polarity) {
1782            (ImplPolarity::Reservation, _) | (_, ImplPolarity::Reservation) => {
1783                // `#[rustc_reservation_impl]` impls don't overlap with anything
1784                return Some(ImplOverlapKind::Permitted { marker: false });
1785            }
1786            (ImplPolarity::Positive, ImplPolarity::Negative)
1787            | (ImplPolarity::Negative, ImplPolarity::Positive) => {
1788                // `impl AutoTrait for Type` + `impl !AutoTrait for Type`
1789                return None;
1790            }
1791            (ImplPolarity::Positive, ImplPolarity::Positive)
1792            | (ImplPolarity::Negative, ImplPolarity::Negative) => {}
1793        };
1794
1795        let is_marker_impl = |trait_ref: TraitRef<'_>| self.trait_def(trait_ref.def_id).is_marker;
1796        let is_marker_overlap = is_marker_impl(trait_ref1) && is_marker_impl(trait_ref2);
1797
1798        if is_marker_overlap {
1799            return Some(ImplOverlapKind::Permitted { marker: true });
1800        }
1801
1802        None
1803    }
1804
1805    /// Returns `ty::VariantDef` if `res` refers to a struct,
1806    /// or variant or their constructors, panics otherwise.
1807    pub fn expect_variant_res(self, res: Res) -> &'tcx VariantDef {
1808        match res {
1809            Res::Def(DefKind::Variant, did) => {
1810                let enum_did = self.parent(did);
1811                self.adt_def(enum_did).variant_with_id(did)
1812            }
1813            Res::Def(DefKind::Struct | DefKind::Union, did) => self.adt_def(did).non_enum_variant(),
1814            Res::Def(DefKind::Ctor(CtorOf::Variant, ..), variant_ctor_did) => {
1815                let variant_did = self.parent(variant_ctor_did);
1816                let enum_did = self.parent(variant_did);
1817                self.adt_def(enum_did).variant_with_ctor_id(variant_ctor_did)
1818            }
1819            Res::Def(DefKind::Ctor(CtorOf::Struct, ..), ctor_did) => {
1820                let struct_did = self.parent(ctor_did);
1821                self.adt_def(struct_did).non_enum_variant()
1822            }
1823            _ => 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),
1824        }
1825    }
1826
1827    /// Returns the possibly-auto-generated MIR of a [`ty::InstanceKind`].
1828    #[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(1828u32),
                                    ::tracing_core::__macro_support::Option::Some("rustc_middle::ty"),
                                    ::tracing_core::field::FieldSet::new(&[{
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("instance")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("instance");
                                                        NAME.as_str()
                                                    }], ::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};
                                meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&instance)
                                                            as &dyn ::tracing::field::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;
        }
        {
            let body =
                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:1832",
                                                "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(1832u32),
                                                ::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};
                                        __CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("calling def_kind on def: {0:?}",
                                                                            def) as &dyn ::tracing::field::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:1834",
                                                "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(1834u32),
                                                ::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};
                                        __CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("returned from def_kind: {0:?}",
                                                                            def_kind) as &dyn ::tracing::field::Value))])
                                    });
                            } else { ; }
                        };
                        match def_kind {
                            DefKind::Const { .. } | DefKind::Static { .. } |
                                DefKind::AssocConst { .. } | DefKind::Ctor(..) |
                                DefKind::AnonConst => self.mir_for_ctfe(def),
                            DefKind::Fn | DefKind::AssocFn if
                                #[allow(non_exhaustive_omitted_patterns)] match self.constness(def)
                                    {
                                    hir::Constness::Const { always: true } => true,
                                    _ => false,
                                } => {
                                self.mir_for_ctfe(def)
                            }
                            _ => self.optimized_mir(def),
                        }
                    }
                    ty::InstanceKind::Intrinsic(..) |
                        ty::InstanceKind::LlvmIntrinsic(..) => {
                        crate::util::bug::bug_fmt(format_args!("intrinsics have no instance MIR"))
                    }
                    ty::InstanceKind::Virtual(..) =>
                        crate::util::bug::bug_fmt(format_args!("virtual dispatches have no instance MIR")),
                    ty::InstanceKind::Shim(shim) => self.mir_shims(shim),
                };
            if !#[allow(non_exhaustive_omitted_patterns)] match body.phase {
                        MirPhase::Runtime(_) => true,
                        _ => false,
                    } {
                {
                    ::core::panicking::panic_fmt(format_args!("body: {1:?} instance: {2:?} {0:?}",
                            if let ty::InstanceKind::Item(d) = instance {
                                Some(self.def_kind(d))
                            } else { None }, body, instance));
                }
            };
            body
        }
    }
}#[instrument(skip(self), level = "debug")]
1829    pub fn instance_mir(self, instance: ty::InstanceKind<'tcx>) -> &'tcx Body<'tcx> {
1830        let body = match instance {
1831            ty::InstanceKind::Item(def) => {
1832                debug!("calling def_kind on def: {:?}", def);
1833                let def_kind = self.def_kind(def);
1834                debug!("returned from def_kind: {:?}", def_kind);
1835                match def_kind {
1836                    DefKind::Const { .. }
1837                    | DefKind::Static { .. }
1838                    | DefKind::AssocConst { .. }
1839                    | DefKind::Ctor(..)
1840                    | DefKind::AnonConst => self.mir_for_ctfe(def),
1841                    DefKind::Fn | DefKind::AssocFn
1842                        if matches!(
1843                            self.constness(def),
1844                            hir::Constness::Const { always: true }
1845                        ) =>
1846                    {
1847                        self.mir_for_ctfe(def)
1848                    }
1849                    // If the caller wants `mir_for_ctfe` of a function they should not be using
1850                    // `instance_mir`, so we'll assume const fn also wants the optimized version.
1851                    _ => self.optimized_mir(def),
1852                }
1853            }
1854            ty::InstanceKind::Intrinsic(..) | ty::InstanceKind::LlvmIntrinsic(..) => {
1855                bug!("intrinsics have no instance MIR")
1856            }
1857            ty::InstanceKind::Virtual(..) => bug!("virtual dispatches have no instance MIR"),
1858            ty::InstanceKind::Shim(shim) => self.mir_shims(shim),
1859        };
1860
1861        assert!(
1862            matches!(body.phase, MirPhase::Runtime(_)),
1863            "body: {body:?} instance: {instance:?} {:?}",
1864            if let ty::InstanceKind::Item(d) = instance { Some(self.def_kind(d)) } else { None },
1865        );
1866
1867        body
1868    }
1869
1870    /// Gets all attributes with the given name.
1871    #[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."]
1872    pub fn get_attrs(
1873        self,
1874        did: impl Into<DefId>,
1875        attr: Symbol,
1876    ) -> impl Iterator<Item = &'tcx hir::Attribute> {
1877        #[allow(deprecated)]
1878        self.get_all_attrs(did).iter().filter(move |a: &&hir::Attribute| a.has_name(attr))
1879    }
1880
1881    /// Gets all attributes.
1882    ///
1883    /// To see if an item has a specific attribute, you should use
1884    /// [`rustc_hir::find_attr!`] so you can use matching.
1885    #[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."]
1886    pub fn get_all_attrs(self, did: impl Into<DefId>) -> &'tcx [hir::Attribute] {
1887        let did: DefId = did.into();
1888        if let Some(did) = did.as_local() {
1889            self.hir_attrs(self.local_def_id_to_hir_id(did))
1890        } else {
1891            self.attrs_for_def(did)
1892        }
1893    }
1894
1895    pub fn get_attrs_by_path(
1896        self,
1897        did: DefId,
1898        attr: &[Symbol],
1899    ) -> impl Iterator<Item = &'tcx hir::Attribute> {
1900        let filter_fn = move |a: &&hir::Attribute| a.path_matches(attr);
1901        if let Some(did) = did.as_local() {
1902            self.hir_attrs(self.local_def_id_to_hir_id(did)).iter().filter(filter_fn)
1903        } else {
1904            self.attrs_for_def(did).iter().filter(filter_fn)
1905        }
1906    }
1907
1908    /// Returns `true` if this is an `auto trait`.
1909    pub fn trait_is_auto(self, trait_def_id: DefId) -> bool {
1910        self.trait_def(trait_def_id).has_auto_impl
1911    }
1912
1913    /// Returns `true` if this is coinductive, either because it is
1914    /// an auto trait or because it has the `#[rustc_coinductive]` attribute.
1915    pub fn trait_is_coinductive(self, trait_def_id: DefId) -> bool {
1916        self.trait_def(trait_def_id).is_coinductive
1917    }
1918
1919    /// Returns `true` if this is a trait alias.
1920    pub fn trait_is_alias(self, trait_def_id: DefId) -> bool {
1921        self.def_kind(trait_def_id) == DefKind::TraitAlias
1922    }
1923
1924    /// Arena-alloc of LayoutError for coroutine layout
1925    fn layout_error(self, err: LayoutError<'tcx>) -> &'tcx LayoutError<'tcx> {
1926        self.arena.alloc(err)
1927    }
1928
1929    /// Returns layout of a non-async-drop coroutine. Layout might be unavailable if the
1930    /// coroutine is tainted by errors.
1931    ///
1932    /// Takes `coroutine_kind` which can be acquired from the `CoroutineArgs::kind_ty`,
1933    /// e.g. `args.as_coroutine().kind_ty()`.
1934    fn ordinary_coroutine_layout(
1935        self,
1936        def_id: DefId,
1937        args: GenericArgsRef<'tcx>,
1938    ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1939        let coroutine_kind_ty = args.as_coroutine().kind_ty();
1940        let mir = self.optimized_mir(def_id);
1941        let ty = || Ty::new_coroutine(self, def_id, args);
1942        // Regular coroutine
1943        if coroutine_kind_ty.is_unit() {
1944            mir.coroutine_layout_raw().ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1945        } else {
1946            // If we have a `Coroutine` that comes from an coroutine-closure,
1947            // then it may be a by-move or by-ref body.
1948            let ty::Coroutine(_, identity_args) =
1949                *self.type_of(def_id).instantiate_identity().skip_norm_wip().kind()
1950            else {
1951                ::core::panicking::panic("internal error: entered unreachable code");unreachable!();
1952            };
1953            let identity_kind_ty = identity_args.as_coroutine().kind_ty();
1954            // If the types differ, then we must be getting the by-move body of
1955            // a by-ref coroutine.
1956            if identity_kind_ty == coroutine_kind_ty {
1957                mir.coroutine_layout_raw()
1958                    .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1959            } else {
1960                {
    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));
1961                {
    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!(
1962                    identity_kind_ty.to_opt_closure_kind(),
1963                    Some(ClosureKind::Fn | ClosureKind::FnMut)
1964                );
1965                self.optimized_mir(self.coroutine_by_move_body_def_id(def_id))
1966                    .coroutine_layout_raw()
1967                    .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1968            }
1969        }
1970    }
1971
1972    /// Returns layout of a `async_drop_in_place::{closure}` coroutine
1973    ///   (returned from `async fn async_drop_in_place<T>(..)`).
1974    /// Layout might be unavailable if the coroutine is tainted by errors.
1975    fn async_drop_coroutine_layout(
1976        self,
1977        def_id: DefId,
1978        args: GenericArgsRef<'tcx>,
1979    ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1980        let ty = || Ty::new_coroutine(self, def_id, args);
1981        if args[0].has_placeholders() || args[0].has_non_region_param() {
1982            return Err(self.layout_error(LayoutError::TooGeneric(ty())));
1983        }
1984        let instance = ShimKind::AsyncDropGlue(def_id, Ty::new_coroutine(self, def_id, args));
1985        self.mir_shims(instance)
1986            .coroutine_layout_raw()
1987            .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1988    }
1989
1990    /// Returns layout of a coroutine. Layout might be unavailable if the
1991    /// coroutine is tainted by errors.
1992    pub fn coroutine_layout(
1993        self,
1994        def_id: DefId,
1995        args: GenericArgsRef<'tcx>,
1996    ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1997        if self.is_async_drop_in_place_coroutine(def_id) {
1998            // layout of `async_drop_in_place<T>::{closure}` in case,
1999            // when T is a coroutine, contains this internal coroutine's ptr in upvars
2000            // and doesn't require any locals. Here is an `empty coroutine's layout`
2001            let arg_cor_ty = args.first().unwrap().expect_ty();
2002            if arg_cor_ty.is_coroutine() {
2003                let span = self.def_span(def_id);
2004                let source_info = SourceInfo::outermost(span);
2005                // Even minimal, empty coroutine has 3 states (RESERVED_VARIANTS),
2006                // so variant_fields and variant_source_info should have 3 elements.
2007                let variant_fields: IndexVec<VariantIdx, IndexVec<FieldIdx, CoroutineSavedLocal>> =
2008                    iter::repeat(IndexVec::new()).take(CoroutineArgs::RESERVED_VARIANTS).collect();
2009                let variant_source_info: IndexVec<VariantIdx, SourceInfo> =
2010                    iter::repeat(source_info).take(CoroutineArgs::RESERVED_VARIANTS).collect();
2011                let proxy_layout = CoroutineLayout {
2012                    field_tys: [].into(),
2013                    variant_fields,
2014                    variant_source_info,
2015                    storage_conflicts: BitMatrix::new(0, 0),
2016                };
2017                return Ok(self.arena.alloc(proxy_layout));
2018            } else {
2019                self.async_drop_coroutine_layout(def_id, args)
2020            }
2021        } else {
2022            self.ordinary_coroutine_layout(def_id, args)
2023        }
2024    }
2025
2026    /// If the given `DefId` is an associated item, returns the `DefId` and `DefKind` of the parent trait or impl.
2027    pub fn assoc_parent(self, def_id: DefId) -> Option<(DefId, DefKind)> {
2028        if !self.def_kind(def_id).is_assoc() {
2029            return None;
2030        }
2031        let parent = self.parent(def_id);
2032        let def_kind = self.def_kind(parent);
2033        Some((parent, def_kind))
2034    }
2035
2036    /// Returns the trait item that is implemented by the given item `DefId`.
2037    pub fn trait_item_of(self, def_id: impl IntoQueryKey<DefId>) -> Option<DefId> {
2038        let def_id = def_id.into_query_key();
2039        self.opt_associated_item(def_id)?.trait_item_def_id()
2040    }
2041
2042    /// If the given `DefId` is an associated item of a trait,
2043    /// returns the `DefId` of the trait; otherwise, returns `None`.
2044    pub fn trait_of_assoc(self, def_id: DefId) -> Option<DefId> {
2045        match self.assoc_parent(def_id) {
2046            Some((id, DefKind::Trait)) => Some(id),
2047            _ => None,
2048        }
2049    }
2050
2051    pub fn impl_is_of_trait(self, def_id: impl IntoQueryKey<DefId>) -> bool {
2052        let def_id = def_id.into_query_key();
2053        let DefKind::Impl { of_trait } = self.def_kind(def_id) else {
2054            {
    ::core::panicking::panic_fmt(format_args!("expected Impl for {0:?}",
            def_id));
};panic!("expected Impl for {def_id:?}");
2055        };
2056        of_trait
2057    }
2058
2059    /// If the given `DefId` is an associated item of an impl,
2060    /// returns the `DefId` of the impl; otherwise returns `None`.
2061    pub fn impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
2062        match self.assoc_parent(def_id) {
2063            Some((id, DefKind::Impl { .. })) => Some(id),
2064            _ => None,
2065        }
2066    }
2067
2068    /// If the given `DefId` is an associated item of an inherent impl,
2069    /// returns the `DefId` of the impl; otherwise, returns `None`.
2070    pub fn inherent_impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
2071        match self.assoc_parent(def_id) {
2072            Some((id, DefKind::Impl { of_trait: false })) => Some(id),
2073            _ => None,
2074        }
2075    }
2076
2077    /// If the given `DefId` is an associated item of a trait impl,
2078    /// returns the `DefId` of the impl; otherwise, returns `None`.
2079    pub fn trait_impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
2080        match self.assoc_parent(def_id) {
2081            Some((id, DefKind::Impl { of_trait: true })) => Some(id),
2082            _ => None,
2083        }
2084    }
2085
2086    pub fn impl_polarity(self, def_id: impl IntoQueryKey<DefId>) -> ty::ImplPolarity {
2087        let def_id = def_id.into_query_key();
2088        self.impl_trait_header(def_id).polarity
2089    }
2090
2091    /// Given an `impl_id`, return the trait it implements.
2092    pub fn impl_trait_ref(
2093        self,
2094        def_id: impl IntoQueryKey<DefId>,
2095    ) -> ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>> {
2096        let def_id = def_id.into_query_key();
2097        self.impl_trait_header(def_id).trait_ref
2098    }
2099
2100    /// Given an `impl_id`, return the trait it implements.
2101    /// Returns `None` if it is an inherent impl.
2102    pub fn impl_opt_trait_ref(
2103        self,
2104        def_id: impl IntoQueryKey<DefId>,
2105    ) -> Option<ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>>> {
2106        let def_id = def_id.into_query_key();
2107        self.impl_is_of_trait(def_id).then(|| self.impl_trait_ref(def_id))
2108    }
2109
2110    /// Given the `DefId` of an impl, returns the `DefId` of the trait it implements.
2111    pub fn impl_trait_id(self, def_id: impl IntoQueryKey<DefId>) -> DefId {
2112        let def_id = def_id.into_query_key();
2113        self.impl_trait_ref(def_id).skip_binder().def_id
2114    }
2115
2116    /// Given the `DefId` of an impl, returns the `DefId` of the trait it implements.
2117    /// Returns `None` if it is an inherent impl.
2118    pub fn impl_opt_trait_id(self, def_id: impl IntoQueryKey<DefId>) -> Option<DefId> {
2119        let def_id = def_id.into_query_key();
2120        self.impl_is_of_trait(def_id).then(|| self.impl_trait_id(def_id))
2121    }
2122
2123    pub fn is_exportable(self, def_id: DefId) -> bool {
2124        self.exportable_items(def_id.krate).contains(&def_id)
2125    }
2126
2127    /// Check if the given `DefId` is `#\[automatically_derived\]`, *and*
2128    /// whether it was produced by expanding a builtin derive macro.
2129    pub fn is_builtin_derived(self, def_id: DefId) -> bool {
2130        if self.is_automatically_derived(def_id)
2131            && let Some(def_id) = def_id.as_local()
2132            && let outer = self.def_span(def_id).ctxt().outer_expn_data()
2133            && #[allow(non_exhaustive_omitted_patterns)] match outer.kind {
    ExpnKind::Macro(MacroKind::Derive, _) => true,
    _ => false,
}matches!(outer.kind, ExpnKind::Macro(MacroKind::Derive, _))
2134            && {
        {
            '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 { .. })
2135        {
2136            true
2137        } else {
2138            false
2139        }
2140    }
2141
2142    /// Check if the given `DefId` is `#\[automatically_derived\]`.
2143    pub fn is_automatically_derived(self, def_id: DefId) -> bool {
2144        {
        {
            '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)
2145    }
2146
2147    /// Looks up the span of `impl_did` if the impl is local; otherwise returns `Err`
2148    /// with the name of the crate containing the impl.
2149    pub fn span_of_impl(self, impl_def_id: DefId) -> Result<Span, Symbol> {
2150        if let Some(impl_def_id) = impl_def_id.as_local() {
2151            Ok(self.def_span(impl_def_id))
2152        } else {
2153            Err(self.crate_name(impl_def_id.krate))
2154        }
2155    }
2156
2157    /// Hygienically compares a use-site name (`use_name`) for a field or an associated item with
2158    /// its supposed definition name (`def_name`). The method also needs `DefId` of the supposed
2159    /// definition's parent/scope to perform comparison.
2160    pub fn hygienic_eq(self, use_ident: Ident, def_ident: Ident, def_parent_def_id: DefId) -> bool {
2161        // We could use `Ident::eq` here, but we deliberately don't. The identifier
2162        // comparison fails frequently, and we want to avoid the expensive
2163        // `normalize_to_macros_2_0()` calls required for the span comparison whenever possible.
2164        use_ident.name == def_ident.name
2165            && use_ident
2166                .span
2167                .ctxt()
2168                .hygienic_eq(def_ident.span.ctxt(), self.expn_that_defined(def_parent_def_id))
2169    }
2170
2171    pub fn adjust_ident(self, mut ident: Ident, scope: DefId) -> Ident {
2172        ident.span.normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope));
2173        ident
2174    }
2175
2176    pub fn adjust_ident_and_get_scope(
2177        self,
2178        mut ident: Ident,
2179        scope: DefId,
2180        item_id: LocalDefId,
2181    ) -> (Ident, ModId) {
2182        let scope = ident
2183            .span
2184            .normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope))
2185            .and_then(|actual_expansion| actual_expansion.expn_data().parent_module)
2186            .unwrap_or_else(|| self.parent_module_from_def_id(item_id).to_mod_id());
2187        (ident, scope)
2188    }
2189
2190    /// Checks whether this is a `const fn`. Returns `false` for non-functions.
2191    ///
2192    /// Even if this returns `true`, constness may still be unstable!
2193    #[inline]
2194    pub fn is_const_fn(self, def_id: impl IntoQueryKey<DefId>) -> bool {
2195        let def_id = def_id.into_query_key();
2196        #[allow(non_exhaustive_omitted_patterns)] match self.def_kind(def_id) {
    DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(_, CtorKind::Fn) |
        DefKind::Closure => true,
    _ => false,
}matches!(
2197            self.def_kind(def_id),
2198            DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(_, CtorKind::Fn) | DefKind::Closure
2199        ) && #[allow(non_exhaustive_omitted_patterns)] match self.constness(def_id) {
    hir::Constness::Const { .. } => true,
    _ => false,
}matches!(self.constness(def_id), hir::Constness::Const { .. })
2200    }
2201
2202    /// Whether this item is conditionally constant for the purposes of the
2203    /// effects implementation.
2204    ///
2205    /// This roughly corresponds to all const functions and other callable
2206    /// items, along with const impls and traits, and associated types within
2207    /// those impls and traits.
2208    pub fn is_conditionally_const(self, def_id: impl Into<DefId>) -> bool {
2209        let def_id: DefId = def_id.into();
2210        match self.def_kind(def_id) {
2211            DefKind::Impl { of_trait: true } => {
2212                let header = self.impl_trait_header(def_id);
2213                #[allow(non_exhaustive_omitted_patterns)] match header.constness {
    hir::Constness::Const { always: false } => true,
    _ => false,
}matches!(header.constness, hir::Constness::Const { always: false })
2214                    && self.is_const_trait(header.trait_ref.skip_binder().def_id)
2215            }
2216            DefKind::Impl { of_trait: false } => {
2217                #[allow(non_exhaustive_omitted_patterns)] match self.constness(def_id) {
    hir::Constness::Const { always: false } => true,
    _ => false,
}matches!(self.constness(def_id), hir::Constness::Const { always: false })
2218            }
2219            DefKind::Fn | DefKind::Ctor(_, CtorKind::Fn) => {
2220                #[allow(non_exhaustive_omitted_patterns)] match self.constness(def_id) {
    hir::Constness::Const { always: false } => true,
    _ => false,
}matches!(self.constness(def_id), hir::Constness::Const { always: false })
2221            }
2222            DefKind::TraitAlias | DefKind::Trait => self.is_const_trait(def_id),
2223            DefKind::AssocTy => {
2224                let parent_def_id = self.parent(def_id);
2225                match self.def_kind(parent_def_id) {
2226                    DefKind::Impl { of_trait: false } => false,
2227                    DefKind::Impl { of_trait: true } | DefKind::Trait => {
2228                        self.is_conditionally_const(parent_def_id)
2229                    }
2230                    _ => 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:?}"),
2231                }
2232            }
2233            DefKind::AssocFn => {
2234                let parent_def_id = self.parent(def_id);
2235                match self.def_kind(parent_def_id) {
2236                    DefKind::Impl { of_trait: false } => {
2237                        #[allow(non_exhaustive_omitted_patterns)] match self.constness(def_id) {
    hir::Constness::Const { always: false } => true,
    _ => false,
}matches!(self.constness(def_id), hir::Constness::Const { always: false })
2238                    }
2239                    DefKind::Impl { of_trait: true } => {
2240                        let Some(trait_method_did) = self.trait_item_of(def_id) else {
2241                            return false;
2242                        };
2243                        #[allow(non_exhaustive_omitted_patterns)] match self.constness(trait_method_did)
    {
    hir::Constness::Const { always: false } => true,
    _ => false,
}matches!(
2244                            self.constness(trait_method_did),
2245                            hir::Constness::Const { always: false }
2246                        ) && self.is_conditionally_const(parent_def_id)
2247                    }
2248                    DefKind::Trait => {
2249                        #[allow(non_exhaustive_omitted_patterns)] match self.constness(def_id) {
    hir::Constness::Const { always: false } => true,
    _ => false,
}matches!(self.constness(def_id), hir::Constness::Const { always: false })
2250                            && self.is_conditionally_const(parent_def_id)
2251                    }
2252                    _ => 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:?}"),
2253                }
2254            }
2255            DefKind::OpaqueTy => match self.opaque_ty_origin(def_id) {
2256                hir::OpaqueTyOrigin::FnReturn { parent, .. } => self.is_conditionally_const(parent),
2257                hir::OpaqueTyOrigin::AsyncFn { .. } => false,
2258                // FIXME(const_trait_impl): ATPITs could be conditionally const?
2259                hir::OpaqueTyOrigin::TyAlias { .. } => false,
2260            },
2261            DefKind::Closure => {
2262                #[allow(non_exhaustive_omitted_patterns)] match self.constness(def_id) {
    hir::Constness::Const { always: false } => true,
    _ => false,
}matches!(self.constness(def_id), hir::Constness::Const { always: false })
2263            }
2264            DefKind::Ctor(_, CtorKind::Const)
2265            | DefKind::Mod
2266            | DefKind::Struct
2267            | DefKind::Union
2268            | DefKind::Enum
2269            | DefKind::Variant
2270            | DefKind::TyAlias
2271            | DefKind::ForeignTy
2272            | DefKind::TyParam
2273            | DefKind::Const { .. }
2274            | DefKind::ConstParam
2275            | DefKind::Static { .. }
2276            | DefKind::AssocConst { .. }
2277            | DefKind::Macro(_)
2278            | DefKind::ExternCrate
2279            | DefKind::Use
2280            | DefKind::ForeignMod
2281            | DefKind::AnonConst
2282            | DefKind::Field
2283            | DefKind::LifetimeParam
2284            | DefKind::GlobalAsm
2285            | DefKind::SyntheticCoroutineBody => false,
2286        }
2287    }
2288
2289    #[inline]
2290    pub fn is_const_trait(self, def_id: DefId) -> bool {
2291        #[allow(non_exhaustive_omitted_patterns)] match self.trait_def(def_id).constness
    {
    hir::Constness::Const { .. } => true,
    _ => false,
}matches!(self.trait_def(def_id).constness, hir::Constness::Const { .. })
2292    }
2293
2294    pub fn impl_method_has_trait_impl_trait_tys(self, def_id: DefId) -> bool {
2295        if self.def_kind(def_id) != DefKind::AssocFn {
2296            return false;
2297        }
2298
2299        let Some(item) = self.opt_associated_item(def_id) else {
2300            return false;
2301        };
2302
2303        let AssocContainer::TraitImpl(Ok(trait_item_def_id)) = item.container else {
2304            return false;
2305        };
2306
2307        !self.associated_types_for_impl_traits_in_associated_fn(trait_item_def_id).is_empty()
2308    }
2309
2310    /// Compute a `FnAbi` suitable for declaring/defining an `fn` instance, and for direct calls*
2311    /// to an `fn`. Indirectly-passed parameters in the returned ABI will include applicable
2312    /// codegen optimization attributes, including `ReadOnly` and `CapturesNone` -- deduction of
2313    /// which requires inspection of function bodies that can lead to cycles when performed during
2314    /// typeck. During typeck, you should therefore use instead the unoptimized ABI returned by
2315    /// `fn_abi_of_instance_no_deduced_attrs`.
2316    ///
2317    /// For performance reasons, you should prefer to call this inherent method rather than invoke
2318    /// the `fn_abi_of_instance_raw` query: it delegates to that query if necessary, but where
2319    /// possible delegates instead to the `fn_abi_of_instance_no_deduced_attrs` query (thus avoiding
2320    /// unnecessary query system overhead).
2321    ///
2322    /// * that includes virtual calls, which are represented by "direct calls" to an
2323    ///   `InstanceKind::Virtual` instance (of `<dyn Trait as Trait>::fn`).
2324    #[inline]
2325    pub fn fn_abi_of_instance(
2326        self,
2327        query: ty::PseudoCanonicalInput<'tcx, (ty::Instance<'tcx>, &'tcx ty::List<Ty<'tcx>>)>,
2328    ) -> Result<&'tcx FnAbi<'tcx, Ty<'tcx>>, &'tcx FnAbiError<'tcx>> {
2329        // Only deduce attrs in full, optimized builds. Otherwise, avoid the query system overhead
2330        // of ever invoking the `fn_abi_of_instance_raw` query.
2331        if self.sess.opts.optimize != OptLevel::No && self.sess.opts.incremental.is_none() {
2332            self.fn_abi_of_instance_raw(query)
2333        } else {
2334            self.fn_abi_of_instance_no_deduced_attrs(query)
2335        }
2336    }
2337}
2338
2339// `HasAttrs` impls: allow `find_attr!(tcx, id, ...)` to work with both DefId-like types and HirId.
2340
2341impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for DefId {
2342    fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2343        if let Some(did) = self.as_local() {
2344            tcx.hir_attrs(tcx.local_def_id_to_hir_id(did))
2345        } else {
2346            tcx.attrs_for_def(self)
2347        }
2348    }
2349}
2350
2351impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for LocalDefId {
2352    fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2353        tcx.hir_attrs(tcx.local_def_id_to_hir_id(self))
2354    }
2355}
2356
2357impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for hir::OwnerId {
2358    fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2359        hir::attrs::HasAttrs::get_attrs(self.def_id, tcx)
2360    }
2361}
2362
2363impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for hir::HirId {
2364    fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2365        tcx.hir_attrs(self)
2366    }
2367}
2368
2369pub fn provide(providers: &mut Providers) {
2370    closure::provide(providers);
2371    context::provide(providers);
2372    erase_regions::provide(providers);
2373    inhabitedness::provide(providers);
2374    util::provide(providers);
2375    print::provide(providers);
2376    super::util::bug::provide(providers);
2377    *providers = Providers {
2378        trait_impls_of: trait_def::trait_impls_of_provider,
2379        incoherent_impls: trait_def::incoherent_impls_provider,
2380        trait_impls_in_crate: trait_def::trait_impls_in_crate_provider,
2381        traits: trait_def::traits_provider,
2382        vtable_allocation: vtable::vtable_allocation_provider,
2383        ..*providers
2384    };
2385}
2386
2387/// A map for the local crate mapping each type to a vector of its
2388/// inherent impls. This is not meant to be used outside of coherence;
2389/// rather, you should request the vector for a specific type via
2390/// `tcx.inherent_impls(def_id)` so as to minimize your dependencies
2391/// (constructing this map requires touching the entire crate).
2392#[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_hash::StableHash for
            CrateInherentImpls {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    CrateInherentImpls {
                        inherent_impls: ref __binding_0,
                        incoherent_impls: ref __binding_1 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
2393pub struct CrateInherentImpls {
2394    pub inherent_impls: FxIndexMap<LocalDefId, Vec<DefId>>,
2395    pub incoherent_impls: FxIndexMap<SimplifiedType, Vec<LocalDefId>>,
2396}
2397
2398#[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::option::Option::Some(::core::cmp::Ord::cmp(self, other))
    }
}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_hash::StableHash for
            SymbolName<'tcx> {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    SymbolName { name: ref __binding_0 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
2399pub struct SymbolName<'tcx> {
2400    /// `&str` gives a consistent ordering, which ensures reproducible builds.
2401    pub name: &'tcx str,
2402}
2403
2404impl<'tcx> SymbolName<'tcx> {
2405    pub fn new(tcx: TyCtxt<'tcx>, name: &str) -> SymbolName<'tcx> {
2406        SymbolName { name: tcx.arena.alloc_str(name) }
2407    }
2408}
2409
2410impl<'tcx> fmt::Display for SymbolName<'tcx> {
2411    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2412        fmt::Display::fmt(&self.name, fmt)
2413    }
2414}
2415
2416impl<'tcx> fmt::Debug for SymbolName<'tcx> {
2417    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2418        fmt::Display::fmt(&self.name, fmt)
2419    }
2420}
2421
2422/// The constituent parts of a type level constant of kind ADT or array.
2423#[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_hash::StableHash for
            DestructuredAdtConst<'tcx> {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    DestructuredAdtConst {
                        variant: ref __binding_0, fields: ref __binding_1 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
2424pub struct DestructuredAdtConst<'tcx> {
2425    pub variant: VariantIdx,
2426    pub fields: &'tcx [ty::Const<'tcx>],
2427}