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