1#![allow(rustc::usage_of_ty_tykind)]
13
14use std::cmp::Ordering;
15use std::fmt::Debug;
16use std::hash::{Hash, Hasher};
17use std::marker::PhantomData;
18use std::num::NonZero;
19use std::ptr::NonNull;
20use std::{assert_matches, fmt, iter, str};
21
22pub use adt::*;
23pub use assoc::*;
24pub use generic_args::{GenericArgKind, TermKind, *};
25pub use generics::*;
26pub use intrinsic::IntrinsicDef;
27use rustc_abi::{
28 Align, FieldIdx, Integer, IntegerType, ReprFlags, ReprOptions, ScalableElt, VariantIdx,
29};
30use rustc_ast::node_id::NodeMap;
31use rustc_ast::{self as ast, NodeId};
32pub use rustc_ast_ir::{Movability, Mutability, try_visit};
33use rustc_data_structures::fx::{FxIndexMap, FxIndexSet};
34use rustc_data_structures::intern::Interned;
35use rustc_data_structures::stable_hash::{StableHash, StableHashCtxt, StableHasher};
36use rustc_data_structures::steal::Steal;
37use rustc_data_structures::unord::{UnordMap, UnordSet};
38use rustc_errors::{Diag, ErrorGuaranteed, LintBuffer};
39use rustc_hir::attrs::StrippedCfgItem;
40use rustc_hir::def::{CtorKind, CtorOf, DefKind, DocLinkResMap, LifetimeRes, Res};
41use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, LocalDefIdMap};
42use rustc_hir::definitions::PerParentDisambiguatorState;
43use rustc_hir::{self as hir, LangItem, MissingLifetimeKind, attrs as attr, find_attr};
44use rustc_index::IndexVec;
45use rustc_index::bit_set::BitMatrix;
46use rustc_macros::{
47 BlobDecodable, Decodable, Encodable, StableHash, TyDecodable, TyEncodable, TypeFoldable,
48 TypeVisitable, extension,
49};
50use rustc_serialize::{Decodable, Encodable};
51use rustc_session::config::OptLevel;
52pub use rustc_session::lint::RegisteredTools;
53use rustc_span::def_id::{LocalModId, ModId};
54use rustc_span::hygiene::MacroKind;
55use rustc_span::{DUMMY_SP, ExpnId, ExpnKind, Ident, Span, Symbol};
56use rustc_target::callconv::FnAbi;
57pub use rustc_type_ir::data_structures::{DelayedMap, DelayedSet};
58pub use rustc_type_ir::fast_reject::DeepRejectCtxt;
59#[allow(
60 hidden_glob_reexports,
61 rustc::usage_of_type_ir_inherent,
62 rustc::non_glob_import_of_type_ir_inherent
63)]
64use rustc_type_ir::inherent;
65pub use rustc_type_ir::relate::VarianceDiagInfo;
66pub use rustc_type_ir::solve::{CandidatePreferenceMode, SizedTraitKind, VisibleForLeakCheck};
67pub use rustc_type_ir::*;
68#[allow(hidden_glob_reexports, unused_imports)]
69use rustc_type_ir::{InferCtxtLike, Interner};
70use tracing::{debug, instrument};
71pub use vtable::*;
72
73pub use self::closure::{
74 BorrowKind, CAPTURE_STRUCT_LOCAL, CaptureInfo, CapturedPlace, ClosureTypeInfo,
75 MinCaptureInformationMap, MinCaptureList, RootVariableMinCaptureList, UpvarCapture, UpvarId,
76 UpvarPath, analyze_coroutine_closure_captures, is_ancestor_or_same_capture,
77 place_to_string_for_capture,
78};
79pub use self::consts::{
80 AliasConst, AliasConstKind, AtomicOrdering, Const, ConstInt, ConstKind, ConstToValTreeResult,
81 Expr, ExprKind, LitToConstInput, ScalarInt, SimdAlign, ValTree, ValTreeKindExt, Value,
82 const_lit_matches_ty,
83};
84pub use self::context::{
85 CtxtInterners, CurrentGcx, FreeRegionInfo, GlobalCtxt, Lift, TyCtxt, TyCtxtFeed, tls,
86};
87pub use self::fold::*;
88pub use self::instance::{Instance, InstanceKind, ReifyReason, ShimKind};
89pub(crate) use self::list::RawList;
90pub use self::list::{List, ListWithCachedTypeInfo};
91pub use self::opaque_types::OpaqueTypeKey;
92pub use self::pattern::{Pattern, PatternKind};
93pub use self::predicate::{
94 AliasTerm, AliasTermKind, ArgOutlivesPredicate, Clause, ClauseKind, CoercePredicate,
95 ExistentialPredicate, ExistentialPredicateStableCmpExt, ExistentialProjection,
96 ExistentialTraitRef, HostEffectPredicate, NormalizesTo, OutlivesPredicate, PolyCoercePredicate,
97 PolyExistentialPredicate, PolyExistentialProjection, PolyExistentialTraitRef,
98 PolyProjectionPredicate, PolyRegionOutlivesPredicate, PolySubtypePredicate, PolyTraitPredicate,
99 PolyTraitRef, PolyTypeOutlivesPredicate, Predicate, PredicateKind, ProjectionPredicate,
100 RegionConstraint, RegionEqPredicate, RegionOutlivesPredicate, SubtypePredicate, TraitPredicate,
101 TraitRef, TypeOutlivesPredicate,
102};
103pub use self::region::{
104 EarlyParamRegion, LateParamRegion, LateParamRegionKind, Region, RegionKind, RegionVid,
105};
106pub use self::sty::{
107 Alias, AliasTy, AliasTyKind, Article, Binder, BoundConst, BoundRegion, BoundRegionKind,
108 BoundTy, BoundTyKind, BoundVariableKind, CanonicalPolyFnSig, CoroutineArgsExt, EarlyBinder,
109 FnSig, FnSigKind, FreeAliasTy, InherentAliasTy, InlineConstArgs, InlineConstArgsParts,
110 OpaqueAliasTy, ParamConst, ParamTy, PlaceholderConst, PlaceholderRegion, PlaceholderType,
111 PolyFnSig, ProjectionAliasTy, TyKind, TypeAndMut, TypingMode, TypingModeEqWrapper,
112 Unnormalized, UpvarArgs,
113};
114pub use self::trait_def::TraitDef;
115pub use self::typeck_results::{
116 CanonicalUserType, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations, IsIdentity,
117 Rust2024IncompatiblePatInfo, SplattedDef, TypeckResults, UserType, UserTypeAnnotationIndex,
118 UserTypeKind,
119};
120use crate::error::{OpaqueHiddenTypeMismatch, TypeMismatchReason};
121use crate::metadata::{AmbigModChild, ModChild};
122use crate::middle::privacy::EffectiveVisibilities;
123use crate::mir::{Body, CoroutineLayout, CoroutineSavedLocal, MirPhase, SourceInfo};
124use crate::query::{IntoQueryKey, Providers};
125use crate::ty;
126use crate::ty::codec::{TyDecoder, TyEncoder};
127pub use crate::ty::diagnostics::*;
128use crate::ty::fast_reject::SimplifiedType;
129use crate::ty::layout::{FnAbiError, LayoutError};
130use crate::ty::util::Discr;
131use crate::ty::walk::TypeWalker;
132
133pub mod abstract_const;
134pub mod adjustment;
135pub mod cast;
136pub mod codec;
137pub mod error;
138pub mod fast_reject;
139pub mod inhabitedness;
140pub mod layout;
141pub mod normalize_erasing_regions;
142pub mod offload_meta;
143pub mod pattern;
144pub mod print;
145pub mod relate;
146pub mod significant_drop_order;
147pub mod trait_def;
148pub mod typetree;
149pub mod util;
150pub mod vtable;
151
152mod adt;
153mod assoc;
154mod closure;
155mod consts;
156mod context;
157mod diagnostics;
158mod elaborate_impl;
159mod erase_regions;
160mod fold;
161mod generic_args;
162mod generics;
163mod impls_ty;
164mod instance;
165mod intrinsic;
166mod list;
167mod opaque_types;
168mod predicate;
169mod region;
170mod structural_impls;
171#[allow(hidden_glob_reexports)]
172mod sty;
173mod typeck_results;
174mod visit;
175
176#[derive(#[automatically_derived]
impl ::core::fmt::Debug for ResolverGlobalCtxt {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["visibilities_for_hashing", "expn_that_defined",
"effective_visibilities", "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)]
179pub struct ResolverGlobalCtxt {
180 pub visibilities_for_hashing: Vec<(LocalDefId, Visibility)>,
181 pub expn_that_defined: UnordMap<LocalDefId, ExpnId>,
183 pub effective_visibilities: EffectiveVisibilities,
184 pub macro_reachable_adts: FxIndexMap<LocalDefId, FxIndexSet<LocalDefId>>,
190 pub extern_crate_map: UnordMap<LocalDefId, CrateNum>,
191 pub maybe_unused_trait_imports: FxIndexSet<LocalDefId>,
192 pub module_children: LocalDefIdMap<Vec<ModChild>>,
193 pub ambig_module_children: LocalDefIdMap<Vec<AmbigModChild>>,
194 pub glob_map: FxIndexMap<LocalDefId, FxIndexSet<Symbol>>,
195 pub main_def: Option<MainDefinition>,
196 pub trait_impls: FxIndexMap<DefId, Vec<LocalDefId>>,
197 pub proc_macros: Vec<LocalDefId>,
200 pub confused_type_with_std_module: FxIndexMap<Span, Span>,
203 pub doc_link_resolutions: FxIndexMap<LocalModId, DocLinkResMap>,
204 pub doc_link_traits_in_scope: FxIndexMap<LocalModId, Vec<DefId>>,
205 pub all_macro_rules: UnordSet<Symbol>,
206 pub stripped_cfg_items: Vec<StrippedCfgItem>,
207 pub delegation_infos: FxIndexMap<LocalDefId, DelegationInfo>,
210}
211
212#[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)]
213pub struct PerOwnerResolverData<'tcx> {
214 pub node_id_to_def_id: NodeMap<LocalDefId> = Default::default(),
215 pub lifetime_elision_allowed: bool = false,
217 pub label_res_map: NodeMap<ast::NodeId> = Default::default(),
220 pub lifetimes_res_map: NodeMap<LifetimeRes> = Default::default(),
222
223 pub trait_map: NodeMap<&'tcx [hir::TraitCandidate<'tcx>]> = Default::default(),
224
225 pub import_res: hir::def::PerNS<Option<Res<ast::NodeId>>> = Default::default(),
227 pub extra_lifetime_params_map: NodeMap<Vec<(Ident, ast::NodeId, MissingLifetimeKind)>> = Default::default(),
229
230 pub id: ast::NodeId,
232 pub def_id: LocalDefId,
234}
235
236impl<'tcx> PerOwnerResolverData<'tcx> {
237 pub fn new(id: ast::NodeId, def_id: LocalDefId) -> PerOwnerResolverData<'tcx> {
238 PerOwnerResolverData { id, def_id, .. }
239 }
240
241 pub fn get_label_res(&self, id: ast::NodeId) -> Option<ast::NodeId> {
243 self.label_res_map.get(&id).copied()
244 }
245
246 pub fn get_lifetime_res(&self, id: ast::NodeId) -> Option<LifetimeRes> {
248 self.lifetimes_res_map.get(&id).copied()
249 }
250
251 pub fn extra_lifetime_params(&self, id: NodeId) -> &[(Ident, NodeId, MissingLifetimeKind)] {
259 self.extra_lifetime_params_map.get(&id).map_or(&[], |v| &v[..])
260 }
261}
262
263#[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)]
266pub struct ResolverAstLowering<'tcx> {
267 pub partial_res_map: NodeMap<hir::def::PartialRes>,
269
270 pub next_node_id: ast::NodeId,
271
272 pub owners: NodeMap<PerOwnerResolverData<'tcx>>,
273
274 pub lint_buffer: Steal<LintBuffer>,
276
277 pub disambiguators: LocalDefIdMap<Steal<PerParentDisambiguatorState>>,
278}
279
280#[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)]
281pub struct DelegationInfo {
282 pub resolution_id: Result<DefId, ErrorGuaranteed>,
288}
289
290#[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)]
291pub struct MainDefinition {
292 pub res: Res<ast::NodeId>,
293 pub is_import: bool,
294 pub span: Span,
295}
296
297impl MainDefinition {
298 pub fn opt_fn_def_id(self) -> Option<DefId> {
299 if let Res::Def(DefKind::Fn, def_id) = self.res { Some(def_id) } else { None }
300 }
301}
302
303#[derive(#[automatically_derived]
impl<'tcx> ::core::marker::Copy for ImplTraitHeader<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for ImplTraitHeader<'tcx> {
#[inline]
fn clone(&self) -> ImplTraitHeader<'tcx> {
let _:
::core::clone::AssertParamIsClone<ty::EarlyBinder<'tcx,
ty::TraitRef<'tcx>>>;
let _: ::core::clone::AssertParamIsClone<ImplPolarity>;
let _: ::core::clone::AssertParamIsClone<hir::Safety>;
let _: ::core::clone::AssertParamIsClone<hir::Constness>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for ImplTraitHeader<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f,
"ImplTraitHeader", "trait_ref", &self.trait_ref, "polarity",
&self.polarity, "safety", &self.safety, "constness",
&&self.constness)
}
}Debug, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for ImplTraitHeader<'tcx> {
fn encode(&self, __encoder: &mut __E) {
match *self {
ImplTraitHeader {
trait_ref: ref __binding_0,
polarity: ref __binding_1,
safety: ref __binding_2,
constness: ref __binding_3 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_2,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_3,
__encoder);
}
}
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for ImplTraitHeader<'tcx> {
fn decode(__decoder: &mut __D) -> Self {
ImplTraitHeader {
trait_ref: ::rustc_serialize::Decodable::decode(__decoder),
polarity: ::rustc_serialize::Decodable::decode(__decoder),
safety: ::rustc_serialize::Decodable::decode(__decoder),
constness: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
ImplTraitHeader<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ImplTraitHeader {
trait_ref: ref __binding_0,
polarity: ref __binding_1,
safety: ref __binding_2,
constness: ref __binding_3 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
304pub struct ImplTraitHeader<'tcx> {
305 pub trait_ref: ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>>,
306 pub polarity: ImplPolarity,
307 pub safety: hir::Safety,
308 pub constness: hir::Constness,
309}
310
311#[derive(#[automatically_derived]
impl ::core::marker::Copy for Asyncness { }Copy, #[automatically_derived]
impl ::core::clone::Clone for Asyncness {
#[inline]
fn clone(&self) -> Asyncness { *self }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for Asyncness {
#[inline]
fn eq(&self, other: &Asyncness) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Asyncness {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for Asyncness {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}Hash, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for Asyncness {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
Asyncness::Yes => { 0usize }
Asyncness::No => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self { Asyncness::Yes => {} Asyncness::No => {} }
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for Asyncness {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { Asyncness::Yes }
1usize => { Asyncness::No }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Asyncness`, expected 0..2, actual {0}",
n));
}
}
}
}
};TyDecodable, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for Asyncness {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self { Asyncness::Yes => {} Asyncness::No => {} }
}
}
};StableHash, #[automatically_derived]
impl ::core::fmt::Debug for Asyncness {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self { Asyncness::Yes => "Yes", Asyncness::No => "No", })
}
}Debug)]
312#[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)]
313pub enum Asyncness {
314 Yes,
315 #[default]
316 No,
317}
318
319impl Asyncness {
320 pub fn is_async(self) -> bool {
321 #[allow(non_exhaustive_omitted_patterns)] match self {
Asyncness::Yes => true,
_ => false,
}matches!(self, Asyncness::Yes)
322 }
323}
324
325#[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)]
326pub enum Visibility<Id = LocalModId> {
327 Public,
329 Restricted(Id),
331}
332
333impl Visibility {
334 pub fn to_string(self, def_id: LocalDefId, tcx: TyCtxt<'_>) -> String {
335 match self {
336 ty::Visibility::Restricted(restricted_id) => {
337 if restricted_id.is_top_level_module() {
338 "pub(crate)".to_string()
339 } else if restricted_id == tcx.parent_module_from_def_id(def_id) {
340 "pub(self)".to_string()
341 } else {
342 ::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!(
343 "pub(in crate{})",
344 tcx.def_path(restricted_id.to_def_id()).to_string_no_crate_verbose()
345 )
346 }
347 }
348 ty::Visibility::Public => "pub".to_string(),
349 }
350 }
351}
352
353#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for ClosureSizeProfileData<'tcx> {
#[inline]
fn clone(&self) -> ClosureSizeProfileData<'tcx> {
let _: ::core::clone::AssertParamIsClone<Ty<'tcx>>;
let _: ::core::clone::AssertParamIsClone<Ty<'tcx>>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for ClosureSizeProfileData<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"ClosureSizeProfileData", "before_feature_tys",
&self.before_feature_tys, "after_feature_tys",
&&self.after_feature_tys)
}
}Debug, #[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for ClosureSizeProfileData<'tcx> {
#[inline]
fn eq(&self, other: &ClosureSizeProfileData<'tcx>) -> bool {
self.before_feature_tys == other.before_feature_tys &&
self.after_feature_tys == other.after_feature_tys
}
}PartialEq, #[automatically_derived]
impl<'tcx> ::core::cmp::Eq for ClosureSizeProfileData<'tcx> {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<Ty<'tcx>>;
let _: ::core::cmp::AssertParamIsEq<Ty<'tcx>>;
}
}Eq, #[automatically_derived]
impl<'tcx> ::core::marker::Copy for ClosureSizeProfileData<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::hash::Hash for ClosureSizeProfileData<'tcx> {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.before_feature_tys, state);
::core::hash::Hash::hash(&self.after_feature_tys, state)
}
}Hash, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for ClosureSizeProfileData<'tcx>
{
fn encode(&self, __encoder: &mut __E) {
match *self {
ClosureSizeProfileData {
before_feature_tys: ref __binding_0,
after_feature_tys: ref __binding_1 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for ClosureSizeProfileData<'tcx>
{
fn decode(__decoder: &mut __D) -> Self {
ClosureSizeProfileData {
before_feature_tys: ::rustc_serialize::Decodable::decode(__decoder),
after_feature_tys: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
ClosureSizeProfileData<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ClosureSizeProfileData {
before_feature_tys: ref __binding_0,
after_feature_tys: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
354#[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)]
355pub struct ClosureSizeProfileData<'tcx> {
356 pub before_feature_tys: Ty<'tcx>,
358 pub after_feature_tys: Ty<'tcx>,
360}
361
362impl TyCtxt<'_> {
363 #[inline]
364 pub fn opt_parent(self, id: DefId) -> Option<DefId> {
365 self.def_key(id).parent.map(|index| DefId { index, ..id })
366 }
367
368 #[inline]
369 #[track_caller]
370 pub fn parent(self, id: DefId) -> DefId {
371 match self.opt_parent(id) {
372 Some(id) => id,
373 None => crate::util::bug::bug_fmt(format_args!("{0:?} doesn\'t have a parent", id))bug!("{id:?} doesn't have a parent"),
375 }
376 }
377
378 #[inline]
379 #[track_caller]
380 pub fn opt_local_parent(self, id: LocalDefId) -> Option<LocalDefId> {
381 self.opt_parent(id.to_def_id()).map(DefId::expect_local)
382 }
383
384 #[inline]
385 #[track_caller]
386 pub fn local_parent(self, id: impl Into<LocalDefId>) -> LocalDefId {
387 self.parent(id.into().to_def_id()).expect_local()
388 }
389
390 fn def_id_partial_cmp(self, lhs: DefId, rhs: DefId) -> Option<Ordering> {
394 if lhs.krate != rhs.krate {
396 return None;
397 }
398
399 let search = |mut start: DefId, finish: DefId, ord| {
403 while start.index != finish.index {
404 match self.opt_parent(start) {
405 Some(parent) => start.index = parent.index,
406 None => return None,
407 }
408 }
409 Some(ord)
410 };
411 match lhs.index.cmp(&rhs.index) {
412 Ordering::Equal => Some(Ordering::Equal),
413 Ordering::Less => search(rhs, lhs, Ordering::Greater),
414 Ordering::Greater => search(lhs, rhs, Ordering::Less),
415 }
416 }
417
418 pub fn is_descendant_of(
419 self,
420 descendant: impl Into<DefId>,
421 ancestor: impl Into<DefId>,
422 ) -> bool {
423 #[allow(non_exhaustive_omitted_patterns)] match self.def_id_partial_cmp(descendant.into(),
ancestor.into()) {
Some(Ordering::Less | Ordering::Equal) => true,
_ => false,
}matches!(
424 self.def_id_partial_cmp(descendant.into(), ancestor.into()),
425 Some(Ordering::Less | Ordering::Equal)
426 )
427 }
428}
429
430impl<Id> Visibility<Id> {
431 pub fn is_public(self) -> bool {
432 #[allow(non_exhaustive_omitted_patterns)] match self {
Visibility::Public => true,
_ => false,
}matches!(self, Visibility::Public)
433 }
434
435 pub fn map_id<OutId>(self, f: impl FnOnce(Id) -> OutId) -> Visibility<OutId> {
436 match self {
437 Visibility::Public => Visibility::Public,
438 Visibility::Restricted(id) => Visibility::Restricted(f(id)),
439 }
440 }
441}
442
443impl Visibility<LocalModId> {
444 pub fn to_mod_id(self) -> Visibility<ModId> {
445 self.map_id(LocalModId::to_mod_id)
446 }
447}
448
449impl<Id: Into<DefId>> Visibility<Id> {
450 pub fn is_accessible_from(self, module: impl Into<DefId>, tcx: TyCtxt<'_>) -> bool {
452 match self {
453 Visibility::Public => true,
455 Visibility::Restricted(id) => tcx.is_descendant_of(module, id),
456 }
457 }
458
459 pub fn partial_cmp(
460 self,
461 vis: Visibility<impl Into<DefId>>,
462 tcx: TyCtxt<'_>,
463 ) -> Option<Ordering> {
464 match (self, vis) {
465 (Visibility::Public, Visibility::Public) => Some(Ordering::Equal),
466 (Visibility::Public, Visibility::Restricted(_)) => Some(Ordering::Greater),
467 (Visibility::Restricted(_), Visibility::Public) => Some(Ordering::Less),
468 (Visibility::Restricted(lhs_id), Visibility::Restricted(rhs_id)) => {
469 let (lhs_id, rhs_id) = (lhs_id.into(), rhs_id.into());
470 tcx.def_id_partial_cmp(lhs_id, rhs_id)
471 }
472 }
473 }
474}
475
476impl<Id: Into<DefId> + Debug + Copy> Visibility<Id> {
477 #[track_caller]
479 pub fn greater_than(
480 self,
481 vis: Visibility<impl Into<DefId> + Debug + Copy>,
482 tcx: TyCtxt<'_>,
483 ) -> bool {
484 match self.partial_cmp(vis, tcx) {
485 Some(ord) => ord.is_gt(),
486 None => {
487 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:?}"));
488 false
489 }
490 }
491 }
492}
493
494impl Visibility<ModId> {
495 pub fn expect_local(self) -> Visibility {
496 self.map_id(|id| id.expect_local())
497 }
498
499 pub fn is_visible_locally(self) -> bool {
501 match self {
502 Visibility::Public => true,
503 Visibility::Restricted(mod_id) => mod_id.is_local(),
504 }
505 }
506}
507
508#[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)]
515pub struct CrateVariancesMap<'tcx> {
516 pub variances: DefIdMap<&'tcx [ty::Variance]>,
520}
521
522#[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)]
525pub struct CReaderCacheKey {
526 pub cnum: Option<CrateNum>,
527 pub pos: usize,
528}
529
530#[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)]
532#[rustc_diagnostic_item = "Ty"]
533#[rustc_pass_by_value]
534pub struct Ty<'tcx>(Interned<'tcx, WithCachedTypeInfo<TyKind<'tcx>>>);
535
536impl<'tcx> rustc_type_ir::inherent::IntoKind for Ty<'tcx> {
537 type Kind = TyKind<'tcx>;
538
539 fn kind(self) -> TyKind<'tcx> {
540 *self.kind()
541 }
542}
543
544impl<'tcx> rustc_type_ir::Flags for Ty<'tcx> {
545 fn flags(&self) -> TypeFlags {
546 self.0.flags
547 }
548
549 fn outer_exclusive_binder(&self) -> DebruijnIndex {
550 self.0.outer_exclusive_binder
551 }
552}
553
554#[derive(const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
CratePredicatesMap<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
CratePredicatesMap { predicates: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for CratePredicatesMap<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f,
"CratePredicatesMap", "predicates", &&self.predicates)
}
}Debug)]
561pub struct CratePredicatesMap<'tcx> {
562 pub predicates: DefIdMap<&'tcx [(Clause<'tcx>, Span)]>,
566}
567
568#[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)]
569pub struct Term<'tcx> {
570 ptr: NonNull<()>,
571 marker: PhantomData<(Ty<'tcx>, Const<'tcx>)>,
572}
573
574impl<'tcx> rustc_type_ir::inherent::Term<TyCtxt<'tcx>> for Term<'tcx> {}
575
576impl<'tcx> rustc_type_ir::inherent::IntoKind for Term<'tcx> {
577 type Kind = TermKind<'tcx>;
578
579 fn kind(self) -> Self::Kind {
580 self.kind()
581 }
582}
583
584unsafe impl<'tcx> rustc_data_structures::sync::DynSend for Term<'tcx> where
585 &'tcx (Ty<'tcx>, Const<'tcx>): rustc_data_structures::sync::DynSend
586{
587}
588unsafe impl<'tcx> rustc_data_structures::sync::DynSync for Term<'tcx> where
589 &'tcx (Ty<'tcx>, Const<'tcx>): rustc_data_structures::sync::DynSync
590{
591}
592unsafe impl<'tcx> Send for Term<'tcx> where &'tcx (Ty<'tcx>, Const<'tcx>): Send {}
593unsafe impl<'tcx> Sync for Term<'tcx> where &'tcx (Ty<'tcx>, Const<'tcx>): Sync {}
594
595impl Debug for Term<'_> {
596 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
597 match self.kind() {
598 TermKind::Ty(ty) => f.write_fmt(format_args!("Term::Ty({0:?})", ty))write!(f, "Term::Ty({ty:?})"),
599 TermKind::Const(ct) => f.write_fmt(format_args!("Term::Const({0:?})", ct))write!(f, "Term::Const({ct:?})"),
600 }
601 }
602}
603
604impl<'tcx> From<Ty<'tcx>> for Term<'tcx> {
605 fn from(ty: Ty<'tcx>) -> Self {
606 TermKind::Ty(ty).pack()
607 }
608}
609
610impl<'tcx> From<Const<'tcx>> for Term<'tcx> {
611 fn from(c: Const<'tcx>) -> Self {
612 TermKind::Const(c).pack()
613 }
614}
615
616impl<'tcx> StableHash for Term<'tcx> {
617 fn stable_hash<Hcx: StableHashCtxt>(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
618 self.kind().stable_hash(hcx, hasher);
619 }
620}
621
622impl<'tcx> TypeFoldable<TyCtxt<'tcx>> for Term<'tcx> {
623 fn try_fold_with<F: FallibleTypeFolder<TyCtxt<'tcx>>>(
624 self,
625 folder: &mut F,
626 ) -> Result<Self, F::Error> {
627 match self.kind() {
628 ty::TermKind::Ty(ty) => ty.try_fold_with(folder).map(Into::into),
629 ty::TermKind::Const(ct) => ct.try_fold_with(folder).map(Into::into),
630 }
631 }
632
633 fn fold_with<F: TypeFolder<TyCtxt<'tcx>>>(self, folder: &mut F) -> Self {
634 match self.kind() {
635 ty::TermKind::Ty(ty) => ty.fold_with(folder).into(),
636 ty::TermKind::Const(ct) => ct.fold_with(folder).into(),
637 }
638 }
639}
640
641impl<'tcx> TypeVisitable<TyCtxt<'tcx>> for Term<'tcx> {
642 fn visit_with<V: TypeVisitor<TyCtxt<'tcx>>>(&self, visitor: &mut V) -> V::Result {
643 match self.kind() {
644 ty::TermKind::Ty(ty) => ty.visit_with(visitor),
645 ty::TermKind::Const(ct) => ct.visit_with(visitor),
646 }
647 }
648}
649
650impl<'tcx, E: TyEncoder<'tcx>> Encodable<E> for Term<'tcx> {
651 fn encode(&self, e: &mut E) {
652 self.kind().encode(e)
653 }
654}
655
656impl<'tcx, D: TyDecoder<'tcx>> Decodable<D> for Term<'tcx> {
657 fn decode(d: &mut D) -> Self {
658 let res: TermKind<'tcx> = Decodable::decode(d);
659 res.pack()
660 }
661}
662
663impl<'tcx> Term<'tcx> {
664 #[inline]
665 pub fn kind(self) -> TermKind<'tcx> {
666 let ptr =
667 unsafe { self.ptr.map_addr(|addr| NonZero::new_unchecked(addr.get() & !TAG_MASK)) };
668 unsafe {
672 match self.ptr.addr().get() & TAG_MASK {
673 TYPE_TAG => TermKind::Ty(Ty(Interned::new_unchecked(
674 ptr.cast::<WithCachedTypeInfo<ty::TyKind<'tcx>>>().as_ref(),
675 ))),
676 CONST_TAG => TermKind::Const(ty::Const(Interned::new_unchecked(
677 ptr.cast::<WithCachedTypeInfo<ty::ConstKind<'tcx>>>().as_ref(),
678 ))),
679 _ => core::intrinsics::unreachable(),
680 }
681 }
682 }
683
684 pub fn as_type(&self) -> Option<Ty<'tcx>> {
685 if let TermKind::Ty(ty) = self.kind() { Some(ty) } else { None }
686 }
687
688 pub fn expect_type(&self) -> Ty<'tcx> {
689 self.as_type().expect("expected a type, but found a const")
690 }
691
692 pub fn as_const(&self) -> Option<Const<'tcx>> {
693 if let TermKind::Const(c) = self.kind() { Some(c) } else { None }
694 }
695
696 pub fn expect_const(&self) -> Const<'tcx> {
697 self.as_const().expect("expected a const, but found a type")
698 }
699
700 pub fn into_arg(self) -> GenericArg<'tcx> {
701 match self.kind() {
702 TermKind::Ty(ty) => ty.into(),
703 TermKind::Const(c) => c.into(),
704 }
705 }
706
707 pub fn to_alias_term(self) -> Option<AliasTerm<'tcx>> {
708 match self.kind() {
709 TermKind::Ty(ty) => match *ty.kind() {
710 ty::Alias(_, alias_ty) => Some(alias_ty.into()),
711 _ => None,
712 },
713 TermKind::Const(ct) => match ct.kind() {
714 ConstKind::Alias(_, alias_const) => Some(alias_const.into()),
715 _ => None,
716 },
717 }
718 }
719
720 pub fn is_non_rigid_alias(self) -> bool {
721 match self.kind() {
722 ty::TermKind::Ty(ty) => match ty.kind() {
723 ty::Alias(ty::IsRigid::No, _) => true,
724 _ => false,
725 },
726 ty::TermKind::Const(ct) => match ct.kind() {
727 ty::ConstKind::Alias(ty::IsRigid::No, _) => true,
728 _ => false,
729 },
730 }
731 }
732
733 pub fn is_infer(&self) -> bool {
734 match self.kind() {
735 TermKind::Ty(ty) => ty.is_ty_var(),
736 TermKind::Const(ct) => ct.is_ct_infer(),
737 }
738 }
739
740 pub fn is_trivially_wf(&self, tcx: TyCtxt<'tcx>) -> bool {
741 match self.kind() {
742 TermKind::Ty(ty) => ty.is_trivially_wf(tcx),
743 TermKind::Const(ct) => ct.is_trivially_wf(),
744 }
745 }
746
747 pub fn walk(self) -> TypeWalker<TyCtxt<'tcx>> {
758 TypeWalker::new(self.into())
759 }
760}
761
762const TAG_MASK: usize = 0b11;
763const TYPE_TAG: usize = 0b00;
764const CONST_TAG: usize = 0b01;
765
766impl<'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>)]
767impl<'tcx> TermKind<'tcx> {
768 #[inline]
769 fn pack(self) -> Term<'tcx> {
770 let (tag, ptr) = match self {
771 TermKind::Ty(ty) => {
772 assert_eq!(align_of_val(&*ty.0.0) & TAG_MASK, 0);
774 (TYPE_TAG, NonNull::from(ty.0.0).cast())
775 }
776 TermKind::Const(ct) => {
777 assert_eq!(align_of_val(&*ct.0.0) & TAG_MASK, 0);
779 (CONST_TAG, NonNull::from(ct.0.0).cast())
780 }
781 };
782
783 Term { ptr: ptr.map_addr(|addr| addr | tag), marker: PhantomData }
784 }
785}
786
787#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for InstantiatedPredicates<'tcx> {
#[inline]
fn clone(&self) -> InstantiatedPredicates<'tcx> {
InstantiatedPredicates {
predicates: ::core::clone::Clone::clone(&self.predicates),
spans: ::core::clone::Clone::clone(&self.spans),
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for InstantiatedPredicates<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"InstantiatedPredicates", "predicates", &self.predicates, "spans",
&&self.spans)
}
}Debug)]
807pub struct InstantiatedPredicates<'tcx> {
808 pub predicates: Vec<Unnormalized<'tcx, Clause<'tcx>>>,
809 pub spans: Vec<Span>,
810}
811
812impl<'tcx> InstantiatedPredicates<'tcx> {
813 pub fn empty() -> InstantiatedPredicates<'tcx> {
814 InstantiatedPredicates { predicates: ::alloc::vec::Vec::new()vec![], spans: ::alloc::vec::Vec::new()vec![] }
815 }
816
817 pub fn is_empty(&self) -> bool {
818 self.predicates.is_empty()
819 }
820
821 pub fn iter(&self) -> <&Self as IntoIterator>::IntoIter {
822 self.into_iter()
823 }
824}
825
826impl<'tcx> IntoIterator for InstantiatedPredicates<'tcx> {
827 type Item = (Unnormalized<'tcx, Clause<'tcx>>, Span);
828
829 type IntoIter = std::iter::Zip<
830 std::vec::IntoIter<Unnormalized<'tcx, Clause<'tcx>>>,
831 std::vec::IntoIter<Span>,
832 >;
833
834 fn into_iter(self) -> Self::IntoIter {
835 if true {
{
match (&self.predicates.len(), &self.spans.len()) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
}
};
};debug_assert_eq!(self.predicates.len(), self.spans.len());
836 std::iter::zip(self.predicates, self.spans)
837 }
838}
839
840impl<'a, 'tcx> IntoIterator for &'a InstantiatedPredicates<'tcx> {
841 type Item = (Unnormalized<'tcx, Clause<'tcx>>, Span);
842
843 type IntoIter = std::iter::Zip<
844 std::iter::Copied<std::slice::Iter<'a, Unnormalized<'tcx, Clause<'tcx>>>>,
845 std::iter::Copied<std::slice::Iter<'a, Span>>,
846 >;
847
848 fn into_iter(self) -> Self::IntoIter {
849 if true {
{
match (&self.predicates.len(), &self.spans.len()) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
}
};
};debug_assert_eq!(self.predicates.len(), self.spans.len());
850 std::iter::zip(self.predicates.iter().copied(), self.spans.iter().copied())
851 }
852}
853
854#[derive(#[automatically_derived]
impl<'tcx> ::core::marker::Copy for ProvisionalHiddenType<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for ProvisionalHiddenType<'tcx> {
#[inline]
fn clone(&self) -> ProvisionalHiddenType<'tcx> {
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<Ty<'tcx>>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for ProvisionalHiddenType<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"ProvisionalHiddenType", "span", &self.span, "ty", &&self.ty)
}
}Debug, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for ProvisionalHiddenType<'tcx> {
fn try_fold_with<__F: ::rustc_middle::ty::FallibleTypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
ProvisionalHiddenType { span: __binding_0, ty: __binding_1 }
=> {
ProvisionalHiddenType {
span: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
ty: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Self {
match self {
ProvisionalHiddenType { span: __binding_0, ty: __binding_1 }
=> {
ProvisionalHiddenType {
span: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder),
ty: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
__folder),
}
}
}
}
}
};TypeFoldable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for ProvisionalHiddenType<'tcx> {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
ProvisionalHiddenType {
span: ref __binding_0, ty: ref __binding_1 } => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_middle::ty::VisitorResult>::output()
}
}
};TypeVisitable, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
ProvisionalHiddenType<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ProvisionalHiddenType {
span: ref __binding_0, ty: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for ProvisionalHiddenType<'tcx>
{
fn encode(&self, __encoder: &mut __E) {
match *self {
ProvisionalHiddenType {
span: ref __binding_0, ty: ref __binding_1 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for ProvisionalHiddenType<'tcx>
{
fn decode(__decoder: &mut __D) -> Self {
ProvisionalHiddenType {
span: ::rustc_serialize::Decodable::decode(__decoder),
ty: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable)]
855pub struct ProvisionalHiddenType<'tcx> {
856 pub span: Span,
870
871 pub ty: Ty<'tcx>,
884}
885
886#[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)]
888pub enum DefiningScopeKind {
889 HirTypeck,
894 MirBorrowck,
895}
896
897impl<'tcx> ProvisionalHiddenType<'tcx> {
898 pub fn new_error(tcx: TyCtxt<'tcx>, guar: ErrorGuaranteed) -> ProvisionalHiddenType<'tcx> {
899 ProvisionalHiddenType { span: DUMMY_SP, ty: Ty::new_error(tcx, guar) }
900 }
901
902 pub fn build_mismatch_error(
903 &self,
904 other: &Self,
905 tcx: TyCtxt<'tcx>,
906 ) -> Result<Diag<'tcx>, ErrorGuaranteed> {
907 (self.ty, other.ty).error_reported()?;
908 let sub_diag = if self.span == other.span {
910 TypeMismatchReason::ConflictType { span: self.span }
911 } else {
912 TypeMismatchReason::PreviousUse { span: self.span }
913 };
914 Ok(tcx.dcx().create_err(OpaqueHiddenTypeMismatch {
915 self_ty: self.ty,
916 other_ty: other.ty,
917 other_span: other.span,
918 sub: sub_diag,
919 }))
920 }
921
922 x;#[instrument(level = "debug", skip(tcx), ret)]
923 pub fn remap_generic_params_to_declaration_params(
924 self,
925 opaque_type_key: OpaqueTypeKey<'tcx>,
926 tcx: TyCtxt<'tcx>,
927 defining_scope_kind: DefiningScopeKind,
928 ) -> DefinitionSiteHiddenType<'tcx> {
929 let OpaqueTypeKey { def_id, args } = opaque_type_key;
930
931 let id_args = GenericArgs::identity_for_item(tcx, def_id);
938 debug!(?id_args);
939
940 let map = args.iter().zip(id_args).collect();
944 debug!("map = {:#?}", map);
945
946 let ty = match defining_scope_kind {
952 DefiningScopeKind::HirTypeck => {
953 fold_regions(tcx, self.ty, |_, _| tcx.lifetimes.re_erased)
954 }
955 DefiningScopeKind::MirBorrowck => self.ty,
956 };
957 let result_ty = ty.fold_with(&mut opaque_types::ReverseMapper::new(tcx, map, self.span));
958 if cfg!(debug_assertions) && matches!(defining_scope_kind, DefiningScopeKind::HirTypeck) {
959 assert_eq!(result_ty, fold_regions(tcx, result_ty, |_, _| tcx.lifetimes.re_erased));
960 }
961 DefinitionSiteHiddenType { span: self.span, ty: ty::EarlyBinder::bind(tcx, result_ty) }
962 }
963}
964
965#[derive(#[automatically_derived]
impl<'tcx> ::core::marker::Copy for DefinitionSiteHiddenType<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for DefinitionSiteHiddenType<'tcx> {
#[inline]
fn clone(&self) -> DefinitionSiteHiddenType<'tcx> {
let _: ::core::clone::AssertParamIsClone<Span>;
let _:
::core::clone::AssertParamIsClone<ty::EarlyBinder<'tcx,
Ty<'tcx>>>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for DefinitionSiteHiddenType<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"DefinitionSiteHiddenType", "span", &self.span, "ty", &&self.ty)
}
}Debug, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
DefinitionSiteHiddenType<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
DefinitionSiteHiddenType {
span: ref __binding_0, ty: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for
DefinitionSiteHiddenType<'tcx> {
fn encode(&self, __encoder: &mut __E) {
match *self {
DefinitionSiteHiddenType {
span: ref __binding_0, ty: ref __binding_1 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for
DefinitionSiteHiddenType<'tcx> {
fn decode(__decoder: &mut __D) -> Self {
DefinitionSiteHiddenType {
span: ::rustc_serialize::Decodable::decode(__decoder),
ty: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable)]
966pub struct DefinitionSiteHiddenType<'tcx> {
967 pub span: Span,
980
981 pub ty: ty::EarlyBinder<'tcx, Ty<'tcx>>,
983}
984
985impl<'tcx> DefinitionSiteHiddenType<'tcx> {
986 pub fn new_error(tcx: TyCtxt<'tcx>, guar: ErrorGuaranteed) -> DefinitionSiteHiddenType<'tcx> {
987 DefinitionSiteHiddenType {
988 span: DUMMY_SP,
989 ty: ty::EarlyBinder::bind(tcx, Ty::new_error(tcx, guar)),
990 }
991 }
992
993 pub fn build_mismatch_error(
994 &self,
995 other: &Self,
996 tcx: TyCtxt<'tcx>,
997 ) -> Result<Diag<'tcx>, ErrorGuaranteed> {
998 let self_ty = self.ty.instantiate_identity().skip_norm_wip();
999 let other_ty = other.ty.instantiate_identity().skip_norm_wip();
1000 (self_ty, other_ty).error_reported()?;
1001 let sub_diag = if self.span == other.span {
1003 TypeMismatchReason::ConflictType { span: self.span }
1004 } else {
1005 TypeMismatchReason::PreviousUse { span: self.span }
1006 };
1007 Ok(tcx.dcx().create_err(OpaqueHiddenTypeMismatch {
1008 self_ty,
1009 other_ty,
1010 other_span: other.span,
1011 sub: sub_diag,
1012 }))
1013 }
1014}
1015
1016pub type Clauses<'tcx> = &'tcx ListWithCachedTypeInfo<Clause<'tcx>>;
1017
1018impl<'tcx> rustc_type_ir::Flags for Clauses<'tcx> {
1019 fn flags(&self) -> TypeFlags {
1020 (**self).flags()
1021 }
1022
1023 fn outer_exclusive_binder(&self) -> DebruijnIndex {
1024 (**self).outer_exclusive_binder()
1025 }
1026}
1027
1028#[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)]
1034#[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)]
1035pub struct ParamEnv<'tcx> {
1036 caller_bounds: Clauses<'tcx>,
1042}
1043
1044impl<'tcx> rustc_type_ir::inherent::ParamEnv<TyCtxt<'tcx>> for ParamEnv<'tcx> {
1045 fn caller_bounds(self) -> impl inherent::SliceLike<Item = ty::Clause<'tcx>> {
1046 self.caller_bounds()
1047 }
1048}
1049
1050impl<'tcx> ParamEnv<'tcx> {
1051 #[inline]
1058 pub fn empty() -> Self {
1059 Self::new(ListWithCachedTypeInfo::empty())
1060 }
1061
1062 #[inline]
1063 pub fn caller_bounds(self) -> Clauses<'tcx> {
1064 self.caller_bounds
1065 }
1066
1067 #[inline]
1069 pub fn new(caller_bounds: Clauses<'tcx>) -> Self {
1070 ParamEnv { caller_bounds }
1071 }
1072
1073 pub fn and<T: TypeVisitable<TyCtxt<'tcx>>>(self, value: T) -> ParamEnvAnd<'tcx, T> {
1075 ParamEnvAnd { param_env: self, value }
1076 }
1077
1078 pub fn with_normalized(self, tcx: TyCtxt<'tcx>) -> ParamEnv<'tcx> {
1080 if tcx.next_trait_solver_globally() {
1083 self
1084 } else {
1085 ParamEnv::new(tcx.reveal_opaque_types_in_bounds(self.caller_bounds))
1086 }
1087 }
1088}
1089
1090#[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)]
1091#[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)]
1092pub struct ParamEnvAnd<'tcx, T> {
1093 pub param_env: ParamEnv<'tcx>,
1094 pub value: T,
1095}
1096
1097#[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)]
1108#[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)]
1109pub struct TypingEnv<'tcx> {
1110 #[type_foldable(identity)]
1111 #[type_visitable(ignore)]
1112 typing_mode: TypingModeEqWrapper<'tcx>,
1113 pub param_env: ParamEnv<'tcx>,
1114}
1115
1116impl<'tcx> TypingEnv<'tcx> {
1117 pub fn new(param_env: ParamEnv<'tcx>, typing_mode: TypingMode<'tcx>) -> Self {
1118 Self { typing_mode: TypingModeEqWrapper(typing_mode), param_env }
1119 }
1120
1121 pub fn typing_mode(&self) -> TypingMode<'tcx> {
1122 self.typing_mode.0
1123 }
1124
1125 pub fn fully_monomorphized() -> TypingEnv<'tcx> {
1133 Self::new(ParamEnv::empty(), TypingMode::Codegen)
1134 }
1135
1136 pub fn non_body_analysis(
1142 tcx: TyCtxt<'tcx>,
1143 def_id: impl IntoQueryKey<DefId>,
1144 ) -> TypingEnv<'tcx> {
1145 let def_id = def_id.into_query_key();
1146 Self::new(tcx.param_env(def_id), TypingMode::non_body_analysis())
1147 }
1148
1149 pub fn post_typeck_until_borrowck_for_mir_build(
1154 tcx: TyCtxt<'tcx>,
1155 def_id: LocalDefId,
1156 ) -> TypingEnv<'tcx> {
1157 if tcx.use_typing_mode_post_typeck_until_borrowck() {
1158 TypingEnv::new(tcx.param_env(def_id.to_def_id()), ty::TypingMode::borrowck(tcx, def_id))
1159 } else {
1160 TypingEnv::non_body_analysis(tcx, def_id)
1163 }
1164 }
1165
1166 pub fn post_analysis(tcx: TyCtxt<'tcx>, def_id: impl IntoQueryKey<DefId>) -> TypingEnv<'tcx> {
1167 TypingEnv::new(tcx.param_env_normalized_for_post_analysis(def_id), TypingMode::PostAnalysis)
1168 }
1169
1170 pub fn codegen(tcx: TyCtxt<'tcx>, def_id: impl IntoQueryKey<DefId>) -> TypingEnv<'tcx> {
1171 TypingEnv::new(tcx.param_env_normalized_for_post_analysis(def_id), TypingMode::Codegen)
1172 }
1173
1174 pub fn with_post_analysis_normalized(self, tcx: TyCtxt<'tcx>) -> TypingEnv<'tcx> {
1177 let TypingEnv { typing_mode, param_env } = self;
1178 match typing_mode.0.assert_not_erased() {
1179 TypingMode::Coherence
1180 | TypingMode::Typeck { .. }
1181 | TypingMode::PostTypeckUntilBorrowck { .. }
1182 | TypingMode::PostBorrowck { .. } => {}
1183 TypingMode::PostAnalysis | TypingMode::Codegen => return self,
1184 }
1185
1186 let param_env = param_env.with_normalized(tcx);
1187 TypingEnv::new(param_env, TypingMode::PostAnalysis)
1188 }
1189
1190 pub fn with_codegen_normalized(self, tcx: TyCtxt<'tcx>) -> TypingEnv<'tcx> {
1193 let TypingEnv { typing_mode, param_env } = self;
1194 match typing_mode.0.assert_not_erased() {
1195 TypingMode::Coherence
1196 | TypingMode::Typeck { .. }
1197 | TypingMode::PostTypeckUntilBorrowck { .. }
1198 | TypingMode::PostBorrowck { .. }
1199 | TypingMode::PostAnalysis => {}
1200 TypingMode::Codegen => return self,
1201 }
1202
1203 let param_env = param_env.with_normalized(tcx);
1204 TypingEnv::new(param_env, TypingMode::Codegen)
1205 }
1206
1207 pub fn as_query_input<T>(self, value: T) -> PseudoCanonicalInput<'tcx, T>
1212 where
1213 T: TypeVisitable<TyCtxt<'tcx>>,
1214 {
1215 PseudoCanonicalInput { typing_env: self, value }
1228 }
1229}
1230
1231#[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)]
1241#[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)]
1242pub struct PseudoCanonicalInput<'tcx, T> {
1243 pub typing_env: TypingEnv<'tcx>,
1244 pub value: T,
1245}
1246
1247#[derive(#[automatically_derived]
impl ::core::marker::Copy for Destructor { }Copy, #[automatically_derived]
impl ::core::clone::Clone for Destructor {
#[inline]
fn clone(&self) -> Destructor {
let _: ::core::clone::AssertParamIsClone<DefId>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for Destructor {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f, "Destructor",
"did", &&self.did)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for Destructor {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Destructor { did: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for Destructor {
fn encode(&self, __encoder: &mut __E) {
match *self {
Destructor { did: ref __binding_0 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for Destructor {
fn decode(__decoder: &mut __D) -> Self {
Destructor {
did: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable)]
1248pub struct Destructor {
1249 pub did: DefId,
1251}
1252
1253#[derive(#[automatically_derived]
impl ::core::marker::Copy for AsyncDestructor { }Copy, #[automatically_derived]
impl ::core::clone::Clone for AsyncDestructor {
#[inline]
fn clone(&self) -> AsyncDestructor {
let _: ::core::clone::AssertParamIsClone<DefId>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for AsyncDestructor {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f,
"AsyncDestructor", "impl_did", &&self.impl_did)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
AsyncDestructor {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
AsyncDestructor { impl_did: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for AsyncDestructor {
fn encode(&self, __encoder: &mut __E) {
match *self {
AsyncDestructor { impl_did: ref __binding_0 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for AsyncDestructor {
fn decode(__decoder: &mut __D) -> Self {
AsyncDestructor {
impl_did: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable)]
1255pub struct AsyncDestructor {
1256 pub impl_did: DefId,
1258}
1259
1260#[derive(#[automatically_derived]
impl ::core::clone::Clone for VariantFlags {
#[inline]
fn clone(&self) -> VariantFlags {
let _: ::core::clone::AssertParamIsClone<u8>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for VariantFlags { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for VariantFlags {
#[inline]
fn eq(&self, other: &VariantFlags) -> bool { self.0 == other.0 }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for VariantFlags {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<u8>;
}
}Eq, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for VariantFlags
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
VariantFlags(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for VariantFlags {
fn encode(&self, __encoder: &mut __E) {
match *self {
VariantFlags(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for VariantFlags {
fn decode(__decoder: &mut __D) -> Self {
VariantFlags(::rustc_serialize::Decodable::decode(__decoder))
}
}
};TyDecodable)]
1261pub struct VariantFlags(u8);
1262impl 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! {
1263 impl VariantFlags: u8 {
1264 const NO_VARIANT_FLAGS = 0;
1265 const IS_FIELD_LIST_NON_EXHAUSTIVE = 1 << 0;
1267 }
1268}
1269impl ::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 }
1270
1271#[derive(#[automatically_derived]
impl ::core::fmt::Debug for VariantDef {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["def_id", "ctor", "name", "discr", "fields", "tainted",
"flags"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.def_id, &self.ctor, &self.name, &self.discr, &self.fields,
&self.tainted, &&self.flags];
::core::fmt::Formatter::debug_struct_fields_finish(f, "VariantDef",
names, values)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for VariantDef {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
VariantDef {
def_id: ref __binding_0,
ctor: ref __binding_1,
name: ref __binding_2,
discr: ref __binding_3,
fields: ref __binding_4,
tainted: ref __binding_5,
flags: ref __binding_6 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
{ __binding_6.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for VariantDef {
fn encode(&self, __encoder: &mut __E) {
match *self {
VariantDef {
def_id: ref __binding_0,
ctor: ref __binding_1,
name: ref __binding_2,
discr: ref __binding_3,
fields: ref __binding_4,
tainted: ref __binding_5,
flags: ref __binding_6 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_2,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_3,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_4,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_5,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_6,
__encoder);
}
}
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for VariantDef {
fn decode(__decoder: &mut __D) -> Self {
VariantDef {
def_id: ::rustc_serialize::Decodable::decode(__decoder),
ctor: ::rustc_serialize::Decodable::decode(__decoder),
name: ::rustc_serialize::Decodable::decode(__decoder),
discr: ::rustc_serialize::Decodable::decode(__decoder),
fields: ::rustc_serialize::Decodable::decode(__decoder),
tainted: ::rustc_serialize::Decodable::decode(__decoder),
flags: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable)]
1273pub struct VariantDef {
1274 pub def_id: DefId,
1277 pub ctor: Option<(CtorKind, DefId)>,
1280 pub name: Symbol,
1282 pub discr: VariantDiscr,
1284 pub fields: IndexVec<FieldIdx, FieldDef>,
1286 tainted: Option<ErrorGuaranteed>,
1288 flags: VariantFlags,
1290}
1291
1292impl VariantDef {
1293 #[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(1309u32),
::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")]
1310 pub fn new(
1311 name: Symbol,
1312 variant_did: Option<DefId>,
1313 ctor: Option<(CtorKind, DefId)>,
1314 discr: VariantDiscr,
1315 fields: IndexVec<FieldIdx, FieldDef>,
1316 parent_did: DefId,
1317 recover_tainted: Option<ErrorGuaranteed>,
1318 is_field_list_non_exhaustive: bool,
1319 ) -> Self {
1320 let mut flags = VariantFlags::NO_VARIANT_FLAGS;
1321 if is_field_list_non_exhaustive {
1322 flags |= VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE;
1323 }
1324
1325 VariantDef {
1326 def_id: variant_did.unwrap_or(parent_did),
1327 ctor,
1328 name,
1329 discr,
1330 fields,
1331 flags,
1332 tainted: recover_tainted,
1333 }
1334 }
1335
1336 #[inline]
1342 pub fn is_field_list_non_exhaustive(&self) -> bool {
1343 self.flags.intersects(VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE)
1344 }
1345
1346 #[inline]
1349 pub fn field_list_has_applicable_non_exhaustive(&self) -> bool {
1350 self.is_field_list_non_exhaustive() && !self.def_id.is_local()
1351 }
1352
1353 pub fn ident(&self, tcx: TyCtxt<'_>) -> Ident {
1355 Ident::new(self.name, tcx.def_ident_span(self.def_id).unwrap())
1356 }
1357
1358 #[inline]
1360 pub fn has_errors(&self) -> Result<(), ErrorGuaranteed> {
1361 self.tainted.map_or(Ok(()), Err)
1362 }
1363
1364 #[inline]
1365 pub fn ctor_kind(&self) -> Option<CtorKind> {
1366 self.ctor.map(|(kind, _)| kind)
1367 }
1368
1369 #[inline]
1370 pub fn ctor_def_id(&self) -> Option<DefId> {
1371 self.ctor.map(|(_, def_id)| def_id)
1372 }
1373
1374 #[inline]
1378 pub fn single_field(&self) -> &FieldDef {
1379 if !(self.fields.len() == 1) {
::core::panicking::panic("assertion failed: self.fields.len() == 1")
};assert!(self.fields.len() == 1);
1380
1381 &self.fields[FieldIdx::ZERO]
1382 }
1383
1384 #[inline]
1386 pub fn tail_opt(&self) -> Option<&FieldDef> {
1387 self.fields.raw.last()
1388 }
1389
1390 #[inline]
1396 pub fn tail(&self) -> &FieldDef {
1397 self.tail_opt().expect("expected unsized ADT to have a tail field")
1398 }
1399
1400 pub fn has_unsafe_fields(&self) -> bool {
1402 self.fields.iter().any(|x| x.safety.is_unsafe())
1403 }
1404}
1405
1406impl PartialEq for VariantDef {
1407 #[inline]
1408 fn eq(&self, other: &Self) -> bool {
1409 let Self {
1417 def_id: lhs_def_id,
1418 ctor: _,
1419 name: _,
1420 discr: _,
1421 fields: _,
1422 flags: _,
1423 tainted: _,
1424 } = &self;
1425 let Self {
1426 def_id: rhs_def_id,
1427 ctor: _,
1428 name: _,
1429 discr: _,
1430 fields: _,
1431 flags: _,
1432 tainted: _,
1433 } = other;
1434
1435 let res = lhs_def_id == rhs_def_id;
1436
1437 if truecfg!(debug_assertions) && res {
1439 let deep = self.ctor == other.ctor
1440 && self.name == other.name
1441 && self.discr == other.discr
1442 && self.fields == other.fields
1443 && self.flags == other.flags;
1444 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");
1445 }
1446
1447 res
1448 }
1449}
1450
1451impl Eq for VariantDef {}
1452
1453impl Hash for VariantDef {
1454 #[inline]
1455 fn hash<H: Hasher>(&self, s: &mut H) {
1456 let Self { def_id, ctor: _, name: _, discr: _, fields: _, flags: _, tainted: _ } = &self;
1464 def_id.hash(s)
1465 }
1466}
1467
1468#[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)]
1469pub enum VariantDiscr {
1470 Explicit(DefId),
1473
1474 Relative(u32),
1479}
1480
1481#[derive(#[automatically_derived]
impl ::core::fmt::Debug for FieldDef {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f, "FieldDef",
"did", &self.did, "name", &self.name, "vis", &self.vis, "safety",
&self.safety, "value", &&self.value)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for FieldDef {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
FieldDef {
did: ref __binding_0,
name: ref __binding_1,
vis: ref __binding_2,
safety: ref __binding_3,
value: ref __binding_4 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for FieldDef {
fn encode(&self, __encoder: &mut __E) {
match *self {
FieldDef {
did: ref __binding_0,
name: ref __binding_1,
vis: ref __binding_2,
safety: ref __binding_3,
value: ref __binding_4 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_2,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_3,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_4,
__encoder);
}
}
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for FieldDef {
fn decode(__decoder: &mut __D) -> Self {
FieldDef {
did: ::rustc_serialize::Decodable::decode(__decoder),
name: ::rustc_serialize::Decodable::decode(__decoder),
vis: ::rustc_serialize::Decodable::decode(__decoder),
safety: ::rustc_serialize::Decodable::decode(__decoder),
value: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable)]
1482pub struct FieldDef {
1483 pub did: DefId,
1484 pub name: Symbol,
1485 pub vis: Visibility<ModId>,
1486 pub safety: hir::Safety,
1487 pub value: Option<DefId>,
1488}
1489
1490impl PartialEq for FieldDef {
1491 #[inline]
1492 fn eq(&self, other: &Self) -> bool {
1493 let Self { did: lhs_did, name: _, vis: _, safety: _, value: _ } = &self;
1501
1502 let Self { did: rhs_did, name: _, vis: _, safety: _, value: _ } = other;
1503
1504 let res = lhs_did == rhs_did;
1505
1506 if truecfg!(debug_assertions) && res {
1508 let deep =
1509 self.name == other.name && self.vis == other.vis && self.safety == other.safety;
1510 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");
1511 }
1512
1513 res
1514 }
1515}
1516
1517impl Eq for FieldDef {}
1518
1519impl Hash for FieldDef {
1520 #[inline]
1521 fn hash<H: Hasher>(&self, s: &mut H) {
1522 let Self { did, name: _, vis: _, safety: _, value: _ } = &self;
1530
1531 did.hash(s)
1532 }
1533}
1534
1535impl<'tcx> FieldDef {
1536 pub fn ty(
1539 &self,
1540 tcx: TyCtxt<'tcx>,
1541 args: GenericArgsRef<'tcx>,
1542 ) -> Unnormalized<'tcx, Ty<'tcx>> {
1543 tcx.type_of(self.did).instantiate(tcx, args)
1544 }
1545
1546 pub fn ident(&self, tcx: TyCtxt<'_>) -> Ident {
1548 Ident::new(self.name, tcx.def_ident_span(self.did).unwrap())
1549 }
1550}
1551
1552#[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)]
1553pub enum ImplOverlapKind {
1554 Permitted {
1556 marker: bool,
1558 },
1559}
1560
1561#[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)]
1564pub enum ImplTraitInTraitData {
1565 Trait { fn_def_id: DefId, opaque_def_id: DefId },
1566 Impl { fn_def_id: DefId },
1567}
1568
1569impl<'tcx> TyCtxt<'tcx> {
1570 pub fn typeck_body(self, body: hir::BodyId) -> &'tcx TypeckResults<'tcx> {
1571 self.typeck(self.hir_body_owner_def_id(body))
1572 }
1573
1574 pub fn provided_trait_methods(self, id: DefId) -> impl 'tcx + Iterator<Item = &'tcx AssocItem> {
1575 self.associated_items(id)
1576 .in_definition_order()
1577 .filter(move |item| item.is_fn() && item.defaultness(self).has_value())
1578 }
1579
1580 pub fn repr_options_of_def(self, did: LocalDefId) -> ReprOptions {
1581 let mut flags = ReprFlags::empty();
1582 let mut size = None;
1583 let mut max_align: Option<Align> = None;
1584 let mut min_pack: Option<Align> = None;
1585
1586 let mut field_shuffle_seed = self.def_path_hash(did.to_def_id()).0.to_smaller_hash();
1589
1590 if let Some(user_seed) = self.sess.opts.unstable_opts.layout_seed {
1594 field_shuffle_seed ^= user_seed;
1595 }
1596
1597 let elt = {
{
'done:
{
for i in ::rustc_hir::attrs::HasAttrs::get_attrs(did, &self) {
#[allow(unused_imports)]
use rustc_hir::attrs::AttributeKind::*;
let i: &rustc_hir::Attribute = i;
match i {
rustc_hir::Attribute::Parsed(RustcScalableVector {
element_count }) => {
break 'done Some(element_count);
}
rustc_hir::Attribute::Unparsed(..) =>
{}
#[deny(unreachable_patterns)]
_ => {}
}
}
None
}
}
}find_attr!(self, did, RustcScalableVector { element_count } => element_count
1598 )
1599 .map(|elt| match elt {
1600 Some(n) => ScalableElt::ElementCount(*n),
1601 None => ScalableElt::Container,
1602 });
1603 if elt.is_some() {
1604 flags.insert(ReprFlags::IS_SCALABLE);
1605 }
1606 if let Some(reprs) = {
{
'done:
{
for i in ::rustc_hir::attrs::HasAttrs::get_attrs(did, &self) {
#[allow(unused_imports)]
use rustc_hir::attrs::AttributeKind::*;
let i: &rustc_hir::Attribute = i;
match i {
rustc_hir::Attribute::Parsed(Repr { reprs, .. }) => {
break 'done Some(reprs);
}
rustc_hir::Attribute::Unparsed(..) =>
{}
#[deny(unreachable_patterns)]
_ => {}
}
}
None
}
}
}find_attr!(self, did, Repr { reprs, .. } => reprs) {
1607 for (r, _) in reprs {
1608 flags.insert(match *r {
1609 attr::ReprRust => ReprFlags::empty(),
1610 attr::ReprC => ReprFlags::IS_C,
1611 attr::ReprPacked(pack) => {
1612 min_pack = Some(if let Some(min_pack) = min_pack {
1613 min_pack.min(pack)
1614 } else {
1615 pack
1616 });
1617 ReprFlags::empty()
1618 }
1619 attr::ReprTransparent => ReprFlags::IS_TRANSPARENT,
1620 attr::ReprSimd => ReprFlags::IS_SIMD,
1621 attr::ReprInt(i) => {
1622 size = Some(match i {
1623 attr::IntType::SignedInt(x) => match x {
1624 ast::IntTy::Isize => IntegerType::Pointer(true),
1625 ast::IntTy::I8 => IntegerType::Fixed(Integer::I8, true),
1626 ast::IntTy::I16 => IntegerType::Fixed(Integer::I16, true),
1627 ast::IntTy::I32 => IntegerType::Fixed(Integer::I32, true),
1628 ast::IntTy::I64 => IntegerType::Fixed(Integer::I64, true),
1629 ast::IntTy::I128 => IntegerType::Fixed(Integer::I128, true),
1630 },
1631 attr::IntType::UnsignedInt(x) => match x {
1632 ast::UintTy::Usize => IntegerType::Pointer(false),
1633 ast::UintTy::U8 => IntegerType::Fixed(Integer::I8, false),
1634 ast::UintTy::U16 => IntegerType::Fixed(Integer::I16, false),
1635 ast::UintTy::U32 => IntegerType::Fixed(Integer::I32, false),
1636 ast::UintTy::U64 => IntegerType::Fixed(Integer::I64, false),
1637 ast::UintTy::U128 => IntegerType::Fixed(Integer::I128, false),
1638 },
1639 });
1640 ReprFlags::empty()
1641 }
1642 attr::ReprAlign(align) => {
1643 max_align = max_align.max(Some(align));
1644 ReprFlags::empty()
1645 }
1646 });
1647 }
1648 }
1649
1650 if self.sess.opts.unstable_opts.randomize_layout {
1653 flags.insert(ReprFlags::RANDOMIZE_LAYOUT);
1654 }
1655
1656 let is_box = self.is_lang_item(did.to_def_id(), LangItem::OwnedBox);
1659
1660 if is_box {
1662 flags.insert(ReprFlags::IS_LINEAR);
1663 }
1664
1665 if {
{
'done:
{
for i in ::rustc_hir::attrs::HasAttrs::get_attrs(did, &self) {
#[allow(unused_imports)]
use rustc_hir::attrs::AttributeKind::*;
let i: &rustc_hir::Attribute = i;
match i {
rustc_hir::Attribute::Parsed(RustcPassIndirectlyInNonRusticAbis(..))
=> {
break 'done Some(());
}
rustc_hir::Attribute::Unparsed(..) =>
{}
#[deny(unreachable_patterns)]
_ => {}
}
}
None
}
}
}.is_some()find_attr!(self, did, RustcPassIndirectlyInNonRusticAbis(..)) {
1667 flags.insert(ReprFlags::PASS_INDIRECTLY_IN_NON_RUSTIC_ABIS);
1668 }
1669
1670 ReprOptions {
1671 int: size,
1672 align: max_align,
1673 pack: min_pack,
1674 flags,
1675 field_shuffle_seed,
1676 scalable: elt,
1677 }
1678 }
1679
1680 pub fn opt_item_name(self, def_id: impl IntoQueryKey<DefId>) -> Option<Symbol> {
1682 let def_id = def_id.into_query_key();
1683 if let Some(cnum) = def_id.as_crate_root() {
1684 Some(self.crate_name(cnum))
1685 } else {
1686 let def_key = self.def_key(def_id);
1687 match def_key.disambiguated_data.data {
1688 rustc_hir::definitions::DefPathData::Ctor => self
1690 .opt_item_name(DefId { krate: def_id.krate, index: def_key.parent.unwrap() }),
1691 _ => def_key.get_opt_name(),
1692 }
1693 }
1694 }
1695
1696 pub fn item_name(self, id: impl IntoQueryKey<DefId>) -> Symbol {
1703 let id = id.into_query_key();
1704 self.opt_item_name(id).unwrap_or_else(|| {
1705 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));
1706 })
1707 }
1708
1709 pub fn opt_item_ident(self, def_id: impl IntoQueryKey<DefId>) -> Option<Ident> {
1713 let def_id = def_id.into_query_key();
1714 let def = self.opt_item_name(def_id)?;
1715 let span = self
1716 .def_ident_span(def_id)
1717 .unwrap_or_else(|| crate::util::bug::bug_fmt(format_args!("missing ident span for {0:?}",
def_id))bug!("missing ident span for {def_id:?}"));
1718 Some(Ident::new(def, span))
1719 }
1720
1721 pub fn item_ident(self, def_id: impl IntoQueryKey<DefId>) -> Ident {
1725 let def_id = def_id.into_query_key();
1726 self.opt_item_ident(def_id).unwrap_or_else(|| {
1727 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));
1728 })
1729 }
1730
1731 pub fn opt_associated_item(self, def_id: DefId) -> Option<AssocItem> {
1732 if let DefKind::AssocConst { .. } | DefKind::AssocFn | DefKind::AssocTy =
1733 self.def_kind(def_id)
1734 {
1735 Some(self.associated_item(def_id))
1736 } else {
1737 None
1738 }
1739 }
1740
1741 pub fn opt_rpitit_info(self, def_id: DefId) -> Option<ImplTraitInTraitData> {
1745 if let DefKind::AssocTy = self.def_kind(def_id)
1746 && let AssocKind::Type { data: AssocTypeData::Rpitit(rpitit_info) } =
1747 self.associated_item(def_id).kind
1748 {
1749 Some(rpitit_info)
1750 } else {
1751 None
1752 }
1753 }
1754
1755 pub fn find_field_index(self, ident: Ident, variant: &VariantDef) -> Option<FieldIdx> {
1756 variant.fields.iter_enumerated().find_map(|(i, field)| {
1757 self.hygienic_eq(ident, field.ident(self), variant.def_id).then_some(i)
1758 })
1759 }
1760
1761 x;#[instrument(level = "debug", skip(self), ret)]
1764 pub fn impls_are_allowed_to_overlap(
1765 self,
1766 def_id1: DefId,
1767 def_id2: DefId,
1768 ) -> Option<ImplOverlapKind> {
1769 let impl1 = self.impl_trait_header(def_id1);
1770 let impl2 = self.impl_trait_header(def_id2);
1771
1772 let trait_ref1 = impl1.trait_ref.skip_binder();
1773 let trait_ref2 = impl2.trait_ref.skip_binder();
1774
1775 if trait_ref1.references_error() || trait_ref2.references_error() {
1778 return Some(ImplOverlapKind::Permitted { marker: false });
1779 }
1780
1781 match (impl1.polarity, impl2.polarity) {
1782 (ImplPolarity::Reservation, _) | (_, ImplPolarity::Reservation) => {
1783 return Some(ImplOverlapKind::Permitted { marker: false });
1785 }
1786 (ImplPolarity::Positive, ImplPolarity::Negative)
1787 | (ImplPolarity::Negative, ImplPolarity::Positive) => {
1788 return None;
1790 }
1791 (ImplPolarity::Positive, ImplPolarity::Positive)
1792 | (ImplPolarity::Negative, ImplPolarity::Negative) => {}
1793 };
1794
1795 let is_marker_impl = |trait_ref: TraitRef<'_>| self.trait_def(trait_ref.def_id).is_marker;
1796 let is_marker_overlap = is_marker_impl(trait_ref1) && is_marker_impl(trait_ref2);
1797
1798 if is_marker_overlap {
1799 return Some(ImplOverlapKind::Permitted { marker: true });
1800 }
1801
1802 None
1803 }
1804
1805 pub fn expect_variant_res(self, res: Res) -> &'tcx VariantDef {
1808 match res {
1809 Res::Def(DefKind::Variant, did) => {
1810 let enum_did = self.parent(did);
1811 self.adt_def(enum_did).variant_with_id(did)
1812 }
1813 Res::Def(DefKind::Struct | DefKind::Union, did) => self.adt_def(did).non_enum_variant(),
1814 Res::Def(DefKind::Ctor(CtorOf::Variant, ..), variant_ctor_did) => {
1815 let variant_did = self.parent(variant_ctor_did);
1816 let enum_did = self.parent(variant_did);
1817 self.adt_def(enum_did).variant_with_ctor_id(variant_ctor_did)
1818 }
1819 Res::Def(DefKind::Ctor(CtorOf::Struct, ..), ctor_did) => {
1820 let struct_did = self.parent(ctor_did);
1821 self.adt_def(struct_did).non_enum_variant()
1822 }
1823 _ => 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),
1824 }
1825 }
1826
1827 #[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(1828u32),
::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:1832",
"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(1832u32),
::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:1834",
"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(1834u32),
::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")]
1829 pub fn instance_mir(self, instance: ty::InstanceKind<'tcx>) -> &'tcx Body<'tcx> {
1830 let body = match instance {
1831 ty::InstanceKind::Item(def) => {
1832 debug!("calling def_kind on def: {:?}", def);
1833 let def_kind = self.def_kind(def);
1834 debug!("returned from def_kind: {:?}", def_kind);
1835 match def_kind {
1836 DefKind::Const { .. }
1837 | DefKind::Static { .. }
1838 | DefKind::AssocConst { .. }
1839 | DefKind::Ctor(..)
1840 | DefKind::AnonConst => self.mir_for_ctfe(def),
1841 DefKind::Fn | DefKind::AssocFn
1842 if matches!(
1843 self.constness(def),
1844 hir::Constness::Const { always: true }
1845 ) =>
1846 {
1847 self.mir_for_ctfe(def)
1848 }
1849 _ => self.optimized_mir(def),
1852 }
1853 }
1854 ty::InstanceKind::Intrinsic(..) | ty::InstanceKind::LlvmIntrinsic(..) => {
1855 bug!("intrinsics have no instance MIR")
1856 }
1857 ty::InstanceKind::Virtual(..) => bug!("virtual dispatches have no instance MIR"),
1858 ty::InstanceKind::Shim(shim) => self.mir_shims(shim),
1859 };
1860
1861 assert!(
1862 matches!(body.phase, MirPhase::Runtime(_)),
1863 "body: {body:?} instance: {instance:?} {:?}",
1864 if let ty::InstanceKind::Item(d) = instance { Some(self.def_kind(d)) } else { None },
1865 );
1866
1867 body
1868 }
1869
1870 #[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."]
1872 pub fn get_attrs(
1873 self,
1874 did: impl Into<DefId>,
1875 attr: Symbol,
1876 ) -> impl Iterator<Item = &'tcx hir::Attribute> {
1877 #[allow(deprecated)]
1878 self.get_all_attrs(did).iter().filter(move |a: &&hir::Attribute| a.has_name(attr))
1879 }
1880
1881 #[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."]
1886 pub fn get_all_attrs(self, did: impl Into<DefId>) -> &'tcx [hir::Attribute] {
1887 let did: DefId = did.into();
1888 if let Some(did) = did.as_local() {
1889 self.hir_attrs(self.local_def_id_to_hir_id(did))
1890 } else {
1891 self.attrs_for_def(did)
1892 }
1893 }
1894
1895 pub fn get_attrs_by_path(
1896 self,
1897 did: DefId,
1898 attr: &[Symbol],
1899 ) -> impl Iterator<Item = &'tcx hir::Attribute> {
1900 let filter_fn = move |a: &&hir::Attribute| a.path_matches(attr);
1901 if let Some(did) = did.as_local() {
1902 self.hir_attrs(self.local_def_id_to_hir_id(did)).iter().filter(filter_fn)
1903 } else {
1904 self.attrs_for_def(did).iter().filter(filter_fn)
1905 }
1906 }
1907
1908 pub fn trait_is_auto(self, trait_def_id: DefId) -> bool {
1910 self.trait_def(trait_def_id).has_auto_impl
1911 }
1912
1913 pub fn trait_is_coinductive(self, trait_def_id: DefId) -> bool {
1916 self.trait_def(trait_def_id).is_coinductive
1917 }
1918
1919 pub fn trait_is_alias(self, trait_def_id: DefId) -> bool {
1921 self.def_kind(trait_def_id) == DefKind::TraitAlias
1922 }
1923
1924 fn layout_error(self, err: LayoutError<'tcx>) -> &'tcx LayoutError<'tcx> {
1926 self.arena.alloc(err)
1927 }
1928
1929 fn ordinary_coroutine_layout(
1935 self,
1936 def_id: DefId,
1937 args: GenericArgsRef<'tcx>,
1938 ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1939 let coroutine_kind_ty = args.as_coroutine().kind_ty();
1940 let mir = self.optimized_mir(def_id);
1941 let ty = || Ty::new_coroutine(self, def_id, args);
1942 if coroutine_kind_ty.is_unit() {
1944 mir.coroutine_layout_raw().ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1945 } else {
1946 let ty::Coroutine(_, identity_args) =
1949 *self.type_of(def_id).instantiate_identity().skip_norm_wip().kind()
1950 else {
1951 ::core::panicking::panic("internal error: entered unreachable code");unreachable!();
1952 };
1953 let identity_kind_ty = identity_args.as_coroutine().kind_ty();
1954 if identity_kind_ty == coroutine_kind_ty {
1957 mir.coroutine_layout_raw()
1958 .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1959 } else {
1960 {
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));
1961 {
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!(
1962 identity_kind_ty.to_opt_closure_kind(),
1963 Some(ClosureKind::Fn | ClosureKind::FnMut)
1964 );
1965 self.optimized_mir(self.coroutine_by_move_body_def_id(def_id))
1966 .coroutine_layout_raw()
1967 .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1968 }
1969 }
1970 }
1971
1972 fn async_drop_coroutine_layout(
1976 self,
1977 def_id: DefId,
1978 args: GenericArgsRef<'tcx>,
1979 ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1980 let ty = || Ty::new_coroutine(self, def_id, args);
1981 if args[0].has_placeholders() || args[0].has_non_region_param() {
1982 return Err(self.layout_error(LayoutError::TooGeneric(ty())));
1983 }
1984 let instance = ShimKind::AsyncDropGlue(def_id, Ty::new_coroutine(self, def_id, args));
1985 self.mir_shims(instance)
1986 .coroutine_layout_raw()
1987 .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1988 }
1989
1990 pub fn coroutine_layout(
1993 self,
1994 def_id: DefId,
1995 args: GenericArgsRef<'tcx>,
1996 ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1997 if self.is_async_drop_in_place_coroutine(def_id) {
1998 let arg_cor_ty = args.first().unwrap().expect_ty();
2002 if arg_cor_ty.is_coroutine() {
2003 let span = self.def_span(def_id);
2004 let source_info = SourceInfo::outermost(span);
2005 let variant_fields: IndexVec<VariantIdx, IndexVec<FieldIdx, CoroutineSavedLocal>> =
2008 iter::repeat(IndexVec::new()).take(CoroutineArgs::RESERVED_VARIANTS).collect();
2009 let variant_source_info: IndexVec<VariantIdx, SourceInfo> =
2010 iter::repeat(source_info).take(CoroutineArgs::RESERVED_VARIANTS).collect();
2011 let proxy_layout = CoroutineLayout {
2012 field_tys: [].into(),
2013 variant_fields,
2014 variant_source_info,
2015 storage_conflicts: BitMatrix::new(0, 0),
2016 };
2017 return Ok(self.arena.alloc(proxy_layout));
2018 } else {
2019 self.async_drop_coroutine_layout(def_id, args)
2020 }
2021 } else {
2022 self.ordinary_coroutine_layout(def_id, args)
2023 }
2024 }
2025
2026 pub fn assoc_parent(self, def_id: DefId) -> Option<(DefId, DefKind)> {
2028 if !self.def_kind(def_id).is_assoc() {
2029 return None;
2030 }
2031 let parent = self.parent(def_id);
2032 let def_kind = self.def_kind(parent);
2033 Some((parent, def_kind))
2034 }
2035
2036 pub fn trait_item_of(self, def_id: impl IntoQueryKey<DefId>) -> Option<DefId> {
2038 let def_id = def_id.into_query_key();
2039 self.opt_associated_item(def_id)?.trait_item_def_id()
2040 }
2041
2042 pub fn trait_of_assoc(self, def_id: DefId) -> Option<DefId> {
2045 match self.assoc_parent(def_id) {
2046 Some((id, DefKind::Trait)) => Some(id),
2047 _ => None,
2048 }
2049 }
2050
2051 pub fn impl_is_of_trait(self, def_id: impl IntoQueryKey<DefId>) -> bool {
2052 let def_id = def_id.into_query_key();
2053 let DefKind::Impl { of_trait } = self.def_kind(def_id) else {
2054 {
::core::panicking::panic_fmt(format_args!("expected Impl for {0:?}",
def_id));
};panic!("expected Impl for {def_id:?}");
2055 };
2056 of_trait
2057 }
2058
2059 pub fn impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
2062 match self.assoc_parent(def_id) {
2063 Some((id, DefKind::Impl { .. })) => Some(id),
2064 _ => None,
2065 }
2066 }
2067
2068 pub fn inherent_impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
2071 match self.assoc_parent(def_id) {
2072 Some((id, DefKind::Impl { of_trait: false })) => Some(id),
2073 _ => None,
2074 }
2075 }
2076
2077 pub fn trait_impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
2080 match self.assoc_parent(def_id) {
2081 Some((id, DefKind::Impl { of_trait: true })) => Some(id),
2082 _ => None,
2083 }
2084 }
2085
2086 pub fn impl_polarity(self, def_id: impl IntoQueryKey<DefId>) -> ty::ImplPolarity {
2087 let def_id = def_id.into_query_key();
2088 self.impl_trait_header(def_id).polarity
2089 }
2090
2091 pub fn impl_trait_ref(
2093 self,
2094 def_id: impl IntoQueryKey<DefId>,
2095 ) -> ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>> {
2096 let def_id = def_id.into_query_key();
2097 self.impl_trait_header(def_id).trait_ref
2098 }
2099
2100 pub fn impl_opt_trait_ref(
2103 self,
2104 def_id: impl IntoQueryKey<DefId>,
2105 ) -> Option<ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>>> {
2106 let def_id = def_id.into_query_key();
2107 self.impl_is_of_trait(def_id).then(|| self.impl_trait_ref(def_id))
2108 }
2109
2110 pub fn impl_trait_id(self, def_id: impl IntoQueryKey<DefId>) -> DefId {
2112 let def_id = def_id.into_query_key();
2113 self.impl_trait_ref(def_id).skip_binder().def_id
2114 }
2115
2116 pub fn impl_opt_trait_id(self, def_id: impl IntoQueryKey<DefId>) -> Option<DefId> {
2119 let def_id = def_id.into_query_key();
2120 self.impl_is_of_trait(def_id).then(|| self.impl_trait_id(def_id))
2121 }
2122
2123 pub fn is_exportable(self, def_id: DefId) -> bool {
2124 self.exportable_items(def_id.krate).contains(&def_id)
2125 }
2126
2127 pub fn is_builtin_derived(self, def_id: DefId) -> bool {
2130 if self.is_automatically_derived(def_id)
2131 && let Some(def_id) = def_id.as_local()
2132 && let outer = self.def_span(def_id).ctxt().outer_expn_data()
2133 && #[allow(non_exhaustive_omitted_patterns)] match outer.kind {
ExpnKind::Macro(MacroKind::Derive, _) => true,
_ => false,
}matches!(outer.kind, ExpnKind::Macro(MacroKind::Derive, _))
2134 && {
{
'done:
{
for i in
::rustc_hir::attrs::HasAttrs::get_attrs(outer.macro_def_id.unwrap(),
&self) {
#[allow(unused_imports)]
use rustc_hir::attrs::AttributeKind::*;
let i: &rustc_hir::Attribute = i;
match i {
rustc_hir::Attribute::Parsed(RustcBuiltinMacro { .. }) => {
break 'done Some(());
}
rustc_hir::Attribute::Unparsed(..) =>
{}
#[deny(unreachable_patterns)]
_ => {}
}
}
None
}
}
}.is_some()find_attr!(self, outer.macro_def_id.unwrap(), RustcBuiltinMacro { .. })
2135 {
2136 true
2137 } else {
2138 false
2139 }
2140 }
2141
2142 pub fn is_automatically_derived(self, def_id: DefId) -> bool {
2144 {
{
'done:
{
for i in
::rustc_hir::attrs::HasAttrs::get_attrs(def_id, &self) {
#[allow(unused_imports)]
use rustc_hir::attrs::AttributeKind::*;
let i: &rustc_hir::Attribute = i;
match i {
rustc_hir::Attribute::Parsed(AutomaticallyDerived) => {
break 'done Some(());
}
rustc_hir::Attribute::Unparsed(..) =>
{}
#[deny(unreachable_patterns)]
_ => {}
}
}
None
}
}
}.is_some()find_attr!(self, def_id, AutomaticallyDerived)
2145 }
2146
2147 pub fn span_of_impl(self, impl_def_id: DefId) -> Result<Span, Symbol> {
2150 if let Some(impl_def_id) = impl_def_id.as_local() {
2151 Ok(self.def_span(impl_def_id))
2152 } else {
2153 Err(self.crate_name(impl_def_id.krate))
2154 }
2155 }
2156
2157 pub fn hygienic_eq(self, use_ident: Ident, def_ident: Ident, def_parent_def_id: DefId) -> bool {
2161 use_ident.name == def_ident.name
2165 && use_ident
2166 .span
2167 .ctxt()
2168 .hygienic_eq(def_ident.span.ctxt(), self.expn_that_defined(def_parent_def_id))
2169 }
2170
2171 pub fn adjust_ident(self, mut ident: Ident, scope: DefId) -> Ident {
2172 ident.span.normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope));
2173 ident
2174 }
2175
2176 pub fn adjust_ident_and_get_scope(
2177 self,
2178 mut ident: Ident,
2179 scope: DefId,
2180 item_id: LocalDefId,
2181 ) -> (Ident, ModId) {
2182 let scope = ident
2183 .span
2184 .normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope))
2185 .and_then(|actual_expansion| actual_expansion.expn_data().parent_module)
2186 .unwrap_or_else(|| self.parent_module_from_def_id(item_id).to_mod_id());
2187 (ident, scope)
2188 }
2189
2190 #[inline]
2194 pub fn is_const_fn(self, def_id: impl IntoQueryKey<DefId>) -> bool {
2195 let def_id = def_id.into_query_key();
2196 #[allow(non_exhaustive_omitted_patterns)] match self.def_kind(def_id) {
DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(_, CtorKind::Fn) |
DefKind::Closure => true,
_ => false,
}matches!(
2197 self.def_kind(def_id),
2198 DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(_, CtorKind::Fn) | DefKind::Closure
2199 ) && #[allow(non_exhaustive_omitted_patterns)] match self.constness(def_id) {
hir::Constness::Const { .. } => true,
_ => false,
}matches!(self.constness(def_id), hir::Constness::Const { .. })
2200 }
2201
2202 pub fn is_conditionally_const(self, def_id: impl Into<DefId>) -> bool {
2209 let def_id: DefId = def_id.into();
2210 match self.def_kind(def_id) {
2211 DefKind::Impl { of_trait: true } => {
2212 let header = self.impl_trait_header(def_id);
2213 #[allow(non_exhaustive_omitted_patterns)] match header.constness {
hir::Constness::Const { always: false } => true,
_ => false,
}matches!(header.constness, hir::Constness::Const { always: false })
2214 && self.is_const_trait(header.trait_ref.skip_binder().def_id)
2215 }
2216 DefKind::Impl { of_trait: false } => {
2217 #[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 })
2218 }
2219 DefKind::Fn | DefKind::Ctor(_, CtorKind::Fn) => {
2220 #[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 })
2221 }
2222 DefKind::TraitAlias | DefKind::Trait => self.is_const_trait(def_id),
2223 DefKind::AssocTy => {
2224 let parent_def_id = self.parent(def_id);
2225 match self.def_kind(parent_def_id) {
2226 DefKind::Impl { of_trait: false } => false,
2227 DefKind::Impl { of_trait: true } | DefKind::Trait => {
2228 self.is_conditionally_const(parent_def_id)
2229 }
2230 _ => 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:?}"),
2231 }
2232 }
2233 DefKind::AssocFn => {
2234 let parent_def_id = self.parent(def_id);
2235 match self.def_kind(parent_def_id) {
2236 DefKind::Impl { of_trait: false } => {
2237 #[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 })
2238 }
2239 DefKind::Impl { of_trait: true } => {
2240 let Some(trait_method_did) = self.trait_item_of(def_id) else {
2241 return false;
2242 };
2243 #[allow(non_exhaustive_omitted_patterns)] match self.constness(trait_method_did)
{
hir::Constness::Const { always: false } => true,
_ => false,
}matches!(
2244 self.constness(trait_method_did),
2245 hir::Constness::Const { always: false }
2246 ) && self.is_conditionally_const(parent_def_id)
2247 }
2248 DefKind::Trait => {
2249 #[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 })
2250 && self.is_conditionally_const(parent_def_id)
2251 }
2252 _ => 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:?}"),
2253 }
2254 }
2255 DefKind::OpaqueTy => match self.opaque_ty_origin(def_id) {
2256 hir::OpaqueTyOrigin::FnReturn { parent, .. } => self.is_conditionally_const(parent),
2257 hir::OpaqueTyOrigin::AsyncFn { .. } => false,
2258 hir::OpaqueTyOrigin::TyAlias { .. } => false,
2260 },
2261 DefKind::Closure => {
2262 #[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 })
2263 }
2264 DefKind::Ctor(_, CtorKind::Const)
2265 | DefKind::Mod
2266 | DefKind::Struct
2267 | DefKind::Union
2268 | DefKind::Enum
2269 | DefKind::Variant
2270 | DefKind::TyAlias
2271 | DefKind::ForeignTy
2272 | DefKind::TyParam
2273 | DefKind::Const { .. }
2274 | DefKind::ConstParam
2275 | DefKind::Static { .. }
2276 | DefKind::AssocConst { .. }
2277 | DefKind::Macro(_)
2278 | DefKind::ExternCrate
2279 | DefKind::Use
2280 | DefKind::ForeignMod
2281 | DefKind::AnonConst
2282 | DefKind::Field
2283 | DefKind::LifetimeParam
2284 | DefKind::GlobalAsm
2285 | DefKind::SyntheticCoroutineBody => false,
2286 }
2287 }
2288
2289 #[inline]
2290 pub fn is_const_trait(self, def_id: DefId) -> bool {
2291 #[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 { .. })
2292 }
2293
2294 pub fn impl_method_has_trait_impl_trait_tys(self, def_id: DefId) -> bool {
2295 if self.def_kind(def_id) != DefKind::AssocFn {
2296 return false;
2297 }
2298
2299 let Some(item) = self.opt_associated_item(def_id) else {
2300 return false;
2301 };
2302
2303 let AssocContainer::TraitImpl(Ok(trait_item_def_id)) = item.container else {
2304 return false;
2305 };
2306
2307 !self.associated_types_for_impl_traits_in_associated_fn(trait_item_def_id).is_empty()
2308 }
2309
2310 #[inline]
2325 pub fn fn_abi_of_instance(
2326 self,
2327 query: ty::PseudoCanonicalInput<'tcx, (ty::Instance<'tcx>, &'tcx ty::List<Ty<'tcx>>)>,
2328 ) -> Result<&'tcx FnAbi<'tcx, Ty<'tcx>>, &'tcx FnAbiError<'tcx>> {
2329 if self.sess.opts.optimize != OptLevel::No && self.sess.opts.incremental.is_none() {
2332 self.fn_abi_of_instance_raw(query)
2333 } else {
2334 self.fn_abi_of_instance_no_deduced_attrs(query)
2335 }
2336 }
2337}
2338
2339impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for DefId {
2342 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2343 if let Some(did) = self.as_local() {
2344 tcx.hir_attrs(tcx.local_def_id_to_hir_id(did))
2345 } else {
2346 tcx.attrs_for_def(self)
2347 }
2348 }
2349}
2350
2351impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for LocalDefId {
2352 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2353 tcx.hir_attrs(tcx.local_def_id_to_hir_id(self))
2354 }
2355}
2356
2357impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for hir::OwnerId {
2358 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2359 hir::attrs::HasAttrs::get_attrs(self.def_id, tcx)
2360 }
2361}
2362
2363impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for hir::HirId {
2364 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2365 tcx.hir_attrs(self)
2366 }
2367}
2368
2369pub fn provide(providers: &mut Providers) {
2370 closure::provide(providers);
2371 context::provide(providers);
2372 erase_regions::provide(providers);
2373 inhabitedness::provide(providers);
2374 util::provide(providers);
2375 print::provide(providers);
2376 super::util::bug::provide(providers);
2377 *providers = Providers {
2378 trait_impls_of: trait_def::trait_impls_of_provider,
2379 incoherent_impls: trait_def::incoherent_impls_provider,
2380 trait_impls_in_crate: trait_def::trait_impls_in_crate_provider,
2381 traits: trait_def::traits_provider,
2382 vtable_allocation: vtable::vtable_allocation_provider,
2383 ..*providers
2384 };
2385}
2386
2387#[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)]
2393pub struct CrateInherentImpls {
2394 pub inherent_impls: FxIndexMap<LocalDefId, Vec<DefId>>,
2395 pub incoherent_impls: FxIndexMap<SimplifiedType, Vec<LocalDefId>>,
2396}
2397
2398#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for SymbolName<'tcx> {
#[inline]
fn clone(&self) -> SymbolName<'tcx> {
let _: ::core::clone::AssertParamIsClone<&'tcx str>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::marker::Copy for SymbolName<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for SymbolName<'tcx> {
#[inline]
fn eq(&self, other: &SymbolName<'tcx>) -> bool { self.name == other.name }
}PartialEq, #[automatically_derived]
impl<'tcx> ::core::cmp::Eq for SymbolName<'tcx> {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<&'tcx str>;
}
}Eq, #[automatically_derived]
impl<'tcx> ::core::cmp::PartialOrd for SymbolName<'tcx> {
#[inline]
fn partial_cmp(&self, other: &SymbolName<'tcx>)
-> ::core::option::Option<::core::cmp::Ordering> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}PartialOrd, #[automatically_derived]
impl<'tcx> ::core::cmp::Ord for SymbolName<'tcx> {
#[inline]
fn cmp(&self, other: &SymbolName<'tcx>) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&self.name, &other.name)
}
}Ord, #[automatically_derived]
impl<'tcx> ::core::hash::Hash for SymbolName<'tcx> {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.name, state)
}
}Hash, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for SymbolName<'tcx> {
fn encode(&self, __encoder: &mut __E) {
match *self {
SymbolName { name: __binding_0 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};TyEncodable, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
SymbolName<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
SymbolName { name: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
2399pub struct SymbolName<'tcx> {
2400 pub name: &'tcx str,
2402}
2403
2404impl<'tcx> SymbolName<'tcx> {
2405 pub fn new(tcx: TyCtxt<'tcx>, name: &str) -> SymbolName<'tcx> {
2406 SymbolName { name: tcx.arena.alloc_str(name) }
2407 }
2408}
2409
2410impl<'tcx> fmt::Display for SymbolName<'tcx> {
2411 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2412 fmt::Display::fmt(&self.name, fmt)
2413 }
2414}
2415
2416impl<'tcx> fmt::Debug for SymbolName<'tcx> {
2417 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2418 fmt::Display::fmt(&self.name, fmt)
2419 }
2420}
2421
2422#[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)]
2424pub struct DestructuredAdtConst<'tcx> {
2425 pub variant: VariantIdx,
2426 pub fields: &'tcx [ty::Const<'tcx>],
2427}