Skip to main content

rustc_middle/ty/
mod.rs

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