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

    #[warn(clippy :: suspicious_else_formatting)]
    {

        #[allow(unknown_lints, unreachable_code, clippy ::
        diverging_sub_expression, clippy :: empty_loop, clippy ::
        let_unit_value, clippy :: let_with_type_underscore, clippy ::
        needless_return, clippy :: unreachable)]
        if false {
            let __tracing_attr_fake_return: Self = loop {};
            return __tracing_attr_fake_return;
        }
        {
            let mut flags = VariantFlags::NO_VARIANT_FLAGS;
            if is_field_list_non_exhaustive {
                flags |= VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE;
            }
            VariantDef {
                def_id: variant_did.unwrap_or(parent_did),
                ctor,
                name,
                discr,
                fields,
                flags,
                tainted: recover_tainted,
            }
        }
    }
}#[instrument(level = "debug")]
1274    pub fn new(
1275        name: Symbol,
1276        variant_did: Option<DefId>,
1277        ctor: Option<(CtorKind, DefId)>,
1278        discr: VariantDiscr,
1279        fields: IndexVec<FieldIdx, FieldDef>,
1280        parent_did: DefId,
1281        recover_tainted: Option<ErrorGuaranteed>,
1282        is_field_list_non_exhaustive: bool,
1283    ) -> Self {
1284        let mut flags = VariantFlags::NO_VARIANT_FLAGS;
1285        if is_field_list_non_exhaustive {
1286            flags |= VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE;
1287        }
1288
1289        VariantDef {
1290            def_id: variant_did.unwrap_or(parent_did),
1291            ctor,
1292            name,
1293            discr,
1294            fields,
1295            flags,
1296            tainted: recover_tainted,
1297        }
1298    }
1299
1300    /// Returns `true` if the field list of this variant is `#[non_exhaustive]`.
1301    ///
1302    /// Note that this function will return `true` even if the type has been
1303    /// defined in the crate currently being compiled. If that's not what you
1304    /// want, see [`Self::field_list_has_applicable_non_exhaustive`].
1305    #[inline]
1306    pub fn is_field_list_non_exhaustive(&self) -> bool {
1307        self.flags.intersects(VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE)
1308    }
1309
1310    /// Returns `true` if the field list of this variant is `#[non_exhaustive]`
1311    /// and the type has been defined in another crate.
1312    #[inline]
1313    pub fn field_list_has_applicable_non_exhaustive(&self) -> bool {
1314        self.is_field_list_non_exhaustive() && !self.def_id.is_local()
1315    }
1316
1317    /// Computes the `Ident` of this variant by looking up the `Span`
1318    pub fn ident(&self, tcx: TyCtxt<'_>) -> Ident {
1319        Ident::new(self.name, tcx.def_ident_span(self.def_id).unwrap())
1320    }
1321
1322    /// Was this variant obtained as part of recovering from a syntactic error?
1323    #[inline]
1324    pub fn has_errors(&self) -> Result<(), ErrorGuaranteed> {
1325        self.tainted.map_or(Ok(()), Err)
1326    }
1327
1328    #[inline]
1329    pub fn ctor_kind(&self) -> Option<CtorKind> {
1330        self.ctor.map(|(kind, _)| kind)
1331    }
1332
1333    #[inline]
1334    pub fn ctor_def_id(&self) -> Option<DefId> {
1335        self.ctor.map(|(_, def_id)| def_id)
1336    }
1337
1338    /// Returns the one field in this variant.
1339    ///
1340    /// `panic!`s if there are no fields or multiple fields.
1341    #[inline]
1342    pub fn single_field(&self) -> &FieldDef {
1343        if !(self.fields.len() == 1) {
    ::core::panicking::panic("assertion failed: self.fields.len() == 1")
};assert!(self.fields.len() == 1);
1344
1345        &self.fields[FieldIdx::ZERO]
1346    }
1347
1348    /// Returns the last field in this variant, if present.
1349    #[inline]
1350    pub fn tail_opt(&self) -> Option<&FieldDef> {
1351        self.fields.raw.last()
1352    }
1353
1354    /// Returns the last field in this variant.
1355    ///
1356    /// # Panics
1357    ///
1358    /// Panics, if the variant has no fields.
1359    #[inline]
1360    pub fn tail(&self) -> &FieldDef {
1361        self.tail_opt().expect("expected unsized ADT to have a tail field")
1362    }
1363
1364    /// Returns whether this variant has unsafe fields.
1365    pub fn has_unsafe_fields(&self) -> bool {
1366        self.fields.iter().any(|x| x.safety.is_unsafe())
1367    }
1368}
1369
1370impl PartialEq for VariantDef {
1371    #[inline]
1372    fn eq(&self, other: &Self) -> bool {
1373        // There should be only one `VariantDef` for each `def_id`, therefore
1374        // it is fine to implement `PartialEq` only based on `def_id`.
1375        //
1376        // Below, we exhaustively destructure `self` and `other` so that if the
1377        // definition of `VariantDef` changes, a compile-error will be produced,
1378        // reminding us to revisit this assumption.
1379
1380        let Self {
1381            def_id: lhs_def_id,
1382            ctor: _,
1383            name: _,
1384            discr: _,
1385            fields: _,
1386            flags: _,
1387            tainted: _,
1388        } = &self;
1389        let Self {
1390            def_id: rhs_def_id,
1391            ctor: _,
1392            name: _,
1393            discr: _,
1394            fields: _,
1395            flags: _,
1396            tainted: _,
1397        } = other;
1398
1399        let res = lhs_def_id == rhs_def_id;
1400
1401        // Double check that implicit assumption detailed above.
1402        if truecfg!(debug_assertions) && res {
1403            let deep = self.ctor == other.ctor
1404                && self.name == other.name
1405                && self.discr == other.discr
1406                && self.fields == other.fields
1407                && self.flags == other.flags;
1408            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");
1409        }
1410
1411        res
1412    }
1413}
1414
1415impl Eq for VariantDef {}
1416
1417impl Hash for VariantDef {
1418    #[inline]
1419    fn hash<H: Hasher>(&self, s: &mut H) {
1420        // There should be only one `VariantDef` for each `def_id`, therefore
1421        // it is fine to implement `Hash` only based on `def_id`.
1422        //
1423        // Below, we exhaustively destructure `self` so that if the definition
1424        // of `VariantDef` changes, a compile-error will be produced, reminding
1425        // us to revisit this assumption.
1426
1427        let Self { def_id, ctor: _, name: _, discr: _, fields: _, flags: _, tainted: _ } = &self;
1428        def_id.hash(s)
1429    }
1430}
1431
1432#[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)]
1433pub enum VariantDiscr {
1434    /// Explicit value for this variant, i.e., `X = 123`.
1435    /// The `DefId` corresponds to the embedded constant.
1436    Explicit(DefId),
1437
1438    /// The previous variant's discriminant plus one.
1439    /// For efficiency reasons, the distance from the
1440    /// last `Explicit` discriminant is being stored,
1441    /// or `0` for the first variant, if it has none.
1442    Relative(u32),
1443}
1444
1445#[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)]
1446pub struct FieldDef {
1447    pub did: DefId,
1448    pub name: Symbol,
1449    pub vis: Visibility<DefId>,
1450    pub safety: hir::Safety,
1451    pub value: Option<DefId>,
1452}
1453
1454impl PartialEq for FieldDef {
1455    #[inline]
1456    fn eq(&self, other: &Self) -> bool {
1457        // There should be only one `FieldDef` for each `did`, therefore it is
1458        // fine to implement `PartialEq` only based on `did`.
1459        //
1460        // Below, we exhaustively destructure `self` so that if the definition
1461        // of `FieldDef` changes, a compile-error will be produced, reminding
1462        // us to revisit this assumption.
1463
1464        let Self { did: lhs_did, name: _, vis: _, safety: _, value: _ } = &self;
1465
1466        let Self { did: rhs_did, name: _, vis: _, safety: _, value: _ } = other;
1467
1468        let res = lhs_did == rhs_did;
1469
1470        // Double check that implicit assumption detailed above.
1471        if truecfg!(debug_assertions) && res {
1472            let deep =
1473                self.name == other.name && self.vis == other.vis && self.safety == other.safety;
1474            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");
1475        }
1476
1477        res
1478    }
1479}
1480
1481impl Eq for FieldDef {}
1482
1483impl Hash for FieldDef {
1484    #[inline]
1485    fn hash<H: Hasher>(&self, s: &mut H) {
1486        // There should be only one `FieldDef` for each `did`, therefore it is
1487        // fine to implement `Hash` only based on `did`.
1488        //
1489        // Below, we exhaustively destructure `self` so that if the definition
1490        // of `FieldDef` changes, a compile-error will be produced, reminding
1491        // us to revisit this assumption.
1492
1493        let Self { did, name: _, vis: _, safety: _, value: _ } = &self;
1494
1495        did.hash(s)
1496    }
1497}
1498
1499impl<'tcx> FieldDef {
1500    /// Returns the type of this field. The `args` are typically obtained via
1501    /// the second field of [`TyKind::Adt`].
1502    pub fn ty(
1503        &self,
1504        tcx: TyCtxt<'tcx>,
1505        args: GenericArgsRef<'tcx>,
1506    ) -> Unnormalized<'tcx, Ty<'tcx>> {
1507        tcx.type_of(self.did).instantiate(tcx, args)
1508    }
1509
1510    /// Computes the `Ident` of this variant by looking up the `Span`
1511    pub fn ident(&self, tcx: TyCtxt<'_>) -> Ident {
1512        Ident::new(self.name, tcx.def_ident_span(self.did).unwrap())
1513    }
1514}
1515
1516#[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)]
1517pub enum ImplOverlapKind {
1518    /// These impls are always allowed to overlap.
1519    Permitted {
1520        /// Whether or not the impl is permitted due to the trait being a `#[marker]` trait
1521        marker: bool,
1522    },
1523}
1524
1525/// Useful source information about where a desugared associated type for an
1526/// RPITIT originated from.
1527#[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)]
1528pub enum ImplTraitInTraitData {
1529    Trait { fn_def_id: DefId, opaque_def_id: DefId },
1530    Impl { fn_def_id: DefId },
1531}
1532
1533impl<'tcx> TyCtxt<'tcx> {
1534    pub fn typeck_body(self, body: hir::BodyId) -> &'tcx TypeckResults<'tcx> {
1535        self.typeck(self.hir_body_owner_def_id(body))
1536    }
1537
1538    pub fn provided_trait_methods(self, id: DefId) -> impl 'tcx + Iterator<Item = &'tcx AssocItem> {
1539        self.associated_items(id)
1540            .in_definition_order()
1541            .filter(move |item| item.is_fn() && item.defaultness(self).has_value())
1542    }
1543
1544    pub fn repr_options_of_def(self, did: LocalDefId) -> ReprOptions {
1545        let mut flags = ReprFlags::empty();
1546        let mut size = None;
1547        let mut max_align: Option<Align> = None;
1548        let mut min_pack: Option<Align> = None;
1549
1550        // Generate a deterministically-derived seed from the item's path hash
1551        // to allow for cross-crate compilation to actually work
1552        let mut field_shuffle_seed = self.def_path_hash(did.to_def_id()).0.to_smaller_hash();
1553
1554        // If the user defined a custom seed for layout randomization, xor the item's
1555        // path hash with the user defined seed, this will allowing determinism while
1556        // still allowing users to further randomize layout generation for e.g. fuzzing
1557        if let Some(user_seed) = self.sess.opts.unstable_opts.layout_seed {
1558            field_shuffle_seed ^= user_seed;
1559        }
1560
1561        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
1562        )
1563        .map(|elt| match elt {
1564            Some(n) => ScalableElt::ElementCount(*n),
1565            None => ScalableElt::Container,
1566        });
1567        if elt.is_some() {
1568            flags.insert(ReprFlags::IS_SCALABLE);
1569        }
1570        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) {
1571            for (r, _) in reprs {
1572                flags.insert(match *r {
1573                    attr::ReprRust => ReprFlags::empty(),
1574                    attr::ReprC => ReprFlags::IS_C,
1575                    attr::ReprPacked(pack) => {
1576                        min_pack = Some(if let Some(min_pack) = min_pack {
1577                            min_pack.min(pack)
1578                        } else {
1579                            pack
1580                        });
1581                        ReprFlags::empty()
1582                    }
1583                    attr::ReprTransparent => ReprFlags::IS_TRANSPARENT,
1584                    attr::ReprSimd => ReprFlags::IS_SIMD,
1585                    attr::ReprInt(i) => {
1586                        size = Some(match i {
1587                            attr::IntType::SignedInt(x) => match x {
1588                                ast::IntTy::Isize => IntegerType::Pointer(true),
1589                                ast::IntTy::I8 => IntegerType::Fixed(Integer::I8, true),
1590                                ast::IntTy::I16 => IntegerType::Fixed(Integer::I16, true),
1591                                ast::IntTy::I32 => IntegerType::Fixed(Integer::I32, true),
1592                                ast::IntTy::I64 => IntegerType::Fixed(Integer::I64, true),
1593                                ast::IntTy::I128 => IntegerType::Fixed(Integer::I128, true),
1594                            },
1595                            attr::IntType::UnsignedInt(x) => match x {
1596                                ast::UintTy::Usize => IntegerType::Pointer(false),
1597                                ast::UintTy::U8 => IntegerType::Fixed(Integer::I8, false),
1598                                ast::UintTy::U16 => IntegerType::Fixed(Integer::I16, false),
1599                                ast::UintTy::U32 => IntegerType::Fixed(Integer::I32, false),
1600                                ast::UintTy::U64 => IntegerType::Fixed(Integer::I64, false),
1601                                ast::UintTy::U128 => IntegerType::Fixed(Integer::I128, false),
1602                            },
1603                        });
1604                        ReprFlags::empty()
1605                    }
1606                    attr::ReprAlign(align) => {
1607                        max_align = max_align.max(Some(align));
1608                        ReprFlags::empty()
1609                    }
1610                });
1611            }
1612        }
1613
1614        // If `-Z randomize-layout` was enabled for the type definition then we can
1615        // consider performing layout randomization
1616        if self.sess.opts.unstable_opts.randomize_layout {
1617            flags.insert(ReprFlags::RANDOMIZE_LAYOUT);
1618        }
1619
1620        // box is special, on the one hand the compiler assumes an ordered layout, with the pointer
1621        // always at offset zero. On the other hand we want scalar abi optimizations.
1622        let is_box = self.is_lang_item(did.to_def_id(), LangItem::OwnedBox);
1623
1624        // This is here instead of layout because the choice must make it into metadata.
1625        if is_box {
1626            flags.insert(ReprFlags::IS_LINEAR);
1627        }
1628
1629        // See `TyAndLayout::pass_indirectly_in_non_rustic_abis` for details.
1630        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(..)) {
1631            flags.insert(ReprFlags::PASS_INDIRECTLY_IN_NON_RUSTIC_ABIS);
1632        }
1633
1634        ReprOptions {
1635            int: size,
1636            align: max_align,
1637            pack: min_pack,
1638            flags,
1639            field_shuffle_seed,
1640            scalable: elt,
1641        }
1642    }
1643
1644    /// Look up the name of a definition across crates. This does not look at HIR.
1645    pub fn opt_item_name(self, def_id: impl IntoQueryKey<DefId>) -> Option<Symbol> {
1646        let def_id = def_id.into_query_key();
1647        if let Some(cnum) = def_id.as_crate_root() {
1648            Some(self.crate_name(cnum))
1649        } else {
1650            let def_key = self.def_key(def_id);
1651            match def_key.disambiguated_data.data {
1652                // The name of a constructor is that of its parent.
1653                rustc_hir::definitions::DefPathData::Ctor => self
1654                    .opt_item_name(DefId { krate: def_id.krate, index: def_key.parent.unwrap() }),
1655                _ => def_key.get_opt_name(),
1656            }
1657        }
1658    }
1659
1660    /// Look up the name of a definition across crates. This does not look at HIR.
1661    ///
1662    /// This method will ICE if the corresponding item does not have a name. In these cases, use
1663    /// [`opt_item_name`] instead.
1664    ///
1665    /// [`opt_item_name`]: Self::opt_item_name
1666    pub fn item_name(self, id: impl IntoQueryKey<DefId>) -> Symbol {
1667        let id = id.into_query_key();
1668        self.opt_item_name(id).unwrap_or_else(|| {
1669            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));
1670        })
1671    }
1672
1673    /// Look up the name and span of a definition.
1674    ///
1675    /// See [`item_name`][Self::item_name] for more information.
1676    pub fn opt_item_ident(self, def_id: impl IntoQueryKey<DefId>) -> Option<Ident> {
1677        let def_id = def_id.into_query_key();
1678        let def = self.opt_item_name(def_id)?;
1679        let span = self
1680            .def_ident_span(def_id)
1681            .unwrap_or_else(|| crate::util::bug::bug_fmt(format_args!("missing ident span for {0:?}",
        def_id))bug!("missing ident span for {def_id:?}"));
1682        Some(Ident::new(def, span))
1683    }
1684
1685    /// Look up the name and span of a definition.
1686    ///
1687    /// See [`item_name`][Self::item_name] for more information.
1688    pub fn item_ident(self, def_id: impl IntoQueryKey<DefId>) -> Ident {
1689        let def_id = def_id.into_query_key();
1690        self.opt_item_ident(def_id).unwrap_or_else(|| {
1691            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));
1692        })
1693    }
1694
1695    pub fn opt_associated_item(self, def_id: DefId) -> Option<AssocItem> {
1696        if let DefKind::AssocConst { .. } | DefKind::AssocFn | DefKind::AssocTy =
1697            self.def_kind(def_id)
1698        {
1699            Some(self.associated_item(def_id))
1700        } else {
1701            None
1702        }
1703    }
1704
1705    /// If the `def_id` is an associated type that was desugared from a
1706    /// return-position `impl Trait` from a trait, then provide the source info
1707    /// about where that RPITIT came from.
1708    pub fn opt_rpitit_info(self, def_id: DefId) -> Option<ImplTraitInTraitData> {
1709        if let DefKind::AssocTy = self.def_kind(def_id)
1710            && let AssocKind::Type { data: AssocTypeData::Rpitit(rpitit_info) } =
1711                self.associated_item(def_id).kind
1712        {
1713            Some(rpitit_info)
1714        } else {
1715            None
1716        }
1717    }
1718
1719    pub fn find_field_index(self, ident: Ident, variant: &VariantDef) -> Option<FieldIdx> {
1720        variant.fields.iter_enumerated().find_map(|(i, field)| {
1721            self.hygienic_eq(ident, field.ident(self), variant.def_id).then_some(i)
1722        })
1723    }
1724
1725    /// Returns `Some` if the impls are the same polarity and the trait either
1726    /// has no items or is annotated `#[marker]` and prevents item overrides.
1727    x;#[instrument(level = "debug", skip(self), ret)]
1728    pub fn impls_are_allowed_to_overlap(
1729        self,
1730        def_id1: DefId,
1731        def_id2: DefId,
1732    ) -> Option<ImplOverlapKind> {
1733        let impl1 = self.impl_trait_header(def_id1);
1734        let impl2 = self.impl_trait_header(def_id2);
1735
1736        let trait_ref1 = impl1.trait_ref.skip_binder();
1737        let trait_ref2 = impl2.trait_ref.skip_binder();
1738
1739        // If either trait impl references an error, they're allowed to overlap,
1740        // as one of them essentially doesn't exist.
1741        if trait_ref1.references_error() || trait_ref2.references_error() {
1742            return Some(ImplOverlapKind::Permitted { marker: false });
1743        }
1744
1745        match (impl1.polarity, impl2.polarity) {
1746            (ImplPolarity::Reservation, _) | (_, ImplPolarity::Reservation) => {
1747                // `#[rustc_reservation_impl]` impls don't overlap with anything
1748                return Some(ImplOverlapKind::Permitted { marker: false });
1749            }
1750            (ImplPolarity::Positive, ImplPolarity::Negative)
1751            | (ImplPolarity::Negative, ImplPolarity::Positive) => {
1752                // `impl AutoTrait for Type` + `impl !AutoTrait for Type`
1753                return None;
1754            }
1755            (ImplPolarity::Positive, ImplPolarity::Positive)
1756            | (ImplPolarity::Negative, ImplPolarity::Negative) => {}
1757        };
1758
1759        let is_marker_impl = |trait_ref: TraitRef<'_>| self.trait_def(trait_ref.def_id).is_marker;
1760        let is_marker_overlap = is_marker_impl(trait_ref1) && is_marker_impl(trait_ref2);
1761
1762        if is_marker_overlap {
1763            return Some(ImplOverlapKind::Permitted { marker: true });
1764        }
1765
1766        None
1767    }
1768
1769    /// Returns `ty::VariantDef` if `res` refers to a struct,
1770    /// or variant or their constructors, panics otherwise.
1771    pub fn expect_variant_res(self, res: Res) -> &'tcx VariantDef {
1772        match res {
1773            Res::Def(DefKind::Variant, did) => {
1774                let enum_did = self.parent(did);
1775                self.adt_def(enum_did).variant_with_id(did)
1776            }
1777            Res::Def(DefKind::Struct | DefKind::Union, did) => self.adt_def(did).non_enum_variant(),
1778            Res::Def(DefKind::Ctor(CtorOf::Variant, ..), variant_ctor_did) => {
1779                let variant_did = self.parent(variant_ctor_did);
1780                let enum_did = self.parent(variant_did);
1781                self.adt_def(enum_did).variant_with_ctor_id(variant_ctor_did)
1782            }
1783            Res::Def(DefKind::Ctor(CtorOf::Struct, ..), ctor_did) => {
1784                let struct_did = self.parent(ctor_did);
1785                self.adt_def(struct_did).non_enum_variant()
1786            }
1787            _ => 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),
1788        }
1789    }
1790
1791    /// Returns the possibly-auto-generated MIR of a [`ty::InstanceKind`].
1792    #[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(1792u32),
                                    ::tracing_core::__macro_support::Option::Some("rustc_middle::ty"),
                                    ::tracing_core::field::FieldSet::new(&["instance"],
                                        ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                    ::tracing::metadata::Kind::SPAN)
                            };
                        ::tracing::callsite::DefaultCallsite::new(&META)
                    };
                let mut interest = ::tracing::subscriber::Interest::never();
                if ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::STATIC_MAX_LEVEL &&
                                ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::LevelFilter::current() &&
                            { interest = __CALLSITE.interest(); !interest.is_never() }
                        &&
                        ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                            interest) {
                    let meta = __CALLSITE.metadata();
                    ::tracing::Span::new(meta,
                        &{
                                #[allow(unused_imports)]
                                use ::tracing::field::{debug, display, Value};
                                let mut iter = meta.fields().iter();
                                meta.fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
                                                    ::tracing::__macro_support::Option::Some(&::tracing::field::debug(&instance)
                                                            as &dyn Value))])
                            })
                } else {
                    let span =
                        ::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
                    {};
                    span
                }
            };
        __tracing_attr_guard = __tracing_attr_span.enter();
    }

    #[warn(clippy :: suspicious_else_formatting)]
    {

        #[allow(unknown_lints, unreachable_code, clippy ::
        diverging_sub_expression, clippy :: empty_loop, clippy ::
        let_unit_value, clippy :: let_with_type_underscore, clippy ::
        needless_return, clippy :: unreachable)]
        if false {
            let __tracing_attr_fake_return: &'tcx Body<'tcx> = loop {};
            return __tracing_attr_fake_return;
        }
        {
            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:1796",
                                                "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(1796u32),
                                                ::tracing_core::__macro_support::Option::Some("rustc_middle::ty"),
                                                ::tracing_core::field::FieldSet::new(&["message"],
                                                    ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                                ::tracing::metadata::Kind::EVENT)
                                        };
                                    ::tracing::callsite::DefaultCallsite::new(&META)
                                };
                            let enabled =
                                ::tracing::Level::DEBUG <=
                                            ::tracing::level_filters::STATIC_MAX_LEVEL &&
                                        ::tracing::Level::DEBUG <=
                                            ::tracing::level_filters::LevelFilter::current() &&
                                    {
                                        let interest = __CALLSITE.interest();
                                        !interest.is_never() &&
                                            ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                                                interest)
                                    };
                            if enabled {
                                (|value_set: ::tracing::field::ValueSet|
                                            {
                                                let meta = __CALLSITE.metadata();
                                                ::tracing::Event::dispatch(meta, &value_set);
                                                ;
                                            })({
                                        #[allow(unused_imports)]
                                        use ::tracing::field::{debug, display, Value};
                                        let mut iter = __CALLSITE.metadata().fields().iter();
                                        __CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
                                                            ::tracing::__macro_support::Option::Some(&format_args!("calling def_kind on def: {0:?}",
                                                                            def) as &dyn Value))])
                                    });
                            } else { ; }
                        };
                        let def_kind = self.def_kind(def);
                        {
                            use ::tracing::__macro_support::Callsite as _;
                            static __CALLSITE: ::tracing::callsite::DefaultCallsite =
                                {
                                    static META: ::tracing::Metadata<'static> =
                                        {
                                            ::tracing_core::metadata::Metadata::new("event compiler/rustc_middle/src/ty/mod.rs:1798",
                                                "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(1798u32),
                                                ::tracing_core::__macro_support::Option::Some("rustc_middle::ty"),
                                                ::tracing_core::field::FieldSet::new(&["message"],
                                                    ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                                ::tracing::metadata::Kind::EVENT)
                                        };
                                    ::tracing::callsite::DefaultCallsite::new(&META)
                                };
                            let enabled =
                                ::tracing::Level::DEBUG <=
                                            ::tracing::level_filters::STATIC_MAX_LEVEL &&
                                        ::tracing::Level::DEBUG <=
                                            ::tracing::level_filters::LevelFilter::current() &&
                                    {
                                        let interest = __CALLSITE.interest();
                                        !interest.is_never() &&
                                            ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                                                interest)
                                    };
                            if enabled {
                                (|value_set: ::tracing::field::ValueSet|
                                            {
                                                let meta = __CALLSITE.metadata();
                                                ::tracing::Event::dispatch(meta, &value_set);
                                                ;
                                            })({
                                        #[allow(unused_imports)]
                                        use ::tracing::field::{debug, display, Value};
                                        let mut iter = __CALLSITE.metadata().fields().iter();
                                        __CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
                                                            ::tracing::__macro_support::Option::Some(&format_args!("returned from def_kind: {0:?}",
                                                                            def_kind) as &dyn Value))])
                                    });
                            } else { ; }
                        };
                        match def_kind {
                            DefKind::Const { .. } | DefKind::Static { .. } |
                                DefKind::AssocConst { .. } | DefKind::Ctor(..) |
                                DefKind::AnonConst | DefKind::InlineConst =>
                                self.mir_for_ctfe(def),
                            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(..) =>
                        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")]
1793    pub fn instance_mir(self, instance: ty::InstanceKind<'tcx>) -> &'tcx Body<'tcx> {
1794        let body = match instance {
1795            ty::InstanceKind::Item(def) => {
1796                debug!("calling def_kind on def: {:?}", def);
1797                let def_kind = self.def_kind(def);
1798                debug!("returned from def_kind: {:?}", def_kind);
1799                match def_kind {
1800                    DefKind::Const { .. }
1801                    | DefKind::Static { .. }
1802                    | DefKind::AssocConst { .. }
1803                    | DefKind::Ctor(..)
1804                    | DefKind::AnonConst
1805                    | DefKind::InlineConst => self.mir_for_ctfe(def),
1806                    DefKind::Fn | DefKind::AssocFn
1807                        if matches!(
1808                            self.constness(def),
1809                            hir::Constness::Const { always: true }
1810                        ) =>
1811                    {
1812                        self.mir_for_ctfe(def)
1813                    }
1814                    // If the caller wants `mir_for_ctfe` of a function they should not be using
1815                    // `instance_mir`, so we'll assume const fn also wants the optimized version.
1816                    _ => self.optimized_mir(def),
1817                }
1818            }
1819            ty::InstanceKind::Intrinsic(..) => bug!("intrinsics have no instance MIR"),
1820            ty::InstanceKind::Virtual(..) => bug!("virtual dispatches have no instance MIR"),
1821            ty::InstanceKind::Shim(shim) => self.mir_shims(shim),
1822        };
1823
1824        assert!(
1825            matches!(body.phase, MirPhase::Runtime(_)),
1826            "body: {body:?} instance: {instance:?} {:?}",
1827            if let ty::InstanceKind::Item(d) = instance { Some(self.def_kind(d)) } else { None },
1828        );
1829
1830        body
1831    }
1832
1833    /// Gets all attributes with the given name.
1834    #[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."]
1835    pub fn get_attrs(
1836        self,
1837        did: impl Into<DefId>,
1838        attr: Symbol,
1839    ) -> impl Iterator<Item = &'tcx hir::Attribute> {
1840        #[allow(deprecated)]
1841        self.get_all_attrs(did).iter().filter(move |a: &&hir::Attribute| a.has_name(attr))
1842    }
1843
1844    /// Gets all attributes.
1845    ///
1846    /// To see if an item has a specific attribute, you should use
1847    /// [`rustc_hir::find_attr!`] so you can use matching.
1848    #[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."]
1849    pub fn get_all_attrs(self, did: impl Into<DefId>) -> &'tcx [hir::Attribute] {
1850        let did: DefId = did.into();
1851        if let Some(did) = did.as_local() {
1852            self.hir_attrs(self.local_def_id_to_hir_id(did))
1853        } else {
1854            self.attrs_for_def(did)
1855        }
1856    }
1857
1858    pub fn get_attrs_by_path(
1859        self,
1860        did: DefId,
1861        attr: &[Symbol],
1862    ) -> impl Iterator<Item = &'tcx hir::Attribute> {
1863        let filter_fn = move |a: &&hir::Attribute| a.path_matches(attr);
1864        if let Some(did) = did.as_local() {
1865            self.hir_attrs(self.local_def_id_to_hir_id(did)).iter().filter(filter_fn)
1866        } else {
1867            self.attrs_for_def(did).iter().filter(filter_fn)
1868        }
1869    }
1870
1871    /// Returns `true` if this is an `auto trait`.
1872    pub fn trait_is_auto(self, trait_def_id: DefId) -> bool {
1873        self.trait_def(trait_def_id).has_auto_impl
1874    }
1875
1876    /// Returns `true` if this is coinductive, either because it is
1877    /// an auto trait or because it has the `#[rustc_coinductive]` attribute.
1878    pub fn trait_is_coinductive(self, trait_def_id: DefId) -> bool {
1879        self.trait_def(trait_def_id).is_coinductive
1880    }
1881
1882    /// Returns `true` if this is a trait alias.
1883    pub fn trait_is_alias(self, trait_def_id: DefId) -> bool {
1884        self.def_kind(trait_def_id) == DefKind::TraitAlias
1885    }
1886
1887    /// Arena-alloc of LayoutError for coroutine layout
1888    fn layout_error(self, err: LayoutError<'tcx>) -> &'tcx LayoutError<'tcx> {
1889        self.arena.alloc(err)
1890    }
1891
1892    /// Returns layout of a non-async-drop coroutine. Layout might be unavailable if the
1893    /// coroutine is tainted by errors.
1894    ///
1895    /// Takes `coroutine_kind` which can be acquired from the `CoroutineArgs::kind_ty`,
1896    /// e.g. `args.as_coroutine().kind_ty()`.
1897    fn ordinary_coroutine_layout(
1898        self,
1899        def_id: DefId,
1900        args: GenericArgsRef<'tcx>,
1901    ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1902        let coroutine_kind_ty = args.as_coroutine().kind_ty();
1903        let mir = self.optimized_mir(def_id);
1904        let ty = || Ty::new_coroutine(self, def_id, args);
1905        // Regular coroutine
1906        if coroutine_kind_ty.is_unit() {
1907            mir.coroutine_layout_raw().ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1908        } else {
1909            // If we have a `Coroutine` that comes from an coroutine-closure,
1910            // then it may be a by-move or by-ref body.
1911            let ty::Coroutine(_, identity_args) =
1912                *self.type_of(def_id).instantiate_identity().skip_norm_wip().kind()
1913            else {
1914                ::core::panicking::panic("internal error: entered unreachable code");unreachable!();
1915            };
1916            let identity_kind_ty = identity_args.as_coroutine().kind_ty();
1917            // If the types differ, then we must be getting the by-move body of
1918            // a by-ref coroutine.
1919            if identity_kind_ty == coroutine_kind_ty {
1920                mir.coroutine_layout_raw()
1921                    .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1922            } else {
1923                {
    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));
1924                {
    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!(
1925                    identity_kind_ty.to_opt_closure_kind(),
1926                    Some(ClosureKind::Fn | ClosureKind::FnMut)
1927                );
1928                self.optimized_mir(self.coroutine_by_move_body_def_id(def_id))
1929                    .coroutine_layout_raw()
1930                    .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1931            }
1932        }
1933    }
1934
1935    /// Returns layout of a `async_drop_in_place::{closure}` coroutine
1936    ///   (returned from `async fn async_drop_in_place<T>(..)`).
1937    /// Layout might be unavailable if the coroutine is tainted by errors.
1938    fn async_drop_coroutine_layout(
1939        self,
1940        def_id: DefId,
1941        args: GenericArgsRef<'tcx>,
1942    ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1943        let ty = || Ty::new_coroutine(self, def_id, args);
1944        if args[0].has_placeholders() || args[0].has_non_region_param() {
1945            return Err(self.layout_error(LayoutError::TooGeneric(ty())));
1946        }
1947        let instance = ShimKind::AsyncDropGlue(def_id, Ty::new_coroutine(self, def_id, args));
1948        self.mir_shims(instance)
1949            .coroutine_layout_raw()
1950            .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1951    }
1952
1953    /// Returns layout of a coroutine. Layout might be unavailable if the
1954    /// coroutine is tainted by errors.
1955    pub fn coroutine_layout(
1956        self,
1957        def_id: DefId,
1958        args: GenericArgsRef<'tcx>,
1959    ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1960        if self.is_async_drop_in_place_coroutine(def_id) {
1961            // layout of `async_drop_in_place<T>::{closure}` in case,
1962            // when T is a coroutine, contains this internal coroutine's ptr in upvars
1963            // and doesn't require any locals. Here is an `empty coroutine's layout`
1964            let arg_cor_ty = args.first().unwrap().expect_ty();
1965            if arg_cor_ty.is_coroutine() {
1966                let span = self.def_span(def_id);
1967                let source_info = SourceInfo::outermost(span);
1968                // Even minimal, empty coroutine has 3 states (RESERVED_VARIANTS),
1969                // so variant_fields and variant_source_info should have 3 elements.
1970                let variant_fields: IndexVec<VariantIdx, IndexVec<FieldIdx, CoroutineSavedLocal>> =
1971                    iter::repeat(IndexVec::new()).take(CoroutineArgs::RESERVED_VARIANTS).collect();
1972                let variant_source_info: IndexVec<VariantIdx, SourceInfo> =
1973                    iter::repeat(source_info).take(CoroutineArgs::RESERVED_VARIANTS).collect();
1974                let proxy_layout = CoroutineLayout {
1975                    field_tys: [].into(),
1976                    variant_fields,
1977                    variant_source_info,
1978                    storage_conflicts: BitMatrix::new(0, 0),
1979                };
1980                return Ok(self.arena.alloc(proxy_layout));
1981            } else {
1982                self.async_drop_coroutine_layout(def_id, args)
1983            }
1984        } else {
1985            self.ordinary_coroutine_layout(def_id, args)
1986        }
1987    }
1988
1989    /// If the given `DefId` is an associated item, returns the `DefId` and `DefKind` of the parent trait or impl.
1990    pub fn assoc_parent(self, def_id: DefId) -> Option<(DefId, DefKind)> {
1991        if !self.def_kind(def_id).is_assoc() {
1992            return None;
1993        }
1994        let parent = self.parent(def_id);
1995        let def_kind = self.def_kind(parent);
1996        Some((parent, def_kind))
1997    }
1998
1999    /// Returns the trait item that is implemented by the given item `DefId`.
2000    pub fn trait_item_of(self, def_id: impl IntoQueryKey<DefId>) -> Option<DefId> {
2001        let def_id = def_id.into_query_key();
2002        self.opt_associated_item(def_id)?.trait_item_def_id()
2003    }
2004
2005    /// If the given `DefId` is an associated item of a trait,
2006    /// returns the `DefId` of the trait; otherwise, returns `None`.
2007    pub fn trait_of_assoc(self, def_id: DefId) -> Option<DefId> {
2008        match self.assoc_parent(def_id) {
2009            Some((id, DefKind::Trait)) => Some(id),
2010            _ => None,
2011        }
2012    }
2013
2014    pub fn impl_is_of_trait(self, def_id: impl IntoQueryKey<DefId>) -> bool {
2015        let def_id = def_id.into_query_key();
2016        let DefKind::Impl { of_trait } = self.def_kind(def_id) else {
2017            {
    ::core::panicking::panic_fmt(format_args!("expected Impl for {0:?}",
            def_id));
};panic!("expected Impl for {def_id:?}");
2018        };
2019        of_trait
2020    }
2021
2022    /// If the given `DefId` is an associated item of an impl,
2023    /// returns the `DefId` of the impl; otherwise returns `None`.
2024    pub fn impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
2025        match self.assoc_parent(def_id) {
2026            Some((id, DefKind::Impl { .. })) => Some(id),
2027            _ => None,
2028        }
2029    }
2030
2031    /// If the given `DefId` is an associated item of an inherent impl,
2032    /// returns the `DefId` of the impl; otherwise, returns `None`.
2033    pub fn inherent_impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
2034        match self.assoc_parent(def_id) {
2035            Some((id, DefKind::Impl { of_trait: false })) => Some(id),
2036            _ => None,
2037        }
2038    }
2039
2040    /// If the given `DefId` is an associated item of a trait impl,
2041    /// returns the `DefId` of the impl; otherwise, returns `None`.
2042    pub fn trait_impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
2043        match self.assoc_parent(def_id) {
2044            Some((id, DefKind::Impl { of_trait: true })) => Some(id),
2045            _ => None,
2046        }
2047    }
2048
2049    pub fn impl_polarity(self, def_id: impl IntoQueryKey<DefId>) -> ty::ImplPolarity {
2050        let def_id = def_id.into_query_key();
2051        self.impl_trait_header(def_id).polarity
2052    }
2053
2054    /// Given an `impl_id`, return the trait it implements.
2055    pub fn impl_trait_ref(
2056        self,
2057        def_id: impl IntoQueryKey<DefId>,
2058    ) -> ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>> {
2059        let def_id = def_id.into_query_key();
2060        self.impl_trait_header(def_id).trait_ref
2061    }
2062
2063    /// Given an `impl_id`, return the trait it implements.
2064    /// Returns `None` if it is an inherent impl.
2065    pub fn impl_opt_trait_ref(
2066        self,
2067        def_id: impl IntoQueryKey<DefId>,
2068    ) -> Option<ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>>> {
2069        let def_id = def_id.into_query_key();
2070        self.impl_is_of_trait(def_id).then(|| self.impl_trait_ref(def_id))
2071    }
2072
2073    /// Given the `DefId` of an impl, returns the `DefId` of the trait it implements.
2074    pub fn impl_trait_id(self, def_id: impl IntoQueryKey<DefId>) -> DefId {
2075        let def_id = def_id.into_query_key();
2076        self.impl_trait_ref(def_id).skip_binder().def_id
2077    }
2078
2079    /// Given the `DefId` of an impl, returns the `DefId` of the trait it implements.
2080    /// Returns `None` if it is an inherent impl.
2081    pub fn impl_opt_trait_id(self, def_id: impl IntoQueryKey<DefId>) -> Option<DefId> {
2082        let def_id = def_id.into_query_key();
2083        self.impl_is_of_trait(def_id).then(|| self.impl_trait_id(def_id))
2084    }
2085
2086    pub fn is_exportable(self, def_id: DefId) -> bool {
2087        self.exportable_items(def_id.krate).contains(&def_id)
2088    }
2089
2090    /// Check if the given `DefId` is `#\[automatically_derived\]`, *and*
2091    /// whether it was produced by expanding a builtin derive macro.
2092    pub fn is_builtin_derived(self, def_id: DefId) -> bool {
2093        if self.is_automatically_derived(def_id)
2094            && let Some(def_id) = def_id.as_local()
2095            && let outer = self.def_span(def_id).ctxt().outer_expn_data()
2096            && #[allow(non_exhaustive_omitted_patterns)] match outer.kind {
    ExpnKind::Macro(MacroKind::Derive, _) => true,
    _ => false,
}matches!(outer.kind, ExpnKind::Macro(MacroKind::Derive, _))
2097            && {
        {
            '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 { .. })
2098        {
2099            true
2100        } else {
2101            false
2102        }
2103    }
2104
2105    /// Check if the given `DefId` is `#\[automatically_derived\]`.
2106    pub fn is_automatically_derived(self, def_id: DefId) -> bool {
2107        {
        {
            '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)
2108    }
2109
2110    /// Looks up the span of `impl_did` if the impl is local; otherwise returns `Err`
2111    /// with the name of the crate containing the impl.
2112    pub fn span_of_impl(self, impl_def_id: DefId) -> Result<Span, Symbol> {
2113        if let Some(impl_def_id) = impl_def_id.as_local() {
2114            Ok(self.def_span(impl_def_id))
2115        } else {
2116            Err(self.crate_name(impl_def_id.krate))
2117        }
2118    }
2119
2120    /// Hygienically compares a use-site name (`use_name`) for a field or an associated item with
2121    /// its supposed definition name (`def_name`). The method also needs `DefId` of the supposed
2122    /// definition's parent/scope to perform comparison.
2123    pub fn hygienic_eq(self, use_ident: Ident, def_ident: Ident, def_parent_def_id: DefId) -> bool {
2124        // We could use `Ident::eq` here, but we deliberately don't. The identifier
2125        // comparison fails frequently, and we want to avoid the expensive
2126        // `normalize_to_macros_2_0()` calls required for the span comparison whenever possible.
2127        use_ident.name == def_ident.name
2128            && use_ident
2129                .span
2130                .ctxt()
2131                .hygienic_eq(def_ident.span.ctxt(), self.expn_that_defined(def_parent_def_id))
2132    }
2133
2134    pub fn adjust_ident(self, mut ident: Ident, scope: DefId) -> Ident {
2135        ident.span.normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope));
2136        ident
2137    }
2138
2139    // FIXME(vincenzopalazzo): move the HirId to a LocalDefId
2140    pub fn adjust_ident_and_get_scope(
2141        self,
2142        mut ident: Ident,
2143        scope: DefId,
2144        block: hir::HirId,
2145    ) -> (Ident, DefId) {
2146        let scope = ident
2147            .span
2148            .normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope))
2149            .and_then(|actual_expansion| actual_expansion.expn_data().parent_module)
2150            .unwrap_or_else(|| self.parent_module(block).to_def_id());
2151        (ident, scope)
2152    }
2153
2154    /// Checks whether this is a `const fn`. Returns `false` for non-functions.
2155    ///
2156    /// Even if this returns `true`, constness may still be unstable!
2157    #[inline]
2158    pub fn is_const_fn(self, def_id: impl IntoQueryKey<DefId>) -> bool {
2159        let def_id = def_id.into_query_key();
2160        #[allow(non_exhaustive_omitted_patterns)] match self.def_kind(def_id) {
    DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(_, CtorKind::Fn) |
        DefKind::Closure => true,
    _ => false,
}matches!(
2161            self.def_kind(def_id),
2162            DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(_, CtorKind::Fn) | DefKind::Closure
2163        ) && #[allow(non_exhaustive_omitted_patterns)] match self.constness(def_id) {
    hir::Constness::Const { .. } => true,
    _ => false,
}matches!(self.constness(def_id), hir::Constness::Const { .. })
2164    }
2165
2166    /// Whether this item is conditionally constant for the purposes of the
2167    /// effects implementation.
2168    ///
2169    /// This roughly corresponds to all const functions and other callable
2170    /// items, along with const impls and traits, and associated types within
2171    /// those impls and traits.
2172    pub fn is_conditionally_const(self, def_id: impl Into<DefId>) -> bool {
2173        let def_id: DefId = def_id.into();
2174        match self.def_kind(def_id) {
2175            DefKind::Impl { of_trait: true } => {
2176                let header = self.impl_trait_header(def_id);
2177                #[allow(non_exhaustive_omitted_patterns)] match header.constness {
    hir::Constness::Const { always: false } => true,
    _ => false,
}matches!(header.constness, hir::Constness::Const { always: false })
2178                    && self.is_const_trait(header.trait_ref.skip_binder().def_id)
2179            }
2180            DefKind::Impl { of_trait: false } => {
2181                #[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 })
2182            }
2183            DefKind::Fn | DefKind::Ctor(_, CtorKind::Fn) => {
2184                #[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 })
2185            }
2186            DefKind::TraitAlias | DefKind::Trait => self.is_const_trait(def_id),
2187            DefKind::AssocTy => {
2188                let parent_def_id = self.parent(def_id);
2189                match self.def_kind(parent_def_id) {
2190                    DefKind::Impl { of_trait: false } => false,
2191                    DefKind::Impl { of_trait: true } | DefKind::Trait => {
2192                        self.is_conditionally_const(parent_def_id)
2193                    }
2194                    _ => 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:?}"),
2195                }
2196            }
2197            DefKind::AssocFn => {
2198                let parent_def_id = self.parent(def_id);
2199                match self.def_kind(parent_def_id) {
2200                    DefKind::Impl { of_trait: false } => {
2201                        #[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 })
2202                    }
2203                    DefKind::Impl { of_trait: true } => {
2204                        let Some(trait_method_did) = self.trait_item_of(def_id) else {
2205                            return false;
2206                        };
2207                        #[allow(non_exhaustive_omitted_patterns)] match self.constness(trait_method_did)
    {
    hir::Constness::Const { always: false } => true,
    _ => false,
}matches!(
2208                            self.constness(trait_method_did),
2209                            hir::Constness::Const { always: false }
2210                        ) && self.is_conditionally_const(parent_def_id)
2211                    }
2212                    DefKind::Trait => {
2213                        #[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 })
2214                            && self.is_conditionally_const(parent_def_id)
2215                    }
2216                    _ => 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:?}"),
2217                }
2218            }
2219            DefKind::OpaqueTy => match self.opaque_ty_origin(def_id) {
2220                hir::OpaqueTyOrigin::FnReturn { parent, .. } => self.is_conditionally_const(parent),
2221                hir::OpaqueTyOrigin::AsyncFn { .. } => false,
2222                // FIXME(const_trait_impl): ATPITs could be conditionally const?
2223                hir::OpaqueTyOrigin::TyAlias { .. } => false,
2224            },
2225            DefKind::Closure => {
2226                #[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 })
2227            }
2228            DefKind::Ctor(_, CtorKind::Const)
2229            | DefKind::Mod
2230            | DefKind::Struct
2231            | DefKind::Union
2232            | DefKind::Enum
2233            | DefKind::Variant
2234            | DefKind::TyAlias
2235            | DefKind::ForeignTy
2236            | DefKind::TyParam
2237            | DefKind::Const { .. }
2238            | DefKind::ConstParam
2239            | DefKind::Static { .. }
2240            | DefKind::AssocConst { .. }
2241            | DefKind::Macro(_)
2242            | DefKind::ExternCrate
2243            | DefKind::Use
2244            | DefKind::ForeignMod
2245            | DefKind::AnonConst
2246            | DefKind::InlineConst
2247            | DefKind::Field
2248            | DefKind::LifetimeParam
2249            | DefKind::GlobalAsm
2250            | DefKind::SyntheticCoroutineBody => false,
2251        }
2252    }
2253
2254    #[inline]
2255    pub fn is_const_trait(self, def_id: DefId) -> bool {
2256        #[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 { .. })
2257    }
2258
2259    pub fn impl_method_has_trait_impl_trait_tys(self, def_id: DefId) -> bool {
2260        if self.def_kind(def_id) != DefKind::AssocFn {
2261            return false;
2262        }
2263
2264        let Some(item) = self.opt_associated_item(def_id) else {
2265            return false;
2266        };
2267
2268        let AssocContainer::TraitImpl(Ok(trait_item_def_id)) = item.container else {
2269            return false;
2270        };
2271
2272        !self.associated_types_for_impl_traits_in_associated_fn(trait_item_def_id).is_empty()
2273    }
2274
2275    /// Compute a `FnAbi` suitable for declaring/defining an `fn` instance, and for direct calls*
2276    /// to an `fn`. Indirectly-passed parameters in the returned ABI will include applicable
2277    /// codegen optimization attributes, including `ReadOnly` and `CapturesNone` -- deduction of
2278    /// which requires inspection of function bodies that can lead to cycles when performed during
2279    /// typeck. During typeck, you should therefore use instead the unoptimized ABI returned by
2280    /// `fn_abi_of_instance_no_deduced_attrs`.
2281    ///
2282    /// For performance reasons, you should prefer to call this inherent method rather than invoke
2283    /// the `fn_abi_of_instance_raw` query: it delegates to that query if necessary, but where
2284    /// possible delegates instead to the `fn_abi_of_instance_no_deduced_attrs` query (thus avoiding
2285    /// unnecessary query system overhead).
2286    ///
2287    /// * that includes virtual calls, which are represented by "direct calls" to an
2288    ///   `InstanceKind::Virtual` instance (of `<dyn Trait as Trait>::fn`).
2289    #[inline]
2290    pub fn fn_abi_of_instance(
2291        self,
2292        query: ty::PseudoCanonicalInput<'tcx, (ty::Instance<'tcx>, &'tcx ty::List<Ty<'tcx>>)>,
2293    ) -> Result<&'tcx FnAbi<'tcx, Ty<'tcx>>, &'tcx FnAbiError<'tcx>> {
2294        // Only deduce attrs in full, optimized builds. Otherwise, avoid the query system overhead
2295        // of ever invoking the `fn_abi_of_instance_raw` query.
2296        if self.sess.opts.optimize != OptLevel::No && self.sess.opts.incremental.is_none() {
2297            self.fn_abi_of_instance_raw(query)
2298        } else {
2299            self.fn_abi_of_instance_no_deduced_attrs(query)
2300        }
2301    }
2302}
2303
2304// `HasAttrs` impls: allow `find_attr!(tcx, id, ...)` to work with both DefId-like types and HirId.
2305
2306impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for DefId {
2307    fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2308        if let Some(did) = self.as_local() {
2309            tcx.hir_attrs(tcx.local_def_id_to_hir_id(did))
2310        } else {
2311            tcx.attrs_for_def(self)
2312        }
2313    }
2314}
2315
2316impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for LocalDefId {
2317    fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2318        tcx.hir_attrs(tcx.local_def_id_to_hir_id(self))
2319    }
2320}
2321
2322impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for hir::OwnerId {
2323    fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2324        hir::attrs::HasAttrs::get_attrs(self.def_id, tcx)
2325    }
2326}
2327
2328impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for hir::HirId {
2329    fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2330        tcx.hir_attrs(self)
2331    }
2332}
2333
2334pub fn provide(providers: &mut Providers) {
2335    closure::provide(providers);
2336    context::provide(providers);
2337    erase_regions::provide(providers);
2338    inhabitedness::provide(providers);
2339    util::provide(providers);
2340    print::provide(providers);
2341    super::util::bug::provide(providers);
2342    *providers = Providers {
2343        trait_impls_of: trait_def::trait_impls_of_provider,
2344        incoherent_impls: trait_def::incoherent_impls_provider,
2345        trait_impls_in_crate: trait_def::trait_impls_in_crate_provider,
2346        traits: trait_def::traits_provider,
2347        vtable_allocation: vtable::vtable_allocation_provider,
2348        ..*providers
2349    };
2350}
2351
2352/// A map for the local crate mapping each type to a vector of its
2353/// inherent impls. This is not meant to be used outside of coherence;
2354/// rather, you should request the vector for a specific type via
2355/// `tcx.inherent_impls(def_id)` so as to minimize your dependencies
2356/// (constructing this map requires touching the entire crate).
2357#[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)]
2358pub struct CrateInherentImpls {
2359    pub inherent_impls: FxIndexMap<LocalDefId, Vec<DefId>>,
2360    pub incoherent_impls: FxIndexMap<SimplifiedType, Vec<LocalDefId>>,
2361}
2362
2363#[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)]
2364pub struct SymbolName<'tcx> {
2365    /// `&str` gives a consistent ordering, which ensures reproducible builds.
2366    pub name: &'tcx str,
2367}
2368
2369impl<'tcx> SymbolName<'tcx> {
2370    pub fn new(tcx: TyCtxt<'tcx>, name: &str) -> SymbolName<'tcx> {
2371        SymbolName { name: tcx.arena.alloc_str(name) }
2372    }
2373}
2374
2375impl<'tcx> fmt::Display for SymbolName<'tcx> {
2376    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2377        fmt::Display::fmt(&self.name, fmt)
2378    }
2379}
2380
2381impl<'tcx> fmt::Debug for SymbolName<'tcx> {
2382    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2383        fmt::Display::fmt(&self.name, fmt)
2384    }
2385}
2386
2387/// The constituent parts of a type level constant of kind ADT or array.
2388#[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)]
2389pub struct DestructuredAdtConst<'tcx> {
2390    pub variant: VariantIdx,
2391    pub fields: &'tcx [ty::Const<'tcx>],
2392}