Skip to main content

rustc_middle/ty/
mod.rs

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