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