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