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