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 as ast;
31use rustc_ast::expand::typetree::{FncTree, Kind, Type, TypeTree};
32use rustc_ast::node_id::NodeMap;
33pub use rustc_ast_ir::{Movability, Mutability, try_visit};
34use rustc_data_structures::fx::{FxIndexMap, FxIndexSet};
35use rustc_data_structures::intern::Interned;
36use rustc_data_structures::stable_hash::{StableHash, StableHashCtxt, StableHasher};
37use rustc_data_structures::steal::Steal;
38use rustc_data_structures::unord::{UnordMap, UnordSet};
39use rustc_errors::{Diag, ErrorGuaranteed, LintBuffer};
40use rustc_hir::attrs::StrippedCfgItem;
41use rustc_hir::def::{CtorKind, CtorOf, DefKind, DocLinkResMap, LifetimeRes, Res};
42use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, LocalDefIdMap};
43use rustc_hir::definitions::PerParentDisambiguatorState;
44use rustc_hir::{self as hir, LangItem, MissingLifetimeKind, attrs as attr, find_attr};
45use rustc_index::IndexVec;
46use rustc_index::bit_set::BitMatrix;
47use rustc_macros::{
48 BlobDecodable, Decodable, Encodable, StableHash, TyDecodable, TyEncodable, TypeFoldable,
49 TypeVisitable, extension,
50};
51use rustc_serialize::{Decodable, Encodable};
52use rustc_session::config::OptLevel;
53pub use rustc_session::lint::RegisteredTools;
54use rustc_span::hygiene::MacroKind;
55use rustc_span::{DUMMY_SP, ExpnId, ExpnKind, Ident, Span, Symbol};
56use rustc_target::callconv::FnAbi;
57pub use rustc_type_ir::data_structures::{DelayedMap, DelayedSet};
58pub use rustc_type_ir::fast_reject::DeepRejectCtxt;
59#[allow(
60 hidden_glob_reexports,
61 rustc::usage_of_type_ir_inherent,
62 rustc::non_glob_import_of_type_ir_inherent
63)]
64use rustc_type_ir::inherent;
65pub use rustc_type_ir::relate::VarianceDiagInfo;
66pub use rustc_type_ir::solve::{CandidatePreferenceMode, SizedTraitKind, VisibleForLeakCheck};
67pub use rustc_type_ir::*;
68#[allow(hidden_glob_reexports, unused_imports)]
69use rustc_type_ir::{InferCtxtLike, Interner};
70use tracing::{debug, instrument, trace};
71pub use vtable::*;
72
73pub use self::closure::{
74 BorrowKind, CAPTURE_STRUCT_LOCAL, CaptureInfo, CapturedPlace, ClosureTypeInfo,
75 MinCaptureInformationMap, MinCaptureList, RootVariableMinCaptureList, UpvarCapture, UpvarId,
76 UpvarPath, analyze_coroutine_closure_captures, is_ancestor_or_same_capture,
77 place_to_string_for_capture,
78};
79pub use self::consts::{
80 AtomicOrdering, Const, ConstInt, ConstKind, ConstToValTreeResult, Expr, ExprKind,
81 LitToConstInput, ScalarInt, SimdAlign, UnevaluatedConst, ValTree, ValTreeKindExt, Value,
82 const_lit_matches_ty,
83};
84pub use self::context::{
85 CtxtInterners, CurrentGcx, FreeRegionInfo, GlobalCtxt, Lift, TyCtxt, TyCtxtFeed, tls,
86};
87pub use self::fold::*;
88pub use self::instance::{Instance, InstanceKind, ReifyReason};
89pub(crate) use self::list::RawList;
90pub use self::list::{List, ListWithCachedTypeInfo};
91pub use self::opaque_types::OpaqueTypeKey;
92pub use self::pattern::{Pattern, PatternKind};
93pub use self::predicate::{
94 AliasTerm, AliasTermKind, ArgOutlivesPredicate, Clause, ClauseKind, CoercePredicate,
95 ExistentialPredicate, ExistentialPredicateStableCmpExt, ExistentialProjection,
96 ExistentialTraitRef, HostEffectPredicate, NormalizesTo, OutlivesPredicate, PolyCoercePredicate,
97 PolyExistentialPredicate, PolyExistentialProjection, PolyExistentialTraitRef,
98 PolyProjectionPredicate, PolyRegionOutlivesPredicate, PolySubtypePredicate, PolyTraitPredicate,
99 PolyTraitRef, PolyTypeOutlivesPredicate, Predicate, PredicateKind, ProjectionPredicate,
100 RegionConstraint, RegionEqPredicate, RegionOutlivesPredicate, SubtypePredicate, TraitPredicate,
101 TraitRef, TypeOutlivesPredicate,
102};
103pub use self::region::{
104 EarlyParamRegion, LateParamRegion, LateParamRegionKind, Region, RegionKind, RegionVid,
105};
106pub use self::sty::{
107 AliasTy, AliasTyKind, Article, Binder, BoundConst, BoundRegion, BoundRegionKind, BoundTy,
108 BoundTyKind, BoundVariableKind, CanonicalPolyFnSig, CoroutineArgsExt, EarlyBinder, FnSig,
109 FnSigKind, InlineConstArgs, InlineConstArgsParts, ParamConst, ParamTy, PlaceholderConst,
110 PlaceholderRegion, PlaceholderType, PolyFnSig, TyKind, TypeAndMut, TypingMode,
111 TypingModeEqWrapper, 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, 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 util;
147pub mod vtable;
148
149mod adt;
150mod assoc;
151mod closure;
152mod consts;
153mod context;
154mod diagnostics;
155mod elaborate_impl;
156mod erase_regions;
157mod fold;
158mod generic_args;
159mod generics;
160mod impls_ty;
161mod instance;
162mod intrinsic;
163mod list;
164mod opaque_types;
165mod predicate;
166mod region;
167mod structural_impls;
168#[allow(hidden_glob_reexports)]
169mod sty;
170mod typeck_results;
171mod visit;
172
173#[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"];
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];
::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 } => {
{ __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); }
}
}
}
}
};StableHash)]
176pub struct ResolverGlobalCtxt {
177 pub visibilities_for_hashing: Vec<(LocalDefId, Visibility)>,
178 pub expn_that_defined: UnordMap<LocalDefId, ExpnId>,
180 pub effective_visibilities: EffectiveVisibilities,
181 pub macro_reachable_adts: FxIndexMap<LocalDefId, FxIndexSet<LocalDefId>>,
187 pub extern_crate_map: UnordMap<LocalDefId, CrateNum>,
188 pub maybe_unused_trait_imports: FxIndexSet<LocalDefId>,
189 pub module_children: LocalDefIdMap<Vec<ModChild>>,
190 pub ambig_module_children: LocalDefIdMap<Vec<AmbigModChild>>,
191 pub glob_map: FxIndexMap<LocalDefId, FxIndexSet<Symbol>>,
192 pub main_def: Option<MainDefinition>,
193 pub trait_impls: FxIndexMap<DefId, Vec<LocalDefId>>,
194 pub proc_macros: Vec<LocalDefId>,
197 pub confused_type_with_std_module: FxIndexMap<Span, Span>,
200 pub doc_link_resolutions: FxIndexMap<LocalDefId, DocLinkResMap>,
201 pub doc_link_traits_in_scope: FxIndexMap<LocalDefId, Vec<DefId>>,
202 pub all_macro_rules: UnordSet<Symbol>,
203 pub stripped_cfg_items: Vec<StrippedCfgItem>,
204}
205
206#[derive(#[automatically_derived]
impl ::core::fmt::Debug for PerOwnerResolverData {
#[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", "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.id,
&&self.def_id];
::core::fmt::Formatter::debug_struct_fields_finish(f,
"PerOwnerResolverData", names, values)
}
}Debug)]
207pub struct PerOwnerResolverData {
208 pub node_id_to_def_id: NodeMap<LocalDefId> = Default::default(),
209 pub lifetime_elision_allowed: bool = false,
211 pub label_res_map: NodeMap<ast::NodeId> = Default::default(),
214 pub lifetimes_res_map: NodeMap<LifetimeRes> = Default::default(),
216
217 pub id: ast::NodeId,
219 pub def_id: LocalDefId,
221}
222
223impl PerOwnerResolverData {
224 pub fn new(id: ast::NodeId, def_id: LocalDefId) -> PerOwnerResolverData {
225 PerOwnerResolverData { id, def_id, .. }
226 }
227
228 pub fn get_label_res(&self, id: ast::NodeId) -> Option<ast::NodeId> {
230 self.label_res_map.get(&id).copied()
231 }
232
233 pub fn get_lifetime_res(&self, id: ast::NodeId) -> Option<LifetimeRes> {
235 self.lifetimes_res_map.get(&id).copied()
236 }
237}
238
239#[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", "import_res_map",
"extra_lifetime_params_map", "next_node_id", "owners",
"trait_map", "lint_buffer", "delegation_infos",
"disambiguators"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.partial_res_map, &self.import_res_map,
&self.extra_lifetime_params_map, &self.next_node_id,
&self.owners, &self.trait_map, &self.lint_buffer,
&self.delegation_infos, &&self.disambiguators];
::core::fmt::Formatter::debug_struct_fields_finish(f,
"ResolverAstLowering", names, values)
}
}Debug)]
242pub struct ResolverAstLowering<'tcx> {
243 pub partial_res_map: NodeMap<hir::def::PartialRes>,
245 pub import_res_map: NodeMap<hir::def::PerNS<Option<Res<ast::NodeId>>>>,
247 pub extra_lifetime_params_map: NodeMap<Vec<(Ident, ast::NodeId, MissingLifetimeKind)>>,
249
250 pub next_node_id: ast::NodeId,
251
252 pub owners: NodeMap<PerOwnerResolverData>,
253
254 pub trait_map: NodeMap<&'tcx [hir::TraitCandidate<'tcx>]>,
255
256 pub lint_buffer: Steal<LintBuffer>,
258
259 pub delegation_infos: LocalDefIdMap<DelegationInfo>,
261
262 pub disambiguators: LocalDefIdMap<Steal<PerParentDisambiguatorState>>,
263}
264
265#[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)]
266pub struct DelegationInfo {
267 pub resolution_id: DefId,
273}
274
275#[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)]
276pub struct MainDefinition {
277 pub res: Res<ast::NodeId>,
278 pub is_import: bool,
279 pub span: Span,
280}
281
282impl MainDefinition {
283 pub fn opt_fn_def_id(self) -> Option<DefId> {
284 if let Res::Def(DefKind::Fn, def_id) = self.res { Some(def_id) } else { None }
285 }
286}
287
288#[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)]
289pub struct ImplTraitHeader<'tcx> {
290 pub trait_ref: ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>>,
291 pub polarity: ImplPolarity,
292 pub safety: hir::Safety,
293 pub constness: hir::Constness,
294}
295
296#[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)]
297#[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)]
298pub enum Asyncness {
299 Yes,
300 #[default]
301 No,
302}
303
304impl Asyncness {
305 pub fn is_async(self) -> bool {
306 #[allow(non_exhaustive_omitted_patterns)] match self {
Asyncness::Yes => true,
_ => false,
}matches!(self, Asyncness::Yes)
307 }
308}
309
310#[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)]
311pub enum Visibility<Id = LocalDefId> {
312 Public,
314 Restricted(Id),
316}
317
318impl Visibility {
319 pub fn to_string(self, def_id: LocalDefId, tcx: TyCtxt<'_>) -> String {
320 match self {
321 ty::Visibility::Restricted(restricted_id) => {
322 if restricted_id.is_top_level_module() {
323 "pub(crate)".to_string()
324 } else if restricted_id == tcx.parent_module_from_def_id(def_id).to_local_def_id() {
325 "pub(self)".to_string()
326 } else {
327 ::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!(
328 "pub(in crate{})",
329 tcx.def_path(restricted_id.to_def_id()).to_string_no_crate_verbose()
330 )
331 }
332 }
333 ty::Visibility::Public => "pub".to_string(),
334 }
335 }
336}
337
338#[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)]
339#[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)]
340pub struct ClosureSizeProfileData<'tcx> {
341 pub before_feature_tys: Ty<'tcx>,
343 pub after_feature_tys: Ty<'tcx>,
345}
346
347impl TyCtxt<'_> {
348 #[inline]
349 pub fn opt_parent(self, id: DefId) -> Option<DefId> {
350 self.def_key(id).parent.map(|index| DefId { index, ..id })
351 }
352
353 #[inline]
354 #[track_caller]
355 pub fn parent(self, id: DefId) -> DefId {
356 match self.opt_parent(id) {
357 Some(id) => id,
358 None => crate::util::bug::bug_fmt(format_args!("{0:?} doesn\'t have a parent", id))bug!("{id:?} doesn't have a parent"),
360 }
361 }
362
363 #[inline]
364 #[track_caller]
365 pub fn opt_local_parent(self, id: LocalDefId) -> Option<LocalDefId> {
366 self.opt_parent(id.to_def_id()).map(DefId::expect_local)
367 }
368
369 #[inline]
370 #[track_caller]
371 pub fn local_parent(self, id: impl Into<LocalDefId>) -> LocalDefId {
372 self.parent(id.into().to_def_id()).expect_local()
373 }
374
375 fn def_id_partial_cmp(self, lhs: DefId, rhs: DefId) -> Option<Ordering> {
379 if lhs.krate != rhs.krate {
381 return None;
382 }
383
384 let search = |mut start: DefId, finish: DefId, ord| {
388 while start.index != finish.index {
389 match self.opt_parent(start) {
390 Some(parent) => start.index = parent.index,
391 None => return None,
392 }
393 }
394 Some(ord)
395 };
396 match lhs.index.cmp(&rhs.index) {
397 Ordering::Equal => Some(Ordering::Equal),
398 Ordering::Less => search(rhs, lhs, Ordering::Greater),
399 Ordering::Greater => search(lhs, rhs, Ordering::Less),
400 }
401 }
402
403 pub fn is_descendant_of(self, descendant: DefId, ancestor: DefId) -> bool {
404 #[allow(non_exhaustive_omitted_patterns)] match self.def_id_partial_cmp(descendant,
ancestor) {
Some(Ordering::Less | Ordering::Equal) => true,
_ => false,
}matches!(
405 self.def_id_partial_cmp(descendant, ancestor),
406 Some(Ordering::Less | Ordering::Equal)
407 )
408 }
409}
410
411impl<Id> Visibility<Id> {
412 pub fn is_public(self) -> bool {
413 #[allow(non_exhaustive_omitted_patterns)] match self {
Visibility::Public => true,
_ => false,
}matches!(self, Visibility::Public)
414 }
415
416 pub fn map_id<OutId>(self, f: impl FnOnce(Id) -> OutId) -> Visibility<OutId> {
417 match self {
418 Visibility::Public => Visibility::Public,
419 Visibility::Restricted(id) => Visibility::Restricted(f(id)),
420 }
421 }
422}
423
424impl<Id: Into<DefId>> Visibility<Id> {
425 pub fn to_def_id(self) -> Visibility<DefId> {
426 self.map_id(Into::into)
427 }
428
429 pub fn is_accessible_from(self, module: impl Into<DefId>, tcx: TyCtxt<'_>) -> bool {
431 match self {
432 Visibility::Public => true,
434 Visibility::Restricted(id) => tcx.is_descendant_of(module.into(), id.into()),
435 }
436 }
437
438 pub fn partial_cmp(
439 self,
440 vis: Visibility<impl Into<DefId>>,
441 tcx: TyCtxt<'_>,
442 ) -> Option<Ordering> {
443 match (self, vis) {
444 (Visibility::Public, Visibility::Public) => Some(Ordering::Equal),
445 (Visibility::Public, Visibility::Restricted(_)) => Some(Ordering::Greater),
446 (Visibility::Restricted(_), Visibility::Public) => Some(Ordering::Less),
447 (Visibility::Restricted(lhs_id), Visibility::Restricted(rhs_id)) => {
448 let (lhs_id, rhs_id) = (lhs_id.into(), rhs_id.into());
449 tcx.def_id_partial_cmp(lhs_id, rhs_id)
450 }
451 }
452 }
453}
454
455impl<Id: Into<DefId> + Debug + Copy> Visibility<Id> {
456 #[track_caller]
458 pub fn greater_than(
459 self,
460 vis: Visibility<impl Into<DefId> + Debug + Copy>,
461 tcx: TyCtxt<'_>,
462 ) -> bool {
463 match self.partial_cmp(vis, tcx) {
464 Some(ord) => ord.is_gt(),
465 None => {
466 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:?}"));
467 false
468 }
469 }
470 }
471}
472
473impl Visibility<DefId> {
474 pub fn expect_local(self) -> Visibility {
475 self.map_id(|id| id.expect_local())
476 }
477
478 pub fn is_visible_locally(self) -> bool {
480 match self {
481 Visibility::Public => true,
482 Visibility::Restricted(def_id) => def_id.is_local(),
483 }
484 }
485}
486
487#[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)]
494pub struct CrateVariancesMap<'tcx> {
495 pub variances: DefIdMap<&'tcx [ty::Variance]>,
499}
500
501#[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)]
504pub struct CReaderCacheKey {
505 pub cnum: Option<CrateNum>,
506 pub pos: usize,
507}
508
509#[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)]
511#[rustc_diagnostic_item = "Ty"]
512#[rustc_pass_by_value]
513pub struct Ty<'tcx>(Interned<'tcx, WithCachedTypeInfo<TyKind<'tcx>>>);
514
515impl<'tcx> rustc_type_ir::inherent::IntoKind for Ty<'tcx> {
516 type Kind = TyKind<'tcx>;
517
518 fn kind(self) -> TyKind<'tcx> {
519 *self.kind()
520 }
521}
522
523impl<'tcx> rustc_type_ir::Flags for Ty<'tcx> {
524 fn flags(&self) -> TypeFlags {
525 self.0.flags
526 }
527
528 fn outer_exclusive_binder(&self) -> DebruijnIndex {
529 self.0.outer_exclusive_binder
530 }
531}
532
533#[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)]
540pub struct CratePredicatesMap<'tcx> {
541 pub predicates: DefIdMap<&'tcx [(Clause<'tcx>, Span)]>,
545}
546
547#[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)]
548pub struct Term<'tcx> {
549 ptr: NonNull<()>,
550 marker: PhantomData<(Ty<'tcx>, Const<'tcx>)>,
551}
552
553impl<'tcx> rustc_type_ir::inherent::Term<TyCtxt<'tcx>> for Term<'tcx> {}
554
555impl<'tcx> rustc_type_ir::inherent::IntoKind for Term<'tcx> {
556 type Kind = TermKind<'tcx>;
557
558 fn kind(self) -> Self::Kind {
559 self.kind()
560 }
561}
562
563unsafe impl<'tcx> rustc_data_structures::sync::DynSend for Term<'tcx> where
564 &'tcx (Ty<'tcx>, Const<'tcx>): rustc_data_structures::sync::DynSend
565{
566}
567unsafe impl<'tcx> rustc_data_structures::sync::DynSync for Term<'tcx> where
568 &'tcx (Ty<'tcx>, Const<'tcx>): rustc_data_structures::sync::DynSync
569{
570}
571unsafe impl<'tcx> Send for Term<'tcx> where &'tcx (Ty<'tcx>, Const<'tcx>): Send {}
572unsafe impl<'tcx> Sync for Term<'tcx> where &'tcx (Ty<'tcx>, Const<'tcx>): Sync {}
573
574impl Debug for Term<'_> {
575 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
576 match self.kind() {
577 TermKind::Ty(ty) => f.write_fmt(format_args!("Term::Ty({0:?})", ty))write!(f, "Term::Ty({ty:?})"),
578 TermKind::Const(ct) => f.write_fmt(format_args!("Term::Const({0:?})", ct))write!(f, "Term::Const({ct:?})"),
579 }
580 }
581}
582
583impl<'tcx> From<Ty<'tcx>> for Term<'tcx> {
584 fn from(ty: Ty<'tcx>) -> Self {
585 TermKind::Ty(ty).pack()
586 }
587}
588
589impl<'tcx> From<Const<'tcx>> for Term<'tcx> {
590 fn from(c: Const<'tcx>) -> Self {
591 TermKind::Const(c).pack()
592 }
593}
594
595impl<'tcx> StableHash for Term<'tcx> {
596 fn stable_hash<Hcx: StableHashCtxt>(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
597 self.kind().stable_hash(hcx, hasher);
598 }
599}
600
601impl<'tcx> TypeFoldable<TyCtxt<'tcx>> for Term<'tcx> {
602 fn try_fold_with<F: FallibleTypeFolder<TyCtxt<'tcx>>>(
603 self,
604 folder: &mut F,
605 ) -> Result<Self, F::Error> {
606 match self.kind() {
607 ty::TermKind::Ty(ty) => ty.try_fold_with(folder).map(Into::into),
608 ty::TermKind::Const(ct) => ct.try_fold_with(folder).map(Into::into),
609 }
610 }
611
612 fn fold_with<F: TypeFolder<TyCtxt<'tcx>>>(self, folder: &mut F) -> Self {
613 match self.kind() {
614 ty::TermKind::Ty(ty) => ty.fold_with(folder).into(),
615 ty::TermKind::Const(ct) => ct.fold_with(folder).into(),
616 }
617 }
618}
619
620impl<'tcx> TypeVisitable<TyCtxt<'tcx>> for Term<'tcx> {
621 fn visit_with<V: TypeVisitor<TyCtxt<'tcx>>>(&self, visitor: &mut V) -> V::Result {
622 match self.kind() {
623 ty::TermKind::Ty(ty) => ty.visit_with(visitor),
624 ty::TermKind::Const(ct) => ct.visit_with(visitor),
625 }
626 }
627}
628
629impl<'tcx, E: TyEncoder<'tcx>> Encodable<E> for Term<'tcx> {
630 fn encode(&self, e: &mut E) {
631 self.kind().encode(e)
632 }
633}
634
635impl<'tcx, D: TyDecoder<'tcx>> Decodable<D> for Term<'tcx> {
636 fn decode(d: &mut D) -> Self {
637 let res: TermKind<'tcx> = Decodable::decode(d);
638 res.pack()
639 }
640}
641
642impl<'tcx> Term<'tcx> {
643 #[inline]
644 pub fn kind(self) -> TermKind<'tcx> {
645 let ptr =
646 unsafe { self.ptr.map_addr(|addr| NonZero::new_unchecked(addr.get() & !TAG_MASK)) };
647 unsafe {
651 match self.ptr.addr().get() & TAG_MASK {
652 TYPE_TAG => TermKind::Ty(Ty(Interned::new_unchecked(
653 ptr.cast::<WithCachedTypeInfo<ty::TyKind<'tcx>>>().as_ref(),
654 ))),
655 CONST_TAG => TermKind::Const(ty::Const(Interned::new_unchecked(
656 ptr.cast::<WithCachedTypeInfo<ty::ConstKind<'tcx>>>().as_ref(),
657 ))),
658 _ => core::intrinsics::unreachable(),
659 }
660 }
661 }
662
663 pub fn as_type(&self) -> Option<Ty<'tcx>> {
664 if let TermKind::Ty(ty) = self.kind() { Some(ty) } else { None }
665 }
666
667 pub fn expect_type(&self) -> Ty<'tcx> {
668 self.as_type().expect("expected a type, but found a const")
669 }
670
671 pub fn as_const(&self) -> Option<Const<'tcx>> {
672 if let TermKind::Const(c) = self.kind() { Some(c) } else { None }
673 }
674
675 pub fn expect_const(&self) -> Const<'tcx> {
676 self.as_const().expect("expected a const, but found a type")
677 }
678
679 pub fn into_arg(self) -> GenericArg<'tcx> {
680 match self.kind() {
681 TermKind::Ty(ty) => ty.into(),
682 TermKind::Const(c) => c.into(),
683 }
684 }
685
686 pub fn to_alias_term(self, tcx: TyCtxt<'tcx>) -> Option<AliasTerm<'tcx>> {
687 match self.kind() {
688 TermKind::Ty(ty) => match *ty.kind() {
689 ty::Alias(alias_ty) => Some(alias_ty.into()),
690 _ => None,
691 },
692 TermKind::Const(ct) => match ct.kind() {
693 ConstKind::Unevaluated(uv) => Some(AliasTerm::from_unevaluated_const(tcx, uv)),
694 _ => None,
695 },
696 }
697 }
698
699 pub fn is_infer(&self) -> bool {
700 match self.kind() {
701 TermKind::Ty(ty) => ty.is_ty_var(),
702 TermKind::Const(ct) => ct.is_ct_infer(),
703 }
704 }
705
706 pub fn is_trivially_wf(&self, tcx: TyCtxt<'tcx>) -> bool {
707 match self.kind() {
708 TermKind::Ty(ty) => ty.is_trivially_wf(tcx),
709 TermKind::Const(ct) => ct.is_trivially_wf(),
710 }
711 }
712
713 pub fn walk(self) -> TypeWalker<TyCtxt<'tcx>> {
724 TypeWalker::new(self.into())
725 }
726}
727
728const TAG_MASK: usize = 0b11;
729const TYPE_TAG: usize = 0b00;
730const CONST_TAG: usize = 0b01;
731
732impl<'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>)]
733impl<'tcx> TermKind<'tcx> {
734 #[inline]
735 fn pack(self) -> Term<'tcx> {
736 let (tag, ptr) = match self {
737 TermKind::Ty(ty) => {
738 assert_eq!(align_of_val(&*ty.0.0) & TAG_MASK, 0);
740 (TYPE_TAG, NonNull::from(ty.0.0).cast())
741 }
742 TermKind::Const(ct) => {
743 assert_eq!(align_of_val(&*ct.0.0) & TAG_MASK, 0);
745 (CONST_TAG, NonNull::from(ct.0.0).cast())
746 }
747 };
748
749 Term { ptr: ptr.map_addr(|addr| addr | tag), marker: PhantomData }
750 }
751}
752
753#[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)]
773pub struct InstantiatedPredicates<'tcx> {
774 pub predicates: Vec<Unnormalized<'tcx, Clause<'tcx>>>,
775 pub spans: Vec<Span>,
776}
777
778impl<'tcx> InstantiatedPredicates<'tcx> {
779 pub fn empty() -> InstantiatedPredicates<'tcx> {
780 InstantiatedPredicates { predicates: ::alloc::vec::Vec::new()vec![], spans: ::alloc::vec::Vec::new()vec![] }
781 }
782
783 pub fn is_empty(&self) -> bool {
784 self.predicates.is_empty()
785 }
786
787 pub fn iter(&self) -> <&Self as IntoIterator>::IntoIter {
788 self.into_iter()
789 }
790}
791
792impl<'tcx> IntoIterator for InstantiatedPredicates<'tcx> {
793 type Item = (Unnormalized<'tcx, Clause<'tcx>>, Span);
794
795 type IntoIter = std::iter::Zip<
796 std::vec::IntoIter<Unnormalized<'tcx, Clause<'tcx>>>,
797 std::vec::IntoIter<Span>,
798 >;
799
800 fn into_iter(self) -> Self::IntoIter {
801 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());
802 std::iter::zip(self.predicates, self.spans)
803 }
804}
805
806impl<'a, 'tcx> IntoIterator for &'a InstantiatedPredicates<'tcx> {
807 type Item = (Unnormalized<'tcx, Clause<'tcx>>, Span);
808
809 type IntoIter = std::iter::Zip<
810 std::iter::Copied<std::slice::Iter<'a, Unnormalized<'tcx, Clause<'tcx>>>>,
811 std::iter::Copied<std::slice::Iter<'a, Span>>,
812 >;
813
814 fn into_iter(self) -> Self::IntoIter {
815 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());
816 std::iter::zip(self.predicates.iter().copied(), self.spans.iter().copied())
817 }
818}
819
820#[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)]
821pub struct ProvisionalHiddenType<'tcx> {
822 pub span: Span,
836
837 pub ty: Ty<'tcx>,
850}
851
852#[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)]
854pub enum DefiningScopeKind {
855 HirTypeck,
860 MirBorrowck,
861}
862
863impl<'tcx> ProvisionalHiddenType<'tcx> {
864 pub fn new_error(tcx: TyCtxt<'tcx>, guar: ErrorGuaranteed) -> ProvisionalHiddenType<'tcx> {
865 ProvisionalHiddenType { span: DUMMY_SP, ty: Ty::new_error(tcx, guar) }
866 }
867
868 pub fn build_mismatch_error(
869 &self,
870 other: &Self,
871 tcx: TyCtxt<'tcx>,
872 ) -> Result<Diag<'tcx>, ErrorGuaranteed> {
873 (self.ty, other.ty).error_reported()?;
874 let sub_diag = if self.span == other.span {
876 TypeMismatchReason::ConflictType { span: self.span }
877 } else {
878 TypeMismatchReason::PreviousUse { span: self.span }
879 };
880 Ok(tcx.dcx().create_err(OpaqueHiddenTypeMismatch {
881 self_ty: self.ty,
882 other_ty: other.ty,
883 other_span: other.span,
884 sub: sub_diag,
885 }))
886 }
887
888 x;#[instrument(level = "debug", skip(tcx), ret)]
889 pub fn remap_generic_params_to_declaration_params(
890 self,
891 opaque_type_key: OpaqueTypeKey<'tcx>,
892 tcx: TyCtxt<'tcx>,
893 defining_scope_kind: DefiningScopeKind,
894 ) -> DefinitionSiteHiddenType<'tcx> {
895 let OpaqueTypeKey { def_id, args } = opaque_type_key;
896
897 let id_args = GenericArgs::identity_for_item(tcx, def_id);
904 debug!(?id_args);
905
906 let map = args.iter().zip(id_args).collect();
910 debug!("map = {:#?}", map);
911
912 let ty = match defining_scope_kind {
918 DefiningScopeKind::HirTypeck => {
919 fold_regions(tcx, self.ty, |_, _| tcx.lifetimes.re_erased)
920 }
921 DefiningScopeKind::MirBorrowck => self.ty,
922 };
923 let result_ty = ty.fold_with(&mut opaque_types::ReverseMapper::new(tcx, map, self.span));
924 if cfg!(debug_assertions) && matches!(defining_scope_kind, DefiningScopeKind::HirTypeck) {
925 assert_eq!(result_ty, fold_regions(tcx, result_ty, |_, _| tcx.lifetimes.re_erased));
926 }
927 DefinitionSiteHiddenType { span: self.span, ty: ty::EarlyBinder::bind(result_ty) }
928 }
929}
930
931#[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)]
932pub struct DefinitionSiteHiddenType<'tcx> {
933 pub span: Span,
946
947 pub ty: ty::EarlyBinder<'tcx, Ty<'tcx>>,
949}
950
951impl<'tcx> DefinitionSiteHiddenType<'tcx> {
952 pub fn new_error(tcx: TyCtxt<'tcx>, guar: ErrorGuaranteed) -> DefinitionSiteHiddenType<'tcx> {
953 DefinitionSiteHiddenType {
954 span: DUMMY_SP,
955 ty: ty::EarlyBinder::bind(Ty::new_error(tcx, guar)),
956 }
957 }
958
959 pub fn build_mismatch_error(
960 &self,
961 other: &Self,
962 tcx: TyCtxt<'tcx>,
963 ) -> Result<Diag<'tcx>, ErrorGuaranteed> {
964 let self_ty = self.ty.instantiate_identity().skip_norm_wip();
965 let other_ty = other.ty.instantiate_identity().skip_norm_wip();
966 (self_ty, other_ty).error_reported()?;
967 let sub_diag = if self.span == other.span {
969 TypeMismatchReason::ConflictType { span: self.span }
970 } else {
971 TypeMismatchReason::PreviousUse { span: self.span }
972 };
973 Ok(tcx.dcx().create_err(OpaqueHiddenTypeMismatch {
974 self_ty,
975 other_ty,
976 other_span: other.span,
977 sub: sub_diag,
978 }))
979 }
980}
981
982pub type Clauses<'tcx> = &'tcx ListWithCachedTypeInfo<Clause<'tcx>>;
983
984impl<'tcx> rustc_type_ir::Flags for Clauses<'tcx> {
985 fn flags(&self) -> TypeFlags {
986 (**self).flags()
987 }
988
989 fn outer_exclusive_binder(&self) -> DebruijnIndex {
990 (**self).outer_exclusive_binder()
991 }
992}
993
994#[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)]
1000#[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)]
1001pub struct ParamEnv<'tcx> {
1002 caller_bounds: Clauses<'tcx>,
1008}
1009
1010impl<'tcx> rustc_type_ir::inherent::ParamEnv<TyCtxt<'tcx>> for ParamEnv<'tcx> {
1011 fn caller_bounds(self) -> impl inherent::SliceLike<Item = ty::Clause<'tcx>> {
1012 self.caller_bounds()
1013 }
1014}
1015
1016impl<'tcx> ParamEnv<'tcx> {
1017 #[inline]
1024 pub fn empty() -> Self {
1025 Self::new(ListWithCachedTypeInfo::empty())
1026 }
1027
1028 #[inline]
1029 pub fn caller_bounds(self) -> Clauses<'tcx> {
1030 self.caller_bounds
1031 }
1032
1033 #[inline]
1035 pub fn new(caller_bounds: Clauses<'tcx>) -> Self {
1036 ParamEnv { caller_bounds }
1037 }
1038
1039 pub fn and<T: TypeVisitable<TyCtxt<'tcx>>>(self, value: T) -> ParamEnvAnd<'tcx, T> {
1041 ParamEnvAnd { param_env: self, value }
1042 }
1043}
1044
1045#[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)]
1046#[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)]
1047pub struct ParamEnvAnd<'tcx, T> {
1048 pub param_env: ParamEnv<'tcx>,
1049 pub value: T,
1050}
1051
1052#[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)]
1063#[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)]
1064pub struct TypingEnv<'tcx> {
1065 #[type_foldable(identity)]
1066 #[type_visitable(ignore)]
1067 typing_mode: TypingModeEqWrapper<'tcx>,
1068 pub param_env: ParamEnv<'tcx>,
1069}
1070
1071impl<'tcx> TypingEnv<'tcx> {
1072 pub fn new(param_env: ParamEnv<'tcx>, typing_mode: TypingMode<'tcx>) -> Self {
1073 Self { typing_mode: TypingModeEqWrapper(typing_mode), param_env }
1074 }
1075
1076 pub fn typing_mode(&self) -> TypingMode<'tcx> {
1077 self.typing_mode.0
1078 }
1079
1080 pub fn fully_monomorphized() -> TypingEnv<'tcx> {
1088 Self::new(ParamEnv::empty(), TypingMode::PostAnalysis)
1089 }
1090
1091 pub fn non_body_analysis(
1097 tcx: TyCtxt<'tcx>,
1098 def_id: impl IntoQueryKey<DefId>,
1099 ) -> TypingEnv<'tcx> {
1100 let def_id = def_id.into_query_key();
1101 Self::new(tcx.param_env(def_id), TypingMode::non_body_analysis().into())
1102 }
1103
1104 pub fn post_analysis(tcx: TyCtxt<'tcx>, def_id: impl IntoQueryKey<DefId>) -> TypingEnv<'tcx> {
1105 let def_id = def_id.into_query_key();
1106 tcx.typing_env_normalized_for_post_analysis(def_id)
1107 }
1108
1109 pub fn with_post_analysis_normalized(self, tcx: TyCtxt<'tcx>) -> TypingEnv<'tcx> {
1112 let TypingEnv { typing_mode, param_env } = self;
1113
1114 let param_env = if tcx.next_trait_solver_globally() {
1117 param_env
1118 } else {
1119 match typing_mode.0.assert_not_erased() {
1120 TypingMode::Coherence
1121 | TypingMode::Analysis { .. }
1122 | TypingMode::Borrowck { .. }
1123 | TypingMode::PostBorrowckAnalysis { .. } => {}
1124 TypingMode::PostAnalysis => return self,
1125 }
1126
1127 ParamEnv::new(tcx.reveal_opaque_types_in_bounds(param_env.caller_bounds()))
1128 };
1129 TypingEnv { typing_mode: TypingModeEqWrapper(TypingMode::PostAnalysis), param_env }
1130 }
1131
1132 pub fn as_query_input<T>(self, value: T) -> PseudoCanonicalInput<'tcx, T>
1137 where
1138 T: TypeVisitable<TyCtxt<'tcx>>,
1139 {
1140 PseudoCanonicalInput { typing_env: self, value }
1153 }
1154}
1155
1156#[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)]
1166#[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)]
1167pub struct PseudoCanonicalInput<'tcx, T> {
1168 pub typing_env: TypingEnv<'tcx>,
1169 pub value: T,
1170}
1171
1172#[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)]
1173pub struct Destructor {
1174 pub did: DefId,
1176}
1177
1178#[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)]
1180pub struct AsyncDestructor {
1181 pub impl_did: DefId,
1183}
1184
1185#[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)]
1186pub struct VariantFlags(u8);
1187impl 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! {
1188 impl VariantFlags: u8 {
1189 const NO_VARIANT_FLAGS = 0;
1190 const IS_FIELD_LIST_NON_EXHAUSTIVE = 1 << 0;
1192 }
1193}
1194impl ::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 }
1195
1196#[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)]
1198pub struct VariantDef {
1199 pub def_id: DefId,
1202 pub ctor: Option<(CtorKind, DefId)>,
1205 pub name: Symbol,
1207 pub discr: VariantDiscr,
1209 pub fields: IndexVec<FieldIdx, FieldDef>,
1211 tainted: Option<ErrorGuaranteed>,
1213 flags: VariantFlags,
1215}
1216
1217impl VariantDef {
1218 #[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(1234u32),
::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")]
1235 pub fn new(
1236 name: Symbol,
1237 variant_did: Option<DefId>,
1238 ctor: Option<(CtorKind, DefId)>,
1239 discr: VariantDiscr,
1240 fields: IndexVec<FieldIdx, FieldDef>,
1241 parent_did: DefId,
1242 recover_tainted: Option<ErrorGuaranteed>,
1243 is_field_list_non_exhaustive: bool,
1244 ) -> Self {
1245 let mut flags = VariantFlags::NO_VARIANT_FLAGS;
1246 if is_field_list_non_exhaustive {
1247 flags |= VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE;
1248 }
1249
1250 VariantDef {
1251 def_id: variant_did.unwrap_or(parent_did),
1252 ctor,
1253 name,
1254 discr,
1255 fields,
1256 flags,
1257 tainted: recover_tainted,
1258 }
1259 }
1260
1261 #[inline]
1267 pub fn is_field_list_non_exhaustive(&self) -> bool {
1268 self.flags.intersects(VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE)
1269 }
1270
1271 #[inline]
1274 pub fn field_list_has_applicable_non_exhaustive(&self) -> bool {
1275 self.is_field_list_non_exhaustive() && !self.def_id.is_local()
1276 }
1277
1278 pub fn ident(&self, tcx: TyCtxt<'_>) -> Ident {
1280 Ident::new(self.name, tcx.def_ident_span(self.def_id).unwrap())
1281 }
1282
1283 #[inline]
1285 pub fn has_errors(&self) -> Result<(), ErrorGuaranteed> {
1286 self.tainted.map_or(Ok(()), Err)
1287 }
1288
1289 #[inline]
1290 pub fn ctor_kind(&self) -> Option<CtorKind> {
1291 self.ctor.map(|(kind, _)| kind)
1292 }
1293
1294 #[inline]
1295 pub fn ctor_def_id(&self) -> Option<DefId> {
1296 self.ctor.map(|(_, def_id)| def_id)
1297 }
1298
1299 #[inline]
1303 pub fn single_field(&self) -> &FieldDef {
1304 if !(self.fields.len() == 1) {
::core::panicking::panic("assertion failed: self.fields.len() == 1")
};assert!(self.fields.len() == 1);
1305
1306 &self.fields[FieldIdx::ZERO]
1307 }
1308
1309 #[inline]
1311 pub fn tail_opt(&self) -> Option<&FieldDef> {
1312 self.fields.raw.last()
1313 }
1314
1315 #[inline]
1321 pub fn tail(&self) -> &FieldDef {
1322 self.tail_opt().expect("expected unsized ADT to have a tail field")
1323 }
1324
1325 pub fn has_unsafe_fields(&self) -> bool {
1327 self.fields.iter().any(|x| x.safety.is_unsafe())
1328 }
1329}
1330
1331impl PartialEq for VariantDef {
1332 #[inline]
1333 fn eq(&self, other: &Self) -> bool {
1334 let Self {
1342 def_id: lhs_def_id,
1343 ctor: _,
1344 name: _,
1345 discr: _,
1346 fields: _,
1347 flags: _,
1348 tainted: _,
1349 } = &self;
1350 let Self {
1351 def_id: rhs_def_id,
1352 ctor: _,
1353 name: _,
1354 discr: _,
1355 fields: _,
1356 flags: _,
1357 tainted: _,
1358 } = other;
1359
1360 let res = lhs_def_id == rhs_def_id;
1361
1362 if truecfg!(debug_assertions) && res {
1364 let deep = self.ctor == other.ctor
1365 && self.name == other.name
1366 && self.discr == other.discr
1367 && self.fields == other.fields
1368 && self.flags == other.flags;
1369 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");
1370 }
1371
1372 res
1373 }
1374}
1375
1376impl Eq for VariantDef {}
1377
1378impl Hash for VariantDef {
1379 #[inline]
1380 fn hash<H: Hasher>(&self, s: &mut H) {
1381 let Self { def_id, ctor: _, name: _, discr: _, fields: _, flags: _, tainted: _ } = &self;
1389 def_id.hash(s)
1390 }
1391}
1392
1393#[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)]
1394pub enum VariantDiscr {
1395 Explicit(DefId),
1398
1399 Relative(u32),
1404}
1405
1406#[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)]
1407pub struct FieldDef {
1408 pub did: DefId,
1409 pub name: Symbol,
1410 pub vis: Visibility<DefId>,
1411 pub safety: hir::Safety,
1412 pub value: Option<DefId>,
1413}
1414
1415impl PartialEq for FieldDef {
1416 #[inline]
1417 fn eq(&self, other: &Self) -> bool {
1418 let Self { did: lhs_did, name: _, vis: _, safety: _, value: _ } = &self;
1426
1427 let Self { did: rhs_did, name: _, vis: _, safety: _, value: _ } = other;
1428
1429 let res = lhs_did == rhs_did;
1430
1431 if truecfg!(debug_assertions) && res {
1433 let deep =
1434 self.name == other.name && self.vis == other.vis && self.safety == other.safety;
1435 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");
1436 }
1437
1438 res
1439 }
1440}
1441
1442impl Eq for FieldDef {}
1443
1444impl Hash for FieldDef {
1445 #[inline]
1446 fn hash<H: Hasher>(&self, s: &mut H) {
1447 let Self { did, name: _, vis: _, safety: _, value: _ } = &self;
1455
1456 did.hash(s)
1457 }
1458}
1459
1460impl<'tcx> FieldDef {
1461 pub fn ty(
1464 &self,
1465 tcx: TyCtxt<'tcx>,
1466 args: GenericArgsRef<'tcx>,
1467 ) -> Unnormalized<'tcx, Ty<'tcx>> {
1468 tcx.type_of(self.did).instantiate(tcx, args)
1469 }
1470
1471 pub fn ident(&self, tcx: TyCtxt<'_>) -> Ident {
1473 Ident::new(self.name, tcx.def_ident_span(self.did).unwrap())
1474 }
1475}
1476
1477#[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)]
1478pub enum ImplOverlapKind {
1479 Permitted {
1481 marker: bool,
1483 },
1484}
1485
1486#[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)]
1489pub enum ImplTraitInTraitData {
1490 Trait { fn_def_id: DefId, opaque_def_id: DefId },
1491 Impl { fn_def_id: DefId },
1492}
1493
1494impl<'tcx> TyCtxt<'tcx> {
1495 pub fn typeck_body(self, body: hir::BodyId) -> &'tcx TypeckResults<'tcx> {
1496 self.typeck(self.hir_body_owner_def_id(body))
1497 }
1498
1499 pub fn provided_trait_methods(self, id: DefId) -> impl 'tcx + Iterator<Item = &'tcx AssocItem> {
1500 self.associated_items(id)
1501 .in_definition_order()
1502 .filter(move |item| item.is_fn() && item.defaultness(self).has_value())
1503 }
1504
1505 pub fn repr_options_of_def(self, did: LocalDefId) -> ReprOptions {
1506 let mut flags = ReprFlags::empty();
1507 let mut size = None;
1508 let mut max_align: Option<Align> = None;
1509 let mut min_pack: Option<Align> = None;
1510
1511 let mut field_shuffle_seed = self.def_path_hash(did.to_def_id()).0.to_smaller_hash();
1514
1515 if let Some(user_seed) = self.sess.opts.unstable_opts.layout_seed {
1519 field_shuffle_seed ^= user_seed;
1520 }
1521
1522 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
1523 )
1524 .map(|elt| match elt {
1525 Some(n) => ScalableElt::ElementCount(*n),
1526 None => ScalableElt::Container,
1527 });
1528 if elt.is_some() {
1529 flags.insert(ReprFlags::IS_SCALABLE);
1530 }
1531 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) {
1532 for (r, _) in reprs {
1533 flags.insert(match *r {
1534 attr::ReprRust => ReprFlags::empty(),
1535 attr::ReprC => ReprFlags::IS_C,
1536 attr::ReprPacked(pack) => {
1537 min_pack = Some(if let Some(min_pack) = min_pack {
1538 min_pack.min(pack)
1539 } else {
1540 pack
1541 });
1542 ReprFlags::empty()
1543 }
1544 attr::ReprTransparent => ReprFlags::IS_TRANSPARENT,
1545 attr::ReprSimd => ReprFlags::IS_SIMD,
1546 attr::ReprInt(i) => {
1547 size = Some(match i {
1548 attr::IntType::SignedInt(x) => match x {
1549 ast::IntTy::Isize => IntegerType::Pointer(true),
1550 ast::IntTy::I8 => IntegerType::Fixed(Integer::I8, true),
1551 ast::IntTy::I16 => IntegerType::Fixed(Integer::I16, true),
1552 ast::IntTy::I32 => IntegerType::Fixed(Integer::I32, true),
1553 ast::IntTy::I64 => IntegerType::Fixed(Integer::I64, true),
1554 ast::IntTy::I128 => IntegerType::Fixed(Integer::I128, true),
1555 },
1556 attr::IntType::UnsignedInt(x) => match x {
1557 ast::UintTy::Usize => IntegerType::Pointer(false),
1558 ast::UintTy::U8 => IntegerType::Fixed(Integer::I8, false),
1559 ast::UintTy::U16 => IntegerType::Fixed(Integer::I16, false),
1560 ast::UintTy::U32 => IntegerType::Fixed(Integer::I32, false),
1561 ast::UintTy::U64 => IntegerType::Fixed(Integer::I64, false),
1562 ast::UintTy::U128 => IntegerType::Fixed(Integer::I128, false),
1563 },
1564 });
1565 ReprFlags::empty()
1566 }
1567 attr::ReprAlign(align) => {
1568 max_align = max_align.max(Some(align));
1569 ReprFlags::empty()
1570 }
1571 });
1572 }
1573 }
1574
1575 if self.sess.opts.unstable_opts.randomize_layout {
1578 flags.insert(ReprFlags::RANDOMIZE_LAYOUT);
1579 }
1580
1581 let is_box = self.is_lang_item(did.to_def_id(), LangItem::OwnedBox);
1584
1585 if is_box {
1587 flags.insert(ReprFlags::IS_LINEAR);
1588 }
1589
1590 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(..)) {
1592 flags.insert(ReprFlags::PASS_INDIRECTLY_IN_NON_RUSTIC_ABIS);
1593 }
1594
1595 ReprOptions {
1596 int: size,
1597 align: max_align,
1598 pack: min_pack,
1599 flags,
1600 field_shuffle_seed,
1601 scalable: elt,
1602 }
1603 }
1604
1605 pub fn opt_item_name(self, def_id: impl IntoQueryKey<DefId>) -> Option<Symbol> {
1607 let def_id = def_id.into_query_key();
1608 if let Some(cnum) = def_id.as_crate_root() {
1609 Some(self.crate_name(cnum))
1610 } else {
1611 let def_key = self.def_key(def_id);
1612 match def_key.disambiguated_data.data {
1613 rustc_hir::definitions::DefPathData::Ctor => self
1615 .opt_item_name(DefId { krate: def_id.krate, index: def_key.parent.unwrap() }),
1616 _ => def_key.get_opt_name(),
1617 }
1618 }
1619 }
1620
1621 pub fn item_name(self, id: impl IntoQueryKey<DefId>) -> Symbol {
1628 let id = id.into_query_key();
1629 self.opt_item_name(id).unwrap_or_else(|| {
1630 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));
1631 })
1632 }
1633
1634 pub fn opt_item_ident(self, def_id: impl IntoQueryKey<DefId>) -> Option<Ident> {
1638 let def_id = def_id.into_query_key();
1639 let def = self.opt_item_name(def_id)?;
1640 let span = self
1641 .def_ident_span(def_id)
1642 .unwrap_or_else(|| crate::util::bug::bug_fmt(format_args!("missing ident span for {0:?}",
def_id))bug!("missing ident span for {def_id:?}"));
1643 Some(Ident::new(def, span))
1644 }
1645
1646 pub fn item_ident(self, def_id: impl IntoQueryKey<DefId>) -> Ident {
1650 let def_id = def_id.into_query_key();
1651 self.opt_item_ident(def_id).unwrap_or_else(|| {
1652 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));
1653 })
1654 }
1655
1656 pub fn opt_associated_item(self, def_id: DefId) -> Option<AssocItem> {
1657 if let DefKind::AssocConst { .. } | DefKind::AssocFn | DefKind::AssocTy =
1658 self.def_kind(def_id)
1659 {
1660 Some(self.associated_item(def_id))
1661 } else {
1662 None
1663 }
1664 }
1665
1666 pub fn opt_rpitit_info(self, def_id: DefId) -> Option<ImplTraitInTraitData> {
1670 if let DefKind::AssocTy = self.def_kind(def_id)
1671 && let AssocKind::Type { data: AssocTypeData::Rpitit(rpitit_info) } =
1672 self.associated_item(def_id).kind
1673 {
1674 Some(rpitit_info)
1675 } else {
1676 None
1677 }
1678 }
1679
1680 pub fn find_field_index(self, ident: Ident, variant: &VariantDef) -> Option<FieldIdx> {
1681 variant.fields.iter_enumerated().find_map(|(i, field)| {
1682 self.hygienic_eq(ident, field.ident(self), variant.def_id).then_some(i)
1683 })
1684 }
1685
1686 x;#[instrument(level = "debug", skip(self), ret)]
1689 pub fn impls_are_allowed_to_overlap(
1690 self,
1691 def_id1: DefId,
1692 def_id2: DefId,
1693 ) -> Option<ImplOverlapKind> {
1694 let impl1 = self.impl_trait_header(def_id1);
1695 let impl2 = self.impl_trait_header(def_id2);
1696
1697 let trait_ref1 = impl1.trait_ref.skip_binder();
1698 let trait_ref2 = impl2.trait_ref.skip_binder();
1699
1700 if trait_ref1.references_error() || trait_ref2.references_error() {
1703 return Some(ImplOverlapKind::Permitted { marker: false });
1704 }
1705
1706 match (impl1.polarity, impl2.polarity) {
1707 (ImplPolarity::Reservation, _) | (_, ImplPolarity::Reservation) => {
1708 return Some(ImplOverlapKind::Permitted { marker: false });
1710 }
1711 (ImplPolarity::Positive, ImplPolarity::Negative)
1712 | (ImplPolarity::Negative, ImplPolarity::Positive) => {
1713 return None;
1715 }
1716 (ImplPolarity::Positive, ImplPolarity::Positive)
1717 | (ImplPolarity::Negative, ImplPolarity::Negative) => {}
1718 };
1719
1720 let is_marker_impl = |trait_ref: TraitRef<'_>| self.trait_def(trait_ref.def_id).is_marker;
1721 let is_marker_overlap = is_marker_impl(trait_ref1) && is_marker_impl(trait_ref2);
1722
1723 if is_marker_overlap {
1724 return Some(ImplOverlapKind::Permitted { marker: true });
1725 }
1726
1727 None
1728 }
1729
1730 pub fn expect_variant_res(self, res: Res) -> &'tcx VariantDef {
1733 match res {
1734 Res::Def(DefKind::Variant, did) => {
1735 let enum_did = self.parent(did);
1736 self.adt_def(enum_did).variant_with_id(did)
1737 }
1738 Res::Def(DefKind::Struct | DefKind::Union, did) => self.adt_def(did).non_enum_variant(),
1739 Res::Def(DefKind::Ctor(CtorOf::Variant, ..), variant_ctor_did) => {
1740 let variant_did = self.parent(variant_ctor_did);
1741 let enum_did = self.parent(variant_did);
1742 self.adt_def(enum_did).variant_with_ctor_id(variant_ctor_did)
1743 }
1744 Res::Def(DefKind::Ctor(CtorOf::Struct, ..), ctor_did) => {
1745 let struct_did = self.parent(ctor_did);
1746 self.adt_def(struct_did).non_enum_variant()
1747 }
1748 _ => 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),
1749 }
1750 }
1751
1752 #[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(1753u32),
::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;
}
{
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:1757",
"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(1757u32),
::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:1759",
"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(1759u32),
::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),
_ => self.optimized_mir(def),
}
}
ty::InstanceKind::VTableShim(..) |
ty::InstanceKind::ReifyShim(..) |
ty::InstanceKind::Intrinsic(..) |
ty::InstanceKind::FnPtrShim(..) |
ty::InstanceKind::Virtual(..) |
ty::InstanceKind::ClosureOnceShim { .. } |
ty::InstanceKind::ConstructCoroutineInClosureShim { .. } |
ty::InstanceKind::FutureDropPollShim(..) |
ty::InstanceKind::DropGlue(..) |
ty::InstanceKind::CloneShim(..) |
ty::InstanceKind::ThreadLocalShim(..) |
ty::InstanceKind::FnPtrAddrShim(..) |
ty::InstanceKind::AsyncDropGlueCtorShim(..) |
ty::InstanceKind::AsyncDropGlue(..) =>
self.mir_shims(instance),
}
}
}
}#[instrument(skip(self), level = "debug")]
1754 pub fn instance_mir(self, instance: ty::InstanceKind<'tcx>) -> &'tcx Body<'tcx> {
1755 match instance {
1756 ty::InstanceKind::Item(def) => {
1757 debug!("calling def_kind on def: {:?}", def);
1758 let def_kind = self.def_kind(def);
1759 debug!("returned from def_kind: {:?}", def_kind);
1760 match def_kind {
1761 DefKind::Const { .. }
1762 | DefKind::Static { .. }
1763 | DefKind::AssocConst { .. }
1764 | DefKind::Ctor(..)
1765 | DefKind::AnonConst
1766 | DefKind::InlineConst => self.mir_for_ctfe(def),
1767 _ => self.optimized_mir(def),
1770 }
1771 }
1772 ty::InstanceKind::VTableShim(..)
1773 | ty::InstanceKind::ReifyShim(..)
1774 | ty::InstanceKind::Intrinsic(..)
1775 | ty::InstanceKind::FnPtrShim(..)
1776 | ty::InstanceKind::Virtual(..)
1777 | ty::InstanceKind::ClosureOnceShim { .. }
1778 | ty::InstanceKind::ConstructCoroutineInClosureShim { .. }
1779 | ty::InstanceKind::FutureDropPollShim(..)
1780 | ty::InstanceKind::DropGlue(..)
1781 | ty::InstanceKind::CloneShim(..)
1782 | ty::InstanceKind::ThreadLocalShim(..)
1783 | ty::InstanceKind::FnPtrAddrShim(..)
1784 | ty::InstanceKind::AsyncDropGlueCtorShim(..)
1785 | ty::InstanceKind::AsyncDropGlue(..) => self.mir_shims(instance),
1786 }
1787 }
1788
1789 #[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."]
1791 pub fn get_attrs(
1792 self,
1793 did: impl Into<DefId>,
1794 attr: Symbol,
1795 ) -> impl Iterator<Item = &'tcx hir::Attribute> {
1796 #[allow(deprecated)]
1797 self.get_all_attrs(did).iter().filter(move |a: &&hir::Attribute| a.has_name(attr))
1798 }
1799
1800 #[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."]
1805 pub fn get_all_attrs(self, did: impl Into<DefId>) -> &'tcx [hir::Attribute] {
1806 let did: DefId = did.into();
1807 if let Some(did) = did.as_local() {
1808 self.hir_attrs(self.local_def_id_to_hir_id(did))
1809 } else {
1810 self.attrs_for_def(did)
1811 }
1812 }
1813
1814 pub fn get_attrs_by_path(
1815 self,
1816 did: DefId,
1817 attr: &[Symbol],
1818 ) -> impl Iterator<Item = &'tcx hir::Attribute> {
1819 let filter_fn = move |a: &&hir::Attribute| a.path_matches(attr);
1820 if let Some(did) = did.as_local() {
1821 self.hir_attrs(self.local_def_id_to_hir_id(did)).iter().filter(filter_fn)
1822 } else {
1823 self.attrs_for_def(did).iter().filter(filter_fn)
1824 }
1825 }
1826
1827 pub fn trait_is_auto(self, trait_def_id: DefId) -> bool {
1829 self.trait_def(trait_def_id).has_auto_impl
1830 }
1831
1832 pub fn trait_is_coinductive(self, trait_def_id: DefId) -> bool {
1835 self.trait_def(trait_def_id).is_coinductive
1836 }
1837
1838 pub fn trait_is_alias(self, trait_def_id: DefId) -> bool {
1840 self.def_kind(trait_def_id) == DefKind::TraitAlias
1841 }
1842
1843 fn layout_error(self, err: LayoutError<'tcx>) -> &'tcx LayoutError<'tcx> {
1845 self.arena.alloc(err)
1846 }
1847
1848 fn ordinary_coroutine_layout(
1854 self,
1855 def_id: DefId,
1856 args: GenericArgsRef<'tcx>,
1857 ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1858 let coroutine_kind_ty = args.as_coroutine().kind_ty();
1859 let mir = self.optimized_mir(def_id);
1860 let ty = || Ty::new_coroutine(self, def_id, args);
1861 if coroutine_kind_ty.is_unit() {
1863 mir.coroutine_layout_raw().ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1864 } else {
1865 let ty::Coroutine(_, identity_args) =
1868 *self.type_of(def_id).instantiate_identity().skip_norm_wip().kind()
1869 else {
1870 ::core::panicking::panic("internal error: entered unreachable code");unreachable!();
1871 };
1872 let identity_kind_ty = identity_args.as_coroutine().kind_ty();
1873 if identity_kind_ty == coroutine_kind_ty {
1876 mir.coroutine_layout_raw()
1877 .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1878 } else {
1879 {
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));
1880 {
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!(
1881 identity_kind_ty.to_opt_closure_kind(),
1882 Some(ClosureKind::Fn | ClosureKind::FnMut)
1883 );
1884 self.optimized_mir(self.coroutine_by_move_body_def_id(def_id))
1885 .coroutine_layout_raw()
1886 .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1887 }
1888 }
1889 }
1890
1891 fn async_drop_coroutine_layout(
1895 self,
1896 def_id: DefId,
1897 args: GenericArgsRef<'tcx>,
1898 ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1899 let ty = || Ty::new_coroutine(self, def_id, args);
1900 if args[0].has_placeholders() || args[0].has_non_region_param() {
1901 return Err(self.layout_error(LayoutError::TooGeneric(ty())));
1902 }
1903 let instance = InstanceKind::AsyncDropGlue(def_id, Ty::new_coroutine(self, def_id, args));
1904 self.mir_shims(instance)
1905 .coroutine_layout_raw()
1906 .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1907 }
1908
1909 pub fn coroutine_layout(
1912 self,
1913 def_id: DefId,
1914 args: GenericArgsRef<'tcx>,
1915 ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1916 if self.is_async_drop_in_place_coroutine(def_id) {
1917 let arg_cor_ty = args.first().unwrap().expect_ty();
1921 if arg_cor_ty.is_coroutine() {
1922 let span = self.def_span(def_id);
1923 let source_info = SourceInfo::outermost(span);
1924 let variant_fields: IndexVec<VariantIdx, IndexVec<FieldIdx, CoroutineSavedLocal>> =
1927 iter::repeat(IndexVec::new()).take(CoroutineArgs::RESERVED_VARIANTS).collect();
1928 let variant_source_info: IndexVec<VariantIdx, SourceInfo> =
1929 iter::repeat(source_info).take(CoroutineArgs::RESERVED_VARIANTS).collect();
1930 let proxy_layout = CoroutineLayout {
1931 field_tys: [].into(),
1932 field_names: [].into(),
1933 variant_fields,
1934 variant_source_info,
1935 storage_conflicts: BitMatrix::new(0, 0),
1936 };
1937 return Ok(self.arena.alloc(proxy_layout));
1938 } else {
1939 self.async_drop_coroutine_layout(def_id, args)
1940 }
1941 } else {
1942 self.ordinary_coroutine_layout(def_id, args)
1943 }
1944 }
1945
1946 pub fn assoc_parent(self, def_id: DefId) -> Option<(DefId, DefKind)> {
1948 if !self.def_kind(def_id).is_assoc() {
1949 return None;
1950 }
1951 let parent = self.parent(def_id);
1952 let def_kind = self.def_kind(parent);
1953 Some((parent, def_kind))
1954 }
1955
1956 pub fn trait_item_of(self, def_id: impl IntoQueryKey<DefId>) -> Option<DefId> {
1958 let def_id = def_id.into_query_key();
1959 self.opt_associated_item(def_id)?.trait_item_def_id()
1960 }
1961
1962 pub fn trait_of_assoc(self, def_id: DefId) -> Option<DefId> {
1965 match self.assoc_parent(def_id) {
1966 Some((id, DefKind::Trait)) => Some(id),
1967 _ => None,
1968 }
1969 }
1970
1971 pub fn impl_is_of_trait(self, def_id: impl IntoQueryKey<DefId>) -> bool {
1972 let def_id = def_id.into_query_key();
1973 let DefKind::Impl { of_trait } = self.def_kind(def_id) else {
1974 {
::core::panicking::panic_fmt(format_args!("expected Impl for {0:?}",
def_id));
};panic!("expected Impl for {def_id:?}");
1975 };
1976 of_trait
1977 }
1978
1979 pub fn impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
1982 match self.assoc_parent(def_id) {
1983 Some((id, DefKind::Impl { .. })) => Some(id),
1984 _ => None,
1985 }
1986 }
1987
1988 pub fn inherent_impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
1991 match self.assoc_parent(def_id) {
1992 Some((id, DefKind::Impl { of_trait: false })) => Some(id),
1993 _ => None,
1994 }
1995 }
1996
1997 pub fn trait_impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
2000 match self.assoc_parent(def_id) {
2001 Some((id, DefKind::Impl { of_trait: true })) => Some(id),
2002 _ => None,
2003 }
2004 }
2005
2006 pub fn impl_polarity(self, def_id: impl IntoQueryKey<DefId>) -> ty::ImplPolarity {
2007 let def_id = def_id.into_query_key();
2008 self.impl_trait_header(def_id).polarity
2009 }
2010
2011 pub fn impl_trait_ref(
2013 self,
2014 def_id: impl IntoQueryKey<DefId>,
2015 ) -> ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>> {
2016 let def_id = def_id.into_query_key();
2017 self.impl_trait_header(def_id).trait_ref
2018 }
2019
2020 pub fn impl_opt_trait_ref(
2023 self,
2024 def_id: impl IntoQueryKey<DefId>,
2025 ) -> Option<ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>>> {
2026 let def_id = def_id.into_query_key();
2027 self.impl_is_of_trait(def_id).then(|| self.impl_trait_ref(def_id))
2028 }
2029
2030 pub fn impl_trait_id(self, def_id: impl IntoQueryKey<DefId>) -> DefId {
2032 let def_id = def_id.into_query_key();
2033 self.impl_trait_ref(def_id).skip_binder().def_id
2034 }
2035
2036 pub fn impl_opt_trait_id(self, def_id: impl IntoQueryKey<DefId>) -> Option<DefId> {
2039 let def_id = def_id.into_query_key();
2040 self.impl_is_of_trait(def_id).then(|| self.impl_trait_id(def_id))
2041 }
2042
2043 pub fn is_exportable(self, def_id: DefId) -> bool {
2044 self.exportable_items(def_id.krate).contains(&def_id)
2045 }
2046
2047 pub fn is_builtin_derived(self, def_id: DefId) -> bool {
2050 if self.is_automatically_derived(def_id)
2051 && let Some(def_id) = def_id.as_local()
2052 && let outer = self.def_span(def_id).ctxt().outer_expn_data()
2053 && #[allow(non_exhaustive_omitted_patterns)] match outer.kind {
ExpnKind::Macro(MacroKind::Derive, _) => true,
_ => false,
}matches!(outer.kind, ExpnKind::Macro(MacroKind::Derive, _))
2054 && {
{
'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 { .. })
2055 {
2056 true
2057 } else {
2058 false
2059 }
2060 }
2061
2062 pub fn is_automatically_derived(self, def_id: DefId) -> bool {
2064 {
{
'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)
2065 }
2066
2067 pub fn span_of_impl(self, impl_def_id: DefId) -> Result<Span, Symbol> {
2070 if let Some(impl_def_id) = impl_def_id.as_local() {
2071 Ok(self.def_span(impl_def_id))
2072 } else {
2073 Err(self.crate_name(impl_def_id.krate))
2074 }
2075 }
2076
2077 pub fn hygienic_eq(self, use_ident: Ident, def_ident: Ident, def_parent_def_id: DefId) -> bool {
2081 use_ident.name == def_ident.name
2085 && use_ident
2086 .span
2087 .ctxt()
2088 .hygienic_eq(def_ident.span.ctxt(), self.expn_that_defined(def_parent_def_id))
2089 }
2090
2091 pub fn adjust_ident(self, mut ident: Ident, scope: DefId) -> Ident {
2092 ident.span.normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope));
2093 ident
2094 }
2095
2096 pub fn adjust_ident_and_get_scope(
2098 self,
2099 mut ident: Ident,
2100 scope: DefId,
2101 block: hir::HirId,
2102 ) -> (Ident, DefId) {
2103 let scope = ident
2104 .span
2105 .normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope))
2106 .and_then(|actual_expansion| actual_expansion.expn_data().parent_module)
2107 .unwrap_or_else(|| self.parent_module(block).to_def_id());
2108 (ident, scope)
2109 }
2110
2111 #[inline]
2115 pub fn is_const_fn(self, def_id: impl IntoQueryKey<DefId>) -> bool {
2116 let def_id = def_id.into_query_key();
2117 #[allow(non_exhaustive_omitted_patterns)] match self.def_kind(def_id) {
DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(_, CtorKind::Fn) |
DefKind::Closure => true,
_ => false,
}matches!(
2118 self.def_kind(def_id),
2119 DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(_, CtorKind::Fn) | DefKind::Closure
2120 ) && self.constness(def_id) == hir::Constness::Const
2121 }
2122
2123 pub fn is_conditionally_const(self, def_id: impl Into<DefId>) -> bool {
2130 let def_id: DefId = def_id.into();
2131 match self.def_kind(def_id) {
2132 DefKind::Impl { of_trait: true } => {
2133 let header = self.impl_trait_header(def_id);
2134 header.constness == hir::Constness::Const
2135 && self.is_const_trait(header.trait_ref.skip_binder().def_id)
2136 }
2137 DefKind::Impl { of_trait: false } => self.constness(def_id) == hir::Constness::Const,
2138 DefKind::Fn | DefKind::Ctor(_, CtorKind::Fn) => {
2139 self.constness(def_id) == hir::Constness::Const
2140 }
2141 DefKind::TraitAlias | DefKind::Trait => self.is_const_trait(def_id),
2142 DefKind::AssocTy => {
2143 let parent_def_id = self.parent(def_id);
2144 match self.def_kind(parent_def_id) {
2145 DefKind::Impl { of_trait: false } => false,
2146 DefKind::Impl { of_trait: true } | DefKind::Trait => {
2147 self.is_conditionally_const(parent_def_id)
2148 }
2149 _ => 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:?}"),
2150 }
2151 }
2152 DefKind::AssocFn => {
2153 let parent_def_id = self.parent(def_id);
2154 match self.def_kind(parent_def_id) {
2155 DefKind::Impl { of_trait: false } => {
2156 self.constness(def_id) == hir::Constness::Const
2157 }
2158 DefKind::Impl { of_trait: true } => {
2159 let Some(trait_method_did) = self.trait_item_of(def_id) else {
2160 return false;
2161 };
2162 self.constness(trait_method_did) == hir::Constness::Const
2163 && self.is_conditionally_const(parent_def_id)
2164 }
2165 DefKind::Trait => {
2166 self.constness(def_id) == hir::Constness::Const
2167 && self.is_conditionally_const(parent_def_id)
2168 }
2169 _ => 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:?}"),
2170 }
2171 }
2172 DefKind::OpaqueTy => match self.opaque_ty_origin(def_id) {
2173 hir::OpaqueTyOrigin::FnReturn { parent, .. } => self.is_conditionally_const(parent),
2174 hir::OpaqueTyOrigin::AsyncFn { .. } => false,
2175 hir::OpaqueTyOrigin::TyAlias { .. } => false,
2177 },
2178 DefKind::Closure => self.constness(def_id) == hir::Constness::Const,
2179 DefKind::Ctor(_, CtorKind::Const)
2180 | DefKind::Mod
2181 | DefKind::Struct
2182 | DefKind::Union
2183 | DefKind::Enum
2184 | DefKind::Variant
2185 | DefKind::TyAlias
2186 | DefKind::ForeignTy
2187 | DefKind::TyParam
2188 | DefKind::Const { .. }
2189 | DefKind::ConstParam
2190 | DefKind::Static { .. }
2191 | DefKind::AssocConst { .. }
2192 | DefKind::Macro(_)
2193 | DefKind::ExternCrate
2194 | DefKind::Use
2195 | DefKind::ForeignMod
2196 | DefKind::AnonConst
2197 | DefKind::InlineConst
2198 | DefKind::Field
2199 | DefKind::LifetimeParam
2200 | DefKind::GlobalAsm
2201 | DefKind::SyntheticCoroutineBody => false,
2202 }
2203 }
2204
2205 #[inline]
2206 pub fn is_const_trait(self, def_id: DefId) -> bool {
2207 self.trait_def(def_id).constness == hir::Constness::Const
2208 }
2209
2210 pub fn impl_method_has_trait_impl_trait_tys(self, def_id: DefId) -> bool {
2211 if self.def_kind(def_id) != DefKind::AssocFn {
2212 return false;
2213 }
2214
2215 let Some(item) = self.opt_associated_item(def_id) else {
2216 return false;
2217 };
2218
2219 let AssocContainer::TraitImpl(Ok(trait_item_def_id)) = item.container else {
2220 return false;
2221 };
2222
2223 !self.associated_types_for_impl_traits_in_associated_fn(trait_item_def_id).is_empty()
2224 }
2225
2226 #[inline]
2241 pub fn fn_abi_of_instance(
2242 self,
2243 query: ty::PseudoCanonicalInput<'tcx, (ty::Instance<'tcx>, &'tcx ty::List<Ty<'tcx>>)>,
2244 ) -> Result<&'tcx FnAbi<'tcx, Ty<'tcx>>, &'tcx FnAbiError<'tcx>> {
2245 if self.sess.opts.optimize != OptLevel::No && self.sess.opts.incremental.is_none() {
2248 self.fn_abi_of_instance_raw(query)
2249 } else {
2250 self.fn_abi_of_instance_no_deduced_attrs(query)
2251 }
2252 }
2253}
2254
2255impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for DefId {
2258 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2259 if let Some(did) = self.as_local() {
2260 tcx.hir_attrs(tcx.local_def_id_to_hir_id(did))
2261 } else {
2262 tcx.attrs_for_def(self)
2263 }
2264 }
2265}
2266
2267impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for LocalDefId {
2268 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2269 tcx.hir_attrs(tcx.local_def_id_to_hir_id(self))
2270 }
2271}
2272
2273impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for hir::OwnerId {
2274 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2275 hir::attrs::HasAttrs::get_attrs(self.def_id, tcx)
2276 }
2277}
2278
2279impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for hir::HirId {
2280 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2281 tcx.hir_attrs(self)
2282 }
2283}
2284
2285pub fn provide(providers: &mut Providers) {
2286 closure::provide(providers);
2287 context::provide(providers);
2288 erase_regions::provide(providers);
2289 inhabitedness::provide(providers);
2290 util::provide(providers);
2291 print::provide(providers);
2292 super::util::bug::provide(providers);
2293 *providers = Providers {
2294 trait_impls_of: trait_def::trait_impls_of_provider,
2295 incoherent_impls: trait_def::incoherent_impls_provider,
2296 trait_impls_in_crate: trait_def::trait_impls_in_crate_provider,
2297 traits: trait_def::traits_provider,
2298 vtable_allocation: vtable::vtable_allocation_provider,
2299 ..*providers
2300 };
2301}
2302
2303#[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)]
2309pub struct CrateInherentImpls {
2310 pub inherent_impls: FxIndexMap<LocalDefId, Vec<DefId>>,
2311 pub incoherent_impls: FxIndexMap<SimplifiedType, Vec<LocalDefId>>,
2312}
2313
2314#[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)]
2315pub struct SymbolName<'tcx> {
2316 pub name: &'tcx str,
2318}
2319
2320impl<'tcx> SymbolName<'tcx> {
2321 pub fn new(tcx: TyCtxt<'tcx>, name: &str) -> SymbolName<'tcx> {
2322 SymbolName { name: tcx.arena.alloc_str(name) }
2323 }
2324}
2325
2326impl<'tcx> fmt::Display for SymbolName<'tcx> {
2327 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2328 fmt::Display::fmt(&self.name, fmt)
2329 }
2330}
2331
2332impl<'tcx> fmt::Debug for SymbolName<'tcx> {
2333 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2334 fmt::Display::fmt(&self.name, fmt)
2335 }
2336}
2337
2338#[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)]
2340pub struct DestructuredAdtConst<'tcx> {
2341 pub variant: VariantIdx,
2342 pub fields: &'tcx [ty::Const<'tcx>],
2343}
2344
2345pub fn fnc_typetrees<'tcx>(tcx: TyCtxt<'tcx>, fn_ty: Ty<'tcx>) -> FncTree {
2349 if tcx.sess.opts.unstable_opts.autodiff.contains(&rustc_session::config::AutoDiff::NoTT) {
2351 return FncTree { args: ::alloc::vec::Vec::new()vec![], ret: TypeTree::new() };
2352 }
2353
2354 if !fn_ty.is_fn() {
2356 return FncTree { args: ::alloc::vec::Vec::new()vec![], ret: TypeTree::new() };
2357 }
2358
2359 let fn_sig = fn_ty.fn_sig(tcx);
2361 let sig = tcx.instantiate_bound_regions_with_erased(fn_sig);
2362
2363 let mut args = ::alloc::vec::Vec::new()vec![];
2365 for ty in sig.inputs().iter() {
2366 let type_tree = typetree_from_ty(tcx, *ty);
2367 args.push(type_tree);
2368 }
2369
2370 let ret = typetree_from_ty(tcx, sig.output());
2372
2373 FncTree { args, ret }
2374}
2375
2376pub fn typetree_from_ty<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> TypeTree {
2379 let mut visited = Vec::new();
2380 typetree_from_ty_inner(tcx, ty, 0, &mut visited)
2381}
2382
2383const MAX_TYPETREE_DEPTH: usize = 6;
2386
2387fn typetree_from_ty_inner<'tcx>(
2389 tcx: TyCtxt<'tcx>,
2390 ty: Ty<'tcx>,
2391 depth: usize,
2392 visited: &mut Vec<Ty<'tcx>>,
2393) -> TypeTree {
2394 if depth >= MAX_TYPETREE_DEPTH {
2395 {
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:2395",
"rustc_middle::ty", ::tracing::Level::TRACE,
::tracing_core::__macro_support::Option::Some("compiler/rustc_middle/src/ty/mod.rs"),
::tracing_core::__macro_support::Option::Some(2395u32),
::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::TRACE <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::TRACE <=
::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!("typetree depth limit {0} reached for type: {1}",
MAX_TYPETREE_DEPTH, ty) as &dyn Value))])
});
} else { ; }
};trace!("typetree depth limit {} reached for type: {}", MAX_TYPETREE_DEPTH, ty);
2396 return TypeTree::new();
2397 }
2398
2399 if visited.contains(&ty) {
2400 return TypeTree::new();
2401 }
2402
2403 visited.push(ty);
2404 let result = typetree_from_ty_impl(tcx, ty, depth, visited);
2405 visited.pop();
2406 result
2407}
2408
2409fn typetree_from_ty_impl<'tcx>(
2411 tcx: TyCtxt<'tcx>,
2412 ty: Ty<'tcx>,
2413 depth: usize,
2414 visited: &mut Vec<Ty<'tcx>>,
2415) -> TypeTree {
2416 typetree_from_ty_impl_inner(tcx, ty, depth, visited, false)
2417}
2418
2419fn typetree_from_ty_impl_inner<'tcx>(
2421 tcx: TyCtxt<'tcx>,
2422 ty: Ty<'tcx>,
2423 depth: usize,
2424 visited: &mut Vec<Ty<'tcx>>,
2425 is_reference_target: bool,
2426) -> TypeTree {
2427 if ty.is_scalar() {
2428 let (kind, size) = if ty.is_integral() || ty.is_char() || ty.is_bool() {
2429 (Kind::Integer, ty.primitive_size(tcx).bytes_usize())
2430 } else if ty.is_floating_point() {
2431 match ty {
2432 x if x == tcx.types.f16 => (Kind::Half, 2),
2433 x if x == tcx.types.f32 => (Kind::Float, 4),
2434 x if x == tcx.types.f64 => (Kind::Double, 8),
2435 x if x == tcx.types.f128 => (Kind::F128, 16),
2436 _ => (Kind::Integer, 0),
2437 }
2438 } else {
2439 (Kind::Integer, 0)
2440 };
2441
2442 let offset = if is_reference_target && !ty.is_array() { 0 } else { -1 };
2445 return TypeTree(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Type { offset, size, kind, child: TypeTree::new() }]))vec![Type { offset, size, kind, child: TypeTree::new() }]);
2446 }
2447
2448 if ty.is_ref() || ty.is_raw_ptr() || ty.is_box() {
2449 let Some(inner_ty) = ty.builtin_deref(true) else {
2450 return TypeTree::new();
2451 };
2452
2453 let child = typetree_from_ty_impl_inner(tcx, inner_ty, depth + 1, visited, true);
2454 return TypeTree(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[Type {
offset: -1,
size: tcx.data_layout.pointer_size().bytes_usize(),
kind: Kind::Pointer,
child,
}]))vec![Type {
2455 offset: -1,
2456 size: tcx.data_layout.pointer_size().bytes_usize(),
2457 kind: Kind::Pointer,
2458 child,
2459 }]);
2460 }
2461
2462 if ty.is_array() {
2463 if let ty::Array(element_ty, len_const) = ty.kind() {
2464 let len = len_const.try_to_target_usize(tcx).unwrap_or(0);
2465 if len == 0 {
2466 return TypeTree::new();
2467 }
2468 let element_tree =
2469 typetree_from_ty_impl_inner(tcx, *element_ty, depth + 1, visited, false);
2470 let mut types = Vec::new();
2471 for elem_type in &element_tree.0 {
2472 types.push(Type {
2473 offset: -1,
2474 size: elem_type.size,
2475 kind: elem_type.kind,
2476 child: elem_type.child.clone(),
2477 });
2478 }
2479
2480 return TypeTree(types);
2481 }
2482 }
2483
2484 if ty.is_slice() {
2485 if let ty::Slice(element_ty) = ty.kind() {
2486 let element_tree =
2487 typetree_from_ty_impl_inner(tcx, *element_ty, depth + 1, visited, false);
2488 return element_tree;
2489 }
2490 }
2491
2492 if let ty::Tuple(tuple_types) = ty.kind() {
2493 if tuple_types.is_empty() {
2494 return TypeTree::new();
2495 }
2496
2497 let mut types = Vec::new();
2498 let mut current_offset = 0;
2499
2500 for tuple_ty in tuple_types.iter() {
2501 let element_tree =
2502 typetree_from_ty_impl_inner(tcx, tuple_ty, depth + 1, visited, false);
2503
2504 let element_layout = tcx
2505 .layout_of(ty::TypingEnv::fully_monomorphized().as_query_input(tuple_ty))
2506 .ok()
2507 .map(|layout| layout.size.bytes_usize())
2508 .unwrap_or(0);
2509
2510 for elem_type in &element_tree.0 {
2511 types.push(Type {
2512 offset: if elem_type.offset == -1 {
2513 current_offset as isize
2514 } else {
2515 current_offset as isize + elem_type.offset
2516 },
2517 size: elem_type.size,
2518 kind: elem_type.kind,
2519 child: elem_type.child.clone(),
2520 });
2521 }
2522
2523 current_offset += element_layout;
2524 }
2525
2526 return TypeTree(types);
2527 }
2528
2529 if let ty::Adt(adt_def, args) = ty.kind() {
2530 if adt_def.is_struct() {
2531 let struct_layout =
2532 tcx.layout_of(ty::TypingEnv::fully_monomorphized().as_query_input(ty));
2533 if let Ok(layout) = struct_layout {
2534 let mut types = Vec::new();
2535
2536 for (field_idx, field_def) in adt_def.all_fields().enumerate() {
2537 let field_ty = field_def.ty(tcx, args);
2538 let field_tree = typetree_from_ty_impl_inner(
2539 tcx,
2540 field_ty.skip_norm_wip(),
2541 depth + 1,
2542 visited,
2543 false,
2544 );
2545
2546 let field_offset = layout.fields.offset(field_idx).bytes_usize();
2547
2548 for elem_type in &field_tree.0 {
2549 types.push(Type {
2550 offset: if elem_type.offset == -1 {
2551 field_offset as isize
2552 } else {
2553 field_offset as isize + elem_type.offset
2554 },
2555 size: elem_type.size,
2556 kind: elem_type.kind,
2557 child: elem_type.child.clone(),
2558 });
2559 }
2560 }
2561
2562 return TypeTree(types);
2563 }
2564 }
2565 }
2566
2567 TypeTree::new()
2568}