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::ops::ControlFlow;
20use std::ptr::NonNull;
21use std::{assert_matches, fmt, iter, str};
22
23pub use adt::*;
24pub use assoc::*;
25pub use generic_args::{GenericArgKind, TermKind, *};
26pub use generics::*;
27pub use intrinsic::IntrinsicDef;
28use rustc_abi::{
29 Align, FieldIdx, Integer, IntegerType, ReprFlags, ReprOptions, ScalableElt, VariantIdx,
30};
31use rustc_ast::node_id::NodeMap;
32use rustc_ast::{self as ast, NodeId};
33pub use rustc_ast_ir::{Movability, Mutability, try_visit};
34use rustc_data_structures::fx::{FxHashSet, FxIndexMap, FxIndexSet};
35use rustc_data_structures::intern::Interned;
36use rustc_data_structures::stable_hash::{StableHash, StableHashCtxt, StableHasher};
37use rustc_data_structures::steal::Steal;
38use rustc_data_structures::unord::{UnordMap, UnordSet};
39use rustc_errors::{Diag, ErrorGuaranteed, LintBuffer};
40use rustc_hir::attrs::StrippedCfgItem;
41use rustc_hir::def::{CtorKind, CtorOf, DefKind, DocLinkResMap, LifetimeRes, Res};
42use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, LocalDefIdMap};
43use rustc_hir::definitions::PerParentDisambiguatorState;
44use rustc_hir::{self as hir, LangItem, MissingLifetimeKind, attrs as attr, find_attr};
45use rustc_index::IndexVec;
46use rustc_index::bit_set::BitMatrix;
47use rustc_macros::{
48 BlobDecodable, Decodable, Encodable, StableHash, TyDecodable, TyEncodable, TypeFoldable,
49 TypeVisitable, extension,
50};
51use rustc_serialize::{Decodable, Encodable};
52use rustc_session::config::OptLevel;
53pub use rustc_session::lint::RegisteredTools;
54use rustc_span::def_id::{LocalModId, ModId};
55use rustc_span::hygiene::MacroKind;
56use rustc_span::{DUMMY_SP, ExpnId, ExpnKind, Ident, Span, Symbol};
57use rustc_target::callconv::FnAbi;
58pub use rustc_type_ir::data_structures::{DelayedMap, DelayedSet};
59pub use rustc_type_ir::fast_reject::DeepRejectCtxt;
60#[allow(
61 hidden_glob_reexports,
62 rustc::usage_of_type_ir_inherent,
63 rustc::non_glob_import_of_type_ir_inherent
64)]
65use rustc_type_ir::inherent;
66pub use rustc_type_ir::relate::VarianceDiagInfo;
67pub use rustc_type_ir::solve::{CandidatePreferenceMode, SizedTraitKind, VisibleForLeakCheck};
68pub use rustc_type_ir::*;
69#[allow(hidden_glob_reexports, unused_imports)]
70use rustc_type_ir::{InferCtxtLike, Interner};
71use tracing::{debug, instrument};
72pub use vtable::*;
73
74pub use self::closure::{
75 BorrowKind, CAPTURE_STRUCT_LOCAL, CaptureInfo, CapturedPlace, ClosureTypeInfo,
76 MinCaptureInformationMap, MinCaptureList, RootVariableMinCaptureList, UpvarCapture, UpvarId,
77 UpvarPath, analyze_coroutine_closure_captures, is_ancestor_or_same_capture,
78 place_to_string_for_capture,
79};
80pub use self::consts::{
81 AliasConst, AliasConstKind, AtomicOrdering, Const, ConstInt, ConstKind, ConstToValTreeResult,
82 Expr, ExprKind, LitToConstInput, ScalarInt, SimdAlign, ValTree, ValTreeKindExt, Value,
83 const_lit_matches_ty,
84};
85pub use self::context::{
86 CtxtInterners, CurrentGcx, FreeRegionInfo, GlobalCtxt, Lift, TyCtxt, TyCtxtFeed, tls,
87};
88pub use self::fold::*;
89pub use self::instance::{Instance, InstanceKind, ReifyReason, ShimKind};
90pub(crate) use self::list::RawList;
91pub use self::list::{List, ListWithCachedTypeInfo};
92pub use self::opaque_types::OpaqueTypeKey;
93pub use self::pattern::{Pattern, PatternKind};
94pub use self::predicate::{
95 AliasTerm, AliasTermKind, ArgOutlivesPredicate, Clause, ClauseKind, CoercePredicate,
96 ExistentialPredicate, ExistentialPredicateStableCmpExt, ExistentialProjection,
97 ExistentialTraitRef, HostEffectPredicate, NormalizesTo, OutlivesPredicate, PolyCoercePredicate,
98 PolyExistentialPredicate, PolyExistentialProjection, PolyExistentialTraitRef,
99 PolyProjectionPredicate, PolyRegionOutlivesPredicate, PolySubtypePredicate, PolyTraitPredicate,
100 PolyTraitRef, PolyTypeOutlivesPredicate, Predicate, PredicateKind, ProjectionPredicate,
101 RegionConstraint, RegionEqPredicate, RegionOutlivesPredicate, SubtypePredicate, TraitPredicate,
102 TraitRef, TypeOutlivesPredicate,
103};
104pub use self::region::{
105 EarlyParamRegion, LateParamRegion, LateParamRegionKind, Region, RegionExt, RegionKind,
106 RegionUtilitiesExt, RegionVid,
107};
108pub use self::sty::{
109 Alias, AliasTy, AliasTyKind, Article, Binder, BoundConst, BoundRegion, BoundRegionKind,
110 BoundTy, BoundTyKind, BoundVariableKind, CanonicalPolyFnSig, CoroutineArgsExt, EarlyBinder,
111 FnSig, FnSigKind, FreeAliasTy, InherentAliasTy, InlineConstArgs, InlineConstArgsParts,
112 OpaqueAliasTy, ParamConst, ParamTy, PlaceholderConst, PlaceholderRegion, PlaceholderType,
113 PolyFnSig, ProjectionAliasTy, TyKind, TypeAndMut, TypingMode, TypingModeEqWrapper,
114 Unnormalized, UpvarArgs,
115};
116pub use self::trait_def::TraitDef;
117pub use self::typeck_results::{
118 CanonicalUserType, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations, IsIdentity,
119 Rust2024IncompatiblePatInfo, SplattedDef, TypeckResults, UserType, UserTypeAnnotationIndex,
120 UserTypeKind,
121};
122use crate::error::{OpaqueHiddenTypeMismatch, TypeMismatchReason};
123use crate::metadata::{AmbigModChild, ModChild};
124use crate::middle::privacy::EffectiveVisibilities;
125use crate::mir::{Body, CoroutineLayout, CoroutineSavedLocal, MirPhase, SourceInfo};
126use crate::query::{IntoQueryKey, Providers};
127use crate::ty;
128use crate::ty::codec::{TyDecoder, TyEncoder};
129pub use crate::ty::diagnostics::*;
130use crate::ty::fast_reject::SimplifiedType;
131use crate::ty::layout::{FnAbiError, LayoutError};
132use crate::ty::util::Discr;
133use crate::ty::walk::TypeWalker;
134
135pub mod abstract_const;
136pub mod adjustment;
137pub mod cast;
138pub mod codec;
139pub mod error;
140pub mod fast_reject;
141pub mod inhabitedness;
142pub mod layout;
143pub mod normalize_erasing_regions;
144pub mod offload_meta;
145pub mod pattern;
146pub mod print;
147pub mod relate;
148pub mod significant_drop_order;
149pub mod trait_def;
150pub mod typetree;
151pub mod util;
152pub mod vtable;
153
154mod adt;
155mod assoc;
156mod closure;
157mod consts;
158mod context;
159mod diagnostics;
160mod elaborate_impl;
161mod erase_regions;
162mod fold;
163mod generic_args;
164mod generics;
165mod impls_ty;
166mod instance;
167mod intrinsic;
168mod list;
169mod opaque_types;
170mod predicate;
171mod region;
172mod structural_impls;
173#[allow(hidden_glob_reexports)]
174mod sty;
175mod typeck_results;
176mod visit;
177
178#[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)]
181pub struct ResolverGlobalCtxt {
182 pub visibilities_for_hashing: Vec<(LocalDefId, Visibility)>,
183 pub expn_that_defined: UnordMap<LocalDefId, ExpnId>,
185 pub effective_visibilities: EffectiveVisibilities,
186 pub macro_reachable_adts: FxIndexMap<LocalDefId, FxIndexSet<LocalDefId>>,
192 pub extern_crate_map: UnordMap<LocalDefId, CrateNum>,
193 pub maybe_unused_trait_imports: FxIndexSet<LocalDefId>,
194 pub module_children: LocalDefIdMap<Vec<ModChild>>,
195 pub ambig_module_children: LocalDefIdMap<Vec<AmbigModChild>>,
196 pub glob_map: FxIndexMap<LocalDefId, FxIndexSet<Symbol>>,
197 pub main_def: Option<MainDefinition>,
198 pub trait_impls: FxIndexMap<DefId, Vec<LocalDefId>>,
199 pub proc_macros: Vec<LocalDefId>,
202 pub confused_type_with_std_module: FxIndexMap<Span, Span>,
205 pub doc_link_resolutions: FxIndexMap<LocalModId, DocLinkResMap>,
206 pub doc_link_traits_in_scope: FxIndexMap<LocalModId, Vec<DefId>>,
207 pub all_macro_rules: UnordSet<Symbol>,
208 pub stripped_cfg_items: Vec<StrippedCfgItem>,
209 pub delegation_infos: FxIndexMap<LocalDefId, DelegationInfo>,
212}
213
214#[derive(#[automatically_derived]
impl<'tcx> ::core::fmt::Debug for PerOwnerResolverData<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["node_id_to_def_id", "lifetime_elision_allowed",
"label_res_map", "lifetimes_res_map", "trait_map",
"import_res", "extra_lifetime_params_map", "id", "def_id"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.node_id_to_def_id, &self.lifetime_elision_allowed,
&self.label_res_map, &self.lifetimes_res_map,
&self.trait_map, &self.import_res,
&self.extra_lifetime_params_map, &self.id, &&self.def_id];
::core::fmt::Formatter::debug_struct_fields_finish(f,
"PerOwnerResolverData", names, values)
}
}Debug)]
215pub struct PerOwnerResolverData<'tcx> {
216 pub node_id_to_def_id: NodeMap<LocalDefId> = Default::default(),
217 pub lifetime_elision_allowed: bool = false,
219 pub label_res_map: NodeMap<ast::NodeId> = Default::default(),
222 pub lifetimes_res_map: NodeMap<LifetimeRes> = Default::default(),
224
225 pub trait_map: NodeMap<&'tcx [hir::TraitCandidate<'tcx>]> = Default::default(),
226
227 pub import_res: hir::def::PerNS<Option<Res<ast::NodeId>>> = Default::default(),
229 pub extra_lifetime_params_map: NodeMap<Vec<(Ident, ast::NodeId, MissingLifetimeKind)>> = Default::default(),
231
232 pub id: ast::NodeId,
234 pub def_id: LocalDefId,
236}
237
238impl<'tcx> PerOwnerResolverData<'tcx> {
239 pub fn new(id: ast::NodeId, def_id: LocalDefId) -> PerOwnerResolverData<'tcx> {
240 PerOwnerResolverData { id, def_id, .. }
241 }
242
243 pub fn get_label_res(&self, id: ast::NodeId) -> Option<ast::NodeId> {
245 self.label_res_map.get(&id).copied()
246 }
247
248 pub fn get_lifetime_res(&self, id: ast::NodeId) -> Option<LifetimeRes> {
250 self.lifetimes_res_map.get(&id).copied()
251 }
252
253 pub fn extra_lifetime_params(&self, id: NodeId) -> &[(Ident, NodeId, MissingLifetimeKind)] {
261 self.extra_lifetime_params_map.get(&id).map_or(&[], |v| &v[..])
262 }
263}
264
265#[derive(#[automatically_derived]
impl<'tcx> ::core::fmt::Debug for ResolverAstLowering<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f,
"ResolverAstLowering", "partial_res_map", &self.partial_res_map,
"next_node_id", &self.next_node_id, "owners", &self.owners,
"lint_buffer", &self.lint_buffer, "disambiguators",
&&self.disambiguators)
}
}Debug)]
268pub struct ResolverAstLowering<'tcx> {
269 pub partial_res_map: NodeMap<hir::def::PartialRes>,
271
272 pub next_node_id: ast::NodeId,
273
274 pub owners: NodeMap<PerOwnerResolverData<'tcx>>,
275
276 pub lint_buffer: Steal<LintBuffer>,
278
279 pub disambiguators: LocalDefIdMap<Steal<PerParentDisambiguatorState>>,
280}
281
282#[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)]
283pub struct DelegationInfo {
284 pub resolution_id: Result<DefId, ErrorGuaranteed>,
290}
291
292#[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)]
293pub struct MainDefinition {
294 pub res: Res<ast::NodeId>,
295 pub is_import: bool,
296 pub span: Span,
297}
298
299impl MainDefinition {
300 pub fn opt_fn_def_id(self) -> Option<DefId> {
301 if let Res::Def(DefKind::Fn, def_id) = self.res { Some(def_id) } else { None }
302 }
303}
304
305#[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)]
306pub struct ImplTraitHeader<'tcx> {
307 pub trait_ref: ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>>,
308 pub polarity: ImplPolarity,
309 pub safety: hir::Safety,
310 pub constness: hir::Constness,
311}
312
313impl<'tcx> ImplTraitHeader<'tcx> {
314 pub fn is_fully_generic_for_reflection(self) -> bool {
324 #[derive(#[automatically_derived]
impl ::core::default::Default for ParamFinder {
#[inline]
fn default() -> ParamFinder {
ParamFinder { seen: ::core::default::Default::default() }
}
}Default)]
325 struct ParamFinder {
326 seen: FxHashSet<u32>,
327 }
328
329 impl<'tcx> TypeVisitor<TyCtxt<'tcx>> for ParamFinder {
330 type Result = ControlFlow<()>;
331 fn visit_region(&mut self, r: Region<'tcx>) -> Self::Result {
332 match r.kind() {
333 RegionKind::ReEarlyParam(param) => {
334 if self.seen.insert(param.index) {
335 ControlFlow::Continue(())
336 } else {
337 ControlFlow::Break(())
338 }
339 }
340 RegionKind::ReBound(..) => ControlFlow::Continue(()),
341 RegionKind::ReStatic | RegionKind::ReError(_) => ControlFlow::Break(()),
342 RegionKind::ReVar(_)
343 | RegionKind::RePlaceholder(_)
344 | RegionKind::ReErased
345 | RegionKind::ReLateParam(_) => crate::util::bug::bug_fmt(format_args!("unexpected lifetime in impl: {0:?}",
r))bug!("unexpected lifetime in impl: {r:?}"),
346 }
347 }
348
349 fn visit_ty(&mut self, t: Ty<'tcx>) -> Self::Result {
350 match t.kind() {
351 TyKind::Param(p) => {
352 if !self.seen.insert(p.index) {
354 return ControlFlow::Break(());
355 }
356 }
357 TyKind::Alias(..) => return ControlFlow::Break(()),
358 _ => (),
359 }
360 t.super_visit_with(self)
361 }
362 }
363 self.trait_ref
364 .instantiate_identity()
365 .skip_norm_wip()
366 .visit_with(&mut ParamFinder::default())
367 .is_continue()
368 }
369}
370
371#[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)]
372#[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)]
373pub enum Asyncness {
374 Yes,
375 #[default]
376 No,
377}
378
379impl Asyncness {
380 pub fn is_async(self) -> bool {
381 #[allow(non_exhaustive_omitted_patterns)] match self {
Asyncness::Yes => true,
_ => false,
}matches!(self, Asyncness::Yes)
382 }
383}
384
385#[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)]
386pub enum Visibility<Id = LocalModId> {
387 Public,
389 Restricted(Id),
391}
392
393impl Visibility {
394 pub fn to_string(self, def_id: LocalDefId, tcx: TyCtxt<'_>) -> String {
395 match self {
396 ty::Visibility::Restricted(restricted_id) => {
397 if restricted_id.is_top_level_module() {
398 "pub(crate)".to_string()
399 } else if restricted_id == tcx.parent_module_from_def_id(def_id) {
400 "pub(self)".to_string()
401 } else {
402 ::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!(
403 "pub(in crate{})",
404 tcx.def_path(restricted_id.to_def_id()).to_string_no_crate_verbose()
405 )
406 }
407 }
408 ty::Visibility::Public => "pub".to_string(),
409 }
410 }
411}
412
413#[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)]
414#[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)]
415pub struct ClosureSizeProfileData<'tcx> {
416 pub before_feature_tys: Ty<'tcx>,
418 pub after_feature_tys: Ty<'tcx>,
420}
421
422impl TyCtxt<'_> {
423 #[inline]
424 pub fn opt_parent(self, id: DefId) -> Option<DefId> {
425 self.def_key(id).parent.map(|index| DefId { index, ..id })
426 }
427
428 #[inline]
429 #[track_caller]
430 pub fn parent(self, id: DefId) -> DefId {
431 match self.opt_parent(id) {
432 Some(id) => id,
433 None => crate::util::bug::bug_fmt(format_args!("{0:?} doesn\'t have a parent", id))bug!("{id:?} doesn't have a parent"),
435 }
436 }
437
438 #[inline]
439 #[track_caller]
440 pub fn opt_local_parent(self, id: LocalDefId) -> Option<LocalDefId> {
441 self.opt_parent(id.to_def_id()).map(DefId::expect_local)
442 }
443
444 #[inline]
445 #[track_caller]
446 pub fn local_parent(self, id: impl Into<LocalDefId>) -> LocalDefId {
447 self.parent(id.into().to_def_id()).expect_local()
448 }
449
450 fn def_id_partial_cmp(self, lhs: DefId, rhs: DefId) -> Option<Ordering> {
454 if lhs.krate != rhs.krate {
456 return None;
457 }
458
459 let search = |mut start: DefId, finish: DefId, ord| {
463 while start.index != finish.index {
464 match self.opt_parent(start) {
465 Some(parent) => start.index = parent.index,
466 None => return None,
467 }
468 }
469 Some(ord)
470 };
471 match lhs.index.cmp(&rhs.index) {
472 Ordering::Equal => Some(Ordering::Equal),
473 Ordering::Less => search(rhs, lhs, Ordering::Greater),
474 Ordering::Greater => search(lhs, rhs, Ordering::Less),
475 }
476 }
477
478 pub fn is_descendant_of(
479 self,
480 descendant: impl Into<DefId>,
481 ancestor: impl Into<DefId>,
482 ) -> bool {
483 #[allow(non_exhaustive_omitted_patterns)] match self.def_id_partial_cmp(descendant.into(),
ancestor.into()) {
Some(Ordering::Less | Ordering::Equal) => true,
_ => false,
}matches!(
484 self.def_id_partial_cmp(descendant.into(), ancestor.into()),
485 Some(Ordering::Less | Ordering::Equal)
486 )
487 }
488}
489
490impl<Id> Visibility<Id> {
491 pub fn is_public(self) -> bool {
492 #[allow(non_exhaustive_omitted_patterns)] match self {
Visibility::Public => true,
_ => false,
}matches!(self, Visibility::Public)
493 }
494
495 pub fn map_id<OutId>(self, f: impl FnOnce(Id) -> OutId) -> Visibility<OutId> {
496 match self {
497 Visibility::Public => Visibility::Public,
498 Visibility::Restricted(id) => Visibility::Restricted(f(id)),
499 }
500 }
501}
502
503impl Visibility<LocalModId> {
504 pub fn to_mod_id(self) -> Visibility<ModId> {
505 self.map_id(LocalModId::to_mod_id)
506 }
507}
508
509impl<Id: Into<DefId>> Visibility<Id> {
510 pub fn is_accessible_from(self, module: impl Into<DefId>, tcx: TyCtxt<'_>) -> bool {
512 match self {
513 Visibility::Public => true,
515 Visibility::Restricted(id) => tcx.is_descendant_of(module, id),
516 }
517 }
518
519 pub fn partial_cmp(
520 self,
521 vis: Visibility<impl Into<DefId>>,
522 tcx: TyCtxt<'_>,
523 ) -> Option<Ordering> {
524 match (self, vis) {
525 (Visibility::Public, Visibility::Public) => Some(Ordering::Equal),
526 (Visibility::Public, Visibility::Restricted(_)) => Some(Ordering::Greater),
527 (Visibility::Restricted(_), Visibility::Public) => Some(Ordering::Less),
528 (Visibility::Restricted(lhs_id), Visibility::Restricted(rhs_id)) => {
529 let (lhs_id, rhs_id) = (lhs_id.into(), rhs_id.into());
530 tcx.def_id_partial_cmp(lhs_id, rhs_id)
531 }
532 }
533 }
534}
535
536impl<Id: Into<DefId> + Debug + Copy> Visibility<Id> {
537 #[track_caller]
539 pub fn greater_than(
540 self,
541 vis: Visibility<impl Into<DefId> + Debug + Copy>,
542 tcx: TyCtxt<'_>,
543 ) -> bool {
544 match self.partial_cmp(vis, tcx) {
545 Some(ord) => ord.is_gt(),
546 None => {
547 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:?}"));
548 false
549 }
550 }
551 }
552}
553
554impl Visibility<ModId> {
555 pub fn expect_local(self) -> Visibility {
556 self.map_id(|id| id.expect_local())
557 }
558
559 pub fn is_visible_locally(self) -> bool {
561 match self {
562 Visibility::Public => true,
563 Visibility::Restricted(mod_id) => mod_id.is_local(),
564 }
565 }
566}
567
568#[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)]
575pub struct CrateVariancesMap<'tcx> {
576 pub variances: DefIdMap<&'tcx [ty::Variance]>,
580}
581
582#[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)]
585pub struct CReaderCacheKey {
586 pub cnum: Option<CrateNum>,
587 pub pos: usize,
588}
589
590#[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)]
592#[rustc_diagnostic_item = "Ty"]
593#[rustc_pass_by_value]
594pub struct Ty<'tcx>(Interned<'tcx, WithCachedTypeInfo<TyKind<'tcx>>>);
595
596impl<'tcx> rustc_type_ir::inherent::IntoKind for Ty<'tcx> {
597 type Kind = TyKind<'tcx>;
598
599 fn kind(self) -> TyKind<'tcx> {
600 *self.kind()
601 }
602}
603
604impl<'tcx> rustc_type_ir::Flags for Ty<'tcx> {
605 fn flags(&self) -> TypeFlags {
606 self.0.flags
607 }
608
609 fn outer_exclusive_binder(&self) -> DebruijnIndex {
610 self.0.outer_exclusive_binder
611 }
612}
613
614#[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)]
621pub struct CratePredicatesMap<'tcx> {
622 pub predicates: DefIdMap<&'tcx [(Clause<'tcx>, Span)]>,
626}
627
628#[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)]
629pub struct Term<'tcx> {
630 ptr: NonNull<()>,
631 marker: PhantomData<(Ty<'tcx>, Const<'tcx>)>,
632}
633
634impl<'tcx> rustc_type_ir::inherent::Term<TyCtxt<'tcx>> for Term<'tcx> {}
635
636impl<'tcx> rustc_type_ir::inherent::IntoKind for Term<'tcx> {
637 type Kind = TermKind<'tcx>;
638
639 fn kind(self) -> Self::Kind {
640 self.kind()
641 }
642}
643
644unsafe impl<'tcx> rustc_data_structures::sync::DynSend for Term<'tcx> where
645 &'tcx (Ty<'tcx>, Const<'tcx>): rustc_data_structures::sync::DynSend
646{
647}
648unsafe impl<'tcx> rustc_data_structures::sync::DynSync for Term<'tcx> where
649 &'tcx (Ty<'tcx>, Const<'tcx>): rustc_data_structures::sync::DynSync
650{
651}
652unsafe impl<'tcx> Send for Term<'tcx> where &'tcx (Ty<'tcx>, Const<'tcx>): Send {}
653unsafe impl<'tcx> Sync for Term<'tcx> where &'tcx (Ty<'tcx>, Const<'tcx>): Sync {}
654
655impl Debug for Term<'_> {
656 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
657 match self.kind() {
658 TermKind::Ty(ty) => f.write_fmt(format_args!("Term::Ty({0:?})", ty))write!(f, "Term::Ty({ty:?})"),
659 TermKind::Const(ct) => f.write_fmt(format_args!("Term::Const({0:?})", ct))write!(f, "Term::Const({ct:?})"),
660 }
661 }
662}
663
664impl<'tcx> From<Ty<'tcx>> for Term<'tcx> {
665 fn from(ty: Ty<'tcx>) -> Self {
666 TermKind::Ty(ty).pack()
667 }
668}
669
670impl<'tcx> From<Const<'tcx>> for Term<'tcx> {
671 fn from(c: Const<'tcx>) -> Self {
672 TermKind::Const(c).pack()
673 }
674}
675
676impl<'tcx> StableHash for Term<'tcx> {
677 fn stable_hash<Hcx: StableHashCtxt>(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
678 self.kind().stable_hash(hcx, hasher);
679 }
680}
681
682impl<'tcx> TypeFoldable<TyCtxt<'tcx>> for Term<'tcx> {
683 fn try_fold_with<F: FallibleTypeFolder<TyCtxt<'tcx>>>(
684 self,
685 folder: &mut F,
686 ) -> Result<Self, F::Error> {
687 match self.kind() {
688 ty::TermKind::Ty(ty) => ty.try_fold_with(folder).map(Into::into),
689 ty::TermKind::Const(ct) => ct.try_fold_with(folder).map(Into::into),
690 }
691 }
692
693 fn fold_with<F: TypeFolder<TyCtxt<'tcx>>>(self, folder: &mut F) -> Self {
694 match self.kind() {
695 ty::TermKind::Ty(ty) => ty.fold_with(folder).into(),
696 ty::TermKind::Const(ct) => ct.fold_with(folder).into(),
697 }
698 }
699}
700
701impl<'tcx> TypeVisitable<TyCtxt<'tcx>> for Term<'tcx> {
702 fn visit_with<V: TypeVisitor<TyCtxt<'tcx>>>(&self, visitor: &mut V) -> V::Result {
703 match self.kind() {
704 ty::TermKind::Ty(ty) => ty.visit_with(visitor),
705 ty::TermKind::Const(ct) => ct.visit_with(visitor),
706 }
707 }
708}
709
710impl<'tcx, E: TyEncoder<'tcx>> Encodable<E> for Term<'tcx> {
711 fn encode(&self, e: &mut E) {
712 self.kind().encode(e)
713 }
714}
715
716impl<'tcx, D: TyDecoder<'tcx>> Decodable<D> for Term<'tcx> {
717 fn decode(d: &mut D) -> Self {
718 let res: TermKind<'tcx> = Decodable::decode(d);
719 res.pack()
720 }
721}
722
723impl<'tcx> Term<'tcx> {
724 #[inline]
725 pub fn kind(self) -> TermKind<'tcx> {
726 let ptr =
727 unsafe { self.ptr.map_addr(|addr| NonZero::new_unchecked(addr.get() & !TAG_MASK)) };
728 unsafe {
732 match self.ptr.addr().get() & TAG_MASK {
733 TYPE_TAG => TermKind::Ty(Ty(Interned::new_unchecked(
734 ptr.cast::<WithCachedTypeInfo<ty::TyKind<'tcx>>>().as_ref(),
735 ))),
736 CONST_TAG => TermKind::Const(ty::Const(Interned::new_unchecked(
737 ptr.cast::<WithCachedTypeInfo<ty::ConstKind<'tcx>>>().as_ref(),
738 ))),
739 _ => core::intrinsics::unreachable(),
740 }
741 }
742 }
743
744 pub fn as_type(&self) -> Option<Ty<'tcx>> {
745 if let TermKind::Ty(ty) = self.kind() { Some(ty) } else { None }
746 }
747
748 pub fn expect_type(&self) -> Ty<'tcx> {
749 self.as_type().expect("expected a type, but found a const")
750 }
751
752 pub fn as_const(&self) -> Option<Const<'tcx>> {
753 if let TermKind::Const(c) = self.kind() { Some(c) } else { None }
754 }
755
756 pub fn expect_const(&self) -> Const<'tcx> {
757 self.as_const().expect("expected a const, but found a type")
758 }
759
760 pub fn into_arg(self) -> GenericArg<'tcx> {
761 match self.kind() {
762 TermKind::Ty(ty) => ty.into(),
763 TermKind::Const(c) => c.into(),
764 }
765 }
766
767 pub fn to_alias_term(self) -> Option<AliasTerm<'tcx>> {
768 match self.kind() {
769 TermKind::Ty(ty) => match *ty.kind() {
770 ty::Alias(_, alias_ty) => Some(alias_ty.into()),
771 _ => None,
772 },
773 TermKind::Const(ct) => match ct.kind() {
774 ConstKind::Alias(_, alias_const) => Some(alias_const.into()),
775 _ => None,
776 },
777 }
778 }
779
780 pub fn is_non_rigid_alias(self) -> bool {
781 match self.kind() {
782 ty::TermKind::Ty(ty) => match ty.kind() {
783 ty::Alias(ty::IsRigid::No, _) => true,
784 _ => false,
785 },
786 ty::TermKind::Const(ct) => match ct.kind() {
787 ty::ConstKind::Alias(ty::IsRigid::No, _) => true,
788 _ => false,
789 },
790 }
791 }
792
793 pub fn is_infer(&self) -> bool {
794 match self.kind() {
795 TermKind::Ty(ty) => ty.is_ty_var(),
796 TermKind::Const(ct) => ct.is_ct_infer(),
797 }
798 }
799
800 pub fn is_trivially_wf(&self, tcx: TyCtxt<'tcx>) -> bool {
801 match self.kind() {
802 TermKind::Ty(ty) => ty.is_trivially_wf(tcx),
803 TermKind::Const(ct) => ct.is_trivially_wf(),
804 }
805 }
806
807 pub fn walk(self) -> TypeWalker<TyCtxt<'tcx>> {
818 TypeWalker::new(self.into())
819 }
820}
821
822const TAG_MASK: usize = 0b11;
823const TYPE_TAG: usize = 0b00;
824const CONST_TAG: usize = 0b01;
825
826impl<'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>)]
827impl<'tcx> TermKind<'tcx> {
828 #[inline]
829 fn pack(self) -> Term<'tcx> {
830 let (tag, ptr) = match self {
831 TermKind::Ty(ty) => {
832 assert_eq!(align_of_val(&*ty.0.0) & TAG_MASK, 0);
834 (TYPE_TAG, NonNull::from(ty.0.0).cast())
835 }
836 TermKind::Const(ct) => {
837 assert_eq!(align_of_val(&*ct.0.0) & TAG_MASK, 0);
839 (CONST_TAG, NonNull::from(ct.0.0).cast())
840 }
841 };
842
843 Term { ptr: ptr.map_addr(|addr| addr | tag), marker: PhantomData }
844 }
845}
846
847#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for InstantiatedClauses<'tcx> {
#[inline]
fn clone(&self) -> InstantiatedClauses<'tcx> {
InstantiatedClauses {
clauses: ::core::clone::Clone::clone(&self.clauses),
spans: ::core::clone::Clone::clone(&self.spans),
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for InstantiatedClauses<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"InstantiatedClauses", "clauses", &self.clauses, "spans",
&&self.spans)
}
}Debug)]
867pub struct InstantiatedClauses<'tcx> {
868 pub clauses: Vec<Unnormalized<'tcx, Clause<'tcx>>>,
869 pub spans: Vec<Span>,
870}
871
872impl<'tcx> InstantiatedClauses<'tcx> {
873 pub fn empty() -> InstantiatedClauses<'tcx> {
874 InstantiatedClauses { clauses: ::alloc::vec::Vec::new()vec![], spans: ::alloc::vec::Vec::new()vec![] }
875 }
876
877 pub fn is_empty(&self) -> bool {
878 self.clauses.is_empty()
879 }
880
881 pub fn iter(&self) -> <&Self as IntoIterator>::IntoIter {
882 self.into_iter()
883 }
884}
885
886impl<'tcx> IntoIterator for InstantiatedClauses<'tcx> {
887 type Item = (Unnormalized<'tcx, Clause<'tcx>>, Span);
888
889 type IntoIter = std::iter::Zip<
890 std::vec::IntoIter<Unnormalized<'tcx, Clause<'tcx>>>,
891 std::vec::IntoIter<Span>,
892 >;
893
894 fn into_iter(self) -> Self::IntoIter {
895 if true {
{
match (&self.clauses.len(), &self.spans.len()) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
}
};
};debug_assert_eq!(self.clauses.len(), self.spans.len());
896 std::iter::zip(self.clauses, self.spans)
897 }
898}
899
900impl<'a, 'tcx> IntoIterator for &'a InstantiatedClauses<'tcx> {
901 type Item = (Unnormalized<'tcx, Clause<'tcx>>, Span);
902
903 type IntoIter = std::iter::Zip<
904 std::iter::Copied<std::slice::Iter<'a, Unnormalized<'tcx, Clause<'tcx>>>>,
905 std::iter::Copied<std::slice::Iter<'a, Span>>,
906 >;
907
908 fn into_iter(self) -> Self::IntoIter {
909 if true {
{
match (&self.clauses.len(), &self.spans.len()) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
}
};
};debug_assert_eq!(self.clauses.len(), self.spans.len());
910 std::iter::zip(self.clauses.iter().copied(), self.spans.iter().copied())
911 }
912}
913
914#[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)]
915pub struct ProvisionalHiddenType<'tcx> {
916 pub span: Span,
930
931 pub ty: Ty<'tcx>,
944}
945
946#[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)]
948pub enum DefiningScopeKind {
949 HirTypeck,
954 MirBorrowck,
955}
956
957impl<'tcx> ProvisionalHiddenType<'tcx> {
958 pub fn new_error(tcx: TyCtxt<'tcx>, guar: ErrorGuaranteed) -> ProvisionalHiddenType<'tcx> {
959 ProvisionalHiddenType { span: DUMMY_SP, ty: Ty::new_error(tcx, guar) }
960 }
961
962 pub fn build_mismatch_error(
963 &self,
964 other: &Self,
965 tcx: TyCtxt<'tcx>,
966 ) -> Result<Diag<'tcx>, ErrorGuaranteed> {
967 (self.ty, other.ty).error_reported()?;
968 let sub_diag = if self.span == other.span {
970 TypeMismatchReason::ConflictType { span: self.span }
971 } else {
972 TypeMismatchReason::PreviousUse { span: self.span }
973 };
974 Ok(tcx.dcx().create_err(OpaqueHiddenTypeMismatch {
975 self_ty: self.ty,
976 other_ty: other.ty,
977 other_span: other.span,
978 sub: sub_diag,
979 }))
980 }
981
982 x;#[instrument(level = "debug", skip(tcx), ret)]
983 pub fn remap_generic_params_to_declaration_params(
984 self,
985 opaque_type_key: OpaqueTypeKey<'tcx>,
986 tcx: TyCtxt<'tcx>,
987 defining_scope_kind: DefiningScopeKind,
988 ) -> DefinitionSiteHiddenType<'tcx> {
989 let OpaqueTypeKey { def_id, args } = opaque_type_key;
990
991 let id_args = GenericArgs::identity_for_item(tcx, def_id);
998 debug!(?id_args);
999
1000 let map = args.iter().zip(id_args).collect();
1004 debug!("map = {:#?}", map);
1005
1006 let ty = match defining_scope_kind {
1012 DefiningScopeKind::HirTypeck => {
1013 fold_regions(tcx, self.ty, |_, _| tcx.lifetimes.re_erased)
1014 }
1015 DefiningScopeKind::MirBorrowck => self.ty,
1016 };
1017 let result_ty = ty.fold_with(&mut opaque_types::ReverseMapper::new(tcx, map, self.span));
1018 if cfg!(debug_assertions) && matches!(defining_scope_kind, DefiningScopeKind::HirTypeck) {
1019 assert_eq!(result_ty, fold_regions(tcx, result_ty, |_, _| tcx.lifetimes.re_erased));
1020 }
1021 DefinitionSiteHiddenType { span: self.span, ty: ty::EarlyBinder::bind(tcx, result_ty) }
1022 }
1023}
1024
1025#[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)]
1026pub struct DefinitionSiteHiddenType<'tcx> {
1027 pub span: Span,
1040
1041 pub ty: ty::EarlyBinder<'tcx, Ty<'tcx>>,
1043}
1044
1045impl<'tcx> DefinitionSiteHiddenType<'tcx> {
1046 pub fn new_error(tcx: TyCtxt<'tcx>, guar: ErrorGuaranteed) -> DefinitionSiteHiddenType<'tcx> {
1047 DefinitionSiteHiddenType {
1048 span: DUMMY_SP,
1049 ty: ty::EarlyBinder::bind(tcx, Ty::new_error(tcx, guar)),
1050 }
1051 }
1052
1053 pub fn build_mismatch_error(
1054 &self,
1055 other: &Self,
1056 tcx: TyCtxt<'tcx>,
1057 ) -> Result<Diag<'tcx>, ErrorGuaranteed> {
1058 let self_ty = self.ty.instantiate_identity().skip_norm_wip();
1059 let other_ty = other.ty.instantiate_identity().skip_norm_wip();
1060 (self_ty, other_ty).error_reported()?;
1061 let sub_diag = if self.span == other.span {
1063 TypeMismatchReason::ConflictType { span: self.span }
1064 } else {
1065 TypeMismatchReason::PreviousUse { span: self.span }
1066 };
1067 Ok(tcx.dcx().create_err(OpaqueHiddenTypeMismatch {
1068 self_ty,
1069 other_ty,
1070 other_span: other.span,
1071 sub: sub_diag,
1072 }))
1073 }
1074}
1075
1076pub type Clauses<'tcx> = &'tcx ListWithCachedTypeInfo<Clause<'tcx>>;
1077
1078impl<'tcx> rustc_type_ir::Flags for Clauses<'tcx> {
1079 fn flags(&self) -> TypeFlags {
1080 (**self).flags()
1081 }
1082
1083 fn outer_exclusive_binder(&self) -> DebruijnIndex {
1084 (**self).outer_exclusive_binder()
1085 }
1086}
1087
1088#[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)]
1094#[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)]
1095pub struct ParamEnv<'tcx> {
1096 caller_bounds: Clauses<'tcx>,
1102}
1103
1104impl<'tcx> rustc_type_ir::inherent::ParamEnv<TyCtxt<'tcx>> for ParamEnv<'tcx> {
1105 fn caller_bounds(self) -> impl inherent::SliceLike<Item = ty::Clause<'tcx>> {
1106 self.caller_bounds()
1107 }
1108}
1109
1110impl<'tcx> ParamEnv<'tcx> {
1111 #[inline]
1118 pub fn empty() -> Self {
1119 Self::new(ListWithCachedTypeInfo::empty())
1120 }
1121
1122 #[inline]
1123 pub fn caller_bounds(self) -> Clauses<'tcx> {
1124 self.caller_bounds
1125 }
1126
1127 #[inline]
1129 pub fn new(caller_bounds: Clauses<'tcx>) -> Self {
1130 ParamEnv { caller_bounds }
1131 }
1132
1133 pub fn and<T: TypeVisitable<TyCtxt<'tcx>>>(self, value: T) -> ParamEnvAnd<'tcx, T> {
1135 ParamEnvAnd { param_env: self, value }
1136 }
1137
1138 pub fn with_normalized(self, tcx: TyCtxt<'tcx>) -> ParamEnv<'tcx> {
1140 if tcx.next_trait_solver_globally() {
1143 self
1144 } else {
1145 ParamEnv::new(tcx.reveal_opaque_types_in_bounds(self.caller_bounds))
1146 }
1147 }
1148}
1149
1150#[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)]
1151#[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)]
1152pub struct ParamEnvAnd<'tcx, T> {
1153 pub param_env: ParamEnv<'tcx>,
1154 pub value: T,
1155}
1156
1157#[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)]
1168#[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)]
1169pub struct TypingEnv<'tcx> {
1170 #[type_foldable(identity)]
1171 #[type_visitable(ignore)]
1172 typing_mode: TypingModeEqWrapper<'tcx>,
1173 pub param_env: ParamEnv<'tcx>,
1174}
1175
1176impl<'tcx> TypingEnv<'tcx> {
1177 pub fn new(param_env: ParamEnv<'tcx>, typing_mode: TypingMode<'tcx>) -> Self {
1178 Self { typing_mode: TypingModeEqWrapper(typing_mode), param_env }
1179 }
1180
1181 pub fn typing_mode(&self) -> TypingMode<'tcx> {
1182 self.typing_mode.0
1183 }
1184
1185 pub fn fully_monomorphized() -> TypingEnv<'tcx> {
1193 Self::new(ParamEnv::empty(), TypingMode::Codegen)
1194 }
1195
1196 pub fn non_body_analysis(
1202 tcx: TyCtxt<'tcx>,
1203 def_id: impl IntoQueryKey<DefId>,
1204 ) -> TypingEnv<'tcx> {
1205 let def_id = def_id.into_query_key();
1206 Self::new(tcx.param_env(def_id), TypingMode::non_body_analysis())
1207 }
1208
1209 pub fn post_typeck_until_borrowck_for_mir_build(
1214 tcx: TyCtxt<'tcx>,
1215 def_id: LocalDefId,
1216 ) -> TypingEnv<'tcx> {
1217 if tcx.use_typing_mode_post_typeck_until_borrowck() {
1218 TypingEnv::new(tcx.param_env(def_id.to_def_id()), ty::TypingMode::borrowck(tcx, def_id))
1219 } else {
1220 TypingEnv::non_body_analysis(tcx, def_id)
1223 }
1224 }
1225
1226 pub fn post_analysis(tcx: TyCtxt<'tcx>, def_id: impl IntoQueryKey<DefId>) -> TypingEnv<'tcx> {
1227 TypingEnv::new(tcx.param_env_normalized_for_post_analysis(def_id), TypingMode::PostAnalysis)
1228 }
1229
1230 pub fn codegen(tcx: TyCtxt<'tcx>, def_id: impl IntoQueryKey<DefId>) -> TypingEnv<'tcx> {
1231 TypingEnv::new(tcx.param_env_normalized_for_post_analysis(def_id), TypingMode::Codegen)
1232 }
1233
1234 pub fn with_post_analysis_normalized(self, tcx: TyCtxt<'tcx>) -> TypingEnv<'tcx> {
1237 let TypingEnv { typing_mode, param_env } = self;
1238 match typing_mode.0.assert_not_erased() {
1239 TypingMode::Coherence
1240 | TypingMode::Reflection
1241 | TypingMode::Typeck { .. }
1242 | TypingMode::PostTypeckUntilBorrowck { .. }
1243 | TypingMode::PostBorrowck { .. } => {}
1244 TypingMode::PostAnalysis | TypingMode::Codegen => return self,
1245 }
1246
1247 let param_env = param_env.with_normalized(tcx);
1248 TypingEnv::new(param_env, TypingMode::PostAnalysis)
1249 }
1250
1251 pub fn with_codegen_normalized(self, tcx: TyCtxt<'tcx>) -> TypingEnv<'tcx> {
1254 let TypingEnv { typing_mode, param_env } = self;
1255 match typing_mode.0.assert_not_erased() {
1256 TypingMode::Coherence
1257 | TypingMode::Reflection
1258 | TypingMode::Typeck { .. }
1259 | TypingMode::PostTypeckUntilBorrowck { .. }
1260 | TypingMode::PostBorrowck { .. }
1261 | TypingMode::PostAnalysis => {}
1262 TypingMode::Codegen => return self,
1263 }
1264
1265 let param_env = param_env.with_normalized(tcx);
1266 TypingEnv::new(param_env, TypingMode::Codegen)
1267 }
1268
1269 pub fn as_query_input<T>(self, value: T) -> PseudoCanonicalInput<'tcx, T>
1274 where
1275 T: TypeVisitable<TyCtxt<'tcx>>,
1276 {
1277 PseudoCanonicalInput { typing_env: self, value }
1290 }
1291}
1292
1293#[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)]
1303#[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)]
1304pub struct PseudoCanonicalInput<'tcx, T> {
1305 pub typing_env: TypingEnv<'tcx>,
1306 pub value: T,
1307}
1308
1309#[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)]
1310pub struct Destructor {
1311 pub did: DefId,
1313}
1314
1315#[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)]
1317pub struct AsyncDestructor {
1318 pub impl_did: DefId,
1320}
1321
1322#[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)]
1323pub struct VariantFlags(u8);
1324impl 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! {
1325 impl VariantFlags: u8 {
1326 const NO_VARIANT_FLAGS = 0;
1327 const IS_FIELD_LIST_NON_EXHAUSTIVE = 1 << 0;
1329 }
1330}
1331impl ::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 }
1332
1333#[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)]
1335pub struct VariantDef {
1336 pub def_id: DefId,
1339 pub ctor: Option<(CtorKind, DefId)>,
1342 pub name: Symbol,
1344 pub discr: VariantDiscr,
1346 pub fields: IndexVec<FieldIdx, FieldDef>,
1348 tainted: Option<ErrorGuaranteed>,
1350 flags: VariantFlags,
1352}
1353
1354impl VariantDef {
1355 #[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(1371u32),
::tracing_core::__macro_support::Option::Some("rustc_middle::ty"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("name")
}> =
::tracing::__macro_support::FieldName::new("name");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("variant_did")
}> =
::tracing::__macro_support::FieldName::new("variant_did");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("ctor")
}> =
::tracing::__macro_support::FieldName::new("ctor");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("discr")
}> =
::tracing::__macro_support::FieldName::new("discr");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("fields")
}> =
::tracing::__macro_support::FieldName::new("fields");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("parent_did")
}> =
::tracing::__macro_support::FieldName::new("parent_did");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("recover_tainted")
}> =
::tracing::__macro_support::FieldName::new("recover_tainted");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("is_field_list_non_exhaustive")
}> =
::tracing::__macro_support::FieldName::new("is_field_list_non_exhaustive");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&name)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&variant_did)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&ctor)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&discr)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&fields)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&parent_did)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&recover_tainted)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&is_field_list_non_exhaustive
as &dyn ::tracing::field::Value))])
})
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[warn(clippy :: suspicious_else_formatting)]
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy ::
needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return: Self = loop {};
return __tracing_attr_fake_return;
}
{
let mut flags = VariantFlags::NO_VARIANT_FLAGS;
if is_field_list_non_exhaustive {
flags |= VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE;
}
VariantDef {
def_id: variant_did.unwrap_or(parent_did),
ctor,
name,
discr,
fields,
flags,
tainted: recover_tainted,
}
}
}
}#[instrument(level = "debug")]
1372 pub fn new(
1373 name: Symbol,
1374 variant_did: Option<DefId>,
1375 ctor: Option<(CtorKind, DefId)>,
1376 discr: VariantDiscr,
1377 fields: IndexVec<FieldIdx, FieldDef>,
1378 parent_did: DefId,
1379 recover_tainted: Option<ErrorGuaranteed>,
1380 is_field_list_non_exhaustive: bool,
1381 ) -> Self {
1382 let mut flags = VariantFlags::NO_VARIANT_FLAGS;
1383 if is_field_list_non_exhaustive {
1384 flags |= VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE;
1385 }
1386
1387 VariantDef {
1388 def_id: variant_did.unwrap_or(parent_did),
1389 ctor,
1390 name,
1391 discr,
1392 fields,
1393 flags,
1394 tainted: recover_tainted,
1395 }
1396 }
1397
1398 #[inline]
1404 pub fn is_field_list_non_exhaustive(&self) -> bool {
1405 self.flags.intersects(VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE)
1406 }
1407
1408 #[inline]
1411 pub fn field_list_has_applicable_non_exhaustive(&self) -> bool {
1412 self.is_field_list_non_exhaustive() && !self.def_id.is_local()
1413 }
1414
1415 pub fn ident(&self, tcx: TyCtxt<'_>) -> Ident {
1417 Ident::new(self.name, tcx.def_ident_span(self.def_id).unwrap())
1418 }
1419
1420 #[inline]
1422 pub fn has_errors(&self) -> Result<(), ErrorGuaranteed> {
1423 self.tainted.map_or(Ok(()), Err)
1424 }
1425
1426 #[inline]
1427 pub fn ctor_kind(&self) -> Option<CtorKind> {
1428 self.ctor.map(|(kind, _)| kind)
1429 }
1430
1431 #[inline]
1432 pub fn ctor_def_id(&self) -> Option<DefId> {
1433 self.ctor.map(|(_, def_id)| def_id)
1434 }
1435
1436 #[inline]
1440 pub fn single_field(&self) -> &FieldDef {
1441 if !(self.fields.len() == 1) {
::core::panicking::panic("assertion failed: self.fields.len() == 1")
};assert!(self.fields.len() == 1);
1442
1443 &self.fields[FieldIdx::ZERO]
1444 }
1445
1446 #[inline]
1448 pub fn tail_opt(&self) -> Option<&FieldDef> {
1449 self.fields.raw.last()
1450 }
1451
1452 #[inline]
1458 pub fn tail(&self) -> &FieldDef {
1459 self.tail_opt().expect("expected unsized ADT to have a tail field")
1460 }
1461
1462 pub fn has_unsafe_fields(&self) -> bool {
1464 self.fields.iter().any(|x| x.safety.is_unsafe())
1465 }
1466}
1467
1468impl PartialEq for VariantDef {
1469 #[inline]
1470 fn eq(&self, other: &Self) -> bool {
1471 let Self {
1479 def_id: lhs_def_id,
1480 ctor: _,
1481 name: _,
1482 discr: _,
1483 fields: _,
1484 flags: _,
1485 tainted: _,
1486 } = &self;
1487 let Self {
1488 def_id: rhs_def_id,
1489 ctor: _,
1490 name: _,
1491 discr: _,
1492 fields: _,
1493 flags: _,
1494 tainted: _,
1495 } = other;
1496
1497 let res = lhs_def_id == rhs_def_id;
1498
1499 if truecfg!(debug_assertions) && res {
1501 let deep = self.ctor == other.ctor
1502 && self.name == other.name
1503 && self.discr == other.discr
1504 && self.fields == other.fields
1505 && self.flags == other.flags;
1506 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");
1507 }
1508
1509 res
1510 }
1511}
1512
1513impl Eq for VariantDef {}
1514
1515impl Hash for VariantDef {
1516 #[inline]
1517 fn hash<H: Hasher>(&self, s: &mut H) {
1518 let Self { def_id, ctor: _, name: _, discr: _, fields: _, flags: _, tainted: _ } = &self;
1526 def_id.hash(s)
1527 }
1528}
1529
1530#[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)]
1531pub enum VariantDiscr {
1532 Explicit(DefId),
1535
1536 Relative(u32),
1541}
1542
1543#[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)]
1544pub struct FieldDef {
1545 pub did: DefId,
1546 pub name: Symbol,
1547 pub vis: Visibility<ModId>,
1548 pub safety: hir::Safety,
1549 pub value: Option<DefId>,
1550}
1551
1552impl PartialEq for FieldDef {
1553 #[inline]
1554 fn eq(&self, other: &Self) -> bool {
1555 let Self { did: lhs_did, name: _, vis: _, safety: _, value: _ } = &self;
1563
1564 let Self { did: rhs_did, name: _, vis: _, safety: _, value: _ } = other;
1565
1566 let res = lhs_did == rhs_did;
1567
1568 if truecfg!(debug_assertions) && res {
1570 let deep =
1571 self.name == other.name && self.vis == other.vis && self.safety == other.safety;
1572 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");
1573 }
1574
1575 res
1576 }
1577}
1578
1579impl Eq for FieldDef {}
1580
1581impl Hash for FieldDef {
1582 #[inline]
1583 fn hash<H: Hasher>(&self, s: &mut H) {
1584 let Self { did, name: _, vis: _, safety: _, value: _ } = &self;
1592
1593 did.hash(s)
1594 }
1595}
1596
1597impl<'tcx> FieldDef {
1598 pub fn ty(
1601 &self,
1602 tcx: TyCtxt<'tcx>,
1603 args: GenericArgsRef<'tcx>,
1604 ) -> Unnormalized<'tcx, Ty<'tcx>> {
1605 tcx.type_of(self.did).instantiate(tcx, args)
1606 }
1607
1608 pub fn ident(&self, tcx: TyCtxt<'_>) -> Ident {
1610 Ident::new(self.name, tcx.def_ident_span(self.did).unwrap())
1611 }
1612}
1613
1614#[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)]
1615pub enum ImplOverlapKind {
1616 Permitted {
1618 marker: bool,
1620 },
1621}
1622
1623#[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)]
1626pub enum ImplTraitInTraitData {
1627 Trait { fn_def_id: DefId, opaque_def_id: DefId },
1628 Impl { fn_def_id: DefId },
1629}
1630
1631impl<'tcx> TyCtxt<'tcx> {
1632 pub fn typeck_body(self, body: hir::BodyId) -> &'tcx TypeckResults<'tcx> {
1633 self.typeck(self.hir_body_owner_def_id(body))
1634 }
1635
1636 pub fn provided_trait_methods(self, id: DefId) -> impl 'tcx + Iterator<Item = &'tcx AssocItem> {
1637 self.associated_items(id)
1638 .in_definition_order()
1639 .filter(move |item| item.is_fn() && item.defaultness(self).has_value())
1640 }
1641
1642 pub fn repr_options_of_def(self, did: LocalDefId) -> ReprOptions {
1643 let mut flags = ReprFlags::empty();
1644 let mut size = None;
1645 let mut max_align: Option<Align> = None;
1646 let mut min_pack: Option<Align> = None;
1647
1648 let mut field_shuffle_seed = self.def_path_hash(did.to_def_id()).0.to_smaller_hash();
1651
1652 if let Some(user_seed) = self.sess.opts.unstable_opts.layout_seed {
1656 field_shuffle_seed ^= user_seed;
1657 }
1658
1659 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
1660 )
1661 .map(|elt| match elt {
1662 Some(n) => ScalableElt::ElementCount(*n),
1663 None => ScalableElt::Container,
1664 });
1665 if elt.is_some() {
1666 flags.insert(ReprFlags::IS_SCALABLE);
1667 }
1668 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) {
1669 for (r, _) in reprs {
1670 flags.insert(match *r {
1671 attr::ReprRust => ReprFlags::empty(),
1672 attr::ReprC => ReprFlags::IS_C,
1673 attr::ReprPacked(pack) => {
1674 min_pack = Some(if let Some(min_pack) = min_pack {
1675 min_pack.min(pack)
1676 } else {
1677 pack
1678 });
1679 ReprFlags::empty()
1680 }
1681 attr::ReprTransparent => ReprFlags::IS_TRANSPARENT,
1682 attr::ReprSimd => ReprFlags::IS_SIMD,
1683 attr::ReprInt(i) => {
1684 size = Some(match i {
1685 attr::IntType::SignedInt(x) => match x {
1686 ast::IntTy::Isize => IntegerType::Pointer(true),
1687 ast::IntTy::I8 => IntegerType::Fixed(Integer::I8, true),
1688 ast::IntTy::I16 => IntegerType::Fixed(Integer::I16, true),
1689 ast::IntTy::I32 => IntegerType::Fixed(Integer::I32, true),
1690 ast::IntTy::I64 => IntegerType::Fixed(Integer::I64, true),
1691 ast::IntTy::I128 => IntegerType::Fixed(Integer::I128, true),
1692 },
1693 attr::IntType::UnsignedInt(x) => match x {
1694 ast::UintTy::Usize => IntegerType::Pointer(false),
1695 ast::UintTy::U8 => IntegerType::Fixed(Integer::I8, false),
1696 ast::UintTy::U16 => IntegerType::Fixed(Integer::I16, false),
1697 ast::UintTy::U32 => IntegerType::Fixed(Integer::I32, false),
1698 ast::UintTy::U64 => IntegerType::Fixed(Integer::I64, false),
1699 ast::UintTy::U128 => IntegerType::Fixed(Integer::I128, false),
1700 },
1701 });
1702 ReprFlags::empty()
1703 }
1704 attr::ReprAlign(align) => {
1705 max_align = max_align.max(Some(align));
1706 ReprFlags::empty()
1707 }
1708 });
1709 }
1710 }
1711
1712 if self.sess.opts.unstable_opts.randomize_layout {
1715 flags.insert(ReprFlags::RANDOMIZE_LAYOUT);
1716 }
1717
1718 let is_box = self.is_lang_item(did.to_def_id(), LangItem::OwnedBox);
1721
1722 if is_box {
1724 flags.insert(ReprFlags::IS_LINEAR);
1725 }
1726
1727 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(..)) {
1729 flags.insert(ReprFlags::PASS_INDIRECTLY_IN_NON_RUSTIC_ABIS);
1730 }
1731
1732 ReprOptions {
1733 int: size,
1734 align: max_align,
1735 pack: min_pack,
1736 flags,
1737 field_shuffle_seed,
1738 scalable: elt,
1739 }
1740 }
1741
1742 pub fn opt_item_name(self, def_id: impl IntoQueryKey<DefId>) -> Option<Symbol> {
1744 let def_id = def_id.into_query_key();
1745 if let Some(cnum) = def_id.as_crate_root() {
1746 Some(self.crate_name(cnum))
1747 } else {
1748 let def_key = self.def_key(def_id);
1749 match def_key.disambiguated_data.data {
1750 rustc_hir::definitions::DefPathData::Ctor => self
1752 .opt_item_name(DefId { krate: def_id.krate, index: def_key.parent.unwrap() }),
1753 _ => def_key.get_opt_name(),
1754 }
1755 }
1756 }
1757
1758 pub fn item_name(self, id: impl IntoQueryKey<DefId>) -> Symbol {
1765 let id = id.into_query_key();
1766 self.opt_item_name(id).unwrap_or_else(|| {
1767 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));
1768 })
1769 }
1770
1771 pub fn opt_item_ident(self, def_id: impl IntoQueryKey<DefId>) -> Option<Ident> {
1775 let def_id = def_id.into_query_key();
1776 let def = self.opt_item_name(def_id)?;
1777 let span = self
1778 .def_ident_span(def_id)
1779 .unwrap_or_else(|| crate::util::bug::bug_fmt(format_args!("missing ident span for {0:?}",
def_id))bug!("missing ident span for {def_id:?}"));
1780 Some(Ident::new(def, span))
1781 }
1782
1783 pub fn item_ident(self, def_id: impl IntoQueryKey<DefId>) -> Ident {
1787 let def_id = def_id.into_query_key();
1788 self.opt_item_ident(def_id).unwrap_or_else(|| {
1789 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));
1790 })
1791 }
1792
1793 pub fn opt_associated_item(self, def_id: DefId) -> Option<AssocItem> {
1794 if let DefKind::AssocConst { .. } | DefKind::AssocFn | DefKind::AssocTy =
1795 self.def_kind(def_id)
1796 {
1797 Some(self.associated_item(def_id))
1798 } else {
1799 None
1800 }
1801 }
1802
1803 pub fn opt_rpitit_info(self, def_id: DefId) -> Option<ImplTraitInTraitData> {
1807 if let DefKind::AssocTy = self.def_kind(def_id)
1808 && let AssocKind::Type { data: AssocTypeData::Rpitit(rpitit_info) } =
1809 self.associated_item(def_id).kind
1810 {
1811 Some(rpitit_info)
1812 } else {
1813 None
1814 }
1815 }
1816
1817 pub fn find_field_index(self, ident: Ident, variant: &VariantDef) -> Option<FieldIdx> {
1818 variant.fields.iter_enumerated().find_map(|(i, field)| {
1819 self.hygienic_eq(ident, field.ident(self), variant.def_id).then_some(i)
1820 })
1821 }
1822
1823 x;#[instrument(level = "debug", skip(self), ret)]
1826 pub fn impls_are_allowed_to_overlap(
1827 self,
1828 def_id1: DefId,
1829 def_id2: DefId,
1830 ) -> Option<ImplOverlapKind> {
1831 let impl1 = self.impl_trait_header(def_id1);
1832 let impl2 = self.impl_trait_header(def_id2);
1833
1834 let trait_ref1 = impl1.trait_ref.skip_binder();
1835 let trait_ref2 = impl2.trait_ref.skip_binder();
1836
1837 if trait_ref1.references_error() || trait_ref2.references_error() {
1840 return Some(ImplOverlapKind::Permitted { marker: false });
1841 }
1842
1843 match (impl1.polarity, impl2.polarity) {
1844 (ImplPolarity::Reservation, _) | (_, ImplPolarity::Reservation) => {
1845 return Some(ImplOverlapKind::Permitted { marker: false });
1847 }
1848 (ImplPolarity::Positive, ImplPolarity::Negative)
1849 | (ImplPolarity::Negative, ImplPolarity::Positive) => {
1850 return None;
1852 }
1853 (ImplPolarity::Positive, ImplPolarity::Positive)
1854 | (ImplPolarity::Negative, ImplPolarity::Negative) => {}
1855 };
1856
1857 let is_marker_impl = |trait_ref: TraitRef<'_>| self.trait_def(trait_ref.def_id).is_marker;
1858 let is_marker_overlap = is_marker_impl(trait_ref1) && is_marker_impl(trait_ref2);
1859
1860 if is_marker_overlap {
1861 return Some(ImplOverlapKind::Permitted { marker: true });
1862 }
1863
1864 None
1865 }
1866
1867 pub fn expect_variant_res(self, res: Res) -> &'tcx VariantDef {
1870 match res {
1871 Res::Def(DefKind::Variant, did) => {
1872 let enum_did = self.parent(did);
1873 self.adt_def(enum_did).variant_with_id(did)
1874 }
1875 Res::Def(DefKind::Struct | DefKind::Union, did) => self.adt_def(did).non_enum_variant(),
1876 Res::Def(DefKind::Ctor(CtorOf::Variant, ..), variant_ctor_did) => {
1877 let variant_did = self.parent(variant_ctor_did);
1878 let enum_did = self.parent(variant_did);
1879 self.adt_def(enum_did).variant_with_ctor_id(variant_ctor_did)
1880 }
1881 Res::Def(DefKind::Ctor(CtorOf::Struct, ..), ctor_did) => {
1882 let struct_did = self.parent(ctor_did);
1883 self.adt_def(struct_did).non_enum_variant()
1884 }
1885 _ => 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),
1886 }
1887 }
1888
1889 #[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(1890u32),
::tracing_core::__macro_support::Option::Some("rustc_middle::ty"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("instance")
}> =
::tracing::__macro_support::FieldName::new("instance");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&instance)
as &dyn ::tracing::field::Value))])
})
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[warn(clippy :: suspicious_else_formatting)]
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy ::
needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return: &'tcx Body<'tcx> = loop {};
return __tracing_attr_fake_return;
}
{
let body =
match instance {
ty::InstanceKind::Item(def) => {
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_middle/src/ty/mod.rs:1894",
"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(1894u32),
::tracing_core::__macro_support::Option::Some("rustc_middle::ty"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("calling def_kind on def: {0:?}",
def) as &dyn ::tracing::field::Value))])
});
} else { ; }
};
let def_kind = self.def_kind(def);
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_middle/src/ty/mod.rs:1896",
"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(1896u32),
::tracing_core::__macro_support::Option::Some("rustc_middle::ty"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("returned from def_kind: {0:?}",
def_kind) as &dyn ::tracing::field::Value))])
});
} else { ; }
};
match def_kind {
DefKind::Const { .. } | DefKind::Static { .. } |
DefKind::AssocConst { .. } | DefKind::Ctor(..) |
DefKind::AnonConst => self.mir_for_ctfe(def),
DefKind::Fn | DefKind::AssocFn if
#[allow(non_exhaustive_omitted_patterns)] match self.constness(def)
{
hir::Constness::Const { always: true } => true,
_ => false,
} => {
self.mir_for_ctfe(def)
}
_ => self.optimized_mir(def),
}
}
ty::InstanceKind::Intrinsic(..) |
ty::InstanceKind::LlvmIntrinsic(..) => {
crate::util::bug::bug_fmt(format_args!("intrinsics have no instance MIR"))
}
ty::InstanceKind::Virtual(..) =>
crate::util::bug::bug_fmt(format_args!("virtual dispatches have no instance MIR")),
ty::InstanceKind::Shim(shim) => self.mir_shims(shim),
};
if !#[allow(non_exhaustive_omitted_patterns)] match body.phase {
MirPhase::Runtime(_) => true,
_ => false,
} {
{
::core::panicking::panic_fmt(format_args!("body: {1:?} instance: {2:?} {0:?}",
if let ty::InstanceKind::Item(d) = instance {
Some(self.def_kind(d))
} else { None }, body, instance));
}
};
body
}
}
}#[instrument(skip(self), level = "debug")]
1891 pub fn instance_mir(self, instance: ty::InstanceKind<'tcx>) -> &'tcx Body<'tcx> {
1892 let body = match instance {
1893 ty::InstanceKind::Item(def) => {
1894 debug!("calling def_kind on def: {:?}", def);
1895 let def_kind = self.def_kind(def);
1896 debug!("returned from def_kind: {:?}", def_kind);
1897 match def_kind {
1898 DefKind::Const { .. }
1899 | DefKind::Static { .. }
1900 | DefKind::AssocConst { .. }
1901 | DefKind::Ctor(..)
1902 | DefKind::AnonConst => self.mir_for_ctfe(def),
1903 DefKind::Fn | DefKind::AssocFn
1904 if matches!(
1905 self.constness(def),
1906 hir::Constness::Const { always: true }
1907 ) =>
1908 {
1909 self.mir_for_ctfe(def)
1910 }
1911 _ => self.optimized_mir(def),
1914 }
1915 }
1916 ty::InstanceKind::Intrinsic(..) | ty::InstanceKind::LlvmIntrinsic(..) => {
1917 bug!("intrinsics have no instance MIR")
1918 }
1919 ty::InstanceKind::Virtual(..) => bug!("virtual dispatches have no instance MIR"),
1920 ty::InstanceKind::Shim(shim) => self.mir_shims(shim),
1921 };
1922
1923 assert!(
1924 matches!(body.phase, MirPhase::Runtime(_)),
1925 "body: {body:?} instance: {instance:?} {:?}",
1926 if let ty::InstanceKind::Item(d) = instance { Some(self.def_kind(d)) } else { None },
1927 );
1928
1929 body
1930 }
1931
1932 #[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."]
1934 pub fn get_attrs(
1935 self,
1936 did: impl Into<DefId>,
1937 attr: Symbol,
1938 ) -> impl Iterator<Item = &'tcx hir::Attribute> {
1939 #[allow(deprecated)]
1940 self.get_all_attrs(did).iter().filter(move |a: &&hir::Attribute| a.has_name(attr))
1941 }
1942
1943 #[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."]
1948 pub fn get_all_attrs(self, did: impl Into<DefId>) -> &'tcx [hir::Attribute] {
1949 let did: DefId = did.into();
1950 if let Some(did) = did.as_local() {
1951 self.hir_attrs(self.local_def_id_to_hir_id(did))
1952 } else {
1953 self.attrs_for_def(did)
1954 }
1955 }
1956
1957 pub fn get_attrs_by_path(
1958 self,
1959 did: DefId,
1960 attr: &[Symbol],
1961 ) -> impl Iterator<Item = &'tcx hir::Attribute> {
1962 let filter_fn = move |a: &&hir::Attribute| a.path_matches(attr);
1963 if let Some(did) = did.as_local() {
1964 self.hir_attrs(self.local_def_id_to_hir_id(did)).iter().filter(filter_fn)
1965 } else {
1966 self.attrs_for_def(did).iter().filter(filter_fn)
1967 }
1968 }
1969
1970 pub fn trait_is_auto(self, trait_def_id: DefId) -> bool {
1972 self.trait_def(trait_def_id).has_auto_impl
1973 }
1974
1975 pub fn trait_is_coinductive(self, trait_def_id: DefId) -> bool {
1978 self.trait_def(trait_def_id).is_coinductive
1979 }
1980
1981 pub fn trait_is_alias(self, trait_def_id: DefId) -> bool {
1983 self.def_kind(trait_def_id) == DefKind::TraitAlias
1984 }
1985
1986 fn layout_error(self, err: LayoutError<'tcx>) -> &'tcx LayoutError<'tcx> {
1988 self.arena.alloc(err)
1989 }
1990
1991 fn ordinary_coroutine_layout(
1997 self,
1998 def_id: DefId,
1999 args: GenericArgsRef<'tcx>,
2000 ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
2001 let coroutine_kind_ty = args.as_coroutine().kind_ty();
2002 let mir = self.optimized_mir(def_id);
2003 let ty = || Ty::new_coroutine(self, def_id, args);
2004 if coroutine_kind_ty.is_unit() {
2006 mir.coroutine_layout_raw().ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
2007 } else {
2008 let ty::Coroutine(_, identity_args) =
2011 *self.type_of(def_id).instantiate_identity().skip_norm_wip().kind()
2012 else {
2013 ::core::panicking::panic("internal error: entered unreachable code");unreachable!();
2014 };
2015 let identity_kind_ty = identity_args.as_coroutine().kind_ty();
2016 if identity_kind_ty == coroutine_kind_ty {
2019 mir.coroutine_layout_raw()
2020 .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
2021 } else {
2022 {
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));
2023 {
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!(
2024 identity_kind_ty.to_opt_closure_kind(),
2025 Some(ClosureKind::Fn | ClosureKind::FnMut)
2026 );
2027 self.optimized_mir(self.coroutine_by_move_body_def_id(def_id))
2028 .coroutine_layout_raw()
2029 .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
2030 }
2031 }
2032 }
2033
2034 fn async_drop_coroutine_layout(
2038 self,
2039 def_id: DefId,
2040 args: GenericArgsRef<'tcx>,
2041 ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
2042 let ty = || Ty::new_coroutine(self, def_id, args);
2043 if args[0].has_placeholders() || args[0].has_non_region_param() {
2044 return Err(self.layout_error(LayoutError::TooGeneric(ty())));
2045 }
2046 let instance = ShimKind::AsyncDropGlue(def_id, Ty::new_coroutine(self, def_id, args));
2047 self.mir_shims(instance)
2048 .coroutine_layout_raw()
2049 .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
2050 }
2051
2052 pub fn coroutine_layout(
2055 self,
2056 def_id: DefId,
2057 args: GenericArgsRef<'tcx>,
2058 ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
2059 if self.is_async_drop_in_place_coroutine(def_id) {
2060 let arg_cor_ty = args.first().unwrap().expect_ty();
2064 if arg_cor_ty.is_coroutine() {
2065 let span = self.def_span(def_id);
2066 let source_info = SourceInfo::outermost(span);
2067 let variant_fields: IndexVec<VariantIdx, IndexVec<FieldIdx, CoroutineSavedLocal>> =
2070 iter::repeat(IndexVec::new()).take(CoroutineArgs::RESERVED_VARIANTS).collect();
2071 let variant_source_info: IndexVec<VariantIdx, SourceInfo> =
2072 iter::repeat(source_info).take(CoroutineArgs::RESERVED_VARIANTS).collect();
2073 let proxy_layout = CoroutineLayout {
2074 field_tys: [].into(),
2075 variant_fields,
2076 variant_source_info,
2077 storage_conflicts: BitMatrix::new(0, 0),
2078 };
2079 return Ok(self.arena.alloc(proxy_layout));
2080 } else {
2081 self.async_drop_coroutine_layout(def_id, args)
2082 }
2083 } else {
2084 self.ordinary_coroutine_layout(def_id, args)
2085 }
2086 }
2087
2088 pub fn assoc_parent(self, def_id: DefId) -> Option<(DefId, DefKind)> {
2090 if !self.def_kind(def_id).is_assoc() {
2091 return None;
2092 }
2093 let parent = self.parent(def_id);
2094 let def_kind = self.def_kind(parent);
2095 Some((parent, def_kind))
2096 }
2097
2098 pub fn trait_item_of(self, def_id: impl IntoQueryKey<DefId>) -> Option<DefId> {
2100 let def_id = def_id.into_query_key();
2101 self.opt_associated_item(def_id)?.trait_item_def_id()
2102 }
2103
2104 pub fn trait_of_assoc(self, def_id: DefId) -> Option<DefId> {
2107 match self.assoc_parent(def_id) {
2108 Some((id, DefKind::Trait)) => Some(id),
2109 _ => None,
2110 }
2111 }
2112
2113 pub fn impl_is_of_trait(self, def_id: impl IntoQueryKey<DefId>) -> bool {
2114 let def_id = def_id.into_query_key();
2115 let DefKind::Impl { of_trait } = self.def_kind(def_id) else {
2116 {
::core::panicking::panic_fmt(format_args!("expected Impl for {0:?}",
def_id));
};panic!("expected Impl for {def_id:?}");
2117 };
2118 of_trait
2119 }
2120
2121 pub fn impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
2124 match self.assoc_parent(def_id) {
2125 Some((id, DefKind::Impl { .. })) => Some(id),
2126 _ => None,
2127 }
2128 }
2129
2130 pub fn inherent_impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
2133 match self.assoc_parent(def_id) {
2134 Some((id, DefKind::Impl { of_trait: false })) => Some(id),
2135 _ => None,
2136 }
2137 }
2138
2139 pub fn trait_impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
2142 match self.assoc_parent(def_id) {
2143 Some((id, DefKind::Impl { of_trait: true })) => Some(id),
2144 _ => None,
2145 }
2146 }
2147
2148 pub fn impl_polarity(self, def_id: impl IntoQueryKey<DefId>) -> ty::ImplPolarity {
2149 let def_id = def_id.into_query_key();
2150 self.impl_trait_header(def_id).polarity
2151 }
2152
2153 pub fn impl_trait_ref(
2155 self,
2156 def_id: impl IntoQueryKey<DefId>,
2157 ) -> ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>> {
2158 let def_id = def_id.into_query_key();
2159 self.impl_trait_header(def_id).trait_ref
2160 }
2161
2162 pub fn impl_opt_trait_ref(
2165 self,
2166 def_id: impl IntoQueryKey<DefId>,
2167 ) -> Option<ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>>> {
2168 let def_id = def_id.into_query_key();
2169 self.impl_is_of_trait(def_id).then(|| self.impl_trait_ref(def_id))
2170 }
2171
2172 pub fn impl_trait_id(self, def_id: impl IntoQueryKey<DefId>) -> DefId {
2174 let def_id = def_id.into_query_key();
2175 self.impl_trait_ref(def_id).skip_binder().def_id
2176 }
2177
2178 pub fn impl_opt_trait_id(self, def_id: impl IntoQueryKey<DefId>) -> Option<DefId> {
2181 let def_id = def_id.into_query_key();
2182 self.impl_is_of_trait(def_id).then(|| self.impl_trait_id(def_id))
2183 }
2184
2185 pub fn is_exportable(self, def_id: DefId) -> bool {
2186 self.exportable_items(def_id.krate).contains(&def_id)
2187 }
2188
2189 pub fn is_builtin_derived(self, def_id: DefId) -> bool {
2192 if self.is_automatically_derived(def_id)
2193 && let Some(def_id) = def_id.as_local()
2194 && let outer = self.def_span(def_id).ctxt().outer_expn_data()
2195 && #[allow(non_exhaustive_omitted_patterns)] match outer.kind {
ExpnKind::Macro(MacroKind::Derive, _) => true,
_ => false,
}matches!(outer.kind, ExpnKind::Macro(MacroKind::Derive, _))
2196 && {
{
'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 { .. })
2197 {
2198 true
2199 } else {
2200 false
2201 }
2202 }
2203
2204 pub fn is_automatically_derived(self, def_id: DefId) -> bool {
2206 {
{
'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)
2207 }
2208
2209 pub fn span_of_impl(self, impl_def_id: DefId) -> Result<Span, Symbol> {
2212 if let Some(impl_def_id) = impl_def_id.as_local() {
2213 Ok(self.def_span(impl_def_id))
2214 } else {
2215 Err(self.crate_name(impl_def_id.krate))
2216 }
2217 }
2218
2219 pub fn hygienic_eq(self, use_ident: Ident, def_ident: Ident, def_parent_def_id: DefId) -> bool {
2223 use_ident.name == def_ident.name
2227 && use_ident
2228 .span
2229 .ctxt()
2230 .hygienic_eq(def_ident.span.ctxt(), self.expn_that_defined(def_parent_def_id))
2231 }
2232
2233 pub fn adjust_ident(self, mut ident: Ident, scope: DefId) -> Ident {
2234 ident.span.normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope));
2235 ident
2236 }
2237
2238 pub fn adjust_ident_and_get_scope(
2239 self,
2240 mut ident: Ident,
2241 scope: DefId,
2242 item_id: LocalDefId,
2243 ) -> (Ident, ModId) {
2244 let scope = ident
2245 .span
2246 .normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope))
2247 .and_then(|actual_expansion| actual_expansion.expn_data().parent_module)
2248 .unwrap_or_else(|| self.parent_module_from_def_id(item_id).to_mod_id());
2249 (ident, scope)
2250 }
2251
2252 #[inline]
2256 pub fn is_const_fn(self, def_id: impl IntoQueryKey<DefId>) -> bool {
2257 let def_id = def_id.into_query_key();
2258 #[allow(non_exhaustive_omitted_patterns)] match self.def_kind(def_id) {
DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(_, CtorKind::Fn) |
DefKind::Closure => true,
_ => false,
}matches!(
2259 self.def_kind(def_id),
2260 DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(_, CtorKind::Fn) | DefKind::Closure
2261 ) && #[allow(non_exhaustive_omitted_patterns)] match self.constness(def_id) {
hir::Constness::Const { .. } => true,
_ => false,
}matches!(self.constness(def_id), hir::Constness::Const { .. })
2262 }
2263
2264 pub fn is_conditionally_const(self, def_id: impl Into<DefId>) -> bool {
2271 let def_id: DefId = def_id.into();
2272 match self.def_kind(def_id) {
2273 DefKind::Impl { of_trait: true } => {
2274 let header = self.impl_trait_header(def_id);
2275 #[allow(non_exhaustive_omitted_patterns)] match header.constness {
hir::Constness::Const { always: false } => true,
_ => false,
}matches!(header.constness, hir::Constness::Const { always: false })
2276 && self.is_const_trait(header.trait_ref.skip_binder().def_id)
2277 }
2278 DefKind::Impl { of_trait: false } => {
2279 #[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 })
2280 }
2281 DefKind::Fn | DefKind::Ctor(_, CtorKind::Fn) => {
2282 #[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 })
2283 }
2284 DefKind::TraitAlias | DefKind::Trait => self.is_const_trait(def_id),
2285 DefKind::AssocTy => {
2286 let parent_def_id = self.parent(def_id);
2287 match self.def_kind(parent_def_id) {
2288 DefKind::Impl { of_trait: false } => false,
2289 DefKind::Impl { of_trait: true } | DefKind::Trait => {
2290 self.is_conditionally_const(parent_def_id)
2291 }
2292 _ => 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:?}"),
2293 }
2294 }
2295 DefKind::AssocFn => {
2296 let parent_def_id = self.parent(def_id);
2297 match self.def_kind(parent_def_id) {
2298 DefKind::Impl { of_trait: false } => {
2299 #[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 })
2300 }
2301 DefKind::Impl { of_trait: true } => {
2302 let Some(trait_method_did) = self.trait_item_of(def_id) else {
2303 return false;
2304 };
2305 #[allow(non_exhaustive_omitted_patterns)] match self.constness(trait_method_did)
{
hir::Constness::Const { always: false } => true,
_ => false,
}matches!(
2306 self.constness(trait_method_did),
2307 hir::Constness::Const { always: false }
2308 ) && self.is_conditionally_const(parent_def_id)
2309 }
2310 DefKind::Trait => {
2311 #[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 })
2312 && self.is_conditionally_const(parent_def_id)
2313 }
2314 _ => 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:?}"),
2315 }
2316 }
2317 DefKind::OpaqueTy => match self.opaque_ty_origin(def_id) {
2318 hir::OpaqueTyOrigin::FnReturn { parent, .. } => self.is_conditionally_const(parent),
2319 hir::OpaqueTyOrigin::AsyncFn { .. } => false,
2320 hir::OpaqueTyOrigin::TyAlias { .. } => false,
2322 },
2323 DefKind::Closure => {
2324 #[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 })
2325 }
2326 DefKind::Ctor(_, CtorKind::Const)
2327 | DefKind::Mod
2328 | DefKind::Struct
2329 | DefKind::Union
2330 | DefKind::Enum
2331 | DefKind::Variant
2332 | DefKind::TyAlias
2333 | DefKind::ForeignTy
2334 | DefKind::TyParam
2335 | DefKind::Const { .. }
2336 | DefKind::ConstParam
2337 | DefKind::Static { .. }
2338 | DefKind::AssocConst { .. }
2339 | DefKind::Macro(_)
2340 | DefKind::ExternCrate
2341 | DefKind::Use
2342 | DefKind::ForeignMod
2343 | DefKind::AnonConst
2344 | DefKind::Field
2345 | DefKind::LifetimeParam
2346 | DefKind::GlobalAsm
2347 | DefKind::SyntheticCoroutineBody => false,
2348 }
2349 }
2350
2351 #[inline]
2352 pub fn is_const_trait(self, def_id: DefId) -> bool {
2353 #[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 { .. })
2354 }
2355
2356 pub fn impl_method_has_trait_impl_trait_tys(self, def_id: DefId) -> bool {
2357 if self.def_kind(def_id) != DefKind::AssocFn {
2358 return false;
2359 }
2360
2361 let Some(item) = self.opt_associated_item(def_id) else {
2362 return false;
2363 };
2364
2365 let AssocContainer::TraitImpl(Ok(trait_item_def_id)) = item.container else {
2366 return false;
2367 };
2368
2369 !self.associated_types_for_impl_traits_in_associated_fn(trait_item_def_id).is_empty()
2370 }
2371
2372 #[inline]
2387 pub fn fn_abi_of_instance(
2388 self,
2389 query: ty::PseudoCanonicalInput<'tcx, (ty::Instance<'tcx>, &'tcx ty::List<Ty<'tcx>>)>,
2390 ) -> Result<&'tcx FnAbi<'tcx, Ty<'tcx>>, &'tcx FnAbiError<'tcx>> {
2391 if self.sess.opts.optimize != OptLevel::No && self.sess.opts.incremental.is_none() {
2394 self.fn_abi_of_instance_raw(query)
2395 } else {
2396 self.fn_abi_of_instance_no_deduced_attrs(query)
2397 }
2398 }
2399}
2400
2401impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for DefId {
2404 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2405 if let Some(did) = self.as_local() {
2406 tcx.hir_attrs(tcx.local_def_id_to_hir_id(did))
2407 } else {
2408 tcx.attrs_for_def(self)
2409 }
2410 }
2411}
2412
2413impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for LocalDefId {
2414 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2415 tcx.hir_attrs(tcx.local_def_id_to_hir_id(self))
2416 }
2417}
2418
2419impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for hir::OwnerId {
2420 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2421 hir::attrs::HasAttrs::get_attrs(self.def_id, tcx)
2422 }
2423}
2424
2425impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for hir::HirId {
2426 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2427 tcx.hir_attrs(self)
2428 }
2429}
2430
2431pub fn provide(providers: &mut Providers) {
2432 closure::provide(providers);
2433 context::provide(providers);
2434 erase_regions::provide(providers);
2435 inhabitedness::provide(providers);
2436 util::provide(providers);
2437 print::provide(providers);
2438 super::util::bug::provide(providers);
2439 *providers = Providers {
2440 trait_impls_of: trait_def::trait_impls_of_provider,
2441 incoherent_impls: trait_def::incoherent_impls_provider,
2442 trait_impls_in_crate: trait_def::trait_impls_in_crate_provider,
2443 traits: trait_def::traits_provider,
2444 vtable_allocation: vtable::vtable_allocation_provider,
2445 ..*providers
2446 };
2447}
2448
2449#[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)]
2455pub struct CrateInherentImpls {
2456 pub inherent_impls: FxIndexMap<LocalDefId, Vec<DefId>>,
2457 pub incoherent_impls: FxIndexMap<SimplifiedType, Vec<LocalDefId>>,
2458}
2459
2460#[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)]
2461pub struct SymbolName<'tcx> {
2462 pub name: &'tcx str,
2464}
2465
2466impl<'tcx> SymbolName<'tcx> {
2467 pub fn new(tcx: TyCtxt<'tcx>, name: &str) -> SymbolName<'tcx> {
2468 SymbolName { name: tcx.arena.alloc_str(name) }
2469 }
2470}
2471
2472impl<'tcx> fmt::Display for SymbolName<'tcx> {
2473 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2474 fmt::Display::fmt(&self.name, fmt)
2475 }
2476}
2477
2478impl<'tcx> fmt::Debug for SymbolName<'tcx> {
2479 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2480 fmt::Display::fmt(&self.name, fmt)
2481 }
2482}
2483
2484#[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)]
2486pub struct DestructuredAdtConst<'tcx> {
2487 pub variant: VariantIdx,
2488 pub fields: &'tcx [ty::Const<'tcx>],
2489}