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

    #[warn(clippy :: suspicious_else_formatting)]
    {

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

    #[warn(clippy :: suspicious_else_formatting)]
    {

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