1#![allow(rustc::usage_of_ty_tykind)]
13
14use std::cmp::Ordering;
15use std::fmt::Debug;
16use std::hash::{Hash, Hasher};
17use std::marker::PhantomData;
18use std::num::NonZero;
19use std::ptr::NonNull;
20use std::{assert_matches, fmt, iter, str};
21
22pub use adt::*;
23pub use assoc::*;
24pub use generic_args::{GenericArgKind, TermKind, *};
25pub use generics::*;
26pub use intrinsic::IntrinsicDef;
27use rustc_abi::{
28 Align, FieldIdx, Integer, IntegerType, ReprFlags, ReprOptions, ScalableElt, VariantIdx,
29};
30use rustc_ast as ast;
31use rustc_ast::expand::typetree::{FncTree, Kind, Type, TypeTree};
32use rustc_ast::node_id::NodeMap;
33pub use rustc_ast_ir::{Movability, Mutability, try_visit};
34use rustc_data_structures::fx::{FxHashSet, FxIndexMap, FxIndexSet};
35use rustc_data_structures::intern::Interned;
36use rustc_data_structures::stable_hasher::{StableHash, StableHashCtxt, StableHasher};
37use rustc_data_structures::steal::Steal;
38use rustc_data_structures::unord::{UnordMap, UnordSet};
39use rustc_errors::{Diag, ErrorGuaranteed, LintBuffer};
40use rustc_hir as hir;
41use rustc_hir::attrs::StrippedCfgItem;
42use rustc_hir::def::{CtorKind, CtorOf, DefKind, DocLinkResMap, LifetimeRes, Res};
43use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, LocalDefIdMap};
44use rustc_hir::definitions::PerParentDisambiguatorState;
45use rustc_hir::{LangItem, attrs as attr, find_attr};
46use rustc_index::IndexVec;
47use rustc_index::bit_set::BitMatrix;
48use rustc_macros::{
49 BlobDecodable, Decodable, Encodable, StableHash, TyDecodable, TyEncodable, TypeFoldable,
50 TypeVisitable, extension,
51};
52use rustc_serialize::{Decodable, Encodable};
53use rustc_session::config::OptLevel;
54pub use rustc_session::lint::RegisteredTools;
55use rustc_span::hygiene::MacroKind;
56use rustc_span::{DUMMY_SP, ExpnId, ExpnKind, Ident, Span, Symbol};
57use rustc_target::callconv::FnAbi;
58pub use rustc_type_ir::data_structures::{DelayedMap, DelayedSet};
59pub use rustc_type_ir::fast_reject::DeepRejectCtxt;
60#[allow(
61 hidden_glob_reexports,
62 rustc::usage_of_type_ir_inherent,
63 rustc::non_glob_import_of_type_ir_inherent
64)]
65use rustc_type_ir::inherent;
66pub use rustc_type_ir::relate::VarianceDiagInfo;
67pub use rustc_type_ir::solve::{CandidatePreferenceMode, SizedTraitKind, VisibleForLeakCheck};
68pub use rustc_type_ir::*;
69#[allow(hidden_glob_reexports, unused_imports)]
70use rustc_type_ir::{InferCtxtLike, Interner};
71use tracing::{debug, instrument, trace};
72pub use vtable::*;
73
74pub use self::closure::{
75 BorrowKind, CAPTURE_STRUCT_LOCAL, CaptureInfo, CapturedPlace, ClosureTypeInfo,
76 MinCaptureInformationMap, MinCaptureList, RootVariableMinCaptureList, UpvarCapture, UpvarId,
77 UpvarPath, analyze_coroutine_closure_captures, is_ancestor_or_same_capture,
78 place_to_string_for_capture,
79};
80pub use self::consts::{
81 AtomicOrdering, Const, ConstInt, ConstKind, ConstToValTreeResult, Expr, ExprKind,
82 LitToConstInput, ScalarInt, SimdAlign, UnevaluatedConst, ValTree, ValTreeKindExt, Value,
83 const_lit_matches_ty,
84};
85pub use self::context::{
86 CtxtInterners, CurrentGcx, FreeRegionInfo, GlobalCtxt, Lift, TyCtxt, TyCtxtFeed, tls,
87};
88pub use self::fold::*;
89pub use self::instance::{Instance, InstanceKind, ReifyReason};
90pub(crate) use self::list::RawList;
91pub use self::list::{List, ListWithCachedTypeInfo};
92pub use self::opaque_types::OpaqueTypeKey;
93pub use self::pattern::{Pattern, PatternKind};
94pub use self::predicate::{
95 AliasTerm, AliasTermKind, ArgOutlivesPredicate, Clause, ClauseKind, CoercePredicate,
96 ExistentialPredicate, ExistentialPredicateStableCmpExt, ExistentialProjection,
97 ExistentialTraitRef, HostEffectPredicate, NormalizesTo, OutlivesPredicate, PolyCoercePredicate,
98 PolyExistentialPredicate, PolyExistentialProjection, PolyExistentialTraitRef,
99 PolyProjectionPredicate, PolyRegionOutlivesPredicate, PolySubtypePredicate, PolyTraitPredicate,
100 PolyTraitRef, PolyTypeOutlivesPredicate, Predicate, PredicateKind, ProjectionPredicate,
101 RegionConstraint, RegionEqPredicate, RegionOutlivesPredicate, SubtypePredicate, TraitPredicate,
102 TraitRef, TypeOutlivesPredicate,
103};
104pub use self::region::{
105 EarlyParamRegion, LateParamRegion, LateParamRegionKind, Region, RegionKind, RegionVid,
106};
107pub use self::sty::{
108 AliasTy, AliasTyKind, Article, Binder, BoundConst, BoundRegion, BoundRegionKind, BoundTy,
109 BoundTyKind, BoundVariableKind, CanonicalPolyFnSig, CoroutineArgsExt, EarlyBinder, FnSig,
110 FnSigKind, InlineConstArgs, InlineConstArgsParts, ParamConst, ParamTy, PlaceholderConst,
111 PlaceholderRegion, PlaceholderType, PolyFnSig, TyKind, TypeAndMut, TypingMode,
112 TypingModeEqWrapper, Unnormalized, UpvarArgs,
113};
114pub use self::trait_def::TraitDef;
115pub use self::typeck_results::{
116 CanonicalUserType, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations, IsIdentity,
117 Rust2024IncompatiblePatInfo, TypeckResults, UserType, UserTypeAnnotationIndex, UserTypeKind,
118};
119use crate::error::{OpaqueHiddenTypeMismatch, TypeMismatchReason};
120use crate::metadata::{AmbigModChild, ModChild};
121use crate::middle::privacy::EffectiveVisibilities;
122use crate::mir::{Body, CoroutineLayout, CoroutineSavedLocal, SourceInfo};
123use crate::query::{IntoQueryKey, Providers};
124use crate::ty;
125use crate::ty::codec::{TyDecoder, TyEncoder};
126pub use crate::ty::diagnostics::*;
127use crate::ty::fast_reject::SimplifiedType;
128use crate::ty::layout::{FnAbiError, LayoutError};
129use crate::ty::util::Discr;
130use crate::ty::walk::TypeWalker;
131
132pub mod abstract_const;
133pub mod adjustment;
134pub mod cast;
135pub mod codec;
136pub mod error;
137pub mod fast_reject;
138pub mod inhabitedness;
139pub mod layout;
140pub mod normalize_erasing_regions;
141pub mod offload_meta;
142pub mod pattern;
143pub mod print;
144pub mod relate;
145pub mod significant_drop_order;
146pub mod trait_def;
147pub mod util;
148pub mod vtable;
149
150mod adt;
151mod assoc;
152mod closure;
153mod consts;
154mod context;
155mod diagnostics;
156mod elaborate_impl;
157mod erase_regions;
158mod fold;
159mod generic_args;
160mod generics;
161mod impls_ty;
162mod instance;
163mod intrinsic;
164mod list;
165mod opaque_types;
166mod predicate;
167mod region;
168mod structural_impls;
169#[allow(hidden_glob_reexports)]
170mod sty;
171mod typeck_results;
172mod visit;
173
174#[derive(#[automatically_derived]
impl ::core::fmt::Debug for ResolverGlobalCtxt {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["visibilities_for_hashing", "expn_that_defined",
"effective_visibilities", "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 ::rustc_data_structures::stable_hasher::StableHash for
ResolverGlobalCtxt {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__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.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
{ __binding_6.stable_hash(__hcx, __hasher); }
{ __binding_7.stable_hash(__hcx, __hasher); }
{ __binding_8.stable_hash(__hcx, __hasher); }
{ __binding_9.stable_hash(__hcx, __hasher); }
{ __binding_10.stable_hash(__hcx, __hasher); }
{ __binding_11.stable_hash(__hcx, __hasher); }
{ __binding_12.stable_hash(__hcx, __hasher); }
{ __binding_13.stable_hash(__hcx, __hasher); }
{ __binding_14.stable_hash(__hcx, __hasher); }
{ __binding_15.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
177pub struct ResolverGlobalCtxt {
178 pub visibilities_for_hashing: Vec<(LocalDefId, Visibility)>,
179 pub expn_that_defined: UnordMap<LocalDefId, ExpnId>,
181 pub effective_visibilities: EffectiveVisibilities,
182 pub 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", "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.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 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 ::rustc_data_structures::stable_hasher::StableHash for
MainDefinition {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__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.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
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> ::rustc_data_structures::stable_hasher::StableHash for
ImplTraitHeader<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__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.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
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 ::rustc_data_structures::stable_hasher::StableHash for Asyncness
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self { Asyncness::Yes => {} Asyncness::No => {} }
}
}
};StableHash, #[automatically_derived]
impl ::core::fmt::Debug for Asyncness {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self { Asyncness::Yes => "Yes", Asyncness::No => "No", })
}
}Debug)]
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<Id> ::rustc_data_structures::stable_hasher::StableHash for
Visibility<Id> where
Id: ::rustc_data_structures::stable_hasher::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
Visibility::Public => {}
Visibility::Restricted(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
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> ::rustc_data_structures::stable_hasher::StableHash for
ClosureSizeProfileData<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__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.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
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 fn def_id_partial_cmp(self, lhs: DefId, rhs: DefId) -> Option<Ordering> {
344 if lhs.krate != rhs.krate {
346 return None;
347 }
348
349 let search = |mut start: DefId, finish: DefId, ord| {
353 while start.index != finish.index {
354 match self.opt_parent(start) {
355 Some(parent) => start.index = parent.index,
356 None => return None,
357 }
358 }
359 Some(ord)
360 };
361 match lhs.index.cmp(&rhs.index) {
362 Ordering::Equal => Some(Ordering::Equal),
363 Ordering::Less => search(rhs, lhs, Ordering::Greater),
364 Ordering::Greater => search(lhs, rhs, Ordering::Less),
365 }
366 }
367
368 pub fn is_descendant_of(self, descendant: DefId, ancestor: DefId) -> bool {
369 #[allow(non_exhaustive_omitted_patterns)] match self.def_id_partial_cmp(descendant,
ancestor) {
Some(Ordering::Less | Ordering::Equal) => true,
_ => false,
}matches!(
370 self.def_id_partial_cmp(descendant, ancestor),
371 Some(Ordering::Less | Ordering::Equal)
372 )
373 }
374}
375
376impl<Id> Visibility<Id> {
377 pub fn is_public(self) -> bool {
378 #[allow(non_exhaustive_omitted_patterns)] match self {
Visibility::Public => true,
_ => false,
}matches!(self, Visibility::Public)
379 }
380
381 pub fn map_id<OutId>(self, f: impl FnOnce(Id) -> OutId) -> Visibility<OutId> {
382 match self {
383 Visibility::Public => Visibility::Public,
384 Visibility::Restricted(id) => Visibility::Restricted(f(id)),
385 }
386 }
387}
388
389impl<Id: Into<DefId>> Visibility<Id> {
390 pub fn to_def_id(self) -> Visibility<DefId> {
391 self.map_id(Into::into)
392 }
393
394 pub fn is_accessible_from(self, module: impl Into<DefId>, tcx: TyCtxt<'_>) -> bool {
396 match self {
397 Visibility::Public => true,
399 Visibility::Restricted(id) => tcx.is_descendant_of(module.into(), id.into()),
400 }
401 }
402
403 pub fn partial_cmp(
404 self,
405 vis: Visibility<impl Into<DefId>>,
406 tcx: TyCtxt<'_>,
407 ) -> Option<Ordering> {
408 match (self, vis) {
409 (Visibility::Public, Visibility::Public) => Some(Ordering::Equal),
410 (Visibility::Public, Visibility::Restricted(_)) => Some(Ordering::Greater),
411 (Visibility::Restricted(_), Visibility::Public) => Some(Ordering::Less),
412 (Visibility::Restricted(lhs_id), Visibility::Restricted(rhs_id)) => {
413 let (lhs_id, rhs_id) = (lhs_id.into(), rhs_id.into());
414 tcx.def_id_partial_cmp(lhs_id, rhs_id)
415 }
416 }
417 }
418}
419
420impl<Id: Into<DefId> + Debug + Copy> Visibility<Id> {
421 #[track_caller]
423 pub fn greater_than(
424 self,
425 vis: Visibility<impl Into<DefId> + Debug + Copy>,
426 tcx: TyCtxt<'_>,
427 ) -> bool {
428 match self.partial_cmp(vis, tcx) {
429 Some(ord) => ord.is_gt(),
430 None => {
431 tcx.dcx().delayed_bug(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("unordered visibilities: {0:?} and {1:?}",
self, vis))
})format!("unordered visibilities: {self:?} and {vis:?}"));
432 false
433 }
434 }
435 }
436}
437
438impl Visibility<DefId> {
439 pub fn expect_local(self) -> Visibility {
440 self.map_id(|id| id.expect_local())
441 }
442
443 pub fn is_visible_locally(self) -> bool {
445 match self {
446 Visibility::Public => true,
447 Visibility::Restricted(def_id) => def_id.is_local(),
448 }
449 }
450}
451
452#[derive(const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hasher::StableHash for
CrateVariancesMap<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
CrateVariancesMap { variances: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for CrateVariancesMap<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f,
"CrateVariancesMap", "variances", &&self.variances)
}
}Debug)]
459pub struct CrateVariancesMap<'tcx> {
460 pub variances: DefIdMap<&'tcx [ty::Variance]>,
464}
465
466#[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)]
469pub struct CReaderCacheKey {
470 pub cnum: Option<CrateNum>,
471 pub pos: usize,
472}
473
474#[derive(#[automatically_derived]
impl<'tcx> ::core::marker::Copy for Ty<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for Ty<'tcx> {
#[inline]
fn clone(&self) -> Ty<'tcx> {
let _:
::core::clone::AssertParamIsClone<Interned<'tcx,
WithCachedTypeInfo<TyKind<'tcx>>>>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for Ty<'tcx> {
#[inline]
fn eq(&self, other: &Ty<'tcx>) -> bool { self.0 == other.0 }
}PartialEq, #[automatically_derived]
impl<'tcx> ::core::cmp::Eq for Ty<'tcx> {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _:
::core::cmp::AssertParamIsEq<Interned<'tcx,
WithCachedTypeInfo<TyKind<'tcx>>>>;
}
}Eq, #[automatically_derived]
impl<'tcx> ::core::hash::Hash for Ty<'tcx> {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.0, state)
}
}Hash, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hasher::StableHash for
Ty<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
Ty(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
476#[rustc_diagnostic_item = "Ty"]
477#[rustc_pass_by_value]
478pub struct Ty<'tcx>(Interned<'tcx, WithCachedTypeInfo<TyKind<'tcx>>>);
479
480impl<'tcx> rustc_type_ir::inherent::IntoKind for Ty<'tcx> {
481 type Kind = TyKind<'tcx>;
482
483 fn kind(self) -> TyKind<'tcx> {
484 *self.kind()
485 }
486}
487
488impl<'tcx> rustc_type_ir::Flags for Ty<'tcx> {
489 fn flags(&self) -> TypeFlags {
490 self.0.flags
491 }
492
493 fn outer_exclusive_binder(&self) -> DebruijnIndex {
494 self.0.outer_exclusive_binder
495 }
496}
497
498#[derive(const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hasher::StableHash for
CratePredicatesMap<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
CratePredicatesMap { predicates: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for CratePredicatesMap<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f,
"CratePredicatesMap", "predicates", &&self.predicates)
}
}Debug)]
505pub struct CratePredicatesMap<'tcx> {
506 pub predicates: DefIdMap<&'tcx [(Clause<'tcx>, Span)]>,
510}
511
512#[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)]
513pub struct Term<'tcx> {
514 ptr: NonNull<()>,
515 marker: PhantomData<(Ty<'tcx>, Const<'tcx>)>,
516}
517
518impl<'tcx> rustc_type_ir::inherent::Term<TyCtxt<'tcx>> for Term<'tcx> {}
519
520impl<'tcx> rustc_type_ir::inherent::IntoKind for Term<'tcx> {
521 type Kind = TermKind<'tcx>;
522
523 fn kind(self) -> Self::Kind {
524 self.kind()
525 }
526}
527
528unsafe impl<'tcx> rustc_data_structures::sync::DynSend for Term<'tcx> where
529 &'tcx (Ty<'tcx>, Const<'tcx>): rustc_data_structures::sync::DynSend
530{
531}
532unsafe impl<'tcx> rustc_data_structures::sync::DynSync for Term<'tcx> where
533 &'tcx (Ty<'tcx>, Const<'tcx>): rustc_data_structures::sync::DynSync
534{
535}
536unsafe impl<'tcx> Send for Term<'tcx> where &'tcx (Ty<'tcx>, Const<'tcx>): Send {}
537unsafe impl<'tcx> Sync for Term<'tcx> where &'tcx (Ty<'tcx>, Const<'tcx>): Sync {}
538
539impl Debug for Term<'_> {
540 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
541 match self.kind() {
542 TermKind::Ty(ty) => f.write_fmt(format_args!("Term::Ty({0:?})", ty))write!(f, "Term::Ty({ty:?})"),
543 TermKind::Const(ct) => f.write_fmt(format_args!("Term::Const({0:?})", ct))write!(f, "Term::Const({ct:?})"),
544 }
545 }
546}
547
548impl<'tcx> From<Ty<'tcx>> for Term<'tcx> {
549 fn from(ty: Ty<'tcx>) -> Self {
550 TermKind::Ty(ty).pack()
551 }
552}
553
554impl<'tcx> From<Const<'tcx>> for Term<'tcx> {
555 fn from(c: Const<'tcx>) -> Self {
556 TermKind::Const(c).pack()
557 }
558}
559
560impl<'tcx> StableHash for Term<'tcx> {
561 fn stable_hash<Hcx: StableHashCtxt>(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
562 self.kind().stable_hash(hcx, hasher);
563 }
564}
565
566impl<'tcx> TypeFoldable<TyCtxt<'tcx>> for Term<'tcx> {
567 fn try_fold_with<F: FallibleTypeFolder<TyCtxt<'tcx>>>(
568 self,
569 folder: &mut F,
570 ) -> Result<Self, F::Error> {
571 match self.kind() {
572 ty::TermKind::Ty(ty) => ty.try_fold_with(folder).map(Into::into),
573 ty::TermKind::Const(ct) => ct.try_fold_with(folder).map(Into::into),
574 }
575 }
576
577 fn fold_with<F: TypeFolder<TyCtxt<'tcx>>>(self, folder: &mut F) -> Self {
578 match self.kind() {
579 ty::TermKind::Ty(ty) => ty.fold_with(folder).into(),
580 ty::TermKind::Const(ct) => ct.fold_with(folder).into(),
581 }
582 }
583}
584
585impl<'tcx> TypeVisitable<TyCtxt<'tcx>> for Term<'tcx> {
586 fn visit_with<V: TypeVisitor<TyCtxt<'tcx>>>(&self, visitor: &mut V) -> V::Result {
587 match self.kind() {
588 ty::TermKind::Ty(ty) => ty.visit_with(visitor),
589 ty::TermKind::Const(ct) => ct.visit_with(visitor),
590 }
591 }
592}
593
594impl<'tcx, E: TyEncoder<'tcx>> Encodable<E> for Term<'tcx> {
595 fn encode(&self, e: &mut E) {
596 self.kind().encode(e)
597 }
598}
599
600impl<'tcx, D: TyDecoder<'tcx>> Decodable<D> for Term<'tcx> {
601 fn decode(d: &mut D) -> Self {
602 let res: TermKind<'tcx> = Decodable::decode(d);
603 res.pack()
604 }
605}
606
607impl<'tcx> Term<'tcx> {
608 #[inline]
609 pub fn kind(self) -> TermKind<'tcx> {
610 let ptr =
611 unsafe { self.ptr.map_addr(|addr| NonZero::new_unchecked(addr.get() & !TAG_MASK)) };
612 unsafe {
616 match self.ptr.addr().get() & TAG_MASK {
617 TYPE_TAG => TermKind::Ty(Ty(Interned::new_unchecked(
618 ptr.cast::<WithCachedTypeInfo<ty::TyKind<'tcx>>>().as_ref(),
619 ))),
620 CONST_TAG => TermKind::Const(ty::Const(Interned::new_unchecked(
621 ptr.cast::<WithCachedTypeInfo<ty::ConstKind<'tcx>>>().as_ref(),
622 ))),
623 _ => core::intrinsics::unreachable(),
624 }
625 }
626 }
627
628 pub fn as_type(&self) -> Option<Ty<'tcx>> {
629 if let TermKind::Ty(ty) = self.kind() { Some(ty) } else { None }
630 }
631
632 pub fn expect_type(&self) -> Ty<'tcx> {
633 self.as_type().expect("expected a type, but found a const")
634 }
635
636 pub fn as_const(&self) -> Option<Const<'tcx>> {
637 if let TermKind::Const(c) = self.kind() { Some(c) } else { None }
638 }
639
640 pub fn expect_const(&self) -> Const<'tcx> {
641 self.as_const().expect("expected a const, but found a type")
642 }
643
644 pub fn into_arg(self) -> GenericArg<'tcx> {
645 match self.kind() {
646 TermKind::Ty(ty) => ty.into(),
647 TermKind::Const(c) => c.into(),
648 }
649 }
650
651 pub fn to_alias_term(self, tcx: TyCtxt<'tcx>) -> Option<AliasTerm<'tcx>> {
652 match self.kind() {
653 TermKind::Ty(ty) => match *ty.kind() {
654 ty::Alias(alias_ty) => Some(alias_ty.into()),
655 _ => None,
656 },
657 TermKind::Const(ct) => match ct.kind() {
658 ConstKind::Unevaluated(uv) => Some(AliasTerm::from_unevaluated_const(tcx, uv)),
659 _ => None,
660 },
661 }
662 }
663
664 pub fn is_infer(&self) -> bool {
665 match self.kind() {
666 TermKind::Ty(ty) => ty.is_ty_var(),
667 TermKind::Const(ct) => ct.is_ct_infer(),
668 }
669 }
670
671 pub fn is_trivially_wf(&self, tcx: TyCtxt<'tcx>) -> bool {
672 match self.kind() {
673 TermKind::Ty(ty) => ty.is_trivially_wf(tcx),
674 TermKind::Const(ct) => ct.is_trivially_wf(),
675 }
676 }
677
678 pub fn walk(self) -> TypeWalker<TyCtxt<'tcx>> {
689 TypeWalker::new(self.into())
690 }
691}
692
693const TAG_MASK: usize = 0b11;
694const TYPE_TAG: usize = 0b00;
695const CONST_TAG: usize = 0b01;
696
697impl<'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>)]
698impl<'tcx> TermKind<'tcx> {
699 #[inline]
700 fn pack(self) -> Term<'tcx> {
701 let (tag, ptr) = match self {
702 TermKind::Ty(ty) => {
703 assert_eq!(align_of_val(&*ty.0.0) & TAG_MASK, 0);
705 (TYPE_TAG, NonNull::from(ty.0.0).cast())
706 }
707 TermKind::Const(ct) => {
708 assert_eq!(align_of_val(&*ct.0.0) & TAG_MASK, 0);
710 (CONST_TAG, NonNull::from(ct.0.0).cast())
711 }
712 };
713
714 Term { ptr: ptr.map_addr(|addr| addr | tag), marker: PhantomData }
715 }
716}
717
718#[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)]
738pub struct InstantiatedPredicates<'tcx> {
739 pub predicates: Vec<Unnormalized<'tcx, Clause<'tcx>>>,
740 pub spans: Vec<Span>,
741}
742
743impl<'tcx> InstantiatedPredicates<'tcx> {
744 pub fn empty() -> InstantiatedPredicates<'tcx> {
745 InstantiatedPredicates { predicates: ::alloc::vec::Vec::new()vec![], spans: ::alloc::vec::Vec::new()vec![] }
746 }
747
748 pub fn is_empty(&self) -> bool {
749 self.predicates.is_empty()
750 }
751
752 pub fn iter(&self) -> <&Self as IntoIterator>::IntoIter {
753 self.into_iter()
754 }
755}
756
757impl<'tcx> IntoIterator for InstantiatedPredicates<'tcx> {
758 type Item = (Unnormalized<'tcx, Clause<'tcx>>, Span);
759
760 type IntoIter = std::iter::Zip<
761 std::vec::IntoIter<Unnormalized<'tcx, Clause<'tcx>>>,
762 std::vec::IntoIter<Span>,
763 >;
764
765 fn into_iter(self) -> Self::IntoIter {
766 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());
767 std::iter::zip(self.predicates, self.spans)
768 }
769}
770
771impl<'a, 'tcx> IntoIterator for &'a InstantiatedPredicates<'tcx> {
772 type Item = (Unnormalized<'tcx, Clause<'tcx>>, Span);
773
774 type IntoIter = std::iter::Zip<
775 std::iter::Copied<std::slice::Iter<'a, Unnormalized<'tcx, Clause<'tcx>>>>,
776 std::iter::Copied<std::slice::Iter<'a, Span>>,
777 >;
778
779 fn into_iter(self) -> Self::IntoIter {
780 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());
781 std::iter::zip(self.predicates.iter().copied(), self.spans.iter().copied())
782 }
783}
784
785#[derive(#[automatically_derived]
impl<'tcx> ::core::marker::Copy for ProvisionalHiddenType<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for ProvisionalHiddenType<'tcx> {
#[inline]
fn clone(&self) -> ProvisionalHiddenType<'tcx> {
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<Ty<'tcx>>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for ProvisionalHiddenType<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"ProvisionalHiddenType", "span", &self.span, "ty", &&self.ty)
}
}Debug, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for ProvisionalHiddenType<'tcx> {
fn try_fold_with<__F: ::rustc_middle::ty::FallibleTypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
ProvisionalHiddenType { span: __binding_0, ty: __binding_1 }
=> {
ProvisionalHiddenType {
span: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
ty: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Self {
match self {
ProvisionalHiddenType { span: __binding_0, ty: __binding_1 }
=> {
ProvisionalHiddenType {
span: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder),
ty: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
__folder),
}
}
}
}
}
};TypeFoldable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for ProvisionalHiddenType<'tcx> {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
ProvisionalHiddenType {
span: ref __binding_0, ty: ref __binding_1 } => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_middle::ty::VisitorResult>::output()
}
}
};TypeVisitable, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hasher::StableHash for
ProvisionalHiddenType<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
ProvisionalHiddenType {
span: ref __binding_0, ty: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for ProvisionalHiddenType<'tcx>
{
fn encode(&self, __encoder: &mut __E) {
match *self {
ProvisionalHiddenType {
span: ref __binding_0, ty: ref __binding_1 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for ProvisionalHiddenType<'tcx>
{
fn decode(__decoder: &mut __D) -> Self {
ProvisionalHiddenType {
span: ::rustc_serialize::Decodable::decode(__decoder),
ty: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable)]
786pub struct ProvisionalHiddenType<'tcx> {
787 pub span: Span,
801
802 pub ty: Ty<'tcx>,
815}
816
817#[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)]
819pub enum DefiningScopeKind {
820 HirTypeck,
825 MirBorrowck,
826}
827
828impl<'tcx> ProvisionalHiddenType<'tcx> {
829 pub fn new_error(tcx: TyCtxt<'tcx>, guar: ErrorGuaranteed) -> ProvisionalHiddenType<'tcx> {
830 ProvisionalHiddenType { span: DUMMY_SP, ty: Ty::new_error(tcx, guar) }
831 }
832
833 pub fn build_mismatch_error(
834 &self,
835 other: &Self,
836 tcx: TyCtxt<'tcx>,
837 ) -> Result<Diag<'tcx>, ErrorGuaranteed> {
838 (self.ty, other.ty).error_reported()?;
839 let sub_diag = if self.span == other.span {
841 TypeMismatchReason::ConflictType { span: self.span }
842 } else {
843 TypeMismatchReason::PreviousUse { span: self.span }
844 };
845 Ok(tcx.dcx().create_err(OpaqueHiddenTypeMismatch {
846 self_ty: self.ty,
847 other_ty: other.ty,
848 other_span: other.span,
849 sub: sub_diag,
850 }))
851 }
852
853 x;#[instrument(level = "debug", skip(tcx), ret)]
854 pub fn remap_generic_params_to_declaration_params(
855 self,
856 opaque_type_key: OpaqueTypeKey<'tcx>,
857 tcx: TyCtxt<'tcx>,
858 defining_scope_kind: DefiningScopeKind,
859 ) -> DefinitionSiteHiddenType<'tcx> {
860 let OpaqueTypeKey { def_id, args } = opaque_type_key;
861
862 let id_args = GenericArgs::identity_for_item(tcx, def_id);
869 debug!(?id_args);
870
871 let map = args.iter().zip(id_args).collect();
875 debug!("map = {:#?}", map);
876
877 let ty = match defining_scope_kind {
883 DefiningScopeKind::HirTypeck => {
884 fold_regions(tcx, self.ty, |_, _| tcx.lifetimes.re_erased)
885 }
886 DefiningScopeKind::MirBorrowck => self.ty,
887 };
888 let result_ty = ty.fold_with(&mut opaque_types::ReverseMapper::new(tcx, map, self.span));
889 if cfg!(debug_assertions) && matches!(defining_scope_kind, DefiningScopeKind::HirTypeck) {
890 assert_eq!(result_ty, fold_regions(tcx, result_ty, |_, _| tcx.lifetimes.re_erased));
891 }
892 DefinitionSiteHiddenType { span: self.span, ty: ty::EarlyBinder::bind(result_ty) }
893 }
894}
895
896#[derive(#[automatically_derived]
impl<'tcx> ::core::marker::Copy for DefinitionSiteHiddenType<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for DefinitionSiteHiddenType<'tcx> {
#[inline]
fn clone(&self) -> DefinitionSiteHiddenType<'tcx> {
let _: ::core::clone::AssertParamIsClone<Span>;
let _:
::core::clone::AssertParamIsClone<ty::EarlyBinder<'tcx,
Ty<'tcx>>>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for DefinitionSiteHiddenType<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"DefinitionSiteHiddenType", "span", &self.span, "ty", &&self.ty)
}
}Debug, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hasher::StableHash for
DefinitionSiteHiddenType<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
DefinitionSiteHiddenType {
span: ref __binding_0, ty: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for
DefinitionSiteHiddenType<'tcx> {
fn encode(&self, __encoder: &mut __E) {
match *self {
DefinitionSiteHiddenType {
span: ref __binding_0, ty: ref __binding_1 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for
DefinitionSiteHiddenType<'tcx> {
fn decode(__decoder: &mut __D) -> Self {
DefinitionSiteHiddenType {
span: ::rustc_serialize::Decodable::decode(__decoder),
ty: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable)]
897pub struct DefinitionSiteHiddenType<'tcx> {
898 pub span: Span,
911
912 pub ty: ty::EarlyBinder<'tcx, Ty<'tcx>>,
914}
915
916impl<'tcx> DefinitionSiteHiddenType<'tcx> {
917 pub fn new_error(tcx: TyCtxt<'tcx>, guar: ErrorGuaranteed) -> DefinitionSiteHiddenType<'tcx> {
918 DefinitionSiteHiddenType {
919 span: DUMMY_SP,
920 ty: ty::EarlyBinder::bind(Ty::new_error(tcx, guar)),
921 }
922 }
923
924 pub fn build_mismatch_error(
925 &self,
926 other: &Self,
927 tcx: TyCtxt<'tcx>,
928 ) -> Result<Diag<'tcx>, ErrorGuaranteed> {
929 let self_ty = self.ty.instantiate_identity().skip_norm_wip();
930 let other_ty = other.ty.instantiate_identity().skip_norm_wip();
931 (self_ty, other_ty).error_reported()?;
932 let sub_diag = if self.span == other.span {
934 TypeMismatchReason::ConflictType { span: self.span }
935 } else {
936 TypeMismatchReason::PreviousUse { span: self.span }
937 };
938 Ok(tcx.dcx().create_err(OpaqueHiddenTypeMismatch {
939 self_ty,
940 other_ty,
941 other_span: other.span,
942 sub: sub_diag,
943 }))
944 }
945}
946
947pub type Clauses<'tcx> = &'tcx ListWithCachedTypeInfo<Clause<'tcx>>;
948
949impl<'tcx> rustc_type_ir::Flags for Clauses<'tcx> {
950 fn flags(&self) -> TypeFlags {
951 (**self).flags()
952 }
953
954 fn outer_exclusive_binder(&self) -> DebruijnIndex {
955 (**self).outer_exclusive_binder()
956 }
957}
958
959#[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)]
965#[derive(const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hasher::StableHash for
ParamEnv<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
ParamEnv { caller_bounds: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for ParamEnv<'tcx> {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
ParamEnv { caller_bounds: ref __binding_0 } => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_middle::ty::VisitorResult>::output()
}
}
};TypeVisitable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for ParamEnv<'tcx> {
fn try_fold_with<__F: ::rustc_middle::ty::FallibleTypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
ParamEnv { caller_bounds: __binding_0 } => {
ParamEnv {
caller_bounds: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Self {
match self {
ParamEnv { caller_bounds: __binding_0 } => {
ParamEnv {
caller_bounds: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder),
}
}
}
}
}
};TypeFoldable)]
966pub struct ParamEnv<'tcx> {
967 caller_bounds: Clauses<'tcx>,
973}
974
975impl<'tcx> rustc_type_ir::inherent::ParamEnv<TyCtxt<'tcx>> for ParamEnv<'tcx> {
976 fn caller_bounds(self) -> impl inherent::SliceLike<Item = ty::Clause<'tcx>> {
977 self.caller_bounds()
978 }
979}
980
981impl<'tcx> ParamEnv<'tcx> {
982 #[inline]
989 pub fn empty() -> Self {
990 Self::new(ListWithCachedTypeInfo::empty())
991 }
992
993 #[inline]
994 pub fn caller_bounds(self) -> Clauses<'tcx> {
995 self.caller_bounds
996 }
997
998 #[inline]
1000 pub fn new(caller_bounds: Clauses<'tcx>) -> Self {
1001 ParamEnv { caller_bounds }
1002 }
1003
1004 pub fn and<T: TypeVisitable<TyCtxt<'tcx>>>(self, value: T) -> ParamEnvAnd<'tcx, T> {
1006 ParamEnvAnd { param_env: self, value }
1007 }
1008}
1009
1010#[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)]
1011#[derive(const _: () =
{
impl<'tcx, T> ::rustc_data_structures::stable_hasher::StableHash for
ParamEnvAnd<'tcx, T> where
T: ::rustc_data_structures::stable_hasher::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
ParamEnvAnd {
param_env: ref __binding_0, value: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1012pub struct ParamEnvAnd<'tcx, T> {
1013 pub param_env: ParamEnv<'tcx>,
1014 pub value: T,
1015}
1016
1017#[derive(#[automatically_derived]
impl<'tcx> ::core::marker::Copy for TypingEnv<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for TypingEnv<'tcx> {
#[inline]
fn clone(&self) -> TypingEnv<'tcx> {
let _: ::core::clone::AssertParamIsClone<TypingModeEqWrapper<'tcx>>;
let _: ::core::clone::AssertParamIsClone<ParamEnv<'tcx>>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for TypingEnv<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "TypingEnv",
"typing_mode", &self.typing_mode, "param_env", &&self.param_env)
}
}Debug, #[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for TypingEnv<'tcx> {
#[inline]
fn eq(&self, other: &TypingEnv<'tcx>) -> bool {
self.typing_mode == other.typing_mode &&
self.param_env == other.param_env
}
}PartialEq, #[automatically_derived]
impl<'tcx> ::core::cmp::Eq for TypingEnv<'tcx> {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<TypingModeEqWrapper<'tcx>>;
let _: ::core::cmp::AssertParamIsEq<ParamEnv<'tcx>>;
}
}Eq, #[automatically_derived]
impl<'tcx> ::core::hash::Hash for TypingEnv<'tcx> {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.typing_mode, state);
::core::hash::Hash::hash(&self.param_env, state)
}
}Hash, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hasher::StableHash for
TypingEnv<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
TypingEnv {
typing_mode: ref __binding_0, param_env: ref __binding_1 }
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1028#[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)]
1029pub struct TypingEnv<'tcx> {
1030 #[type_foldable(identity)]
1031 #[type_visitable(ignore)]
1032 typing_mode: TypingModeEqWrapper<'tcx>,
1033 pub param_env: ParamEnv<'tcx>,
1034}
1035
1036impl<'tcx> TypingEnv<'tcx> {
1037 pub fn new(param_env: ParamEnv<'tcx>, typing_mode: TypingMode<'tcx>) -> Self {
1038 Self { typing_mode: TypingModeEqWrapper(typing_mode), param_env }
1039 }
1040
1041 pub fn typing_mode(&self) -> TypingMode<'tcx> {
1042 self.typing_mode.0
1043 }
1044
1045 pub fn fully_monomorphized() -> TypingEnv<'tcx> {
1053 Self::new(ParamEnv::empty(), TypingMode::PostAnalysis)
1054 }
1055
1056 pub fn non_body_analysis(
1062 tcx: TyCtxt<'tcx>,
1063 def_id: impl IntoQueryKey<DefId>,
1064 ) -> TypingEnv<'tcx> {
1065 let def_id = def_id.into_query_key();
1066 Self::new(tcx.param_env(def_id), TypingMode::non_body_analysis().into())
1067 }
1068
1069 pub fn post_analysis(tcx: TyCtxt<'tcx>, def_id: impl IntoQueryKey<DefId>) -> TypingEnv<'tcx> {
1070 let def_id = def_id.into_query_key();
1071 tcx.typing_env_normalized_for_post_analysis(def_id)
1072 }
1073
1074 pub fn with_post_analysis_normalized(self, tcx: TyCtxt<'tcx>) -> TypingEnv<'tcx> {
1077 let TypingEnv { typing_mode, param_env } = self;
1078
1079 let param_env = if tcx.next_trait_solver_globally() {
1082 param_env
1083 } else {
1084 match typing_mode.0.assert_not_erased() {
1085 TypingMode::Coherence
1086 | TypingMode::Analysis { .. }
1087 | TypingMode::Borrowck { .. }
1088 | TypingMode::PostBorrowckAnalysis { .. } => {}
1089 TypingMode::PostAnalysis => return self,
1090 }
1091
1092 ParamEnv::new(tcx.reveal_opaque_types_in_bounds(param_env.caller_bounds()))
1093 };
1094 TypingEnv { typing_mode: TypingModeEqWrapper(TypingMode::PostAnalysis), param_env }
1095 }
1096
1097 pub fn as_query_input<T>(self, value: T) -> PseudoCanonicalInput<'tcx, T>
1102 where
1103 T: TypeVisitable<TyCtxt<'tcx>>,
1104 {
1105 PseudoCanonicalInput { typing_env: self, value }
1118 }
1119}
1120
1121#[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)]
1131#[derive(const _: () =
{
impl<'tcx, T> ::rustc_data_structures::stable_hasher::StableHash for
PseudoCanonicalInput<'tcx, T> where
T: ::rustc_data_structures::stable_hasher::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
PseudoCanonicalInput {
typing_env: ref __binding_0, value: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<'tcx, T>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for PseudoCanonicalInput<'tcx, T> where
T: ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
{
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
PseudoCanonicalInput {
typing_env: ref __binding_0, value: ref __binding_1 } => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_middle::ty::VisitorResult>::output()
}
}
};TypeVisitable, const _: () =
{
impl<'tcx, T>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for PseudoCanonicalInput<'tcx, T> where
T: ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
{
fn try_fold_with<__F: ::rustc_middle::ty::FallibleTypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
PseudoCanonicalInput {
typing_env: __binding_0, value: __binding_1 } => {
PseudoCanonicalInput {
typing_env: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
value: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Self {
match self {
PseudoCanonicalInput {
typing_env: __binding_0, value: __binding_1 } => {
PseudoCanonicalInput {
typing_env: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder),
value: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
__folder),
}
}
}
}
}
};TypeFoldable)]
1132pub struct PseudoCanonicalInput<'tcx, T> {
1133 pub typing_env: TypingEnv<'tcx>,
1134 pub value: T,
1135}
1136
1137#[derive(#[automatically_derived]
impl ::core::marker::Copy for Destructor { }Copy, #[automatically_derived]
impl ::core::clone::Clone for Destructor {
#[inline]
fn clone(&self) -> Destructor {
let _: ::core::clone::AssertParamIsClone<DefId>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for Destructor {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f, "Destructor",
"did", &&self.did)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hasher::StableHash for Destructor
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
Destructor { did: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for Destructor {
fn encode(&self, __encoder: &mut __E) {
match *self {
Destructor { did: ref __binding_0 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for Destructor {
fn decode(__decoder: &mut __D) -> Self {
Destructor {
did: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable)]
1138pub struct Destructor {
1139 pub did: DefId,
1141}
1142
1143#[derive(#[automatically_derived]
impl ::core::marker::Copy for AsyncDestructor { }Copy, #[automatically_derived]
impl ::core::clone::Clone for AsyncDestructor {
#[inline]
fn clone(&self) -> AsyncDestructor {
let _: ::core::clone::AssertParamIsClone<DefId>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for AsyncDestructor {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f,
"AsyncDestructor", "impl_did", &&self.impl_did)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hasher::StableHash for
AsyncDestructor {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
AsyncDestructor { impl_did: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for AsyncDestructor {
fn encode(&self, __encoder: &mut __E) {
match *self {
AsyncDestructor { impl_did: ref __binding_0 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for AsyncDestructor {
fn decode(__decoder: &mut __D) -> Self {
AsyncDestructor {
impl_did: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable)]
1145pub struct AsyncDestructor {
1146 pub impl_did: DefId,
1148}
1149
1150#[derive(#[automatically_derived]
impl ::core::clone::Clone for VariantFlags {
#[inline]
fn clone(&self) -> VariantFlags {
let _: ::core::clone::AssertParamIsClone<u8>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for VariantFlags { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for VariantFlags {
#[inline]
fn eq(&self, other: &VariantFlags) -> bool { self.0 == other.0 }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for VariantFlags {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<u8>;
}
}Eq, const _: () =
{
impl ::rustc_data_structures::stable_hasher::StableHash for
VariantFlags {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
VariantFlags(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for VariantFlags {
fn encode(&self, __encoder: &mut __E) {
match *self {
VariantFlags(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for VariantFlags {
fn decode(__decoder: &mut __D) -> Self {
VariantFlags(::rustc_serialize::Decodable::decode(__decoder))
}
}
};TyDecodable)]
1151pub struct VariantFlags(u8);
1152impl 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! {
1153 impl VariantFlags: u8 {
1154 const NO_VARIANT_FLAGS = 0;
1155 const IS_FIELD_LIST_NON_EXHAUSTIVE = 1 << 0;
1157 }
1158}
1159impl ::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 }
1160
1161#[derive(#[automatically_derived]
impl ::core::fmt::Debug for VariantDef {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["def_id", "ctor", "name", "discr", "fields", "tainted",
"flags"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.def_id, &self.ctor, &self.name, &self.discr, &self.fields,
&self.tainted, &&self.flags];
::core::fmt::Formatter::debug_struct_fields_finish(f, "VariantDef",
names, values)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hasher::StableHash for VariantDef
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__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.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
{ __binding_6.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for VariantDef {
fn encode(&self, __encoder: &mut __E) {
match *self {
VariantDef {
def_id: ref __binding_0,
ctor: ref __binding_1,
name: ref __binding_2,
discr: ref __binding_3,
fields: ref __binding_4,
tainted: ref __binding_5,
flags: ref __binding_6 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_2,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_3,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_4,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_5,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_6,
__encoder);
}
}
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for VariantDef {
fn decode(__decoder: &mut __D) -> Self {
VariantDef {
def_id: ::rustc_serialize::Decodable::decode(__decoder),
ctor: ::rustc_serialize::Decodable::decode(__decoder),
name: ::rustc_serialize::Decodable::decode(__decoder),
discr: ::rustc_serialize::Decodable::decode(__decoder),
fields: ::rustc_serialize::Decodable::decode(__decoder),
tainted: ::rustc_serialize::Decodable::decode(__decoder),
flags: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable)]
1163pub struct VariantDef {
1164 pub def_id: DefId,
1167 pub ctor: Option<(CtorKind, DefId)>,
1170 pub name: Symbol,
1172 pub discr: VariantDiscr,
1174 pub fields: IndexVec<FieldIdx, FieldDef>,
1176 tainted: Option<ErrorGuaranteed>,
1178 flags: VariantFlags,
1180}
1181
1182impl VariantDef {
1183 #[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(1199u32),
::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")]
1200 pub fn new(
1201 name: Symbol,
1202 variant_did: Option<DefId>,
1203 ctor: Option<(CtorKind, DefId)>,
1204 discr: VariantDiscr,
1205 fields: IndexVec<FieldIdx, FieldDef>,
1206 parent_did: DefId,
1207 recover_tainted: Option<ErrorGuaranteed>,
1208 is_field_list_non_exhaustive: bool,
1209 ) -> Self {
1210 let mut flags = VariantFlags::NO_VARIANT_FLAGS;
1211 if is_field_list_non_exhaustive {
1212 flags |= VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE;
1213 }
1214
1215 VariantDef {
1216 def_id: variant_did.unwrap_or(parent_did),
1217 ctor,
1218 name,
1219 discr,
1220 fields,
1221 flags,
1222 tainted: recover_tainted,
1223 }
1224 }
1225
1226 #[inline]
1232 pub fn is_field_list_non_exhaustive(&self) -> bool {
1233 self.flags.intersects(VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE)
1234 }
1235
1236 #[inline]
1239 pub fn field_list_has_applicable_non_exhaustive(&self) -> bool {
1240 self.is_field_list_non_exhaustive() && !self.def_id.is_local()
1241 }
1242
1243 pub fn ident(&self, tcx: TyCtxt<'_>) -> Ident {
1245 Ident::new(self.name, tcx.def_ident_span(self.def_id).unwrap())
1246 }
1247
1248 #[inline]
1250 pub fn has_errors(&self) -> Result<(), ErrorGuaranteed> {
1251 self.tainted.map_or(Ok(()), Err)
1252 }
1253
1254 #[inline]
1255 pub fn ctor_kind(&self) -> Option<CtorKind> {
1256 self.ctor.map(|(kind, _)| kind)
1257 }
1258
1259 #[inline]
1260 pub fn ctor_def_id(&self) -> Option<DefId> {
1261 self.ctor.map(|(_, def_id)| def_id)
1262 }
1263
1264 #[inline]
1268 pub fn single_field(&self) -> &FieldDef {
1269 if !(self.fields.len() == 1) {
::core::panicking::panic("assertion failed: self.fields.len() == 1")
};assert!(self.fields.len() == 1);
1270
1271 &self.fields[FieldIdx::ZERO]
1272 }
1273
1274 #[inline]
1276 pub fn tail_opt(&self) -> Option<&FieldDef> {
1277 self.fields.raw.last()
1278 }
1279
1280 #[inline]
1286 pub fn tail(&self) -> &FieldDef {
1287 self.tail_opt().expect("expected unsized ADT to have a tail field")
1288 }
1289
1290 pub fn has_unsafe_fields(&self) -> bool {
1292 self.fields.iter().any(|x| x.safety.is_unsafe())
1293 }
1294}
1295
1296impl PartialEq for VariantDef {
1297 #[inline]
1298 fn eq(&self, other: &Self) -> bool {
1299 let Self {
1307 def_id: lhs_def_id,
1308 ctor: _,
1309 name: _,
1310 discr: _,
1311 fields: _,
1312 flags: _,
1313 tainted: _,
1314 } = &self;
1315 let Self {
1316 def_id: rhs_def_id,
1317 ctor: _,
1318 name: _,
1319 discr: _,
1320 fields: _,
1321 flags: _,
1322 tainted: _,
1323 } = other;
1324
1325 let res = lhs_def_id == rhs_def_id;
1326
1327 if truecfg!(debug_assertions) && res {
1329 let deep = self.ctor == other.ctor
1330 && self.name == other.name
1331 && self.discr == other.discr
1332 && self.fields == other.fields
1333 && self.flags == other.flags;
1334 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");
1335 }
1336
1337 res
1338 }
1339}
1340
1341impl Eq for VariantDef {}
1342
1343impl Hash for VariantDef {
1344 #[inline]
1345 fn hash<H: Hasher>(&self, s: &mut H) {
1346 let Self { def_id, ctor: _, name: _, discr: _, fields: _, flags: _, tainted: _ } = &self;
1354 def_id.hash(s)
1355 }
1356}
1357
1358#[derive(#[automatically_derived]
impl ::core::marker::Copy for VariantDiscr { }Copy, #[automatically_derived]
impl ::core::clone::Clone for VariantDiscr {
#[inline]
fn clone(&self) -> VariantDiscr {
let _: ::core::clone::AssertParamIsClone<DefId>;
let _: ::core::clone::AssertParamIsClone<u32>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for VariantDiscr {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
VariantDiscr::Explicit(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Explicit", &__self_0),
VariantDiscr::Relative(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Relative", &__self_0),
}
}
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for VariantDiscr {
#[inline]
fn eq(&self, other: &VariantDiscr) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(VariantDiscr::Explicit(__self_0),
VariantDiscr::Explicit(__arg1_0)) => __self_0 == __arg1_0,
(VariantDiscr::Relative(__self_0),
VariantDiscr::Relative(__arg1_0)) => __self_0 == __arg1_0,
_ => unsafe { ::core::intrinsics::unreachable() }
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for VariantDiscr {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<DefId>;
let _: ::core::cmp::AssertParamIsEq<u32>;
}
}Eq, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for VariantDiscr {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
VariantDiscr::Explicit(ref __binding_0) => { 0usize }
VariantDiscr::Relative(ref __binding_0) => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
VariantDiscr::Explicit(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
VariantDiscr::Relative(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for VariantDiscr {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
VariantDiscr::Explicit(::rustc_serialize::Decodable::decode(__decoder))
}
1usize => {
VariantDiscr::Relative(::rustc_serialize::Decodable::decode(__decoder))
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `VariantDiscr`, expected 0..2, actual {0}",
n));
}
}
}
}
};TyDecodable, const _: () =
{
impl ::rustc_data_structures::stable_hasher::StableHash for
VariantDiscr {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
VariantDiscr::Explicit(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
VariantDiscr::Relative(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1359pub enum VariantDiscr {
1360 Explicit(DefId),
1363
1364 Relative(u32),
1369}
1370
1371#[derive(#[automatically_derived]
impl ::core::fmt::Debug for FieldDef {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f, "FieldDef",
"did", &self.did, "name", &self.name, "vis", &self.vis, "safety",
&self.safety, "value", &&self.value)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hasher::StableHash for FieldDef {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__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.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for FieldDef {
fn encode(&self, __encoder: &mut __E) {
match *self {
FieldDef {
did: ref __binding_0,
name: ref __binding_1,
vis: ref __binding_2,
safety: ref __binding_3,
value: ref __binding_4 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_2,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_3,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_4,
__encoder);
}
}
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for FieldDef {
fn decode(__decoder: &mut __D) -> Self {
FieldDef {
did: ::rustc_serialize::Decodable::decode(__decoder),
name: ::rustc_serialize::Decodable::decode(__decoder),
vis: ::rustc_serialize::Decodable::decode(__decoder),
safety: ::rustc_serialize::Decodable::decode(__decoder),
value: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable)]
1372pub struct FieldDef {
1373 pub did: DefId,
1374 pub name: Symbol,
1375 pub vis: Visibility<DefId>,
1376 pub safety: hir::Safety,
1377 pub value: Option<DefId>,
1378}
1379
1380impl PartialEq for FieldDef {
1381 #[inline]
1382 fn eq(&self, other: &Self) -> bool {
1383 let Self { did: lhs_did, name: _, vis: _, safety: _, value: _ } = &self;
1391
1392 let Self { did: rhs_did, name: _, vis: _, safety: _, value: _ } = other;
1393
1394 let res = lhs_did == rhs_did;
1395
1396 if truecfg!(debug_assertions) && res {
1398 let deep =
1399 self.name == other.name && self.vis == other.vis && self.safety == other.safety;
1400 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");
1401 }
1402
1403 res
1404 }
1405}
1406
1407impl Eq for FieldDef {}
1408
1409impl Hash for FieldDef {
1410 #[inline]
1411 fn hash<H: Hasher>(&self, s: &mut H) {
1412 let Self { did, name: _, vis: _, safety: _, value: _ } = &self;
1420
1421 did.hash(s)
1422 }
1423}
1424
1425impl<'tcx> FieldDef {
1426 pub fn ty(&self, tcx: TyCtxt<'tcx>, args: GenericArgsRef<'tcx>) -> Ty<'tcx> {
1429 tcx.type_of(self.did).instantiate(tcx, args).skip_norm_wip()
1430 }
1431
1432 pub fn ident(&self, tcx: TyCtxt<'_>) -> Ident {
1434 Ident::new(self.name, tcx.def_ident_span(self.did).unwrap())
1435 }
1436}
1437
1438#[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)]
1439pub enum ImplOverlapKind {
1440 Permitted {
1442 marker: bool,
1444 },
1445}
1446
1447#[derive(#[automatically_derived]
impl ::core::clone::Clone for ImplTraitInTraitData {
#[inline]
fn clone(&self) -> ImplTraitInTraitData {
let _: ::core::clone::AssertParamIsClone<DefId>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for ImplTraitInTraitData { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for ImplTraitInTraitData {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
ImplTraitInTraitData::Trait {
fn_def_id: __self_0, opaque_def_id: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Trait",
"fn_def_id", __self_0, "opaque_def_id", &__self_1),
ImplTraitInTraitData::Impl { fn_def_id: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Impl",
"fn_def_id", &__self_0),
}
}
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for ImplTraitInTraitData {
#[inline]
fn eq(&self, other: &ImplTraitInTraitData) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(ImplTraitInTraitData::Trait {
fn_def_id: __self_0, opaque_def_id: __self_1 },
ImplTraitInTraitData::Trait {
fn_def_id: __arg1_0, opaque_def_id: __arg1_1 }) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(ImplTraitInTraitData::Impl { fn_def_id: __self_0 },
ImplTraitInTraitData::Impl { fn_def_id: __arg1_0 }) =>
__self_0 == __arg1_0,
_ => unsafe { ::core::intrinsics::unreachable() }
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ImplTraitInTraitData {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<DefId>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for ImplTraitInTraitData {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
ImplTraitInTraitData::Trait {
fn_def_id: __self_0, opaque_def_id: __self_1 } => {
::core::hash::Hash::hash(__self_0, state);
::core::hash::Hash::hash(__self_1, state)
}
ImplTraitInTraitData::Impl { fn_def_id: __self_0 } =>
::core::hash::Hash::hash(__self_0, state),
}
}
}Hash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for ImplTraitInTraitData {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
ImplTraitInTraitData::Trait {
fn_def_id: ref __binding_0, opaque_def_id: ref __binding_1 }
=> {
0usize
}
ImplTraitInTraitData::Impl { fn_def_id: ref __binding_0 } =>
{
1usize
}
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
ImplTraitInTraitData::Trait {
fn_def_id: ref __binding_0, opaque_def_id: ref __binding_1 }
=> {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
ImplTraitInTraitData::Impl { fn_def_id: ref __binding_0 } =>
{
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for ImplTraitInTraitData {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
ImplTraitInTraitData::Trait {
fn_def_id: ::rustc_serialize::Decodable::decode(__decoder),
opaque_def_id: ::rustc_serialize::Decodable::decode(__decoder),
}
}
1usize => {
ImplTraitInTraitData::Impl {
fn_def_id: ::rustc_serialize::Decodable::decode(__decoder),
}
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `ImplTraitInTraitData`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable, const _: () =
{
impl ::rustc_data_structures::stable_hasher::StableHash for
ImplTraitInTraitData {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
ImplTraitInTraitData::Trait {
fn_def_id: ref __binding_0, opaque_def_id: ref __binding_1 }
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ImplTraitInTraitData::Impl { fn_def_id: ref __binding_0 } =>
{
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1450pub enum ImplTraitInTraitData {
1451 Trait { fn_def_id: DefId, opaque_def_id: DefId },
1452 Impl { fn_def_id: DefId },
1453}
1454
1455impl<'tcx> TyCtxt<'tcx> {
1456 pub fn typeck_body(self, body: hir::BodyId) -> &'tcx TypeckResults<'tcx> {
1457 self.typeck(self.hir_body_owner_def_id(body))
1458 }
1459
1460 pub fn provided_trait_methods(self, id: DefId) -> impl 'tcx + Iterator<Item = &'tcx AssocItem> {
1461 self.associated_items(id)
1462 .in_definition_order()
1463 .filter(move |item| item.is_fn() && item.defaultness(self).has_value())
1464 }
1465
1466 pub fn repr_options_of_def(self, did: LocalDefId) -> ReprOptions {
1467 let mut flags = ReprFlags::empty();
1468 let mut size = None;
1469 let mut max_align: Option<Align> = None;
1470 let mut min_pack: Option<Align> = None;
1471
1472 let mut field_shuffle_seed = self.def_path_hash(did.to_def_id()).0.to_smaller_hash();
1475
1476 if let Some(user_seed) = self.sess.opts.unstable_opts.layout_seed {
1480 field_shuffle_seed ^= user_seed;
1481 }
1482
1483 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
1484 )
1485 .map(|elt| match elt {
1486 Some(n) => ScalableElt::ElementCount(*n),
1487 None => ScalableElt::Container,
1488 });
1489 if elt.is_some() {
1490 flags.insert(ReprFlags::IS_SCALABLE);
1491 }
1492 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) {
1493 for (r, _) in reprs {
1494 flags.insert(match *r {
1495 attr::ReprRust => ReprFlags::empty(),
1496 attr::ReprC => ReprFlags::IS_C,
1497 attr::ReprPacked(pack) => {
1498 min_pack = Some(if let Some(min_pack) = min_pack {
1499 min_pack.min(pack)
1500 } else {
1501 pack
1502 });
1503 ReprFlags::empty()
1504 }
1505 attr::ReprTransparent => ReprFlags::IS_TRANSPARENT,
1506 attr::ReprSimd => ReprFlags::IS_SIMD,
1507 attr::ReprInt(i) => {
1508 size = Some(match i {
1509 attr::IntType::SignedInt(x) => match x {
1510 ast::IntTy::Isize => IntegerType::Pointer(true),
1511 ast::IntTy::I8 => IntegerType::Fixed(Integer::I8, true),
1512 ast::IntTy::I16 => IntegerType::Fixed(Integer::I16, true),
1513 ast::IntTy::I32 => IntegerType::Fixed(Integer::I32, true),
1514 ast::IntTy::I64 => IntegerType::Fixed(Integer::I64, true),
1515 ast::IntTy::I128 => IntegerType::Fixed(Integer::I128, true),
1516 },
1517 attr::IntType::UnsignedInt(x) => match x {
1518 ast::UintTy::Usize => IntegerType::Pointer(false),
1519 ast::UintTy::U8 => IntegerType::Fixed(Integer::I8, false),
1520 ast::UintTy::U16 => IntegerType::Fixed(Integer::I16, false),
1521 ast::UintTy::U32 => IntegerType::Fixed(Integer::I32, false),
1522 ast::UintTy::U64 => IntegerType::Fixed(Integer::I64, false),
1523 ast::UintTy::U128 => IntegerType::Fixed(Integer::I128, false),
1524 },
1525 });
1526 ReprFlags::empty()
1527 }
1528 attr::ReprAlign(align) => {
1529 max_align = max_align.max(Some(align));
1530 ReprFlags::empty()
1531 }
1532 });
1533 }
1534 }
1535
1536 if self.sess.opts.unstable_opts.randomize_layout {
1539 flags.insert(ReprFlags::RANDOMIZE_LAYOUT);
1540 }
1541
1542 let is_box = self.is_lang_item(did.to_def_id(), LangItem::OwnedBox);
1545
1546 if is_box {
1548 flags.insert(ReprFlags::IS_LINEAR);
1549 }
1550
1551 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(..)) {
1553 flags.insert(ReprFlags::PASS_INDIRECTLY_IN_NON_RUSTIC_ABIS);
1554 }
1555
1556 ReprOptions {
1557 int: size,
1558 align: max_align,
1559 pack: min_pack,
1560 flags,
1561 field_shuffle_seed,
1562 scalable: elt,
1563 }
1564 }
1565
1566 pub fn opt_item_name(self, def_id: impl IntoQueryKey<DefId>) -> Option<Symbol> {
1568 let def_id = def_id.into_query_key();
1569 if let Some(cnum) = def_id.as_crate_root() {
1570 Some(self.crate_name(cnum))
1571 } else {
1572 let def_key = self.def_key(def_id);
1573 match def_key.disambiguated_data.data {
1574 rustc_hir::definitions::DefPathData::Ctor => self
1576 .opt_item_name(DefId { krate: def_id.krate, index: def_key.parent.unwrap() }),
1577 _ => def_key.get_opt_name(),
1578 }
1579 }
1580 }
1581
1582 pub fn item_name(self, id: impl IntoQueryKey<DefId>) -> Symbol {
1589 let id = id.into_query_key();
1590 self.opt_item_name(id).unwrap_or_else(|| {
1591 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));
1592 })
1593 }
1594
1595 pub fn opt_item_ident(self, def_id: impl IntoQueryKey<DefId>) -> Option<Ident> {
1599 let def_id = def_id.into_query_key();
1600 let def = self.opt_item_name(def_id)?;
1601 let span = self
1602 .def_ident_span(def_id)
1603 .unwrap_or_else(|| crate::util::bug::bug_fmt(format_args!("missing ident span for {0:?}",
def_id))bug!("missing ident span for {def_id:?}"));
1604 Some(Ident::new(def, span))
1605 }
1606
1607 pub fn item_ident(self, def_id: impl IntoQueryKey<DefId>) -> Ident {
1611 let def_id = def_id.into_query_key();
1612 self.opt_item_ident(def_id).unwrap_or_else(|| {
1613 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));
1614 })
1615 }
1616
1617 pub fn opt_associated_item(self, def_id: DefId) -> Option<AssocItem> {
1618 if let DefKind::AssocConst { .. } | DefKind::AssocFn | DefKind::AssocTy =
1619 self.def_kind(def_id)
1620 {
1621 Some(self.associated_item(def_id))
1622 } else {
1623 None
1624 }
1625 }
1626
1627 pub fn opt_rpitit_info(self, def_id: DefId) -> Option<ImplTraitInTraitData> {
1631 if let DefKind::AssocTy = self.def_kind(def_id)
1632 && let AssocKind::Type { data: AssocTypeData::Rpitit(rpitit_info) } =
1633 self.associated_item(def_id).kind
1634 {
1635 Some(rpitit_info)
1636 } else {
1637 None
1638 }
1639 }
1640
1641 pub fn find_field_index(self, ident: Ident, variant: &VariantDef) -> Option<FieldIdx> {
1642 variant.fields.iter_enumerated().find_map(|(i, field)| {
1643 self.hygienic_eq(ident, field.ident(self), variant.def_id).then_some(i)
1644 })
1645 }
1646
1647 x;#[instrument(level = "debug", skip(self), ret)]
1650 pub fn impls_are_allowed_to_overlap(
1651 self,
1652 def_id1: DefId,
1653 def_id2: DefId,
1654 ) -> Option<ImplOverlapKind> {
1655 let impl1 = self.impl_trait_header(def_id1);
1656 let impl2 = self.impl_trait_header(def_id2);
1657
1658 let trait_ref1 = impl1.trait_ref.skip_binder();
1659 let trait_ref2 = impl2.trait_ref.skip_binder();
1660
1661 if trait_ref1.references_error() || trait_ref2.references_error() {
1664 return Some(ImplOverlapKind::Permitted { marker: false });
1665 }
1666
1667 match (impl1.polarity, impl2.polarity) {
1668 (ImplPolarity::Reservation, _) | (_, ImplPolarity::Reservation) => {
1669 return Some(ImplOverlapKind::Permitted { marker: false });
1671 }
1672 (ImplPolarity::Positive, ImplPolarity::Negative)
1673 | (ImplPolarity::Negative, ImplPolarity::Positive) => {
1674 return None;
1676 }
1677 (ImplPolarity::Positive, ImplPolarity::Positive)
1678 | (ImplPolarity::Negative, ImplPolarity::Negative) => {}
1679 };
1680
1681 let is_marker_impl = |trait_ref: TraitRef<'_>| self.trait_def(trait_ref.def_id).is_marker;
1682 let is_marker_overlap = is_marker_impl(trait_ref1) && is_marker_impl(trait_ref2);
1683
1684 if is_marker_overlap {
1685 return Some(ImplOverlapKind::Permitted { marker: true });
1686 }
1687
1688 None
1689 }
1690
1691 pub fn expect_variant_res(self, res: Res) -> &'tcx VariantDef {
1694 match res {
1695 Res::Def(DefKind::Variant, did) => {
1696 let enum_did = self.parent(did);
1697 self.adt_def(enum_did).variant_with_id(did)
1698 }
1699 Res::Def(DefKind::Struct | DefKind::Union, did) => self.adt_def(did).non_enum_variant(),
1700 Res::Def(DefKind::Ctor(CtorOf::Variant, ..), variant_ctor_did) => {
1701 let variant_did = self.parent(variant_ctor_did);
1702 let enum_did = self.parent(variant_did);
1703 self.adt_def(enum_did).variant_with_ctor_id(variant_ctor_did)
1704 }
1705 Res::Def(DefKind::Ctor(CtorOf::Struct, ..), ctor_did) => {
1706 let struct_did = self.parent(ctor_did);
1707 self.adt_def(struct_did).non_enum_variant()
1708 }
1709 _ => 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),
1710 }
1711 }
1712
1713 #[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(1714u32),
::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:1718",
"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(1718u32),
::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:1720",
"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(1720u32),
::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")]
1715 pub fn instance_mir(self, instance: ty::InstanceKind<'tcx>) -> &'tcx Body<'tcx> {
1716 match instance {
1717 ty::InstanceKind::Item(def) => {
1718 debug!("calling def_kind on def: {:?}", def);
1719 let def_kind = self.def_kind(def);
1720 debug!("returned from def_kind: {:?}", def_kind);
1721 match def_kind {
1722 DefKind::Const { .. }
1723 | DefKind::Static { .. }
1724 | DefKind::AssocConst { .. }
1725 | DefKind::Ctor(..)
1726 | DefKind::AnonConst
1727 | DefKind::InlineConst => self.mir_for_ctfe(def),
1728 _ => self.optimized_mir(def),
1731 }
1732 }
1733 ty::InstanceKind::VTableShim(..)
1734 | ty::InstanceKind::ReifyShim(..)
1735 | ty::InstanceKind::Intrinsic(..)
1736 | ty::InstanceKind::FnPtrShim(..)
1737 | ty::InstanceKind::Virtual(..)
1738 | ty::InstanceKind::ClosureOnceShim { .. }
1739 | ty::InstanceKind::ConstructCoroutineInClosureShim { .. }
1740 | ty::InstanceKind::FutureDropPollShim(..)
1741 | ty::InstanceKind::DropGlue(..)
1742 | ty::InstanceKind::CloneShim(..)
1743 | ty::InstanceKind::ThreadLocalShim(..)
1744 | ty::InstanceKind::FnPtrAddrShim(..)
1745 | ty::InstanceKind::AsyncDropGlueCtorShim(..)
1746 | ty::InstanceKind::AsyncDropGlue(..) => self.mir_shims(instance),
1747 }
1748 }
1749
1750 #[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."]
1752 pub fn get_attrs(
1753 self,
1754 did: impl Into<DefId>,
1755 attr: Symbol,
1756 ) -> impl Iterator<Item = &'tcx hir::Attribute> {
1757 #[allow(deprecated)]
1758 self.get_all_attrs(did).iter().filter(move |a: &&hir::Attribute| a.has_name(attr))
1759 }
1760
1761 #[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."]
1766 pub fn get_all_attrs(self, did: impl Into<DefId>) -> &'tcx [hir::Attribute] {
1767 let did: DefId = did.into();
1768 if let Some(did) = did.as_local() {
1769 self.hir_attrs(self.local_def_id_to_hir_id(did))
1770 } else {
1771 self.attrs_for_def(did)
1772 }
1773 }
1774
1775 pub fn get_attrs_by_path(
1776 self,
1777 did: DefId,
1778 attr: &[Symbol],
1779 ) -> impl Iterator<Item = &'tcx hir::Attribute> {
1780 let filter_fn = move |a: &&hir::Attribute| a.path_matches(attr);
1781 if let Some(did) = did.as_local() {
1782 self.hir_attrs(self.local_def_id_to_hir_id(did)).iter().filter(filter_fn)
1783 } else {
1784 self.attrs_for_def(did).iter().filter(filter_fn)
1785 }
1786 }
1787
1788 pub fn trait_is_auto(self, trait_def_id: DefId) -> bool {
1790 self.trait_def(trait_def_id).has_auto_impl
1791 }
1792
1793 pub fn trait_is_coinductive(self, trait_def_id: DefId) -> bool {
1796 self.trait_def(trait_def_id).is_coinductive
1797 }
1798
1799 pub fn trait_is_alias(self, trait_def_id: DefId) -> bool {
1801 self.def_kind(trait_def_id) == DefKind::TraitAlias
1802 }
1803
1804 fn layout_error(self, err: LayoutError<'tcx>) -> &'tcx LayoutError<'tcx> {
1806 self.arena.alloc(err)
1807 }
1808
1809 fn ordinary_coroutine_layout(
1815 self,
1816 def_id: DefId,
1817 args: GenericArgsRef<'tcx>,
1818 ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1819 let coroutine_kind_ty = args.as_coroutine().kind_ty();
1820 let mir = self.optimized_mir(def_id);
1821 let ty = || Ty::new_coroutine(self, def_id, args);
1822 if coroutine_kind_ty.is_unit() {
1824 mir.coroutine_layout_raw().ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1825 } else {
1826 let ty::Coroutine(_, identity_args) =
1829 *self.type_of(def_id).instantiate_identity().skip_norm_wip().kind()
1830 else {
1831 ::core::panicking::panic("internal error: entered unreachable code");unreachable!();
1832 };
1833 let identity_kind_ty = identity_args.as_coroutine().kind_ty();
1834 if identity_kind_ty == coroutine_kind_ty {
1837 mir.coroutine_layout_raw()
1838 .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1839 } else {
1840 {
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));
1841 {
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!(
1842 identity_kind_ty.to_opt_closure_kind(),
1843 Some(ClosureKind::Fn | ClosureKind::FnMut)
1844 );
1845 self.optimized_mir(self.coroutine_by_move_body_def_id(def_id))
1846 .coroutine_layout_raw()
1847 .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1848 }
1849 }
1850 }
1851
1852 fn async_drop_coroutine_layout(
1856 self,
1857 def_id: DefId,
1858 args: GenericArgsRef<'tcx>,
1859 ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1860 let ty = || Ty::new_coroutine(self, def_id, args);
1861 if args[0].has_placeholders() || args[0].has_non_region_param() {
1862 return Err(self.layout_error(LayoutError::TooGeneric(ty())));
1863 }
1864 let instance = InstanceKind::AsyncDropGlue(def_id, Ty::new_coroutine(self, def_id, args));
1865 self.mir_shims(instance)
1866 .coroutine_layout_raw()
1867 .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1868 }
1869
1870 pub fn coroutine_layout(
1873 self,
1874 def_id: DefId,
1875 args: GenericArgsRef<'tcx>,
1876 ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1877 if self.is_async_drop_in_place_coroutine(def_id) {
1878 let arg_cor_ty = args.first().unwrap().expect_ty();
1882 if arg_cor_ty.is_coroutine() {
1883 let span = self.def_span(def_id);
1884 let source_info = SourceInfo::outermost(span);
1885 let variant_fields: IndexVec<VariantIdx, IndexVec<FieldIdx, CoroutineSavedLocal>> =
1888 iter::repeat(IndexVec::new()).take(CoroutineArgs::RESERVED_VARIANTS).collect();
1889 let variant_source_info: IndexVec<VariantIdx, SourceInfo> =
1890 iter::repeat(source_info).take(CoroutineArgs::RESERVED_VARIANTS).collect();
1891 let proxy_layout = CoroutineLayout {
1892 field_tys: [].into(),
1893 field_names: [].into(),
1894 variant_fields,
1895 variant_source_info,
1896 storage_conflicts: BitMatrix::new(0, 0),
1897 };
1898 return Ok(self.arena.alloc(proxy_layout));
1899 } else {
1900 self.async_drop_coroutine_layout(def_id, args)
1901 }
1902 } else {
1903 self.ordinary_coroutine_layout(def_id, args)
1904 }
1905 }
1906
1907 pub fn assoc_parent(self, def_id: DefId) -> Option<(DefId, DefKind)> {
1909 if !self.def_kind(def_id).is_assoc() {
1910 return None;
1911 }
1912 let parent = self.parent(def_id);
1913 let def_kind = self.def_kind(parent);
1914 Some((parent, def_kind))
1915 }
1916
1917 pub fn trait_item_of(self, def_id: impl IntoQueryKey<DefId>) -> Option<DefId> {
1919 let def_id = def_id.into_query_key();
1920 self.opt_associated_item(def_id)?.trait_item_def_id()
1921 }
1922
1923 pub fn trait_of_assoc(self, def_id: DefId) -> Option<DefId> {
1926 match self.assoc_parent(def_id) {
1927 Some((id, DefKind::Trait)) => Some(id),
1928 _ => None,
1929 }
1930 }
1931
1932 pub fn impl_is_of_trait(self, def_id: impl IntoQueryKey<DefId>) -> bool {
1933 let def_id = def_id.into_query_key();
1934 let DefKind::Impl { of_trait } = self.def_kind(def_id) else {
1935 {
::core::panicking::panic_fmt(format_args!("expected Impl for {0:?}",
def_id));
};panic!("expected Impl for {def_id:?}");
1936 };
1937 of_trait
1938 }
1939
1940 pub fn impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
1943 match self.assoc_parent(def_id) {
1944 Some((id, DefKind::Impl { .. })) => Some(id),
1945 _ => None,
1946 }
1947 }
1948
1949 pub fn inherent_impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
1952 match self.assoc_parent(def_id) {
1953 Some((id, DefKind::Impl { of_trait: false })) => Some(id),
1954 _ => None,
1955 }
1956 }
1957
1958 pub fn trait_impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
1961 match self.assoc_parent(def_id) {
1962 Some((id, DefKind::Impl { of_trait: true })) => Some(id),
1963 _ => None,
1964 }
1965 }
1966
1967 pub fn impl_polarity(self, def_id: impl IntoQueryKey<DefId>) -> ty::ImplPolarity {
1968 let def_id = def_id.into_query_key();
1969 self.impl_trait_header(def_id).polarity
1970 }
1971
1972 pub fn impl_trait_ref(
1974 self,
1975 def_id: impl IntoQueryKey<DefId>,
1976 ) -> ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>> {
1977 let def_id = def_id.into_query_key();
1978 self.impl_trait_header(def_id).trait_ref
1979 }
1980
1981 pub fn impl_opt_trait_ref(
1984 self,
1985 def_id: impl IntoQueryKey<DefId>,
1986 ) -> Option<ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>>> {
1987 let def_id = def_id.into_query_key();
1988 self.impl_is_of_trait(def_id).then(|| self.impl_trait_ref(def_id))
1989 }
1990
1991 pub fn impl_trait_id(self, def_id: impl IntoQueryKey<DefId>) -> DefId {
1993 let def_id = def_id.into_query_key();
1994 self.impl_trait_ref(def_id).skip_binder().def_id
1995 }
1996
1997 pub fn impl_opt_trait_id(self, def_id: impl IntoQueryKey<DefId>) -> Option<DefId> {
2000 let def_id = def_id.into_query_key();
2001 self.impl_is_of_trait(def_id).then(|| self.impl_trait_id(def_id))
2002 }
2003
2004 pub fn is_exportable(self, def_id: DefId) -> bool {
2005 self.exportable_items(def_id.krate).contains(&def_id)
2006 }
2007
2008 pub fn is_builtin_derived(self, def_id: DefId) -> bool {
2011 if self.is_automatically_derived(def_id)
2012 && let Some(def_id) = def_id.as_local()
2013 && let outer = self.def_span(def_id).ctxt().outer_expn_data()
2014 && #[allow(non_exhaustive_omitted_patterns)] match outer.kind {
ExpnKind::Macro(MacroKind::Derive, _) => true,
_ => false,
}matches!(outer.kind, ExpnKind::Macro(MacroKind::Derive, _))
2015 && {
{
'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 { .. })
2016 {
2017 true
2018 } else {
2019 false
2020 }
2021 }
2022
2023 pub fn is_automatically_derived(self, def_id: DefId) -> bool {
2025 {
{
'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)
2026 }
2027
2028 pub fn span_of_impl(self, impl_def_id: DefId) -> Result<Span, Symbol> {
2031 if let Some(impl_def_id) = impl_def_id.as_local() {
2032 Ok(self.def_span(impl_def_id))
2033 } else {
2034 Err(self.crate_name(impl_def_id.krate))
2035 }
2036 }
2037
2038 pub fn hygienic_eq(self, use_ident: Ident, def_ident: Ident, def_parent_def_id: DefId) -> bool {
2042 use_ident.name == def_ident.name
2046 && use_ident
2047 .span
2048 .ctxt()
2049 .hygienic_eq(def_ident.span.ctxt(), self.expn_that_defined(def_parent_def_id))
2050 }
2051
2052 pub fn adjust_ident(self, mut ident: Ident, scope: DefId) -> Ident {
2053 ident.span.normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope));
2054 ident
2055 }
2056
2057 pub fn adjust_ident_and_get_scope(
2059 self,
2060 mut ident: Ident,
2061 scope: DefId,
2062 block: hir::HirId,
2063 ) -> (Ident, DefId) {
2064 let scope = ident
2065 .span
2066 .normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope))
2067 .and_then(|actual_expansion| actual_expansion.expn_data().parent_module)
2068 .unwrap_or_else(|| self.parent_module(block).to_def_id());
2069 (ident, scope)
2070 }
2071
2072 #[inline]
2076 pub fn is_const_fn(self, def_id: DefId) -> bool {
2077 #[allow(non_exhaustive_omitted_patterns)] match self.def_kind(def_id) {
DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(_, CtorKind::Fn) |
DefKind::Closure => true,
_ => false,
}matches!(
2078 self.def_kind(def_id),
2079 DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(_, CtorKind::Fn) | DefKind::Closure
2080 ) && self.constness(def_id) == hir::Constness::Const
2081 }
2082
2083 pub fn is_conditionally_const(self, def_id: impl Into<DefId>) -> bool {
2090 let def_id: DefId = def_id.into();
2091 match self.def_kind(def_id) {
2092 DefKind::Impl { of_trait: true } => {
2093 let header = self.impl_trait_header(def_id);
2094 header.constness == hir::Constness::Const
2095 && self.is_const_trait(header.trait_ref.skip_binder().def_id)
2096 }
2097 DefKind::Impl { of_trait: false } => self.constness(def_id) == hir::Constness::Const,
2098 DefKind::Fn | DefKind::Ctor(_, CtorKind::Fn) => {
2099 self.constness(def_id) == hir::Constness::Const
2100 }
2101 DefKind::TraitAlias | DefKind::Trait => self.is_const_trait(def_id),
2102 DefKind::AssocTy => {
2103 let parent_def_id = self.parent(def_id);
2104 match self.def_kind(parent_def_id) {
2105 DefKind::Impl { of_trait: false } => false,
2106 DefKind::Impl { of_trait: true } | DefKind::Trait => {
2107 self.is_conditionally_const(parent_def_id)
2108 }
2109 _ => 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:?}"),
2110 }
2111 }
2112 DefKind::AssocFn => {
2113 let parent_def_id = self.parent(def_id);
2114 match self.def_kind(parent_def_id) {
2115 DefKind::Impl { of_trait: false } => {
2116 self.constness(def_id) == hir::Constness::Const
2117 }
2118 DefKind::Impl { of_trait: true } => {
2119 let Some(trait_method_did) = self.trait_item_of(def_id) else {
2120 return false;
2121 };
2122 self.constness(trait_method_did) == hir::Constness::Const
2123 && self.is_conditionally_const(parent_def_id)
2124 }
2125 DefKind::Trait => {
2126 self.constness(def_id) == hir::Constness::Const
2127 && self.is_conditionally_const(parent_def_id)
2128 }
2129 _ => 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:?}"),
2130 }
2131 }
2132 DefKind::OpaqueTy => match self.opaque_ty_origin(def_id) {
2133 hir::OpaqueTyOrigin::FnReturn { parent, .. } => self.is_conditionally_const(parent),
2134 hir::OpaqueTyOrigin::AsyncFn { .. } => false,
2135 hir::OpaqueTyOrigin::TyAlias { .. } => false,
2137 },
2138 DefKind::Closure => self.constness(def_id) == hir::Constness::Const,
2139 DefKind::Ctor(_, CtorKind::Const)
2140 | DefKind::Mod
2141 | DefKind::Struct
2142 | DefKind::Union
2143 | DefKind::Enum
2144 | DefKind::Variant
2145 | DefKind::TyAlias
2146 | DefKind::ForeignTy
2147 | DefKind::TyParam
2148 | DefKind::Const { .. }
2149 | DefKind::ConstParam
2150 | DefKind::Static { .. }
2151 | DefKind::AssocConst { .. }
2152 | DefKind::Macro(_)
2153 | DefKind::ExternCrate
2154 | DefKind::Use
2155 | DefKind::ForeignMod
2156 | DefKind::AnonConst
2157 | DefKind::InlineConst
2158 | DefKind::Field
2159 | DefKind::LifetimeParam
2160 | DefKind::GlobalAsm
2161 | DefKind::SyntheticCoroutineBody => false,
2162 }
2163 }
2164
2165 #[inline]
2166 pub fn is_const_trait(self, def_id: DefId) -> bool {
2167 self.trait_def(def_id).constness == hir::Constness::Const
2168 }
2169
2170 pub fn impl_method_has_trait_impl_trait_tys(self, def_id: DefId) -> bool {
2171 if self.def_kind(def_id) != DefKind::AssocFn {
2172 return false;
2173 }
2174
2175 let Some(item) = self.opt_associated_item(def_id) else {
2176 return false;
2177 };
2178
2179 let AssocContainer::TraitImpl(Ok(trait_item_def_id)) = item.container else {
2180 return false;
2181 };
2182
2183 !self.associated_types_for_impl_traits_in_associated_fn(trait_item_def_id).is_empty()
2184 }
2185
2186 #[inline]
2201 pub fn fn_abi_of_instance(
2202 self,
2203 query: ty::PseudoCanonicalInput<'tcx, (ty::Instance<'tcx>, &'tcx ty::List<Ty<'tcx>>)>,
2204 ) -> Result<&'tcx FnAbi<'tcx, Ty<'tcx>>, &'tcx FnAbiError<'tcx>> {
2205 if self.sess.opts.optimize != OptLevel::No && self.sess.opts.incremental.is_none() {
2208 self.fn_abi_of_instance_raw(query)
2209 } else {
2210 self.fn_abi_of_instance_no_deduced_attrs(query)
2211 }
2212 }
2213}
2214
2215impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for DefId {
2218 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2219 if let Some(did) = self.as_local() {
2220 tcx.hir_attrs(tcx.local_def_id_to_hir_id(did))
2221 } else {
2222 tcx.attrs_for_def(self)
2223 }
2224 }
2225}
2226
2227impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for LocalDefId {
2228 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2229 tcx.hir_attrs(tcx.local_def_id_to_hir_id(self))
2230 }
2231}
2232
2233impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for hir::OwnerId {
2234 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2235 hir::attrs::HasAttrs::get_attrs(self.def_id, tcx)
2236 }
2237}
2238
2239impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for hir::HirId {
2240 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2241 tcx.hir_attrs(self)
2242 }
2243}
2244
2245pub fn provide(providers: &mut Providers) {
2246 closure::provide(providers);
2247 context::provide(providers);
2248 erase_regions::provide(providers);
2249 inhabitedness::provide(providers);
2250 util::provide(providers);
2251 print::provide(providers);
2252 super::util::bug::provide(providers);
2253 *providers = Providers {
2254 trait_impls_of: trait_def::trait_impls_of_provider,
2255 incoherent_impls: trait_def::incoherent_impls_provider,
2256 trait_impls_in_crate: trait_def::trait_impls_in_crate_provider,
2257 traits: trait_def::traits_provider,
2258 vtable_allocation: vtable::vtable_allocation_provider,
2259 ..*providers
2260 };
2261}
2262
2263#[derive(#[automatically_derived]
impl ::core::clone::Clone for CrateInherentImpls {
#[inline]
fn clone(&self) -> CrateInherentImpls {
CrateInherentImpls {
inherent_impls: ::core::clone::Clone::clone(&self.inherent_impls),
incoherent_impls: ::core::clone::Clone::clone(&self.incoherent_impls),
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for CrateInherentImpls {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"CrateInherentImpls", "inherent_impls", &self.inherent_impls,
"incoherent_impls", &&self.incoherent_impls)
}
}Debug, #[automatically_derived]
impl ::core::default::Default for CrateInherentImpls {
#[inline]
fn default() -> CrateInherentImpls {
CrateInherentImpls {
inherent_impls: ::core::default::Default::default(),
incoherent_impls: ::core::default::Default::default(),
}
}
}Default, const _: () =
{
impl ::rustc_data_structures::stable_hasher::StableHash for
CrateInherentImpls {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
CrateInherentImpls {
inherent_impls: ref __binding_0,
incoherent_impls: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
2269pub struct CrateInherentImpls {
2270 pub inherent_impls: FxIndexMap<LocalDefId, Vec<DefId>>,
2271 pub incoherent_impls: FxIndexMap<SimplifiedType, Vec<LocalDefId>>,
2272}
2273
2274#[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> ::rustc_data_structures::stable_hasher::StableHash for
SymbolName<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
SymbolName { name: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
2275pub struct SymbolName<'tcx> {
2276 pub name: &'tcx str,
2278}
2279
2280impl<'tcx> SymbolName<'tcx> {
2281 pub fn new(tcx: TyCtxt<'tcx>, name: &str) -> SymbolName<'tcx> {
2282 SymbolName { name: tcx.arena.alloc_str(name) }
2283 }
2284}
2285
2286impl<'tcx> fmt::Display for SymbolName<'tcx> {
2287 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2288 fmt::Display::fmt(&self.name, fmt)
2289 }
2290}
2291
2292impl<'tcx> fmt::Debug for SymbolName<'tcx> {
2293 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2294 fmt::Display::fmt(&self.name, fmt)
2295 }
2296}
2297
2298#[derive(#[automatically_derived]
impl<'tcx> ::core::marker::Copy for DestructuredAdtConst<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for DestructuredAdtConst<'tcx> {
#[inline]
fn clone(&self) -> DestructuredAdtConst<'tcx> {
let _: ::core::clone::AssertParamIsClone<VariantIdx>;
let _: ::core::clone::AssertParamIsClone<&'tcx [ty::Const<'tcx>]>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for DestructuredAdtConst<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"DestructuredAdtConst", "variant", &self.variant, "fields",
&&self.fields)
}
}Debug, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hasher::StableHash for
DestructuredAdtConst<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
DestructuredAdtConst {
variant: ref __binding_0, fields: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
2300pub struct DestructuredAdtConst<'tcx> {
2301 pub variant: VariantIdx,
2302 pub fields: &'tcx [ty::Const<'tcx>],
2303}
2304
2305pub fn fnc_typetrees<'tcx>(tcx: TyCtxt<'tcx>, fn_ty: Ty<'tcx>) -> FncTree {
2309 if tcx.sess.opts.unstable_opts.autodiff.contains(&rustc_session::config::AutoDiff::NoTT) {
2311 return FncTree { args: ::alloc::vec::Vec::new()vec![], ret: TypeTree::new() };
2312 }
2313
2314 if !fn_ty.is_fn() {
2316 return FncTree { args: ::alloc::vec::Vec::new()vec![], ret: TypeTree::new() };
2317 }
2318
2319 let fn_sig = fn_ty.fn_sig(tcx);
2321 let sig = tcx.instantiate_bound_regions_with_erased(fn_sig);
2322
2323 let mut args = ::alloc::vec::Vec::new()vec![];
2325 for ty in sig.inputs().iter() {
2326 let type_tree = typetree_from_ty(tcx, *ty);
2327 args.push(type_tree);
2328 }
2329
2330 let ret = typetree_from_ty(tcx, sig.output());
2332
2333 FncTree { args, ret }
2334}
2335
2336pub fn typetree_from_ty<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> TypeTree {
2339 let mut visited = Vec::new();
2340 typetree_from_ty_inner(tcx, ty, 0, &mut visited)
2341}
2342
2343const MAX_TYPETREE_DEPTH: usize = 6;
2346
2347fn typetree_from_ty_inner<'tcx>(
2349 tcx: TyCtxt<'tcx>,
2350 ty: Ty<'tcx>,
2351 depth: usize,
2352 visited: &mut Vec<Ty<'tcx>>,
2353) -> TypeTree {
2354 if depth >= MAX_TYPETREE_DEPTH {
2355 {
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:2355",
"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(2355u32),
::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);
2356 return TypeTree::new();
2357 }
2358
2359 if visited.contains(&ty) {
2360 return TypeTree::new();
2361 }
2362
2363 visited.push(ty);
2364 let result = typetree_from_ty_impl(tcx, ty, depth, visited);
2365 visited.pop();
2366 result
2367}
2368
2369fn typetree_from_ty_impl<'tcx>(
2371 tcx: TyCtxt<'tcx>,
2372 ty: Ty<'tcx>,
2373 depth: usize,
2374 visited: &mut Vec<Ty<'tcx>>,
2375) -> TypeTree {
2376 typetree_from_ty_impl_inner(tcx, ty, depth, visited, false)
2377}
2378
2379fn typetree_from_ty_impl_inner<'tcx>(
2381 tcx: TyCtxt<'tcx>,
2382 ty: Ty<'tcx>,
2383 depth: usize,
2384 visited: &mut Vec<Ty<'tcx>>,
2385 is_reference_target: bool,
2386) -> TypeTree {
2387 if ty.is_scalar() {
2388 let (kind, size) = if ty.is_integral() || ty.is_char() || ty.is_bool() {
2389 (Kind::Integer, ty.primitive_size(tcx).bytes_usize())
2390 } else if ty.is_floating_point() {
2391 match ty {
2392 x if x == tcx.types.f16 => (Kind::Half, 2),
2393 x if x == tcx.types.f32 => (Kind::Float, 4),
2394 x if x == tcx.types.f64 => (Kind::Double, 8),
2395 x if x == tcx.types.f128 => (Kind::F128, 16),
2396 _ => (Kind::Integer, 0),
2397 }
2398 } else {
2399 (Kind::Integer, 0)
2400 };
2401
2402 let offset = if is_reference_target && !ty.is_array() { 0 } else { -1 };
2405 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() }]);
2406 }
2407
2408 if ty.is_ref() || ty.is_raw_ptr() || ty.is_box() {
2409 let Some(inner_ty) = ty.builtin_deref(true) else {
2410 return TypeTree::new();
2411 };
2412
2413 let child = typetree_from_ty_impl_inner(tcx, inner_ty, depth + 1, visited, true);
2414 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 {
2415 offset: -1,
2416 size: tcx.data_layout.pointer_size().bytes_usize(),
2417 kind: Kind::Pointer,
2418 child,
2419 }]);
2420 }
2421
2422 if ty.is_array() {
2423 if let ty::Array(element_ty, len_const) = ty.kind() {
2424 let len = len_const.try_to_target_usize(tcx).unwrap_or(0);
2425 if len == 0 {
2426 return TypeTree::new();
2427 }
2428 let element_tree =
2429 typetree_from_ty_impl_inner(tcx, *element_ty, depth + 1, visited, false);
2430 let mut types = Vec::new();
2431 for elem_type in &element_tree.0 {
2432 types.push(Type {
2433 offset: -1,
2434 size: elem_type.size,
2435 kind: elem_type.kind,
2436 child: elem_type.child.clone(),
2437 });
2438 }
2439
2440 return TypeTree(types);
2441 }
2442 }
2443
2444 if ty.is_slice() {
2445 if let ty::Slice(element_ty) = ty.kind() {
2446 let element_tree =
2447 typetree_from_ty_impl_inner(tcx, *element_ty, depth + 1, visited, false);
2448 return element_tree;
2449 }
2450 }
2451
2452 if let ty::Tuple(tuple_types) = ty.kind() {
2453 if tuple_types.is_empty() {
2454 return TypeTree::new();
2455 }
2456
2457 let mut types = Vec::new();
2458 let mut current_offset = 0;
2459
2460 for tuple_ty in tuple_types.iter() {
2461 let element_tree =
2462 typetree_from_ty_impl_inner(tcx, tuple_ty, depth + 1, visited, false);
2463
2464 let element_layout = tcx
2465 .layout_of(ty::TypingEnv::fully_monomorphized().as_query_input(tuple_ty))
2466 .ok()
2467 .map(|layout| layout.size.bytes_usize())
2468 .unwrap_or(0);
2469
2470 for elem_type in &element_tree.0 {
2471 types.push(Type {
2472 offset: if elem_type.offset == -1 {
2473 current_offset as isize
2474 } else {
2475 current_offset as isize + elem_type.offset
2476 },
2477 size: elem_type.size,
2478 kind: elem_type.kind,
2479 child: elem_type.child.clone(),
2480 });
2481 }
2482
2483 current_offset += element_layout;
2484 }
2485
2486 return TypeTree(types);
2487 }
2488
2489 if let ty::Adt(adt_def, args) = ty.kind() {
2490 if adt_def.is_struct() {
2491 let struct_layout =
2492 tcx.layout_of(ty::TypingEnv::fully_monomorphized().as_query_input(ty));
2493 if let Ok(layout) = struct_layout {
2494 let mut types = Vec::new();
2495
2496 for (field_idx, field_def) in adt_def.all_fields().enumerate() {
2497 let field_ty = field_def.ty(tcx, args);
2498 let field_tree =
2499 typetree_from_ty_impl_inner(tcx, field_ty, depth + 1, visited, false);
2500
2501 let field_offset = layout.fields.offset(field_idx).bytes_usize();
2502
2503 for elem_type in &field_tree.0 {
2504 types.push(Type {
2505 offset: if elem_type.offset == -1 {
2506 field_offset as isize
2507 } else {
2508 field_offset as isize + elem_type.offset
2509 },
2510 size: elem_type.size,
2511 kind: elem_type.kind,
2512 child: elem_type.child.clone(),
2513 });
2514 }
2515 }
2516
2517 return TypeTree(types);
2518 }
2519 }
2520 }
2521
2522 TypeTree::new()
2523}