1#![allow(rustc::usage_of_ty_tykind)]
13
14use std::fmt::Debug;
15use std::hash::{Hash, Hasher};
16use std::marker::PhantomData;
17use std::num::NonZero;
18use std::ptr::NonNull;
19use std::{assert_matches, fmt, iter, str};
20
21pub use adt::*;
22pub use assoc::*;
23pub use generic_args::{GenericArgKind, TermKind, *};
24pub use generics::*;
25pub use intrinsic::IntrinsicDef;
26use rustc_abi::{
27 Align, FieldIdx, Integer, IntegerType, ReprFlags, ReprOptions, ScalableElt, VariantIdx,
28};
29use rustc_ast as ast;
30use rustc_ast::expand::typetree::{FncTree, Kind, Type, TypeTree};
31use rustc_ast::node_id::NodeMap;
32pub use rustc_ast_ir::{Movability, Mutability, try_visit};
33use rustc_data_structures::fx::{FxHashSet, FxIndexMap, FxIndexSet};
34use rustc_data_structures::intern::Interned;
35use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
36use rustc_data_structures::steal::Steal;
37use rustc_data_structures::unord::{UnordMap, UnordSet};
38use rustc_errors::{Diag, ErrorGuaranteed, LintBuffer};
39use rustc_hir as hir;
40use rustc_hir::attrs::StrippedCfgItem;
41use rustc_hir::def::{CtorKind, CtorOf, DefKind, DocLinkResMap, LifetimeRes, Res};
42use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, LocalDefIdMap};
43use rustc_hir::definitions::PerParentDisambiguatorState;
44use rustc_hir::{LangItem, attrs as attr, find_attr};
45use rustc_index::IndexVec;
46use rustc_index::bit_set::BitMatrix;
47use rustc_macros::{
48 BlobDecodable, Decodable, Encodable, HashStable, TyDecodable, TyEncodable, TypeFoldable,
49 TypeVisitable, extension,
50};
51use rustc_serialize::{Decodable, Encodable};
52use rustc_session::config::OptLevel;
53pub use rustc_session::lint::RegisteredTools;
54use rustc_span::hygiene::MacroKind;
55use rustc_span::{DUMMY_SP, ExpnId, ExpnKind, Ident, Span, Symbol};
56use rustc_target::callconv::FnAbi;
57pub use rustc_type_ir::data_structures::{DelayedMap, DelayedSet};
58pub use rustc_type_ir::fast_reject::DeepRejectCtxt;
59#[allow(
60 hidden_glob_reexports,
61 rustc::usage_of_type_ir_inherent,
62 rustc::non_glob_import_of_type_ir_inherent
63)]
64use rustc_type_ir::inherent;
65pub use rustc_type_ir::relate::VarianceDiagInfo;
66pub use rustc_type_ir::solve::{CandidatePreferenceMode, SizedTraitKind};
67pub use rustc_type_ir::*;
68#[allow(hidden_glob_reexports, unused_imports)]
69use rustc_type_ir::{InferCtxtLike, Interner};
70use tracing::{debug, instrument, trace};
71pub use vtable::*;
72
73pub use self::closure::{
74 BorrowKind, CAPTURE_STRUCT_LOCAL, CaptureInfo, CapturedPlace, ClosureTypeInfo,
75 MinCaptureInformationMap, MinCaptureList, RootVariableMinCaptureList, UpvarCapture, UpvarId,
76 UpvarPath, analyze_coroutine_closure_captures, is_ancestor_or_same_capture,
77 place_to_string_for_capture,
78};
79pub use self::consts::{
80 AtomicOrdering, Const, ConstInt, ConstKind, ConstToValTreeResult, Expr, ExprKind,
81 LitToConstInput, ScalarInt, SimdAlign, UnevaluatedConst, ValTree, ValTreeKindExt, Value,
82 const_lit_matches_ty,
83};
84pub use self::context::{
85 CtxtInterners, CurrentGcx, Feed, FreeRegionInfo, GlobalCtxt, Lift, TyCtxt, TyCtxtFeed, tls,
86};
87pub use self::fold::*;
88pub use self::instance::{Instance, InstanceKind, ReifyReason};
89pub(crate) use self::list::RawList;
90pub use self::list::{List, ListWithCachedTypeInfo};
91pub use self::opaque_types::OpaqueTypeKey;
92pub use self::pattern::{Pattern, PatternKind};
93pub use self::predicate::{
94 AliasTerm, ArgOutlivesPredicate, Clause, ClauseKind, CoercePredicate, ExistentialPredicate,
95 ExistentialPredicateStableCmpExt, ExistentialProjection, ExistentialTraitRef,
96 HostEffectPredicate, NormalizesTo, OutlivesPredicate, PolyCoercePredicate,
97 PolyExistentialPredicate, PolyExistentialProjection, PolyExistentialTraitRef,
98 PolyProjectionPredicate, PolyRegionOutlivesPredicate, PolySubtypePredicate, PolyTraitPredicate,
99 PolyTraitRef, PolyTypeOutlivesPredicate, Predicate, PredicateKind, ProjectionPredicate,
100 RegionConstraint, RegionEqPredicate, RegionOutlivesPredicate, SubtypePredicate, TraitPredicate,
101 TraitRef, TypeOutlivesPredicate,
102};
103pub use self::region::{
104 EarlyParamRegion, LateParamRegion, LateParamRegionKind, Region, RegionKind, RegionVid,
105};
106pub use self::sty::{
107 AliasTy, AliasTyKind, Article, Binder, BoundConst, BoundRegion, BoundRegionKind, BoundTy,
108 BoundTyKind, BoundVariableKind, CanonicalPolyFnSig, CoroutineArgsExt, EarlyBinder, FnSig,
109 InlineConstArgs, InlineConstArgsParts, ParamConst, ParamTy, PlaceholderConst,
110 PlaceholderRegion, PlaceholderType, PolyFnSig, TyKind, TypeAndMut, TypingMode,
111 TypingModeEqWrapper, UpvarArgs,
112};
113pub use self::trait_def::TraitDef;
114pub use self::typeck_results::{
115 CanonicalUserType, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations, IsIdentity,
116 Rust2024IncompatiblePatInfo, TypeckResults, UserType, UserTypeAnnotationIndex, UserTypeKind,
117};
118use crate::error::{OpaqueHiddenTypeMismatch, TypeMismatchReason};
119use crate::ich::StableHashingContext;
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", "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.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<'__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for ResolverGlobalCtxt {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
ResolverGlobalCtxt {
visibilities_for_hashing: ref __binding_0,
expn_that_defined: ref __binding_1,
effective_visibilities: ref __binding_2,
extern_crate_map: ref __binding_3,
maybe_unused_trait_imports: ref __binding_4,
module_children: ref __binding_5,
ambig_module_children: ref __binding_6,
glob_map: ref __binding_7,
main_def: ref __binding_8,
trait_impls: ref __binding_9,
proc_macros: ref __binding_10,
confused_type_with_std_module: ref __binding_11,
doc_link_resolutions: ref __binding_12,
doc_link_traits_in_scope: ref __binding_13,
all_macro_rules: ref __binding_14,
stripped_cfg_items: ref __binding_15 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
{ __binding_3.hash_stable(__hcx, __hasher); }
{ __binding_4.hash_stable(__hcx, __hasher); }
{ __binding_5.hash_stable(__hcx, __hasher); }
{ __binding_6.hash_stable(__hcx, __hasher); }
{ __binding_7.hash_stable(__hcx, __hasher); }
{ __binding_8.hash_stable(__hcx, __hasher); }
{ __binding_9.hash_stable(__hcx, __hasher); }
{ __binding_10.hash_stable(__hcx, __hasher); }
{ __binding_11.hash_stable(__hcx, __hasher); }
{ __binding_12.hash_stable(__hcx, __hasher); }
{ __binding_13.hash_stable(__hcx, __hasher); }
{ __binding_14.hash_stable(__hcx, __hasher); }
{ __binding_15.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
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 extern_crate_map: UnordMap<LocalDefId, CrateNum>,
183 pub maybe_unused_trait_imports: FxIndexSet<LocalDefId>,
184 pub module_children: LocalDefIdMap<Vec<ModChild>>,
185 pub ambig_module_children: LocalDefIdMap<Vec<AmbigModChild>>,
186 pub glob_map: FxIndexMap<LocalDefId, FxIndexSet<Symbol>>,
187 pub main_def: Option<MainDefinition>,
188 pub trait_impls: FxIndexMap<DefId, Vec<LocalDefId>>,
189 pub proc_macros: Vec<LocalDefId>,
192 pub confused_type_with_std_module: FxIndexMap<Span, Span>,
195 pub doc_link_resolutions: FxIndexMap<LocalDefId, DocLinkResMap>,
196 pub doc_link_traits_in_scope: FxIndexMap<LocalDefId, Vec<DefId>>,
197 pub all_macro_rules: UnordSet<Symbol>,
198 pub stripped_cfg_items: Vec<StrippedCfgItem>,
199}
200
201#[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", "node_id_to_def_id", "trait_map",
"lifetime_elision_allowed", "lint_buffer",
"delegation_infos", "per_parent_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.node_id_to_def_id, &self.trait_map,
&self.lifetime_elision_allowed, &self.lint_buffer,
&self.delegation_infos, &&self.per_parent_disambiguators];
::core::fmt::Formatter::debug_struct_fields_finish(f,
"ResolverAstLowering", names, values)
}
}Debug)]
204pub struct ResolverAstLowering<'tcx> {
205 pub partial_res_map: NodeMap<hir::def::PartialRes>,
207 pub import_res_map: NodeMap<hir::def::PerNS<Option<Res<ast::NodeId>>>>,
209 pub label_res_map: NodeMap<ast::NodeId>,
211 pub lifetimes_res_map: NodeMap<LifetimeRes>,
213 pub extra_lifetime_params_map: NodeMap<Vec<(Ident, ast::NodeId, LifetimeRes)>>,
215
216 pub next_node_id: ast::NodeId,
217
218 pub node_id_to_def_id: NodeMap<LocalDefId>,
219
220 pub trait_map: NodeMap<&'tcx [hir::TraitCandidate<'tcx>]>,
221 pub lifetime_elision_allowed: FxHashSet<ast::NodeId>,
223
224 pub lint_buffer: Steal<LintBuffer>,
226
227 pub delegation_infos: LocalDefIdMap<DelegationInfo>,
229
230 pub per_parent_disambiguators: LocalDefIdMap<Steal<PerParentDisambiguatorState>>,
231}
232
233#[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)]
234pub struct DelegationInfo {
235 pub resolution_node: ast::NodeId,
238}
239
240#[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<'__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for MainDefinition {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
MainDefinition {
res: ref __binding_0,
is_import: ref __binding_1,
span: ref __binding_2 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
241pub struct MainDefinition {
242 pub res: Res<ast::NodeId>,
243 pub is_import: bool,
244 pub span: Span,
245}
246
247impl MainDefinition {
248 pub fn opt_fn_def_id(self) -> Option<DefId> {
249 if let Res::Def(DefKind::Fn, def_id) = self.res { Some(def_id) } else { None }
250 }
251}
252
253#[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, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for ImplTraitHeader<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
ImplTraitHeader {
trait_ref: ref __binding_0,
polarity: ref __binding_1,
safety: ref __binding_2,
constness: ref __binding_3 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
{ __binding_3.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
254pub struct ImplTraitHeader<'tcx> {
255 pub trait_ref: ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>>,
256 pub polarity: ImplPolarity,
257 pub safety: hir::Safety,
258 pub constness: hir::Constness,
259}
260
261#[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<'__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for Asyncness {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self { Asyncness::Yes => {} Asyncness::No => {} }
}
}
};HashStable, #[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)]
262#[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)]
263pub enum Asyncness {
264 Yes,
265 #[default]
266 No,
267}
268
269impl Asyncness {
270 pub fn is_async(self) -> bool {
271 #[allow(non_exhaustive_omitted_patterns)] match self {
Asyncness::Yes => true,
_ => false,
}matches!(self, Asyncness::Yes)
272 }
273}
274
275#[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<'__ctx, Id>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for Visibility<Id> where
Id: ::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
{
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self {
Visibility::Public => {}
Visibility::Restricted(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
276pub enum Visibility<Id = LocalDefId> {
277 Public,
279 Restricted(Id),
281}
282
283impl Visibility {
284 pub fn to_string(self, def_id: LocalDefId, tcx: TyCtxt<'_>) -> String {
285 match self {
286 ty::Visibility::Restricted(restricted_id) => {
287 if restricted_id.is_top_level_module() {
288 "pub(crate)".to_string()
289 } else if restricted_id == tcx.parent_module_from_def_id(def_id).to_local_def_id() {
290 "pub(self)".to_string()
291 } else {
292 ::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!(
293 "pub(in crate{})",
294 tcx.def_path(restricted_id.to_def_id()).to_string_no_crate_verbose()
295 )
296 }
297 }
298 ty::Visibility::Public => "pub".to_string(),
299 }
300 }
301}
302
303#[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, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for ClosureSizeProfileData<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
ClosureSizeProfileData {
before_feature_tys: ref __binding_0,
after_feature_tys: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
304#[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)]
305pub struct ClosureSizeProfileData<'tcx> {
306 pub before_feature_tys: Ty<'tcx>,
308 pub after_feature_tys: Ty<'tcx>,
310}
311
312impl TyCtxt<'_> {
313 #[inline]
314 pub fn opt_parent(self, id: DefId) -> Option<DefId> {
315 self.def_key(id).parent.map(|index| DefId { index, ..id })
316 }
317
318 #[inline]
319 #[track_caller]
320 pub fn parent(self, id: DefId) -> DefId {
321 match self.opt_parent(id) {
322 Some(id) => id,
323 None => crate::util::bug::bug_fmt(format_args!("{0:?} doesn\'t have a parent", id))bug!("{id:?} doesn't have a parent"),
325 }
326 }
327
328 #[inline]
329 #[track_caller]
330 pub fn opt_local_parent(self, id: LocalDefId) -> Option<LocalDefId> {
331 self.opt_parent(id.to_def_id()).map(DefId::expect_local)
332 }
333
334 #[inline]
335 #[track_caller]
336 pub fn local_parent(self, id: impl Into<LocalDefId>) -> LocalDefId {
337 self.parent(id.into().to_def_id()).expect_local()
338 }
339
340 pub fn is_descendant_of(self, mut descendant: DefId, ancestor: DefId) -> bool {
341 if descendant.krate != ancestor.krate {
342 return false;
343 }
344
345 while descendant != ancestor {
346 match self.opt_parent(descendant) {
347 Some(parent) => descendant = parent,
348 None => return false,
349 }
350 }
351 true
352 }
353}
354
355impl<Id> Visibility<Id> {
356 pub fn is_public(self) -> bool {
357 #[allow(non_exhaustive_omitted_patterns)] match self {
Visibility::Public => true,
_ => false,
}matches!(self, Visibility::Public)
358 }
359
360 pub fn map_id<OutId>(self, f: impl FnOnce(Id) -> OutId) -> Visibility<OutId> {
361 match self {
362 Visibility::Public => Visibility::Public,
363 Visibility::Restricted(id) => Visibility::Restricted(f(id)),
364 }
365 }
366}
367
368impl<Id: Into<DefId>> Visibility<Id> {
369 pub fn to_def_id(self) -> Visibility<DefId> {
370 self.map_id(Into::into)
371 }
372
373 pub fn is_accessible_from(self, module: impl Into<DefId>, tcx: TyCtxt<'_>) -> bool {
375 match self {
376 Visibility::Public => true,
378 Visibility::Restricted(id) => tcx.is_descendant_of(module.into(), id.into()),
379 }
380 }
381
382 pub fn is_at_least(self, vis: Visibility<impl Into<DefId>>, tcx: TyCtxt<'_>) -> bool {
384 match vis {
385 Visibility::Public => self.is_public(),
386 Visibility::Restricted(id) => self.is_accessible_from(id, tcx),
387 }
388 }
389}
390
391impl<Id: Into<DefId> + Copy> Visibility<Id> {
392 pub fn min(self, vis: Visibility<Id>, tcx: TyCtxt<'_>) -> Visibility<Id> {
393 if self.is_at_least(vis, tcx) { vis } else { self }
394 }
395}
396
397impl Visibility<DefId> {
398 pub fn expect_local(self) -> Visibility {
399 self.map_id(|id| id.expect_local())
400 }
401
402 pub fn is_visible_locally(self) -> bool {
404 match self {
405 Visibility::Public => true,
406 Visibility::Restricted(def_id) => def_id.is_local(),
407 }
408 }
409}
410
411#[derive(const _: () =
{
impl<'tcx, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for CrateVariancesMap<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
CrateVariancesMap { variances: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, #[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)]
418pub struct CrateVariancesMap<'tcx> {
419 pub variances: DefIdMap<&'tcx [ty::Variance]>,
423}
424
425#[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)]
428pub struct CReaderCacheKey {
429 pub cnum: Option<CrateNum>,
430 pub pos: usize,
431}
432
433#[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, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for Ty<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
Ty(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
435#[rustc_diagnostic_item = "Ty"]
436#[rustc_pass_by_value]
437pub struct Ty<'tcx>(Interned<'tcx, WithCachedTypeInfo<TyKind<'tcx>>>);
438
439impl<'tcx> rustc_type_ir::inherent::IntoKind for Ty<'tcx> {
440 type Kind = TyKind<'tcx>;
441
442 fn kind(self) -> TyKind<'tcx> {
443 *self.kind()
444 }
445}
446
447impl<'tcx> rustc_type_ir::Flags for Ty<'tcx> {
448 fn flags(&self) -> TypeFlags {
449 self.0.flags
450 }
451
452 fn outer_exclusive_binder(&self) -> DebruijnIndex {
453 self.0.outer_exclusive_binder
454 }
455}
456
457#[derive(const _: () =
{
impl<'tcx, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for CratePredicatesMap<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
CratePredicatesMap { predicates: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, #[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)]
464pub struct CratePredicatesMap<'tcx> {
465 pub predicates: DefIdMap<&'tcx [(Clause<'tcx>, Span)]>,
469}
470
471#[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> {
match ::core::cmp::PartialOrd::partial_cmp(&self.ptr, &other.ptr) {
::core::option::Option::Some(::core::cmp::Ordering::Equal) =>
::core::cmp::PartialOrd::partial_cmp(&self.marker,
&other.marker),
cmp => cmp,
}
}
}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)]
472pub struct Term<'tcx> {
473 ptr: NonNull<()>,
474 marker: PhantomData<(Ty<'tcx>, Const<'tcx>)>,
475}
476
477impl<'tcx> rustc_type_ir::inherent::Term<TyCtxt<'tcx>> for Term<'tcx> {}
478
479impl<'tcx> rustc_type_ir::inherent::IntoKind for Term<'tcx> {
480 type Kind = TermKind<'tcx>;
481
482 fn kind(self) -> Self::Kind {
483 self.kind()
484 }
485}
486
487unsafe impl<'tcx> rustc_data_structures::sync::DynSend for Term<'tcx> where
488 &'tcx (Ty<'tcx>, Const<'tcx>): rustc_data_structures::sync::DynSend
489{
490}
491unsafe impl<'tcx> rustc_data_structures::sync::DynSync for Term<'tcx> where
492 &'tcx (Ty<'tcx>, Const<'tcx>): rustc_data_structures::sync::DynSync
493{
494}
495unsafe impl<'tcx> Send for Term<'tcx> where &'tcx (Ty<'tcx>, Const<'tcx>): Send {}
496unsafe impl<'tcx> Sync for Term<'tcx> where &'tcx (Ty<'tcx>, Const<'tcx>): Sync {}
497
498impl Debug for Term<'_> {
499 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
500 match self.kind() {
501 TermKind::Ty(ty) => f.write_fmt(format_args!("Term::Ty({0:?})", ty))write!(f, "Term::Ty({ty:?})"),
502 TermKind::Const(ct) => f.write_fmt(format_args!("Term::Const({0:?})", ct))write!(f, "Term::Const({ct:?})"),
503 }
504 }
505}
506
507impl<'tcx> From<Ty<'tcx>> for Term<'tcx> {
508 fn from(ty: Ty<'tcx>) -> Self {
509 TermKind::Ty(ty).pack()
510 }
511}
512
513impl<'tcx> From<Const<'tcx>> for Term<'tcx> {
514 fn from(c: Const<'tcx>) -> Self {
515 TermKind::Const(c).pack()
516 }
517}
518
519impl<'a, 'tcx> HashStable<StableHashingContext<'a>> for Term<'tcx> {
520 fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) {
521 self.kind().hash_stable(hcx, hasher);
522 }
523}
524
525impl<'tcx> TypeFoldable<TyCtxt<'tcx>> for Term<'tcx> {
526 fn try_fold_with<F: FallibleTypeFolder<TyCtxt<'tcx>>>(
527 self,
528 folder: &mut F,
529 ) -> Result<Self, F::Error> {
530 match self.kind() {
531 ty::TermKind::Ty(ty) => ty.try_fold_with(folder).map(Into::into),
532 ty::TermKind::Const(ct) => ct.try_fold_with(folder).map(Into::into),
533 }
534 }
535
536 fn fold_with<F: TypeFolder<TyCtxt<'tcx>>>(self, folder: &mut F) -> Self {
537 match self.kind() {
538 ty::TermKind::Ty(ty) => ty.fold_with(folder).into(),
539 ty::TermKind::Const(ct) => ct.fold_with(folder).into(),
540 }
541 }
542}
543
544impl<'tcx> TypeVisitable<TyCtxt<'tcx>> for Term<'tcx> {
545 fn visit_with<V: TypeVisitor<TyCtxt<'tcx>>>(&self, visitor: &mut V) -> V::Result {
546 match self.kind() {
547 ty::TermKind::Ty(ty) => ty.visit_with(visitor),
548 ty::TermKind::Const(ct) => ct.visit_with(visitor),
549 }
550 }
551}
552
553impl<'tcx, E: TyEncoder<'tcx>> Encodable<E> for Term<'tcx> {
554 fn encode(&self, e: &mut E) {
555 self.kind().encode(e)
556 }
557}
558
559impl<'tcx, D: TyDecoder<'tcx>> Decodable<D> for Term<'tcx> {
560 fn decode(d: &mut D) -> Self {
561 let res: TermKind<'tcx> = Decodable::decode(d);
562 res.pack()
563 }
564}
565
566impl<'tcx> Term<'tcx> {
567 #[inline]
568 pub fn kind(self) -> TermKind<'tcx> {
569 let ptr =
570 unsafe { self.ptr.map_addr(|addr| NonZero::new_unchecked(addr.get() & !TAG_MASK)) };
571 unsafe {
575 match self.ptr.addr().get() & TAG_MASK {
576 TYPE_TAG => TermKind::Ty(Ty(Interned::new_unchecked(
577 ptr.cast::<WithCachedTypeInfo<ty::TyKind<'tcx>>>().as_ref(),
578 ))),
579 CONST_TAG => TermKind::Const(ty::Const(Interned::new_unchecked(
580 ptr.cast::<WithCachedTypeInfo<ty::ConstKind<'tcx>>>().as_ref(),
581 ))),
582 _ => core::intrinsics::unreachable(),
583 }
584 }
585 }
586
587 pub fn as_type(&self) -> Option<Ty<'tcx>> {
588 if let TermKind::Ty(ty) = self.kind() { Some(ty) } else { None }
589 }
590
591 pub fn expect_type(&self) -> Ty<'tcx> {
592 self.as_type().expect("expected a type, but found a const")
593 }
594
595 pub fn as_const(&self) -> Option<Const<'tcx>> {
596 if let TermKind::Const(c) = self.kind() { Some(c) } else { None }
597 }
598
599 pub fn expect_const(&self) -> Const<'tcx> {
600 self.as_const().expect("expected a const, but found a type")
601 }
602
603 pub fn into_arg(self) -> GenericArg<'tcx> {
604 match self.kind() {
605 TermKind::Ty(ty) => ty.into(),
606 TermKind::Const(c) => c.into(),
607 }
608 }
609
610 pub fn to_alias_term(self) -> Option<AliasTerm<'tcx>> {
611 match self.kind() {
612 TermKind::Ty(ty) => match *ty.kind() {
613 ty::Alias(alias_ty) => Some(alias_ty.into()),
614 _ => None,
615 },
616 TermKind::Const(ct) => match ct.kind() {
617 ConstKind::Unevaluated(uv) => Some(uv.into()),
618 _ => None,
619 },
620 }
621 }
622
623 pub fn is_infer(&self) -> bool {
624 match self.kind() {
625 TermKind::Ty(ty) => ty.is_ty_var(),
626 TermKind::Const(ct) => ct.is_ct_infer(),
627 }
628 }
629
630 pub fn is_trivially_wf(&self, tcx: TyCtxt<'tcx>) -> bool {
631 match self.kind() {
632 TermKind::Ty(ty) => ty.is_trivially_wf(tcx),
633 TermKind::Const(ct) => ct.is_trivially_wf(),
634 }
635 }
636
637 pub fn walk(self) -> TypeWalker<TyCtxt<'tcx>> {
648 TypeWalker::new(self.into())
649 }
650}
651
652const TAG_MASK: usize = 0b11;
653const TYPE_TAG: usize = 0b00;
654const CONST_TAG: usize = 0b01;
655
656impl<'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>)]
657impl<'tcx> TermKind<'tcx> {
658 #[inline]
659 fn pack(self) -> Term<'tcx> {
660 let (tag, ptr) = match self {
661 TermKind::Ty(ty) => {
662 assert_eq!(align_of_val(&*ty.0.0) & TAG_MASK, 0);
664 (TYPE_TAG, NonNull::from(ty.0.0).cast())
665 }
666 TermKind::Const(ct) => {
667 assert_eq!(align_of_val(&*ct.0.0) & TAG_MASK, 0);
669 (CONST_TAG, NonNull::from(ct.0.0).cast())
670 }
671 };
672
673 Term { ptr: ptr.map_addr(|addr| addr | tag), marker: PhantomData }
674 }
675}
676
677#[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)]
697pub struct InstantiatedPredicates<'tcx> {
698 pub predicates: Vec<Clause<'tcx>>,
699 pub spans: Vec<Span>,
700}
701
702impl<'tcx> InstantiatedPredicates<'tcx> {
703 pub fn empty() -> InstantiatedPredicates<'tcx> {
704 InstantiatedPredicates { predicates: ::alloc::vec::Vec::new()vec![], spans: ::alloc::vec::Vec::new()vec![] }
705 }
706
707 pub fn is_empty(&self) -> bool {
708 self.predicates.is_empty()
709 }
710
711 pub fn iter(&self) -> <&Self as IntoIterator>::IntoIter {
712 self.into_iter()
713 }
714}
715
716impl<'tcx> IntoIterator for InstantiatedPredicates<'tcx> {
717 type Item = (Clause<'tcx>, Span);
718
719 type IntoIter = std::iter::Zip<std::vec::IntoIter<Clause<'tcx>>, std::vec::IntoIter<Span>>;
720
721 fn into_iter(self) -> Self::IntoIter {
722 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());
723 std::iter::zip(self.predicates, self.spans)
724 }
725}
726
727impl<'a, 'tcx> IntoIterator for &'a InstantiatedPredicates<'tcx> {
728 type Item = (Clause<'tcx>, Span);
729
730 type IntoIter = std::iter::Zip<
731 std::iter::Copied<std::slice::Iter<'a, Clause<'tcx>>>,
732 std::iter::Copied<std::slice::Iter<'a, Span>>,
733 >;
734
735 fn into_iter(self) -> Self::IntoIter {
736 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());
737 std::iter::zip(self.predicates.iter().copied(), self.spans.iter().copied())
738 }
739}
740
741#[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, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for ProvisionalHiddenType<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
ProvisionalHiddenType {
span: ref __binding_0, ty: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, 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)]
742pub struct ProvisionalHiddenType<'tcx> {
743 pub span: Span,
757
758 pub ty: Ty<'tcx>,
771}
772
773#[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)]
775pub enum DefiningScopeKind {
776 HirTypeck,
781 MirBorrowck,
782}
783
784impl<'tcx> ProvisionalHiddenType<'tcx> {
785 pub fn new_error(tcx: TyCtxt<'tcx>, guar: ErrorGuaranteed) -> ProvisionalHiddenType<'tcx> {
786 ProvisionalHiddenType { span: DUMMY_SP, ty: Ty::new_error(tcx, guar) }
787 }
788
789 pub fn build_mismatch_error(
790 &self,
791 other: &Self,
792 tcx: TyCtxt<'tcx>,
793 ) -> Result<Diag<'tcx>, ErrorGuaranteed> {
794 (self.ty, other.ty).error_reported()?;
795 let sub_diag = if self.span == other.span {
797 TypeMismatchReason::ConflictType { span: self.span }
798 } else {
799 TypeMismatchReason::PreviousUse { span: self.span }
800 };
801 Ok(tcx.dcx().create_err(OpaqueHiddenTypeMismatch {
802 self_ty: self.ty,
803 other_ty: other.ty,
804 other_span: other.span,
805 sub: sub_diag,
806 }))
807 }
808
809 x;#[instrument(level = "debug", skip(tcx), ret)]
810 pub fn remap_generic_params_to_declaration_params(
811 self,
812 opaque_type_key: OpaqueTypeKey<'tcx>,
813 tcx: TyCtxt<'tcx>,
814 defining_scope_kind: DefiningScopeKind,
815 ) -> DefinitionSiteHiddenType<'tcx> {
816 let OpaqueTypeKey { def_id, args } = opaque_type_key;
817
818 let id_args = GenericArgs::identity_for_item(tcx, def_id);
825 debug!(?id_args);
826
827 let map = args.iter().zip(id_args).collect();
831 debug!("map = {:#?}", map);
832
833 let ty = match defining_scope_kind {
839 DefiningScopeKind::HirTypeck => {
840 fold_regions(tcx, self.ty, |_, _| tcx.lifetimes.re_erased)
841 }
842 DefiningScopeKind::MirBorrowck => self.ty,
843 };
844 let result_ty = ty.fold_with(&mut opaque_types::ReverseMapper::new(tcx, map, self.span));
845 if cfg!(debug_assertions) && matches!(defining_scope_kind, DefiningScopeKind::HirTypeck) {
846 assert_eq!(result_ty, fold_regions(tcx, result_ty, |_, _| tcx.lifetimes.re_erased));
847 }
848 DefinitionSiteHiddenType { span: self.span, ty: ty::EarlyBinder::bind(result_ty) }
849 }
850}
851
852#[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, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for DefinitionSiteHiddenType<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
DefinitionSiteHiddenType {
span: ref __binding_0, ty: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, 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)]
853pub struct DefinitionSiteHiddenType<'tcx> {
854 pub span: Span,
867
868 pub ty: ty::EarlyBinder<'tcx, Ty<'tcx>>,
870}
871
872impl<'tcx> DefinitionSiteHiddenType<'tcx> {
873 pub fn new_error(tcx: TyCtxt<'tcx>, guar: ErrorGuaranteed) -> DefinitionSiteHiddenType<'tcx> {
874 DefinitionSiteHiddenType {
875 span: DUMMY_SP,
876 ty: ty::EarlyBinder::bind(Ty::new_error(tcx, guar)),
877 }
878 }
879
880 pub fn build_mismatch_error(
881 &self,
882 other: &Self,
883 tcx: TyCtxt<'tcx>,
884 ) -> Result<Diag<'tcx>, ErrorGuaranteed> {
885 let self_ty = self.ty.instantiate_identity();
886 let other_ty = other.ty.instantiate_identity();
887 (self_ty, other_ty).error_reported()?;
888 let sub_diag = if self.span == other.span {
890 TypeMismatchReason::ConflictType { span: self.span }
891 } else {
892 TypeMismatchReason::PreviousUse { span: self.span }
893 };
894 Ok(tcx.dcx().create_err(OpaqueHiddenTypeMismatch {
895 self_ty,
896 other_ty,
897 other_span: other.span,
898 sub: sub_diag,
899 }))
900 }
901}
902
903pub type Clauses<'tcx> = &'tcx ListWithCachedTypeInfo<Clause<'tcx>>;
904
905impl<'tcx> rustc_type_ir::Flags for Clauses<'tcx> {
906 fn flags(&self) -> TypeFlags {
907 (**self).flags()
908 }
909
910 fn outer_exclusive_binder(&self) -> DebruijnIndex {
911 (**self).outer_exclusive_binder()
912 }
913}
914
915#[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)]
921#[derive(const _: () =
{
impl<'tcx, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for ParamEnv<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
ParamEnv { caller_bounds: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, 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)]
922pub struct ParamEnv<'tcx> {
923 caller_bounds: Clauses<'tcx>,
929}
930
931impl<'tcx> rustc_type_ir::inherent::ParamEnv<TyCtxt<'tcx>> for ParamEnv<'tcx> {
932 fn caller_bounds(self) -> impl inherent::SliceLike<Item = ty::Clause<'tcx>> {
933 self.caller_bounds()
934 }
935}
936
937impl<'tcx> ParamEnv<'tcx> {
938 #[inline]
945 pub fn empty() -> Self {
946 Self::new(ListWithCachedTypeInfo::empty())
947 }
948
949 #[inline]
950 pub fn caller_bounds(self) -> Clauses<'tcx> {
951 self.caller_bounds
952 }
953
954 #[inline]
956 pub fn new(caller_bounds: Clauses<'tcx>) -> Self {
957 ParamEnv { caller_bounds }
958 }
959
960 pub fn and<T: TypeVisitable<TyCtxt<'tcx>>>(self, value: T) -> ParamEnvAnd<'tcx, T> {
962 ParamEnvAnd { param_env: self, value }
963 }
964}
965
966#[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)]
967#[derive(const _: () =
{
impl<'tcx, '__ctx, T>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for ParamEnvAnd<'tcx, T> where
T: ::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
{
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
ParamEnvAnd {
param_env: ref __binding_0, value: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
968pub struct ParamEnvAnd<'tcx, T> {
969 pub param_env: ParamEnv<'tcx>,
970 pub value: T,
971}
972
973#[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, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for TypingEnv<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
TypingEnv {
typing_mode: ref __binding_0, param_env: ref __binding_1 }
=> {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
984#[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)]
985pub struct TypingEnv<'tcx> {
986 #[type_foldable(identity)]
987 #[type_visitable(ignore)]
988 typing_mode: TypingModeEqWrapper<'tcx>,
989 pub param_env: ParamEnv<'tcx>,
990}
991
992impl<'tcx> TypingEnv<'tcx> {
993 pub fn new(param_env: ParamEnv<'tcx>, typing_mode: TypingMode<'tcx>) -> Self {
994 Self { typing_mode: TypingModeEqWrapper(typing_mode), param_env }
995 }
996
997 pub fn typing_mode(&self) -> TypingMode<'tcx> {
998 self.typing_mode.0
999 }
1000
1001 pub fn fully_monomorphized() -> TypingEnv<'tcx> {
1009 Self::new(ParamEnv::empty(), TypingMode::PostAnalysis)
1010 }
1011
1012 pub fn non_body_analysis(
1018 tcx: TyCtxt<'tcx>,
1019 def_id: impl IntoQueryKey<DefId>,
1020 ) -> TypingEnv<'tcx> {
1021 let def_id = def_id.into_query_key();
1022 Self::new(tcx.param_env(def_id), TypingMode::non_body_analysis())
1023 }
1024
1025 pub fn post_analysis(tcx: TyCtxt<'tcx>, def_id: impl IntoQueryKey<DefId>) -> TypingEnv<'tcx> {
1026 let def_id = def_id.into_query_key();
1027 tcx.typing_env_normalized_for_post_analysis(def_id)
1028 }
1029
1030 pub fn with_post_analysis_normalized(self, tcx: TyCtxt<'tcx>) -> TypingEnv<'tcx> {
1033 let TypingEnv { typing_mode, param_env } = self;
1034 match typing_mode.0 {
1035 TypingMode::Coherence
1036 | TypingMode::Analysis { .. }
1037 | TypingMode::Borrowck { .. }
1038 | TypingMode::PostBorrowckAnalysis { .. } => {}
1039 TypingMode::PostAnalysis => return self,
1040 }
1041
1042 let param_env = if tcx.next_trait_solver_globally() {
1045 param_env
1046 } else {
1047 ParamEnv::new(tcx.reveal_opaque_types_in_bounds(param_env.caller_bounds()))
1048 };
1049 TypingEnv { typing_mode: TypingModeEqWrapper(TypingMode::PostAnalysis), param_env }
1050 }
1051
1052 pub fn as_query_input<T>(self, value: T) -> PseudoCanonicalInput<'tcx, T>
1057 where
1058 T: TypeVisitable<TyCtxt<'tcx>>,
1059 {
1060 PseudoCanonicalInput { typing_env: self, value }
1073 }
1074}
1075
1076#[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)]
1086#[derive(const _: () =
{
impl<'tcx, '__ctx, T>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for PseudoCanonicalInput<'tcx, T> where
T: ::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
{
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
PseudoCanonicalInput {
typing_env: ref __binding_0, value: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, 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)]
1087pub struct PseudoCanonicalInput<'tcx, T> {
1088 pub typing_env: TypingEnv<'tcx>,
1089 pub value: T,
1090}
1091
1092#[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<'__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for Destructor {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
Destructor { did: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, 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)]
1093pub struct Destructor {
1094 pub did: DefId,
1096}
1097
1098#[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<'__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for AsyncDestructor {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
AsyncDestructor { impl_did: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, 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)]
1100pub struct AsyncDestructor {
1101 pub impl_did: DefId,
1103}
1104
1105#[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<'__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for VariantFlags {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
VariantFlags(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, 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)]
1106pub struct VariantFlags(u8);
1107impl 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! {
1108 impl VariantFlags: u8 {
1109 const NO_VARIANT_FLAGS = 0;
1110 const IS_FIELD_LIST_NON_EXHAUSTIVE = 1 << 0;
1112 }
1113}
1114impl ::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 }
1115
1116#[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<'__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for VariantDef {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::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.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
{ __binding_3.hash_stable(__hcx, __hasher); }
{ __binding_4.hash_stable(__hcx, __hasher); }
{ __binding_5.hash_stable(__hcx, __hasher); }
{ __binding_6.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, 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)]
1118pub struct VariantDef {
1119 pub def_id: DefId,
1122 pub ctor: Option<(CtorKind, DefId)>,
1125 pub name: Symbol,
1127 pub discr: VariantDiscr,
1129 pub fields: IndexVec<FieldIdx, FieldDef>,
1131 tainted: Option<ErrorGuaranteed>,
1133 flags: VariantFlags,
1135}
1136
1137impl VariantDef {
1138 #[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(1154u32),
::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")]
1155 pub fn new(
1156 name: Symbol,
1157 variant_did: Option<DefId>,
1158 ctor: Option<(CtorKind, DefId)>,
1159 discr: VariantDiscr,
1160 fields: IndexVec<FieldIdx, FieldDef>,
1161 parent_did: DefId,
1162 recover_tainted: Option<ErrorGuaranteed>,
1163 is_field_list_non_exhaustive: bool,
1164 ) -> Self {
1165 let mut flags = VariantFlags::NO_VARIANT_FLAGS;
1166 if is_field_list_non_exhaustive {
1167 flags |= VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE;
1168 }
1169
1170 VariantDef {
1171 def_id: variant_did.unwrap_or(parent_did),
1172 ctor,
1173 name,
1174 discr,
1175 fields,
1176 flags,
1177 tainted: recover_tainted,
1178 }
1179 }
1180
1181 #[inline]
1187 pub fn is_field_list_non_exhaustive(&self) -> bool {
1188 self.flags.intersects(VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE)
1189 }
1190
1191 #[inline]
1194 pub fn field_list_has_applicable_non_exhaustive(&self) -> bool {
1195 self.is_field_list_non_exhaustive() && !self.def_id.is_local()
1196 }
1197
1198 pub fn ident(&self, tcx: TyCtxt<'_>) -> Ident {
1200 Ident::new(self.name, tcx.def_ident_span(self.def_id).unwrap())
1201 }
1202
1203 #[inline]
1205 pub fn has_errors(&self) -> Result<(), ErrorGuaranteed> {
1206 self.tainted.map_or(Ok(()), Err)
1207 }
1208
1209 #[inline]
1210 pub fn ctor_kind(&self) -> Option<CtorKind> {
1211 self.ctor.map(|(kind, _)| kind)
1212 }
1213
1214 #[inline]
1215 pub fn ctor_def_id(&self) -> Option<DefId> {
1216 self.ctor.map(|(_, def_id)| def_id)
1217 }
1218
1219 #[inline]
1223 pub fn single_field(&self) -> &FieldDef {
1224 if !(self.fields.len() == 1) {
::core::panicking::panic("assertion failed: self.fields.len() == 1")
};assert!(self.fields.len() == 1);
1225
1226 &self.fields[FieldIdx::ZERO]
1227 }
1228
1229 #[inline]
1231 pub fn tail_opt(&self) -> Option<&FieldDef> {
1232 self.fields.raw.last()
1233 }
1234
1235 #[inline]
1241 pub fn tail(&self) -> &FieldDef {
1242 self.tail_opt().expect("expected unsized ADT to have a tail field")
1243 }
1244
1245 pub fn has_unsafe_fields(&self) -> bool {
1247 self.fields.iter().any(|x| x.safety.is_unsafe())
1248 }
1249}
1250
1251impl PartialEq for VariantDef {
1252 #[inline]
1253 fn eq(&self, other: &Self) -> bool {
1254 let Self {
1262 def_id: lhs_def_id,
1263 ctor: _,
1264 name: _,
1265 discr: _,
1266 fields: _,
1267 flags: _,
1268 tainted: _,
1269 } = &self;
1270 let Self {
1271 def_id: rhs_def_id,
1272 ctor: _,
1273 name: _,
1274 discr: _,
1275 fields: _,
1276 flags: _,
1277 tainted: _,
1278 } = other;
1279
1280 let res = lhs_def_id == rhs_def_id;
1281
1282 if truecfg!(debug_assertions) && res {
1284 let deep = self.ctor == other.ctor
1285 && self.name == other.name
1286 && self.discr == other.discr
1287 && self.fields == other.fields
1288 && self.flags == other.flags;
1289 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");
1290 }
1291
1292 res
1293 }
1294}
1295
1296impl Eq for VariantDef {}
1297
1298impl Hash for VariantDef {
1299 #[inline]
1300 fn hash<H: Hasher>(&self, s: &mut H) {
1301 let Self { def_id, ctor: _, name: _, discr: _, fields: _, flags: _, tainted: _ } = &self;
1309 def_id.hash(s)
1310 }
1311}
1312
1313#[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<'__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for VariantDiscr {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self {
VariantDiscr::Explicit(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
VariantDiscr::Relative(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
1314pub enum VariantDiscr {
1315 Explicit(DefId),
1318
1319 Relative(u32),
1324}
1325
1326#[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<'__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for FieldDef {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::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.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
{ __binding_3.hash_stable(__hcx, __hasher); }
{ __binding_4.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, 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)]
1327pub struct FieldDef {
1328 pub did: DefId,
1329 pub name: Symbol,
1330 pub vis: Visibility<DefId>,
1331 pub safety: hir::Safety,
1332 pub value: Option<DefId>,
1333}
1334
1335impl PartialEq for FieldDef {
1336 #[inline]
1337 fn eq(&self, other: &Self) -> bool {
1338 let Self { did: lhs_did, name: _, vis: _, safety: _, value: _ } = &self;
1346
1347 let Self { did: rhs_did, name: _, vis: _, safety: _, value: _ } = other;
1348
1349 let res = lhs_did == rhs_did;
1350
1351 if truecfg!(debug_assertions) && res {
1353 let deep =
1354 self.name == other.name && self.vis == other.vis && self.safety == other.safety;
1355 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");
1356 }
1357
1358 res
1359 }
1360}
1361
1362impl Eq for FieldDef {}
1363
1364impl Hash for FieldDef {
1365 #[inline]
1366 fn hash<H: Hasher>(&self, s: &mut H) {
1367 let Self { did, name: _, vis: _, safety: _, value: _ } = &self;
1375
1376 did.hash(s)
1377 }
1378}
1379
1380impl<'tcx> FieldDef {
1381 pub fn ty(&self, tcx: TyCtxt<'tcx>, args: GenericArgsRef<'tcx>) -> Ty<'tcx> {
1384 tcx.type_of(self.did).instantiate(tcx, args)
1385 }
1386
1387 pub fn ident(&self, tcx: TyCtxt<'_>) -> Ident {
1389 Ident::new(self.name, tcx.def_ident_span(self.did).unwrap())
1390 }
1391}
1392
1393#[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)]
1394pub enum ImplOverlapKind {
1395 Permitted {
1397 marker: bool,
1399 },
1400}
1401
1402#[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<'__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for ImplTraitInTraitData {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self {
ImplTraitInTraitData::Trait {
fn_def_id: ref __binding_0, opaque_def_id: ref __binding_1 }
=> {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
ImplTraitInTraitData::Impl { fn_def_id: ref __binding_0 } =>
{
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
1405pub enum ImplTraitInTraitData {
1406 Trait { fn_def_id: DefId, opaque_def_id: DefId },
1407 Impl { fn_def_id: DefId },
1408}
1409
1410impl<'tcx> TyCtxt<'tcx> {
1411 pub fn typeck_body(self, body: hir::BodyId) -> &'tcx TypeckResults<'tcx> {
1412 self.typeck(self.hir_body_owner_def_id(body))
1413 }
1414
1415 pub fn provided_trait_methods(self, id: DefId) -> impl 'tcx + Iterator<Item = &'tcx AssocItem> {
1416 self.associated_items(id)
1417 .in_definition_order()
1418 .filter(move |item| item.is_fn() && item.defaultness(self).has_value())
1419 }
1420
1421 pub fn repr_options_of_def(self, did: LocalDefId) -> ReprOptions {
1422 let mut flags = ReprFlags::empty();
1423 let mut size = None;
1424 let mut max_align: Option<Align> = None;
1425 let mut min_pack: Option<Align> = None;
1426
1427 let mut field_shuffle_seed = self.def_path_hash(did.to_def_id()).0.to_smaller_hash();
1430
1431 if let Some(user_seed) = self.sess.opts.unstable_opts.layout_seed {
1435 field_shuffle_seed ^= user_seed;
1436 }
1437
1438 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
1439 )
1440 .map(|elt| match elt {
1441 Some(n) => ScalableElt::ElementCount(*n),
1442 None => ScalableElt::Container,
1443 });
1444 if elt.is_some() {
1445 flags.insert(ReprFlags::IS_SCALABLE);
1446 }
1447 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) {
1448 for (r, _) in reprs {
1449 flags.insert(match *r {
1450 attr::ReprRust => ReprFlags::empty(),
1451 attr::ReprC => ReprFlags::IS_C,
1452 attr::ReprPacked(pack) => {
1453 min_pack = Some(if let Some(min_pack) = min_pack {
1454 min_pack.min(pack)
1455 } else {
1456 pack
1457 });
1458 ReprFlags::empty()
1459 }
1460 attr::ReprTransparent => ReprFlags::IS_TRANSPARENT,
1461 attr::ReprSimd => ReprFlags::IS_SIMD,
1462 attr::ReprInt(i) => {
1463 size = Some(match i {
1464 attr::IntType::SignedInt(x) => match x {
1465 ast::IntTy::Isize => IntegerType::Pointer(true),
1466 ast::IntTy::I8 => IntegerType::Fixed(Integer::I8, true),
1467 ast::IntTy::I16 => IntegerType::Fixed(Integer::I16, true),
1468 ast::IntTy::I32 => IntegerType::Fixed(Integer::I32, true),
1469 ast::IntTy::I64 => IntegerType::Fixed(Integer::I64, true),
1470 ast::IntTy::I128 => IntegerType::Fixed(Integer::I128, true),
1471 },
1472 attr::IntType::UnsignedInt(x) => match x {
1473 ast::UintTy::Usize => IntegerType::Pointer(false),
1474 ast::UintTy::U8 => IntegerType::Fixed(Integer::I8, false),
1475 ast::UintTy::U16 => IntegerType::Fixed(Integer::I16, false),
1476 ast::UintTy::U32 => IntegerType::Fixed(Integer::I32, false),
1477 ast::UintTy::U64 => IntegerType::Fixed(Integer::I64, false),
1478 ast::UintTy::U128 => IntegerType::Fixed(Integer::I128, false),
1479 },
1480 });
1481 ReprFlags::empty()
1482 }
1483 attr::ReprAlign(align) => {
1484 max_align = max_align.max(Some(align));
1485 ReprFlags::empty()
1486 }
1487 });
1488 }
1489 }
1490
1491 if self.sess.opts.unstable_opts.randomize_layout {
1494 flags.insert(ReprFlags::RANDOMIZE_LAYOUT);
1495 }
1496
1497 let is_box = self.is_lang_item(did.to_def_id(), LangItem::OwnedBox);
1500
1501 if is_box {
1503 flags.insert(ReprFlags::IS_LINEAR);
1504 }
1505
1506 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(..)) {
1508 flags.insert(ReprFlags::PASS_INDIRECTLY_IN_NON_RUSTIC_ABIS);
1509 }
1510
1511 ReprOptions {
1512 int: size,
1513 align: max_align,
1514 pack: min_pack,
1515 flags,
1516 field_shuffle_seed,
1517 scalable: elt,
1518 }
1519 }
1520
1521 pub fn opt_item_name(self, def_id: impl IntoQueryKey<DefId>) -> Option<Symbol> {
1523 let def_id = def_id.into_query_key();
1524 if let Some(cnum) = def_id.as_crate_root() {
1525 Some(self.crate_name(cnum))
1526 } else {
1527 let def_key = self.def_key(def_id);
1528 match def_key.disambiguated_data.data {
1529 rustc_hir::definitions::DefPathData::Ctor => self
1531 .opt_item_name(DefId { krate: def_id.krate, index: def_key.parent.unwrap() }),
1532 _ => def_key.get_opt_name(),
1533 }
1534 }
1535 }
1536
1537 pub fn item_name(self, id: impl IntoQueryKey<DefId>) -> Symbol {
1544 let id = id.into_query_key();
1545 self.opt_item_name(id).unwrap_or_else(|| {
1546 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));
1547 })
1548 }
1549
1550 pub fn opt_item_ident(self, def_id: impl IntoQueryKey<DefId>) -> Option<Ident> {
1554 let def_id = def_id.into_query_key();
1555 let def = self.opt_item_name(def_id)?;
1556 let span = self
1557 .def_ident_span(def_id)
1558 .unwrap_or_else(|| crate::util::bug::bug_fmt(format_args!("missing ident span for {0:?}",
def_id))bug!("missing ident span for {def_id:?}"));
1559 Some(Ident::new(def, span))
1560 }
1561
1562 pub fn item_ident(self, def_id: impl IntoQueryKey<DefId>) -> Ident {
1566 let def_id = def_id.into_query_key();
1567 self.opt_item_ident(def_id).unwrap_or_else(|| {
1568 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));
1569 })
1570 }
1571
1572 pub fn opt_associated_item(self, def_id: DefId) -> Option<AssocItem> {
1573 if let DefKind::AssocConst { .. } | DefKind::AssocFn | DefKind::AssocTy =
1574 self.def_kind(def_id)
1575 {
1576 Some(self.associated_item(def_id))
1577 } else {
1578 None
1579 }
1580 }
1581
1582 pub fn opt_rpitit_info(self, def_id: DefId) -> Option<ImplTraitInTraitData> {
1586 if let DefKind::AssocTy = self.def_kind(def_id)
1587 && let AssocKind::Type { data: AssocTypeData::Rpitit(rpitit_info) } =
1588 self.associated_item(def_id).kind
1589 {
1590 Some(rpitit_info)
1591 } else {
1592 None
1593 }
1594 }
1595
1596 pub fn find_field_index(self, ident: Ident, variant: &VariantDef) -> Option<FieldIdx> {
1597 variant.fields.iter_enumerated().find_map(|(i, field)| {
1598 self.hygienic_eq(ident, field.ident(self), variant.def_id).then_some(i)
1599 })
1600 }
1601
1602 x;#[instrument(level = "debug", skip(self), ret)]
1605 pub fn impls_are_allowed_to_overlap(
1606 self,
1607 def_id1: DefId,
1608 def_id2: DefId,
1609 ) -> Option<ImplOverlapKind> {
1610 let impl1 = self.impl_trait_header(def_id1);
1611 let impl2 = self.impl_trait_header(def_id2);
1612
1613 let trait_ref1 = impl1.trait_ref.skip_binder();
1614 let trait_ref2 = impl2.trait_ref.skip_binder();
1615
1616 if trait_ref1.references_error() || trait_ref2.references_error() {
1619 return Some(ImplOverlapKind::Permitted { marker: false });
1620 }
1621
1622 match (impl1.polarity, impl2.polarity) {
1623 (ImplPolarity::Reservation, _) | (_, ImplPolarity::Reservation) => {
1624 return Some(ImplOverlapKind::Permitted { marker: false });
1626 }
1627 (ImplPolarity::Positive, ImplPolarity::Negative)
1628 | (ImplPolarity::Negative, ImplPolarity::Positive) => {
1629 return None;
1631 }
1632 (ImplPolarity::Positive, ImplPolarity::Positive)
1633 | (ImplPolarity::Negative, ImplPolarity::Negative) => {}
1634 };
1635
1636 let is_marker_impl = |trait_ref: TraitRef<'_>| self.trait_def(trait_ref.def_id).is_marker;
1637 let is_marker_overlap = is_marker_impl(trait_ref1) && is_marker_impl(trait_ref2);
1638
1639 if is_marker_overlap {
1640 return Some(ImplOverlapKind::Permitted { marker: true });
1641 }
1642
1643 None
1644 }
1645
1646 pub fn expect_variant_res(self, res: Res) -> &'tcx VariantDef {
1649 match res {
1650 Res::Def(DefKind::Variant, did) => {
1651 let enum_did = self.parent(did);
1652 self.adt_def(enum_did).variant_with_id(did)
1653 }
1654 Res::Def(DefKind::Struct | DefKind::Union, did) => self.adt_def(did).non_enum_variant(),
1655 Res::Def(DefKind::Ctor(CtorOf::Variant, ..), variant_ctor_did) => {
1656 let variant_did = self.parent(variant_ctor_did);
1657 let enum_did = self.parent(variant_did);
1658 self.adt_def(enum_did).variant_with_ctor_id(variant_ctor_did)
1659 }
1660 Res::Def(DefKind::Ctor(CtorOf::Struct, ..), ctor_did) => {
1661 let struct_did = self.parent(ctor_did);
1662 self.adt_def(struct_did).non_enum_variant()
1663 }
1664 _ => 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),
1665 }
1666 }
1667
1668 #[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(1669u32),
::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:1673",
"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(1673u32),
::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:1675",
"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(1675u32),
::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")]
1670 pub fn instance_mir(self, instance: ty::InstanceKind<'tcx>) -> &'tcx Body<'tcx> {
1671 match instance {
1672 ty::InstanceKind::Item(def) => {
1673 debug!("calling def_kind on def: {:?}", def);
1674 let def_kind = self.def_kind(def);
1675 debug!("returned from def_kind: {:?}", def_kind);
1676 match def_kind {
1677 DefKind::Const { .. }
1678 | DefKind::Static { .. }
1679 | DefKind::AssocConst { .. }
1680 | DefKind::Ctor(..)
1681 | DefKind::AnonConst
1682 | DefKind::InlineConst => self.mir_for_ctfe(def),
1683 _ => self.optimized_mir(def),
1686 }
1687 }
1688 ty::InstanceKind::VTableShim(..)
1689 | ty::InstanceKind::ReifyShim(..)
1690 | ty::InstanceKind::Intrinsic(..)
1691 | ty::InstanceKind::FnPtrShim(..)
1692 | ty::InstanceKind::Virtual(..)
1693 | ty::InstanceKind::ClosureOnceShim { .. }
1694 | ty::InstanceKind::ConstructCoroutineInClosureShim { .. }
1695 | ty::InstanceKind::FutureDropPollShim(..)
1696 | ty::InstanceKind::DropGlue(..)
1697 | ty::InstanceKind::CloneShim(..)
1698 | ty::InstanceKind::ThreadLocalShim(..)
1699 | ty::InstanceKind::FnPtrAddrShim(..)
1700 | ty::InstanceKind::AsyncDropGlueCtorShim(..)
1701 | ty::InstanceKind::AsyncDropGlue(..) => self.mir_shims(instance),
1702 }
1703 }
1704
1705 #[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."]
1707 pub fn get_attrs(
1708 self,
1709 did: impl Into<DefId>,
1710 attr: Symbol,
1711 ) -> impl Iterator<Item = &'tcx hir::Attribute> {
1712 #[allow(deprecated)]
1713 self.get_all_attrs(did).iter().filter(move |a: &&hir::Attribute| a.has_name(attr))
1714 }
1715
1716 #[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."]
1721 pub fn get_all_attrs(self, did: impl Into<DefId>) -> &'tcx [hir::Attribute] {
1722 let did: DefId = did.into();
1723 if let Some(did) = did.as_local() {
1724 self.hir_attrs(self.local_def_id_to_hir_id(did))
1725 } else {
1726 self.attrs_for_def(did)
1727 }
1728 }
1729
1730 pub fn get_attrs_by_path(
1731 self,
1732 did: DefId,
1733 attr: &[Symbol],
1734 ) -> impl Iterator<Item = &'tcx hir::Attribute> {
1735 let filter_fn = move |a: &&hir::Attribute| a.path_matches(attr);
1736 if let Some(did) = did.as_local() {
1737 self.hir_attrs(self.local_def_id_to_hir_id(did)).iter().filter(filter_fn)
1738 } else {
1739 self.attrs_for_def(did).iter().filter(filter_fn)
1740 }
1741 }
1742
1743 pub fn trait_is_auto(self, trait_def_id: DefId) -> bool {
1745 self.trait_def(trait_def_id).has_auto_impl
1746 }
1747
1748 pub fn trait_is_coinductive(self, trait_def_id: DefId) -> bool {
1751 self.trait_def(trait_def_id).is_coinductive
1752 }
1753
1754 pub fn trait_is_alias(self, trait_def_id: DefId) -> bool {
1756 self.def_kind(trait_def_id) == DefKind::TraitAlias
1757 }
1758
1759 fn layout_error(self, err: LayoutError<'tcx>) -> &'tcx LayoutError<'tcx> {
1761 self.arena.alloc(err)
1762 }
1763
1764 fn ordinary_coroutine_layout(
1770 self,
1771 def_id: DefId,
1772 args: GenericArgsRef<'tcx>,
1773 ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1774 let coroutine_kind_ty = args.as_coroutine().kind_ty();
1775 let mir = self.optimized_mir(def_id);
1776 let ty = || Ty::new_coroutine(self, def_id, args);
1777 if coroutine_kind_ty.is_unit() {
1779 mir.coroutine_layout_raw().ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1780 } else {
1781 let ty::Coroutine(_, identity_args) =
1784 *self.type_of(def_id).instantiate_identity().kind()
1785 else {
1786 ::core::panicking::panic("internal error: entered unreachable code");unreachable!();
1787 };
1788 let identity_kind_ty = identity_args.as_coroutine().kind_ty();
1789 if identity_kind_ty == coroutine_kind_ty {
1792 mir.coroutine_layout_raw()
1793 .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1794 } else {
1795 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));
1796 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!(
1797 identity_kind_ty.to_opt_closure_kind(),
1798 Some(ClosureKind::Fn | ClosureKind::FnMut)
1799 );
1800 self.optimized_mir(self.coroutine_by_move_body_def_id(def_id))
1801 .coroutine_layout_raw()
1802 .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1803 }
1804 }
1805 }
1806
1807 fn async_drop_coroutine_layout(
1811 self,
1812 def_id: DefId,
1813 args: GenericArgsRef<'tcx>,
1814 ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1815 let ty = || Ty::new_coroutine(self, def_id, args);
1816 if args[0].has_placeholders() || args[0].has_non_region_param() {
1817 return Err(self.layout_error(LayoutError::TooGeneric(ty())));
1818 }
1819 let instance = InstanceKind::AsyncDropGlue(def_id, Ty::new_coroutine(self, def_id, args));
1820 self.mir_shims(instance)
1821 .coroutine_layout_raw()
1822 .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1823 }
1824
1825 pub fn coroutine_layout(
1828 self,
1829 def_id: DefId,
1830 args: GenericArgsRef<'tcx>,
1831 ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1832 if self.is_async_drop_in_place_coroutine(def_id) {
1833 let arg_cor_ty = args.first().unwrap().expect_ty();
1837 if arg_cor_ty.is_coroutine() {
1838 let span = self.def_span(def_id);
1839 let source_info = SourceInfo::outermost(span);
1840 let variant_fields: IndexVec<VariantIdx, IndexVec<FieldIdx, CoroutineSavedLocal>> =
1843 iter::repeat(IndexVec::new()).take(CoroutineArgs::RESERVED_VARIANTS).collect();
1844 let variant_source_info: IndexVec<VariantIdx, SourceInfo> =
1845 iter::repeat(source_info).take(CoroutineArgs::RESERVED_VARIANTS).collect();
1846 let proxy_layout = CoroutineLayout {
1847 field_tys: [].into(),
1848 field_names: [].into(),
1849 variant_fields,
1850 variant_source_info,
1851 storage_conflicts: BitMatrix::new(0, 0),
1852 };
1853 return Ok(self.arena.alloc(proxy_layout));
1854 } else {
1855 self.async_drop_coroutine_layout(def_id, args)
1856 }
1857 } else {
1858 self.ordinary_coroutine_layout(def_id, args)
1859 }
1860 }
1861
1862 pub fn assoc_parent(self, def_id: DefId) -> Option<(DefId, DefKind)> {
1864 if !self.def_kind(def_id).is_assoc() {
1865 return None;
1866 }
1867 let parent = self.parent(def_id);
1868 let def_kind = self.def_kind(parent);
1869 Some((parent, def_kind))
1870 }
1871
1872 pub fn trait_item_of(self, def_id: impl IntoQueryKey<DefId>) -> Option<DefId> {
1874 let def_id = def_id.into_query_key();
1875 self.opt_associated_item(def_id)?.trait_item_def_id()
1876 }
1877
1878 pub fn trait_of_assoc(self, def_id: DefId) -> Option<DefId> {
1881 match self.assoc_parent(def_id) {
1882 Some((id, DefKind::Trait)) => Some(id),
1883 _ => None,
1884 }
1885 }
1886
1887 pub fn impl_is_of_trait(self, def_id: impl IntoQueryKey<DefId>) -> bool {
1888 let def_id = def_id.into_query_key();
1889 let DefKind::Impl { of_trait } = self.def_kind(def_id) else {
1890 {
::core::panicking::panic_fmt(format_args!("expected Impl for {0:?}",
def_id));
};panic!("expected Impl for {def_id:?}");
1891 };
1892 of_trait
1893 }
1894
1895 pub fn impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
1898 match self.assoc_parent(def_id) {
1899 Some((id, DefKind::Impl { .. })) => Some(id),
1900 _ => None,
1901 }
1902 }
1903
1904 pub fn inherent_impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
1907 match self.assoc_parent(def_id) {
1908 Some((id, DefKind::Impl { of_trait: false })) => Some(id),
1909 _ => None,
1910 }
1911 }
1912
1913 pub fn trait_impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
1916 match self.assoc_parent(def_id) {
1917 Some((id, DefKind::Impl { of_trait: true })) => Some(id),
1918 _ => None,
1919 }
1920 }
1921
1922 pub fn impl_polarity(self, def_id: impl IntoQueryKey<DefId>) -> ty::ImplPolarity {
1923 let def_id = def_id.into_query_key();
1924 self.impl_trait_header(def_id).polarity
1925 }
1926
1927 pub fn impl_trait_ref(
1929 self,
1930 def_id: impl IntoQueryKey<DefId>,
1931 ) -> ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>> {
1932 let def_id = def_id.into_query_key();
1933 self.impl_trait_header(def_id).trait_ref
1934 }
1935
1936 pub fn impl_opt_trait_ref(
1939 self,
1940 def_id: impl IntoQueryKey<DefId>,
1941 ) -> Option<ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>>> {
1942 let def_id = def_id.into_query_key();
1943 self.impl_is_of_trait(def_id).then(|| self.impl_trait_ref(def_id))
1944 }
1945
1946 pub fn impl_trait_id(self, def_id: impl IntoQueryKey<DefId>) -> DefId {
1948 let def_id = def_id.into_query_key();
1949 self.impl_trait_ref(def_id).skip_binder().def_id
1950 }
1951
1952 pub fn impl_opt_trait_id(self, def_id: impl IntoQueryKey<DefId>) -> Option<DefId> {
1955 let def_id = def_id.into_query_key();
1956 self.impl_is_of_trait(def_id).then(|| self.impl_trait_id(def_id))
1957 }
1958
1959 pub fn is_exportable(self, def_id: DefId) -> bool {
1960 self.exportable_items(def_id.krate).contains(&def_id)
1961 }
1962
1963 pub fn is_builtin_derived(self, def_id: DefId) -> bool {
1966 if self.is_automatically_derived(def_id)
1967 && let Some(def_id) = def_id.as_local()
1968 && let outer = self.def_span(def_id).ctxt().outer_expn_data()
1969 && #[allow(non_exhaustive_omitted_patterns)] match outer.kind {
ExpnKind::Macro(MacroKind::Derive, _) => true,
_ => false,
}matches!(outer.kind, ExpnKind::Macro(MacroKind::Derive, _))
1970 && {
{
'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 { .. })
1971 {
1972 true
1973 } else {
1974 false
1975 }
1976 }
1977
1978 pub fn is_automatically_derived(self, def_id: DefId) -> bool {
1980 {
{
'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(..))
1981 }
1982
1983 pub fn span_of_impl(self, impl_def_id: DefId) -> Result<Span, Symbol> {
1986 if let Some(impl_def_id) = impl_def_id.as_local() {
1987 Ok(self.def_span(impl_def_id))
1988 } else {
1989 Err(self.crate_name(impl_def_id.krate))
1990 }
1991 }
1992
1993 pub fn hygienic_eq(self, use_ident: Ident, def_ident: Ident, def_parent_def_id: DefId) -> bool {
1997 use_ident.name == def_ident.name
2001 && use_ident
2002 .span
2003 .ctxt()
2004 .hygienic_eq(def_ident.span.ctxt(), self.expn_that_defined(def_parent_def_id))
2005 }
2006
2007 pub fn adjust_ident(self, mut ident: Ident, scope: DefId) -> Ident {
2008 ident.span.normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope));
2009 ident
2010 }
2011
2012 pub fn adjust_ident_and_get_scope(
2014 self,
2015 mut ident: Ident,
2016 scope: DefId,
2017 block: hir::HirId,
2018 ) -> (Ident, DefId) {
2019 let scope = ident
2020 .span
2021 .normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope))
2022 .and_then(|actual_expansion| actual_expansion.expn_data().parent_module)
2023 .unwrap_or_else(|| self.parent_module(block).to_def_id());
2024 (ident, scope)
2025 }
2026
2027 #[inline]
2031 pub fn is_const_fn(self, def_id: DefId) -> bool {
2032 #[allow(non_exhaustive_omitted_patterns)] match self.def_kind(def_id) {
DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(_, CtorKind::Fn) |
DefKind::Closure => true,
_ => false,
}matches!(
2033 self.def_kind(def_id),
2034 DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(_, CtorKind::Fn) | DefKind::Closure
2035 ) && self.constness(def_id) == hir::Constness::Const
2036 }
2037
2038 pub fn is_conditionally_const(self, def_id: impl Into<DefId>) -> bool {
2045 let def_id: DefId = def_id.into();
2046 match self.def_kind(def_id) {
2047 DefKind::Impl { of_trait: true } => {
2048 let header = self.impl_trait_header(def_id);
2049 header.constness == hir::Constness::Const
2050 && self.is_const_trait(header.trait_ref.skip_binder().def_id)
2051 }
2052 DefKind::Impl { of_trait: false } => self.constness(def_id) == hir::Constness::Const,
2053 DefKind::Fn | DefKind::Ctor(_, CtorKind::Fn) => {
2054 self.constness(def_id) == hir::Constness::Const
2055 }
2056 DefKind::TraitAlias | DefKind::Trait => self.is_const_trait(def_id),
2057 DefKind::AssocTy => {
2058 let parent_def_id = self.parent(def_id);
2059 match self.def_kind(parent_def_id) {
2060 DefKind::Impl { of_trait: false } => false,
2061 DefKind::Impl { of_trait: true } | DefKind::Trait => {
2062 self.is_conditionally_const(parent_def_id)
2063 }
2064 _ => 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:?}"),
2065 }
2066 }
2067 DefKind::AssocFn => {
2068 let parent_def_id = self.parent(def_id);
2069 match self.def_kind(parent_def_id) {
2070 DefKind::Impl { of_trait: false } => {
2071 self.constness(def_id) == hir::Constness::Const
2072 }
2073 DefKind::Impl { of_trait: true } => {
2074 let Some(trait_method_did) = self.trait_item_of(def_id) else {
2075 return false;
2076 };
2077 self.constness(trait_method_did) == hir::Constness::Const
2078 && self.is_conditionally_const(parent_def_id)
2079 }
2080 DefKind::Trait => {
2081 self.constness(def_id) == hir::Constness::Const
2082 && self.is_conditionally_const(parent_def_id)
2083 }
2084 _ => 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:?}"),
2085 }
2086 }
2087 DefKind::OpaqueTy => match self.opaque_ty_origin(def_id) {
2088 hir::OpaqueTyOrigin::FnReturn { parent, .. } => self.is_conditionally_const(parent),
2089 hir::OpaqueTyOrigin::AsyncFn { .. } => false,
2090 hir::OpaqueTyOrigin::TyAlias { .. } => false,
2092 },
2093 DefKind::Closure => self.constness(def_id) == hir::Constness::Const,
2094 DefKind::Ctor(_, CtorKind::Const)
2095 | DefKind::Mod
2096 | DefKind::Struct
2097 | DefKind::Union
2098 | DefKind::Enum
2099 | DefKind::Variant
2100 | DefKind::TyAlias
2101 | DefKind::ForeignTy
2102 | DefKind::TyParam
2103 | DefKind::Const { .. }
2104 | DefKind::ConstParam
2105 | DefKind::Static { .. }
2106 | DefKind::AssocConst { .. }
2107 | DefKind::Macro(_)
2108 | DefKind::ExternCrate
2109 | DefKind::Use
2110 | DefKind::ForeignMod
2111 | DefKind::AnonConst
2112 | DefKind::InlineConst
2113 | DefKind::Field
2114 | DefKind::LifetimeParam
2115 | DefKind::GlobalAsm
2116 | DefKind::SyntheticCoroutineBody => false,
2117 }
2118 }
2119
2120 #[inline]
2121 pub fn is_const_trait(self, def_id: DefId) -> bool {
2122 self.trait_def(def_id).constness == hir::Constness::Const
2123 }
2124
2125 pub fn impl_method_has_trait_impl_trait_tys(self, def_id: DefId) -> bool {
2126 if self.def_kind(def_id) != DefKind::AssocFn {
2127 return false;
2128 }
2129
2130 let Some(item) = self.opt_associated_item(def_id) else {
2131 return false;
2132 };
2133
2134 let AssocContainer::TraitImpl(Ok(trait_item_def_id)) = item.container else {
2135 return false;
2136 };
2137
2138 !self.associated_types_for_impl_traits_in_associated_fn(trait_item_def_id).is_empty()
2139 }
2140
2141 #[inline]
2156 pub fn fn_abi_of_instance(
2157 self,
2158 query: ty::PseudoCanonicalInput<'tcx, (ty::Instance<'tcx>, &'tcx ty::List<Ty<'tcx>>)>,
2159 ) -> Result<&'tcx FnAbi<'tcx, Ty<'tcx>>, &'tcx FnAbiError<'tcx>> {
2160 if self.sess.opts.optimize != OptLevel::No && self.sess.opts.incremental.is_none() {
2163 self.fn_abi_of_instance_raw(query)
2164 } else {
2165 self.fn_abi_of_instance_no_deduced_attrs(query)
2166 }
2167 }
2168}
2169
2170impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for DefId {
2173 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2174 if let Some(did) = self.as_local() {
2175 tcx.hir_attrs(tcx.local_def_id_to_hir_id(did))
2176 } else {
2177 tcx.attrs_for_def(self)
2178 }
2179 }
2180}
2181
2182impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for LocalDefId {
2183 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2184 tcx.hir_attrs(tcx.local_def_id_to_hir_id(self))
2185 }
2186}
2187
2188impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for hir::OwnerId {
2189 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2190 hir::attrs::HasAttrs::get_attrs(self.def_id, tcx)
2191 }
2192}
2193
2194impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for hir::HirId {
2195 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2196 tcx.hir_attrs(self)
2197 }
2198}
2199
2200pub fn provide(providers: &mut Providers) {
2201 closure::provide(providers);
2202 context::provide(providers);
2203 erase_regions::provide(providers);
2204 inhabitedness::provide(providers);
2205 util::provide(providers);
2206 print::provide(providers);
2207 super::util::bug::provide(providers);
2208 *providers = Providers {
2209 trait_impls_of: trait_def::trait_impls_of_provider,
2210 incoherent_impls: trait_def::incoherent_impls_provider,
2211 trait_impls_in_crate: trait_def::trait_impls_in_crate_provider,
2212 traits: trait_def::traits_provider,
2213 vtable_allocation: vtable::vtable_allocation_provider,
2214 ..*providers
2215 };
2216}
2217
2218#[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<'__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for CrateInherentImpls {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
CrateInherentImpls {
inherent_impls: ref __binding_0,
incoherent_impls: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
2224pub struct CrateInherentImpls {
2225 pub inherent_impls: FxIndexMap<LocalDefId, Vec<DefId>>,
2226 pub incoherent_impls: FxIndexMap<SimplifiedType, Vec<LocalDefId>>,
2227}
2228
2229#[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::cmp::PartialOrd::partial_cmp(&self.name, &other.name)
}
}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, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for SymbolName<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
SymbolName { name: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
2230pub struct SymbolName<'tcx> {
2231 pub name: &'tcx str,
2233}
2234
2235impl<'tcx> SymbolName<'tcx> {
2236 pub fn new(tcx: TyCtxt<'tcx>, name: &str) -> SymbolName<'tcx> {
2237 SymbolName { name: tcx.arena.alloc_str(name) }
2238 }
2239}
2240
2241impl<'tcx> fmt::Display for SymbolName<'tcx> {
2242 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2243 fmt::Display::fmt(&self.name, fmt)
2244 }
2245}
2246
2247impl<'tcx> fmt::Debug for SymbolName<'tcx> {
2248 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2249 fmt::Display::fmt(&self.name, fmt)
2250 }
2251}
2252
2253#[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, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for DestructuredAdtConst<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
DestructuredAdtConst {
variant: ref __binding_0, fields: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
2255pub struct DestructuredAdtConst<'tcx> {
2256 pub variant: VariantIdx,
2257 pub fields: &'tcx [ty::Const<'tcx>],
2258}
2259
2260pub fn fnc_typetrees<'tcx>(tcx: TyCtxt<'tcx>, fn_ty: Ty<'tcx>) -> FncTree {
2264 if tcx.sess.opts.unstable_opts.autodiff.contains(&rustc_session::config::AutoDiff::NoTT) {
2266 return FncTree { args: ::alloc::vec::Vec::new()vec![], ret: TypeTree::new() };
2267 }
2268
2269 if !fn_ty.is_fn() {
2271 return FncTree { args: ::alloc::vec::Vec::new()vec![], ret: TypeTree::new() };
2272 }
2273
2274 let fn_sig = fn_ty.fn_sig(tcx);
2276 let sig = tcx.instantiate_bound_regions_with_erased(fn_sig);
2277
2278 let mut args = ::alloc::vec::Vec::new()vec![];
2280 for ty in sig.inputs().iter() {
2281 let type_tree = typetree_from_ty(tcx, *ty);
2282 args.push(type_tree);
2283 }
2284
2285 let ret = typetree_from_ty(tcx, sig.output());
2287
2288 FncTree { args, ret }
2289}
2290
2291pub fn typetree_from_ty<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> TypeTree {
2294 let mut visited = Vec::new();
2295 typetree_from_ty_inner(tcx, ty, 0, &mut visited)
2296}
2297
2298const MAX_TYPETREE_DEPTH: usize = 6;
2301
2302fn typetree_from_ty_inner<'tcx>(
2304 tcx: TyCtxt<'tcx>,
2305 ty: Ty<'tcx>,
2306 depth: usize,
2307 visited: &mut Vec<Ty<'tcx>>,
2308) -> TypeTree {
2309 if depth >= MAX_TYPETREE_DEPTH {
2310 {
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:2310",
"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(2310u32),
::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);
2311 return TypeTree::new();
2312 }
2313
2314 if visited.contains(&ty) {
2315 return TypeTree::new();
2316 }
2317
2318 visited.push(ty);
2319 let result = typetree_from_ty_impl(tcx, ty, depth, visited);
2320 visited.pop();
2321 result
2322}
2323
2324fn typetree_from_ty_impl<'tcx>(
2326 tcx: TyCtxt<'tcx>,
2327 ty: Ty<'tcx>,
2328 depth: usize,
2329 visited: &mut Vec<Ty<'tcx>>,
2330) -> TypeTree {
2331 typetree_from_ty_impl_inner(tcx, ty, depth, visited, false)
2332}
2333
2334fn typetree_from_ty_impl_inner<'tcx>(
2336 tcx: TyCtxt<'tcx>,
2337 ty: Ty<'tcx>,
2338 depth: usize,
2339 visited: &mut Vec<Ty<'tcx>>,
2340 is_reference_target: bool,
2341) -> TypeTree {
2342 if ty.is_scalar() {
2343 let (kind, size) = if ty.is_integral() || ty.is_char() || ty.is_bool() {
2344 (Kind::Integer, ty.primitive_size(tcx).bytes_usize())
2345 } else if ty.is_floating_point() {
2346 match ty {
2347 x if x == tcx.types.f16 => (Kind::Half, 2),
2348 x if x == tcx.types.f32 => (Kind::Float, 4),
2349 x if x == tcx.types.f64 => (Kind::Double, 8),
2350 x if x == tcx.types.f128 => (Kind::F128, 16),
2351 _ => (Kind::Integer, 0),
2352 }
2353 } else {
2354 (Kind::Integer, 0)
2355 };
2356
2357 let offset = if is_reference_target && !ty.is_array() { 0 } else { -1 };
2360 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() }]);
2361 }
2362
2363 if ty.is_ref() || ty.is_raw_ptr() || ty.is_box() {
2364 let Some(inner_ty) = ty.builtin_deref(true) else {
2365 return TypeTree::new();
2366 };
2367
2368 let child = typetree_from_ty_impl_inner(tcx, inner_ty, depth + 1, visited, true);
2369 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 {
2370 offset: -1,
2371 size: tcx.data_layout.pointer_size().bytes_usize(),
2372 kind: Kind::Pointer,
2373 child,
2374 }]);
2375 }
2376
2377 if ty.is_array() {
2378 if let ty::Array(element_ty, len_const) = ty.kind() {
2379 let len = len_const.try_to_target_usize(tcx).unwrap_or(0);
2380 if len == 0 {
2381 return TypeTree::new();
2382 }
2383 let element_tree =
2384 typetree_from_ty_impl_inner(tcx, *element_ty, depth + 1, visited, false);
2385 let mut types = Vec::new();
2386 for elem_type in &element_tree.0 {
2387 types.push(Type {
2388 offset: -1,
2389 size: elem_type.size,
2390 kind: elem_type.kind,
2391 child: elem_type.child.clone(),
2392 });
2393 }
2394
2395 return TypeTree(types);
2396 }
2397 }
2398
2399 if ty.is_slice() {
2400 if let ty::Slice(element_ty) = ty.kind() {
2401 let element_tree =
2402 typetree_from_ty_impl_inner(tcx, *element_ty, depth + 1, visited, false);
2403 return element_tree;
2404 }
2405 }
2406
2407 if let ty::Tuple(tuple_types) = ty.kind() {
2408 if tuple_types.is_empty() {
2409 return TypeTree::new();
2410 }
2411
2412 let mut types = Vec::new();
2413 let mut current_offset = 0;
2414
2415 for tuple_ty in tuple_types.iter() {
2416 let element_tree =
2417 typetree_from_ty_impl_inner(tcx, tuple_ty, depth + 1, visited, false);
2418
2419 let element_layout = tcx
2420 .layout_of(ty::TypingEnv::fully_monomorphized().as_query_input(tuple_ty))
2421 .ok()
2422 .map(|layout| layout.size.bytes_usize())
2423 .unwrap_or(0);
2424
2425 for elem_type in &element_tree.0 {
2426 types.push(Type {
2427 offset: if elem_type.offset == -1 {
2428 current_offset as isize
2429 } else {
2430 current_offset as isize + elem_type.offset
2431 },
2432 size: elem_type.size,
2433 kind: elem_type.kind,
2434 child: elem_type.child.clone(),
2435 });
2436 }
2437
2438 current_offset += element_layout;
2439 }
2440
2441 return TypeTree(types);
2442 }
2443
2444 if let ty::Adt(adt_def, args) = ty.kind() {
2445 if adt_def.is_struct() {
2446 let struct_layout =
2447 tcx.layout_of(ty::TypingEnv::fully_monomorphized().as_query_input(ty));
2448 if let Ok(layout) = struct_layout {
2449 let mut types = Vec::new();
2450
2451 for (field_idx, field_def) in adt_def.all_fields().enumerate() {
2452 let field_ty = field_def.ty(tcx, args);
2453 let field_tree =
2454 typetree_from_ty_impl_inner(tcx, field_ty, depth + 1, visited, false);
2455
2456 let field_offset = layout.fields.offset(field_idx).bytes_usize();
2457
2458 for elem_type in &field_tree.0 {
2459 types.push(Type {
2460 offset: if elem_type.offset == -1 {
2461 field_offset as isize
2462 } else {
2463 field_offset as isize + elem_type.offset
2464 },
2465 size: elem_type.size,
2466 kind: elem_type.kind,
2467 child: elem_type.child.clone(),
2468 });
2469 }
2470 }
2471
2472 return TypeTree(types);
2473 }
2474 }
2475 }
2476
2477 TypeTree::new()
2478}