1#![allow(rustc::usage_of_ty_tykind)]
13
14use std::cmp::Ordering;
15use std::fmt::Debug;
16use std::hash::{Hash, Hasher};
17use std::marker::PhantomData;
18use std::num::NonZero;
19use std::ptr::NonNull;
20use std::{assert_matches, fmt, iter, str};
21
22pub use adt::*;
23pub use assoc::*;
24pub use generic_args::{GenericArgKind, TermKind, *};
25pub use generics::*;
26pub use intrinsic::IntrinsicDef;
27use rustc_abi::{
28 Align, FieldIdx, Integer, IntegerType, ReprFlags, ReprOptions, ScalableElt, VariantIdx,
29};
30use rustc_ast::node_id::NodeMap;
31use rustc_ast::{self as ast};
32pub use rustc_ast_ir::{Movability, Mutability, try_visit};
33use rustc_data_structures::fx::{FxIndexMap, FxIndexSet};
34use rustc_data_structures::intern::Interned;
35use rustc_data_structures::stable_hash::{StableHash, StableHashCtxt, StableHasher};
36use rustc_data_structures::steal::Steal;
37use rustc_data_structures::unord::{UnordMap, UnordSet};
38use rustc_errors::{Diag, ErrorGuaranteed, LintBuffer};
39use rustc_hir::attrs::StrippedCfgItem;
40use rustc_hir::def::{CtorKind, CtorOf, DefKind, DocLinkResMap, LifetimeRes, Res};
41use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, LocalDefIdMap};
42use rustc_hir::definitions::PerParentDisambiguatorState;
43use rustc_hir::{self as hir, LangItem, MissingLifetimeKind, attrs as attr, find_attr};
44use rustc_index::IndexVec;
45use rustc_index::bit_set::BitMatrix;
46use rustc_macros::{
47 BlobDecodable, Decodable, Encodable, StableHash, TyDecodable, TyEncodable, TypeFoldable,
48 TypeVisitable, extension,
49};
50use rustc_serialize::{Decodable, Encodable};
51use rustc_session::config::OptLevel;
52pub use rustc_session::lint::RegisteredTools;
53use rustc_span::hygiene::MacroKind;
54use rustc_span::{DUMMY_SP, ExpnId, ExpnKind, Ident, Span, Symbol};
55use rustc_target::callconv::FnAbi;
56pub use rustc_type_ir::data_structures::{DelayedMap, DelayedSet};
57pub use rustc_type_ir::fast_reject::DeepRejectCtxt;
58#[allow(
59 hidden_glob_reexports,
60 rustc::usage_of_type_ir_inherent,
61 rustc::non_glob_import_of_type_ir_inherent
62)]
63use rustc_type_ir::inherent;
64pub use rustc_type_ir::relate::VarianceDiagInfo;
65pub use rustc_type_ir::solve::{CandidatePreferenceMode, SizedTraitKind, VisibleForLeakCheck};
66pub use rustc_type_ir::*;
67#[allow(hidden_glob_reexports, unused_imports)]
68use rustc_type_ir::{InferCtxtLike, Interner};
69use tracing::{debug, instrument};
70pub use vtable::*;
71
72pub use self::closure::{
73 BorrowKind, CAPTURE_STRUCT_LOCAL, CaptureInfo, CapturedPlace, ClosureTypeInfo,
74 MinCaptureInformationMap, MinCaptureList, RootVariableMinCaptureList, UpvarCapture, UpvarId,
75 UpvarPath, analyze_coroutine_closure_captures, is_ancestor_or_same_capture,
76 place_to_string_for_capture,
77};
78pub use self::consts::{
79 AliasConst, AliasConstKind, AtomicOrdering, Const, ConstInt, ConstKind, ConstToValTreeResult,
80 Expr, ExprKind, LitToConstInput, ScalarInt, SimdAlign, ValTree, ValTreeKindExt, Value,
81 const_lit_matches_ty,
82};
83pub use self::context::{
84 CtxtInterners, CurrentGcx, FreeRegionInfo, GlobalCtxt, Lift, TyCtxt, TyCtxtFeed, tls,
85};
86pub use self::fold::*;
87pub use self::instance::{Instance, InstanceKind, ReifyReason, ShimKind};
88pub(crate) use self::list::RawList;
89pub use self::list::{List, ListWithCachedTypeInfo};
90pub use self::opaque_types::OpaqueTypeKey;
91pub use self::pattern::{Pattern, PatternKind};
92pub use self::predicate::{
93 AliasTerm, AliasTermKind, ArgOutlivesPredicate, Clause, ClauseKind, CoercePredicate,
94 ExistentialPredicate, ExistentialPredicateStableCmpExt, ExistentialProjection,
95 ExistentialTraitRef, HostEffectPredicate, NormalizesTo, OutlivesPredicate, PolyCoercePredicate,
96 PolyExistentialPredicate, PolyExistentialProjection, PolyExistentialTraitRef,
97 PolyProjectionPredicate, PolyRegionOutlivesPredicate, PolySubtypePredicate, PolyTraitPredicate,
98 PolyTraitRef, PolyTypeOutlivesPredicate, Predicate, PredicateKind, ProjectionPredicate,
99 RegionConstraint, RegionEqPredicate, RegionOutlivesPredicate, SubtypePredicate, TraitPredicate,
100 TraitRef, TypeOutlivesPredicate,
101};
102pub use self::region::{
103 EarlyParamRegion, LateParamRegion, LateParamRegionKind, Region, RegionKind, RegionVid,
104};
105pub use self::sty::{
106 Alias, AliasTy, AliasTyKind, Article, Binder, BoundConst, BoundRegion, BoundRegionKind,
107 BoundTy, BoundTyKind, BoundVariableKind, CanonicalPolyFnSig, CoroutineArgsExt, EarlyBinder,
108 FnSig, FnSigKind, FreeAliasTy, InherentAliasTy, InlineConstArgs, InlineConstArgsParts,
109 OpaqueAliasTy, ParamConst, ParamTy, PlaceholderConst, PlaceholderRegion, PlaceholderType,
110 PolyFnSig, ProjectionAliasTy, TyKind, TypeAndMut, TypingMode, TypingModeEqWrapper,
111 Unnormalized, UpvarArgs,
112};
113pub use self::trait_def::TraitDef;
114pub use self::typeck_results::{
115 CanonicalUserType, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations, IsIdentity,
116 Rust2024IncompatiblePatInfo, SplattedDef, TypeckResults, UserType, UserTypeAnnotationIndex,
117 UserTypeKind,
118};
119use crate::error::{OpaqueHiddenTypeMismatch, TypeMismatchReason};
120use crate::metadata::{AmbigModChild, ModChild};
121use crate::middle::privacy::EffectiveVisibilities;
122use crate::mir::{Body, CoroutineLayout, CoroutineSavedLocal, MirPhase, SourceInfo};
123use crate::query::{IntoQueryKey, Providers};
124use crate::ty;
125use crate::ty::codec::{TyDecoder, TyEncoder};
126pub use crate::ty::diagnostics::*;
127use crate::ty::fast_reject::SimplifiedType;
128use crate::ty::layout::{FnAbiError, LayoutError};
129use crate::ty::util::Discr;
130use crate::ty::walk::TypeWalker;
131
132pub mod abstract_const;
133pub mod adjustment;
134pub mod cast;
135pub mod codec;
136pub mod error;
137pub mod fast_reject;
138pub mod inhabitedness;
139pub mod layout;
140pub mod normalize_erasing_regions;
141pub mod offload_meta;
142pub mod pattern;
143pub mod print;
144pub mod relate;
145pub mod significant_drop_order;
146pub mod trait_def;
147pub mod typetree;
148pub mod util;
149pub mod vtable;
150
151mod adt;
152mod assoc;
153mod closure;
154mod consts;
155mod context;
156mod diagnostics;
157mod elaborate_impl;
158mod erase_regions;
159mod fold;
160mod generic_args;
161mod generics;
162mod impls_ty;
163mod instance;
164mod intrinsic;
165mod list;
166mod opaque_types;
167mod predicate;
168mod region;
169mod structural_impls;
170#[allow(hidden_glob_reexports)]
171mod sty;
172mod typeck_results;
173mod visit;
174
175#[derive(#[automatically_derived]
impl ::core::fmt::Debug for ResolverGlobalCtxt {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["visibilities_for_hashing", "expn_that_defined",
"effective_visibilities", "macro_reachable_adts",
"extern_crate_map", "maybe_unused_trait_imports",
"module_children", "ambig_module_children", "glob_map",
"main_def", "trait_impls", "proc_macros",
"confused_type_with_std_module", "doc_link_resolutions",
"doc_link_traits_in_scope", "all_macro_rules",
"stripped_cfg_items", "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)]
178pub struct ResolverGlobalCtxt {
179 pub visibilities_for_hashing: Vec<(LocalDefId, Visibility)>,
180 pub expn_that_defined: UnordMap<LocalDefId, ExpnId>,
182 pub effective_visibilities: EffectiveVisibilities,
183 pub macro_reachable_adts: FxIndexMap<LocalDefId, FxIndexSet<LocalDefId>>,
189 pub extern_crate_map: UnordMap<LocalDefId, CrateNum>,
190 pub maybe_unused_trait_imports: FxIndexSet<LocalDefId>,
191 pub module_children: LocalDefIdMap<Vec<ModChild>>,
192 pub ambig_module_children: LocalDefIdMap<Vec<AmbigModChild>>,
193 pub glob_map: FxIndexMap<LocalDefId, FxIndexSet<Symbol>>,
194 pub main_def: Option<MainDefinition>,
195 pub trait_impls: FxIndexMap<DefId, Vec<LocalDefId>>,
196 pub proc_macros: Vec<LocalDefId>,
199 pub confused_type_with_std_module: FxIndexMap<Span, Span>,
202 pub doc_link_resolutions: FxIndexMap<LocalDefId, DocLinkResMap>,
203 pub doc_link_traits_in_scope: FxIndexMap<LocalDefId, Vec<DefId>>,
204 pub all_macro_rules: UnordSet<Symbol>,
205 pub stripped_cfg_items: Vec<StrippedCfgItem>,
206 pub delegation_infos: FxIndexMap<LocalDefId, DelegationInfo>,
209}
210
211#[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", "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.id, &&self.def_id];
::core::fmt::Formatter::debug_struct_fields_finish(f,
"PerOwnerResolverData", names, values)
}
}Debug)]
212pub struct PerOwnerResolverData<'tcx> {
213 pub node_id_to_def_id: NodeMap<LocalDefId> = Default::default(),
214 pub lifetime_elision_allowed: bool = false,
216 pub label_res_map: NodeMap<ast::NodeId> = Default::default(),
219 pub lifetimes_res_map: NodeMap<LifetimeRes> = Default::default(),
221
222 pub trait_map: NodeMap<&'tcx [hir::TraitCandidate<'tcx>]> = Default::default(),
223
224 pub import_res: hir::def::PerNS<Option<Res<ast::NodeId>>> = Default::default(),
226
227 pub id: ast::NodeId,
229 pub def_id: LocalDefId,
231}
232
233impl<'tcx> PerOwnerResolverData<'tcx> {
234 pub fn new(id: ast::NodeId, def_id: LocalDefId) -> PerOwnerResolverData<'tcx> {
235 PerOwnerResolverData { id, def_id, .. }
236 }
237
238 pub fn get_label_res(&self, id: ast::NodeId) -> Option<ast::NodeId> {
240 self.label_res_map.get(&id).copied()
241 }
242
243 pub fn get_lifetime_res(&self, id: ast::NodeId) -> Option<LifetimeRes> {
245 self.lifetimes_res_map.get(&id).copied()
246 }
247}
248
249#[derive(#[automatically_derived]
impl<'tcx> ::core::fmt::Debug for ResolverAstLowering<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["partial_res_map", "extra_lifetime_params_map", "next_node_id",
"owners", "lint_buffer", "disambiguators"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.partial_res_map, &self.extra_lifetime_params_map,
&self.next_node_id, &self.owners, &self.lint_buffer,
&&self.disambiguators];
::core::fmt::Formatter::debug_struct_fields_finish(f,
"ResolverAstLowering", names, values)
}
}Debug)]
252pub struct ResolverAstLowering<'tcx> {
253 pub partial_res_map: NodeMap<hir::def::PartialRes>,
255 pub extra_lifetime_params_map: NodeMap<Vec<(Ident, ast::NodeId, MissingLifetimeKind)>>,
257
258 pub next_node_id: ast::NodeId,
259
260 pub owners: NodeMap<PerOwnerResolverData<'tcx>>,
261
262 pub lint_buffer: Steal<LintBuffer>,
264
265 pub disambiguators: LocalDefIdMap<Steal<PerParentDisambiguatorState>>,
266}
267
268#[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)]
269pub struct DelegationInfo {
270 pub resolution_id: Result<DefId, ErrorGuaranteed>,
276}
277
278#[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)]
279pub struct MainDefinition {
280 pub res: Res<ast::NodeId>,
281 pub is_import: bool,
282 pub span: Span,
283}
284
285impl MainDefinition {
286 pub fn opt_fn_def_id(self) -> Option<DefId> {
287 if let Res::Def(DefKind::Fn, def_id) = self.res { Some(def_id) } else { None }
288 }
289}
290
291#[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)]
292pub struct ImplTraitHeader<'tcx> {
293 pub trait_ref: ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>>,
294 pub polarity: ImplPolarity,
295 pub safety: hir::Safety,
296 pub constness: hir::Constness,
297}
298
299#[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)]
300#[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)]
301pub enum Asyncness {
302 Yes,
303 #[default]
304 No,
305}
306
307impl Asyncness {
308 pub fn is_async(self) -> bool {
309 #[allow(non_exhaustive_omitted_patterns)] match self {
Asyncness::Yes => true,
_ => false,
}matches!(self, Asyncness::Yes)
310 }
311}
312
313#[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)]
314pub enum Visibility<Id = LocalDefId> {
315 Public,
317 Restricted(Id),
319}
320
321impl Visibility {
322 pub fn to_string(self, def_id: LocalDefId, tcx: TyCtxt<'_>) -> String {
323 match self {
324 ty::Visibility::Restricted(restricted_id) => {
325 if restricted_id.is_top_level_module() {
326 "pub(crate)".to_string()
327 } else if restricted_id == tcx.parent_module_from_def_id(def_id).to_local_def_id() {
328 "pub(self)".to_string()
329 } else {
330 ::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!(
331 "pub(in crate{})",
332 tcx.def_path(restricted_id.to_def_id()).to_string_no_crate_verbose()
333 )
334 }
335 }
336 ty::Visibility::Public => "pub".to_string(),
337 }
338 }
339}
340
341#[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)]
342#[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)]
343pub struct ClosureSizeProfileData<'tcx> {
344 pub before_feature_tys: Ty<'tcx>,
346 pub after_feature_tys: Ty<'tcx>,
348}
349
350impl TyCtxt<'_> {
351 #[inline]
352 pub fn opt_parent(self, id: DefId) -> Option<DefId> {
353 self.def_key(id).parent.map(|index| DefId { index, ..id })
354 }
355
356 #[inline]
357 #[track_caller]
358 pub fn parent(self, id: DefId) -> DefId {
359 match self.opt_parent(id) {
360 Some(id) => id,
361 None => crate::util::bug::bug_fmt(format_args!("{0:?} doesn\'t have a parent", id))bug!("{id:?} doesn't have a parent"),
363 }
364 }
365
366 #[inline]
367 #[track_caller]
368 pub fn opt_local_parent(self, id: LocalDefId) -> Option<LocalDefId> {
369 self.opt_parent(id.to_def_id()).map(DefId::expect_local)
370 }
371
372 #[inline]
373 #[track_caller]
374 pub fn local_parent(self, id: impl Into<LocalDefId>) -> LocalDefId {
375 self.parent(id.into().to_def_id()).expect_local()
376 }
377
378 fn def_id_partial_cmp(self, lhs: DefId, rhs: DefId) -> Option<Ordering> {
382 if lhs.krate != rhs.krate {
384 return None;
385 }
386
387 let search = |mut start: DefId, finish: DefId, ord| {
391 while start.index != finish.index {
392 match self.opt_parent(start) {
393 Some(parent) => start.index = parent.index,
394 None => return None,
395 }
396 }
397 Some(ord)
398 };
399 match lhs.index.cmp(&rhs.index) {
400 Ordering::Equal => Some(Ordering::Equal),
401 Ordering::Less => search(rhs, lhs, Ordering::Greater),
402 Ordering::Greater => search(lhs, rhs, Ordering::Less),
403 }
404 }
405
406 pub fn is_descendant_of(self, descendant: DefId, ancestor: DefId) -> bool {
407 #[allow(non_exhaustive_omitted_patterns)] match self.def_id_partial_cmp(descendant,
ancestor) {
Some(Ordering::Less | Ordering::Equal) => true,
_ => false,
}matches!(
408 self.def_id_partial_cmp(descendant, ancestor),
409 Some(Ordering::Less | Ordering::Equal)
410 )
411 }
412}
413
414impl<Id> Visibility<Id> {
415 pub fn is_public(self) -> bool {
416 #[allow(non_exhaustive_omitted_patterns)] match self {
Visibility::Public => true,
_ => false,
}matches!(self, Visibility::Public)
417 }
418
419 pub fn map_id<OutId>(self, f: impl FnOnce(Id) -> OutId) -> Visibility<OutId> {
420 match self {
421 Visibility::Public => Visibility::Public,
422 Visibility::Restricted(id) => Visibility::Restricted(f(id)),
423 }
424 }
425}
426
427impl<Id: Into<DefId>> Visibility<Id> {
428 pub fn to_def_id(self) -> Visibility<DefId> {
429 self.map_id(Into::into)
430 }
431
432 pub fn is_accessible_from(self, module: impl Into<DefId>, tcx: TyCtxt<'_>) -> bool {
434 match self {
435 Visibility::Public => true,
437 Visibility::Restricted(id) => tcx.is_descendant_of(module.into(), id.into()),
438 }
439 }
440
441 pub fn partial_cmp(
442 self,
443 vis: Visibility<impl Into<DefId>>,
444 tcx: TyCtxt<'_>,
445 ) -> Option<Ordering> {
446 match (self, vis) {
447 (Visibility::Public, Visibility::Public) => Some(Ordering::Equal),
448 (Visibility::Public, Visibility::Restricted(_)) => Some(Ordering::Greater),
449 (Visibility::Restricted(_), Visibility::Public) => Some(Ordering::Less),
450 (Visibility::Restricted(lhs_id), Visibility::Restricted(rhs_id)) => {
451 let (lhs_id, rhs_id) = (lhs_id.into(), rhs_id.into());
452 tcx.def_id_partial_cmp(lhs_id, rhs_id)
453 }
454 }
455 }
456}
457
458impl<Id: Into<DefId> + Debug + Copy> Visibility<Id> {
459 #[track_caller]
461 pub fn greater_than(
462 self,
463 vis: Visibility<impl Into<DefId> + Debug + Copy>,
464 tcx: TyCtxt<'_>,
465 ) -> bool {
466 match self.partial_cmp(vis, tcx) {
467 Some(ord) => ord.is_gt(),
468 None => {
469 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:?}"));
470 false
471 }
472 }
473 }
474}
475
476impl Visibility<DefId> {
477 pub fn expect_local(self) -> Visibility {
478 self.map_id(|id| id.expect_local())
479 }
480
481 pub fn is_visible_locally(self) -> bool {
483 match self {
484 Visibility::Public => true,
485 Visibility::Restricted(def_id) => def_id.is_local(),
486 }
487 }
488}
489
490#[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)]
497pub struct CrateVariancesMap<'tcx> {
498 pub variances: DefIdMap<&'tcx [ty::Variance]>,
502}
503
504#[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)]
507pub struct CReaderCacheKey {
508 pub cnum: Option<CrateNum>,
509 pub pos: usize,
510}
511
512#[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)]
514#[rustc_diagnostic_item = "Ty"]
515#[rustc_pass_by_value]
516pub struct Ty<'tcx>(Interned<'tcx, WithCachedTypeInfo<TyKind<'tcx>>>);
517
518impl<'tcx> rustc_type_ir::inherent::IntoKind for Ty<'tcx> {
519 type Kind = TyKind<'tcx>;
520
521 fn kind(self) -> TyKind<'tcx> {
522 *self.kind()
523 }
524}
525
526impl<'tcx> rustc_type_ir::Flags for Ty<'tcx> {
527 fn flags(&self) -> TypeFlags {
528 self.0.flags
529 }
530
531 fn outer_exclusive_binder(&self) -> DebruijnIndex {
532 self.0.outer_exclusive_binder
533 }
534}
535
536#[derive(const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
CratePredicatesMap<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
CratePredicatesMap { predicates: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for CratePredicatesMap<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f,
"CratePredicatesMap", "predicates", &&self.predicates)
}
}Debug)]
543pub struct CratePredicatesMap<'tcx> {
544 pub predicates: DefIdMap<&'tcx [(Clause<'tcx>, Span)]>,
548}
549
550#[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)]
551pub struct Term<'tcx> {
552 ptr: NonNull<()>,
553 marker: PhantomData<(Ty<'tcx>, Const<'tcx>)>,
554}
555
556impl<'tcx> rustc_type_ir::inherent::Term<TyCtxt<'tcx>> for Term<'tcx> {}
557
558impl<'tcx> rustc_type_ir::inherent::IntoKind for Term<'tcx> {
559 type Kind = TermKind<'tcx>;
560
561 fn kind(self) -> Self::Kind {
562 self.kind()
563 }
564}
565
566unsafe impl<'tcx> rustc_data_structures::sync::DynSend for Term<'tcx> where
567 &'tcx (Ty<'tcx>, Const<'tcx>): rustc_data_structures::sync::DynSend
568{
569}
570unsafe impl<'tcx> rustc_data_structures::sync::DynSync for Term<'tcx> where
571 &'tcx (Ty<'tcx>, Const<'tcx>): rustc_data_structures::sync::DynSync
572{
573}
574unsafe impl<'tcx> Send for Term<'tcx> where &'tcx (Ty<'tcx>, Const<'tcx>): Send {}
575unsafe impl<'tcx> Sync for Term<'tcx> where &'tcx (Ty<'tcx>, Const<'tcx>): Sync {}
576
577impl Debug for Term<'_> {
578 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
579 match self.kind() {
580 TermKind::Ty(ty) => f.write_fmt(format_args!("Term::Ty({0:?})", ty))write!(f, "Term::Ty({ty:?})"),
581 TermKind::Const(ct) => f.write_fmt(format_args!("Term::Const({0:?})", ct))write!(f, "Term::Const({ct:?})"),
582 }
583 }
584}
585
586impl<'tcx> From<Ty<'tcx>> for Term<'tcx> {
587 fn from(ty: Ty<'tcx>) -> Self {
588 TermKind::Ty(ty).pack()
589 }
590}
591
592impl<'tcx> From<Const<'tcx>> for Term<'tcx> {
593 fn from(c: Const<'tcx>) -> Self {
594 TermKind::Const(c).pack()
595 }
596}
597
598impl<'tcx> StableHash for Term<'tcx> {
599 fn stable_hash<Hcx: StableHashCtxt>(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
600 self.kind().stable_hash(hcx, hasher);
601 }
602}
603
604impl<'tcx> TypeFoldable<TyCtxt<'tcx>> for Term<'tcx> {
605 fn try_fold_with<F: FallibleTypeFolder<TyCtxt<'tcx>>>(
606 self,
607 folder: &mut F,
608 ) -> Result<Self, F::Error> {
609 match self.kind() {
610 ty::TermKind::Ty(ty) => ty.try_fold_with(folder).map(Into::into),
611 ty::TermKind::Const(ct) => ct.try_fold_with(folder).map(Into::into),
612 }
613 }
614
615 fn fold_with<F: TypeFolder<TyCtxt<'tcx>>>(self, folder: &mut F) -> Self {
616 match self.kind() {
617 ty::TermKind::Ty(ty) => ty.fold_with(folder).into(),
618 ty::TermKind::Const(ct) => ct.fold_with(folder).into(),
619 }
620 }
621}
622
623impl<'tcx> TypeVisitable<TyCtxt<'tcx>> for Term<'tcx> {
624 fn visit_with<V: TypeVisitor<TyCtxt<'tcx>>>(&self, visitor: &mut V) -> V::Result {
625 match self.kind() {
626 ty::TermKind::Ty(ty) => ty.visit_with(visitor),
627 ty::TermKind::Const(ct) => ct.visit_with(visitor),
628 }
629 }
630}
631
632impl<'tcx, E: TyEncoder<'tcx>> Encodable<E> for Term<'tcx> {
633 fn encode(&self, e: &mut E) {
634 self.kind().encode(e)
635 }
636}
637
638impl<'tcx, D: TyDecoder<'tcx>> Decodable<D> for Term<'tcx> {
639 fn decode(d: &mut D) -> Self {
640 let res: TermKind<'tcx> = Decodable::decode(d);
641 res.pack()
642 }
643}
644
645impl<'tcx> Term<'tcx> {
646 #[inline]
647 pub fn kind(self) -> TermKind<'tcx> {
648 let ptr =
649 unsafe { self.ptr.map_addr(|addr| NonZero::new_unchecked(addr.get() & !TAG_MASK)) };
650 unsafe {
654 match self.ptr.addr().get() & TAG_MASK {
655 TYPE_TAG => TermKind::Ty(Ty(Interned::new_unchecked(
656 ptr.cast::<WithCachedTypeInfo<ty::TyKind<'tcx>>>().as_ref(),
657 ))),
658 CONST_TAG => TermKind::Const(ty::Const(Interned::new_unchecked(
659 ptr.cast::<WithCachedTypeInfo<ty::ConstKind<'tcx>>>().as_ref(),
660 ))),
661 _ => core::intrinsics::unreachable(),
662 }
663 }
664 }
665
666 pub fn as_type(&self) -> Option<Ty<'tcx>> {
667 if let TermKind::Ty(ty) = self.kind() { Some(ty) } else { None }
668 }
669
670 pub fn expect_type(&self) -> Ty<'tcx> {
671 self.as_type().expect("expected a type, but found a const")
672 }
673
674 pub fn as_const(&self) -> Option<Const<'tcx>> {
675 if let TermKind::Const(c) = self.kind() { Some(c) } else { None }
676 }
677
678 pub fn expect_const(&self) -> Const<'tcx> {
679 self.as_const().expect("expected a const, but found a type")
680 }
681
682 pub fn into_arg(self) -> GenericArg<'tcx> {
683 match self.kind() {
684 TermKind::Ty(ty) => ty.into(),
685 TermKind::Const(c) => c.into(),
686 }
687 }
688
689 pub fn to_alias_term(self) -> Option<AliasTerm<'tcx>> {
690 match self.kind() {
691 TermKind::Ty(ty) => match *ty.kind() {
692 ty::Alias(_, alias_ty) => Some(alias_ty.into()),
693 _ => None,
694 },
695 TermKind::Const(ct) => match ct.kind() {
696 ConstKind::Alias(_, alias_const) => Some(alias_const.into()),
697 _ => None,
698 },
699 }
700 }
701
702 pub fn is_non_rigid_alias(self) -> bool {
703 match self.kind() {
704 ty::TermKind::Ty(ty) => match ty.kind() {
705 ty::Alias(ty::IsRigid::No, _) => true,
706 _ => false,
707 },
708 ty::TermKind::Const(ct) => match ct.kind() {
709 ty::ConstKind::Alias(ty::IsRigid::No, _) => true,
710 _ => false,
711 },
712 }
713 }
714
715 pub fn is_infer(&self) -> bool {
716 match self.kind() {
717 TermKind::Ty(ty) => ty.is_ty_var(),
718 TermKind::Const(ct) => ct.is_ct_infer(),
719 }
720 }
721
722 pub fn is_trivially_wf(&self, tcx: TyCtxt<'tcx>) -> bool {
723 match self.kind() {
724 TermKind::Ty(ty) => ty.is_trivially_wf(tcx),
725 TermKind::Const(ct) => ct.is_trivially_wf(),
726 }
727 }
728
729 pub fn walk(self) -> TypeWalker<TyCtxt<'tcx>> {
740 TypeWalker::new(self.into())
741 }
742}
743
744const TAG_MASK: usize = 0b11;
745const TYPE_TAG: usize = 0b00;
746const CONST_TAG: usize = 0b01;
747
748impl<'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>)]
749impl<'tcx> TermKind<'tcx> {
750 #[inline]
751 fn pack(self) -> Term<'tcx> {
752 let (tag, ptr) = match self {
753 TermKind::Ty(ty) => {
754 assert_eq!(align_of_val(&*ty.0.0) & TAG_MASK, 0);
756 (TYPE_TAG, NonNull::from(ty.0.0).cast())
757 }
758 TermKind::Const(ct) => {
759 assert_eq!(align_of_val(&*ct.0.0) & TAG_MASK, 0);
761 (CONST_TAG, NonNull::from(ct.0.0).cast())
762 }
763 };
764
765 Term { ptr: ptr.map_addr(|addr| addr | tag), marker: PhantomData }
766 }
767}
768
769#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for InstantiatedPredicates<'tcx> {
#[inline]
fn clone(&self) -> InstantiatedPredicates<'tcx> {
InstantiatedPredicates {
predicates: ::core::clone::Clone::clone(&self.predicates),
spans: ::core::clone::Clone::clone(&self.spans),
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for InstantiatedPredicates<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"InstantiatedPredicates", "predicates", &self.predicates, "spans",
&&self.spans)
}
}Debug)]
789pub struct InstantiatedPredicates<'tcx> {
790 pub predicates: Vec<Unnormalized<'tcx, Clause<'tcx>>>,
791 pub spans: Vec<Span>,
792}
793
794impl<'tcx> InstantiatedPredicates<'tcx> {
795 pub fn empty() -> InstantiatedPredicates<'tcx> {
796 InstantiatedPredicates { predicates: ::alloc::vec::Vec::new()vec![], spans: ::alloc::vec::Vec::new()vec![] }
797 }
798
799 pub fn is_empty(&self) -> bool {
800 self.predicates.is_empty()
801 }
802
803 pub fn iter(&self) -> <&Self as IntoIterator>::IntoIter {
804 self.into_iter()
805 }
806}
807
808impl<'tcx> IntoIterator for InstantiatedPredicates<'tcx> {
809 type Item = (Unnormalized<'tcx, Clause<'tcx>>, Span);
810
811 type IntoIter = std::iter::Zip<
812 std::vec::IntoIter<Unnormalized<'tcx, Clause<'tcx>>>,
813 std::vec::IntoIter<Span>,
814 >;
815
816 fn into_iter(self) -> Self::IntoIter {
817 if true {
{
match (&self.predicates.len(), &self.spans.len()) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
}
};
};debug_assert_eq!(self.predicates.len(), self.spans.len());
818 std::iter::zip(self.predicates, self.spans)
819 }
820}
821
822impl<'a, 'tcx> IntoIterator for &'a InstantiatedPredicates<'tcx> {
823 type Item = (Unnormalized<'tcx, Clause<'tcx>>, Span);
824
825 type IntoIter = std::iter::Zip<
826 std::iter::Copied<std::slice::Iter<'a, Unnormalized<'tcx, Clause<'tcx>>>>,
827 std::iter::Copied<std::slice::Iter<'a, Span>>,
828 >;
829
830 fn into_iter(self) -> Self::IntoIter {
831 if true {
{
match (&self.predicates.len(), &self.spans.len()) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
}
};
};debug_assert_eq!(self.predicates.len(), self.spans.len());
832 std::iter::zip(self.predicates.iter().copied(), self.spans.iter().copied())
833 }
834}
835
836#[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)]
837pub struct ProvisionalHiddenType<'tcx> {
838 pub span: Span,
852
853 pub ty: Ty<'tcx>,
866}
867
868#[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)]
870pub enum DefiningScopeKind {
871 HirTypeck,
876 MirBorrowck,
877}
878
879impl<'tcx> ProvisionalHiddenType<'tcx> {
880 pub fn new_error(tcx: TyCtxt<'tcx>, guar: ErrorGuaranteed) -> ProvisionalHiddenType<'tcx> {
881 ProvisionalHiddenType { span: DUMMY_SP, ty: Ty::new_error(tcx, guar) }
882 }
883
884 pub fn build_mismatch_error(
885 &self,
886 other: &Self,
887 tcx: TyCtxt<'tcx>,
888 ) -> Result<Diag<'tcx>, ErrorGuaranteed> {
889 (self.ty, other.ty).error_reported()?;
890 let sub_diag = if self.span == other.span {
892 TypeMismatchReason::ConflictType { span: self.span }
893 } else {
894 TypeMismatchReason::PreviousUse { span: self.span }
895 };
896 Ok(tcx.dcx().create_err(OpaqueHiddenTypeMismatch {
897 self_ty: self.ty,
898 other_ty: other.ty,
899 other_span: other.span,
900 sub: sub_diag,
901 }))
902 }
903
904 x;#[instrument(level = "debug", skip(tcx), ret)]
905 pub fn remap_generic_params_to_declaration_params(
906 self,
907 opaque_type_key: OpaqueTypeKey<'tcx>,
908 tcx: TyCtxt<'tcx>,
909 defining_scope_kind: DefiningScopeKind,
910 ) -> DefinitionSiteHiddenType<'tcx> {
911 let OpaqueTypeKey { def_id, args } = opaque_type_key;
912
913 let id_args = GenericArgs::identity_for_item(tcx, def_id);
920 debug!(?id_args);
921
922 let map = args.iter().zip(id_args).collect();
926 debug!("map = {:#?}", map);
927
928 let ty = match defining_scope_kind {
934 DefiningScopeKind::HirTypeck => {
935 fold_regions(tcx, self.ty, |_, _| tcx.lifetimes.re_erased)
936 }
937 DefiningScopeKind::MirBorrowck => self.ty,
938 };
939 let result_ty = ty.fold_with(&mut opaque_types::ReverseMapper::new(tcx, map, self.span));
940 if cfg!(debug_assertions) && matches!(defining_scope_kind, DefiningScopeKind::HirTypeck) {
941 assert_eq!(result_ty, fold_regions(tcx, result_ty, |_, _| tcx.lifetimes.re_erased));
942 }
943 DefinitionSiteHiddenType { span: self.span, ty: ty::EarlyBinder::bind(tcx, result_ty) }
944 }
945}
946
947#[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)]
948pub struct DefinitionSiteHiddenType<'tcx> {
949 pub span: Span,
962
963 pub ty: ty::EarlyBinder<'tcx, Ty<'tcx>>,
965}
966
967impl<'tcx> DefinitionSiteHiddenType<'tcx> {
968 pub fn new_error(tcx: TyCtxt<'tcx>, guar: ErrorGuaranteed) -> DefinitionSiteHiddenType<'tcx> {
969 DefinitionSiteHiddenType {
970 span: DUMMY_SP,
971 ty: ty::EarlyBinder::bind(tcx, Ty::new_error(tcx, guar)),
972 }
973 }
974
975 pub fn build_mismatch_error(
976 &self,
977 other: &Self,
978 tcx: TyCtxt<'tcx>,
979 ) -> Result<Diag<'tcx>, ErrorGuaranteed> {
980 let self_ty = self.ty.instantiate_identity().skip_norm_wip();
981 let other_ty = other.ty.instantiate_identity().skip_norm_wip();
982 (self_ty, other_ty).error_reported()?;
983 let sub_diag = if self.span == other.span {
985 TypeMismatchReason::ConflictType { span: self.span }
986 } else {
987 TypeMismatchReason::PreviousUse { span: self.span }
988 };
989 Ok(tcx.dcx().create_err(OpaqueHiddenTypeMismatch {
990 self_ty,
991 other_ty,
992 other_span: other.span,
993 sub: sub_diag,
994 }))
995 }
996}
997
998pub type Clauses<'tcx> = &'tcx ListWithCachedTypeInfo<Clause<'tcx>>;
999
1000impl<'tcx> rustc_type_ir::Flags for Clauses<'tcx> {
1001 fn flags(&self) -> TypeFlags {
1002 (**self).flags()
1003 }
1004
1005 fn outer_exclusive_binder(&self) -> DebruijnIndex {
1006 (**self).outer_exclusive_binder()
1007 }
1008}
1009
1010#[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)]
1016#[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)]
1017pub struct ParamEnv<'tcx> {
1018 caller_bounds: Clauses<'tcx>,
1024}
1025
1026impl<'tcx> rustc_type_ir::inherent::ParamEnv<TyCtxt<'tcx>> for ParamEnv<'tcx> {
1027 fn caller_bounds(self) -> impl inherent::SliceLike<Item = ty::Clause<'tcx>> {
1028 self.caller_bounds()
1029 }
1030}
1031
1032impl<'tcx> ParamEnv<'tcx> {
1033 #[inline]
1040 pub fn empty() -> Self {
1041 Self::new(ListWithCachedTypeInfo::empty())
1042 }
1043
1044 #[inline]
1045 pub fn caller_bounds(self) -> Clauses<'tcx> {
1046 self.caller_bounds
1047 }
1048
1049 #[inline]
1051 pub fn new(caller_bounds: Clauses<'tcx>) -> Self {
1052 ParamEnv { caller_bounds }
1053 }
1054
1055 pub fn and<T: TypeVisitable<TyCtxt<'tcx>>>(self, value: T) -> ParamEnvAnd<'tcx, T> {
1057 ParamEnvAnd { param_env: self, value }
1058 }
1059
1060 pub fn with_normalized(self, tcx: TyCtxt<'tcx>) -> ParamEnv<'tcx> {
1062 if tcx.next_trait_solver_globally() {
1065 self
1066 } else {
1067 ParamEnv::new(tcx.reveal_opaque_types_in_bounds(self.caller_bounds))
1068 }
1069 }
1070}
1071
1072#[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)]
1073#[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)]
1074pub struct ParamEnvAnd<'tcx, T> {
1075 pub param_env: ParamEnv<'tcx>,
1076 pub value: T,
1077}
1078
1079#[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)]
1090#[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)]
1091pub struct TypingEnv<'tcx> {
1092 #[type_foldable(identity)]
1093 #[type_visitable(ignore)]
1094 typing_mode: TypingModeEqWrapper<'tcx>,
1095 pub param_env: ParamEnv<'tcx>,
1096}
1097
1098impl<'tcx> TypingEnv<'tcx> {
1099 pub fn new(param_env: ParamEnv<'tcx>, typing_mode: TypingMode<'tcx>) -> Self {
1100 Self { typing_mode: TypingModeEqWrapper(typing_mode), param_env }
1101 }
1102
1103 pub fn typing_mode(&self) -> TypingMode<'tcx> {
1104 self.typing_mode.0
1105 }
1106
1107 pub fn fully_monomorphized() -> TypingEnv<'tcx> {
1115 Self::new(ParamEnv::empty(), TypingMode::Codegen)
1116 }
1117
1118 pub fn non_body_analysis(
1124 tcx: TyCtxt<'tcx>,
1125 def_id: impl IntoQueryKey<DefId>,
1126 ) -> TypingEnv<'tcx> {
1127 let def_id = def_id.into_query_key();
1128 Self::new(tcx.param_env(def_id), TypingMode::non_body_analysis())
1129 }
1130
1131 pub fn post_typeck_until_borrowck_for_mir_build(
1136 tcx: TyCtxt<'tcx>,
1137 def_id: LocalDefId,
1138 ) -> TypingEnv<'tcx> {
1139 if tcx.use_typing_mode_post_typeck_until_borrowck() {
1140 TypingEnv::new(tcx.param_env(def_id.to_def_id()), ty::TypingMode::borrowck(tcx, def_id))
1141 } else {
1142 TypingEnv::non_body_analysis(tcx, def_id)
1145 }
1146 }
1147
1148 pub fn post_analysis(tcx: TyCtxt<'tcx>, def_id: impl IntoQueryKey<DefId>) -> TypingEnv<'tcx> {
1149 TypingEnv::new(tcx.param_env_normalized_for_post_analysis(def_id), TypingMode::PostAnalysis)
1150 }
1151
1152 pub fn codegen(tcx: TyCtxt<'tcx>, def_id: impl IntoQueryKey<DefId>) -> TypingEnv<'tcx> {
1153 TypingEnv::new(tcx.param_env_normalized_for_post_analysis(def_id), TypingMode::Codegen)
1154 }
1155
1156 pub fn with_post_analysis_normalized(self, tcx: TyCtxt<'tcx>) -> TypingEnv<'tcx> {
1159 let TypingEnv { typing_mode, param_env } = self;
1160 match typing_mode.0.assert_not_erased() {
1161 TypingMode::Coherence
1162 | TypingMode::Typeck { .. }
1163 | TypingMode::PostTypeckUntilBorrowck { .. }
1164 | TypingMode::PostBorrowck { .. } => {}
1165 TypingMode::PostAnalysis | TypingMode::Codegen => return self,
1166 }
1167
1168 let param_env = param_env.with_normalized(tcx);
1169 TypingEnv::new(param_env, TypingMode::PostAnalysis)
1170 }
1171
1172 pub fn with_codegen_normalized(self, tcx: TyCtxt<'tcx>) -> TypingEnv<'tcx> {
1175 let TypingEnv { typing_mode, param_env } = self;
1176 match typing_mode.0.assert_not_erased() {
1177 TypingMode::Coherence
1178 | TypingMode::Typeck { .. }
1179 | TypingMode::PostTypeckUntilBorrowck { .. }
1180 | TypingMode::PostBorrowck { .. }
1181 | TypingMode::PostAnalysis => {}
1182 TypingMode::Codegen => return self,
1183 }
1184
1185 let param_env = param_env.with_normalized(tcx);
1186 TypingEnv::new(param_env, TypingMode::Codegen)
1187 }
1188
1189 pub fn as_query_input<T>(self, value: T) -> PseudoCanonicalInput<'tcx, T>
1194 where
1195 T: TypeVisitable<TyCtxt<'tcx>>,
1196 {
1197 PseudoCanonicalInput { typing_env: self, value }
1210 }
1211}
1212
1213#[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)]
1223#[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)]
1224pub struct PseudoCanonicalInput<'tcx, T> {
1225 pub typing_env: TypingEnv<'tcx>,
1226 pub value: T,
1227}
1228
1229#[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)]
1230pub struct Destructor {
1231 pub did: DefId,
1233}
1234
1235#[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)]
1237pub struct AsyncDestructor {
1238 pub impl_did: DefId,
1240}
1241
1242#[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)]
1243pub struct VariantFlags(u8);
1244impl 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 {
#[inline]
pub const fn empty() -> Self {
Self(<u8 as ::bitflags::Bits>::EMPTY)
}
#[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)
}
#[inline]
pub const fn bits(&self) -> u8 { self.0 }
#[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 }
}
#[inline]
pub const fn from_bits_truncate(bits: u8) -> Self {
Self(bits & Self::all().0)
}
#[inline]
pub const fn from_bits_retain(bits: u8) -> Self { Self(bits) }
#[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
}
#[inline]
pub const fn is_empty(&self) -> bool {
self.0 == <u8 as ::bitflags::Bits>::EMPTY
}
#[inline]
pub const fn is_all(&self) -> bool {
Self::all().0 | self.0 == self.0
}
#[inline]
pub const fn intersects(&self, other: Self) -> bool {
self.0 & other.0 != <u8 as ::bitflags::Bits>::EMPTY
}
#[inline]
pub const fn contains(&self, other: Self) -> bool {
self.0 & other.0 == other.0
}
#[inline]
pub fn insert(&mut self, other: Self) {
*self = Self(self.0).union(other);
}
#[inline]
pub fn remove(&mut self, other: Self) {
*self = Self(self.0).difference(other);
}
#[inline]
pub fn toggle(&mut self, other: Self) {
*self = Self(self.0).symmetric_difference(other);
}
#[inline]
pub fn set(&mut self, other: Self, value: bool) {
if value { self.insert(other); } else { self.remove(other); }
}
#[inline]
#[must_use]
pub const fn intersection(self, other: Self) -> Self {
Self(self.0 & other.0)
}
#[inline]
#[must_use]
pub const fn union(self, other: Self) -> Self {
Self(self.0 | other.0)
}
#[inline]
#[must_use]
pub const fn difference(self, other: Self) -> Self {
Self(self.0 & !other.0)
}
#[inline]
#[must_use]
pub const fn symmetric_difference(self, other: Self) -> Self {
Self(self.0 ^ other.0)
}
#[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;
#[inline]
fn bitor(self, other: VariantFlags) -> Self { self.union(other) }
}
impl ::bitflags::__private::core::ops::BitOrAssign for VariantFlags {
#[inline]
fn bitor_assign(&mut self, other: Self) { self.insert(other); }
}
impl ::bitflags::__private::core::ops::BitXor for VariantFlags {
type Output = Self;
#[inline]
fn bitxor(self, other: Self) -> Self {
self.symmetric_difference(other)
}
}
impl ::bitflags::__private::core::ops::BitXorAssign for VariantFlags {
#[inline]
fn bitxor_assign(&mut self, other: Self) { self.toggle(other); }
}
impl ::bitflags::__private::core::ops::BitAnd for VariantFlags {
type Output = Self;
#[inline]
fn bitand(self, other: Self) -> Self { self.intersection(other) }
}
impl ::bitflags::__private::core::ops::BitAndAssign for VariantFlags {
#[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;
#[inline]
fn sub(self, other: Self) -> Self { self.difference(other) }
}
impl ::bitflags::__private::core::ops::SubAssign for VariantFlags {
#[inline]
fn sub_assign(&mut self, other: Self) { self.remove(other); }
}
impl ::bitflags::__private::core::ops::Not for VariantFlags {
type Output = Self;
#[inline]
fn not(self) -> Self { self.complement() }
}
impl ::bitflags::__private::core::iter::Extend<VariantFlags> for
VariantFlags {
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 {
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 {
#[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()))
}
#[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! {
1245 impl VariantFlags: u8 {
1246 const NO_VARIANT_FLAGS = 0;
1247 const IS_FIELD_LIST_NON_EXHAUSTIVE = 1 << 0;
1249 }
1250}
1251impl ::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 }
1252
1253#[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)]
1255pub struct VariantDef {
1256 pub def_id: DefId,
1259 pub ctor: Option<(CtorKind, DefId)>,
1262 pub name: Symbol,
1264 pub discr: VariantDiscr,
1266 pub fields: IndexVec<FieldIdx, FieldDef>,
1268 tainted: Option<ErrorGuaranteed>,
1270 flags: VariantFlags,
1272}
1273
1274impl VariantDef {
1275 #[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(1291u32),
::tracing_core::__macro_support::Option::Some("rustc_middle::ty"),
::tracing_core::field::FieldSet::new(&["name",
"variant_did", "ctor", "discr", "fields", "parent_did",
"recover_tainted", "is_field_list_non_exhaustive"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = meta.fields().iter();
meta.fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&::tracing::field::debug(&name)
as &dyn Value)),
(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&::tracing::field::debug(&variant_did)
as &dyn Value)),
(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&::tracing::field::debug(&ctor)
as &dyn Value)),
(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&::tracing::field::debug(&discr)
as &dyn Value)),
(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&::tracing::field::debug(&fields)
as &dyn Value)),
(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&::tracing::field::debug(&parent_did)
as &dyn Value)),
(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&::tracing::field::debug(&recover_tainted)
as &dyn Value)),
(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&is_field_list_non_exhaustive
as &dyn Value))])
})
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[warn(clippy :: suspicious_else_formatting)]
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy ::
needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return: Self = loop {};
return __tracing_attr_fake_return;
}
{
let mut flags = VariantFlags::NO_VARIANT_FLAGS;
if is_field_list_non_exhaustive {
flags |= VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE;
}
VariantDef {
def_id: variant_did.unwrap_or(parent_did),
ctor,
name,
discr,
fields,
flags,
tainted: recover_tainted,
}
}
}
}#[instrument(level = "debug")]
1292 pub fn new(
1293 name: Symbol,
1294 variant_did: Option<DefId>,
1295 ctor: Option<(CtorKind, DefId)>,
1296 discr: VariantDiscr,
1297 fields: IndexVec<FieldIdx, FieldDef>,
1298 parent_did: DefId,
1299 recover_tainted: Option<ErrorGuaranteed>,
1300 is_field_list_non_exhaustive: bool,
1301 ) -> Self {
1302 let mut flags = VariantFlags::NO_VARIANT_FLAGS;
1303 if is_field_list_non_exhaustive {
1304 flags |= VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE;
1305 }
1306
1307 VariantDef {
1308 def_id: variant_did.unwrap_or(parent_did),
1309 ctor,
1310 name,
1311 discr,
1312 fields,
1313 flags,
1314 tainted: recover_tainted,
1315 }
1316 }
1317
1318 #[inline]
1324 pub fn is_field_list_non_exhaustive(&self) -> bool {
1325 self.flags.intersects(VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE)
1326 }
1327
1328 #[inline]
1331 pub fn field_list_has_applicable_non_exhaustive(&self) -> bool {
1332 self.is_field_list_non_exhaustive() && !self.def_id.is_local()
1333 }
1334
1335 pub fn ident(&self, tcx: TyCtxt<'_>) -> Ident {
1337 Ident::new(self.name, tcx.def_ident_span(self.def_id).unwrap())
1338 }
1339
1340 #[inline]
1342 pub fn has_errors(&self) -> Result<(), ErrorGuaranteed> {
1343 self.tainted.map_or(Ok(()), Err)
1344 }
1345
1346 #[inline]
1347 pub fn ctor_kind(&self) -> Option<CtorKind> {
1348 self.ctor.map(|(kind, _)| kind)
1349 }
1350
1351 #[inline]
1352 pub fn ctor_def_id(&self) -> Option<DefId> {
1353 self.ctor.map(|(_, def_id)| def_id)
1354 }
1355
1356 #[inline]
1360 pub fn single_field(&self) -> &FieldDef {
1361 if !(self.fields.len() == 1) {
::core::panicking::panic("assertion failed: self.fields.len() == 1")
};assert!(self.fields.len() == 1);
1362
1363 &self.fields[FieldIdx::ZERO]
1364 }
1365
1366 #[inline]
1368 pub fn tail_opt(&self) -> Option<&FieldDef> {
1369 self.fields.raw.last()
1370 }
1371
1372 #[inline]
1378 pub fn tail(&self) -> &FieldDef {
1379 self.tail_opt().expect("expected unsized ADT to have a tail field")
1380 }
1381
1382 pub fn has_unsafe_fields(&self) -> bool {
1384 self.fields.iter().any(|x| x.safety.is_unsafe())
1385 }
1386}
1387
1388impl PartialEq for VariantDef {
1389 #[inline]
1390 fn eq(&self, other: &Self) -> bool {
1391 let Self {
1399 def_id: lhs_def_id,
1400 ctor: _,
1401 name: _,
1402 discr: _,
1403 fields: _,
1404 flags: _,
1405 tainted: _,
1406 } = &self;
1407 let Self {
1408 def_id: rhs_def_id,
1409 ctor: _,
1410 name: _,
1411 discr: _,
1412 fields: _,
1413 flags: _,
1414 tainted: _,
1415 } = other;
1416
1417 let res = lhs_def_id == rhs_def_id;
1418
1419 if truecfg!(debug_assertions) && res {
1421 let deep = self.ctor == other.ctor
1422 && self.name == other.name
1423 && self.discr == other.discr
1424 && self.fields == other.fields
1425 && self.flags == other.flags;
1426 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");
1427 }
1428
1429 res
1430 }
1431}
1432
1433impl Eq for VariantDef {}
1434
1435impl Hash for VariantDef {
1436 #[inline]
1437 fn hash<H: Hasher>(&self, s: &mut H) {
1438 let Self { def_id, ctor: _, name: _, discr: _, fields: _, flags: _, tainted: _ } = &self;
1446 def_id.hash(s)
1447 }
1448}
1449
1450#[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)]
1451pub enum VariantDiscr {
1452 Explicit(DefId),
1455
1456 Relative(u32),
1461}
1462
1463#[derive(#[automatically_derived]
impl ::core::fmt::Debug for FieldDef {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f, "FieldDef",
"did", &self.did, "name", &self.name, "vis", &self.vis, "safety",
&self.safety, "value", &&self.value)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for FieldDef {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
FieldDef {
did: ref __binding_0,
name: ref __binding_1,
vis: ref __binding_2,
safety: ref __binding_3,
value: ref __binding_4 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for FieldDef {
fn encode(&self, __encoder: &mut __E) {
match *self {
FieldDef {
did: ref __binding_0,
name: ref __binding_1,
vis: ref __binding_2,
safety: ref __binding_3,
value: ref __binding_4 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_2,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_3,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_4,
__encoder);
}
}
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for FieldDef {
fn decode(__decoder: &mut __D) -> Self {
FieldDef {
did: ::rustc_serialize::Decodable::decode(__decoder),
name: ::rustc_serialize::Decodable::decode(__decoder),
vis: ::rustc_serialize::Decodable::decode(__decoder),
safety: ::rustc_serialize::Decodable::decode(__decoder),
value: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable)]
1464pub struct FieldDef {
1465 pub did: DefId,
1466 pub name: Symbol,
1467 pub vis: Visibility<DefId>,
1468 pub safety: hir::Safety,
1469 pub value: Option<DefId>,
1470}
1471
1472impl PartialEq for FieldDef {
1473 #[inline]
1474 fn eq(&self, other: &Self) -> bool {
1475 let Self { did: lhs_did, name: _, vis: _, safety: _, value: _ } = &self;
1483
1484 let Self { did: rhs_did, name: _, vis: _, safety: _, value: _ } = other;
1485
1486 let res = lhs_did == rhs_did;
1487
1488 if truecfg!(debug_assertions) && res {
1490 let deep =
1491 self.name == other.name && self.vis == other.vis && self.safety == other.safety;
1492 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");
1493 }
1494
1495 res
1496 }
1497}
1498
1499impl Eq for FieldDef {}
1500
1501impl Hash for FieldDef {
1502 #[inline]
1503 fn hash<H: Hasher>(&self, s: &mut H) {
1504 let Self { did, name: _, vis: _, safety: _, value: _ } = &self;
1512
1513 did.hash(s)
1514 }
1515}
1516
1517impl<'tcx> FieldDef {
1518 pub fn ty(
1521 &self,
1522 tcx: TyCtxt<'tcx>,
1523 args: GenericArgsRef<'tcx>,
1524 ) -> Unnormalized<'tcx, Ty<'tcx>> {
1525 tcx.type_of(self.did).instantiate(tcx, args)
1526 }
1527
1528 pub fn ident(&self, tcx: TyCtxt<'_>) -> Ident {
1530 Ident::new(self.name, tcx.def_ident_span(self.did).unwrap())
1531 }
1532}
1533
1534#[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)]
1535pub enum ImplOverlapKind {
1536 Permitted {
1538 marker: bool,
1540 },
1541}
1542
1543#[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)]
1546pub enum ImplTraitInTraitData {
1547 Trait { fn_def_id: DefId, opaque_def_id: DefId },
1548 Impl { fn_def_id: DefId },
1549}
1550
1551impl<'tcx> TyCtxt<'tcx> {
1552 pub fn typeck_body(self, body: hir::BodyId) -> &'tcx TypeckResults<'tcx> {
1553 self.typeck(self.hir_body_owner_def_id(body))
1554 }
1555
1556 pub fn provided_trait_methods(self, id: DefId) -> impl 'tcx + Iterator<Item = &'tcx AssocItem> {
1557 self.associated_items(id)
1558 .in_definition_order()
1559 .filter(move |item| item.is_fn() && item.defaultness(self).has_value())
1560 }
1561
1562 pub fn repr_options_of_def(self, did: LocalDefId) -> ReprOptions {
1563 let mut flags = ReprFlags::empty();
1564 let mut size = None;
1565 let mut max_align: Option<Align> = None;
1566 let mut min_pack: Option<Align> = None;
1567
1568 let mut field_shuffle_seed = self.def_path_hash(did.to_def_id()).0.to_smaller_hash();
1571
1572 if let Some(user_seed) = self.sess.opts.unstable_opts.layout_seed {
1576 field_shuffle_seed ^= user_seed;
1577 }
1578
1579 let elt = {
{
'done:
{
for i in ::rustc_hir::attrs::HasAttrs::get_attrs(did, &self) {
#[allow(unused_imports)]
use rustc_hir::attrs::AttributeKind::*;
let i: &rustc_hir::Attribute = i;
match i {
rustc_hir::Attribute::Parsed(RustcScalableVector {
element_count }) => {
break 'done Some(element_count);
}
rustc_hir::Attribute::Unparsed(..) =>
{}
#[deny(unreachable_patterns)]
_ => {}
}
}
None
}
}
}find_attr!(self, did, RustcScalableVector { element_count } => element_count
1580 )
1581 .map(|elt| match elt {
1582 Some(n) => ScalableElt::ElementCount(*n),
1583 None => ScalableElt::Container,
1584 });
1585 if elt.is_some() {
1586 flags.insert(ReprFlags::IS_SCALABLE);
1587 }
1588 if let Some(reprs) = {
{
'done:
{
for i in ::rustc_hir::attrs::HasAttrs::get_attrs(did, &self) {
#[allow(unused_imports)]
use rustc_hir::attrs::AttributeKind::*;
let i: &rustc_hir::Attribute = i;
match i {
rustc_hir::Attribute::Parsed(Repr { reprs, .. }) => {
break 'done Some(reprs);
}
rustc_hir::Attribute::Unparsed(..) =>
{}
#[deny(unreachable_patterns)]
_ => {}
}
}
None
}
}
}find_attr!(self, did, Repr { reprs, .. } => reprs) {
1589 for (r, _) in reprs {
1590 flags.insert(match *r {
1591 attr::ReprRust => ReprFlags::empty(),
1592 attr::ReprC => ReprFlags::IS_C,
1593 attr::ReprPacked(pack) => {
1594 min_pack = Some(if let Some(min_pack) = min_pack {
1595 min_pack.min(pack)
1596 } else {
1597 pack
1598 });
1599 ReprFlags::empty()
1600 }
1601 attr::ReprTransparent => ReprFlags::IS_TRANSPARENT,
1602 attr::ReprSimd => ReprFlags::IS_SIMD,
1603 attr::ReprInt(i) => {
1604 size = Some(match i {
1605 attr::IntType::SignedInt(x) => match x {
1606 ast::IntTy::Isize => IntegerType::Pointer(true),
1607 ast::IntTy::I8 => IntegerType::Fixed(Integer::I8, true),
1608 ast::IntTy::I16 => IntegerType::Fixed(Integer::I16, true),
1609 ast::IntTy::I32 => IntegerType::Fixed(Integer::I32, true),
1610 ast::IntTy::I64 => IntegerType::Fixed(Integer::I64, true),
1611 ast::IntTy::I128 => IntegerType::Fixed(Integer::I128, true),
1612 },
1613 attr::IntType::UnsignedInt(x) => match x {
1614 ast::UintTy::Usize => IntegerType::Pointer(false),
1615 ast::UintTy::U8 => IntegerType::Fixed(Integer::I8, false),
1616 ast::UintTy::U16 => IntegerType::Fixed(Integer::I16, false),
1617 ast::UintTy::U32 => IntegerType::Fixed(Integer::I32, false),
1618 ast::UintTy::U64 => IntegerType::Fixed(Integer::I64, false),
1619 ast::UintTy::U128 => IntegerType::Fixed(Integer::I128, false),
1620 },
1621 });
1622 ReprFlags::empty()
1623 }
1624 attr::ReprAlign(align) => {
1625 max_align = max_align.max(Some(align));
1626 ReprFlags::empty()
1627 }
1628 });
1629 }
1630 }
1631
1632 if self.sess.opts.unstable_opts.randomize_layout {
1635 flags.insert(ReprFlags::RANDOMIZE_LAYOUT);
1636 }
1637
1638 let is_box = self.is_lang_item(did.to_def_id(), LangItem::OwnedBox);
1641
1642 if is_box {
1644 flags.insert(ReprFlags::IS_LINEAR);
1645 }
1646
1647 if {
{
'done:
{
for i in ::rustc_hir::attrs::HasAttrs::get_attrs(did, &self) {
#[allow(unused_imports)]
use rustc_hir::attrs::AttributeKind::*;
let i: &rustc_hir::Attribute = i;
match i {
rustc_hir::Attribute::Parsed(RustcPassIndirectlyInNonRusticAbis(..))
=> {
break 'done Some(());
}
rustc_hir::Attribute::Unparsed(..) =>
{}
#[deny(unreachable_patterns)]
_ => {}
}
}
None
}
}
}.is_some()find_attr!(self, did, RustcPassIndirectlyInNonRusticAbis(..)) {
1649 flags.insert(ReprFlags::PASS_INDIRECTLY_IN_NON_RUSTIC_ABIS);
1650 }
1651
1652 ReprOptions {
1653 int: size,
1654 align: max_align,
1655 pack: min_pack,
1656 flags,
1657 field_shuffle_seed,
1658 scalable: elt,
1659 }
1660 }
1661
1662 pub fn opt_item_name(self, def_id: impl IntoQueryKey<DefId>) -> Option<Symbol> {
1664 let def_id = def_id.into_query_key();
1665 if let Some(cnum) = def_id.as_crate_root() {
1666 Some(self.crate_name(cnum))
1667 } else {
1668 let def_key = self.def_key(def_id);
1669 match def_key.disambiguated_data.data {
1670 rustc_hir::definitions::DefPathData::Ctor => self
1672 .opt_item_name(DefId { krate: def_id.krate, index: def_key.parent.unwrap() }),
1673 _ => def_key.get_opt_name(),
1674 }
1675 }
1676 }
1677
1678 pub fn item_name(self, id: impl IntoQueryKey<DefId>) -> Symbol {
1685 let id = id.into_query_key();
1686 self.opt_item_name(id).unwrap_or_else(|| {
1687 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));
1688 })
1689 }
1690
1691 pub fn opt_item_ident(self, def_id: impl IntoQueryKey<DefId>) -> Option<Ident> {
1695 let def_id = def_id.into_query_key();
1696 let def = self.opt_item_name(def_id)?;
1697 let span = self
1698 .def_ident_span(def_id)
1699 .unwrap_or_else(|| crate::util::bug::bug_fmt(format_args!("missing ident span for {0:?}",
def_id))bug!("missing ident span for {def_id:?}"));
1700 Some(Ident::new(def, span))
1701 }
1702
1703 pub fn item_ident(self, def_id: impl IntoQueryKey<DefId>) -> Ident {
1707 let def_id = def_id.into_query_key();
1708 self.opt_item_ident(def_id).unwrap_or_else(|| {
1709 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));
1710 })
1711 }
1712
1713 pub fn opt_associated_item(self, def_id: DefId) -> Option<AssocItem> {
1714 if let DefKind::AssocConst { .. } | DefKind::AssocFn | DefKind::AssocTy =
1715 self.def_kind(def_id)
1716 {
1717 Some(self.associated_item(def_id))
1718 } else {
1719 None
1720 }
1721 }
1722
1723 pub fn opt_rpitit_info(self, def_id: DefId) -> Option<ImplTraitInTraitData> {
1727 if let DefKind::AssocTy = self.def_kind(def_id)
1728 && let AssocKind::Type { data: AssocTypeData::Rpitit(rpitit_info) } =
1729 self.associated_item(def_id).kind
1730 {
1731 Some(rpitit_info)
1732 } else {
1733 None
1734 }
1735 }
1736
1737 pub fn find_field_index(self, ident: Ident, variant: &VariantDef) -> Option<FieldIdx> {
1738 variant.fields.iter_enumerated().find_map(|(i, field)| {
1739 self.hygienic_eq(ident, field.ident(self), variant.def_id).then_some(i)
1740 })
1741 }
1742
1743 x;#[instrument(level = "debug", skip(self), ret)]
1746 pub fn impls_are_allowed_to_overlap(
1747 self,
1748 def_id1: DefId,
1749 def_id2: DefId,
1750 ) -> Option<ImplOverlapKind> {
1751 let impl1 = self.impl_trait_header(def_id1);
1752 let impl2 = self.impl_trait_header(def_id2);
1753
1754 let trait_ref1 = impl1.trait_ref.skip_binder();
1755 let trait_ref2 = impl2.trait_ref.skip_binder();
1756
1757 if trait_ref1.references_error() || trait_ref2.references_error() {
1760 return Some(ImplOverlapKind::Permitted { marker: false });
1761 }
1762
1763 match (impl1.polarity, impl2.polarity) {
1764 (ImplPolarity::Reservation, _) | (_, ImplPolarity::Reservation) => {
1765 return Some(ImplOverlapKind::Permitted { marker: false });
1767 }
1768 (ImplPolarity::Positive, ImplPolarity::Negative)
1769 | (ImplPolarity::Negative, ImplPolarity::Positive) => {
1770 return None;
1772 }
1773 (ImplPolarity::Positive, ImplPolarity::Positive)
1774 | (ImplPolarity::Negative, ImplPolarity::Negative) => {}
1775 };
1776
1777 let is_marker_impl = |trait_ref: TraitRef<'_>| self.trait_def(trait_ref.def_id).is_marker;
1778 let is_marker_overlap = is_marker_impl(trait_ref1) && is_marker_impl(trait_ref2);
1779
1780 if is_marker_overlap {
1781 return Some(ImplOverlapKind::Permitted { marker: true });
1782 }
1783
1784 None
1785 }
1786
1787 pub fn expect_variant_res(self, res: Res) -> &'tcx VariantDef {
1790 match res {
1791 Res::Def(DefKind::Variant, did) => {
1792 let enum_did = self.parent(did);
1793 self.adt_def(enum_did).variant_with_id(did)
1794 }
1795 Res::Def(DefKind::Struct | DefKind::Union, did) => self.adt_def(did).non_enum_variant(),
1796 Res::Def(DefKind::Ctor(CtorOf::Variant, ..), variant_ctor_did) => {
1797 let variant_did = self.parent(variant_ctor_did);
1798 let enum_did = self.parent(variant_did);
1799 self.adt_def(enum_did).variant_with_ctor_id(variant_ctor_did)
1800 }
1801 Res::Def(DefKind::Ctor(CtorOf::Struct, ..), ctor_did) => {
1802 let struct_did = self.parent(ctor_did);
1803 self.adt_def(struct_did).non_enum_variant()
1804 }
1805 _ => 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),
1806 }
1807 }
1808
1809 #[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(1810u32),
::tracing_core::__macro_support::Option::Some("rustc_middle::ty"),
::tracing_core::field::FieldSet::new(&["instance"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = meta.fields().iter();
meta.fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&::tracing::field::debug(&instance)
as &dyn Value))])
})
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[warn(clippy :: suspicious_else_formatting)]
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy ::
needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return: &'tcx Body<'tcx> = loop {};
return __tracing_attr_fake_return;
}
{
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:1814",
"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(1814u32),
::tracing_core::__macro_support::Option::Some("rustc_middle::ty"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("calling def_kind on def: {0:?}",
def) as &dyn Value))])
});
} else { ; }
};
let def_kind = self.def_kind(def);
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_middle/src/ty/mod.rs:1816",
"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(1816u32),
::tracing_core::__macro_support::Option::Some("rustc_middle::ty"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("returned from def_kind: {0:?}",
def_kind) as &dyn Value))])
});
} else { ; }
};
match def_kind {
DefKind::Const { .. } | DefKind::Static { .. } |
DefKind::AssocConst { .. } | DefKind::Ctor(..) |
DefKind::AnonConst | DefKind::InlineConst =>
self.mir_for_ctfe(def),
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(..) =>
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")]
1811 pub fn instance_mir(self, instance: ty::InstanceKind<'tcx>) -> &'tcx Body<'tcx> {
1812 let body = match instance {
1813 ty::InstanceKind::Item(def) => {
1814 debug!("calling def_kind on def: {:?}", def);
1815 let def_kind = self.def_kind(def);
1816 debug!("returned from def_kind: {:?}", def_kind);
1817 match def_kind {
1818 DefKind::Const { .. }
1819 | DefKind::Static { .. }
1820 | DefKind::AssocConst { .. }
1821 | DefKind::Ctor(..)
1822 | DefKind::AnonConst
1823 | DefKind::InlineConst => self.mir_for_ctfe(def),
1824 DefKind::Fn | DefKind::AssocFn
1825 if matches!(
1826 self.constness(def),
1827 hir::Constness::Const { always: true }
1828 ) =>
1829 {
1830 self.mir_for_ctfe(def)
1831 }
1832 _ => self.optimized_mir(def),
1835 }
1836 }
1837 ty::InstanceKind::Intrinsic(..) => bug!("intrinsics have no instance MIR"),
1838 ty::InstanceKind::Virtual(..) => bug!("virtual dispatches have no instance MIR"),
1839 ty::InstanceKind::Shim(shim) => self.mir_shims(shim),
1840 };
1841
1842 assert!(
1843 matches!(body.phase, MirPhase::Runtime(_)),
1844 "body: {body:?} instance: {instance:?} {:?}",
1845 if let ty::InstanceKind::Item(d) = instance { Some(self.def_kind(d)) } else { None },
1846 );
1847
1848 body
1849 }
1850
1851 #[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."]
1853 pub fn get_attrs(
1854 self,
1855 did: impl Into<DefId>,
1856 attr: Symbol,
1857 ) -> impl Iterator<Item = &'tcx hir::Attribute> {
1858 #[allow(deprecated)]
1859 self.get_all_attrs(did).iter().filter(move |a: &&hir::Attribute| a.has_name(attr))
1860 }
1861
1862 #[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."]
1867 pub fn get_all_attrs(self, did: impl Into<DefId>) -> &'tcx [hir::Attribute] {
1868 let did: DefId = did.into();
1869 if let Some(did) = did.as_local() {
1870 self.hir_attrs(self.local_def_id_to_hir_id(did))
1871 } else {
1872 self.attrs_for_def(did)
1873 }
1874 }
1875
1876 pub fn get_attrs_by_path(
1877 self,
1878 did: DefId,
1879 attr: &[Symbol],
1880 ) -> impl Iterator<Item = &'tcx hir::Attribute> {
1881 let filter_fn = move |a: &&hir::Attribute| a.path_matches(attr);
1882 if let Some(did) = did.as_local() {
1883 self.hir_attrs(self.local_def_id_to_hir_id(did)).iter().filter(filter_fn)
1884 } else {
1885 self.attrs_for_def(did).iter().filter(filter_fn)
1886 }
1887 }
1888
1889 pub fn trait_is_auto(self, trait_def_id: DefId) -> bool {
1891 self.trait_def(trait_def_id).has_auto_impl
1892 }
1893
1894 pub fn trait_is_coinductive(self, trait_def_id: DefId) -> bool {
1897 self.trait_def(trait_def_id).is_coinductive
1898 }
1899
1900 pub fn trait_is_alias(self, trait_def_id: DefId) -> bool {
1902 self.def_kind(trait_def_id) == DefKind::TraitAlias
1903 }
1904
1905 fn layout_error(self, err: LayoutError<'tcx>) -> &'tcx LayoutError<'tcx> {
1907 self.arena.alloc(err)
1908 }
1909
1910 fn ordinary_coroutine_layout(
1916 self,
1917 def_id: DefId,
1918 args: GenericArgsRef<'tcx>,
1919 ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1920 let coroutine_kind_ty = args.as_coroutine().kind_ty();
1921 let mir = self.optimized_mir(def_id);
1922 let ty = || Ty::new_coroutine(self, def_id, args);
1923 if coroutine_kind_ty.is_unit() {
1925 mir.coroutine_layout_raw().ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1926 } else {
1927 let ty::Coroutine(_, identity_args) =
1930 *self.type_of(def_id).instantiate_identity().skip_norm_wip().kind()
1931 else {
1932 ::core::panicking::panic("internal error: entered unreachable code");unreachable!();
1933 };
1934 let identity_kind_ty = identity_args.as_coroutine().kind_ty();
1935 if identity_kind_ty == coroutine_kind_ty {
1938 mir.coroutine_layout_raw()
1939 .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1940 } else {
1941 {
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));
1942 {
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!(
1943 identity_kind_ty.to_opt_closure_kind(),
1944 Some(ClosureKind::Fn | ClosureKind::FnMut)
1945 );
1946 self.optimized_mir(self.coroutine_by_move_body_def_id(def_id))
1947 .coroutine_layout_raw()
1948 .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1949 }
1950 }
1951 }
1952
1953 fn async_drop_coroutine_layout(
1957 self,
1958 def_id: DefId,
1959 args: GenericArgsRef<'tcx>,
1960 ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1961 let ty = || Ty::new_coroutine(self, def_id, args);
1962 if args[0].has_placeholders() || args[0].has_non_region_param() {
1963 return Err(self.layout_error(LayoutError::TooGeneric(ty())));
1964 }
1965 let instance = ShimKind::AsyncDropGlue(def_id, Ty::new_coroutine(self, def_id, args));
1966 self.mir_shims(instance)
1967 .coroutine_layout_raw()
1968 .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1969 }
1970
1971 pub fn coroutine_layout(
1974 self,
1975 def_id: DefId,
1976 args: GenericArgsRef<'tcx>,
1977 ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1978 if self.is_async_drop_in_place_coroutine(def_id) {
1979 let arg_cor_ty = args.first().unwrap().expect_ty();
1983 if arg_cor_ty.is_coroutine() {
1984 let span = self.def_span(def_id);
1985 let source_info = SourceInfo::outermost(span);
1986 let variant_fields: IndexVec<VariantIdx, IndexVec<FieldIdx, CoroutineSavedLocal>> =
1989 iter::repeat(IndexVec::new()).take(CoroutineArgs::RESERVED_VARIANTS).collect();
1990 let variant_source_info: IndexVec<VariantIdx, SourceInfo> =
1991 iter::repeat(source_info).take(CoroutineArgs::RESERVED_VARIANTS).collect();
1992 let proxy_layout = CoroutineLayout {
1993 field_tys: [].into(),
1994 variant_fields,
1995 variant_source_info,
1996 storage_conflicts: BitMatrix::new(0, 0),
1997 };
1998 return Ok(self.arena.alloc(proxy_layout));
1999 } else {
2000 self.async_drop_coroutine_layout(def_id, args)
2001 }
2002 } else {
2003 self.ordinary_coroutine_layout(def_id, args)
2004 }
2005 }
2006
2007 pub fn assoc_parent(self, def_id: DefId) -> Option<(DefId, DefKind)> {
2009 if !self.def_kind(def_id).is_assoc() {
2010 return None;
2011 }
2012 let parent = self.parent(def_id);
2013 let def_kind = self.def_kind(parent);
2014 Some((parent, def_kind))
2015 }
2016
2017 pub fn trait_item_of(self, def_id: impl IntoQueryKey<DefId>) -> Option<DefId> {
2019 let def_id = def_id.into_query_key();
2020 self.opt_associated_item(def_id)?.trait_item_def_id()
2021 }
2022
2023 pub fn trait_of_assoc(self, def_id: DefId) -> Option<DefId> {
2026 match self.assoc_parent(def_id) {
2027 Some((id, DefKind::Trait)) => Some(id),
2028 _ => None,
2029 }
2030 }
2031
2032 pub fn impl_is_of_trait(self, def_id: impl IntoQueryKey<DefId>) -> bool {
2033 let def_id = def_id.into_query_key();
2034 let DefKind::Impl { of_trait } = self.def_kind(def_id) else {
2035 {
::core::panicking::panic_fmt(format_args!("expected Impl for {0:?}",
def_id));
};panic!("expected Impl for {def_id:?}");
2036 };
2037 of_trait
2038 }
2039
2040 pub fn impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
2043 match self.assoc_parent(def_id) {
2044 Some((id, DefKind::Impl { .. })) => Some(id),
2045 _ => None,
2046 }
2047 }
2048
2049 pub fn inherent_impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
2052 match self.assoc_parent(def_id) {
2053 Some((id, DefKind::Impl { of_trait: false })) => Some(id),
2054 _ => None,
2055 }
2056 }
2057
2058 pub fn trait_impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
2061 match self.assoc_parent(def_id) {
2062 Some((id, DefKind::Impl { of_trait: true })) => Some(id),
2063 _ => None,
2064 }
2065 }
2066
2067 pub fn impl_polarity(self, def_id: impl IntoQueryKey<DefId>) -> ty::ImplPolarity {
2068 let def_id = def_id.into_query_key();
2069 self.impl_trait_header(def_id).polarity
2070 }
2071
2072 pub fn impl_trait_ref(
2074 self,
2075 def_id: impl IntoQueryKey<DefId>,
2076 ) -> ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>> {
2077 let def_id = def_id.into_query_key();
2078 self.impl_trait_header(def_id).trait_ref
2079 }
2080
2081 pub fn impl_opt_trait_ref(
2084 self,
2085 def_id: impl IntoQueryKey<DefId>,
2086 ) -> Option<ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>>> {
2087 let def_id = def_id.into_query_key();
2088 self.impl_is_of_trait(def_id).then(|| self.impl_trait_ref(def_id))
2089 }
2090
2091 pub fn impl_trait_id(self, def_id: impl IntoQueryKey<DefId>) -> DefId {
2093 let def_id = def_id.into_query_key();
2094 self.impl_trait_ref(def_id).skip_binder().def_id
2095 }
2096
2097 pub fn impl_opt_trait_id(self, def_id: impl IntoQueryKey<DefId>) -> Option<DefId> {
2100 let def_id = def_id.into_query_key();
2101 self.impl_is_of_trait(def_id).then(|| self.impl_trait_id(def_id))
2102 }
2103
2104 pub fn is_exportable(self, def_id: DefId) -> bool {
2105 self.exportable_items(def_id.krate).contains(&def_id)
2106 }
2107
2108 pub fn is_builtin_derived(self, def_id: DefId) -> bool {
2111 if self.is_automatically_derived(def_id)
2112 && let Some(def_id) = def_id.as_local()
2113 && let outer = self.def_span(def_id).ctxt().outer_expn_data()
2114 && #[allow(non_exhaustive_omitted_patterns)] match outer.kind {
ExpnKind::Macro(MacroKind::Derive, _) => true,
_ => false,
}matches!(outer.kind, ExpnKind::Macro(MacroKind::Derive, _))
2115 && {
{
'done:
{
for i in
::rustc_hir::attrs::HasAttrs::get_attrs(outer.macro_def_id.unwrap(),
&self) {
#[allow(unused_imports)]
use rustc_hir::attrs::AttributeKind::*;
let i: &rustc_hir::Attribute = i;
match i {
rustc_hir::Attribute::Parsed(RustcBuiltinMacro { .. }) => {
break 'done Some(());
}
rustc_hir::Attribute::Unparsed(..) =>
{}
#[deny(unreachable_patterns)]
_ => {}
}
}
None
}
}
}.is_some()find_attr!(self, outer.macro_def_id.unwrap(), RustcBuiltinMacro { .. })
2116 {
2117 true
2118 } else {
2119 false
2120 }
2121 }
2122
2123 pub fn is_automatically_derived(self, def_id: DefId) -> bool {
2125 {
{
'done:
{
for i in
::rustc_hir::attrs::HasAttrs::get_attrs(def_id, &self) {
#[allow(unused_imports)]
use rustc_hir::attrs::AttributeKind::*;
let i: &rustc_hir::Attribute = i;
match i {
rustc_hir::Attribute::Parsed(AutomaticallyDerived) => {
break 'done Some(());
}
rustc_hir::Attribute::Unparsed(..) =>
{}
#[deny(unreachable_patterns)]
_ => {}
}
}
None
}
}
}.is_some()find_attr!(self, def_id, AutomaticallyDerived)
2126 }
2127
2128 pub fn span_of_impl(self, impl_def_id: DefId) -> Result<Span, Symbol> {
2131 if let Some(impl_def_id) = impl_def_id.as_local() {
2132 Ok(self.def_span(impl_def_id))
2133 } else {
2134 Err(self.crate_name(impl_def_id.krate))
2135 }
2136 }
2137
2138 pub fn hygienic_eq(self, use_ident: Ident, def_ident: Ident, def_parent_def_id: DefId) -> bool {
2142 use_ident.name == def_ident.name
2146 && use_ident
2147 .span
2148 .ctxt()
2149 .hygienic_eq(def_ident.span.ctxt(), self.expn_that_defined(def_parent_def_id))
2150 }
2151
2152 pub fn adjust_ident(self, mut ident: Ident, scope: DefId) -> Ident {
2153 ident.span.normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope));
2154 ident
2155 }
2156
2157 pub fn adjust_ident_and_get_scope(
2158 self,
2159 mut ident: Ident,
2160 scope: DefId,
2161 item_id: LocalDefId,
2162 ) -> (Ident, DefId) {
2163 let scope = ident
2164 .span
2165 .normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope))
2166 .and_then(|actual_expansion| actual_expansion.expn_data().parent_module)
2167 .unwrap_or_else(|| self.parent_module_from_def_id(item_id).to_def_id());
2168 (ident, scope)
2169 }
2170
2171 #[inline]
2175 pub fn is_const_fn(self, def_id: impl IntoQueryKey<DefId>) -> bool {
2176 let def_id = def_id.into_query_key();
2177 #[allow(non_exhaustive_omitted_patterns)] match self.def_kind(def_id) {
DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(_, CtorKind::Fn) |
DefKind::Closure => true,
_ => false,
}matches!(
2178 self.def_kind(def_id),
2179 DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(_, CtorKind::Fn) | DefKind::Closure
2180 ) && #[allow(non_exhaustive_omitted_patterns)] match self.constness(def_id) {
hir::Constness::Const { .. } => true,
_ => false,
}matches!(self.constness(def_id), hir::Constness::Const { .. })
2181 }
2182
2183 pub fn is_conditionally_const(self, def_id: impl Into<DefId>) -> bool {
2190 let def_id: DefId = def_id.into();
2191 match self.def_kind(def_id) {
2192 DefKind::Impl { of_trait: true } => {
2193 let header = self.impl_trait_header(def_id);
2194 #[allow(non_exhaustive_omitted_patterns)] match header.constness {
hir::Constness::Const { always: false } => true,
_ => false,
}matches!(header.constness, hir::Constness::Const { always: false })
2195 && self.is_const_trait(header.trait_ref.skip_binder().def_id)
2196 }
2197 DefKind::Impl { of_trait: false } => {
2198 #[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 })
2199 }
2200 DefKind::Fn | DefKind::Ctor(_, CtorKind::Fn) => {
2201 #[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 })
2202 }
2203 DefKind::TraitAlias | DefKind::Trait => self.is_const_trait(def_id),
2204 DefKind::AssocTy => {
2205 let parent_def_id = self.parent(def_id);
2206 match self.def_kind(parent_def_id) {
2207 DefKind::Impl { of_trait: false } => false,
2208 DefKind::Impl { of_trait: true } | DefKind::Trait => {
2209 self.is_conditionally_const(parent_def_id)
2210 }
2211 _ => 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:?}"),
2212 }
2213 }
2214 DefKind::AssocFn => {
2215 let parent_def_id = self.parent(def_id);
2216 match self.def_kind(parent_def_id) {
2217 DefKind::Impl { of_trait: false } => {
2218 #[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 })
2219 }
2220 DefKind::Impl { of_trait: true } => {
2221 let Some(trait_method_did) = self.trait_item_of(def_id) else {
2222 return false;
2223 };
2224 #[allow(non_exhaustive_omitted_patterns)] match self.constness(trait_method_did)
{
hir::Constness::Const { always: false } => true,
_ => false,
}matches!(
2225 self.constness(trait_method_did),
2226 hir::Constness::Const { always: false }
2227 ) && self.is_conditionally_const(parent_def_id)
2228 }
2229 DefKind::Trait => {
2230 #[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 })
2231 && self.is_conditionally_const(parent_def_id)
2232 }
2233 _ => 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:?}"),
2234 }
2235 }
2236 DefKind::OpaqueTy => match self.opaque_ty_origin(def_id) {
2237 hir::OpaqueTyOrigin::FnReturn { parent, .. } => self.is_conditionally_const(parent),
2238 hir::OpaqueTyOrigin::AsyncFn { .. } => false,
2239 hir::OpaqueTyOrigin::TyAlias { .. } => false,
2241 },
2242 DefKind::Closure => {
2243 #[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 })
2244 }
2245 DefKind::Ctor(_, CtorKind::Const)
2246 | DefKind::Mod
2247 | DefKind::Struct
2248 | DefKind::Union
2249 | DefKind::Enum
2250 | DefKind::Variant
2251 | DefKind::TyAlias
2252 | DefKind::ForeignTy
2253 | DefKind::TyParam
2254 | DefKind::Const { .. }
2255 | DefKind::ConstParam
2256 | DefKind::Static { .. }
2257 | DefKind::AssocConst { .. }
2258 | DefKind::Macro(_)
2259 | DefKind::ExternCrate
2260 | DefKind::Use
2261 | DefKind::ForeignMod
2262 | DefKind::AnonConst
2263 | DefKind::InlineConst
2264 | DefKind::Field
2265 | DefKind::LifetimeParam
2266 | DefKind::GlobalAsm
2267 | DefKind::SyntheticCoroutineBody => false,
2268 }
2269 }
2270
2271 #[inline]
2272 pub fn is_const_trait(self, def_id: DefId) -> bool {
2273 #[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 { .. })
2274 }
2275
2276 pub fn impl_method_has_trait_impl_trait_tys(self, def_id: DefId) -> bool {
2277 if self.def_kind(def_id) != DefKind::AssocFn {
2278 return false;
2279 }
2280
2281 let Some(item) = self.opt_associated_item(def_id) else {
2282 return false;
2283 };
2284
2285 let AssocContainer::TraitImpl(Ok(trait_item_def_id)) = item.container else {
2286 return false;
2287 };
2288
2289 !self.associated_types_for_impl_traits_in_associated_fn(trait_item_def_id).is_empty()
2290 }
2291
2292 #[inline]
2307 pub fn fn_abi_of_instance(
2308 self,
2309 query: ty::PseudoCanonicalInput<'tcx, (ty::Instance<'tcx>, &'tcx ty::List<Ty<'tcx>>)>,
2310 ) -> Result<&'tcx FnAbi<'tcx, Ty<'tcx>>, &'tcx FnAbiError<'tcx>> {
2311 if self.sess.opts.optimize != OptLevel::No && self.sess.opts.incremental.is_none() {
2314 self.fn_abi_of_instance_raw(query)
2315 } else {
2316 self.fn_abi_of_instance_no_deduced_attrs(query)
2317 }
2318 }
2319}
2320
2321impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for DefId {
2324 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2325 if let Some(did) = self.as_local() {
2326 tcx.hir_attrs(tcx.local_def_id_to_hir_id(did))
2327 } else {
2328 tcx.attrs_for_def(self)
2329 }
2330 }
2331}
2332
2333impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for LocalDefId {
2334 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2335 tcx.hir_attrs(tcx.local_def_id_to_hir_id(self))
2336 }
2337}
2338
2339impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for hir::OwnerId {
2340 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2341 hir::attrs::HasAttrs::get_attrs(self.def_id, tcx)
2342 }
2343}
2344
2345impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for hir::HirId {
2346 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2347 tcx.hir_attrs(self)
2348 }
2349}
2350
2351pub fn provide(providers: &mut Providers) {
2352 closure::provide(providers);
2353 context::provide(providers);
2354 erase_regions::provide(providers);
2355 inhabitedness::provide(providers);
2356 util::provide(providers);
2357 print::provide(providers);
2358 super::util::bug::provide(providers);
2359 *providers = Providers {
2360 trait_impls_of: trait_def::trait_impls_of_provider,
2361 incoherent_impls: trait_def::incoherent_impls_provider,
2362 trait_impls_in_crate: trait_def::trait_impls_in_crate_provider,
2363 traits: trait_def::traits_provider,
2364 vtable_allocation: vtable::vtable_allocation_provider,
2365 ..*providers
2366 };
2367}
2368
2369#[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)]
2375pub struct CrateInherentImpls {
2376 pub inherent_impls: FxIndexMap<LocalDefId, Vec<DefId>>,
2377 pub incoherent_impls: FxIndexMap<SimplifiedType, Vec<LocalDefId>>,
2378}
2379
2380#[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)]
2381pub struct SymbolName<'tcx> {
2382 pub name: &'tcx str,
2384}
2385
2386impl<'tcx> SymbolName<'tcx> {
2387 pub fn new(tcx: TyCtxt<'tcx>, name: &str) -> SymbolName<'tcx> {
2388 SymbolName { name: tcx.arena.alloc_str(name) }
2389 }
2390}
2391
2392impl<'tcx> fmt::Display for SymbolName<'tcx> {
2393 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2394 fmt::Display::fmt(&self.name, fmt)
2395 }
2396}
2397
2398impl<'tcx> fmt::Debug for SymbolName<'tcx> {
2399 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2400 fmt::Display::fmt(&self.name, fmt)
2401 }
2402}
2403
2404#[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)]
2406pub struct DestructuredAdtConst<'tcx> {
2407 pub variant: VariantIdx,
2408 pub fields: &'tcx [ty::Const<'tcx>],
2409}