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::{FxHashSet, FxIndexMap, FxIndexSet};
35use rustc_data_structures::intern::Interned;
36use rustc_data_structures::stable_hash::{StableHash, StableHashCtxt, StableHasher};
37use rustc_data_structures::steal::Steal;
38use rustc_data_structures::unord::{UnordMap, UnordSet};
39use rustc_errors::{Diag, ErrorGuaranteed, LintBuffer};
40use rustc_hir as hir;
41use rustc_hir::attrs::StrippedCfgItem;
42use rustc_hir::def::{CtorKind, CtorOf, DefKind, DocLinkResMap, LifetimeRes, Res};
43use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, LocalDefIdMap};
44use rustc_hir::definitions::PerParentDisambiguatorState;
45use rustc_hir::{LangItem, attrs as attr, find_attr};
46use rustc_index::IndexVec;
47use rustc_index::bit_set::BitMatrix;
48use rustc_macros::{
49 BlobDecodable, Decodable, Encodable, StableHash, TyDecodable, TyEncodable, TypeFoldable,
50 TypeVisitable, extension,
51};
52use rustc_serialize::{Decodable, Encodable};
53use rustc_session::config::OptLevel;
54pub use rustc_session::lint::RegisteredTools;
55use rustc_span::hygiene::MacroKind;
56use rustc_span::{DUMMY_SP, ExpnId, ExpnKind, Ident, Span, Symbol};
57use rustc_target::callconv::FnAbi;
58pub use rustc_type_ir::data_structures::{DelayedMap, DelayedSet};
59pub use rustc_type_ir::fast_reject::DeepRejectCtxt;
60#[allow(
61 hidden_glob_reexports,
62 rustc::usage_of_type_ir_inherent,
63 rustc::non_glob_import_of_type_ir_inherent
64)]
65use rustc_type_ir::inherent;
66pub use rustc_type_ir::relate::VarianceDiagInfo;
67pub use rustc_type_ir::solve::{CandidatePreferenceMode, SizedTraitKind, VisibleForLeakCheck};
68pub use rustc_type_ir::*;
69#[allow(hidden_glob_reexports, unused_imports)]
70use rustc_type_ir::{InferCtxtLike, Interner};
71use tracing::{debug, instrument, trace};
72pub use vtable::*;
73
74pub use self::closure::{
75 BorrowKind, CAPTURE_STRUCT_LOCAL, CaptureInfo, CapturedPlace, ClosureTypeInfo,
76 MinCaptureInformationMap, MinCaptureList, RootVariableMinCaptureList, UpvarCapture, UpvarId,
77 UpvarPath, analyze_coroutine_closure_captures, is_ancestor_or_same_capture,
78 place_to_string_for_capture,
79};
80pub use self::consts::{
81 AtomicOrdering, Const, ConstInt, ConstKind, ConstToValTreeResult, Expr, ExprKind,
82 LitToConstInput, ScalarInt, SimdAlign, UnevaluatedConst, ValTree, ValTreeKindExt, Value,
83 const_lit_matches_ty,
84};
85pub use self::context::{
86 CtxtInterners, CurrentGcx, FreeRegionInfo, GlobalCtxt, Lift, TyCtxt, TyCtxtFeed, tls,
87};
88pub use self::fold::*;
89pub use self::instance::{Instance, InstanceKind, ReifyReason};
90pub(crate) use self::list::RawList;
91pub use self::list::{List, ListWithCachedTypeInfo};
92pub use self::opaque_types::OpaqueTypeKey;
93pub use self::pattern::{Pattern, PatternKind};
94pub use self::predicate::{
95 AliasTerm, AliasTermKind, ArgOutlivesPredicate, Clause, ClauseKind, CoercePredicate,
96 ExistentialPredicate, ExistentialPredicateStableCmpExt, ExistentialProjection,
97 ExistentialTraitRef, HostEffectPredicate, NormalizesTo, OutlivesPredicate, PolyCoercePredicate,
98 PolyExistentialPredicate, PolyExistentialProjection, PolyExistentialTraitRef,
99 PolyProjectionPredicate, PolyRegionOutlivesPredicate, PolySubtypePredicate, PolyTraitPredicate,
100 PolyTraitRef, PolyTypeOutlivesPredicate, Predicate, PredicateKind, ProjectionPredicate,
101 RegionConstraint, RegionEqPredicate, RegionOutlivesPredicate, SubtypePredicate, TraitPredicate,
102 TraitRef, TypeOutlivesPredicate,
103};
104pub use self::region::{
105 EarlyParamRegion, LateParamRegion, LateParamRegionKind, Region, RegionKind, RegionVid,
106};
107pub use self::sty::{
108 AliasTy, AliasTyKind, Article, Binder, BoundConst, BoundRegion, BoundRegionKind, BoundTy,
109 BoundTyKind, BoundVariableKind, CanonicalPolyFnSig, CoroutineArgsExt, EarlyBinder, FnSig,
110 FnSigKind, InlineConstArgs, InlineConstArgsParts, ParamConst, ParamTy, PlaceholderConst,
111 PlaceholderRegion, PlaceholderType, PolyFnSig, TyKind, TypeAndMut, TypingMode,
112 TypingModeEqWrapper, Unnormalized, UpvarArgs,
113};
114pub use self::trait_def::TraitDef;
115pub use self::typeck_results::{
116 CanonicalUserType, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations, IsIdentity,
117 Rust2024IncompatiblePatInfo, TypeckResults, UserType, UserTypeAnnotationIndex, UserTypeKind,
118};
119use crate::error::{OpaqueHiddenTypeMismatch, TypeMismatchReason};
120use crate::metadata::{AmbigModChild, ModChild};
121use crate::middle::privacy::EffectiveVisibilities;
122use crate::mir::{Body, CoroutineLayout, CoroutineSavedLocal, SourceInfo};
123use crate::query::{IntoQueryKey, Providers};
124use crate::ty;
125use crate::ty::codec::{TyDecoder, TyEncoder};
126pub use crate::ty::diagnostics::*;
127use crate::ty::fast_reject::SimplifiedType;
128use crate::ty::layout::{FnAbiError, LayoutError};
129use crate::ty::util::Discr;
130use crate::ty::walk::TypeWalker;
131
132pub mod abstract_const;
133pub mod adjustment;
134pub mod cast;
135pub mod codec;
136pub mod error;
137pub mod fast_reject;
138pub mod inhabitedness;
139pub mod layout;
140pub mod normalize_erasing_regions;
141pub mod offload_meta;
142pub mod pattern;
143pub mod print;
144pub mod relate;
145pub mod significant_drop_order;
146pub mod trait_def;
147pub mod util;
148pub mod vtable;
149
150mod adt;
151mod assoc;
152mod closure;
153mod consts;
154mod context;
155mod diagnostics;
156mod elaborate_impl;
157mod erase_regions;
158mod fold;
159mod generic_args;
160mod generics;
161mod impls_ty;
162mod instance;
163mod intrinsic;
164mod list;
165mod opaque_types;
166mod predicate;
167mod region;
168mod structural_impls;
169#[allow(hidden_glob_reexports)]
170mod sty;
171mod typeck_results;
172mod visit;
173
174#[derive(#[automatically_derived]
impl ::core::fmt::Debug for ResolverGlobalCtxt {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["visibilities_for_hashing", "expn_that_defined",
"effective_visibilities", "macro_reachable_adts",
"extern_crate_map", "maybe_unused_trait_imports",
"module_children", "ambig_module_children", "glob_map",
"main_def", "trait_impls", "proc_macros",
"confused_type_with_std_module", "doc_link_resolutions",
"doc_link_traits_in_scope", "all_macro_rules",
"stripped_cfg_items"];
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)]
177pub struct ResolverGlobalCtxt {
178 pub visibilities_for_hashing: Vec<(LocalDefId, Visibility)>,
179 pub expn_that_defined: UnordMap<LocalDefId, ExpnId>,
181 pub effective_visibilities: EffectiveVisibilities,
182 pub macro_reachable_adts: FxIndexMap<LocalDefId, FxIndexSet<LocalDefId>>,
188 pub extern_crate_map: UnordMap<LocalDefId, CrateNum>,
189 pub maybe_unused_trait_imports: FxIndexSet<LocalDefId>,
190 pub module_children: LocalDefIdMap<Vec<ModChild>>,
191 pub ambig_module_children: LocalDefIdMap<Vec<AmbigModChild>>,
192 pub glob_map: FxIndexMap<LocalDefId, FxIndexSet<Symbol>>,
193 pub main_def: Option<MainDefinition>,
194 pub trait_impls: FxIndexMap<DefId, Vec<LocalDefId>>,
195 pub proc_macros: Vec<LocalDefId>,
198 pub confused_type_with_std_module: FxIndexMap<Span, Span>,
201 pub doc_link_resolutions: FxIndexMap<LocalDefId, DocLinkResMap>,
202 pub doc_link_traits_in_scope: FxIndexMap<LocalDefId, Vec<DefId>>,
203 pub all_macro_rules: UnordSet<Symbol>,
204 pub stripped_cfg_items: Vec<StrippedCfgItem>,
205}
206
207#[derive(#[automatically_derived]
impl ::core::fmt::Debug for PerOwnerResolverData {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"PerOwnerResolverData", "node_id_to_def_id",
&self.node_id_to_def_id, "id", &self.id, "def_id", &&self.def_id)
}
}Debug)]
208pub struct PerOwnerResolverData {
209 pub node_id_to_def_id: NodeMap<LocalDefId>,
210 pub id: ast::NodeId,
212 pub def_id: LocalDefId,
214}
215
216impl PerOwnerResolverData {
217 pub fn new(id: ast::NodeId, def_id: LocalDefId) -> PerOwnerResolverData {
218 PerOwnerResolverData { node_id_to_def_id: Default::default(), id, def_id }
219 }
220}
221
222#[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", "label_res_map",
"lifetimes_res_map", "extra_lifetime_params_map",
"next_node_id", "owners", "trait_map",
"lifetime_elision_allowed", "lint_buffer",
"delegation_infos", "disambiguators"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.partial_res_map, &self.import_res_map,
&self.label_res_map, &self.lifetimes_res_map,
&self.extra_lifetime_params_map, &self.next_node_id,
&self.owners, &self.trait_map,
&self.lifetime_elision_allowed, &self.lint_buffer,
&self.delegation_infos, &&self.disambiguators];
::core::fmt::Formatter::debug_struct_fields_finish(f,
"ResolverAstLowering", names, values)
}
}Debug)]
225pub struct ResolverAstLowering<'tcx> {
226 pub partial_res_map: NodeMap<hir::def::PartialRes>,
228 pub import_res_map: NodeMap<hir::def::PerNS<Option<Res<ast::NodeId>>>>,
230 pub label_res_map: NodeMap<ast::NodeId>,
232 pub lifetimes_res_map: NodeMap<LifetimeRes>,
234 pub extra_lifetime_params_map: NodeMap<Vec<(Ident, ast::NodeId, LifetimeRes)>>,
236
237 pub next_node_id: ast::NodeId,
238
239 pub owners: NodeMap<PerOwnerResolverData>,
240
241 pub trait_map: NodeMap<&'tcx [hir::TraitCandidate<'tcx>]>,
242 pub lifetime_elision_allowed: FxHashSet<ast::NodeId>,
244
245 pub lint_buffer: Steal<LintBuffer>,
247
248 pub delegation_infos: LocalDefIdMap<DelegationInfo>,
250
251 pub disambiguators: LocalDefIdMap<Steal<PerParentDisambiguatorState>>,
252}
253
254#[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_node", &&self.resolution_node)
}
}Debug)]
255pub struct DelegationInfo {
256 pub resolution_node: ast::NodeId,
259}
260
261#[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)]
262pub struct MainDefinition {
263 pub res: Res<ast::NodeId>,
264 pub is_import: bool,
265 pub span: Span,
266}
267
268impl MainDefinition {
269 pub fn opt_fn_def_id(self) -> Option<DefId> {
270 if let Res::Def(DefKind::Fn, def_id) = self.res { Some(def_id) } else { None }
271 }
272}
273
274#[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)]
275pub struct ImplTraitHeader<'tcx> {
276 pub trait_ref: ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>>,
277 pub polarity: ImplPolarity,
278 pub safety: hir::Safety,
279 pub constness: hir::Constness,
280}
281
282#[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)]
283#[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)]
284pub enum Asyncness {
285 Yes,
286 #[default]
287 No,
288}
289
290impl Asyncness {
291 pub fn is_async(self) -> bool {
292 #[allow(non_exhaustive_omitted_patterns)] match self {
Asyncness::Yes => true,
_ => false,
}matches!(self, Asyncness::Yes)
293 }
294}
295
296#[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)]
297pub enum Visibility<Id = LocalDefId> {
298 Public,
300 Restricted(Id),
302}
303
304impl Visibility {
305 pub fn to_string(self, def_id: LocalDefId, tcx: TyCtxt<'_>) -> String {
306 match self {
307 ty::Visibility::Restricted(restricted_id) => {
308 if restricted_id.is_top_level_module() {
309 "pub(crate)".to_string()
310 } else if restricted_id == tcx.parent_module_from_def_id(def_id).to_local_def_id() {
311 "pub(self)".to_string()
312 } else {
313 ::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!(
314 "pub(in crate{})",
315 tcx.def_path(restricted_id.to_def_id()).to_string_no_crate_verbose()
316 )
317 }
318 }
319 ty::Visibility::Public => "pub".to_string(),
320 }
321 }
322}
323
324#[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)]
325#[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)]
326pub struct ClosureSizeProfileData<'tcx> {
327 pub before_feature_tys: Ty<'tcx>,
329 pub after_feature_tys: Ty<'tcx>,
331}
332
333impl TyCtxt<'_> {
334 #[inline]
335 pub fn opt_parent(self, id: DefId) -> Option<DefId> {
336 self.def_key(id).parent.map(|index| DefId { index, ..id })
337 }
338
339 #[inline]
340 #[track_caller]
341 pub fn parent(self, id: DefId) -> DefId {
342 match self.opt_parent(id) {
343 Some(id) => id,
344 None => crate::util::bug::bug_fmt(format_args!("{0:?} doesn\'t have a parent", id))bug!("{id:?} doesn't have a parent"),
346 }
347 }
348
349 #[inline]
350 #[track_caller]
351 pub fn opt_local_parent(self, id: LocalDefId) -> Option<LocalDefId> {
352 self.opt_parent(id.to_def_id()).map(DefId::expect_local)
353 }
354
355 #[inline]
356 #[track_caller]
357 pub fn local_parent(self, id: impl Into<LocalDefId>) -> LocalDefId {
358 self.parent(id.into().to_def_id()).expect_local()
359 }
360
361 fn def_id_partial_cmp(self, lhs: DefId, rhs: DefId) -> Option<Ordering> {
365 if lhs.krate != rhs.krate {
367 return None;
368 }
369
370 let search = |mut start: DefId, finish: DefId, ord| {
374 while start.index != finish.index {
375 match self.opt_parent(start) {
376 Some(parent) => start.index = parent.index,
377 None => return None,
378 }
379 }
380 Some(ord)
381 };
382 match lhs.index.cmp(&rhs.index) {
383 Ordering::Equal => Some(Ordering::Equal),
384 Ordering::Less => search(rhs, lhs, Ordering::Greater),
385 Ordering::Greater => search(lhs, rhs, Ordering::Less),
386 }
387 }
388
389 pub fn is_descendant_of(self, descendant: DefId, ancestor: DefId) -> bool {
390 #[allow(non_exhaustive_omitted_patterns)] match self.def_id_partial_cmp(descendant,
ancestor) {
Some(Ordering::Less | Ordering::Equal) => true,
_ => false,
}matches!(
391 self.def_id_partial_cmp(descendant, ancestor),
392 Some(Ordering::Less | Ordering::Equal)
393 )
394 }
395}
396
397impl<Id> Visibility<Id> {
398 pub fn is_public(self) -> bool {
399 #[allow(non_exhaustive_omitted_patterns)] match self {
Visibility::Public => true,
_ => false,
}matches!(self, Visibility::Public)
400 }
401
402 pub fn map_id<OutId>(self, f: impl FnOnce(Id) -> OutId) -> Visibility<OutId> {
403 match self {
404 Visibility::Public => Visibility::Public,
405 Visibility::Restricted(id) => Visibility::Restricted(f(id)),
406 }
407 }
408}
409
410impl<Id: Into<DefId>> Visibility<Id> {
411 pub fn to_def_id(self) -> Visibility<DefId> {
412 self.map_id(Into::into)
413 }
414
415 pub fn is_accessible_from(self, module: impl Into<DefId>, tcx: TyCtxt<'_>) -> bool {
417 match self {
418 Visibility::Public => true,
420 Visibility::Restricted(id) => tcx.is_descendant_of(module.into(), id.into()),
421 }
422 }
423
424 pub fn partial_cmp(
425 self,
426 vis: Visibility<impl Into<DefId>>,
427 tcx: TyCtxt<'_>,
428 ) -> Option<Ordering> {
429 match (self, vis) {
430 (Visibility::Public, Visibility::Public) => Some(Ordering::Equal),
431 (Visibility::Public, Visibility::Restricted(_)) => Some(Ordering::Greater),
432 (Visibility::Restricted(_), Visibility::Public) => Some(Ordering::Less),
433 (Visibility::Restricted(lhs_id), Visibility::Restricted(rhs_id)) => {
434 let (lhs_id, rhs_id) = (lhs_id.into(), rhs_id.into());
435 tcx.def_id_partial_cmp(lhs_id, rhs_id)
436 }
437 }
438 }
439}
440
441impl<Id: Into<DefId> + Debug + Copy> Visibility<Id> {
442 #[track_caller]
444 pub fn greater_than(
445 self,
446 vis: Visibility<impl Into<DefId> + Debug + Copy>,
447 tcx: TyCtxt<'_>,
448 ) -> bool {
449 match self.partial_cmp(vis, tcx) {
450 Some(ord) => ord.is_gt(),
451 None => {
452 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:?}"));
453 false
454 }
455 }
456 }
457}
458
459impl Visibility<DefId> {
460 pub fn expect_local(self) -> Visibility {
461 self.map_id(|id| id.expect_local())
462 }
463
464 pub fn is_visible_locally(self) -> bool {
466 match self {
467 Visibility::Public => true,
468 Visibility::Restricted(def_id) => def_id.is_local(),
469 }
470 }
471}
472
473#[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)]
480pub struct CrateVariancesMap<'tcx> {
481 pub variances: DefIdMap<&'tcx [ty::Variance]>,
485}
486
487#[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)]
490pub struct CReaderCacheKey {
491 pub cnum: Option<CrateNum>,
492 pub pos: usize,
493}
494
495#[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)]
497#[rustc_diagnostic_item = "Ty"]
498#[rustc_pass_by_value]
499pub struct Ty<'tcx>(Interned<'tcx, WithCachedTypeInfo<TyKind<'tcx>>>);
500
501impl<'tcx> rustc_type_ir::inherent::IntoKind for Ty<'tcx> {
502 type Kind = TyKind<'tcx>;
503
504 fn kind(self) -> TyKind<'tcx> {
505 *self.kind()
506 }
507}
508
509impl<'tcx> rustc_type_ir::Flags for Ty<'tcx> {
510 fn flags(&self) -> TypeFlags {
511 self.0.flags
512 }
513
514 fn outer_exclusive_binder(&self) -> DebruijnIndex {
515 self.0.outer_exclusive_binder
516 }
517}
518
519#[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)]
526pub struct CratePredicatesMap<'tcx> {
527 pub predicates: DefIdMap<&'tcx [(Clause<'tcx>, Span)]>,
531}
532
533#[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)]
534pub struct Term<'tcx> {
535 ptr: NonNull<()>,
536 marker: PhantomData<(Ty<'tcx>, Const<'tcx>)>,
537}
538
539impl<'tcx> rustc_type_ir::inherent::Term<TyCtxt<'tcx>> for Term<'tcx> {}
540
541impl<'tcx> rustc_type_ir::inherent::IntoKind for Term<'tcx> {
542 type Kind = TermKind<'tcx>;
543
544 fn kind(self) -> Self::Kind {
545 self.kind()
546 }
547}
548
549unsafe impl<'tcx> rustc_data_structures::sync::DynSend for Term<'tcx> where
550 &'tcx (Ty<'tcx>, Const<'tcx>): rustc_data_structures::sync::DynSend
551{
552}
553unsafe impl<'tcx> rustc_data_structures::sync::DynSync for Term<'tcx> where
554 &'tcx (Ty<'tcx>, Const<'tcx>): rustc_data_structures::sync::DynSync
555{
556}
557unsafe impl<'tcx> Send for Term<'tcx> where &'tcx (Ty<'tcx>, Const<'tcx>): Send {}
558unsafe impl<'tcx> Sync for Term<'tcx> where &'tcx (Ty<'tcx>, Const<'tcx>): Sync {}
559
560impl Debug for Term<'_> {
561 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
562 match self.kind() {
563 TermKind::Ty(ty) => f.write_fmt(format_args!("Term::Ty({0:?})", ty))write!(f, "Term::Ty({ty:?})"),
564 TermKind::Const(ct) => f.write_fmt(format_args!("Term::Const({0:?})", ct))write!(f, "Term::Const({ct:?})"),
565 }
566 }
567}
568
569impl<'tcx> From<Ty<'tcx>> for Term<'tcx> {
570 fn from(ty: Ty<'tcx>) -> Self {
571 TermKind::Ty(ty).pack()
572 }
573}
574
575impl<'tcx> From<Const<'tcx>> for Term<'tcx> {
576 fn from(c: Const<'tcx>) -> Self {
577 TermKind::Const(c).pack()
578 }
579}
580
581impl<'tcx> StableHash for Term<'tcx> {
582 fn stable_hash<Hcx: StableHashCtxt>(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
583 self.kind().stable_hash(hcx, hasher);
584 }
585}
586
587impl<'tcx> TypeFoldable<TyCtxt<'tcx>> for Term<'tcx> {
588 fn try_fold_with<F: FallibleTypeFolder<TyCtxt<'tcx>>>(
589 self,
590 folder: &mut F,
591 ) -> Result<Self, F::Error> {
592 match self.kind() {
593 ty::TermKind::Ty(ty) => ty.try_fold_with(folder).map(Into::into),
594 ty::TermKind::Const(ct) => ct.try_fold_with(folder).map(Into::into),
595 }
596 }
597
598 fn fold_with<F: TypeFolder<TyCtxt<'tcx>>>(self, folder: &mut F) -> Self {
599 match self.kind() {
600 ty::TermKind::Ty(ty) => ty.fold_with(folder).into(),
601 ty::TermKind::Const(ct) => ct.fold_with(folder).into(),
602 }
603 }
604}
605
606impl<'tcx> TypeVisitable<TyCtxt<'tcx>> for Term<'tcx> {
607 fn visit_with<V: TypeVisitor<TyCtxt<'tcx>>>(&self, visitor: &mut V) -> V::Result {
608 match self.kind() {
609 ty::TermKind::Ty(ty) => ty.visit_with(visitor),
610 ty::TermKind::Const(ct) => ct.visit_with(visitor),
611 }
612 }
613}
614
615impl<'tcx, E: TyEncoder<'tcx>> Encodable<E> for Term<'tcx> {
616 fn encode(&self, e: &mut E) {
617 self.kind().encode(e)
618 }
619}
620
621impl<'tcx, D: TyDecoder<'tcx>> Decodable<D> for Term<'tcx> {
622 fn decode(d: &mut D) -> Self {
623 let res: TermKind<'tcx> = Decodable::decode(d);
624 res.pack()
625 }
626}
627
628impl<'tcx> Term<'tcx> {
629 #[inline]
630 pub fn kind(self) -> TermKind<'tcx> {
631 let ptr =
632 unsafe { self.ptr.map_addr(|addr| NonZero::new_unchecked(addr.get() & !TAG_MASK)) };
633 unsafe {
637 match self.ptr.addr().get() & TAG_MASK {
638 TYPE_TAG => TermKind::Ty(Ty(Interned::new_unchecked(
639 ptr.cast::<WithCachedTypeInfo<ty::TyKind<'tcx>>>().as_ref(),
640 ))),
641 CONST_TAG => TermKind::Const(ty::Const(Interned::new_unchecked(
642 ptr.cast::<WithCachedTypeInfo<ty::ConstKind<'tcx>>>().as_ref(),
643 ))),
644 _ => core::intrinsics::unreachable(),
645 }
646 }
647 }
648
649 pub fn as_type(&self) -> Option<Ty<'tcx>> {
650 if let TermKind::Ty(ty) = self.kind() { Some(ty) } else { None }
651 }
652
653 pub fn expect_type(&self) -> Ty<'tcx> {
654 self.as_type().expect("expected a type, but found a const")
655 }
656
657 pub fn as_const(&self) -> Option<Const<'tcx>> {
658 if let TermKind::Const(c) = self.kind() { Some(c) } else { None }
659 }
660
661 pub fn expect_const(&self) -> Const<'tcx> {
662 self.as_const().expect("expected a const, but found a type")
663 }
664
665 pub fn into_arg(self) -> GenericArg<'tcx> {
666 match self.kind() {
667 TermKind::Ty(ty) => ty.into(),
668 TermKind::Const(c) => c.into(),
669 }
670 }
671
672 pub fn to_alias_term(self, tcx: TyCtxt<'tcx>) -> Option<AliasTerm<'tcx>> {
673 match self.kind() {
674 TermKind::Ty(ty) => match *ty.kind() {
675 ty::Alias(alias_ty) => Some(alias_ty.into()),
676 _ => None,
677 },
678 TermKind::Const(ct) => match ct.kind() {
679 ConstKind::Unevaluated(uv) => Some(AliasTerm::from_unevaluated_const(tcx, uv)),
680 _ => None,
681 },
682 }
683 }
684
685 pub fn is_infer(&self) -> bool {
686 match self.kind() {
687 TermKind::Ty(ty) => ty.is_ty_var(),
688 TermKind::Const(ct) => ct.is_ct_infer(),
689 }
690 }
691
692 pub fn is_trivially_wf(&self, tcx: TyCtxt<'tcx>) -> bool {
693 match self.kind() {
694 TermKind::Ty(ty) => ty.is_trivially_wf(tcx),
695 TermKind::Const(ct) => ct.is_trivially_wf(),
696 }
697 }
698
699 pub fn walk(self) -> TypeWalker<TyCtxt<'tcx>> {
710 TypeWalker::new(self.into())
711 }
712}
713
714const TAG_MASK: usize = 0b11;
715const TYPE_TAG: usize = 0b00;
716const CONST_TAG: usize = 0b01;
717
718impl<'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>)]
719impl<'tcx> TermKind<'tcx> {
720 #[inline]
721 fn pack(self) -> Term<'tcx> {
722 let (tag, ptr) = match self {
723 TermKind::Ty(ty) => {
724 assert_eq!(align_of_val(&*ty.0.0) & TAG_MASK, 0);
726 (TYPE_TAG, NonNull::from(ty.0.0).cast())
727 }
728 TermKind::Const(ct) => {
729 assert_eq!(align_of_val(&*ct.0.0) & TAG_MASK, 0);
731 (CONST_TAG, NonNull::from(ct.0.0).cast())
732 }
733 };
734
735 Term { ptr: ptr.map_addr(|addr| addr | tag), marker: PhantomData }
736 }
737}
738
739#[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)]
759pub struct InstantiatedPredicates<'tcx> {
760 pub predicates: Vec<Unnormalized<'tcx, Clause<'tcx>>>,
761 pub spans: Vec<Span>,
762}
763
764impl<'tcx> InstantiatedPredicates<'tcx> {
765 pub fn empty() -> InstantiatedPredicates<'tcx> {
766 InstantiatedPredicates { predicates: ::alloc::vec::Vec::new()vec![], spans: ::alloc::vec::Vec::new()vec![] }
767 }
768
769 pub fn is_empty(&self) -> bool {
770 self.predicates.is_empty()
771 }
772
773 pub fn iter(&self) -> <&Self as IntoIterator>::IntoIter {
774 self.into_iter()
775 }
776}
777
778impl<'tcx> IntoIterator for InstantiatedPredicates<'tcx> {
779 type Item = (Unnormalized<'tcx, Clause<'tcx>>, Span);
780
781 type IntoIter = std::iter::Zip<
782 std::vec::IntoIter<Unnormalized<'tcx, Clause<'tcx>>>,
783 std::vec::IntoIter<Span>,
784 >;
785
786 fn into_iter(self) -> Self::IntoIter {
787 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());
788 std::iter::zip(self.predicates, self.spans)
789 }
790}
791
792impl<'a, 'tcx> IntoIterator for &'a InstantiatedPredicates<'tcx> {
793 type Item = (Unnormalized<'tcx, Clause<'tcx>>, Span);
794
795 type IntoIter = std::iter::Zip<
796 std::iter::Copied<std::slice::Iter<'a, Unnormalized<'tcx, Clause<'tcx>>>>,
797 std::iter::Copied<std::slice::Iter<'a, 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.iter().copied(), self.spans.iter().copied())
803 }
804}
805
806#[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)]
807pub struct ProvisionalHiddenType<'tcx> {
808 pub span: Span,
822
823 pub ty: Ty<'tcx>,
836}
837
838#[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)]
840pub enum DefiningScopeKind {
841 HirTypeck,
846 MirBorrowck,
847}
848
849impl<'tcx> ProvisionalHiddenType<'tcx> {
850 pub fn new_error(tcx: TyCtxt<'tcx>, guar: ErrorGuaranteed) -> ProvisionalHiddenType<'tcx> {
851 ProvisionalHiddenType { span: DUMMY_SP, ty: Ty::new_error(tcx, guar) }
852 }
853
854 pub fn build_mismatch_error(
855 &self,
856 other: &Self,
857 tcx: TyCtxt<'tcx>,
858 ) -> Result<Diag<'tcx>, ErrorGuaranteed> {
859 (self.ty, other.ty).error_reported()?;
860 let sub_diag = if self.span == other.span {
862 TypeMismatchReason::ConflictType { span: self.span }
863 } else {
864 TypeMismatchReason::PreviousUse { span: self.span }
865 };
866 Ok(tcx.dcx().create_err(OpaqueHiddenTypeMismatch {
867 self_ty: self.ty,
868 other_ty: other.ty,
869 other_span: other.span,
870 sub: sub_diag,
871 }))
872 }
873
874 x;#[instrument(level = "debug", skip(tcx), ret)]
875 pub fn remap_generic_params_to_declaration_params(
876 self,
877 opaque_type_key: OpaqueTypeKey<'tcx>,
878 tcx: TyCtxt<'tcx>,
879 defining_scope_kind: DefiningScopeKind,
880 ) -> DefinitionSiteHiddenType<'tcx> {
881 let OpaqueTypeKey { def_id, args } = opaque_type_key;
882
883 let id_args = GenericArgs::identity_for_item(tcx, def_id);
890 debug!(?id_args);
891
892 let map = args.iter().zip(id_args).collect();
896 debug!("map = {:#?}", map);
897
898 let ty = match defining_scope_kind {
904 DefiningScopeKind::HirTypeck => {
905 fold_regions(tcx, self.ty, |_, _| tcx.lifetimes.re_erased)
906 }
907 DefiningScopeKind::MirBorrowck => self.ty,
908 };
909 let result_ty = ty.fold_with(&mut opaque_types::ReverseMapper::new(tcx, map, self.span));
910 if cfg!(debug_assertions) && matches!(defining_scope_kind, DefiningScopeKind::HirTypeck) {
911 assert_eq!(result_ty, fold_regions(tcx, result_ty, |_, _| tcx.lifetimes.re_erased));
912 }
913 DefinitionSiteHiddenType { span: self.span, ty: ty::EarlyBinder::bind(result_ty) }
914 }
915}
916
917#[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)]
918pub struct DefinitionSiteHiddenType<'tcx> {
919 pub span: Span,
932
933 pub ty: ty::EarlyBinder<'tcx, Ty<'tcx>>,
935}
936
937impl<'tcx> DefinitionSiteHiddenType<'tcx> {
938 pub fn new_error(tcx: TyCtxt<'tcx>, guar: ErrorGuaranteed) -> DefinitionSiteHiddenType<'tcx> {
939 DefinitionSiteHiddenType {
940 span: DUMMY_SP,
941 ty: ty::EarlyBinder::bind(Ty::new_error(tcx, guar)),
942 }
943 }
944
945 pub fn build_mismatch_error(
946 &self,
947 other: &Self,
948 tcx: TyCtxt<'tcx>,
949 ) -> Result<Diag<'tcx>, ErrorGuaranteed> {
950 let self_ty = self.ty.instantiate_identity().skip_norm_wip();
951 let other_ty = other.ty.instantiate_identity().skip_norm_wip();
952 (self_ty, other_ty).error_reported()?;
953 let sub_diag = if self.span == other.span {
955 TypeMismatchReason::ConflictType { span: self.span }
956 } else {
957 TypeMismatchReason::PreviousUse { span: self.span }
958 };
959 Ok(tcx.dcx().create_err(OpaqueHiddenTypeMismatch {
960 self_ty,
961 other_ty,
962 other_span: other.span,
963 sub: sub_diag,
964 }))
965 }
966}
967
968pub type Clauses<'tcx> = &'tcx ListWithCachedTypeInfo<Clause<'tcx>>;
969
970impl<'tcx> rustc_type_ir::Flags for Clauses<'tcx> {
971 fn flags(&self) -> TypeFlags {
972 (**self).flags()
973 }
974
975 fn outer_exclusive_binder(&self) -> DebruijnIndex {
976 (**self).outer_exclusive_binder()
977 }
978}
979
980#[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)]
986#[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)]
987pub struct ParamEnv<'tcx> {
988 caller_bounds: Clauses<'tcx>,
994}
995
996impl<'tcx> rustc_type_ir::inherent::ParamEnv<TyCtxt<'tcx>> for ParamEnv<'tcx> {
997 fn caller_bounds(self) -> impl inherent::SliceLike<Item = ty::Clause<'tcx>> {
998 self.caller_bounds()
999 }
1000}
1001
1002impl<'tcx> ParamEnv<'tcx> {
1003 #[inline]
1010 pub fn empty() -> Self {
1011 Self::new(ListWithCachedTypeInfo::empty())
1012 }
1013
1014 #[inline]
1015 pub fn caller_bounds(self) -> Clauses<'tcx> {
1016 self.caller_bounds
1017 }
1018
1019 #[inline]
1021 pub fn new(caller_bounds: Clauses<'tcx>) -> Self {
1022 ParamEnv { caller_bounds }
1023 }
1024
1025 pub fn and<T: TypeVisitable<TyCtxt<'tcx>>>(self, value: T) -> ParamEnvAnd<'tcx, T> {
1027 ParamEnvAnd { param_env: self, value }
1028 }
1029}
1030
1031#[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)]
1032#[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)]
1033pub struct ParamEnvAnd<'tcx, T> {
1034 pub param_env: ParamEnv<'tcx>,
1035 pub value: T,
1036}
1037
1038#[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)]
1049#[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)]
1050pub struct TypingEnv<'tcx> {
1051 #[type_foldable(identity)]
1052 #[type_visitable(ignore)]
1053 typing_mode: TypingModeEqWrapper<'tcx>,
1054 pub param_env: ParamEnv<'tcx>,
1055}
1056
1057impl<'tcx> TypingEnv<'tcx> {
1058 pub fn new(param_env: ParamEnv<'tcx>, typing_mode: TypingMode<'tcx>) -> Self {
1059 Self { typing_mode: TypingModeEqWrapper(typing_mode), param_env }
1060 }
1061
1062 pub fn typing_mode(&self) -> TypingMode<'tcx> {
1063 self.typing_mode.0
1064 }
1065
1066 pub fn fully_monomorphized() -> TypingEnv<'tcx> {
1074 Self::new(ParamEnv::empty(), TypingMode::PostAnalysis)
1075 }
1076
1077 pub fn non_body_analysis(
1083 tcx: TyCtxt<'tcx>,
1084 def_id: impl IntoQueryKey<DefId>,
1085 ) -> TypingEnv<'tcx> {
1086 let def_id = def_id.into_query_key();
1087 Self::new(tcx.param_env(def_id), TypingMode::non_body_analysis().into())
1088 }
1089
1090 pub fn post_analysis(tcx: TyCtxt<'tcx>, def_id: impl IntoQueryKey<DefId>) -> TypingEnv<'tcx> {
1091 let def_id = def_id.into_query_key();
1092 tcx.typing_env_normalized_for_post_analysis(def_id)
1093 }
1094
1095 pub fn with_post_analysis_normalized(self, tcx: TyCtxt<'tcx>) -> TypingEnv<'tcx> {
1098 let TypingEnv { typing_mode, param_env } = self;
1099
1100 let param_env = if tcx.next_trait_solver_globally() {
1103 param_env
1104 } else {
1105 match typing_mode.0.assert_not_erased() {
1106 TypingMode::Coherence
1107 | TypingMode::Analysis { .. }
1108 | TypingMode::Borrowck { .. }
1109 | TypingMode::PostBorrowckAnalysis { .. } => {}
1110 TypingMode::PostAnalysis => return self,
1111 }
1112
1113 ParamEnv::new(tcx.reveal_opaque_types_in_bounds(param_env.caller_bounds()))
1114 };
1115 TypingEnv { typing_mode: TypingModeEqWrapper(TypingMode::PostAnalysis), param_env }
1116 }
1117
1118 pub fn as_query_input<T>(self, value: T) -> PseudoCanonicalInput<'tcx, T>
1123 where
1124 T: TypeVisitable<TyCtxt<'tcx>>,
1125 {
1126 PseudoCanonicalInput { typing_env: self, value }
1139 }
1140}
1141
1142#[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)]
1152#[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)]
1153pub struct PseudoCanonicalInput<'tcx, T> {
1154 pub typing_env: TypingEnv<'tcx>,
1155 pub value: T,
1156}
1157
1158#[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)]
1159pub struct Destructor {
1160 pub did: DefId,
1162}
1163
1164#[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)]
1166pub struct AsyncDestructor {
1167 pub impl_did: DefId,
1169}
1170
1171#[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)]
1172pub struct VariantFlags(u8);
1173impl 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! {
1174 impl VariantFlags: u8 {
1175 const NO_VARIANT_FLAGS = 0;
1176 const IS_FIELD_LIST_NON_EXHAUSTIVE = 1 << 0;
1178 }
1179}
1180impl ::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 }
1181
1182#[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)]
1184pub struct VariantDef {
1185 pub def_id: DefId,
1188 pub ctor: Option<(CtorKind, DefId)>,
1191 pub name: Symbol,
1193 pub discr: VariantDiscr,
1195 pub fields: IndexVec<FieldIdx, FieldDef>,
1197 tainted: Option<ErrorGuaranteed>,
1199 flags: VariantFlags,
1201}
1202
1203impl VariantDef {
1204 #[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(1220u32),
::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")]
1221 pub fn new(
1222 name: Symbol,
1223 variant_did: Option<DefId>,
1224 ctor: Option<(CtorKind, DefId)>,
1225 discr: VariantDiscr,
1226 fields: IndexVec<FieldIdx, FieldDef>,
1227 parent_did: DefId,
1228 recover_tainted: Option<ErrorGuaranteed>,
1229 is_field_list_non_exhaustive: bool,
1230 ) -> Self {
1231 let mut flags = VariantFlags::NO_VARIANT_FLAGS;
1232 if is_field_list_non_exhaustive {
1233 flags |= VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE;
1234 }
1235
1236 VariantDef {
1237 def_id: variant_did.unwrap_or(parent_did),
1238 ctor,
1239 name,
1240 discr,
1241 fields,
1242 flags,
1243 tainted: recover_tainted,
1244 }
1245 }
1246
1247 #[inline]
1253 pub fn is_field_list_non_exhaustive(&self) -> bool {
1254 self.flags.intersects(VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE)
1255 }
1256
1257 #[inline]
1260 pub fn field_list_has_applicable_non_exhaustive(&self) -> bool {
1261 self.is_field_list_non_exhaustive() && !self.def_id.is_local()
1262 }
1263
1264 pub fn ident(&self, tcx: TyCtxt<'_>) -> Ident {
1266 Ident::new(self.name, tcx.def_ident_span(self.def_id).unwrap())
1267 }
1268
1269 #[inline]
1271 pub fn has_errors(&self) -> Result<(), ErrorGuaranteed> {
1272 self.tainted.map_or(Ok(()), Err)
1273 }
1274
1275 #[inline]
1276 pub fn ctor_kind(&self) -> Option<CtorKind> {
1277 self.ctor.map(|(kind, _)| kind)
1278 }
1279
1280 #[inline]
1281 pub fn ctor_def_id(&self) -> Option<DefId> {
1282 self.ctor.map(|(_, def_id)| def_id)
1283 }
1284
1285 #[inline]
1289 pub fn single_field(&self) -> &FieldDef {
1290 if !(self.fields.len() == 1) {
::core::panicking::panic("assertion failed: self.fields.len() == 1")
};assert!(self.fields.len() == 1);
1291
1292 &self.fields[FieldIdx::ZERO]
1293 }
1294
1295 #[inline]
1297 pub fn tail_opt(&self) -> Option<&FieldDef> {
1298 self.fields.raw.last()
1299 }
1300
1301 #[inline]
1307 pub fn tail(&self) -> &FieldDef {
1308 self.tail_opt().expect("expected unsized ADT to have a tail field")
1309 }
1310
1311 pub fn has_unsafe_fields(&self) -> bool {
1313 self.fields.iter().any(|x| x.safety.is_unsafe())
1314 }
1315}
1316
1317impl PartialEq for VariantDef {
1318 #[inline]
1319 fn eq(&self, other: &Self) -> bool {
1320 let Self {
1328 def_id: lhs_def_id,
1329 ctor: _,
1330 name: _,
1331 discr: _,
1332 fields: _,
1333 flags: _,
1334 tainted: _,
1335 } = &self;
1336 let Self {
1337 def_id: rhs_def_id,
1338 ctor: _,
1339 name: _,
1340 discr: _,
1341 fields: _,
1342 flags: _,
1343 tainted: _,
1344 } = other;
1345
1346 let res = lhs_def_id == rhs_def_id;
1347
1348 if truecfg!(debug_assertions) && res {
1350 let deep = self.ctor == other.ctor
1351 && self.name == other.name
1352 && self.discr == other.discr
1353 && self.fields == other.fields
1354 && self.flags == other.flags;
1355 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");
1356 }
1357
1358 res
1359 }
1360}
1361
1362impl Eq for VariantDef {}
1363
1364impl Hash for VariantDef {
1365 #[inline]
1366 fn hash<H: Hasher>(&self, s: &mut H) {
1367 let Self { def_id, ctor: _, name: _, discr: _, fields: _, flags: _, tainted: _ } = &self;
1375 def_id.hash(s)
1376 }
1377}
1378
1379#[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)]
1380pub enum VariantDiscr {
1381 Explicit(DefId),
1384
1385 Relative(u32),
1390}
1391
1392#[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)]
1393pub struct FieldDef {
1394 pub did: DefId,
1395 pub name: Symbol,
1396 pub vis: Visibility<DefId>,
1397 pub safety: hir::Safety,
1398 pub value: Option<DefId>,
1399}
1400
1401impl PartialEq for FieldDef {
1402 #[inline]
1403 fn eq(&self, other: &Self) -> bool {
1404 let Self { did: lhs_did, name: _, vis: _, safety: _, value: _ } = &self;
1412
1413 let Self { did: rhs_did, name: _, vis: _, safety: _, value: _ } = other;
1414
1415 let res = lhs_did == rhs_did;
1416
1417 if truecfg!(debug_assertions) && res {
1419 let deep =
1420 self.name == other.name && self.vis == other.vis && self.safety == other.safety;
1421 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");
1422 }
1423
1424 res
1425 }
1426}
1427
1428impl Eq for FieldDef {}
1429
1430impl Hash for FieldDef {
1431 #[inline]
1432 fn hash<H: Hasher>(&self, s: &mut H) {
1433 let Self { did, name: _, vis: _, safety: _, value: _ } = &self;
1441
1442 did.hash(s)
1443 }
1444}
1445
1446impl<'tcx> FieldDef {
1447 pub fn ty(
1450 &self,
1451 tcx: TyCtxt<'tcx>,
1452 args: GenericArgsRef<'tcx>,
1453 ) -> Unnormalized<'tcx, Ty<'tcx>> {
1454 tcx.type_of(self.did).instantiate(tcx, args)
1455 }
1456
1457 pub fn ident(&self, tcx: TyCtxt<'_>) -> Ident {
1459 Ident::new(self.name, tcx.def_ident_span(self.did).unwrap())
1460 }
1461}
1462
1463#[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)]
1464pub enum ImplOverlapKind {
1465 Permitted {
1467 marker: bool,
1469 },
1470}
1471
1472#[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)]
1475pub enum ImplTraitInTraitData {
1476 Trait { fn_def_id: DefId, opaque_def_id: DefId },
1477 Impl { fn_def_id: DefId },
1478}
1479
1480impl<'tcx> TyCtxt<'tcx> {
1481 pub fn typeck_body(self, body: hir::BodyId) -> &'tcx TypeckResults<'tcx> {
1482 self.typeck(self.hir_body_owner_def_id(body))
1483 }
1484
1485 pub fn provided_trait_methods(self, id: DefId) -> impl 'tcx + Iterator<Item = &'tcx AssocItem> {
1486 self.associated_items(id)
1487 .in_definition_order()
1488 .filter(move |item| item.is_fn() && item.defaultness(self).has_value())
1489 }
1490
1491 pub fn repr_options_of_def(self, did: LocalDefId) -> ReprOptions {
1492 let mut flags = ReprFlags::empty();
1493 let mut size = None;
1494 let mut max_align: Option<Align> = None;
1495 let mut min_pack: Option<Align> = None;
1496
1497 let mut field_shuffle_seed = self.def_path_hash(did.to_def_id()).0.to_smaller_hash();
1500
1501 if let Some(user_seed) = self.sess.opts.unstable_opts.layout_seed {
1505 field_shuffle_seed ^= user_seed;
1506 }
1507
1508 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
1509 )
1510 .map(|elt| match elt {
1511 Some(n) => ScalableElt::ElementCount(*n),
1512 None => ScalableElt::Container,
1513 });
1514 if elt.is_some() {
1515 flags.insert(ReprFlags::IS_SCALABLE);
1516 }
1517 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) {
1518 for (r, _) in reprs {
1519 flags.insert(match *r {
1520 attr::ReprRust => ReprFlags::empty(),
1521 attr::ReprC => ReprFlags::IS_C,
1522 attr::ReprPacked(pack) => {
1523 min_pack = Some(if let Some(min_pack) = min_pack {
1524 min_pack.min(pack)
1525 } else {
1526 pack
1527 });
1528 ReprFlags::empty()
1529 }
1530 attr::ReprTransparent => ReprFlags::IS_TRANSPARENT,
1531 attr::ReprSimd => ReprFlags::IS_SIMD,
1532 attr::ReprInt(i) => {
1533 size = Some(match i {
1534 attr::IntType::SignedInt(x) => match x {
1535 ast::IntTy::Isize => IntegerType::Pointer(true),
1536 ast::IntTy::I8 => IntegerType::Fixed(Integer::I8, true),
1537 ast::IntTy::I16 => IntegerType::Fixed(Integer::I16, true),
1538 ast::IntTy::I32 => IntegerType::Fixed(Integer::I32, true),
1539 ast::IntTy::I64 => IntegerType::Fixed(Integer::I64, true),
1540 ast::IntTy::I128 => IntegerType::Fixed(Integer::I128, true),
1541 },
1542 attr::IntType::UnsignedInt(x) => match x {
1543 ast::UintTy::Usize => IntegerType::Pointer(false),
1544 ast::UintTy::U8 => IntegerType::Fixed(Integer::I8, false),
1545 ast::UintTy::U16 => IntegerType::Fixed(Integer::I16, false),
1546 ast::UintTy::U32 => IntegerType::Fixed(Integer::I32, false),
1547 ast::UintTy::U64 => IntegerType::Fixed(Integer::I64, false),
1548 ast::UintTy::U128 => IntegerType::Fixed(Integer::I128, false),
1549 },
1550 });
1551 ReprFlags::empty()
1552 }
1553 attr::ReprAlign(align) => {
1554 max_align = max_align.max(Some(align));
1555 ReprFlags::empty()
1556 }
1557 });
1558 }
1559 }
1560
1561 if self.sess.opts.unstable_opts.randomize_layout {
1564 flags.insert(ReprFlags::RANDOMIZE_LAYOUT);
1565 }
1566
1567 let is_box = self.is_lang_item(did.to_def_id(), LangItem::OwnedBox);
1570
1571 if is_box {
1573 flags.insert(ReprFlags::IS_LINEAR);
1574 }
1575
1576 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(..)) {
1578 flags.insert(ReprFlags::PASS_INDIRECTLY_IN_NON_RUSTIC_ABIS);
1579 }
1580
1581 ReprOptions {
1582 int: size,
1583 align: max_align,
1584 pack: min_pack,
1585 flags,
1586 field_shuffle_seed,
1587 scalable: elt,
1588 }
1589 }
1590
1591 pub fn opt_item_name(self, def_id: impl IntoQueryKey<DefId>) -> Option<Symbol> {
1593 let def_id = def_id.into_query_key();
1594 if let Some(cnum) = def_id.as_crate_root() {
1595 Some(self.crate_name(cnum))
1596 } else {
1597 let def_key = self.def_key(def_id);
1598 match def_key.disambiguated_data.data {
1599 rustc_hir::definitions::DefPathData::Ctor => self
1601 .opt_item_name(DefId { krate: def_id.krate, index: def_key.parent.unwrap() }),
1602 _ => def_key.get_opt_name(),
1603 }
1604 }
1605 }
1606
1607 pub fn item_name(self, id: impl IntoQueryKey<DefId>) -> Symbol {
1614 let id = id.into_query_key();
1615 self.opt_item_name(id).unwrap_or_else(|| {
1616 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));
1617 })
1618 }
1619
1620 pub fn opt_item_ident(self, def_id: impl IntoQueryKey<DefId>) -> Option<Ident> {
1624 let def_id = def_id.into_query_key();
1625 let def = self.opt_item_name(def_id)?;
1626 let span = self
1627 .def_ident_span(def_id)
1628 .unwrap_or_else(|| crate::util::bug::bug_fmt(format_args!("missing ident span for {0:?}",
def_id))bug!("missing ident span for {def_id:?}"));
1629 Some(Ident::new(def, span))
1630 }
1631
1632 pub fn item_ident(self, def_id: impl IntoQueryKey<DefId>) -> Ident {
1636 let def_id = def_id.into_query_key();
1637 self.opt_item_ident(def_id).unwrap_or_else(|| {
1638 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));
1639 })
1640 }
1641
1642 pub fn opt_associated_item(self, def_id: DefId) -> Option<AssocItem> {
1643 if let DefKind::AssocConst { .. } | DefKind::AssocFn | DefKind::AssocTy =
1644 self.def_kind(def_id)
1645 {
1646 Some(self.associated_item(def_id))
1647 } else {
1648 None
1649 }
1650 }
1651
1652 pub fn opt_rpitit_info(self, def_id: DefId) -> Option<ImplTraitInTraitData> {
1656 if let DefKind::AssocTy = self.def_kind(def_id)
1657 && let AssocKind::Type { data: AssocTypeData::Rpitit(rpitit_info) } =
1658 self.associated_item(def_id).kind
1659 {
1660 Some(rpitit_info)
1661 } else {
1662 None
1663 }
1664 }
1665
1666 pub fn find_field_index(self, ident: Ident, variant: &VariantDef) -> Option<FieldIdx> {
1667 variant.fields.iter_enumerated().find_map(|(i, field)| {
1668 self.hygienic_eq(ident, field.ident(self), variant.def_id).then_some(i)
1669 })
1670 }
1671
1672 x;#[instrument(level = "debug", skip(self), ret)]
1675 pub fn impls_are_allowed_to_overlap(
1676 self,
1677 def_id1: DefId,
1678 def_id2: DefId,
1679 ) -> Option<ImplOverlapKind> {
1680 let impl1 = self.impl_trait_header(def_id1);
1681 let impl2 = self.impl_trait_header(def_id2);
1682
1683 let trait_ref1 = impl1.trait_ref.skip_binder();
1684 let trait_ref2 = impl2.trait_ref.skip_binder();
1685
1686 if trait_ref1.references_error() || trait_ref2.references_error() {
1689 return Some(ImplOverlapKind::Permitted { marker: false });
1690 }
1691
1692 match (impl1.polarity, impl2.polarity) {
1693 (ImplPolarity::Reservation, _) | (_, ImplPolarity::Reservation) => {
1694 return Some(ImplOverlapKind::Permitted { marker: false });
1696 }
1697 (ImplPolarity::Positive, ImplPolarity::Negative)
1698 | (ImplPolarity::Negative, ImplPolarity::Positive) => {
1699 return None;
1701 }
1702 (ImplPolarity::Positive, ImplPolarity::Positive)
1703 | (ImplPolarity::Negative, ImplPolarity::Negative) => {}
1704 };
1705
1706 let is_marker_impl = |trait_ref: TraitRef<'_>| self.trait_def(trait_ref.def_id).is_marker;
1707 let is_marker_overlap = is_marker_impl(trait_ref1) && is_marker_impl(trait_ref2);
1708
1709 if is_marker_overlap {
1710 return Some(ImplOverlapKind::Permitted { marker: true });
1711 }
1712
1713 None
1714 }
1715
1716 pub fn expect_variant_res(self, res: Res) -> &'tcx VariantDef {
1719 match res {
1720 Res::Def(DefKind::Variant, did) => {
1721 let enum_did = self.parent(did);
1722 self.adt_def(enum_did).variant_with_id(did)
1723 }
1724 Res::Def(DefKind::Struct | DefKind::Union, did) => self.adt_def(did).non_enum_variant(),
1725 Res::Def(DefKind::Ctor(CtorOf::Variant, ..), variant_ctor_did) => {
1726 let variant_did = self.parent(variant_ctor_did);
1727 let enum_did = self.parent(variant_did);
1728 self.adt_def(enum_did).variant_with_ctor_id(variant_ctor_did)
1729 }
1730 Res::Def(DefKind::Ctor(CtorOf::Struct, ..), ctor_did) => {
1731 let struct_did = self.parent(ctor_did);
1732 self.adt_def(struct_did).non_enum_variant()
1733 }
1734 _ => 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),
1735 }
1736 }
1737
1738 #[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(1739u32),
::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:1743",
"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(1743u32),
::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:1745",
"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(1745u32),
::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")]
1740 pub fn instance_mir(self, instance: ty::InstanceKind<'tcx>) -> &'tcx Body<'tcx> {
1741 match instance {
1742 ty::InstanceKind::Item(def) => {
1743 debug!("calling def_kind on def: {:?}", def);
1744 let def_kind = self.def_kind(def);
1745 debug!("returned from def_kind: {:?}", def_kind);
1746 match def_kind {
1747 DefKind::Const { .. }
1748 | DefKind::Static { .. }
1749 | DefKind::AssocConst { .. }
1750 | DefKind::Ctor(..)
1751 | DefKind::AnonConst
1752 | DefKind::InlineConst => self.mir_for_ctfe(def),
1753 _ => self.optimized_mir(def),
1756 }
1757 }
1758 ty::InstanceKind::VTableShim(..)
1759 | ty::InstanceKind::ReifyShim(..)
1760 | ty::InstanceKind::Intrinsic(..)
1761 | ty::InstanceKind::FnPtrShim(..)
1762 | ty::InstanceKind::Virtual(..)
1763 | ty::InstanceKind::ClosureOnceShim { .. }
1764 | ty::InstanceKind::ConstructCoroutineInClosureShim { .. }
1765 | ty::InstanceKind::FutureDropPollShim(..)
1766 | ty::InstanceKind::DropGlue(..)
1767 | ty::InstanceKind::CloneShim(..)
1768 | ty::InstanceKind::ThreadLocalShim(..)
1769 | ty::InstanceKind::FnPtrAddrShim(..)
1770 | ty::InstanceKind::AsyncDropGlueCtorShim(..)
1771 | ty::InstanceKind::AsyncDropGlue(..) => self.mir_shims(instance),
1772 }
1773 }
1774
1775 #[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."]
1777 pub fn get_attrs(
1778 self,
1779 did: impl Into<DefId>,
1780 attr: Symbol,
1781 ) -> impl Iterator<Item = &'tcx hir::Attribute> {
1782 #[allow(deprecated)]
1783 self.get_all_attrs(did).iter().filter(move |a: &&hir::Attribute| a.has_name(attr))
1784 }
1785
1786 #[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_all_attrs(self, did: impl Into<DefId>) -> &'tcx [hir::Attribute] {
1792 let did: DefId = did.into();
1793 if let Some(did) = did.as_local() {
1794 self.hir_attrs(self.local_def_id_to_hir_id(did))
1795 } else {
1796 self.attrs_for_def(did)
1797 }
1798 }
1799
1800 pub fn get_attrs_by_path(
1801 self,
1802 did: DefId,
1803 attr: &[Symbol],
1804 ) -> impl Iterator<Item = &'tcx hir::Attribute> {
1805 let filter_fn = move |a: &&hir::Attribute| a.path_matches(attr);
1806 if let Some(did) = did.as_local() {
1807 self.hir_attrs(self.local_def_id_to_hir_id(did)).iter().filter(filter_fn)
1808 } else {
1809 self.attrs_for_def(did).iter().filter(filter_fn)
1810 }
1811 }
1812
1813 pub fn trait_is_auto(self, trait_def_id: DefId) -> bool {
1815 self.trait_def(trait_def_id).has_auto_impl
1816 }
1817
1818 pub fn trait_is_coinductive(self, trait_def_id: DefId) -> bool {
1821 self.trait_def(trait_def_id).is_coinductive
1822 }
1823
1824 pub fn trait_is_alias(self, trait_def_id: DefId) -> bool {
1826 self.def_kind(trait_def_id) == DefKind::TraitAlias
1827 }
1828
1829 fn layout_error(self, err: LayoutError<'tcx>) -> &'tcx LayoutError<'tcx> {
1831 self.arena.alloc(err)
1832 }
1833
1834 fn ordinary_coroutine_layout(
1840 self,
1841 def_id: DefId,
1842 args: GenericArgsRef<'tcx>,
1843 ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1844 let coroutine_kind_ty = args.as_coroutine().kind_ty();
1845 let mir = self.optimized_mir(def_id);
1846 let ty = || Ty::new_coroutine(self, def_id, args);
1847 if coroutine_kind_ty.is_unit() {
1849 mir.coroutine_layout_raw().ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1850 } else {
1851 let ty::Coroutine(_, identity_args) =
1854 *self.type_of(def_id).instantiate_identity().skip_norm_wip().kind()
1855 else {
1856 ::core::panicking::panic("internal error: entered unreachable code");unreachable!();
1857 };
1858 let identity_kind_ty = identity_args.as_coroutine().kind_ty();
1859 if identity_kind_ty == coroutine_kind_ty {
1862 mir.coroutine_layout_raw()
1863 .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1864 } else {
1865 {
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));
1866 {
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!(
1867 identity_kind_ty.to_opt_closure_kind(),
1868 Some(ClosureKind::Fn | ClosureKind::FnMut)
1869 );
1870 self.optimized_mir(self.coroutine_by_move_body_def_id(def_id))
1871 .coroutine_layout_raw()
1872 .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1873 }
1874 }
1875 }
1876
1877 fn async_drop_coroutine_layout(
1881 self,
1882 def_id: DefId,
1883 args: GenericArgsRef<'tcx>,
1884 ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1885 let ty = || Ty::new_coroutine(self, def_id, args);
1886 if args[0].has_placeholders() || args[0].has_non_region_param() {
1887 return Err(self.layout_error(LayoutError::TooGeneric(ty())));
1888 }
1889 let instance = InstanceKind::AsyncDropGlue(def_id, Ty::new_coroutine(self, def_id, args));
1890 self.mir_shims(instance)
1891 .coroutine_layout_raw()
1892 .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1893 }
1894
1895 pub fn coroutine_layout(
1898 self,
1899 def_id: DefId,
1900 args: GenericArgsRef<'tcx>,
1901 ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1902 if self.is_async_drop_in_place_coroutine(def_id) {
1903 let arg_cor_ty = args.first().unwrap().expect_ty();
1907 if arg_cor_ty.is_coroutine() {
1908 let span = self.def_span(def_id);
1909 let source_info = SourceInfo::outermost(span);
1910 let variant_fields: IndexVec<VariantIdx, IndexVec<FieldIdx, CoroutineSavedLocal>> =
1913 iter::repeat(IndexVec::new()).take(CoroutineArgs::RESERVED_VARIANTS).collect();
1914 let variant_source_info: IndexVec<VariantIdx, SourceInfo> =
1915 iter::repeat(source_info).take(CoroutineArgs::RESERVED_VARIANTS).collect();
1916 let proxy_layout = CoroutineLayout {
1917 field_tys: [].into(),
1918 field_names: [].into(),
1919 variant_fields,
1920 variant_source_info,
1921 storage_conflicts: BitMatrix::new(0, 0),
1922 };
1923 return Ok(self.arena.alloc(proxy_layout));
1924 } else {
1925 self.async_drop_coroutine_layout(def_id, args)
1926 }
1927 } else {
1928 self.ordinary_coroutine_layout(def_id, args)
1929 }
1930 }
1931
1932 pub fn assoc_parent(self, def_id: DefId) -> Option<(DefId, DefKind)> {
1934 if !self.def_kind(def_id).is_assoc() {
1935 return None;
1936 }
1937 let parent = self.parent(def_id);
1938 let def_kind = self.def_kind(parent);
1939 Some((parent, def_kind))
1940 }
1941
1942 pub fn trait_item_of(self, def_id: impl IntoQueryKey<DefId>) -> Option<DefId> {
1944 let def_id = def_id.into_query_key();
1945 self.opt_associated_item(def_id)?.trait_item_def_id()
1946 }
1947
1948 pub fn trait_of_assoc(self, def_id: DefId) -> Option<DefId> {
1951 match self.assoc_parent(def_id) {
1952 Some((id, DefKind::Trait)) => Some(id),
1953 _ => None,
1954 }
1955 }
1956
1957 pub fn impl_is_of_trait(self, def_id: impl IntoQueryKey<DefId>) -> bool {
1958 let def_id = def_id.into_query_key();
1959 let DefKind::Impl { of_trait } = self.def_kind(def_id) else {
1960 {
::core::panicking::panic_fmt(format_args!("expected Impl for {0:?}",
def_id));
};panic!("expected Impl for {def_id:?}");
1961 };
1962 of_trait
1963 }
1964
1965 pub fn impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
1968 match self.assoc_parent(def_id) {
1969 Some((id, DefKind::Impl { .. })) => Some(id),
1970 _ => None,
1971 }
1972 }
1973
1974 pub fn inherent_impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
1977 match self.assoc_parent(def_id) {
1978 Some((id, DefKind::Impl { of_trait: false })) => Some(id),
1979 _ => None,
1980 }
1981 }
1982
1983 pub fn trait_impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
1986 match self.assoc_parent(def_id) {
1987 Some((id, DefKind::Impl { of_trait: true })) => Some(id),
1988 _ => None,
1989 }
1990 }
1991
1992 pub fn impl_polarity(self, def_id: impl IntoQueryKey<DefId>) -> ty::ImplPolarity {
1993 let def_id = def_id.into_query_key();
1994 self.impl_trait_header(def_id).polarity
1995 }
1996
1997 pub fn impl_trait_ref(
1999 self,
2000 def_id: impl IntoQueryKey<DefId>,
2001 ) -> ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>> {
2002 let def_id = def_id.into_query_key();
2003 self.impl_trait_header(def_id).trait_ref
2004 }
2005
2006 pub fn impl_opt_trait_ref(
2009 self,
2010 def_id: impl IntoQueryKey<DefId>,
2011 ) -> Option<ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>>> {
2012 let def_id = def_id.into_query_key();
2013 self.impl_is_of_trait(def_id).then(|| self.impl_trait_ref(def_id))
2014 }
2015
2016 pub fn impl_trait_id(self, def_id: impl IntoQueryKey<DefId>) -> DefId {
2018 let def_id = def_id.into_query_key();
2019 self.impl_trait_ref(def_id).skip_binder().def_id
2020 }
2021
2022 pub fn impl_opt_trait_id(self, def_id: impl IntoQueryKey<DefId>) -> Option<DefId> {
2025 let def_id = def_id.into_query_key();
2026 self.impl_is_of_trait(def_id).then(|| self.impl_trait_id(def_id))
2027 }
2028
2029 pub fn is_exportable(self, def_id: DefId) -> bool {
2030 self.exportable_items(def_id.krate).contains(&def_id)
2031 }
2032
2033 pub fn is_builtin_derived(self, def_id: DefId) -> bool {
2036 if self.is_automatically_derived(def_id)
2037 && let Some(def_id) = def_id.as_local()
2038 && let outer = self.def_span(def_id).ctxt().outer_expn_data()
2039 && #[allow(non_exhaustive_omitted_patterns)] match outer.kind {
ExpnKind::Macro(MacroKind::Derive, _) => true,
_ => false,
}matches!(outer.kind, ExpnKind::Macro(MacroKind::Derive, _))
2040 && {
{
'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 { .. })
2041 {
2042 true
2043 } else {
2044 false
2045 }
2046 }
2047
2048 pub fn is_automatically_derived(self, def_id: DefId) -> bool {
2050 {
{
'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)
2051 }
2052
2053 pub fn span_of_impl(self, impl_def_id: DefId) -> Result<Span, Symbol> {
2056 if let Some(impl_def_id) = impl_def_id.as_local() {
2057 Ok(self.def_span(impl_def_id))
2058 } else {
2059 Err(self.crate_name(impl_def_id.krate))
2060 }
2061 }
2062
2063 pub fn hygienic_eq(self, use_ident: Ident, def_ident: Ident, def_parent_def_id: DefId) -> bool {
2067 use_ident.name == def_ident.name
2071 && use_ident
2072 .span
2073 .ctxt()
2074 .hygienic_eq(def_ident.span.ctxt(), self.expn_that_defined(def_parent_def_id))
2075 }
2076
2077 pub fn adjust_ident(self, mut ident: Ident, scope: DefId) -> Ident {
2078 ident.span.normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope));
2079 ident
2080 }
2081
2082 pub fn adjust_ident_and_get_scope(
2084 self,
2085 mut ident: Ident,
2086 scope: DefId,
2087 block: hir::HirId,
2088 ) -> (Ident, DefId) {
2089 let scope = ident
2090 .span
2091 .normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope))
2092 .and_then(|actual_expansion| actual_expansion.expn_data().parent_module)
2093 .unwrap_or_else(|| self.parent_module(block).to_def_id());
2094 (ident, scope)
2095 }
2096
2097 #[inline]
2101 pub fn is_const_fn(self, def_id: impl IntoQueryKey<DefId>) -> bool {
2102 let def_id = def_id.into_query_key();
2103 #[allow(non_exhaustive_omitted_patterns)] match self.def_kind(def_id) {
DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(_, CtorKind::Fn) |
DefKind::Closure => true,
_ => false,
}matches!(
2104 self.def_kind(def_id),
2105 DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(_, CtorKind::Fn) | DefKind::Closure
2106 ) && self.constness(def_id) == hir::Constness::Const
2107 }
2108
2109 pub fn is_conditionally_const(self, def_id: impl Into<DefId>) -> bool {
2116 let def_id: DefId = def_id.into();
2117 match self.def_kind(def_id) {
2118 DefKind::Impl { of_trait: true } => {
2119 let header = self.impl_trait_header(def_id);
2120 header.constness == hir::Constness::Const
2121 && self.is_const_trait(header.trait_ref.skip_binder().def_id)
2122 }
2123 DefKind::Impl { of_trait: false } => self.constness(def_id) == hir::Constness::Const,
2124 DefKind::Fn | DefKind::Ctor(_, CtorKind::Fn) => {
2125 self.constness(def_id) == hir::Constness::Const
2126 }
2127 DefKind::TraitAlias | DefKind::Trait => self.is_const_trait(def_id),
2128 DefKind::AssocTy => {
2129 let parent_def_id = self.parent(def_id);
2130 match self.def_kind(parent_def_id) {
2131 DefKind::Impl { of_trait: false } => false,
2132 DefKind::Impl { of_trait: true } | DefKind::Trait => {
2133 self.is_conditionally_const(parent_def_id)
2134 }
2135 _ => 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:?}"),
2136 }
2137 }
2138 DefKind::AssocFn => {
2139 let parent_def_id = self.parent(def_id);
2140 match self.def_kind(parent_def_id) {
2141 DefKind::Impl { of_trait: false } => {
2142 self.constness(def_id) == hir::Constness::Const
2143 }
2144 DefKind::Impl { of_trait: true } => {
2145 let Some(trait_method_did) = self.trait_item_of(def_id) else {
2146 return false;
2147 };
2148 self.constness(trait_method_did) == hir::Constness::Const
2149 && self.is_conditionally_const(parent_def_id)
2150 }
2151 DefKind::Trait => {
2152 self.constness(def_id) == hir::Constness::Const
2153 && self.is_conditionally_const(parent_def_id)
2154 }
2155 _ => 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:?}"),
2156 }
2157 }
2158 DefKind::OpaqueTy => match self.opaque_ty_origin(def_id) {
2159 hir::OpaqueTyOrigin::FnReturn { parent, .. } => self.is_conditionally_const(parent),
2160 hir::OpaqueTyOrigin::AsyncFn { .. } => false,
2161 hir::OpaqueTyOrigin::TyAlias { .. } => false,
2163 },
2164 DefKind::Closure => self.constness(def_id) == hir::Constness::Const,
2165 DefKind::Ctor(_, CtorKind::Const)
2166 | DefKind::Mod
2167 | DefKind::Struct
2168 | DefKind::Union
2169 | DefKind::Enum
2170 | DefKind::Variant
2171 | DefKind::TyAlias
2172 | DefKind::ForeignTy
2173 | DefKind::TyParam
2174 | DefKind::Const { .. }
2175 | DefKind::ConstParam
2176 | DefKind::Static { .. }
2177 | DefKind::AssocConst { .. }
2178 | DefKind::Macro(_)
2179 | DefKind::ExternCrate
2180 | DefKind::Use
2181 | DefKind::ForeignMod
2182 | DefKind::AnonConst
2183 | DefKind::InlineConst
2184 | DefKind::Field
2185 | DefKind::LifetimeParam
2186 | DefKind::GlobalAsm
2187 | DefKind::SyntheticCoroutineBody => false,
2188 }
2189 }
2190
2191 #[inline]
2192 pub fn is_const_trait(self, def_id: DefId) -> bool {
2193 self.trait_def(def_id).constness == hir::Constness::Const
2194 }
2195
2196 pub fn impl_method_has_trait_impl_trait_tys(self, def_id: DefId) -> bool {
2197 if self.def_kind(def_id) != DefKind::AssocFn {
2198 return false;
2199 }
2200
2201 let Some(item) = self.opt_associated_item(def_id) else {
2202 return false;
2203 };
2204
2205 let AssocContainer::TraitImpl(Ok(trait_item_def_id)) = item.container else {
2206 return false;
2207 };
2208
2209 !self.associated_types_for_impl_traits_in_associated_fn(trait_item_def_id).is_empty()
2210 }
2211
2212 #[inline]
2227 pub fn fn_abi_of_instance(
2228 self,
2229 query: ty::PseudoCanonicalInput<'tcx, (ty::Instance<'tcx>, &'tcx ty::List<Ty<'tcx>>)>,
2230 ) -> Result<&'tcx FnAbi<'tcx, Ty<'tcx>>, &'tcx FnAbiError<'tcx>> {
2231 if self.sess.opts.optimize != OptLevel::No && self.sess.opts.incremental.is_none() {
2234 self.fn_abi_of_instance_raw(query)
2235 } else {
2236 self.fn_abi_of_instance_no_deduced_attrs(query)
2237 }
2238 }
2239}
2240
2241impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for DefId {
2244 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2245 if let Some(did) = self.as_local() {
2246 tcx.hir_attrs(tcx.local_def_id_to_hir_id(did))
2247 } else {
2248 tcx.attrs_for_def(self)
2249 }
2250 }
2251}
2252
2253impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for LocalDefId {
2254 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2255 tcx.hir_attrs(tcx.local_def_id_to_hir_id(self))
2256 }
2257}
2258
2259impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for hir::OwnerId {
2260 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2261 hir::attrs::HasAttrs::get_attrs(self.def_id, tcx)
2262 }
2263}
2264
2265impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for hir::HirId {
2266 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2267 tcx.hir_attrs(self)
2268 }
2269}
2270
2271pub fn provide(providers: &mut Providers) {
2272 closure::provide(providers);
2273 context::provide(providers);
2274 erase_regions::provide(providers);
2275 inhabitedness::provide(providers);
2276 util::provide(providers);
2277 print::provide(providers);
2278 super::util::bug::provide(providers);
2279 *providers = Providers {
2280 trait_impls_of: trait_def::trait_impls_of_provider,
2281 incoherent_impls: trait_def::incoherent_impls_provider,
2282 trait_impls_in_crate: trait_def::trait_impls_in_crate_provider,
2283 traits: trait_def::traits_provider,
2284 vtable_allocation: vtable::vtable_allocation_provider,
2285 ..*providers
2286 };
2287}
2288
2289#[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)]
2295pub struct CrateInherentImpls {
2296 pub inherent_impls: FxIndexMap<LocalDefId, Vec<DefId>>,
2297 pub incoherent_impls: FxIndexMap<SimplifiedType, Vec<LocalDefId>>,
2298}
2299
2300#[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)]
2301pub struct SymbolName<'tcx> {
2302 pub name: &'tcx str,
2304}
2305
2306impl<'tcx> SymbolName<'tcx> {
2307 pub fn new(tcx: TyCtxt<'tcx>, name: &str) -> SymbolName<'tcx> {
2308 SymbolName { name: tcx.arena.alloc_str(name) }
2309 }
2310}
2311
2312impl<'tcx> fmt::Display for SymbolName<'tcx> {
2313 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2314 fmt::Display::fmt(&self.name, fmt)
2315 }
2316}
2317
2318impl<'tcx> fmt::Debug for SymbolName<'tcx> {
2319 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2320 fmt::Display::fmt(&self.name, fmt)
2321 }
2322}
2323
2324#[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)]
2326pub struct DestructuredAdtConst<'tcx> {
2327 pub variant: VariantIdx,
2328 pub fields: &'tcx [ty::Const<'tcx>],
2329}
2330
2331pub fn fnc_typetrees<'tcx>(tcx: TyCtxt<'tcx>, fn_ty: Ty<'tcx>) -> FncTree {
2335 if tcx.sess.opts.unstable_opts.autodiff.contains(&rustc_session::config::AutoDiff::NoTT) {
2337 return FncTree { args: ::alloc::vec::Vec::new()vec![], ret: TypeTree::new() };
2338 }
2339
2340 if !fn_ty.is_fn() {
2342 return FncTree { args: ::alloc::vec::Vec::new()vec![], ret: TypeTree::new() };
2343 }
2344
2345 let fn_sig = fn_ty.fn_sig(tcx);
2347 let sig = tcx.instantiate_bound_regions_with_erased(fn_sig);
2348
2349 let mut args = ::alloc::vec::Vec::new()vec![];
2351 for ty in sig.inputs().iter() {
2352 let type_tree = typetree_from_ty(tcx, *ty);
2353 args.push(type_tree);
2354 }
2355
2356 let ret = typetree_from_ty(tcx, sig.output());
2358
2359 FncTree { args, ret }
2360}
2361
2362pub fn typetree_from_ty<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> TypeTree {
2365 let mut visited = Vec::new();
2366 typetree_from_ty_inner(tcx, ty, 0, &mut visited)
2367}
2368
2369const MAX_TYPETREE_DEPTH: usize = 6;
2372
2373fn typetree_from_ty_inner<'tcx>(
2375 tcx: TyCtxt<'tcx>,
2376 ty: Ty<'tcx>,
2377 depth: usize,
2378 visited: &mut Vec<Ty<'tcx>>,
2379) -> TypeTree {
2380 if depth >= MAX_TYPETREE_DEPTH {
2381 {
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:2381",
"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(2381u32),
::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);
2382 return TypeTree::new();
2383 }
2384
2385 if visited.contains(&ty) {
2386 return TypeTree::new();
2387 }
2388
2389 visited.push(ty);
2390 let result = typetree_from_ty_impl(tcx, ty, depth, visited);
2391 visited.pop();
2392 result
2393}
2394
2395fn typetree_from_ty_impl<'tcx>(
2397 tcx: TyCtxt<'tcx>,
2398 ty: Ty<'tcx>,
2399 depth: usize,
2400 visited: &mut Vec<Ty<'tcx>>,
2401) -> TypeTree {
2402 typetree_from_ty_impl_inner(tcx, ty, depth, visited, false)
2403}
2404
2405fn typetree_from_ty_impl_inner<'tcx>(
2407 tcx: TyCtxt<'tcx>,
2408 ty: Ty<'tcx>,
2409 depth: usize,
2410 visited: &mut Vec<Ty<'tcx>>,
2411 is_reference_target: bool,
2412) -> TypeTree {
2413 if ty.is_scalar() {
2414 let (kind, size) = if ty.is_integral() || ty.is_char() || ty.is_bool() {
2415 (Kind::Integer, ty.primitive_size(tcx).bytes_usize())
2416 } else if ty.is_floating_point() {
2417 match ty {
2418 x if x == tcx.types.f16 => (Kind::Half, 2),
2419 x if x == tcx.types.f32 => (Kind::Float, 4),
2420 x if x == tcx.types.f64 => (Kind::Double, 8),
2421 x if x == tcx.types.f128 => (Kind::F128, 16),
2422 _ => (Kind::Integer, 0),
2423 }
2424 } else {
2425 (Kind::Integer, 0)
2426 };
2427
2428 let offset = if is_reference_target && !ty.is_array() { 0 } else { -1 };
2431 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() }]);
2432 }
2433
2434 if ty.is_ref() || ty.is_raw_ptr() || ty.is_box() {
2435 let Some(inner_ty) = ty.builtin_deref(true) else {
2436 return TypeTree::new();
2437 };
2438
2439 let child = typetree_from_ty_impl_inner(tcx, inner_ty, depth + 1, visited, true);
2440 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 {
2441 offset: -1,
2442 size: tcx.data_layout.pointer_size().bytes_usize(),
2443 kind: Kind::Pointer,
2444 child,
2445 }]);
2446 }
2447
2448 if ty.is_array() {
2449 if let ty::Array(element_ty, len_const) = ty.kind() {
2450 let len = len_const.try_to_target_usize(tcx).unwrap_or(0);
2451 if len == 0 {
2452 return TypeTree::new();
2453 }
2454 let element_tree =
2455 typetree_from_ty_impl_inner(tcx, *element_ty, depth + 1, visited, false);
2456 let mut types = Vec::new();
2457 for elem_type in &element_tree.0 {
2458 types.push(Type {
2459 offset: -1,
2460 size: elem_type.size,
2461 kind: elem_type.kind,
2462 child: elem_type.child.clone(),
2463 });
2464 }
2465
2466 return TypeTree(types);
2467 }
2468 }
2469
2470 if ty.is_slice() {
2471 if let ty::Slice(element_ty) = ty.kind() {
2472 let element_tree =
2473 typetree_from_ty_impl_inner(tcx, *element_ty, depth + 1, visited, false);
2474 return element_tree;
2475 }
2476 }
2477
2478 if let ty::Tuple(tuple_types) = ty.kind() {
2479 if tuple_types.is_empty() {
2480 return TypeTree::new();
2481 }
2482
2483 let mut types = Vec::new();
2484 let mut current_offset = 0;
2485
2486 for tuple_ty in tuple_types.iter() {
2487 let element_tree =
2488 typetree_from_ty_impl_inner(tcx, tuple_ty, depth + 1, visited, false);
2489
2490 let element_layout = tcx
2491 .layout_of(ty::TypingEnv::fully_monomorphized().as_query_input(tuple_ty))
2492 .ok()
2493 .map(|layout| layout.size.bytes_usize())
2494 .unwrap_or(0);
2495
2496 for elem_type in &element_tree.0 {
2497 types.push(Type {
2498 offset: if elem_type.offset == -1 {
2499 current_offset as isize
2500 } else {
2501 current_offset as isize + elem_type.offset
2502 },
2503 size: elem_type.size,
2504 kind: elem_type.kind,
2505 child: elem_type.child.clone(),
2506 });
2507 }
2508
2509 current_offset += element_layout;
2510 }
2511
2512 return TypeTree(types);
2513 }
2514
2515 if let ty::Adt(adt_def, args) = ty.kind() {
2516 if adt_def.is_struct() {
2517 let struct_layout =
2518 tcx.layout_of(ty::TypingEnv::fully_monomorphized().as_query_input(ty));
2519 if let Ok(layout) = struct_layout {
2520 let mut types = Vec::new();
2521
2522 for (field_idx, field_def) in adt_def.all_fields().enumerate() {
2523 let field_ty = field_def.ty(tcx, args);
2524 let field_tree = typetree_from_ty_impl_inner(
2525 tcx,
2526 field_ty.skip_norm_wip(),
2527 depth + 1,
2528 visited,
2529 false,
2530 );
2531
2532 let field_offset = layout.fields.offset(field_idx).bytes_usize();
2533
2534 for elem_type in &field_tree.0 {
2535 types.push(Type {
2536 offset: if elem_type.offset == -1 {
2537 field_offset as isize
2538 } else {
2539 field_offset as isize + elem_type.offset
2540 },
2541 size: elem_type.size,
2542 kind: elem_type.kind,
2543 child: elem_type.child.clone(),
2544 });
2545 }
2546 }
2547
2548 return TypeTree(types);
2549 }
2550 }
2551 }
2552
2553 TypeTree::new()
2554}