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