Skip to main content

rustc_middle/ty/
mod.rs

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

    #[warn(clippy :: suspicious_else_formatting)]
    {

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

    #[warn(clippy :: suspicious_else_formatting)]
    {

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