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::attrs::lang_items::LangItem;
42use rustc_hir::def::{CtorKind, CtorOf, DefKind, DocLinkResMap, LifetimeRes, Res};
43use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, LocalDefIdMap};
44use rustc_hir::definitions::PerParentDisambiguatorState;
45use rustc_hir::{self as hir, MissingLifetimeKind, attrs as attr, find_attr};
46use rustc_index::IndexVec;
47use rustc_index::bit_set::BitMatrix;
48use rustc_macros::{
49 BlobDecodable, Decodable, Encodable, StableHash, TyDecodable, TyEncodable, TypeFoldable,
50 TypeVisitable, extension,
51};
52use rustc_serialize::{Decodable, Encodable};
53use rustc_session::config::OptLevel;
54pub use rustc_session::lint::RegisteredTools;
55use rustc_span::def_id::{LocalModId, ModId};
56use rustc_span::hygiene::MacroKind;
57use rustc_span::{DUMMY_SP, ExpnId, ExpnKind, Ident, Span, Symbol};
58use rustc_target::callconv::FnAbi;
59pub use rustc_type_ir::data_structures::{DelayedMap, DelayedSet};
60pub use rustc_type_ir::fast_reject::DeepRejectCtxt;
61pub use rustc_type_ir::relate::VarianceDiagInfo;
62pub use rustc_type_ir::solve::{CandidatePreferenceMode, SizedTraitKind, VisibleForLeakCheck};
63pub use rustc_type_ir::*;
64use tracing::{debug, instrument};
65pub use vtable::*;
66
67pub use self::closure::{
68 BorrowKind, CAPTURE_STRUCT_LOCAL, CaptureInfo, CapturedPlace, ClosureTypeInfo,
69 MinCaptureInformationMap, MinCaptureList, RootVariableMinCaptureList, UpvarCapture, UpvarId,
70 UpvarPath, analyze_coroutine_closure_captures, is_ancestor_or_same_capture,
71 place_to_string_for_capture,
72};
73pub use self::consts::{
74 AliasConst, AliasConstKind, AtomicOrdering, Const, ConstInt, ConstKind, ConstToValTreeResult,
75 Expr, ExprKind, LitToConstInput, ScalarInt, SimdAlign, ValTree, ValTreeKindExt, Value,
76 const_lit_matches_ty,
77};
78pub use self::context::{
79 CtxtInterners, CurrentGcx, FreeRegionInfo, GlobalCtxt, Lift, TyCtxt, TyCtxtFeed, tls,
80};
81pub use self::fold::*;
82pub use self::instance::{Instance, InstanceKind, ReifyReason, ShimKind};
83pub(crate) use self::list::RawList;
84pub use self::list::{List, ListWithCachedTypeInfo};
85pub use self::opaque_types::OpaqueTypeKey;
86pub use self::pattern::{Pattern, PatternKind};
87pub use self::predicate::{
88 AliasTerm, AliasTermKind, ArgOutlivesClause, Clause, ClauseKind, CoercePredicate,
89 ExistentialPredicate, ExistentialPredicateStableCmpExt, ExistentialProjection,
90 ExistentialTraitRef, HostEffectClause, NormalizesTo, OutlivesClause, PolyCoercePredicate,
91 PolyExistentialPredicate, PolyExistentialProjection, PolyExistentialTraitRef,
92 PolyProjectionPredicate, PolyRegionOutlivesClause, PolySubtypePredicate, PolyTraitPredicate,
93 PolyTraitRef, PolyTypeOutlivesClause, Predicate, PredicateKind, ProjectionPredicate,
94 RegionConstraint, RegionEqPredicate, RegionOutlivesClause, SubtypePredicate, TraitPredicate,
95 TraitRef, TypeOutlivesClause,
96};
97pub use self::region::{
98 EarlyParamRegion, LateParamRegion, LateParamRegionKind, Region, RegionExt, RegionKind,
99 RegionVid,
100};
101pub use self::sty::{
102 Alias, AliasTy, AliasTyKind, Article, Binder, BoundConst, BoundRegion, BoundRegionKind,
103 BoundTy, BoundTyKind, BoundVariableKind, CanonicalPolyFnSig, CoroutineArgsExt, EarlyBinder,
104 FnSig, FnSigKind, FreeAliasTy, InherentAliasTy, InlineConstArgs, InlineConstArgsParts,
105 OpaqueAliasTy, ParamConst, ParamTy, PlaceholderConst, PlaceholderRegion, PlaceholderType,
106 PolyFnSig, ProjectionAliasTy, TyKind, TypeAndMut, TypingMode, TypingModeEqWrapper,
107 Unnormalized, UpvarArgs,
108};
109pub use self::trait_def::TraitDef;
110pub use self::typeck_results::{
111 CanonicalUserType, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations, IsIdentity,
112 Rust2024IncompatiblePatInfo, SplattedDef, TypeckResults, UserType, UserTypeAnnotationIndex,
113 UserTypeKind,
114};
115use crate::diagnostics::{OpaqueHiddenTypeMismatch, TypeMismatchReason};
116use crate::metadata::{AmbigModChild, ModChild};
117use crate::middle::privacy::EffectiveVisibilities;
118use crate::mir::{Body, CoroutineLayout, CoroutineSavedLocal, MirPhase, SourceInfo};
119use crate::query::{IntoQueryKey, Providers};
120use crate::ty;
121use crate::ty::codec::{TyDecoder, TyEncoder};
122pub use crate::ty::diagnostics::*;
123use crate::ty::fast_reject::SimplifiedType;
124use crate::ty::layout::{FnAbiError, LayoutError};
125use crate::ty::print::{with_crate_prefix, with_no_trimmed_paths};
126use crate::ty::util::Discr;
127use crate::ty::walk::TypeWalker;
128
129pub mod abstract_const;
130pub mod adjustment;
131pub mod cast;
132pub mod codec;
133pub mod error;
134pub mod fast_reject;
135pub mod inhabitedness;
136pub mod layout;
137pub mod normalize_erasing_regions;
138pub mod offload_meta;
139pub mod pattern;
140pub mod print;
141pub mod relate;
142pub mod significant_drop_order;
143pub mod sty;
144pub mod trait_def;
145pub mod typetree;
146pub mod util;
147pub mod vtable;
148
149mod adt;
150mod assoc;
151mod closure;
152mod consts;
153mod context;
154mod diagnostics;
155mod elaborate_impl;
156mod erase_regions;
157mod fold;
158mod generic_args;
159mod generics;
160mod impls_ty;
161mod instance;
162mod intrinsic;
163mod list;
164mod opaque_types;
165mod predicate;
166mod region;
167mod structural_impls;
168mod typeck_results;
169mod visit;
170
171#[derive(#[automatically_derived]
impl ::core::fmt::Debug for ResolverGlobalCtxt {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["visibilities_for_hashing", "expn_that_defined",
"effective_visibilities", "macro_reachable_adts",
"extern_crate_map", "maybe_unused_trait_imports",
"module_children", "ambig_module_children", "glob_map",
"main_def", "trait_impls", "proc_macros",
"confused_type_with_std_module", "doc_link_resolutions",
"doc_link_traits_in_scope", "all_macro_rules",
"stripped_cfg_items", "delegation_infos"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.visibilities_for_hashing, &self.expn_that_defined,
&self.effective_visibilities, &self.macro_reachable_adts,
&self.extern_crate_map, &self.maybe_unused_trait_imports,
&self.module_children, &self.ambig_module_children,
&self.glob_map, &self.main_def, &self.trait_impls,
&self.proc_macros, &self.confused_type_with_std_module,
&self.doc_link_resolutions, &self.doc_link_traits_in_scope,
&self.all_macro_rules, &self.stripped_cfg_items,
&&self.delegation_infos];
::core::fmt::Formatter::debug_struct_fields_finish(f,
"ResolverGlobalCtxt", names, values)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
ResolverGlobalCtxt {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ResolverGlobalCtxt {
visibilities_for_hashing: ref __binding_0,
expn_that_defined: ref __binding_1,
effective_visibilities: ref __binding_2,
macro_reachable_adts: ref __binding_3,
extern_crate_map: ref __binding_4,
maybe_unused_trait_imports: ref __binding_5,
module_children: ref __binding_6,
ambig_module_children: ref __binding_7,
glob_map: ref __binding_8,
main_def: ref __binding_9,
trait_impls: ref __binding_10,
proc_macros: ref __binding_11,
confused_type_with_std_module: ref __binding_12,
doc_link_resolutions: ref __binding_13,
doc_link_traits_in_scope: ref __binding_14,
all_macro_rules: ref __binding_15,
stripped_cfg_items: ref __binding_16,
delegation_infos: ref __binding_17 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
{ __binding_6.stable_hash(__hcx, __hasher); }
{ __binding_7.stable_hash(__hcx, __hasher); }
{ __binding_8.stable_hash(__hcx, __hasher); }
{ __binding_9.stable_hash(__hcx, __hasher); }
{ __binding_10.stable_hash(__hcx, __hasher); }
{ __binding_11.stable_hash(__hcx, __hasher); }
{ __binding_12.stable_hash(__hcx, __hasher); }
{ __binding_13.stable_hash(__hcx, __hasher); }
{ __binding_14.stable_hash(__hcx, __hasher); }
{ __binding_15.stable_hash(__hcx, __hasher); }
{ __binding_16.stable_hash(__hcx, __hasher); }
{ __binding_17.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
174pub struct ResolverGlobalCtxt {
175 pub visibilities_for_hashing: Vec<(LocalDefId, Visibility)>,
176 pub expn_that_defined: UnordMap<LocalDefId, ExpnId>,
178 pub effective_visibilities: EffectiveVisibilities,
179 pub macro_reachable_adts: FxIndexMap<LocalDefId, FxIndexSet<LocalDefId>>,
185 pub extern_crate_map: UnordMap<LocalDefId, CrateNum>,
186 pub maybe_unused_trait_imports: FxIndexSet<LocalDefId>,
187 pub module_children: LocalDefIdMap<Vec<ModChild>>,
188 pub ambig_module_children: LocalDefIdMap<Vec<AmbigModChild>>,
189 pub glob_map: FxIndexMap<LocalDefId, FxIndexSet<Symbol>>,
190 pub main_def: Option<MainDefinition>,
191 pub trait_impls: FxIndexMap<DefId, Vec<LocalDefId>>,
192 pub proc_macros: Vec<LocalDefId>,
195 pub confused_type_with_std_module: FxIndexMap<Span, Span>,
198 pub doc_link_resolutions: FxIndexMap<LocalModId, DocLinkResMap>,
199 pub doc_link_traits_in_scope: FxIndexMap<LocalModId, Vec<DefId>>,
200 pub all_macro_rules: UnordSet<Symbol>,
201 pub stripped_cfg_items: Vec<StrippedCfgItem>,
202 pub delegation_infos: FxIndexMap<LocalDefId, DelegationInfo>,
205}
206
207#[derive(#[automatically_derived]
impl<'tcx> ::core::fmt::Debug for PerOwnerResolverData<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["node_id_to_def_id", "lifetime_elision_allowed",
"label_res_map", "lifetimes_res_map", "trait_map",
"import_res", "extra_lifetime_params_map", "id", "def_id"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.node_id_to_def_id, &self.lifetime_elision_allowed,
&self.label_res_map, &self.lifetimes_res_map,
&self.trait_map, &self.import_res,
&self.extra_lifetime_params_map, &self.id, &&self.def_id];
::core::fmt::Formatter::debug_struct_fields_finish(f,
"PerOwnerResolverData", names, values)
}
}Debug)]
208pub struct PerOwnerResolverData<'tcx> {
209 pub node_id_to_def_id: NodeMap<LocalDefId> = Default::default(),
210 pub lifetime_elision_allowed: bool = false,
212 pub label_res_map: NodeMap<ast::NodeId> = Default::default(),
215 pub lifetimes_res_map: NodeMap<LifetimeRes> = Default::default(),
217
218 pub trait_map: NodeMap<&'tcx [hir::TraitCandidate<'tcx>]> = Default::default(),
219
220 pub import_res: hir::def::PerNS<Option<Res<ast::NodeId>>> = Default::default(),
222 pub extra_lifetime_params_map: NodeMap<Vec<(Ident, ast::NodeId, MissingLifetimeKind)>> = Default::default(),
224
225 pub id: ast::NodeId,
227 pub def_id: LocalDefId,
229}
230
231impl<'tcx> PerOwnerResolverData<'tcx> {
232 pub fn new(id: ast::NodeId, def_id: LocalDefId) -> PerOwnerResolverData<'tcx> {
233 PerOwnerResolverData { id, def_id, .. }
234 }
235
236 pub fn get_label_res(&self, id: ast::NodeId) -> Option<ast::NodeId> {
238 self.label_res_map.get(&id).copied()
239 }
240
241 pub fn get_lifetime_res(&self, id: ast::NodeId) -> Option<LifetimeRes> {
243 self.lifetimes_res_map.get(&id).copied()
244 }
245
246 pub fn extra_lifetime_params(&self, id: NodeId) -> &[(Ident, NodeId, MissingLifetimeKind)] {
254 self.extra_lifetime_params_map.get(&id).map_or(&[], |v| &v[..])
255 }
256}
257
258#[derive(#[automatically_derived]
impl<'tcx> ::core::fmt::Debug for ResolverAstLowering<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f,
"ResolverAstLowering", "partial_res_map", &self.partial_res_map,
"next_node_id", &self.next_node_id, "owners", &self.owners,
"lint_buffer", &self.lint_buffer, "disambiguators",
&&self.disambiguators)
}
}Debug)]
261pub struct ResolverAstLowering<'tcx> {
262 pub partial_res_map: NodeMap<hir::def::PartialRes>,
264
265 pub next_node_id: ast::NodeId,
266
267 pub owners: NodeMap<PerOwnerResolverData<'tcx>>,
268
269 pub lint_buffer: Steal<LintBuffer>,
271
272 pub disambiguators: LocalDefIdMap<Steal<PerParentDisambiguatorState>>,
273}
274
275#[derive(#[automatically_derived]
impl ::core::fmt::Debug for DelegationInfo {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f,
"DelegationInfo", "resolution_id", &&self.resolution_id)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
DelegationInfo {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
DelegationInfo { resolution_id: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
276pub struct DelegationInfo {
277 pub resolution_id: Result<DefId, ErrorGuaranteed>,
283}
284
285#[derive(#[automatically_derived]
impl ::core::clone::Clone for MainDefinition {
#[inline]
fn clone(&self) -> MainDefinition {
let _: ::core::clone::AssertParamIsClone<Res<ast::NodeId>>;
let _: ::core::clone::AssertParamIsClone<bool>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for MainDefinition { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for MainDefinition {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"MainDefinition", "res", &self.res, "is_import", &self.is_import,
"span", &&self.span)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
MainDefinition {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
MainDefinition {
res: ref __binding_0,
is_import: ref __binding_1,
span: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
286pub struct MainDefinition {
287 pub res: Res<ast::NodeId>,
288 pub is_import: bool,
289 pub span: Span,
290}
291
292impl MainDefinition {
293 pub fn opt_fn_def_id(self) -> Option<DefId> {
294 if let Res::Def(DefKind::Fn, def_id) = self.res { Some(def_id) } else { None }
295 }
296}
297
298#[derive(#[automatically_derived]
impl<'tcx> ::core::marker::Copy for ImplTraitHeader<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for ImplTraitHeader<'tcx> {
#[inline]
fn clone(&self) -> ImplTraitHeader<'tcx> {
let _:
::core::clone::AssertParamIsClone<ty::EarlyBinder<'tcx,
ty::TraitRef<'tcx>>>;
let _: ::core::clone::AssertParamIsClone<ImplPolarity>;
let _: ::core::clone::AssertParamIsClone<hir::Safety>;
let _: ::core::clone::AssertParamIsClone<hir::Constness>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for ImplTraitHeader<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f,
"ImplTraitHeader", "trait_ref", &self.trait_ref, "polarity",
&self.polarity, "safety", &self.safety, "constness",
&&self.constness)
}
}Debug, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for ImplTraitHeader<'tcx> {
fn encode(&self, __encoder: &mut __E) {
let ImplTraitHeader {
trait_ref: ref __binding_0,
polarity: ref __binding_1,
safety: ref __binding_2,
constness: ref __binding_3 } = *self;
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_2,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_3,
__encoder);
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for ImplTraitHeader<'tcx> {
fn decode(__decoder: &mut __D) -> Self {
ImplTraitHeader {
trait_ref: ::rustc_serialize::Decodable::decode(__decoder),
polarity: ::rustc_serialize::Decodable::decode(__decoder),
safety: ::rustc_serialize::Decodable::decode(__decoder),
constness: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
ImplTraitHeader<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ImplTraitHeader {
trait_ref: ref __binding_0,
polarity: ref __binding_1,
safety: ref __binding_2,
constness: ref __binding_3 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
299pub struct ImplTraitHeader<'tcx> {
300 pub trait_ref: ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>>,
301 pub polarity: ImplPolarity,
302 pub safety: hir::Safety,
303 pub constness: hir::Constness,
304}
305
306impl<'tcx> ImplTraitHeader<'tcx> {
307 pub fn is_fully_generic_for_reflection(self) -> bool {
317 #[derive(#[automatically_derived]
impl ::core::default::Default for ParamFinder {
#[inline]
fn default() -> ParamFinder {
ParamFinder { seen: ::core::default::Default::default() }
}
}Default)]
318 struct ParamFinder {
319 seen: FxHashSet<u32>,
320 }
321
322 impl<'tcx> TypeVisitor<TyCtxt<'tcx>> for ParamFinder {
323 type Result = ControlFlow<()>;
324 fn visit_region(&mut self, r: Region<'tcx>) -> Self::Result {
325 match r.kind() {
326 RegionKind::ReEarlyParam(param) => {
327 if self.seen.insert(param.index) {
328 ControlFlow::Continue(())
329 } else {
330 ControlFlow::Break(())
331 }
332 }
333 RegionKind::ReBound(..) => ControlFlow::Continue(()),
334 RegionKind::ReStatic | RegionKind::ReError(_) => ControlFlow::Break(()),
335 RegionKind::ReVar(_)
336 | RegionKind::RePlaceholder(_)
337 | RegionKind::ReErased
338 | RegionKind::ReLateParam(_) => crate::util::bug::bug_fmt(format_args!("unexpected lifetime in impl: {0:?}",
r))bug!("unexpected lifetime in impl: {r:?}"),
339 }
340 }
341
342 fn visit_ty(&mut self, t: Ty<'tcx>) -> Self::Result {
343 match t.kind() {
344 TyKind::Param(p) => {
345 if !self.seen.insert(p.index) {
347 return ControlFlow::Break(());
348 }
349 }
350 TyKind::Alias(..) => return ControlFlow::Break(()),
351 _ => (),
352 }
353 t.super_visit_with(self)
354 }
355 }
356 self.trait_ref
357 .instantiate_identity()
358 .skip_norm_wip()
359 .visit_with(&mut ParamFinder::default())
360 .is_continue()
361 }
362}
363
364#[derive(#[automatically_derived]
impl ::core::marker::Copy for Asyncness { }Copy, #[automatically_derived]
impl ::core::clone::Clone for Asyncness {
#[inline]
fn clone(&self) -> Asyncness { *self }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for Asyncness {
#[inline]
fn eq(&self, other: &Asyncness) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Asyncness {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for Asyncness {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}Hash, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for Asyncness {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
Asyncness::Yes => { 0usize }
Asyncness::No => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for Asyncness {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { Asyncness::Yes }
1usize => { Asyncness::No }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Asyncness`, expected 0..2, actual {0}",
n));
}
}
}
}
};TyDecodable, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for Asyncness {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self { Asyncness::Yes => {} Asyncness::No => {} }
}
}
};StableHash, #[automatically_derived]
impl ::core::fmt::Debug for Asyncness {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self { Asyncness::Yes => "Yes", Asyncness::No => "No", })
}
}Debug)]
365#[derive(const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for Asyncness {
fn try_fold_with<__F: ::rustc_middle::ty::FallibleTypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
Asyncness::Yes => { Asyncness::Yes }
Asyncness::No => { Asyncness::No }
})
}
fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Self {
match self {
Asyncness::Yes => { Asyncness::Yes }
Asyncness::No => { Asyncness::No }
}
}
}
};TypeFoldable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for Asyncness {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self { Asyncness::Yes => {} Asyncness::No => {} }
<__V::Result as ::rustc_middle::ty::VisitorResult>::output()
}
}
};TypeVisitable, #[automatically_derived]
impl ::core::default::Default for Asyncness {
#[inline]
fn default() -> Asyncness { Self::No }
}Default)]
366pub enum Asyncness {
367 Yes,
368 #[default]
369 No,
370}
371
372impl Asyncness {
373 pub fn is_async(self) -> bool {
374 #[allow(non_exhaustive_omitted_patterns)] match self {
Asyncness::Yes => true,
_ => false,
}matches!(self, Asyncness::Yes)
375 }
376}
377
378#[derive(#[automatically_derived]
impl<Id: ::core::clone::Clone> ::core::clone::Clone for Visibility<Id> {
#[inline]
fn clone(&self) -> Visibility<Id> {
match self {
Visibility::Public => Visibility::Public,
Visibility::Restricted(__self_0) =>
Visibility::Restricted(::core::clone::Clone::clone(__self_0)),
}
}
}Clone, #[automatically_derived]
impl<Id: ::core::fmt::Debug> ::core::fmt::Debug for Visibility<Id> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Visibility::Public =>
::core::fmt::Formatter::write_str(f, "Public"),
Visibility::Restricted(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Restricted", &__self_0),
}
}
}Debug, #[automatically_derived]
impl<Id: ::core::cmp::PartialEq> ::core::cmp::PartialEq for Visibility<Id> {
#[inline]
fn eq(&self, other: &Visibility<Id>) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(Visibility::Restricted(__self_0),
Visibility::Restricted(__arg1_0)) => __self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl<Id: ::core::cmp::Eq> ::core::cmp::Eq for Visibility<Id> {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<Id>;
}
}Eq, #[automatically_derived]
impl<Id: ::core::marker::Copy> ::core::marker::Copy for Visibility<Id> { }Copy, #[automatically_derived]
impl<Id: ::core::hash::Hash> ::core::hash::Hash for Visibility<Id> {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
Visibility::Restricted(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, const _: () =
{
impl<Id, __E: ::rustc_span::SpanEncoder>
::rustc_serialize::Encodable<__E> for Visibility<Id> where
Id: ::rustc_serialize::Encodable<__E> {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
Visibility::Public => { 0usize }
Visibility::Restricted(ref __binding_0) => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
Visibility::Public => {}
Visibility::Restricted(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<Id, __D: ::rustc_span::BlobDecoder>
::rustc_serialize::Decodable<__D> for Visibility<Id> where
Id: ::rustc_serialize::Decodable<__D> {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { Visibility::Public }
1usize => {
Visibility::Restricted(::rustc_serialize::Decodable::decode(__decoder))
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Visibility`, expected 0..2, actual {0}",
n));
}
}
}
}
};BlobDecodable, const _: () =
{
impl<Id> ::rustc_data_structures::stable_hash::StableHash for
Visibility<Id> where
Id: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
Visibility::Public => {}
Visibility::Restricted(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
379pub enum Visibility<Id = LocalModId> {
380 Public,
382 Restricted(Id),
384}
385
386impl Visibility {
387 pub fn to_string(self, def_id: LocalDefId, tcx: TyCtxt<'_>) -> String {
388 match self {
389 ty::Visibility::Restricted(restricted_id) => {
390 if restricted_id.is_top_level_module() {
391 "pub(crate)".to_string()
392 } else if restricted_id == tcx.parent_module_from_def_id(def_id) {
393 "pub(self)".to_string()
394 } else {
395 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("pub(in crate{0})",
tcx.def_path(restricted_id.to_def_id()).to_string_no_crate_verbose()))
})format!(
396 "pub(in crate{})",
397 tcx.def_path(restricted_id.to_def_id()).to_string_no_crate_verbose()
398 )
399 }
400 }
401 ty::Visibility::Public => "pub".to_string(),
402 }
403 }
404}
405
406#[derive(#[automatically_derived]
impl ::core::fmt::Debug for RestrictionKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
RestrictionKind::Unrestricted =>
::core::fmt::Formatter::write_str(f, "Unrestricted"),
RestrictionKind::Restricted(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f,
"Restricted", __self_0, &__self_1),
}
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
RestrictionKind {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
RestrictionKind::Unrestricted => {}
RestrictionKind::Restricted(ref __binding_0,
ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, #[automatically_derived]
impl ::core::cmp::PartialEq for RestrictionKind {
#[inline]
fn eq(&self, other: &RestrictionKind) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(RestrictionKind::Restricted(__self_0, __self_1),
RestrictionKind::Restricted(__arg1_0, __arg1_1)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::clone::Clone for RestrictionKind {
#[inline]
fn clone(&self) -> RestrictionKind {
let _: ::core::clone::AssertParamIsClone<DefId>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for RestrictionKind { }Copy, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for RestrictionKind {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
RestrictionKind::Unrestricted => { 0usize }
RestrictionKind::Restricted(ref __binding_0,
ref __binding_1) => {
1usize
}
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
RestrictionKind::Unrestricted => {}
RestrictionKind::Restricted(ref __binding_0,
ref __binding_1) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for RestrictionKind {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { RestrictionKind::Unrestricted }
1usize => {
RestrictionKind::Restricted(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `RestrictionKind`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable)]
407pub enum RestrictionKind {
408 Unrestricted,
409 Restricted(DefId, Span),
410}
411
412impl RestrictionKind {
413 pub fn is_allowed_in(self, module: DefId, tcx: TyCtxt<'_>) -> bool {
416 match self {
417 RestrictionKind::Unrestricted => true,
418 RestrictionKind::Restricted(restricted_to, _) => {
419 tcx.is_descendant_of(module, restricted_to)
420 }
421 }
422 }
423
424 pub fn expect_span(self) -> Span {
426 match self {
427 RestrictionKind::Unrestricted => {
428 crate::util::bug::bug_fmt(format_args!("called `expect_span` on an unrestricted item"))bug!("called `expect_span` on an unrestricted item")
429 }
430 RestrictionKind::Restricted(_, span) => span,
431 }
432 }
433
434 pub fn restriction_path(self, tcx: TyCtxt<'_>) -> String {
436 match self {
437 RestrictionKind::Unrestricted => String::new(),
438 RestrictionKind::Restricted(restricted_to, _) => {
439 if restricted_to.krate == rustc_hir::def_id::LOCAL_CRATE {
440 {
let _guard = CratePrefixGuard::new();
{ let _guard = NoTrimmedGuard::new(); tcx.def_path_str(restricted_to) }
}with_crate_prefix!(with_no_trimmed_paths!(tcx.def_path_str(restricted_to)))
441 } else {
442 tcx.def_path_str(restricted_to.krate.as_mod_id())
443 }
444 }
445 }
446 }
447
448 pub fn stricter_of(self, rhs: Self, tcx: TyCtxt<'_>) -> Self {
451 match (self, rhs) {
452 (RestrictionKind::Unrestricted, r) | (r, RestrictionKind::Unrestricted) => r,
453 (
454 RestrictionKind::Restricted(left_did, _),
455 RestrictionKind::Restricted(right_did, _),
456 ) => {
457 if left_did.krate != right_did.krate {
458 crate::util::bug::bug_fmt(format_args!("stricter_of: left and right restriction do not reference the same crate"));bug!("stricter_of: left and right restriction do not reference the same crate");
459 }
460 if tcx.is_descendant_of(left_did, right_did) { self } else { rhs }
461 }
462 }
463 }
464}
465
466#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for ClosureSizeProfileData<'tcx> {
#[inline]
fn clone(&self) -> ClosureSizeProfileData<'tcx> {
let _: ::core::clone::AssertParamIsClone<Ty<'tcx>>;
let _: ::core::clone::AssertParamIsClone<Ty<'tcx>>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for ClosureSizeProfileData<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"ClosureSizeProfileData", "before_feature_tys",
&self.before_feature_tys, "after_feature_tys",
&&self.after_feature_tys)
}
}Debug, #[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for ClosureSizeProfileData<'tcx> {
#[inline]
fn eq(&self, other: &ClosureSizeProfileData<'tcx>) -> bool {
self.before_feature_tys == other.before_feature_tys &&
self.after_feature_tys == other.after_feature_tys
}
}PartialEq, #[automatically_derived]
impl<'tcx> ::core::cmp::Eq for ClosureSizeProfileData<'tcx> {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<Ty<'tcx>>;
let _: ::core::cmp::AssertParamIsEq<Ty<'tcx>>;
}
}Eq, #[automatically_derived]
impl<'tcx> ::core::marker::Copy for ClosureSizeProfileData<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::hash::Hash for ClosureSizeProfileData<'tcx> {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.before_feature_tys, state);
::core::hash::Hash::hash(&self.after_feature_tys, state)
}
}Hash, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for ClosureSizeProfileData<'tcx>
{
fn encode(&self, __encoder: &mut __E) {
let ClosureSizeProfileData {
before_feature_tys: ref __binding_0,
after_feature_tys: ref __binding_1 } = *self;
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for ClosureSizeProfileData<'tcx>
{
fn decode(__decoder: &mut __D) -> Self {
ClosureSizeProfileData {
before_feature_tys: ::rustc_serialize::Decodable::decode(__decoder),
after_feature_tys: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
ClosureSizeProfileData<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ClosureSizeProfileData {
before_feature_tys: ref __binding_0,
after_feature_tys: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
467#[derive(const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for ClosureSizeProfileData<'tcx> {
fn try_fold_with<__F: ::rustc_middle::ty::FallibleTypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
ClosureSizeProfileData {
before_feature_tys: __binding_0,
after_feature_tys: __binding_1 } => {
ClosureSizeProfileData {
before_feature_tys: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
after_feature_tys: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Self {
match self {
ClosureSizeProfileData {
before_feature_tys: __binding_0,
after_feature_tys: __binding_1 } => {
ClosureSizeProfileData {
before_feature_tys: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder),
after_feature_tys: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
__folder),
}
}
}
}
}
};TypeFoldable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for ClosureSizeProfileData<'tcx> {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
ClosureSizeProfileData {
before_feature_tys: ref __binding_0,
after_feature_tys: ref __binding_1 } => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_middle::ty::VisitorResult>::output()
}
}
};TypeVisitable)]
468pub struct ClosureSizeProfileData<'tcx> {
469 pub before_feature_tys: Ty<'tcx>,
471 pub after_feature_tys: Ty<'tcx>,
473}
474
475impl TyCtxt<'_> {
476 #[inline]
477 pub fn opt_parent(self, id: DefId) -> Option<DefId> {
478 self.def_key(id).parent.map(|index| DefId { index, ..id })
479 }
480
481 #[inline]
482 #[track_caller]
483 pub fn parent(self, id: DefId) -> DefId {
484 match self.opt_parent(id) {
485 Some(id) => id,
486 None => crate::util::bug::bug_fmt(format_args!("{0:?} doesn\'t have a parent", id))bug!("{id:?} doesn't have a parent"),
488 }
489 }
490
491 #[inline]
492 #[track_caller]
493 pub fn opt_local_parent(self, id: LocalDefId) -> Option<LocalDefId> {
494 self.opt_parent(id.to_def_id()).map(DefId::expect_local)
495 }
496
497 #[inline]
498 #[track_caller]
499 pub fn local_parent(self, id: impl Into<LocalDefId>) -> LocalDefId {
500 self.parent(id.into().to_def_id()).expect_local()
501 }
502
503 fn def_id_partial_cmp(self, lhs: DefId, rhs: DefId) -> Option<Ordering> {
507 if lhs.krate != rhs.krate {
509 return None;
510 }
511
512 let search = |mut start: DefId, finish: DefId, ord| {
516 while start.index != finish.index {
517 match self.opt_parent(start) {
518 Some(parent) => start.index = parent.index,
519 None => return None,
520 }
521 }
522 Some(ord)
523 };
524 match lhs.index.cmp(&rhs.index) {
525 Ordering::Equal => Some(Ordering::Equal),
526 Ordering::Less => search(rhs, lhs, Ordering::Greater),
527 Ordering::Greater => search(lhs, rhs, Ordering::Less),
528 }
529 }
530
531 pub fn is_descendant_of(
532 self,
533 descendant: impl Into<DefId>,
534 ancestor: impl Into<DefId>,
535 ) -> bool {
536 #[allow(non_exhaustive_omitted_patterns)] match self.def_id_partial_cmp(descendant.into(),
ancestor.into()) {
Some(Ordering::Less | Ordering::Equal) => true,
_ => false,
}matches!(
537 self.def_id_partial_cmp(descendant.into(), ancestor.into()),
538 Some(Ordering::Less | Ordering::Equal)
539 )
540 }
541}
542
543impl<Id> Visibility<Id> {
544 pub fn is_public(self) -> bool {
545 #[allow(non_exhaustive_omitted_patterns)] match self {
Visibility::Public => true,
_ => false,
}matches!(self, Visibility::Public)
546 }
547
548 pub fn map_id<OutId>(self, f: impl FnOnce(Id) -> OutId) -> Visibility<OutId> {
549 match self {
550 Visibility::Public => Visibility::Public,
551 Visibility::Restricted(id) => Visibility::Restricted(f(id)),
552 }
553 }
554}
555
556impl Visibility<LocalModId> {
557 pub fn to_mod_id(self) -> Visibility<ModId> {
558 self.map_id(LocalModId::to_mod_id)
559 }
560}
561
562impl<Id: Into<DefId>> Visibility<Id> {
563 pub fn is_accessible_from(self, module: impl Into<DefId>, tcx: TyCtxt<'_>) -> bool {
565 match self {
566 Visibility::Public => true,
568 Visibility::Restricted(id) => tcx.is_descendant_of(module, id),
569 }
570 }
571
572 pub fn partial_cmp(
573 self,
574 vis: Visibility<impl Into<DefId>>,
575 tcx: TyCtxt<'_>,
576 ) -> Option<Ordering> {
577 match (self, vis) {
578 (Visibility::Public, Visibility::Public) => Some(Ordering::Equal),
579 (Visibility::Public, Visibility::Restricted(_)) => Some(Ordering::Greater),
580 (Visibility::Restricted(_), Visibility::Public) => Some(Ordering::Less),
581 (Visibility::Restricted(lhs_id), Visibility::Restricted(rhs_id)) => {
582 let (lhs_id, rhs_id) = (lhs_id.into(), rhs_id.into());
583 tcx.def_id_partial_cmp(lhs_id, rhs_id)
584 }
585 }
586 }
587}
588
589impl<Id: Into<DefId> + Debug + Copy> Visibility<Id> {
590 #[track_caller]
592 pub fn greater_than(
593 self,
594 vis: Visibility<impl Into<DefId> + Debug + Copy>,
595 tcx: TyCtxt<'_>,
596 ) -> bool {
597 match self.partial_cmp(vis, tcx) {
598 Some(ord) => ord.is_gt(),
599 None => {
600 tcx.dcx().delayed_bug(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("unordered visibilities: {0:?} and {1:?}",
self, vis))
})format!("unordered visibilities: {self:?} and {vis:?}"));
601 false
602 }
603 }
604 }
605}
606
607impl Visibility<ModId> {
608 pub fn expect_local(self) -> Visibility {
609 self.map_id(|id| id.expect_local())
610 }
611
612 pub fn is_visible_locally(self) -> bool {
614 match self {
615 Visibility::Public => true,
616 Visibility::Restricted(mod_id) => mod_id.is_local(),
617 }
618 }
619}
620
621#[derive(const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
CrateVariancesMap<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
CrateVariancesMap { variances: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for CrateVariancesMap<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f,
"CrateVariancesMap", "variances", &&self.variances)
}
}Debug)]
628pub struct CrateVariancesMap<'tcx> {
629 pub variances: DefIdMap<&'tcx [ty::Variance]>,
633}
634
635#[derive(#[automatically_derived]
impl ::core::marker::Copy for CReaderCacheKey { }Copy, #[automatically_derived]
impl ::core::clone::Clone for CReaderCacheKey {
#[inline]
fn clone(&self) -> CReaderCacheKey {
let _: ::core::clone::AssertParamIsClone<Option<CrateNum>>;
let _: ::core::clone::AssertParamIsClone<usize>;
*self
}
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for CReaderCacheKey {
#[inline]
fn eq(&self, other: &CReaderCacheKey) -> bool {
self.cnum == other.cnum && self.pos == other.pos
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for CReaderCacheKey {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<Option<CrateNum>>;
let _: ::core::cmp::AssertParamIsEq<usize>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for CReaderCacheKey {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.cnum, state);
::core::hash::Hash::hash(&self.pos, state)
}
}Hash)]
638pub struct CReaderCacheKey {
639 pub cnum: Option<CrateNum>,
640 pub pos: usize,
641}
642
643#[derive(#[automatically_derived]
impl<'tcx> ::core::marker::Copy for Ty<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for Ty<'tcx> {
#[inline]
fn clone(&self) -> Ty<'tcx> {
let _:
::core::clone::AssertParamIsClone<Interned<'tcx,
WithCachedTypeInfo<TyKind<'tcx>>>>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for Ty<'tcx> {
#[inline]
fn eq(&self, other: &Ty<'tcx>) -> bool { self.0 == other.0 }
}PartialEq, #[automatically_derived]
impl<'tcx> ::core::cmp::Eq for Ty<'tcx> {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _:
::core::cmp::AssertParamIsEq<Interned<'tcx,
WithCachedTypeInfo<TyKind<'tcx>>>>;
}
}Eq, #[automatically_derived]
impl<'tcx> ::core::hash::Hash for Ty<'tcx> {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.0, state)
}
}Hash, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
Ty<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Ty(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
645#[rustc_diagnostic_item = "Ty"]
646#[rustc_pass_by_value]
647pub struct Ty<'tcx>(Interned<'tcx, WithCachedTypeInfo<TyKind<'tcx>>>);
648
649impl<'tcx> rustc_type_ir::inherent::IntoKind for Ty<'tcx> {
650 type Kind = TyKind<'tcx>;
651
652 fn kind(self) -> TyKind<'tcx> {
653 *self.kind()
654 }
655}
656
657impl<'tcx> rustc_type_ir::Flags for Ty<'tcx> {
658 fn flags(&self) -> TypeFlags {
659 self.0.flags
660 }
661
662 fn outer_exclusive_binder(&self) -> DebruijnIndex {
663 self.0.outer_exclusive_binder
664 }
665}
666
667#[derive(const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
CrateClausesMap<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
CrateClausesMap { clauses: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for CrateClausesMap<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f,
"CrateClausesMap", "clauses", &&self.clauses)
}
}Debug)]
674pub struct CrateClausesMap<'tcx> {
675 pub clauses: DefIdMap<&'tcx [(Clause<'tcx>, Span)]>,
679}
680
681#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for Term<'tcx> {
#[inline]
fn clone(&self) -> Term<'tcx> {
let _: ::core::clone::AssertParamIsClone<NonNull<()>>;
let _:
::core::clone::AssertParamIsClone<PhantomData<(Ty<'tcx>,
Const<'tcx>)>>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::marker::Copy for Term<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for Term<'tcx> {
#[inline]
fn eq(&self, other: &Term<'tcx>) -> bool {
self.ptr == other.ptr && self.marker == other.marker
}
}PartialEq, #[automatically_derived]
impl<'tcx> ::core::cmp::Eq for Term<'tcx> {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<NonNull<()>>;
let _:
::core::cmp::AssertParamIsEq<PhantomData<(Ty<'tcx>,
Const<'tcx>)>>;
}
}Eq, #[automatically_derived]
impl<'tcx> ::core::cmp::PartialOrd for Term<'tcx> {
#[inline]
fn partial_cmp(&self, other: &Term<'tcx>)
-> ::core::option::Option<::core::cmp::Ordering> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}PartialOrd, #[automatically_derived]
impl<'tcx> ::core::cmp::Ord for Term<'tcx> {
#[inline]
fn cmp(&self, other: &Term<'tcx>) -> ::core::cmp::Ordering {
match ::core::cmp::Ord::cmp(&self.ptr, &other.ptr) {
::core::cmp::Ordering::Equal =>
::core::cmp::Ord::cmp(&self.marker, &other.marker),
cmp => cmp,
}
}
}Ord, #[automatically_derived]
impl<'tcx> ::core::hash::Hash for Term<'tcx> {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.ptr, state);
::core::hash::Hash::hash(&self.marker, state)
}
}Hash)]
682pub struct Term<'tcx> {
683 ptr: NonNull<()>,
684 marker: PhantomData<(Ty<'tcx>, Const<'tcx>)>,
685}
686
687impl<'tcx> rustc_type_ir::inherent::Term<TyCtxt<'tcx>> for Term<'tcx> {}
688
689impl<'tcx> rustc_type_ir::inherent::IntoKind for Term<'tcx> {
690 type Kind = TermKind<'tcx>;
691
692 fn kind(self) -> Self::Kind {
693 self.kind()
694 }
695}
696
697unsafe impl<'tcx> rustc_data_structures::sync::DynSend for Term<'tcx> where
698 &'tcx (Ty<'tcx>, Const<'tcx>): rustc_data_structures::sync::DynSend
699{
700}
701unsafe impl<'tcx> rustc_data_structures::sync::DynSync for Term<'tcx> where
702 &'tcx (Ty<'tcx>, Const<'tcx>): rustc_data_structures::sync::DynSync
703{
704}
705unsafe impl<'tcx> Send for Term<'tcx> where &'tcx (Ty<'tcx>, Const<'tcx>): Send {}
706unsafe impl<'tcx> Sync for Term<'tcx> where &'tcx (Ty<'tcx>, Const<'tcx>): Sync {}
707
708impl Debug for Term<'_> {
709 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
710 match self.kind() {
711 TermKind::Ty(ty) => f.write_fmt(format_args!("Term::Ty({0:?})", ty))write!(f, "Term::Ty({ty:?})"),
712 TermKind::Const(ct) => f.write_fmt(format_args!("Term::Const({0:?})", ct))write!(f, "Term::Const({ct:?})"),
713 }
714 }
715}
716
717impl<'tcx> From<Ty<'tcx>> for Term<'tcx> {
718 fn from(ty: Ty<'tcx>) -> Self {
719 TermKind::Ty(ty).pack()
720 }
721}
722
723impl<'tcx> From<Const<'tcx>> for Term<'tcx> {
724 fn from(c: Const<'tcx>) -> Self {
725 TermKind::Const(c).pack()
726 }
727}
728
729impl<'tcx> StableHash for Term<'tcx> {
730 fn stable_hash<Hcx: StableHashCtxt>(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
731 self.kind().stable_hash(hcx, hasher);
732 }
733}
734
735impl<'tcx> TypeFoldable<TyCtxt<'tcx>> for Term<'tcx> {
736 fn try_fold_with<F: FallibleTypeFolder<TyCtxt<'tcx>>>(
737 self,
738 folder: &mut F,
739 ) -> Result<Self, F::Error> {
740 match self.kind() {
741 ty::TermKind::Ty(ty) => ty.try_fold_with(folder).map(Into::into),
742 ty::TermKind::Const(ct) => ct.try_fold_with(folder).map(Into::into),
743 }
744 }
745
746 fn fold_with<F: TypeFolder<TyCtxt<'tcx>>>(self, folder: &mut F) -> Self {
747 match self.kind() {
748 ty::TermKind::Ty(ty) => ty.fold_with(folder).into(),
749 ty::TermKind::Const(ct) => ct.fold_with(folder).into(),
750 }
751 }
752}
753
754impl<'tcx> TypeVisitable<TyCtxt<'tcx>> for Term<'tcx> {
755 fn visit_with<V: TypeVisitor<TyCtxt<'tcx>>>(&self, visitor: &mut V) -> V::Result {
756 match self.kind() {
757 ty::TermKind::Ty(ty) => ty.visit_with(visitor),
758 ty::TermKind::Const(ct) => ct.visit_with(visitor),
759 }
760 }
761}
762
763impl<'tcx, E: TyEncoder<'tcx>> Encodable<E> for Term<'tcx> {
764 fn encode(&self, e: &mut E) {
765 self.kind().encode(e)
766 }
767}
768
769impl<'tcx, D: TyDecoder<'tcx>> Decodable<D> for Term<'tcx> {
770 fn decode(d: &mut D) -> Self {
771 let res: TermKind<'tcx> = Decodable::decode(d);
772 res.pack()
773 }
774}
775
776impl<'tcx> Term<'tcx> {
777 #[inline]
778 pub fn kind(self) -> TermKind<'tcx> {
779 let ptr =
780 unsafe { self.ptr.map_addr(|addr| NonZero::new_unchecked(addr.get() & !TAG_MASK)) };
781 unsafe {
785 match self.ptr.addr().get() & TAG_MASK {
786 TYPE_TAG => TermKind::Ty(Ty(Interned::new_unchecked(
787 ptr.cast::<WithCachedTypeInfo<ty::TyKind<'tcx>>>().as_ref(),
788 ))),
789 CONST_TAG => TermKind::Const(ty::Const(Interned::new_unchecked(
790 ptr.cast::<WithCachedTypeInfo<ty::ConstKind<'tcx>>>().as_ref(),
791 ))),
792 _ => core::intrinsics::unreachable(),
793 }
794 }
795 }
796
797 pub fn as_type(&self) -> Option<Ty<'tcx>> {
798 if let TermKind::Ty(ty) = self.kind() { Some(ty) } else { None }
799 }
800
801 pub fn expect_type(&self) -> Ty<'tcx> {
802 self.as_type().expect("expected a type, but found a const")
803 }
804
805 pub fn as_const(&self) -> Option<Const<'tcx>> {
806 if let TermKind::Const(c) = self.kind() { Some(c) } else { None }
807 }
808
809 pub fn expect_const(&self) -> Const<'tcx> {
810 self.as_const().expect("expected a const, but found a type")
811 }
812
813 pub fn into_arg(self) -> GenericArg<'tcx> {
814 match self.kind() {
815 TermKind::Ty(ty) => ty.into(),
816 TermKind::Const(c) => c.into(),
817 }
818 }
819
820 pub fn to_alias_term(self) -> Option<AliasTerm<'tcx>> {
821 match self.kind() {
822 TermKind::Ty(ty) => match *ty.kind() {
823 ty::Alias(_, alias_ty) => Some(alias_ty.into()),
824 _ => None,
825 },
826 TermKind::Const(ct) => match ct.kind() {
827 ConstKind::Alias(_, alias_const) => Some(alias_const.into()),
828 _ => None,
829 },
830 }
831 }
832
833 pub fn is_non_rigid_alias(self) -> bool {
834 match self.kind() {
835 ty::TermKind::Ty(ty) => match ty.kind() {
836 ty::Alias(ty::IsRigid::No, _) => true,
837 _ => false,
838 },
839 ty::TermKind::Const(ct) => match ct.kind() {
840 ty::ConstKind::Alias(ty::IsRigid::No, _) => true,
841 _ => false,
842 },
843 }
844 }
845
846 pub fn is_infer(&self) -> bool {
847 match self.kind() {
848 TermKind::Ty(ty) => ty.is_ty_var(),
849 TermKind::Const(ct) => ct.is_ct_infer(),
850 }
851 }
852
853 pub fn is_trivially_wf(&self, tcx: TyCtxt<'tcx>) -> bool {
854 match self.kind() {
855 TermKind::Ty(ty) => ty.is_trivially_wf(tcx),
856 TermKind::Const(ct) => ct.is_trivially_wf(),
857 }
858 }
859
860 pub fn walk(self) -> TypeWalker<TyCtxt<'tcx>> {
871 TypeWalker::new(self.into())
872 }
873}
874
875const TAG_MASK: usize = 0b11;
876const TYPE_TAG: usize = 0b00;
877const CONST_TAG: usize = 0b01;
878
879impl<'tcx> TermKindPackExt<'tcx> for TermKind<'tcx> {
#[inline]
fn pack(self) -> Term<'tcx> {
let (tag, ptr) =
match self {
TermKind::Ty(ty) => {
{
match (&(align_of_val(&*ty.0.0) & TAG_MASK), &0) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
}
};
(TYPE_TAG, NonNull::from(ty.0.0).cast())
}
TermKind::Const(ct) => {
{
match (&(align_of_val(&*ct.0.0) & TAG_MASK), &0) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
}
};
(CONST_TAG, NonNull::from(ct.0.0).cast())
}
};
Term { ptr: ptr.map_addr(|addr| addr | tag), marker: PhantomData }
}
}#[extension(pub trait TermKindPackExt<'tcx>)]
880impl<'tcx> TermKind<'tcx> {
881 #[inline]
882 fn pack(self) -> Term<'tcx> {
883 let (tag, ptr) = match self {
884 TermKind::Ty(ty) => {
885 assert_eq!(align_of_val(&*ty.0.0) & TAG_MASK, 0);
887 (TYPE_TAG, NonNull::from(ty.0.0).cast())
888 }
889 TermKind::Const(ct) => {
890 assert_eq!(align_of_val(&*ct.0.0) & TAG_MASK, 0);
892 (CONST_TAG, NonNull::from(ct.0.0).cast())
893 }
894 };
895
896 Term { ptr: ptr.map_addr(|addr| addr | tag), marker: PhantomData }
897 }
898}
899
900#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for InstantiatedClauses<'tcx> {
#[inline]
fn clone(&self) -> InstantiatedClauses<'tcx> {
InstantiatedClauses {
clauses: ::core::clone::Clone::clone(&self.clauses),
spans: ::core::clone::Clone::clone(&self.spans),
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for InstantiatedClauses<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"InstantiatedClauses", "clauses", &self.clauses, "spans",
&&self.spans)
}
}Debug)]
920pub struct InstantiatedClauses<'tcx> {
921 pub clauses: Vec<Unnormalized<'tcx, Clause<'tcx>>>,
922 pub spans: Vec<Span>,
923}
924
925impl<'tcx> InstantiatedClauses<'tcx> {
926 pub fn empty() -> InstantiatedClauses<'tcx> {
927 InstantiatedClauses { clauses: ::alloc::vec::Vec::new()vec![], spans: ::alloc::vec::Vec::new()vec![] }
928 }
929
930 pub fn is_empty(&self) -> bool {
931 self.clauses.is_empty()
932 }
933
934 pub fn iter(&self) -> <&Self as IntoIterator>::IntoIter {
935 self.into_iter()
936 }
937}
938
939impl<'tcx> IntoIterator for InstantiatedClauses<'tcx> {
940 type Item = (Unnormalized<'tcx, Clause<'tcx>>, Span);
941
942 type IntoIter = std::iter::Zip<
943 std::vec::IntoIter<Unnormalized<'tcx, Clause<'tcx>>>,
944 std::vec::IntoIter<Span>,
945 >;
946
947 fn into_iter(self) -> Self::IntoIter {
948 if true {
{
match (&self.clauses.len(), &self.spans.len()) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
}
};
};debug_assert_eq!(self.clauses.len(), self.spans.len());
949 std::iter::zip(self.clauses, self.spans)
950 }
951}
952
953impl<'a, 'tcx> IntoIterator for &'a InstantiatedClauses<'tcx> {
954 type Item = (Unnormalized<'tcx, Clause<'tcx>>, Span);
955
956 type IntoIter = std::iter::Zip<
957 std::iter::Copied<std::slice::Iter<'a, Unnormalized<'tcx, Clause<'tcx>>>>,
958 std::iter::Copied<std::slice::Iter<'a, Span>>,
959 >;
960
961 fn into_iter(self) -> Self::IntoIter {
962 if true {
{
match (&self.clauses.len(), &self.spans.len()) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
}
};
};debug_assert_eq!(self.clauses.len(), self.spans.len());
963 std::iter::zip(self.clauses.iter().copied(), self.spans.iter().copied())
964 }
965}
966
967#[derive(#[automatically_derived]
impl<'tcx> ::core::marker::Copy for ProvisionalHiddenType<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for ProvisionalHiddenType<'tcx> {
#[inline]
fn clone(&self) -> ProvisionalHiddenType<'tcx> {
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<Ty<'tcx>>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for ProvisionalHiddenType<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"ProvisionalHiddenType", "span", &self.span, "ty", &&self.ty)
}
}Debug, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for ProvisionalHiddenType<'tcx> {
fn try_fold_with<__F: ::rustc_middle::ty::FallibleTypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
ProvisionalHiddenType { span: __binding_0, ty: __binding_1 }
=> {
ProvisionalHiddenType {
span: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
ty: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Self {
match self {
ProvisionalHiddenType { span: __binding_0, ty: __binding_1 }
=> {
ProvisionalHiddenType {
span: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder),
ty: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
__folder),
}
}
}
}
}
};TypeFoldable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for ProvisionalHiddenType<'tcx> {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
ProvisionalHiddenType {
span: ref __binding_0, ty: ref __binding_1 } => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_middle::ty::VisitorResult>::output()
}
}
};TypeVisitable, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
ProvisionalHiddenType<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ProvisionalHiddenType {
span: ref __binding_0, ty: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for ProvisionalHiddenType<'tcx>
{
fn encode(&self, __encoder: &mut __E) {
let ProvisionalHiddenType {
span: ref __binding_0, ty: ref __binding_1 } = *self;
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for ProvisionalHiddenType<'tcx>
{
fn decode(__decoder: &mut __D) -> Self {
ProvisionalHiddenType {
span: ::rustc_serialize::Decodable::decode(__decoder),
ty: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable)]
968pub struct ProvisionalHiddenType<'tcx> {
969 pub span: Span,
983
984 pub ty: Ty<'tcx>,
997}
998
999#[derive(#[automatically_derived]
impl ::core::fmt::Debug for DefiningScopeKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
DefiningScopeKind::HirTypeck => "HirTypeck",
DefiningScopeKind::MirBorrowck => "MirBorrowck",
})
}
}Debug, #[automatically_derived]
impl ::core::clone::Clone for DefiningScopeKind {
#[inline]
fn clone(&self) -> DefiningScopeKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for DefiningScopeKind { }Copy)]
1001pub enum DefiningScopeKind {
1002 HirTypeck,
1007 MirBorrowck,
1008}
1009
1010impl<'tcx> ProvisionalHiddenType<'tcx> {
1011 pub fn new_error(tcx: TyCtxt<'tcx>, guar: ErrorGuaranteed) -> ProvisionalHiddenType<'tcx> {
1012 ProvisionalHiddenType { span: DUMMY_SP, ty: Ty::new_error(tcx, guar) }
1013 }
1014
1015 pub fn build_mismatch_error(
1016 &self,
1017 other: &Self,
1018 tcx: TyCtxt<'tcx>,
1019 ) -> Result<Diag<'tcx>, ErrorGuaranteed> {
1020 (self.ty, other.ty).error_reported()?;
1021 let sub_diag = if self.span == other.span {
1023 TypeMismatchReason::ConflictType { span: self.span }
1024 } else {
1025 TypeMismatchReason::PreviousUse { span: self.span }
1026 };
1027 Ok(tcx.dcx().create_err(OpaqueHiddenTypeMismatch {
1028 self_ty: self.ty,
1029 other_ty: other.ty,
1030 other_span: other.span,
1031 sub: sub_diag,
1032 }))
1033 }
1034
1035 x;#[instrument(level = "debug", skip(tcx), ret)]
1036 pub fn remap_generic_params_to_declaration_params(
1037 self,
1038 opaque_type_key: OpaqueTypeKey<'tcx>,
1039 tcx: TyCtxt<'tcx>,
1040 defining_scope_kind: DefiningScopeKind,
1041 ) -> DefinitionSiteHiddenType<'tcx> {
1042 let OpaqueTypeKey { def_id, args } = opaque_type_key;
1043
1044 let id_args = GenericArgs::identity_for_item(tcx, def_id);
1051 debug!(?id_args);
1052
1053 let map = args.iter().zip(id_args).collect();
1057 debug!("map = {:#?}", map);
1058
1059 let ty = match defining_scope_kind {
1065 DefiningScopeKind::HirTypeck => {
1066 fold_regions(tcx, self.ty, |_, _| tcx.lifetimes.re_erased)
1067 }
1068 DefiningScopeKind::MirBorrowck => self.ty,
1069 };
1070 let result_ty = ty.fold_with(&mut opaque_types::ReverseMapper::new(tcx, map, self.span));
1071 if cfg!(debug_assertions) && matches!(defining_scope_kind, DefiningScopeKind::HirTypeck) {
1072 assert_eq!(result_ty, fold_regions(tcx, result_ty, |_, _| tcx.lifetimes.re_erased));
1073 }
1074 DefinitionSiteHiddenType { span: self.span, ty: ty::EarlyBinder::bind(tcx, result_ty) }
1075 }
1076}
1077
1078#[derive(#[automatically_derived]
impl<'tcx> ::core::marker::Copy for DefinitionSiteHiddenType<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for DefinitionSiteHiddenType<'tcx> {
#[inline]
fn clone(&self) -> DefinitionSiteHiddenType<'tcx> {
let _: ::core::clone::AssertParamIsClone<Span>;
let _:
::core::clone::AssertParamIsClone<ty::EarlyBinder<'tcx,
Ty<'tcx>>>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for DefinitionSiteHiddenType<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"DefinitionSiteHiddenType", "span", &self.span, "ty", &&self.ty)
}
}Debug, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
DefinitionSiteHiddenType<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
DefinitionSiteHiddenType {
span: ref __binding_0, ty: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for
DefinitionSiteHiddenType<'tcx> {
fn encode(&self, __encoder: &mut __E) {
let DefinitionSiteHiddenType {
span: ref __binding_0, ty: ref __binding_1 } = *self;
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for
DefinitionSiteHiddenType<'tcx> {
fn decode(__decoder: &mut __D) -> Self {
DefinitionSiteHiddenType {
span: ::rustc_serialize::Decodable::decode(__decoder),
ty: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable)]
1079pub struct DefinitionSiteHiddenType<'tcx> {
1080 pub span: Span,
1093
1094 pub ty: ty::EarlyBinder<'tcx, Ty<'tcx>>,
1096}
1097
1098impl<'tcx> DefinitionSiteHiddenType<'tcx> {
1099 pub fn new_error(tcx: TyCtxt<'tcx>, guar: ErrorGuaranteed) -> DefinitionSiteHiddenType<'tcx> {
1100 DefinitionSiteHiddenType {
1101 span: DUMMY_SP,
1102 ty: ty::EarlyBinder::bind(tcx, Ty::new_error(tcx, guar)),
1103 }
1104 }
1105
1106 pub fn build_mismatch_error(
1107 &self,
1108 other: &Self,
1109 tcx: TyCtxt<'tcx>,
1110 ) -> Result<Diag<'tcx>, ErrorGuaranteed> {
1111 let self_ty = self.ty.instantiate_identity().skip_norm_wip();
1112 let other_ty = other.ty.instantiate_identity().skip_norm_wip();
1113 (self_ty, other_ty).error_reported()?;
1114 let sub_diag = if self.span == other.span {
1116 TypeMismatchReason::ConflictType { span: self.span }
1117 } else {
1118 TypeMismatchReason::PreviousUse { span: self.span }
1119 };
1120 Ok(tcx.dcx().create_err(OpaqueHiddenTypeMismatch {
1121 self_ty,
1122 other_ty,
1123 other_span: other.span,
1124 sub: sub_diag,
1125 }))
1126 }
1127}
1128
1129pub type Clauses<'tcx> = &'tcx ListWithCachedTypeInfo<Clause<'tcx>>;
1130
1131impl<'tcx> rustc_type_ir::Flags for Clauses<'tcx> {
1132 fn flags(&self) -> TypeFlags {
1133 (**self).flags()
1134 }
1135
1136 fn outer_exclusive_binder(&self) -> DebruijnIndex {
1137 (**self).outer_exclusive_binder()
1138 }
1139}
1140
1141#[derive(#[automatically_derived]
impl<'tcx> ::core::fmt::Debug for ParamEnv<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f, "ParamEnv",
"caller_bounds", &&self.caller_bounds)
}
}Debug, #[automatically_derived]
impl<'tcx> ::core::marker::Copy for ParamEnv<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for ParamEnv<'tcx> {
#[inline]
fn clone(&self) -> ParamEnv<'tcx> {
let _: ::core::clone::AssertParamIsClone<Clauses<'tcx>>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::hash::Hash for ParamEnv<'tcx> {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.caller_bounds, state)
}
}Hash, #[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for ParamEnv<'tcx> {
#[inline]
fn eq(&self, other: &ParamEnv<'tcx>) -> bool {
self.caller_bounds == other.caller_bounds
}
}PartialEq, #[automatically_derived]
impl<'tcx> ::core::cmp::Eq for ParamEnv<'tcx> {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<Clauses<'tcx>>;
}
}Eq)]
1147#[derive(const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
ParamEnv<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ParamEnv { caller_bounds: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for ParamEnv<'tcx> {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
ParamEnv { caller_bounds: ref __binding_0 } => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_middle::ty::VisitorResult>::output()
}
}
};TypeVisitable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for ParamEnv<'tcx> {
fn try_fold_with<__F: ::rustc_middle::ty::FallibleTypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
ParamEnv { caller_bounds: __binding_0 } => {
ParamEnv {
caller_bounds: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Self {
match self {
ParamEnv { caller_bounds: __binding_0 } => {
ParamEnv {
caller_bounds: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder),
}
}
}
}
}
};TypeFoldable)]
1148pub struct ParamEnv<'tcx> {
1149 caller_bounds: Clauses<'tcx>,
1155}
1156
1157impl<'tcx> rustc_type_ir::inherent::ParamEnv<TyCtxt<'tcx>> for ParamEnv<'tcx> {
1158 fn caller_bounds(self) -> impl inherent::SliceLike<Item = ty::Clause<'tcx>> {
1159 self.caller_bounds()
1160 }
1161}
1162
1163impl<'tcx> ParamEnv<'tcx> {
1164 #[inline]
1171 pub fn empty() -> Self {
1172 Self::new(ListWithCachedTypeInfo::empty())
1173 }
1174
1175 #[inline]
1176 pub fn caller_bounds(self) -> Clauses<'tcx> {
1177 self.caller_bounds
1178 }
1179
1180 #[inline]
1182 pub fn new(caller_bounds: Clauses<'tcx>) -> Self {
1183 ParamEnv { caller_bounds }
1184 }
1185
1186 pub fn and<T: TypeVisitable<TyCtxt<'tcx>>>(self, value: T) -> ParamEnvAnd<'tcx, T> {
1188 ParamEnvAnd { param_env: self, value }
1189 }
1190
1191 pub fn with_normalized(self, tcx: TyCtxt<'tcx>) -> ParamEnv<'tcx> {
1193 if tcx.next_trait_solver_globally() {
1196 self
1197 } else {
1198 ParamEnv::new(tcx.reveal_opaque_types_in_bounds(self.caller_bounds))
1199 }
1200 }
1201}
1202
1203#[derive(#[automatically_derived]
impl<'tcx, T: ::core::marker::Copy> ::core::marker::Copy for
ParamEnvAnd<'tcx, T> {
}Copy, #[automatically_derived]
impl<'tcx, T: ::core::clone::Clone> ::core::clone::Clone for
ParamEnvAnd<'tcx, T> {
#[inline]
fn clone(&self) -> ParamEnvAnd<'tcx, T> {
ParamEnvAnd {
param_env: ::core::clone::Clone::clone(&self.param_env),
value: ::core::clone::Clone::clone(&self.value),
}
}
}Clone, #[automatically_derived]
impl<'tcx, T: ::core::fmt::Debug> ::core::fmt::Debug for ParamEnvAnd<'tcx, T>
{
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "ParamEnvAnd",
"param_env", &self.param_env, "value", &&self.value)
}
}Debug, #[automatically_derived]
impl<'tcx, T: ::core::cmp::PartialEq> ::core::cmp::PartialEq for
ParamEnvAnd<'tcx, T> {
#[inline]
fn eq(&self, other: &ParamEnvAnd<'tcx, T>) -> bool {
self.param_env == other.param_env && self.value == other.value
}
}PartialEq, #[automatically_derived]
impl<'tcx, T: ::core::cmp::Eq> ::core::cmp::Eq for ParamEnvAnd<'tcx, T> {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<ParamEnv<'tcx>>;
let _: ::core::cmp::AssertParamIsEq<T>;
}
}Eq, #[automatically_derived]
impl<'tcx, T: ::core::hash::Hash> ::core::hash::Hash for ParamEnvAnd<'tcx, T>
{
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.param_env, state);
::core::hash::Hash::hash(&self.value, state)
}
}Hash, const _: () =
{
impl<'tcx, T>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for ParamEnvAnd<'tcx, T> where
T: ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
{
fn try_fold_with<__F: ::rustc_middle::ty::FallibleTypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
ParamEnvAnd { param_env: __binding_0, value: __binding_1 }
=> {
ParamEnvAnd {
param_env: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
value: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Self {
match self {
ParamEnvAnd { param_env: __binding_0, value: __binding_1 }
=> {
ParamEnvAnd {
param_env: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder),
value: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
__folder),
}
}
}
}
}
};TypeFoldable, const _: () =
{
impl<'tcx, T>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for ParamEnvAnd<'tcx, T> where
T: ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
{
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
ParamEnvAnd {
param_env: ref __binding_0, value: ref __binding_1 } => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_middle::ty::VisitorResult>::output()
}
}
};TypeVisitable)]
1204#[derive(const _: () =
{
impl<'tcx, T> ::rustc_data_structures::stable_hash::StableHash for
ParamEnvAnd<'tcx, T> where
T: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ParamEnvAnd {
param_env: ref __binding_0, value: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1205pub struct ParamEnvAnd<'tcx, T> {
1206 pub param_env: ParamEnv<'tcx>,
1207 pub value: T,
1208}
1209
1210#[derive(#[automatically_derived]
impl<'tcx> ::core::marker::Copy for TypingEnv<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for TypingEnv<'tcx> {
#[inline]
fn clone(&self) -> TypingEnv<'tcx> {
let _: ::core::clone::AssertParamIsClone<TypingModeEqWrapper<'tcx>>;
let _: ::core::clone::AssertParamIsClone<ParamEnv<'tcx>>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for TypingEnv<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "TypingEnv",
"typing_mode", &self.typing_mode, "param_env", &&self.param_env)
}
}Debug, #[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for TypingEnv<'tcx> {
#[inline]
fn eq(&self, other: &TypingEnv<'tcx>) -> bool {
self.typing_mode == other.typing_mode &&
self.param_env == other.param_env
}
}PartialEq, #[automatically_derived]
impl<'tcx> ::core::cmp::Eq for TypingEnv<'tcx> {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<TypingModeEqWrapper<'tcx>>;
let _: ::core::cmp::AssertParamIsEq<ParamEnv<'tcx>>;
}
}Eq, #[automatically_derived]
impl<'tcx> ::core::hash::Hash for TypingEnv<'tcx> {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.typing_mode, state);
::core::hash::Hash::hash(&self.param_env, state)
}
}Hash, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
TypingEnv<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TypingEnv {
typing_mode: ref __binding_0, param_env: ref __binding_1 }
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1221#[derive(const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for TypingEnv<'tcx> {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
TypingEnv { param_env: ref __binding_1, .. } => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_middle::ty::VisitorResult>::output()
}
}
};TypeVisitable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for TypingEnv<'tcx> {
fn try_fold_with<__F: ::rustc_middle::ty::FallibleTypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
TypingEnv { typing_mode: __binding_0, param_env: __binding_1
} => {
TypingEnv {
typing_mode: __binding_0,
param_env: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Self {
match self {
TypingEnv { typing_mode: __binding_0, param_env: __binding_1
} => {
TypingEnv {
typing_mode: __binding_0,
param_env: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
__folder),
}
}
}
}
}
};TypeFoldable)]
1222pub struct TypingEnv<'tcx> {
1223 #[type_foldable(identity)]
1224 #[type_visitable(ignore)]
1225 typing_mode: TypingModeEqWrapper<'tcx>,
1226 pub param_env: ParamEnv<'tcx>,
1227}
1228
1229impl<'tcx> TypingEnv<'tcx> {
1230 pub fn new(param_env: ParamEnv<'tcx>, typing_mode: TypingMode<'tcx>) -> Self {
1231 Self { typing_mode: TypingModeEqWrapper(typing_mode), param_env }
1232 }
1233
1234 pub fn typing_mode(&self) -> TypingMode<'tcx> {
1235 self.typing_mode.0
1236 }
1237
1238 pub fn fully_monomorphized() -> TypingEnv<'tcx> {
1246 Self::new(ParamEnv::empty(), TypingMode::Codegen)
1247 }
1248
1249 pub fn non_body_analysis(
1255 tcx: TyCtxt<'tcx>,
1256 def_id: impl IntoQueryKey<DefId>,
1257 ) -> TypingEnv<'tcx> {
1258 let def_id = def_id.into_query_key();
1259 Self::new(tcx.param_env(def_id), TypingMode::non_body_analysis())
1260 }
1261
1262 pub fn post_typeck_until_borrowck(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> TypingEnv<'tcx> {
1265 let param_env = tcx.param_env(def_id.to_def_id());
1266 TypingEnv::new(param_env, ty::TypingMode::borrowck(tcx, def_id))
1267 }
1268
1269 pub fn post_typeck_until_borrowck_for_mir_build(
1274 tcx: TyCtxt<'tcx>,
1275 def_id: LocalDefId,
1276 ) -> TypingEnv<'tcx> {
1277 if tcx.use_typing_mode_post_typeck_until_borrowck() {
1278 TypingEnv::new(tcx.param_env(def_id.to_def_id()), ty::TypingMode::borrowck(tcx, def_id))
1279 } else {
1280 TypingEnv::non_body_analysis(tcx, def_id)
1283 }
1284 }
1285
1286 pub fn post_analysis(tcx: TyCtxt<'tcx>, def_id: impl IntoQueryKey<DefId>) -> TypingEnv<'tcx> {
1287 TypingEnv::new(tcx.param_env_normalized_for_post_analysis(def_id), TypingMode::PostAnalysis)
1288 }
1289
1290 pub fn codegen(tcx: TyCtxt<'tcx>, def_id: impl IntoQueryKey<DefId>) -> TypingEnv<'tcx> {
1291 TypingEnv::new(tcx.param_env_normalized_for_post_analysis(def_id), TypingMode::Codegen)
1292 }
1293
1294 pub fn with_post_analysis_normalized(self, tcx: TyCtxt<'tcx>) -> TypingEnv<'tcx> {
1297 let TypingEnv { typing_mode, param_env } = self;
1298 match typing_mode.0.assert_not_erased() {
1299 TypingMode::Coherence
1300 | TypingMode::Reflection
1301 | TypingMode::Typeck { .. }
1302 | TypingMode::PostTypeckUntilBorrowck { .. }
1303 | TypingMode::PostBorrowck { .. } => {}
1304 TypingMode::PostAnalysis | TypingMode::Codegen => return self,
1305 }
1306
1307 let param_env = param_env.with_normalized(tcx);
1308 TypingEnv::new(param_env, TypingMode::PostAnalysis)
1309 }
1310
1311 pub fn with_codegen_normalized(self, tcx: TyCtxt<'tcx>) -> TypingEnv<'tcx> {
1314 let TypingEnv { typing_mode, param_env } = self;
1315 match typing_mode.0.assert_not_erased() {
1316 TypingMode::Coherence
1317 | TypingMode::Reflection
1318 | TypingMode::Typeck { .. }
1319 | TypingMode::PostTypeckUntilBorrowck { .. }
1320 | TypingMode::PostBorrowck { .. }
1321 | TypingMode::PostAnalysis => {}
1322 TypingMode::Codegen => return self,
1323 }
1324
1325 let param_env = param_env.with_normalized(tcx);
1326 TypingEnv::new(param_env, TypingMode::Codegen)
1327 }
1328
1329 pub fn as_query_input<T>(self, value: T) -> PseudoCanonicalInput<'tcx, T>
1334 where
1335 T: TypeVisitable<TyCtxt<'tcx>>,
1336 {
1337 PseudoCanonicalInput { typing_env: self, value }
1350 }
1351}
1352
1353#[derive(#[automatically_derived]
impl<'tcx, T: ::core::marker::Copy> ::core::marker::Copy for
PseudoCanonicalInput<'tcx, T> {
}Copy, #[automatically_derived]
impl<'tcx, T: ::core::clone::Clone> ::core::clone::Clone for
PseudoCanonicalInput<'tcx, T> {
#[inline]
fn clone(&self) -> PseudoCanonicalInput<'tcx, T> {
PseudoCanonicalInput {
typing_env: ::core::clone::Clone::clone(&self.typing_env),
value: ::core::clone::Clone::clone(&self.value),
}
}
}Clone, #[automatically_derived]
impl<'tcx, T: ::core::fmt::Debug> ::core::fmt::Debug for
PseudoCanonicalInput<'tcx, T> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"PseudoCanonicalInput", "typing_env", &self.typing_env, "value",
&&self.value)
}
}Debug, #[automatically_derived]
impl<'tcx, T: ::core::cmp::PartialEq> ::core::cmp::PartialEq for
PseudoCanonicalInput<'tcx, T> {
#[inline]
fn eq(&self, other: &PseudoCanonicalInput<'tcx, T>) -> bool {
self.typing_env == other.typing_env && self.value == other.value
}
}PartialEq, #[automatically_derived]
impl<'tcx, T: ::core::cmp::Eq> ::core::cmp::Eq for
PseudoCanonicalInput<'tcx, T> {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<TypingEnv<'tcx>>;
let _: ::core::cmp::AssertParamIsEq<T>;
}
}Eq, #[automatically_derived]
impl<'tcx, T: ::core::hash::Hash> ::core::hash::Hash for
PseudoCanonicalInput<'tcx, T> {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.typing_env, state);
::core::hash::Hash::hash(&self.value, state)
}
}Hash)]
1363#[derive(const _: () =
{
impl<'tcx, T> ::rustc_data_structures::stable_hash::StableHash for
PseudoCanonicalInput<'tcx, T> where
T: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
PseudoCanonicalInput {
typing_env: ref __binding_0, value: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<'tcx, T>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for PseudoCanonicalInput<'tcx, T> where
T: ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
{
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
PseudoCanonicalInput {
typing_env: ref __binding_0, value: ref __binding_1 } => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_middle::ty::VisitorResult>::output()
}
}
};TypeVisitable, const _: () =
{
impl<'tcx, T>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for PseudoCanonicalInput<'tcx, T> where
T: ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
{
fn try_fold_with<__F: ::rustc_middle::ty::FallibleTypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
PseudoCanonicalInput {
typing_env: __binding_0, value: __binding_1 } => {
PseudoCanonicalInput {
typing_env: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
value: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Self {
match self {
PseudoCanonicalInput {
typing_env: __binding_0, value: __binding_1 } => {
PseudoCanonicalInput {
typing_env: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder),
value: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
__folder),
}
}
}
}
}
};TypeFoldable)]
1364pub struct PseudoCanonicalInput<'tcx, T> {
1365 pub typing_env: TypingEnv<'tcx>,
1366 pub value: T,
1367}
1368
1369#[derive(#[automatically_derived]
impl ::core::marker::Copy for Destructor { }Copy, #[automatically_derived]
impl ::core::clone::Clone for Destructor {
#[inline]
fn clone(&self) -> Destructor {
let _: ::core::clone::AssertParamIsClone<DefId>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for Destructor {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f, "Destructor",
"did", &&self.did)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for Destructor {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Destructor { did: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for Destructor {
fn encode(&self, __encoder: &mut __E) {
let Destructor { did: ref __binding_0 } = *self;
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for Destructor {
fn decode(__decoder: &mut __D) -> Self {
Destructor {
did: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable)]
1370pub struct Destructor {
1371 pub did: DefId,
1373}
1374
1375#[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) {
let AsyncDestructor { impl_did: ref __binding_0 } = *self;
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for AsyncDestructor {
fn decode(__decoder: &mut __D) -> Self {
AsyncDestructor {
impl_did: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable)]
1377pub struct AsyncDestructor {
1378 pub impl_did: DefId,
1380}
1381
1382#[derive(#[automatically_derived]
impl ::core::clone::Clone for VariantFlags {
#[inline]
fn clone(&self) -> VariantFlags {
let _: ::core::clone::AssertParamIsClone<u8>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for VariantFlags { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for VariantFlags {
#[inline]
fn eq(&self, other: &VariantFlags) -> bool { self.0 == other.0 }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for VariantFlags {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<u8>;
}
}Eq, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for VariantFlags
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
VariantFlags(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for VariantFlags {
fn encode(&self, __encoder: &mut __E) {
let VariantFlags(ref __binding_0) = *self;
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for VariantFlags {
fn decode(__decoder: &mut __D) -> Self {
VariantFlags(::rustc_serialize::Decodable::decode(__decoder))
}
}
};TyDecodable)]
1383pub struct VariantFlags(u8);
1384impl VariantFlags {
#[allow(deprecated, non_upper_case_globals,)]
pub const NO_VARIANT_FLAGS: Self = Self::from_bits_retain(0);
#[doc =
r" Indicates whether the field list of this variant is `#[non_exhaustive]`."]
#[allow(deprecated, non_upper_case_globals,)]
pub const IS_FIELD_LIST_NON_EXHAUSTIVE: Self =
Self::from_bits_retain(1 << 0);
}
impl ::bitflags::Flags for VariantFlags {
const FLAGS: &'static [::bitflags::Flag<VariantFlags>] =
&[{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("NO_VARIANT_FLAGS",
VariantFlags::NO_VARIANT_FLAGS)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("IS_FIELD_LIST_NON_EXHAUSTIVE",
VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE)
}];
type Bits = u8;
fn bits(&self) -> u8 { VariantFlags::bits(self) }
fn from_bits_retain(bits: u8) -> VariantFlags {
VariantFlags::from_bits_retain(bits)
}
}
#[allow(dead_code, deprecated, unused_doc_comments, unused_attributes,
unused_mut, unused_imports, non_upper_case_globals, clippy ::
assign_op_pattern, clippy :: iter_without_into_iter,)]
const _: () =
{
#[allow(dead_code, deprecated, unused_attributes)]
impl VariantFlags {
#[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! {
1385 impl VariantFlags: u8 {
1386 const NO_VARIANT_FLAGS = 0;
1387 const IS_FIELD_LIST_NON_EXHAUSTIVE = 1 << 0;
1389 }
1390}
1391impl ::std::fmt::Debug for VariantFlags {
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
::bitflags::parser::to_writer(self, f)
}
}rustc_data_structures::external_bitflags_debug! { VariantFlags }
1392
1393#[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) {
let 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 } = *self;
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_2,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_3,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_4,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_5,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_6,
__encoder);
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for VariantDef {
fn decode(__decoder: &mut __D) -> Self {
VariantDef {
def_id: ::rustc_serialize::Decodable::decode(__decoder),
ctor: ::rustc_serialize::Decodable::decode(__decoder),
name: ::rustc_serialize::Decodable::decode(__decoder),
discr: ::rustc_serialize::Decodable::decode(__decoder),
fields: ::rustc_serialize::Decodable::decode(__decoder),
tainted: ::rustc_serialize::Decodable::decode(__decoder),
flags: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable)]
1395pub struct VariantDef {
1396 pub def_id: DefId,
1399 pub ctor: Option<(CtorKind, DefId)>,
1402 pub name: Symbol,
1404 pub discr: VariantDiscr,
1406 pub fields: IndexVec<FieldIdx, FieldDef>,
1408 tainted: Option<ErrorGuaranteed>,
1410 flags: VariantFlags,
1412}
1413
1414impl VariantDef {
1415 #[allow(clippy :: suspicious_else_formatting)]
{
let __tracing_attr_span;
let __tracing_attr_guard;
if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() ||
{ false } {
__tracing_attr_span =
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("new",
"rustc_middle::ty", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_middle/src/ty/mod.rs"),
::tracing_core::__macro_support::Option::Some(1431u32),
::tracing_core::__macro_support::Option::Some("rustc_middle::ty"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("name")
}> =
::tracing::__macro_support::FieldName::new("name");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("variant_did")
}> =
::tracing::__macro_support::FieldName::new("variant_did");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("ctor")
}> =
::tracing::__macro_support::FieldName::new("ctor");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("discr")
}> =
::tracing::__macro_support::FieldName::new("discr");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("fields")
}> =
::tracing::__macro_support::FieldName::new("fields");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("parent_did")
}> =
::tracing::__macro_support::FieldName::new("parent_did");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("recover_tainted")
}> =
::tracing::__macro_support::FieldName::new("recover_tainted");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("is_field_list_non_exhaustive")
}> =
::tracing::__macro_support::FieldName::new("is_field_list_non_exhaustive");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&name)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&variant_did)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&ctor)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&discr)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&fields)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&parent_did)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&recover_tainted)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&is_field_list_non_exhaustive
as &dyn ::tracing::field::Value))])
})
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[warn(clippy :: suspicious_else_formatting)]
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy ::
needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return: Self = loop {};
return __tracing_attr_fake_return;
}
{
let mut flags = VariantFlags::NO_VARIANT_FLAGS;
if is_field_list_non_exhaustive {
flags |= VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE;
}
VariantDef {
def_id: variant_did.unwrap_or(parent_did),
ctor,
name,
discr,
fields,
flags,
tainted: recover_tainted,
}
}
}
}#[instrument(level = "debug")]
1432 pub fn new(
1433 name: Symbol,
1434 variant_did: Option<DefId>,
1435 ctor: Option<(CtorKind, DefId)>,
1436 discr: VariantDiscr,
1437 fields: IndexVec<FieldIdx, FieldDef>,
1438 parent_did: DefId,
1439 recover_tainted: Option<ErrorGuaranteed>,
1440 is_field_list_non_exhaustive: bool,
1441 ) -> Self {
1442 let mut flags = VariantFlags::NO_VARIANT_FLAGS;
1443 if is_field_list_non_exhaustive {
1444 flags |= VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE;
1445 }
1446
1447 VariantDef {
1448 def_id: variant_did.unwrap_or(parent_did),
1449 ctor,
1450 name,
1451 discr,
1452 fields,
1453 flags,
1454 tainted: recover_tainted,
1455 }
1456 }
1457
1458 #[inline]
1464 pub fn is_field_list_non_exhaustive(&self) -> bool {
1465 self.flags.intersects(VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE)
1466 }
1467
1468 #[inline]
1471 pub fn field_list_has_applicable_non_exhaustive(&self) -> bool {
1472 self.is_field_list_non_exhaustive() && !self.def_id.is_local()
1473 }
1474
1475 pub fn ident(&self, tcx: TyCtxt<'_>) -> Ident {
1477 Ident::new(self.name, tcx.def_ident_span(self.def_id).unwrap())
1478 }
1479
1480 #[inline]
1482 pub fn has_errors(&self) -> Result<(), ErrorGuaranteed> {
1483 self.tainted.map_or(Ok(()), Err)
1484 }
1485
1486 #[inline]
1487 pub fn ctor_kind(&self) -> Option<CtorKind> {
1488 self.ctor.map(|(kind, _)| kind)
1489 }
1490
1491 #[inline]
1492 pub fn ctor_def_id(&self) -> Option<DefId> {
1493 self.ctor.map(|(_, def_id)| def_id)
1494 }
1495
1496 #[inline]
1500 pub fn single_field(&self) -> &FieldDef {
1501 if !(self.fields.len() == 1) {
::core::panicking::panic("assertion failed: self.fields.len() == 1")
};assert!(self.fields.len() == 1);
1502
1503 &self.fields[FieldIdx::ZERO]
1504 }
1505
1506 #[inline]
1508 pub fn tail_opt(&self) -> Option<&FieldDef> {
1509 self.fields.raw.last()
1510 }
1511
1512 #[inline]
1518 pub fn tail(&self) -> &FieldDef {
1519 self.tail_opt().expect("expected unsized ADT to have a tail field")
1520 }
1521
1522 pub fn has_unsafe_fields(&self) -> bool {
1524 self.fields.iter().any(|x| x.safety.is_unsafe())
1525 }
1526}
1527
1528impl PartialEq for VariantDef {
1529 #[inline]
1530 fn eq(&self, other: &Self) -> bool {
1531 let Self {
1539 def_id: lhs_def_id,
1540 ctor: _,
1541 name: _,
1542 discr: _,
1543 fields: _,
1544 flags: _,
1545 tainted: _,
1546 } = &self;
1547 let Self {
1548 def_id: rhs_def_id,
1549 ctor: _,
1550 name: _,
1551 discr: _,
1552 fields: _,
1553 flags: _,
1554 tainted: _,
1555 } = other;
1556
1557 let res = lhs_def_id == rhs_def_id;
1558
1559 if truecfg!(debug_assertions) && res {
1561 let deep = self.ctor == other.ctor
1562 && self.name == other.name
1563 && self.discr == other.discr
1564 && self.fields == other.fields
1565 && self.flags == other.flags;
1566 if !deep {
{
::core::panicking::panic_fmt(format_args!("VariantDef for the same def-id has differing data"));
}
};assert!(deep, "VariantDef for the same def-id has differing data");
1567 }
1568
1569 res
1570 }
1571}
1572
1573impl Eq for VariantDef {}
1574
1575impl Hash for VariantDef {
1576 #[inline]
1577 fn hash<H: Hasher>(&self, s: &mut H) {
1578 let Self { def_id, ctor: _, name: _, discr: _, fields: _, flags: _, tainted: _ } = &self;
1586 def_id.hash(s)
1587 }
1588}
1589
1590#[derive(#[automatically_derived]
impl ::core::marker::Copy for VariantDiscr { }Copy, #[automatically_derived]
impl ::core::clone::Clone for VariantDiscr {
#[inline]
fn clone(&self) -> VariantDiscr {
let _: ::core::clone::AssertParamIsClone<DefId>;
let _: ::core::clone::AssertParamIsClone<u32>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for VariantDiscr {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
VariantDiscr::Explicit(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Explicit", &__self_0),
VariantDiscr::Relative(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Relative", &__self_0),
}
}
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for VariantDiscr {
#[inline]
fn eq(&self, other: &VariantDiscr) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(VariantDiscr::Explicit(__self_0),
VariantDiscr::Explicit(__arg1_0)) => __self_0 == __arg1_0,
(VariantDiscr::Relative(__self_0),
VariantDiscr::Relative(__arg1_0)) => __self_0 == __arg1_0,
_ => unsafe { ::core::intrinsics::unreachable() }
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for VariantDiscr {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<DefId>;
let _: ::core::cmp::AssertParamIsEq<u32>;
}
}Eq, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for VariantDiscr {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
VariantDiscr::Explicit(ref __binding_0) => { 0usize }
VariantDiscr::Relative(ref __binding_0) => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
VariantDiscr::Explicit(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
VariantDiscr::Relative(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for VariantDiscr {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
VariantDiscr::Explicit(::rustc_serialize::Decodable::decode(__decoder))
}
1usize => {
VariantDiscr::Relative(::rustc_serialize::Decodable::decode(__decoder))
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `VariantDiscr`, expected 0..2, actual {0}",
n));
}
}
}
}
};TyDecodable, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for VariantDiscr
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
VariantDiscr::Explicit(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
VariantDiscr::Relative(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1591pub enum VariantDiscr {
1592 Explicit(DefId),
1595
1596 Relative(u32),
1601}
1602
1603#[derive(#[automatically_derived]
impl ::core::fmt::Debug for FieldDef {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["did", "name", "vis", "mut_restriction", "safety", "value"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.did, &self.name, &self.vis, &self.mut_restriction,
&self.safety, &&self.value];
::core::fmt::Formatter::debug_struct_fields_finish(f, "FieldDef",
names, values)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for FieldDef {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
FieldDef {
did: ref __binding_0,
name: ref __binding_1,
vis: ref __binding_2,
mut_restriction: ref __binding_3,
safety: ref __binding_4,
value: ref __binding_5 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for FieldDef {
fn encode(&self, __encoder: &mut __E) {
let FieldDef {
did: ref __binding_0,
name: ref __binding_1,
vis: ref __binding_2,
mut_restriction: ref __binding_3,
safety: ref __binding_4,
value: ref __binding_5 } = *self;
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_2,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_3,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_4,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_5,
__encoder);
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for FieldDef {
fn decode(__decoder: &mut __D) -> Self {
FieldDef {
did: ::rustc_serialize::Decodable::decode(__decoder),
name: ::rustc_serialize::Decodable::decode(__decoder),
vis: ::rustc_serialize::Decodable::decode(__decoder),
mut_restriction: ::rustc_serialize::Decodable::decode(__decoder),
safety: ::rustc_serialize::Decodable::decode(__decoder),
value: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable)]
1604pub struct FieldDef {
1605 pub did: DefId,
1606 pub name: Symbol,
1607 pub vis: Visibility<ModId>,
1608 pub mut_restriction: RestrictionKind,
1609 pub safety: hir::Safety,
1610 pub value: Option<DefId>,
1611}
1612
1613impl PartialEq for FieldDef {
1614 #[inline]
1615 fn eq(&self, other: &Self) -> bool {
1616 let Self { did: lhs_did, name: _, vis: _, mut_restriction: _, safety: _, value: _ } = &self;
1624
1625 let Self { did: rhs_did, name: _, vis: _, mut_restriction: _, safety: _, value: _ } = other;
1626
1627 let res = lhs_did == rhs_did;
1628
1629 if truecfg!(debug_assertions) && res {
1631 let deep = self.name == other.name
1632 && self.vis == other.vis
1633 && self.mut_restriction == other.mut_restriction
1634 && self.safety == other.safety;
1635 if !deep {
{
::core::panicking::panic_fmt(format_args!("FieldDef for the same def-id has differing data"));
}
};assert!(deep, "FieldDef for the same def-id has differing data");
1636 }
1637
1638 res
1639 }
1640}
1641
1642impl Eq for FieldDef {}
1643
1644impl Hash for FieldDef {
1645 #[inline]
1646 fn hash<H: Hasher>(&self, s: &mut H) {
1647 let Self { did, name: _, vis: _, mut_restriction: _, safety: _, value: _ } = &self;
1655
1656 did.hash(s)
1657 }
1658}
1659
1660impl<'tcx> FieldDef {
1661 pub fn ty(
1664 &self,
1665 tcx: TyCtxt<'tcx>,
1666 args: GenericArgsRef<'tcx>,
1667 ) -> Unnormalized<'tcx, Ty<'tcx>> {
1668 tcx.type_of(self.did).instantiate(tcx, args)
1669 }
1670
1671 pub fn ident(&self, tcx: TyCtxt<'_>) -> Ident {
1673 Ident::new(self.name, tcx.def_ident_span(self.did).unwrap())
1674 }
1675}
1676
1677#[derive(#[automatically_derived]
impl ::core::fmt::Debug for ImplOverlapKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
ImplOverlapKind::Permitted { marker: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Permitted", "marker", &__self_0),
}
}
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for ImplOverlapKind {
#[inline]
fn eq(&self, other: &ImplOverlapKind) -> bool {
match (self, other) {
(ImplOverlapKind::Permitted { marker: __self_0 },
ImplOverlapKind::Permitted { marker: __arg1_0 }) =>
__self_0 == __arg1_0,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ImplOverlapKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<bool>;
}
}Eq)]
1678pub enum ImplOverlapKind {
1679 Permitted {
1681 marker: bool,
1683 },
1684}
1685
1686#[derive(#[automatically_derived]
impl ::core::clone::Clone for ImplTraitInTraitData {
#[inline]
fn clone(&self) -> ImplTraitInTraitData {
let _: ::core::clone::AssertParamIsClone<DefId>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for ImplTraitInTraitData { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for ImplTraitInTraitData {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
ImplTraitInTraitData::Trait {
fn_def_id: __self_0, opaque_def_id: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Trait",
"fn_def_id", __self_0, "opaque_def_id", &__self_1),
ImplTraitInTraitData::Impl { fn_def_id: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Impl",
"fn_def_id", &__self_0),
}
}
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for ImplTraitInTraitData {
#[inline]
fn eq(&self, other: &ImplTraitInTraitData) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(ImplTraitInTraitData::Trait {
fn_def_id: __self_0, opaque_def_id: __self_1 },
ImplTraitInTraitData::Trait {
fn_def_id: __arg1_0, opaque_def_id: __arg1_1 }) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(ImplTraitInTraitData::Impl { fn_def_id: __self_0 },
ImplTraitInTraitData::Impl { fn_def_id: __arg1_0 }) =>
__self_0 == __arg1_0,
_ => unsafe { ::core::intrinsics::unreachable() }
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ImplTraitInTraitData {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<DefId>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for ImplTraitInTraitData {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
ImplTraitInTraitData::Trait {
fn_def_id: __self_0, opaque_def_id: __self_1 } => {
::core::hash::Hash::hash(__self_0, state);
::core::hash::Hash::hash(__self_1, state)
}
ImplTraitInTraitData::Impl { fn_def_id: __self_0 } =>
::core::hash::Hash::hash(__self_0, state),
}
}
}Hash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for ImplTraitInTraitData {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
ImplTraitInTraitData::Trait {
fn_def_id: ref __binding_0, opaque_def_id: ref __binding_1 }
=> {
0usize
}
ImplTraitInTraitData::Impl { fn_def_id: ref __binding_0 } =>
{
1usize
}
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
ImplTraitInTraitData::Trait {
fn_def_id: ref __binding_0, opaque_def_id: ref __binding_1 }
=> {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
ImplTraitInTraitData::Impl { fn_def_id: ref __binding_0 } =>
{
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for ImplTraitInTraitData {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
ImplTraitInTraitData::Trait {
fn_def_id: ::rustc_serialize::Decodable::decode(__decoder),
opaque_def_id: ::rustc_serialize::Decodable::decode(__decoder),
}
}
1usize => {
ImplTraitInTraitData::Impl {
fn_def_id: ::rustc_serialize::Decodable::decode(__decoder),
}
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `ImplTraitInTraitData`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
ImplTraitInTraitData {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
ImplTraitInTraitData::Trait {
fn_def_id: ref __binding_0, opaque_def_id: ref __binding_1 }
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ImplTraitInTraitData::Impl { fn_def_id: ref __binding_0 } =>
{
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1689pub enum ImplTraitInTraitData {
1690 Trait { fn_def_id: DefId, opaque_def_id: DefId },
1691 Impl { fn_def_id: DefId },
1692}
1693
1694impl<'tcx> TyCtxt<'tcx> {
1695 pub fn typeck_body(self, body: hir::BodyId) -> &'tcx TypeckResults<'tcx> {
1696 self.typeck(self.hir_body_owner_def_id(body))
1697 }
1698
1699 pub fn provided_trait_methods(self, id: DefId) -> impl 'tcx + Iterator<Item = &'tcx AssocItem> {
1700 self.associated_items(id)
1701 .in_definition_order()
1702 .filter(move |item| item.is_fn() && item.defaultness(self).has_value())
1703 }
1704
1705 pub fn repr_options_of_def(self, did: LocalDefId) -> ReprOptions {
1706 let mut flags = ReprFlags::empty();
1707 let mut size = None;
1708 let mut max_align: Option<Align> = None;
1709 let mut min_pack: Option<Align> = None;
1710
1711 let mut field_shuffle_seed = self.def_path_hash(did.to_def_id()).0.to_smaller_hash();
1714
1715 if let Some(user_seed) = self.sess.opts.unstable_opts.layout_seed {
1719 field_shuffle_seed ^= user_seed;
1720 }
1721
1722 let elt = {
{
'done:
{
for i in ::rustc_attr_ir::HasAttrs::get_attrs(did, &self) {
#[allow(unused_imports)]
use ::rustc_attr_ir::AttributeKind::*;
let i: &::rustc_attr_ir::Attribute = i;
match i {
::rustc_attr_ir::Attribute::Parsed(RustcScalableVector {
element_count }) => {
break 'done Some(element_count);
}
::rustc_attr_ir::Attribute::Unparsed(..) =>
{}
#[deny(unreachable_patterns)]
_ => {}
}
}
None
}
}
}find_attr!(self, did, RustcScalableVector { element_count } => element_count
1723 )
1724 .map(|elt| match elt {
1725 Some(n) => ScalableElt::ElementCount(*n),
1726 None => ScalableElt::Container,
1727 });
1728 if elt.is_some() {
1729 flags.insert(ReprFlags::IS_SCALABLE);
1730 }
1731 if let Some(reprs) = {
{
'done:
{
for i in ::rustc_attr_ir::HasAttrs::get_attrs(did, &self) {
#[allow(unused_imports)]
use ::rustc_attr_ir::AttributeKind::*;
let i: &::rustc_attr_ir::Attribute = i;
match i {
::rustc_attr_ir::Attribute::Parsed(Repr { reprs, .. }) => {
break 'done Some(reprs);
}
::rustc_attr_ir::Attribute::Unparsed(..) =>
{}
#[deny(unreachable_patterns)]
_ => {}
}
}
None
}
}
}find_attr!(self, did, Repr { reprs, .. } => reprs) {
1732 for (r, _) in reprs {
1733 flags.insert(match *r {
1734 attr::ReprRust => ReprFlags::empty(),
1735 attr::ReprC => ReprFlags::IS_C,
1736 attr::ReprPacked(pack) => {
1737 min_pack = Some(if let Some(min_pack) = min_pack {
1738 min_pack.min(pack)
1739 } else {
1740 pack
1741 });
1742 ReprFlags::empty()
1743 }
1744 attr::ReprTransparent => ReprFlags::IS_TRANSPARENT,
1745 attr::ReprSimd => ReprFlags::IS_SIMD,
1746 attr::ReprInt(i) => {
1747 size = Some(match i {
1748 attr::IntType::SignedInt(x) => match x {
1749 ast::IntTy::Isize => IntegerType::Pointer(true),
1750 ast::IntTy::I8 => IntegerType::Fixed(Integer::I8, true),
1751 ast::IntTy::I16 => IntegerType::Fixed(Integer::I16, true),
1752 ast::IntTy::I32 => IntegerType::Fixed(Integer::I32, true),
1753 ast::IntTy::I64 => IntegerType::Fixed(Integer::I64, true),
1754 ast::IntTy::I128 => IntegerType::Fixed(Integer::I128, true),
1755 },
1756 attr::IntType::UnsignedInt(x) => match x {
1757 ast::UintTy::Usize => IntegerType::Pointer(false),
1758 ast::UintTy::U8 => IntegerType::Fixed(Integer::I8, false),
1759 ast::UintTy::U16 => IntegerType::Fixed(Integer::I16, false),
1760 ast::UintTy::U32 => IntegerType::Fixed(Integer::I32, false),
1761 ast::UintTy::U64 => IntegerType::Fixed(Integer::I64, false),
1762 ast::UintTy::U128 => IntegerType::Fixed(Integer::I128, false),
1763 },
1764 });
1765 ReprFlags::empty()
1766 }
1767 attr::ReprAlign(align) => {
1768 max_align = max_align.max(Some(align));
1769 ReprFlags::empty()
1770 }
1771 });
1772 }
1773 }
1774
1775 if self.sess.opts.unstable_opts.randomize_layout {
1778 flags.insert(ReprFlags::RANDOMIZE_LAYOUT);
1779 }
1780
1781 let is_box = self.is_lang_item(did.to_def_id(), LangItem::OwnedBox);
1784
1785 if is_box {
1787 flags.insert(ReprFlags::IS_LINEAR);
1788 }
1789
1790 if {
{
'done:
{
for i in ::rustc_attr_ir::HasAttrs::get_attrs(did, &self) {
#[allow(unused_imports)]
use ::rustc_attr_ir::AttributeKind::*;
let i: &::rustc_attr_ir::Attribute = i;
match i {
::rustc_attr_ir::Attribute::Parsed(RustcPassIndirectlyInNonRusticAbis(..))
=> {
break 'done Some(());
}
::rustc_attr_ir::Attribute::Unparsed(..) =>
{}
#[deny(unreachable_patterns)]
_ => {}
}
}
None
}
}
}.is_some()find_attr!(self, did, RustcPassIndirectlyInNonRusticAbis(..)) {
1792 flags.insert(ReprFlags::PASS_INDIRECTLY_IN_NON_RUSTIC_ABIS);
1793 }
1794
1795 ReprOptions {
1796 int: size,
1797 align: max_align,
1798 pack: min_pack,
1799 flags,
1800 field_shuffle_seed,
1801 scalable: elt,
1802 }
1803 }
1804
1805 pub fn opt_item_name(self, def_id: impl IntoQueryKey<DefId>) -> Option<Symbol> {
1807 let def_id = def_id.into_query_key();
1808 if let Some(cnum) = def_id.as_crate_root() {
1809 Some(self.crate_name(cnum))
1810 } else {
1811 let def_key = self.def_key(def_id);
1812 match def_key.disambiguated_data.data {
1813 rustc_hir::definitions::DefPathData::Ctor => self
1815 .opt_item_name(DefId { krate: def_id.krate, index: def_key.parent.unwrap() }),
1816 _ => def_key.get_opt_name(),
1817 }
1818 }
1819 }
1820
1821 pub fn item_name(self, id: impl IntoQueryKey<DefId>) -> Symbol {
1828 let id = id.into_query_key();
1829 self.opt_item_name(id).unwrap_or_else(|| {
1830 crate::util::bug::bug_fmt(format_args!("item_name: no name for {0:?}",
self.def_path(id)));bug!("item_name: no name for {:?}", self.def_path(id));
1831 })
1832 }
1833
1834 pub fn opt_item_ident(self, def_id: impl IntoQueryKey<DefId>) -> Option<Ident> {
1838 let def_id = def_id.into_query_key();
1839 let def = self.opt_item_name(def_id)?;
1840 let span = self
1841 .def_ident_span(def_id)
1842 .unwrap_or_else(|| crate::util::bug::bug_fmt(format_args!("missing ident span for {0:?}",
def_id))bug!("missing ident span for {def_id:?}"));
1843 Some(Ident::new(def, span))
1844 }
1845
1846 pub fn item_ident(self, def_id: impl IntoQueryKey<DefId>) -> Ident {
1850 let def_id = def_id.into_query_key();
1851 self.opt_item_ident(def_id).unwrap_or_else(|| {
1852 crate::util::bug::bug_fmt(format_args!("item_ident: no name for {0:?}",
self.def_path(def_id)));bug!("item_ident: no name for {:?}", self.def_path(def_id));
1853 })
1854 }
1855
1856 pub fn opt_associated_item(self, def_id: DefId) -> Option<AssocItem> {
1857 if let DefKind::AssocConst { .. } | DefKind::AssocFn | DefKind::AssocTy =
1858 self.def_kind(def_id)
1859 {
1860 Some(self.associated_item(def_id))
1861 } else {
1862 None
1863 }
1864 }
1865
1866 pub fn opt_rpitit_info(self, def_id: DefId) -> Option<ImplTraitInTraitData> {
1870 if let DefKind::AssocTy = self.def_kind(def_id)
1871 && let AssocKind::Type { data: AssocTypeData::Rpitit(rpitit_info) } =
1872 self.associated_item(def_id).kind
1873 {
1874 Some(rpitit_info)
1875 } else {
1876 None
1877 }
1878 }
1879
1880 pub fn find_field_index(self, ident: Ident, variant: &VariantDef) -> Option<FieldIdx> {
1881 variant.fields.iter_enumerated().find_map(|(i, field)| {
1882 self.hygienic_eq(ident, field.ident(self), variant.def_id).then_some(i)
1883 })
1884 }
1885
1886 x;#[instrument(level = "debug", skip(self), ret)]
1889 pub fn impls_are_allowed_to_overlap(
1890 self,
1891 def_id1: DefId,
1892 def_id2: DefId,
1893 ) -> Option<ImplOverlapKind> {
1894 let impl1 = self.impl_trait_header(def_id1);
1895 let impl2 = self.impl_trait_header(def_id2);
1896
1897 let trait_ref1 = impl1.trait_ref.skip_binder();
1898 let trait_ref2 = impl2.trait_ref.skip_binder();
1899
1900 if trait_ref1.references_error() || trait_ref2.references_error() {
1903 return Some(ImplOverlapKind::Permitted { marker: false });
1904 }
1905
1906 match (impl1.polarity, impl2.polarity) {
1907 (ImplPolarity::Reservation, _) | (_, ImplPolarity::Reservation) => {
1908 return Some(ImplOverlapKind::Permitted { marker: false });
1910 }
1911 (ImplPolarity::Positive, ImplPolarity::Negative)
1912 | (ImplPolarity::Negative, ImplPolarity::Positive) => {
1913 return None;
1915 }
1916 (ImplPolarity::Positive, ImplPolarity::Positive)
1917 | (ImplPolarity::Negative, ImplPolarity::Negative) => {}
1918 };
1919
1920 let is_marker_impl = |trait_ref: TraitRef<'_>| self.trait_def(trait_ref.def_id).is_marker;
1921 let is_marker_overlap = is_marker_impl(trait_ref1) && is_marker_impl(trait_ref2);
1922
1923 if is_marker_overlap {
1924 return Some(ImplOverlapKind::Permitted { marker: true });
1925 }
1926
1927 None
1928 }
1929
1930 pub fn expect_variant_res(self, res: Res) -> &'tcx VariantDef {
1933 match res {
1934 Res::Def(DefKind::Variant, did) => {
1935 let enum_did = self.parent(did);
1936 self.adt_def(enum_did).variant_with_id(did)
1937 }
1938 Res::Def(DefKind::Struct | DefKind::Union, did) => self.adt_def(did).non_enum_variant(),
1939 Res::Def(DefKind::Ctor(CtorOf::Variant, ..), variant_ctor_did) => {
1940 let variant_did = self.parent(variant_ctor_did);
1941 let enum_did = self.parent(variant_did);
1942 self.adt_def(enum_did).variant_with_ctor_id(variant_ctor_did)
1943 }
1944 Res::Def(DefKind::Ctor(CtorOf::Struct, ..), ctor_did) => {
1945 let struct_did = self.parent(ctor_did);
1946 self.adt_def(struct_did).non_enum_variant()
1947 }
1948 _ => crate::util::bug::bug_fmt(format_args!("expect_variant_res used with unexpected res {0:?}",
res))bug!("expect_variant_res used with unexpected res {:?}", res),
1949 }
1950 }
1951
1952 #[allow(clippy :: suspicious_else_formatting)]
{
let __tracing_attr_span;
let __tracing_attr_guard;
if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() ||
{ false } {
__tracing_attr_span =
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("instance_mir",
"rustc_middle::ty", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_middle/src/ty/mod.rs"),
::tracing_core::__macro_support::Option::Some(1953u32),
::tracing_core::__macro_support::Option::Some("rustc_middle::ty"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("instance")
}> =
::tracing::__macro_support::FieldName::new("instance");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&instance)
as &dyn ::tracing::field::Value))])
})
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[warn(clippy :: suspicious_else_formatting)]
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy ::
needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return: &'tcx Body<'tcx> = loop {};
return __tracing_attr_fake_return;
}
{
let body =
match instance {
ty::InstanceKind::Item(def) => {
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_middle/src/ty/mod.rs:1957",
"rustc_middle::ty", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_middle/src/ty/mod.rs"),
::tracing_core::__macro_support::Option::Some(1957u32),
::tracing_core::__macro_support::Option::Some("rustc_middle::ty"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("calling def_kind on def: {0:?}",
def) as &dyn ::tracing::field::Value))])
});
} else { ; }
};
let def_kind = self.def_kind(def);
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_middle/src/ty/mod.rs:1959",
"rustc_middle::ty", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_middle/src/ty/mod.rs"),
::tracing_core::__macro_support::Option::Some(1959u32),
::tracing_core::__macro_support::Option::Some("rustc_middle::ty"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("returned from def_kind: {0:?}",
def_kind) as &dyn ::tracing::field::Value))])
});
} else { ; }
};
match def_kind {
DefKind::Const { .. } | DefKind::Static { .. } |
DefKind::AssocConst { .. } | DefKind::Ctor(..) |
DefKind::AnonConst => self.mir_for_ctfe(def),
DefKind::Fn | DefKind::AssocFn if
#[allow(non_exhaustive_omitted_patterns)] match self.constness(def)
{
hir::Constness::Const { always: true } => true,
_ => false,
} => {
self.mir_for_ctfe(def)
}
_ => self.optimized_mir(def),
}
}
ty::InstanceKind::Intrinsic(..) |
ty::InstanceKind::LlvmIntrinsic(..) => {
crate::util::bug::bug_fmt(format_args!("intrinsics have no instance MIR"))
}
ty::InstanceKind::Virtual(..) =>
crate::util::bug::bug_fmt(format_args!("virtual dispatches have no instance MIR")),
ty::InstanceKind::Shim(shim) => self.mir_shims(shim),
};
if !#[allow(non_exhaustive_omitted_patterns)] match body.phase {
MirPhase::Runtime(_) => true,
_ => false,
} {
{
::core::panicking::panic_fmt(format_args!("body: {1:?} instance: {2:?} {0:?}",
if let ty::InstanceKind::Item(d) = instance {
Some(self.def_kind(d))
} else { None }, body, instance));
}
};
body
}
}
}#[instrument(skip(self), level = "debug")]
1954 pub fn instance_mir(self, instance: ty::InstanceKind<'tcx>) -> &'tcx Body<'tcx> {
1955 let body = match instance {
1956 ty::InstanceKind::Item(def) => {
1957 debug!("calling def_kind on def: {:?}", def);
1958 let def_kind = self.def_kind(def);
1959 debug!("returned from def_kind: {:?}", def_kind);
1960 match def_kind {
1961 DefKind::Const { .. }
1962 | DefKind::Static { .. }
1963 | DefKind::AssocConst { .. }
1964 | DefKind::Ctor(..)
1965 | DefKind::AnonConst => self.mir_for_ctfe(def),
1966 DefKind::Fn | DefKind::AssocFn
1967 if matches!(
1968 self.constness(def),
1969 hir::Constness::Const { always: true }
1970 ) =>
1971 {
1972 self.mir_for_ctfe(def)
1973 }
1974 _ => self.optimized_mir(def),
1977 }
1978 }
1979 ty::InstanceKind::Intrinsic(..) | ty::InstanceKind::LlvmIntrinsic(..) => {
1980 bug!("intrinsics have no instance MIR")
1981 }
1982 ty::InstanceKind::Virtual(..) => bug!("virtual dispatches have no instance MIR"),
1983 ty::InstanceKind::Shim(shim) => self.mir_shims(shim),
1984 };
1985
1986 assert!(
1987 matches!(body.phase, MirPhase::Runtime(_)),
1988 "body: {body:?} instance: {instance:?} {:?}",
1989 if let ty::InstanceKind::Item(d) = instance { Some(self.def_kind(d)) } else { None },
1990 );
1991
1992 body
1993 }
1994
1995 #[deprecated = "Though there are valid usecases for this method, especially when your attribute is not a parsed attribute, usually you want to call rustc_hir::find_attr! instead."]
1997 pub fn get_attrs(
1998 self,
1999 did: impl Into<DefId>,
2000 attr: Symbol,
2001 ) -> impl Iterator<Item = &'tcx hir::Attribute> {
2002 #[expect(deprecated)]
2003 self.get_all_attrs(did).iter().filter(move |a: &&hir::Attribute| a.has_name(attr))
2004 }
2005
2006 #[deprecated = "Though there are valid usecases for this method, especially when your attribute is not a parsed attribute, usually you want to call rustc_hir::find_attr! instead."]
2011 pub fn get_all_attrs(self, did: impl Into<DefId>) -> &'tcx [hir::Attribute] {
2012 let did: DefId = did.into();
2013 if let Some(did) = did.as_local() {
2014 self.hir_attrs(self.local_def_id_to_hir_id(did))
2015 } else {
2016 self.attrs_for_def(did)
2017 }
2018 }
2019
2020 pub fn get_attrs_by_path(
2021 self,
2022 did: DefId,
2023 attr: &[Symbol],
2024 ) -> impl Iterator<Item = &'tcx hir::Attribute> {
2025 let filter_fn = move |a: &&hir::Attribute| a.path_matches(attr);
2026 if let Some(did) = did.as_local() {
2027 self.hir_attrs(self.local_def_id_to_hir_id(did)).iter().filter(filter_fn)
2028 } else {
2029 self.attrs_for_def(did).iter().filter(filter_fn)
2030 }
2031 }
2032
2033 pub fn trait_is_auto(self, trait_def_id: DefId) -> bool {
2035 self.trait_def(trait_def_id).has_auto_impl
2036 }
2037
2038 pub fn trait_is_coinductive(self, trait_def_id: DefId) -> bool {
2041 self.trait_def(trait_def_id).is_coinductive
2042 }
2043
2044 pub fn trait_is_alias(self, trait_def_id: DefId) -> bool {
2046 self.def_kind(trait_def_id) == DefKind::TraitAlias
2047 }
2048
2049 fn layout_error(self, err: LayoutError<'tcx>) -> &'tcx LayoutError<'tcx> {
2051 self.arena.alloc(err)
2052 }
2053
2054 fn ordinary_coroutine_layout(
2060 self,
2061 def_id: DefId,
2062 args: GenericArgsRef<'tcx>,
2063 ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
2064 let coroutine_kind_ty = args.as_coroutine().kind_ty();
2065 let mir = self.optimized_mir(def_id);
2066 let ty = || Ty::new_coroutine(self, def_id, args);
2067 if coroutine_kind_ty.is_unit() {
2069 mir.coroutine_layout_raw().ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
2070 } else {
2071 let ty::Coroutine(_, identity_args) =
2074 *self.type_of(def_id).instantiate_identity().skip_norm_wip().kind()
2075 else {
2076 ::core::panicking::panic("internal error: entered unreachable code");unreachable!();
2077 };
2078 let identity_kind_ty = identity_args.as_coroutine().kind_ty();
2079 if identity_kind_ty == coroutine_kind_ty {
2082 mir.coroutine_layout_raw()
2083 .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
2084 } else {
2085 {
match coroutine_kind_ty.to_opt_closure_kind() {
Some(ClosureKind::FnOnce) => {}
ref left_val => {
::core::panicking::assert_matches_failed(left_val,
"Some(ClosureKind::FnOnce)", ::core::option::Option::None);
}
}
};assert_matches!(coroutine_kind_ty.to_opt_closure_kind(), Some(ClosureKind::FnOnce));
2086 {
match identity_kind_ty.to_opt_closure_kind() {
Some(ClosureKind::Fn | ClosureKind::FnMut) => {}
ref left_val => {
::core::panicking::assert_matches_failed(left_val,
"Some(ClosureKind::Fn | ClosureKind::FnMut)",
::core::option::Option::None);
}
}
};assert_matches!(
2087 identity_kind_ty.to_opt_closure_kind(),
2088 Some(ClosureKind::Fn | ClosureKind::FnMut)
2089 );
2090 self.optimized_mir(self.coroutine_by_move_body_def_id(def_id))
2091 .coroutine_layout_raw()
2092 .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
2093 }
2094 }
2095 }
2096
2097 fn async_drop_coroutine_layout(
2101 self,
2102 def_id: DefId,
2103 args: GenericArgsRef<'tcx>,
2104 ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
2105 let ty = || Ty::new_coroutine(self, def_id, args);
2106 if args[0].has_placeholders() || args[0].has_non_region_param() {
2107 return Err(self.layout_error(LayoutError::TooGeneric(ty())));
2108 }
2109 let instance = ShimKind::AsyncDropGlue(def_id, Ty::new_coroutine(self, def_id, args));
2110 self.mir_shims(instance)
2111 .coroutine_layout_raw()
2112 .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
2113 }
2114
2115 pub fn coroutine_layout(
2118 self,
2119 def_id: DefId,
2120 args: GenericArgsRef<'tcx>,
2121 ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
2122 if self.is_async_drop_in_place_coroutine(def_id) {
2123 let arg_cor_ty = args.first().unwrap().expect_ty();
2127 if arg_cor_ty.is_coroutine() {
2128 let span = self.def_span(def_id);
2129 let source_info = SourceInfo::outermost(span);
2130 let variant_fields: IndexVec<VariantIdx, IndexVec<FieldIdx, CoroutineSavedLocal>> =
2133 iter::repeat(IndexVec::new()).take(CoroutineArgs::RESERVED_VARIANTS).collect();
2134 let variant_source_info: IndexVec<VariantIdx, SourceInfo> =
2135 iter::repeat(source_info).take(CoroutineArgs::RESERVED_VARIANTS).collect();
2136 let proxy_layout = CoroutineLayout {
2137 field_tys: [].into(),
2138 variant_fields,
2139 variant_source_info,
2140 storage_conflicts: BitMatrix::new(0, 0),
2141 };
2142 return Ok(self.arena.alloc(proxy_layout));
2143 } else {
2144 self.async_drop_coroutine_layout(def_id, args)
2145 }
2146 } else {
2147 self.ordinary_coroutine_layout(def_id, args)
2148 }
2149 }
2150
2151 pub fn assoc_parent(self, def_id: DefId) -> Option<(DefId, DefKind)> {
2153 if !self.def_kind(def_id).is_assoc() {
2154 return None;
2155 }
2156 let parent = self.parent(def_id);
2157 let def_kind = self.def_kind(parent);
2158 Some((parent, def_kind))
2159 }
2160
2161 pub fn trait_item_of(self, def_id: impl IntoQueryKey<DefId>) -> Option<DefId> {
2163 let def_id = def_id.into_query_key();
2164 self.opt_associated_item(def_id)?.trait_item_def_id()
2165 }
2166
2167 pub fn trait_of_assoc(self, def_id: DefId) -> Option<DefId> {
2170 match self.assoc_parent(def_id) {
2171 Some((id, DefKind::Trait)) => Some(id),
2172 _ => None,
2173 }
2174 }
2175
2176 pub fn impl_is_of_trait(self, def_id: impl IntoQueryKey<DefId>) -> bool {
2177 let def_id = def_id.into_query_key();
2178 let DefKind::Impl { of_trait } = self.def_kind(def_id) else {
2179 {
::core::panicking::panic_fmt(format_args!("expected Impl for {0:?}",
def_id));
};panic!("expected Impl for {def_id:?}");
2180 };
2181 of_trait
2182 }
2183
2184 pub fn impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
2187 match self.assoc_parent(def_id) {
2188 Some((id, DefKind::Impl { .. })) => Some(id),
2189 _ => None,
2190 }
2191 }
2192
2193 pub fn inherent_impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
2196 match self.assoc_parent(def_id) {
2197 Some((id, DefKind::Impl { of_trait: false })) => Some(id),
2198 _ => None,
2199 }
2200 }
2201
2202 pub fn trait_impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
2205 match self.assoc_parent(def_id) {
2206 Some((id, DefKind::Impl { of_trait: true })) => Some(id),
2207 _ => None,
2208 }
2209 }
2210
2211 pub fn impl_polarity(self, def_id: impl IntoQueryKey<DefId>) -> ty::ImplPolarity {
2212 let def_id = def_id.into_query_key();
2213 self.impl_trait_header(def_id).polarity
2214 }
2215
2216 pub fn impl_trait_ref(
2218 self,
2219 def_id: impl IntoQueryKey<DefId>,
2220 ) -> ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>> {
2221 let def_id = def_id.into_query_key();
2222 self.impl_trait_header(def_id).trait_ref
2223 }
2224
2225 pub fn impl_opt_trait_ref(
2228 self,
2229 def_id: impl IntoQueryKey<DefId>,
2230 ) -> Option<ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>>> {
2231 let def_id = def_id.into_query_key();
2232 self.impl_is_of_trait(def_id).then(|| self.impl_trait_ref(def_id))
2233 }
2234
2235 pub fn impl_trait_id(self, def_id: impl IntoQueryKey<DefId>) -> DefId {
2237 let def_id = def_id.into_query_key();
2238 self.impl_trait_ref(def_id).skip_binder().def_id
2239 }
2240
2241 pub fn impl_opt_trait_id(self, def_id: impl IntoQueryKey<DefId>) -> Option<DefId> {
2244 let def_id = def_id.into_query_key();
2245 self.impl_is_of_trait(def_id).then(|| self.impl_trait_id(def_id))
2246 }
2247
2248 pub fn is_exportable(self, def_id: DefId) -> bool {
2249 self.exportable_items(def_id.krate).contains(&def_id)
2250 }
2251
2252 pub fn is_builtin_derived(self, def_id: DefId) -> bool {
2255 if self.is_automatically_derived(def_id)
2256 && let Some(def_id) = def_id.as_local()
2257 && let outer = self.def_span(def_id).ctxt().outer_expn_data()
2258 && #[allow(non_exhaustive_omitted_patterns)] match outer.kind {
ExpnKind::Macro(MacroKind::Derive, _) => true,
_ => false,
}matches!(outer.kind, ExpnKind::Macro(MacroKind::Derive, _))
2259 && {
{
'done:
{
for i in
::rustc_attr_ir::HasAttrs::get_attrs(outer.macro_def_id.unwrap(),
&self) {
#[allow(unused_imports)]
use ::rustc_attr_ir::AttributeKind::*;
let i: &::rustc_attr_ir::Attribute = i;
match i {
::rustc_attr_ir::Attribute::Parsed(RustcBuiltinMacro { .. })
=> {
break 'done Some(());
}
::rustc_attr_ir::Attribute::Unparsed(..) =>
{}
#[deny(unreachable_patterns)]
_ => {}
}
}
None
}
}
}.is_some()find_attr!(self, outer.macro_def_id.unwrap(), RustcBuiltinMacro { .. })
2260 {
2261 true
2262 } else {
2263 false
2264 }
2265 }
2266
2267 pub fn is_automatically_derived(self, def_id: DefId) -> bool {
2269 {
{
'done:
{
for i in ::rustc_attr_ir::HasAttrs::get_attrs(def_id, &self) {
#[allow(unused_imports)]
use ::rustc_attr_ir::AttributeKind::*;
let i: &::rustc_attr_ir::Attribute = i;
match i {
::rustc_attr_ir::Attribute::Parsed(AutomaticallyDerived) =>
{
break 'done Some(());
}
::rustc_attr_ir::Attribute::Unparsed(..) =>
{}
#[deny(unreachable_patterns)]
_ => {}
}
}
None
}
}
}.is_some()find_attr!(self, def_id, AutomaticallyDerived)
2270 }
2271
2272 pub fn span_of_impl(self, impl_def_id: DefId) -> Result<Span, Symbol> {
2275 if let Some(impl_def_id) = impl_def_id.as_local() {
2276 Ok(self.def_span(impl_def_id))
2277 } else {
2278 Err(self.crate_name(impl_def_id.krate))
2279 }
2280 }
2281
2282 pub fn hygienic_eq(self, use_ident: Ident, def_ident: Ident, def_parent_def_id: DefId) -> bool {
2286 use_ident.name == def_ident.name
2290 && use_ident
2291 .span
2292 .ctxt()
2293 .hygienic_eq(def_ident.span.ctxt(), self.expn_that_defined(def_parent_def_id))
2294 }
2295
2296 pub fn adjust_ident(self, mut ident: Ident, scope: DefId) -> Ident {
2297 ident.span.normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope));
2298 ident
2299 }
2300
2301 pub fn adjust_ident_and_get_scope(
2302 self,
2303 mut ident: Ident,
2304 scope: DefId,
2305 item_id: LocalDefId,
2306 ) -> (Ident, ModId) {
2307 let scope = ident
2308 .span
2309 .normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope))
2310 .and_then(|actual_expansion| actual_expansion.expn_data().parent_module)
2311 .unwrap_or_else(|| self.parent_module_from_def_id(item_id).to_mod_id());
2312 (ident, scope)
2313 }
2314
2315 #[inline]
2319 pub fn is_const_fn(self, def_id: impl IntoQueryKey<DefId>) -> bool {
2320 let def_id = def_id.into_query_key();
2321 #[allow(non_exhaustive_omitted_patterns)] match self.def_kind(def_id) {
DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(_, CtorKind::Fn) |
DefKind::Closure => true,
_ => false,
}matches!(
2322 self.def_kind(def_id),
2323 DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(_, CtorKind::Fn) | DefKind::Closure
2324 ) && #[allow(non_exhaustive_omitted_patterns)] match self.constness(def_id) {
hir::Constness::Const { .. } => true,
_ => false,
}matches!(self.constness(def_id), hir::Constness::Const { .. })
2325 }
2326
2327 pub fn is_conditionally_const(self, def_id: impl Into<DefId>) -> bool {
2334 let def_id: DefId = def_id.into();
2335 match self.def_kind(def_id) {
2336 DefKind::Impl { of_trait: true } => {
2337 let header = self.impl_trait_header(def_id);
2338 #[allow(non_exhaustive_omitted_patterns)] match header.constness {
hir::Constness::Const { always: false } => true,
_ => false,
}matches!(header.constness, hir::Constness::Const { always: false })
2339 && self.is_const_trait(header.trait_ref.skip_binder().def_id)
2340 }
2341 DefKind::Impl { of_trait: false } => {
2342 #[allow(non_exhaustive_omitted_patterns)] match self.constness(def_id) {
hir::Constness::Const { always: false } => true,
_ => false,
}matches!(self.constness(def_id), hir::Constness::Const { always: false })
2343 }
2344 DefKind::Fn | DefKind::Ctor(_, CtorKind::Fn) => {
2345 #[allow(non_exhaustive_omitted_patterns)] match self.constness(def_id) {
hir::Constness::Const { always: false } => true,
_ => false,
}matches!(self.constness(def_id), hir::Constness::Const { always: false })
2346 }
2347 DefKind::TraitAlias | DefKind::Trait => self.is_const_trait(def_id),
2348 DefKind::AssocTy => {
2349 let parent_def_id = self.parent(def_id);
2350 match self.def_kind(parent_def_id) {
2351 DefKind::Impl { of_trait: false } => false,
2352 DefKind::Impl { of_trait: true } | DefKind::Trait => {
2353 self.is_conditionally_const(parent_def_id)
2354 }
2355 _ => crate::util::bug::bug_fmt(format_args!("unexpected parent item of associated type: {0:?}",
parent_def_id))bug!("unexpected parent item of associated type: {parent_def_id:?}"),
2356 }
2357 }
2358 DefKind::AssocFn => {
2359 let parent_def_id = self.parent(def_id);
2360 match self.def_kind(parent_def_id) {
2361 DefKind::Impl { of_trait: false } => {
2362 #[allow(non_exhaustive_omitted_patterns)] match self.constness(def_id) {
hir::Constness::Const { always: false } => true,
_ => false,
}matches!(self.constness(def_id), hir::Constness::Const { always: false })
2363 }
2364 DefKind::Impl { of_trait: true } => {
2365 let Some(trait_method_did) = self.trait_item_of(def_id) else {
2366 return false;
2367 };
2368 #[allow(non_exhaustive_omitted_patterns)] match self.constness(trait_method_did)
{
hir::Constness::Const { always: false } => true,
_ => false,
}matches!(
2369 self.constness(trait_method_did),
2370 hir::Constness::Const { always: false }
2371 ) && self.is_conditionally_const(parent_def_id)
2372 }
2373 DefKind::Trait => {
2374 #[allow(non_exhaustive_omitted_patterns)] match self.constness(def_id) {
hir::Constness::Const { always: false } => true,
_ => false,
}matches!(self.constness(def_id), hir::Constness::Const { always: false })
2375 && self.is_conditionally_const(parent_def_id)
2376 }
2377 _ => crate::util::bug::bug_fmt(format_args!("unexpected parent item of associated fn: {0:?}",
parent_def_id))bug!("unexpected parent item of associated fn: {parent_def_id:?}"),
2378 }
2379 }
2380 DefKind::OpaqueTy => match self.opaque_ty_origin(def_id) {
2381 hir::OpaqueTyOrigin::FnReturn { parent, .. } => self.is_conditionally_const(parent),
2382 hir::OpaqueTyOrigin::AsyncFn { .. } => false,
2383 hir::OpaqueTyOrigin::TyAlias { .. } => false,
2385 },
2386 DefKind::Closure => {
2387 #[allow(non_exhaustive_omitted_patterns)] match self.constness(def_id) {
hir::Constness::Const { always: false } => true,
_ => false,
}matches!(self.constness(def_id), hir::Constness::Const { always: false })
2388 }
2389 DefKind::Ctor(_, CtorKind::Const)
2390 | DefKind::Mod
2391 | DefKind::Struct
2392 | DefKind::Union
2393 | DefKind::Enum
2394 | DefKind::Variant
2395 | DefKind::TyAlias
2396 | DefKind::ForeignTy
2397 | DefKind::TyParam
2398 | DefKind::Const { .. }
2399 | DefKind::ConstParam
2400 | DefKind::Static { .. }
2401 | DefKind::AssocConst { .. }
2402 | DefKind::Macro(_)
2403 | DefKind::ExternCrate
2404 | DefKind::Use
2405 | DefKind::ForeignMod
2406 | DefKind::AnonConst
2407 | DefKind::Field
2408 | DefKind::LifetimeParam
2409 | DefKind::GlobalAsm
2410 | DefKind::SyntheticCoroutineBody => false,
2411 }
2412 }
2413
2414 #[inline]
2415 pub fn is_const_trait(self, def_id: DefId) -> bool {
2416 #[allow(non_exhaustive_omitted_patterns)] match self.trait_def(def_id).constness
{
hir::Constness::Const { .. } => true,
_ => false,
}matches!(self.trait_def(def_id).constness, hir::Constness::Const { .. })
2417 }
2418
2419 pub fn impl_method_has_trait_impl_trait_tys(self, def_id: DefId) -> bool {
2420 if self.def_kind(def_id) != DefKind::AssocFn {
2421 return false;
2422 }
2423
2424 let Some(item) = self.opt_associated_item(def_id) else {
2425 return false;
2426 };
2427
2428 let AssocContainer::TraitImpl(Ok(trait_item_def_id)) = item.container else {
2429 return false;
2430 };
2431
2432 !self.associated_types_for_impl_traits_in_associated_fn(trait_item_def_id).is_empty()
2433 }
2434
2435 #[inline]
2450 pub fn fn_abi_of_instance(
2451 self,
2452 query: ty::PseudoCanonicalInput<'tcx, (ty::Instance<'tcx>, &'tcx ty::List<Ty<'tcx>>)>,
2453 ) -> Result<&'tcx FnAbi<'tcx, Ty<'tcx>>, &'tcx FnAbiError<'tcx>> {
2454 if self.sess.opts.optimize != OptLevel::No && self.sess.opts.incremental.is_none() {
2457 self.fn_abi_of_instance_raw(query)
2458 } else {
2459 self.fn_abi_of_instance_no_deduced_attrs(query)
2460 }
2461 }
2462}
2463
2464impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for DefId {
2467 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2468 if let Some(did) = self.as_local() {
2469 tcx.hir_attrs(tcx.local_def_id_to_hir_id(did))
2470 } else {
2471 tcx.attrs_for_def(self)
2472 }
2473 }
2474}
2475
2476impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for LocalDefId {
2477 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2478 tcx.hir_attrs(tcx.local_def_id_to_hir_id(self))
2479 }
2480}
2481
2482impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for hir::OwnerId {
2483 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2484 hir::attrs::HasAttrs::get_attrs(self.def_id, tcx)
2485 }
2486}
2487
2488impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for hir::HirId {
2489 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2490 tcx.hir_attrs(self)
2491 }
2492}
2493
2494pub fn provide(providers: &mut Providers) {
2495 closure::provide(providers);
2496 context::provide(providers);
2497 erase_regions::provide(providers);
2498 inhabitedness::provide(providers);
2499 util::provide(providers);
2500 print::provide(providers);
2501 super::util::bug::provide(providers);
2502 *providers = Providers {
2503 trait_impls_of: trait_def::trait_impls_of_provider,
2504 incoherent_impls: trait_def::incoherent_impls_provider,
2505 trait_impls_in_crate: trait_def::trait_impls_in_crate_provider,
2506 traits: trait_def::traits_provider,
2507 vtable_allocation: vtable::vtable_allocation_provider,
2508 ..*providers
2509 };
2510}
2511
2512#[derive(#[automatically_derived]
impl ::core::clone::Clone for CrateInherentImpls {
#[inline]
fn clone(&self) -> CrateInherentImpls {
CrateInherentImpls {
inherent_impls: ::core::clone::Clone::clone(&self.inherent_impls),
incoherent_impls: ::core::clone::Clone::clone(&self.incoherent_impls),
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for CrateInherentImpls {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"CrateInherentImpls", "inherent_impls", &self.inherent_impls,
"incoherent_impls", &&self.incoherent_impls)
}
}Debug, #[automatically_derived]
impl ::core::default::Default for CrateInherentImpls {
#[inline]
fn default() -> CrateInherentImpls {
CrateInherentImpls {
inherent_impls: ::core::default::Default::default(),
incoherent_impls: ::core::default::Default::default(),
}
}
}Default, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
CrateInherentImpls {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
CrateInherentImpls {
inherent_impls: ref __binding_0,
incoherent_impls: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
2518pub struct CrateInherentImpls {
2519 pub inherent_impls: FxIndexMap<LocalDefId, Vec<DefId>>,
2520 pub incoherent_impls: FxIndexMap<SimplifiedType, Vec<LocalDefId>>,
2521}
2522
2523#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for SymbolName<'tcx> {
#[inline]
fn clone(&self) -> SymbolName<'tcx> {
let _: ::core::clone::AssertParamIsClone<&'tcx str>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::marker::Copy for SymbolName<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for SymbolName<'tcx> {
#[inline]
fn eq(&self, other: &SymbolName<'tcx>) -> bool { self.name == other.name }
}PartialEq, #[automatically_derived]
impl<'tcx> ::core::cmp::Eq for SymbolName<'tcx> {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<&'tcx str>;
}
}Eq, #[automatically_derived]
impl<'tcx> ::core::cmp::PartialOrd for SymbolName<'tcx> {
#[inline]
fn partial_cmp(&self, other: &SymbolName<'tcx>)
-> ::core::option::Option<::core::cmp::Ordering> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}PartialOrd, #[automatically_derived]
impl<'tcx> ::core::cmp::Ord for SymbolName<'tcx> {
#[inline]
fn cmp(&self, other: &SymbolName<'tcx>) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&self.name, &other.name)
}
}Ord, #[automatically_derived]
impl<'tcx> ::core::hash::Hash for SymbolName<'tcx> {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.name, state)
}
}Hash, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for SymbolName<'tcx> {
fn encode(&self, __encoder: &mut __E) {
let SymbolName { name: __binding_0 } = *self;
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
};TyEncodable, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
SymbolName<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
SymbolName { name: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
2524pub struct SymbolName<'tcx> {
2525 pub name: &'tcx str,
2527}
2528
2529impl<'tcx> SymbolName<'tcx> {
2530 pub fn new(tcx: TyCtxt<'tcx>, name: &str) -> SymbolName<'tcx> {
2531 SymbolName { name: tcx.arena.alloc_str(name) }
2532 }
2533}
2534
2535impl<'tcx> fmt::Display for SymbolName<'tcx> {
2536 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2537 fmt::Display::fmt(&self.name, fmt)
2538 }
2539}
2540
2541impl<'tcx> fmt::Debug for SymbolName<'tcx> {
2542 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2543 fmt::Display::fmt(&self.name, fmt)
2544 }
2545}
2546
2547#[derive(#[automatically_derived]
impl<'tcx> ::core::marker::Copy for DestructuredAdtConst<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for DestructuredAdtConst<'tcx> {
#[inline]
fn clone(&self) -> DestructuredAdtConst<'tcx> {
let _: ::core::clone::AssertParamIsClone<VariantIdx>;
let _: ::core::clone::AssertParamIsClone<&'tcx [ty::Const<'tcx>]>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for DestructuredAdtConst<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"DestructuredAdtConst", "variant", &self.variant, "fields",
&&self.fields)
}
}Debug, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
DestructuredAdtConst<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
DestructuredAdtConst {
variant: ref __binding_0, fields: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
2549pub struct DestructuredAdtConst<'tcx> {
2550 pub variant: VariantIdx,
2551 pub fields: &'tcx [ty::Const<'tcx>],
2552}