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