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::{HashStable, HashStableContext, 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, HashStable, 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};
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, Feed, 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::HashStable for
ResolverGlobalCtxt {
#[inline]
fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&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.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
{ __binding_3.hash_stable(__hcx, __hasher); }
{ __binding_4.hash_stable(__hcx, __hasher); }
{ __binding_5.hash_stable(__hcx, __hasher); }
{ __binding_6.hash_stable(__hcx, __hasher); }
{ __binding_7.hash_stable(__hcx, __hasher); }
{ __binding_8.hash_stable(__hcx, __hasher); }
{ __binding_9.hash_stable(__hcx, __hasher); }
{ __binding_10.hash_stable(__hcx, __hasher); }
{ __binding_11.hash_stable(__hcx, __hasher); }
{ __binding_12.hash_stable(__hcx, __hasher); }
{ __binding_13.hash_stable(__hcx, __hasher); }
{ __binding_14.hash_stable(__hcx, __hasher); }
{ __binding_15.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
177pub struct ResolverGlobalCtxt {
178 pub visibilities_for_hashing: Vec<(LocalDefId, Visibility)>,
179 pub expn_that_defined: UnordMap<LocalDefId, ExpnId>,
181 pub effective_visibilities: EffectiveVisibilities,
182 pub extern_crate_map: UnordMap<LocalDefId, CrateNum>,
183 pub maybe_unused_trait_imports: FxIndexSet<LocalDefId>,
184 pub module_children: LocalDefIdMap<Vec<ModChild>>,
185 pub ambig_module_children: LocalDefIdMap<Vec<AmbigModChild>>,
186 pub glob_map: FxIndexMap<LocalDefId, FxIndexSet<Symbol>>,
187 pub main_def: Option<MainDefinition>,
188 pub trait_impls: FxIndexMap<DefId, Vec<LocalDefId>>,
189 pub proc_macros: Vec<LocalDefId>,
192 pub confused_type_with_std_module: FxIndexMap<Span, Span>,
195 pub doc_link_resolutions: FxIndexMap<LocalDefId, DocLinkResMap>,
196 pub doc_link_traits_in_scope: FxIndexMap<LocalDefId, Vec<DefId>>,
197 pub all_macro_rules: UnordSet<Symbol>,
198 pub stripped_cfg_items: Vec<StrippedCfgItem>,
199}
200
201#[derive(#[automatically_derived]
impl<'tcx> ::core::fmt::Debug for ResolverAstLowering<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["partial_res_map", "import_res_map", "label_res_map",
"lifetimes_res_map", "extra_lifetime_params_map",
"next_node_id", "node_id_to_def_id", "trait_map",
"lifetime_elision_allowed", "lint_buffer",
"delegation_infos", "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::HashStable for
MainDefinition {
#[inline]
fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&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.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
241pub struct MainDefinition {
242 pub res: Res<ast::NodeId>,
243 pub is_import: bool,
244 pub span: Span,
245}
246
247impl MainDefinition {
248 pub fn opt_fn_def_id(self) -> Option<DefId> {
249 if let Res::Def(DefKind::Fn, def_id) = self.res { Some(def_id) } else { None }
250 }
251}
252
253#[derive(#[automatically_derived]
impl<'tcx> ::core::marker::Copy for ImplTraitHeader<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for ImplTraitHeader<'tcx> {
#[inline]
fn clone(&self) -> ImplTraitHeader<'tcx> {
let _:
::core::clone::AssertParamIsClone<ty::EarlyBinder<'tcx,
ty::TraitRef<'tcx>>>;
let _: ::core::clone::AssertParamIsClone<ImplPolarity>;
let _: ::core::clone::AssertParamIsClone<hir::Safety>;
let _: ::core::clone::AssertParamIsClone<hir::Constness>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for ImplTraitHeader<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f,
"ImplTraitHeader", "trait_ref", &self.trait_ref, "polarity",
&self.polarity, "safety", &self.safety, "constness",
&&self.constness)
}
}Debug, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for ImplTraitHeader<'tcx> {
fn encode(&self, __encoder: &mut __E) {
match *self {
ImplTraitHeader {
trait_ref: ref __binding_0,
polarity: ref __binding_1,
safety: ref __binding_2,
constness: ref __binding_3 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_2,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_3,
__encoder);
}
}
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for ImplTraitHeader<'tcx> {
fn decode(__decoder: &mut __D) -> Self {
ImplTraitHeader {
trait_ref: ::rustc_serialize::Decodable::decode(__decoder),
polarity: ::rustc_serialize::Decodable::decode(__decoder),
safety: ::rustc_serialize::Decodable::decode(__decoder),
constness: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hasher::HashStable for
ImplTraitHeader<'tcx> {
#[inline]
fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&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.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
{ __binding_3.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
254pub struct ImplTraitHeader<'tcx> {
255 pub trait_ref: ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>>,
256 pub polarity: ImplPolarity,
257 pub safety: hir::Safety,
258 pub constness: hir::Constness,
259}
260
261#[derive(#[automatically_derived]
impl ::core::marker::Copy for Asyncness { }Copy, #[automatically_derived]
impl ::core::clone::Clone for Asyncness {
#[inline]
fn clone(&self) -> Asyncness { *self }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for Asyncness {
#[inline]
fn eq(&self, other: &Asyncness) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Asyncness {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for Asyncness {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}Hash, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for Asyncness {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
Asyncness::Yes => { 0usize }
Asyncness::No => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self { Asyncness::Yes => {} Asyncness::No => {} }
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for Asyncness {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { Asyncness::Yes }
1usize => { Asyncness::No }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Asyncness`, expected 0..2, actual {0}",
n));
}
}
}
}
};TyDecodable, const _: () =
{
impl ::rustc_data_structures::stable_hasher::HashStable for Asyncness
{
#[inline]
fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self { Asyncness::Yes => {} Asyncness::No => {} }
}
}
};HashStable, #[automatically_derived]
impl ::core::fmt::Debug for Asyncness {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self { Asyncness::Yes => "Yes", Asyncness::No => "No", })
}
}Debug)]
262#[derive(const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for Asyncness {
fn try_fold_with<__F: ::rustc_middle::ty::FallibleTypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
Asyncness::Yes => { Asyncness::Yes }
Asyncness::No => { Asyncness::No }
})
}
fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Self {
match self {
Asyncness::Yes => { Asyncness::Yes }
Asyncness::No => { Asyncness::No }
}
}
}
};TypeFoldable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for Asyncness {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self { Asyncness::Yes => {} Asyncness::No => {} }
<__V::Result as ::rustc_middle::ty::VisitorResult>::output()
}
}
};TypeVisitable, #[automatically_derived]
impl ::core::default::Default for Asyncness {
#[inline]
fn default() -> Asyncness { Self::No }
}Default)]
263pub enum Asyncness {
264 Yes,
265 #[default]
266 No,
267}
268
269impl Asyncness {
270 pub fn is_async(self) -> bool {
271 #[allow(non_exhaustive_omitted_patterns)] match self {
Asyncness::Yes => true,
_ => false,
}matches!(self, Asyncness::Yes)
272 }
273}
274
275#[derive(#[automatically_derived]
impl<Id: ::core::clone::Clone> ::core::clone::Clone for Visibility<Id> {
#[inline]
fn clone(&self) -> Visibility<Id> {
match self {
Visibility::Public => Visibility::Public,
Visibility::Restricted(__self_0) =>
Visibility::Restricted(::core::clone::Clone::clone(__self_0)),
}
}
}Clone, #[automatically_derived]
impl<Id: ::core::fmt::Debug> ::core::fmt::Debug for Visibility<Id> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Visibility::Public =>
::core::fmt::Formatter::write_str(f, "Public"),
Visibility::Restricted(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Restricted", &__self_0),
}
}
}Debug, #[automatically_derived]
impl<Id: ::core::cmp::PartialEq> ::core::cmp::PartialEq for Visibility<Id> {
#[inline]
fn eq(&self, other: &Visibility<Id>) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(Visibility::Restricted(__self_0),
Visibility::Restricted(__arg1_0)) => __self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl<Id: ::core::cmp::Eq> ::core::cmp::Eq for Visibility<Id> {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<Id>;
}
}Eq, #[automatically_derived]
impl<Id: ::core::marker::Copy> ::core::marker::Copy for Visibility<Id> { }Copy, #[automatically_derived]
impl<Id: ::core::hash::Hash> ::core::hash::Hash for Visibility<Id> {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
Visibility::Restricted(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, const _: () =
{
impl<Id, __E: ::rustc_span::SpanEncoder>
::rustc_serialize::Encodable<__E> for Visibility<Id> where
Id: ::rustc_serialize::Encodable<__E> {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
Visibility::Public => { 0usize }
Visibility::Restricted(ref __binding_0) => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
Visibility::Public => {}
Visibility::Restricted(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<Id, __D: ::rustc_span::BlobDecoder>
::rustc_serialize::Decodable<__D> for Visibility<Id> where
Id: ::rustc_serialize::Decodable<__D> {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { Visibility::Public }
1usize => {
Visibility::Restricted(::rustc_serialize::Decodable::decode(__decoder))
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Visibility`, expected 0..2, actual {0}",
n));
}
}
}
}
};BlobDecodable, const _: () =
{
impl<Id> ::rustc_data_structures::stable_hasher::HashStable for
Visibility<Id> where
Id: ::rustc_data_structures::stable_hasher::HashStable {
#[inline]
fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self {
Visibility::Public => {}
Visibility::Restricted(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
276pub enum Visibility<Id = LocalDefId> {
277 Public,
279 Restricted(Id),
281}
282
283impl Visibility {
284 pub fn to_string(self, def_id: LocalDefId, tcx: TyCtxt<'_>) -> String {
285 match self {
286 ty::Visibility::Restricted(restricted_id) => {
287 if restricted_id.is_top_level_module() {
288 "pub(crate)".to_string()
289 } else if restricted_id == tcx.parent_module_from_def_id(def_id).to_local_def_id() {
290 "pub(self)".to_string()
291 } else {
292 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("pub(in crate{0})",
tcx.def_path(restricted_id.to_def_id()).to_string_no_crate_verbose()))
})format!(
293 "pub(in crate{})",
294 tcx.def_path(restricted_id.to_def_id()).to_string_no_crate_verbose()
295 )
296 }
297 }
298 ty::Visibility::Public => "pub".to_string(),
299 }
300 }
301}
302
303#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for ClosureSizeProfileData<'tcx> {
#[inline]
fn clone(&self) -> ClosureSizeProfileData<'tcx> {
let _: ::core::clone::AssertParamIsClone<Ty<'tcx>>;
let _: ::core::clone::AssertParamIsClone<Ty<'tcx>>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for ClosureSizeProfileData<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"ClosureSizeProfileData", "before_feature_tys",
&self.before_feature_tys, "after_feature_tys",
&&self.after_feature_tys)
}
}Debug, #[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for ClosureSizeProfileData<'tcx> {
#[inline]
fn eq(&self, other: &ClosureSizeProfileData<'tcx>) -> bool {
self.before_feature_tys == other.before_feature_tys &&
self.after_feature_tys == other.after_feature_tys
}
}PartialEq, #[automatically_derived]
impl<'tcx> ::core::cmp::Eq for ClosureSizeProfileData<'tcx> {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<Ty<'tcx>>;
let _: ::core::cmp::AssertParamIsEq<Ty<'tcx>>;
}
}Eq, #[automatically_derived]
impl<'tcx> ::core::marker::Copy for ClosureSizeProfileData<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::hash::Hash for ClosureSizeProfileData<'tcx> {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.before_feature_tys, state);
::core::hash::Hash::hash(&self.after_feature_tys, state)
}
}Hash, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for ClosureSizeProfileData<'tcx>
{
fn encode(&self, __encoder: &mut __E) {
match *self {
ClosureSizeProfileData {
before_feature_tys: ref __binding_0,
after_feature_tys: ref __binding_1 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for ClosureSizeProfileData<'tcx>
{
fn decode(__decoder: &mut __D) -> Self {
ClosureSizeProfileData {
before_feature_tys: ::rustc_serialize::Decodable::decode(__decoder),
after_feature_tys: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hasher::HashStable for
ClosureSizeProfileData<'tcx> {
#[inline]
fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&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.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
304#[derive(const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for ClosureSizeProfileData<'tcx> {
fn try_fold_with<__F: ::rustc_middle::ty::FallibleTypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
ClosureSizeProfileData {
before_feature_tys: __binding_0,
after_feature_tys: __binding_1 } => {
ClosureSizeProfileData {
before_feature_tys: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
after_feature_tys: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Self {
match self {
ClosureSizeProfileData {
before_feature_tys: __binding_0,
after_feature_tys: __binding_1 } => {
ClosureSizeProfileData {
before_feature_tys: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder),
after_feature_tys: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
__folder),
}
}
}
}
}
};TypeFoldable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for ClosureSizeProfileData<'tcx> {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
ClosureSizeProfileData {
before_feature_tys: ref __binding_0,
after_feature_tys: ref __binding_1 } => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_middle::ty::VisitorResult>::output()
}
}
};TypeVisitable)]
305pub struct ClosureSizeProfileData<'tcx> {
306 pub before_feature_tys: Ty<'tcx>,
308 pub after_feature_tys: Ty<'tcx>,
310}
311
312impl TyCtxt<'_> {
313 #[inline]
314 pub fn opt_parent(self, id: DefId) -> Option<DefId> {
315 self.def_key(id).parent.map(|index| DefId { index, ..id })
316 }
317
318 #[inline]
319 #[track_caller]
320 pub fn parent(self, id: DefId) -> DefId {
321 match self.opt_parent(id) {
322 Some(id) => id,
323 None => crate::util::bug::bug_fmt(format_args!("{0:?} doesn\'t have a parent", id))bug!("{id:?} doesn't have a parent"),
325 }
326 }
327
328 #[inline]
329 #[track_caller]
330 pub fn opt_local_parent(self, id: LocalDefId) -> Option<LocalDefId> {
331 self.opt_parent(id.to_def_id()).map(DefId::expect_local)
332 }
333
334 #[inline]
335 #[track_caller]
336 pub fn local_parent(self, id: impl Into<LocalDefId>) -> LocalDefId {
337 self.parent(id.into().to_def_id()).expect_local()
338 }
339
340 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::HashStable for
CrateVariancesMap<'tcx> {
#[inline]
fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
CrateVariancesMap { variances: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for CrateVariancesMap<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f,
"CrateVariancesMap", "variances", &&self.variances)
}
}Debug)]
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::HashStable for
Ty<'tcx> {
#[inline]
fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
Ty(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
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::HashStable for
CratePredicatesMap<'tcx> {
#[inline]
fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
CratePredicatesMap { predicates: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for CratePredicatesMap<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f,
"CratePredicatesMap", "predicates", &&self.predicates)
}
}Debug)]
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> HashStable for Term<'tcx> {
561 fn hash_stable<Hcx: HashStableContext>(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
562 self.kind().hash_stable(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::HashStable for
ProvisionalHiddenType<'tcx> {
#[inline]
fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&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.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for ProvisionalHiddenType<'tcx>
{
fn encode(&self, __encoder: &mut __E) {
match *self {
ProvisionalHiddenType {
span: ref __binding_0, ty: ref __binding_1 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for ProvisionalHiddenType<'tcx>
{
fn decode(__decoder: &mut __D) -> Self {
ProvisionalHiddenType {
span: ::rustc_serialize::Decodable::decode(__decoder),
ty: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable)]
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::HashStable for
DefinitionSiteHiddenType<'tcx> {
#[inline]
fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&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.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for
DefinitionSiteHiddenType<'tcx> {
fn encode(&self, __encoder: &mut __E) {
match *self {
DefinitionSiteHiddenType {
span: ref __binding_0, ty: ref __binding_1 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for
DefinitionSiteHiddenType<'tcx> {
fn decode(__decoder: &mut __D) -> Self {
DefinitionSiteHiddenType {
span: ::rustc_serialize::Decodable::decode(__decoder),
ty: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable)]
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::HashStable for
ParamEnv<'tcx> {
#[inline]
fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
ParamEnv { caller_bounds: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for ParamEnv<'tcx> {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
ParamEnv { caller_bounds: ref __binding_0 } => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_middle::ty::VisitorResult>::output()
}
}
};TypeVisitable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for ParamEnv<'tcx> {
fn try_fold_with<__F: ::rustc_middle::ty::FallibleTypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
ParamEnv { caller_bounds: __binding_0 } => {
ParamEnv {
caller_bounds: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Self {
match self {
ParamEnv { caller_bounds: __binding_0 } => {
ParamEnv {
caller_bounds: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder),
}
}
}
}
}
};TypeFoldable)]
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::HashStable for
ParamEnvAnd<'tcx, T> where
T: ::rustc_data_structures::stable_hasher::HashStable {
#[inline]
fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&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.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
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::HashStable for
TypingEnv<'tcx> {
#[inline]
fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&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.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
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())
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 match typing_mode.0 {
1079 TypingMode::Coherence
1080 | TypingMode::Analysis { .. }
1081 | TypingMode::Borrowck { .. }
1082 | TypingMode::PostBorrowckAnalysis { .. } => {}
1083 TypingMode::PostAnalysis => return self,
1084 }
1085
1086 let param_env = if tcx.next_trait_solver_globally() {
1089 param_env
1090 } else {
1091 ParamEnv::new(tcx.reveal_opaque_types_in_bounds(param_env.caller_bounds()))
1092 };
1093 TypingEnv { typing_mode: TypingModeEqWrapper(TypingMode::PostAnalysis), param_env }
1094 }
1095
1096 pub fn as_query_input<T>(self, value: T) -> PseudoCanonicalInput<'tcx, T>
1101 where
1102 T: TypeVisitable<TyCtxt<'tcx>>,
1103 {
1104 PseudoCanonicalInput { typing_env: self, value }
1117 }
1118}
1119
1120#[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)]
1130#[derive(const _: () =
{
impl<'tcx, T> ::rustc_data_structures::stable_hasher::HashStable for
PseudoCanonicalInput<'tcx, T> where
T: ::rustc_data_structures::stable_hasher::HashStable {
#[inline]
fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&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.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, const _: () =
{
impl<'tcx, T>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for PseudoCanonicalInput<'tcx, T> where
T: ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
{
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
PseudoCanonicalInput {
typing_env: ref __binding_0, value: ref __binding_1 } => {
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_1,
__visitor)) {
::core::ops::ControlFlow::Continue(()) => {}
::core::ops::ControlFlow::Break(r) => {
return ::rustc_middle::ty::VisitorResult::from_residual(r);
}
}
}
}
}
<__V::Result as ::rustc_middle::ty::VisitorResult>::output()
}
}
};TypeVisitable, const _: () =
{
impl<'tcx, T>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for PseudoCanonicalInput<'tcx, T> where
T: ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
{
fn try_fold_with<__F: ::rustc_middle::ty::FallibleTypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Result<Self, __F::Error> {
Ok(match self {
PseudoCanonicalInput {
typing_env: __binding_0, value: __binding_1 } => {
PseudoCanonicalInput {
typing_env: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
value: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Self {
match self {
PseudoCanonicalInput {
typing_env: __binding_0, value: __binding_1 } => {
PseudoCanonicalInput {
typing_env: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder),
value: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
__folder),
}
}
}
}
}
};TypeFoldable)]
1131pub struct PseudoCanonicalInput<'tcx, T> {
1132 pub typing_env: TypingEnv<'tcx>,
1133 pub value: T,
1134}
1135
1136#[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::HashStable for Destructor
{
#[inline]
fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
Destructor { did: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for Destructor {
fn encode(&self, __encoder: &mut __E) {
match *self {
Destructor { did: ref __binding_0 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for Destructor {
fn decode(__decoder: &mut __D) -> Self {
Destructor {
did: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable)]
1137pub struct Destructor {
1138 pub did: DefId,
1140}
1141
1142#[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::HashStable for
AsyncDestructor {
#[inline]
fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
AsyncDestructor { impl_did: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for AsyncDestructor {
fn encode(&self, __encoder: &mut __E) {
match *self {
AsyncDestructor { impl_did: ref __binding_0 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for AsyncDestructor {
fn decode(__decoder: &mut __D) -> Self {
AsyncDestructor {
impl_did: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable)]
1144pub struct AsyncDestructor {
1145 pub impl_did: DefId,
1147}
1148
1149#[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::HashStable for
VariantFlags {
#[inline]
fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
VariantFlags(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for VariantFlags {
fn encode(&self, __encoder: &mut __E) {
match *self {
VariantFlags(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for VariantFlags {
fn decode(__decoder: &mut __D) -> Self {
VariantFlags(::rustc_serialize::Decodable::decode(__decoder))
}
}
};TyDecodable)]
1150pub struct VariantFlags(u8);
1151impl 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! {
1152 impl VariantFlags: u8 {
1153 const NO_VARIANT_FLAGS = 0;
1154 const IS_FIELD_LIST_NON_EXHAUSTIVE = 1 << 0;
1156 }
1157}
1158impl ::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 }
1159
1160#[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::HashStable for VariantDef
{
#[inline]
fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&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.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
{ __binding_3.hash_stable(__hcx, __hasher); }
{ __binding_4.hash_stable(__hcx, __hasher); }
{ __binding_5.hash_stable(__hcx, __hasher); }
{ __binding_6.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for VariantDef {
fn encode(&self, __encoder: &mut __E) {
match *self {
VariantDef {
def_id: ref __binding_0,
ctor: ref __binding_1,
name: ref __binding_2,
discr: ref __binding_3,
fields: ref __binding_4,
tainted: ref __binding_5,
flags: ref __binding_6 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_2,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_3,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_4,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_5,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_6,
__encoder);
}
}
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for VariantDef {
fn decode(__decoder: &mut __D) -> Self {
VariantDef {
def_id: ::rustc_serialize::Decodable::decode(__decoder),
ctor: ::rustc_serialize::Decodable::decode(__decoder),
name: ::rustc_serialize::Decodable::decode(__decoder),
discr: ::rustc_serialize::Decodable::decode(__decoder),
fields: ::rustc_serialize::Decodable::decode(__decoder),
tainted: ::rustc_serialize::Decodable::decode(__decoder),
flags: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable)]
1162pub struct VariantDef {
1163 pub def_id: DefId,
1166 pub ctor: Option<(CtorKind, DefId)>,
1169 pub name: Symbol,
1171 pub discr: VariantDiscr,
1173 pub fields: IndexVec<FieldIdx, FieldDef>,
1175 tainted: Option<ErrorGuaranteed>,
1177 flags: VariantFlags,
1179}
1180
1181impl VariantDef {
1182 #[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(1198u32),
::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")]
1199 pub fn new(
1200 name: Symbol,
1201 variant_did: Option<DefId>,
1202 ctor: Option<(CtorKind, DefId)>,
1203 discr: VariantDiscr,
1204 fields: IndexVec<FieldIdx, FieldDef>,
1205 parent_did: DefId,
1206 recover_tainted: Option<ErrorGuaranteed>,
1207 is_field_list_non_exhaustive: bool,
1208 ) -> Self {
1209 let mut flags = VariantFlags::NO_VARIANT_FLAGS;
1210 if is_field_list_non_exhaustive {
1211 flags |= VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE;
1212 }
1213
1214 VariantDef {
1215 def_id: variant_did.unwrap_or(parent_did),
1216 ctor,
1217 name,
1218 discr,
1219 fields,
1220 flags,
1221 tainted: recover_tainted,
1222 }
1223 }
1224
1225 #[inline]
1231 pub fn is_field_list_non_exhaustive(&self) -> bool {
1232 self.flags.intersects(VariantFlags::IS_FIELD_LIST_NON_EXHAUSTIVE)
1233 }
1234
1235 #[inline]
1238 pub fn field_list_has_applicable_non_exhaustive(&self) -> bool {
1239 self.is_field_list_non_exhaustive() && !self.def_id.is_local()
1240 }
1241
1242 pub fn ident(&self, tcx: TyCtxt<'_>) -> Ident {
1244 Ident::new(self.name, tcx.def_ident_span(self.def_id).unwrap())
1245 }
1246
1247 #[inline]
1249 pub fn has_errors(&self) -> Result<(), ErrorGuaranteed> {
1250 self.tainted.map_or(Ok(()), Err)
1251 }
1252
1253 #[inline]
1254 pub fn ctor_kind(&self) -> Option<CtorKind> {
1255 self.ctor.map(|(kind, _)| kind)
1256 }
1257
1258 #[inline]
1259 pub fn ctor_def_id(&self) -> Option<DefId> {
1260 self.ctor.map(|(_, def_id)| def_id)
1261 }
1262
1263 #[inline]
1267 pub fn single_field(&self) -> &FieldDef {
1268 if !(self.fields.len() == 1) {
::core::panicking::panic("assertion failed: self.fields.len() == 1")
};assert!(self.fields.len() == 1);
1269
1270 &self.fields[FieldIdx::ZERO]
1271 }
1272
1273 #[inline]
1275 pub fn tail_opt(&self) -> Option<&FieldDef> {
1276 self.fields.raw.last()
1277 }
1278
1279 #[inline]
1285 pub fn tail(&self) -> &FieldDef {
1286 self.tail_opt().expect("expected unsized ADT to have a tail field")
1287 }
1288
1289 pub fn has_unsafe_fields(&self) -> bool {
1291 self.fields.iter().any(|x| x.safety.is_unsafe())
1292 }
1293}
1294
1295impl PartialEq for VariantDef {
1296 #[inline]
1297 fn eq(&self, other: &Self) -> bool {
1298 let Self {
1306 def_id: lhs_def_id,
1307 ctor: _,
1308 name: _,
1309 discr: _,
1310 fields: _,
1311 flags: _,
1312 tainted: _,
1313 } = &self;
1314 let Self {
1315 def_id: rhs_def_id,
1316 ctor: _,
1317 name: _,
1318 discr: _,
1319 fields: _,
1320 flags: _,
1321 tainted: _,
1322 } = other;
1323
1324 let res = lhs_def_id == rhs_def_id;
1325
1326 if truecfg!(debug_assertions) && res {
1328 let deep = self.ctor == other.ctor
1329 && self.name == other.name
1330 && self.discr == other.discr
1331 && self.fields == other.fields
1332 && self.flags == other.flags;
1333 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");
1334 }
1335
1336 res
1337 }
1338}
1339
1340impl Eq for VariantDef {}
1341
1342impl Hash for VariantDef {
1343 #[inline]
1344 fn hash<H: Hasher>(&self, s: &mut H) {
1345 let Self { def_id, ctor: _, name: _, discr: _, fields: _, flags: _, tainted: _ } = &self;
1353 def_id.hash(s)
1354 }
1355}
1356
1357#[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::HashStable for
VariantDiscr {
#[inline]
fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self {
VariantDiscr::Explicit(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
VariantDiscr::Relative(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
1358pub enum VariantDiscr {
1359 Explicit(DefId),
1362
1363 Relative(u32),
1368}
1369
1370#[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::HashStable for FieldDef {
#[inline]
fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&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.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
{ __binding_2.hash_stable(__hcx, __hasher); }
{ __binding_3.hash_stable(__hcx, __hasher); }
{ __binding_4.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for FieldDef {
fn encode(&self, __encoder: &mut __E) {
match *self {
FieldDef {
did: ref __binding_0,
name: ref __binding_1,
vis: ref __binding_2,
safety: ref __binding_3,
value: ref __binding_4 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_2,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_3,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_4,
__encoder);
}
}
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for FieldDef {
fn decode(__decoder: &mut __D) -> Self {
FieldDef {
did: ::rustc_serialize::Decodable::decode(__decoder),
name: ::rustc_serialize::Decodable::decode(__decoder),
vis: ::rustc_serialize::Decodable::decode(__decoder),
safety: ::rustc_serialize::Decodable::decode(__decoder),
value: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable)]
1371pub struct FieldDef {
1372 pub did: DefId,
1373 pub name: Symbol,
1374 pub vis: Visibility<DefId>,
1375 pub safety: hir::Safety,
1376 pub value: Option<DefId>,
1377}
1378
1379impl PartialEq for FieldDef {
1380 #[inline]
1381 fn eq(&self, other: &Self) -> bool {
1382 let Self { did: lhs_did, name: _, vis: _, safety: _, value: _ } = &self;
1390
1391 let Self { did: rhs_did, name: _, vis: _, safety: _, value: _ } = other;
1392
1393 let res = lhs_did == rhs_did;
1394
1395 if truecfg!(debug_assertions) && res {
1397 let deep =
1398 self.name == other.name && self.vis == other.vis && self.safety == other.safety;
1399 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");
1400 }
1401
1402 res
1403 }
1404}
1405
1406impl Eq for FieldDef {}
1407
1408impl Hash for FieldDef {
1409 #[inline]
1410 fn hash<H: Hasher>(&self, s: &mut H) {
1411 let Self { did, name: _, vis: _, safety: _, value: _ } = &self;
1419
1420 did.hash(s)
1421 }
1422}
1423
1424impl<'tcx> FieldDef {
1425 pub fn ty(&self, tcx: TyCtxt<'tcx>, args: GenericArgsRef<'tcx>) -> Ty<'tcx> {
1428 tcx.type_of(self.did).instantiate(tcx, args).skip_norm_wip()
1429 }
1430
1431 pub fn ident(&self, tcx: TyCtxt<'_>) -> Ident {
1433 Ident::new(self.name, tcx.def_ident_span(self.did).unwrap())
1434 }
1435}
1436
1437#[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)]
1438pub enum ImplOverlapKind {
1439 Permitted {
1441 marker: bool,
1443 },
1444}
1445
1446#[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::HashStable for
ImplTraitInTraitData {
#[inline]
fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self {
ImplTraitInTraitData::Trait {
fn_def_id: ref __binding_0, opaque_def_id: ref __binding_1 }
=> {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
ImplTraitInTraitData::Impl { fn_def_id: ref __binding_0 } =>
{
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
1449pub enum ImplTraitInTraitData {
1450 Trait { fn_def_id: DefId, opaque_def_id: DefId },
1451 Impl { fn_def_id: DefId },
1452}
1453
1454impl<'tcx> TyCtxt<'tcx> {
1455 pub fn typeck_body(self, body: hir::BodyId) -> &'tcx TypeckResults<'tcx> {
1456 self.typeck(self.hir_body_owner_def_id(body))
1457 }
1458
1459 pub fn provided_trait_methods(self, id: DefId) -> impl 'tcx + Iterator<Item = &'tcx AssocItem> {
1460 self.associated_items(id)
1461 .in_definition_order()
1462 .filter(move |item| item.is_fn() && item.defaultness(self).has_value())
1463 }
1464
1465 pub fn repr_options_of_def(self, did: LocalDefId) -> ReprOptions {
1466 let mut flags = ReprFlags::empty();
1467 let mut size = None;
1468 let mut max_align: Option<Align> = None;
1469 let mut min_pack: Option<Align> = None;
1470
1471 let mut field_shuffle_seed = self.def_path_hash(did.to_def_id()).0.to_smaller_hash();
1474
1475 if let Some(user_seed) = self.sess.opts.unstable_opts.layout_seed {
1479 field_shuffle_seed ^= user_seed;
1480 }
1481
1482 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
1483 )
1484 .map(|elt| match elt {
1485 Some(n) => ScalableElt::ElementCount(*n),
1486 None => ScalableElt::Container,
1487 });
1488 if elt.is_some() {
1489 flags.insert(ReprFlags::IS_SCALABLE);
1490 }
1491 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) {
1492 for (r, _) in reprs {
1493 flags.insert(match *r {
1494 attr::ReprRust => ReprFlags::empty(),
1495 attr::ReprC => ReprFlags::IS_C,
1496 attr::ReprPacked(pack) => {
1497 min_pack = Some(if let Some(min_pack) = min_pack {
1498 min_pack.min(pack)
1499 } else {
1500 pack
1501 });
1502 ReprFlags::empty()
1503 }
1504 attr::ReprTransparent => ReprFlags::IS_TRANSPARENT,
1505 attr::ReprSimd => ReprFlags::IS_SIMD,
1506 attr::ReprInt(i) => {
1507 size = Some(match i {
1508 attr::IntType::SignedInt(x) => match x {
1509 ast::IntTy::Isize => IntegerType::Pointer(true),
1510 ast::IntTy::I8 => IntegerType::Fixed(Integer::I8, true),
1511 ast::IntTy::I16 => IntegerType::Fixed(Integer::I16, true),
1512 ast::IntTy::I32 => IntegerType::Fixed(Integer::I32, true),
1513 ast::IntTy::I64 => IntegerType::Fixed(Integer::I64, true),
1514 ast::IntTy::I128 => IntegerType::Fixed(Integer::I128, true),
1515 },
1516 attr::IntType::UnsignedInt(x) => match x {
1517 ast::UintTy::Usize => IntegerType::Pointer(false),
1518 ast::UintTy::U8 => IntegerType::Fixed(Integer::I8, false),
1519 ast::UintTy::U16 => IntegerType::Fixed(Integer::I16, false),
1520 ast::UintTy::U32 => IntegerType::Fixed(Integer::I32, false),
1521 ast::UintTy::U64 => IntegerType::Fixed(Integer::I64, false),
1522 ast::UintTy::U128 => IntegerType::Fixed(Integer::I128, false),
1523 },
1524 });
1525 ReprFlags::empty()
1526 }
1527 attr::ReprAlign(align) => {
1528 max_align = max_align.max(Some(align));
1529 ReprFlags::empty()
1530 }
1531 });
1532 }
1533 }
1534
1535 if self.sess.opts.unstable_opts.randomize_layout {
1538 flags.insert(ReprFlags::RANDOMIZE_LAYOUT);
1539 }
1540
1541 let is_box = self.is_lang_item(did.to_def_id(), LangItem::OwnedBox);
1544
1545 if is_box {
1547 flags.insert(ReprFlags::IS_LINEAR);
1548 }
1549
1550 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(..)) {
1552 flags.insert(ReprFlags::PASS_INDIRECTLY_IN_NON_RUSTIC_ABIS);
1553 }
1554
1555 ReprOptions {
1556 int: size,
1557 align: max_align,
1558 pack: min_pack,
1559 flags,
1560 field_shuffle_seed,
1561 scalable: elt,
1562 }
1563 }
1564
1565 pub fn opt_item_name(self, def_id: impl IntoQueryKey<DefId>) -> Option<Symbol> {
1567 let def_id = def_id.into_query_key();
1568 if let Some(cnum) = def_id.as_crate_root() {
1569 Some(self.crate_name(cnum))
1570 } else {
1571 let def_key = self.def_key(def_id);
1572 match def_key.disambiguated_data.data {
1573 rustc_hir::definitions::DefPathData::Ctor => self
1575 .opt_item_name(DefId { krate: def_id.krate, index: def_key.parent.unwrap() }),
1576 _ => def_key.get_opt_name(),
1577 }
1578 }
1579 }
1580
1581 pub fn item_name(self, id: impl IntoQueryKey<DefId>) -> Symbol {
1588 let id = id.into_query_key();
1589 self.opt_item_name(id).unwrap_or_else(|| {
1590 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));
1591 })
1592 }
1593
1594 pub fn opt_item_ident(self, def_id: impl IntoQueryKey<DefId>) -> Option<Ident> {
1598 let def_id = def_id.into_query_key();
1599 let def = self.opt_item_name(def_id)?;
1600 let span = self
1601 .def_ident_span(def_id)
1602 .unwrap_or_else(|| crate::util::bug::bug_fmt(format_args!("missing ident span for {0:?}",
def_id))bug!("missing ident span for {def_id:?}"));
1603 Some(Ident::new(def, span))
1604 }
1605
1606 pub fn item_ident(self, def_id: impl IntoQueryKey<DefId>) -> Ident {
1610 let def_id = def_id.into_query_key();
1611 self.opt_item_ident(def_id).unwrap_or_else(|| {
1612 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));
1613 })
1614 }
1615
1616 pub fn opt_associated_item(self, def_id: DefId) -> Option<AssocItem> {
1617 if let DefKind::AssocConst { .. } | DefKind::AssocFn | DefKind::AssocTy =
1618 self.def_kind(def_id)
1619 {
1620 Some(self.associated_item(def_id))
1621 } else {
1622 None
1623 }
1624 }
1625
1626 pub fn opt_rpitit_info(self, def_id: DefId) -> Option<ImplTraitInTraitData> {
1630 if let DefKind::AssocTy = self.def_kind(def_id)
1631 && let AssocKind::Type { data: AssocTypeData::Rpitit(rpitit_info) } =
1632 self.associated_item(def_id).kind
1633 {
1634 Some(rpitit_info)
1635 } else {
1636 None
1637 }
1638 }
1639
1640 pub fn find_field_index(self, ident: Ident, variant: &VariantDef) -> Option<FieldIdx> {
1641 variant.fields.iter_enumerated().find_map(|(i, field)| {
1642 self.hygienic_eq(ident, field.ident(self), variant.def_id).then_some(i)
1643 })
1644 }
1645
1646 x;#[instrument(level = "debug", skip(self), ret)]
1649 pub fn impls_are_allowed_to_overlap(
1650 self,
1651 def_id1: DefId,
1652 def_id2: DefId,
1653 ) -> Option<ImplOverlapKind> {
1654 let impl1 = self.impl_trait_header(def_id1);
1655 let impl2 = self.impl_trait_header(def_id2);
1656
1657 let trait_ref1 = impl1.trait_ref.skip_binder();
1658 let trait_ref2 = impl2.trait_ref.skip_binder();
1659
1660 if trait_ref1.references_error() || trait_ref2.references_error() {
1663 return Some(ImplOverlapKind::Permitted { marker: false });
1664 }
1665
1666 match (impl1.polarity, impl2.polarity) {
1667 (ImplPolarity::Reservation, _) | (_, ImplPolarity::Reservation) => {
1668 return Some(ImplOverlapKind::Permitted { marker: false });
1670 }
1671 (ImplPolarity::Positive, ImplPolarity::Negative)
1672 | (ImplPolarity::Negative, ImplPolarity::Positive) => {
1673 return None;
1675 }
1676 (ImplPolarity::Positive, ImplPolarity::Positive)
1677 | (ImplPolarity::Negative, ImplPolarity::Negative) => {}
1678 };
1679
1680 let is_marker_impl = |trait_ref: TraitRef<'_>| self.trait_def(trait_ref.def_id).is_marker;
1681 let is_marker_overlap = is_marker_impl(trait_ref1) && is_marker_impl(trait_ref2);
1682
1683 if is_marker_overlap {
1684 return Some(ImplOverlapKind::Permitted { marker: true });
1685 }
1686
1687 None
1688 }
1689
1690 pub fn expect_variant_res(self, res: Res) -> &'tcx VariantDef {
1693 match res {
1694 Res::Def(DefKind::Variant, did) => {
1695 let enum_did = self.parent(did);
1696 self.adt_def(enum_did).variant_with_id(did)
1697 }
1698 Res::Def(DefKind::Struct | DefKind::Union, did) => self.adt_def(did).non_enum_variant(),
1699 Res::Def(DefKind::Ctor(CtorOf::Variant, ..), variant_ctor_did) => {
1700 let variant_did = self.parent(variant_ctor_did);
1701 let enum_did = self.parent(variant_did);
1702 self.adt_def(enum_did).variant_with_ctor_id(variant_ctor_did)
1703 }
1704 Res::Def(DefKind::Ctor(CtorOf::Struct, ..), ctor_did) => {
1705 let struct_did = self.parent(ctor_did);
1706 self.adt_def(struct_did).non_enum_variant()
1707 }
1708 _ => 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),
1709 }
1710 }
1711
1712 #[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(1713u32),
::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:1717",
"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(1717u32),
::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:1719",
"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(1719u32),
::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")]
1714 pub fn instance_mir(self, instance: ty::InstanceKind<'tcx>) -> &'tcx Body<'tcx> {
1715 match instance {
1716 ty::InstanceKind::Item(def) => {
1717 debug!("calling def_kind on def: {:?}", def);
1718 let def_kind = self.def_kind(def);
1719 debug!("returned from def_kind: {:?}", def_kind);
1720 match def_kind {
1721 DefKind::Const { .. }
1722 | DefKind::Static { .. }
1723 | DefKind::AssocConst { .. }
1724 | DefKind::Ctor(..)
1725 | DefKind::AnonConst
1726 | DefKind::InlineConst => self.mir_for_ctfe(def),
1727 _ => self.optimized_mir(def),
1730 }
1731 }
1732 ty::InstanceKind::VTableShim(..)
1733 | ty::InstanceKind::ReifyShim(..)
1734 | ty::InstanceKind::Intrinsic(..)
1735 | ty::InstanceKind::FnPtrShim(..)
1736 | ty::InstanceKind::Virtual(..)
1737 | ty::InstanceKind::ClosureOnceShim { .. }
1738 | ty::InstanceKind::ConstructCoroutineInClosureShim { .. }
1739 | ty::InstanceKind::FutureDropPollShim(..)
1740 | ty::InstanceKind::DropGlue(..)
1741 | ty::InstanceKind::CloneShim(..)
1742 | ty::InstanceKind::ThreadLocalShim(..)
1743 | ty::InstanceKind::FnPtrAddrShim(..)
1744 | ty::InstanceKind::AsyncDropGlueCtorShim(..)
1745 | ty::InstanceKind::AsyncDropGlue(..) => self.mir_shims(instance),
1746 }
1747 }
1748
1749 #[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."]
1751 pub fn get_attrs(
1752 self,
1753 did: impl Into<DefId>,
1754 attr: Symbol,
1755 ) -> impl Iterator<Item = &'tcx hir::Attribute> {
1756 #[allow(deprecated)]
1757 self.get_all_attrs(did).iter().filter(move |a: &&hir::Attribute| a.has_name(attr))
1758 }
1759
1760 #[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."]
1765 pub fn get_all_attrs(self, did: impl Into<DefId>) -> &'tcx [hir::Attribute] {
1766 let did: DefId = did.into();
1767 if let Some(did) = did.as_local() {
1768 self.hir_attrs(self.local_def_id_to_hir_id(did))
1769 } else {
1770 self.attrs_for_def(did)
1771 }
1772 }
1773
1774 pub fn get_attrs_by_path(
1775 self,
1776 did: DefId,
1777 attr: &[Symbol],
1778 ) -> impl Iterator<Item = &'tcx hir::Attribute> {
1779 let filter_fn = move |a: &&hir::Attribute| a.path_matches(attr);
1780 if let Some(did) = did.as_local() {
1781 self.hir_attrs(self.local_def_id_to_hir_id(did)).iter().filter(filter_fn)
1782 } else {
1783 self.attrs_for_def(did).iter().filter(filter_fn)
1784 }
1785 }
1786
1787 pub fn trait_is_auto(self, trait_def_id: DefId) -> bool {
1789 self.trait_def(trait_def_id).has_auto_impl
1790 }
1791
1792 pub fn trait_is_coinductive(self, trait_def_id: DefId) -> bool {
1795 self.trait_def(trait_def_id).is_coinductive
1796 }
1797
1798 pub fn trait_is_alias(self, trait_def_id: DefId) -> bool {
1800 self.def_kind(trait_def_id) == DefKind::TraitAlias
1801 }
1802
1803 fn layout_error(self, err: LayoutError<'tcx>) -> &'tcx LayoutError<'tcx> {
1805 self.arena.alloc(err)
1806 }
1807
1808 fn ordinary_coroutine_layout(
1814 self,
1815 def_id: DefId,
1816 args: GenericArgsRef<'tcx>,
1817 ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1818 let coroutine_kind_ty = args.as_coroutine().kind_ty();
1819 let mir = self.optimized_mir(def_id);
1820 let ty = || Ty::new_coroutine(self, def_id, args);
1821 if coroutine_kind_ty.is_unit() {
1823 mir.coroutine_layout_raw().ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1824 } else {
1825 let ty::Coroutine(_, identity_args) =
1828 *self.type_of(def_id).instantiate_identity().skip_norm_wip().kind()
1829 else {
1830 ::core::panicking::panic("internal error: entered unreachable code");unreachable!();
1831 };
1832 let identity_kind_ty = identity_args.as_coroutine().kind_ty();
1833 if identity_kind_ty == coroutine_kind_ty {
1836 mir.coroutine_layout_raw()
1837 .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1838 } else {
1839 {
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));
1840 {
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!(
1841 identity_kind_ty.to_opt_closure_kind(),
1842 Some(ClosureKind::Fn | ClosureKind::FnMut)
1843 );
1844 self.optimized_mir(self.coroutine_by_move_body_def_id(def_id))
1845 .coroutine_layout_raw()
1846 .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1847 }
1848 }
1849 }
1850
1851 fn async_drop_coroutine_layout(
1855 self,
1856 def_id: DefId,
1857 args: GenericArgsRef<'tcx>,
1858 ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1859 let ty = || Ty::new_coroutine(self, def_id, args);
1860 if args[0].has_placeholders() || args[0].has_non_region_param() {
1861 return Err(self.layout_error(LayoutError::TooGeneric(ty())));
1862 }
1863 let instance = InstanceKind::AsyncDropGlue(def_id, Ty::new_coroutine(self, def_id, args));
1864 self.mir_shims(instance)
1865 .coroutine_layout_raw()
1866 .ok_or_else(|| self.layout_error(LayoutError::Unknown(ty())))
1867 }
1868
1869 pub fn coroutine_layout(
1872 self,
1873 def_id: DefId,
1874 args: GenericArgsRef<'tcx>,
1875 ) -> Result<&'tcx CoroutineLayout<'tcx>, &'tcx LayoutError<'tcx>> {
1876 if self.is_async_drop_in_place_coroutine(def_id) {
1877 let arg_cor_ty = args.first().unwrap().expect_ty();
1881 if arg_cor_ty.is_coroutine() {
1882 let span = self.def_span(def_id);
1883 let source_info = SourceInfo::outermost(span);
1884 let variant_fields: IndexVec<VariantIdx, IndexVec<FieldIdx, CoroutineSavedLocal>> =
1887 iter::repeat(IndexVec::new()).take(CoroutineArgs::RESERVED_VARIANTS).collect();
1888 let variant_source_info: IndexVec<VariantIdx, SourceInfo> =
1889 iter::repeat(source_info).take(CoroutineArgs::RESERVED_VARIANTS).collect();
1890 let proxy_layout = CoroutineLayout {
1891 field_tys: [].into(),
1892 field_names: [].into(),
1893 variant_fields,
1894 variant_source_info,
1895 storage_conflicts: BitMatrix::new(0, 0),
1896 };
1897 return Ok(self.arena.alloc(proxy_layout));
1898 } else {
1899 self.async_drop_coroutine_layout(def_id, args)
1900 }
1901 } else {
1902 self.ordinary_coroutine_layout(def_id, args)
1903 }
1904 }
1905
1906 pub fn assoc_parent(self, def_id: DefId) -> Option<(DefId, DefKind)> {
1908 if !self.def_kind(def_id).is_assoc() {
1909 return None;
1910 }
1911 let parent = self.parent(def_id);
1912 let def_kind = self.def_kind(parent);
1913 Some((parent, def_kind))
1914 }
1915
1916 pub fn trait_item_of(self, def_id: impl IntoQueryKey<DefId>) -> Option<DefId> {
1918 let def_id = def_id.into_query_key();
1919 self.opt_associated_item(def_id)?.trait_item_def_id()
1920 }
1921
1922 pub fn trait_of_assoc(self, def_id: DefId) -> Option<DefId> {
1925 match self.assoc_parent(def_id) {
1926 Some((id, DefKind::Trait)) => Some(id),
1927 _ => None,
1928 }
1929 }
1930
1931 pub fn impl_is_of_trait(self, def_id: impl IntoQueryKey<DefId>) -> bool {
1932 let def_id = def_id.into_query_key();
1933 let DefKind::Impl { of_trait } = self.def_kind(def_id) else {
1934 {
::core::panicking::panic_fmt(format_args!("expected Impl for {0:?}",
def_id));
};panic!("expected Impl for {def_id:?}");
1935 };
1936 of_trait
1937 }
1938
1939 pub fn impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
1942 match self.assoc_parent(def_id) {
1943 Some((id, DefKind::Impl { .. })) => Some(id),
1944 _ => None,
1945 }
1946 }
1947
1948 pub fn inherent_impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
1951 match self.assoc_parent(def_id) {
1952 Some((id, DefKind::Impl { of_trait: false })) => Some(id),
1953 _ => None,
1954 }
1955 }
1956
1957 pub fn trait_impl_of_assoc(self, def_id: DefId) -> Option<DefId> {
1960 match self.assoc_parent(def_id) {
1961 Some((id, DefKind::Impl { of_trait: true })) => Some(id),
1962 _ => None,
1963 }
1964 }
1965
1966 pub fn impl_polarity(self, def_id: impl IntoQueryKey<DefId>) -> ty::ImplPolarity {
1967 let def_id = def_id.into_query_key();
1968 self.impl_trait_header(def_id).polarity
1969 }
1970
1971 pub fn impl_trait_ref(
1973 self,
1974 def_id: impl IntoQueryKey<DefId>,
1975 ) -> ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>> {
1976 let def_id = def_id.into_query_key();
1977 self.impl_trait_header(def_id).trait_ref
1978 }
1979
1980 pub fn impl_opt_trait_ref(
1983 self,
1984 def_id: impl IntoQueryKey<DefId>,
1985 ) -> Option<ty::EarlyBinder<'tcx, ty::TraitRef<'tcx>>> {
1986 let def_id = def_id.into_query_key();
1987 self.impl_is_of_trait(def_id).then(|| self.impl_trait_ref(def_id))
1988 }
1989
1990 pub fn impl_trait_id(self, def_id: impl IntoQueryKey<DefId>) -> DefId {
1992 let def_id = def_id.into_query_key();
1993 self.impl_trait_ref(def_id).skip_binder().def_id
1994 }
1995
1996 pub fn impl_opt_trait_id(self, def_id: impl IntoQueryKey<DefId>) -> Option<DefId> {
1999 let def_id = def_id.into_query_key();
2000 self.impl_is_of_trait(def_id).then(|| self.impl_trait_id(def_id))
2001 }
2002
2003 pub fn is_exportable(self, def_id: DefId) -> bool {
2004 self.exportable_items(def_id.krate).contains(&def_id)
2005 }
2006
2007 pub fn is_builtin_derived(self, def_id: DefId) -> bool {
2010 if self.is_automatically_derived(def_id)
2011 && let Some(def_id) = def_id.as_local()
2012 && let outer = self.def_span(def_id).ctxt().outer_expn_data()
2013 && #[allow(non_exhaustive_omitted_patterns)] match outer.kind {
ExpnKind::Macro(MacroKind::Derive, _) => true,
_ => false,
}matches!(outer.kind, ExpnKind::Macro(MacroKind::Derive, _))
2014 && {
{
'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 { .. })
2015 {
2016 true
2017 } else {
2018 false
2019 }
2020 }
2021
2022 pub fn is_automatically_derived(self, def_id: DefId) -> bool {
2024 {
{
'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(..))
2025 }
2026
2027 pub fn span_of_impl(self, impl_def_id: DefId) -> Result<Span, Symbol> {
2030 if let Some(impl_def_id) = impl_def_id.as_local() {
2031 Ok(self.def_span(impl_def_id))
2032 } else {
2033 Err(self.crate_name(impl_def_id.krate))
2034 }
2035 }
2036
2037 pub fn hygienic_eq(self, use_ident: Ident, def_ident: Ident, def_parent_def_id: DefId) -> bool {
2041 use_ident.name == def_ident.name
2045 && use_ident
2046 .span
2047 .ctxt()
2048 .hygienic_eq(def_ident.span.ctxt(), self.expn_that_defined(def_parent_def_id))
2049 }
2050
2051 pub fn adjust_ident(self, mut ident: Ident, scope: DefId) -> Ident {
2052 ident.span.normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope));
2053 ident
2054 }
2055
2056 pub fn adjust_ident_and_get_scope(
2058 self,
2059 mut ident: Ident,
2060 scope: DefId,
2061 block: hir::HirId,
2062 ) -> (Ident, DefId) {
2063 let scope = ident
2064 .span
2065 .normalize_to_macros_2_0_and_adjust(self.expn_that_defined(scope))
2066 .and_then(|actual_expansion| actual_expansion.expn_data().parent_module)
2067 .unwrap_or_else(|| self.parent_module(block).to_def_id());
2068 (ident, scope)
2069 }
2070
2071 #[inline]
2075 pub fn is_const_fn(self, def_id: DefId) -> bool {
2076 #[allow(non_exhaustive_omitted_patterns)] match self.def_kind(def_id) {
DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(_, CtorKind::Fn) |
DefKind::Closure => true,
_ => false,
}matches!(
2077 self.def_kind(def_id),
2078 DefKind::Fn | DefKind::AssocFn | DefKind::Ctor(_, CtorKind::Fn) | DefKind::Closure
2079 ) && self.constness(def_id) == hir::Constness::Const
2080 }
2081
2082 pub fn is_conditionally_const(self, def_id: impl Into<DefId>) -> bool {
2089 let def_id: DefId = def_id.into();
2090 match self.def_kind(def_id) {
2091 DefKind::Impl { of_trait: true } => {
2092 let header = self.impl_trait_header(def_id);
2093 header.constness == hir::Constness::Const
2094 && self.is_const_trait(header.trait_ref.skip_binder().def_id)
2095 }
2096 DefKind::Impl { of_trait: false } => self.constness(def_id) == hir::Constness::Const,
2097 DefKind::Fn | DefKind::Ctor(_, CtorKind::Fn) => {
2098 self.constness(def_id) == hir::Constness::Const
2099 }
2100 DefKind::TraitAlias | DefKind::Trait => self.is_const_trait(def_id),
2101 DefKind::AssocTy => {
2102 let parent_def_id = self.parent(def_id);
2103 match self.def_kind(parent_def_id) {
2104 DefKind::Impl { of_trait: false } => false,
2105 DefKind::Impl { of_trait: true } | DefKind::Trait => {
2106 self.is_conditionally_const(parent_def_id)
2107 }
2108 _ => 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:?}"),
2109 }
2110 }
2111 DefKind::AssocFn => {
2112 let parent_def_id = self.parent(def_id);
2113 match self.def_kind(parent_def_id) {
2114 DefKind::Impl { of_trait: false } => {
2115 self.constness(def_id) == hir::Constness::Const
2116 }
2117 DefKind::Impl { of_trait: true } => {
2118 let Some(trait_method_did) = self.trait_item_of(def_id) else {
2119 return false;
2120 };
2121 self.constness(trait_method_did) == hir::Constness::Const
2122 && self.is_conditionally_const(parent_def_id)
2123 }
2124 DefKind::Trait => {
2125 self.constness(def_id) == hir::Constness::Const
2126 && self.is_conditionally_const(parent_def_id)
2127 }
2128 _ => 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:?}"),
2129 }
2130 }
2131 DefKind::OpaqueTy => match self.opaque_ty_origin(def_id) {
2132 hir::OpaqueTyOrigin::FnReturn { parent, .. } => self.is_conditionally_const(parent),
2133 hir::OpaqueTyOrigin::AsyncFn { .. } => false,
2134 hir::OpaqueTyOrigin::TyAlias { .. } => false,
2136 },
2137 DefKind::Closure => self.constness(def_id) == hir::Constness::Const,
2138 DefKind::Ctor(_, CtorKind::Const)
2139 | DefKind::Mod
2140 | DefKind::Struct
2141 | DefKind::Union
2142 | DefKind::Enum
2143 | DefKind::Variant
2144 | DefKind::TyAlias
2145 | DefKind::ForeignTy
2146 | DefKind::TyParam
2147 | DefKind::Const { .. }
2148 | DefKind::ConstParam
2149 | DefKind::Static { .. }
2150 | DefKind::AssocConst { .. }
2151 | DefKind::Macro(_)
2152 | DefKind::ExternCrate
2153 | DefKind::Use
2154 | DefKind::ForeignMod
2155 | DefKind::AnonConst
2156 | DefKind::InlineConst
2157 | DefKind::Field
2158 | DefKind::LifetimeParam
2159 | DefKind::GlobalAsm
2160 | DefKind::SyntheticCoroutineBody => false,
2161 }
2162 }
2163
2164 #[inline]
2165 pub fn is_const_trait(self, def_id: DefId) -> bool {
2166 self.trait_def(def_id).constness == hir::Constness::Const
2167 }
2168
2169 pub fn impl_method_has_trait_impl_trait_tys(self, def_id: DefId) -> bool {
2170 if self.def_kind(def_id) != DefKind::AssocFn {
2171 return false;
2172 }
2173
2174 let Some(item) = self.opt_associated_item(def_id) else {
2175 return false;
2176 };
2177
2178 let AssocContainer::TraitImpl(Ok(trait_item_def_id)) = item.container else {
2179 return false;
2180 };
2181
2182 !self.associated_types_for_impl_traits_in_associated_fn(trait_item_def_id).is_empty()
2183 }
2184
2185 #[inline]
2200 pub fn fn_abi_of_instance(
2201 self,
2202 query: ty::PseudoCanonicalInput<'tcx, (ty::Instance<'tcx>, &'tcx ty::List<Ty<'tcx>>)>,
2203 ) -> Result<&'tcx FnAbi<'tcx, Ty<'tcx>>, &'tcx FnAbiError<'tcx>> {
2204 if self.sess.opts.optimize != OptLevel::No && self.sess.opts.incremental.is_none() {
2207 self.fn_abi_of_instance_raw(query)
2208 } else {
2209 self.fn_abi_of_instance_no_deduced_attrs(query)
2210 }
2211 }
2212}
2213
2214impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for DefId {
2217 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2218 if let Some(did) = self.as_local() {
2219 tcx.hir_attrs(tcx.local_def_id_to_hir_id(did))
2220 } else {
2221 tcx.attrs_for_def(self)
2222 }
2223 }
2224}
2225
2226impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for LocalDefId {
2227 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2228 tcx.hir_attrs(tcx.local_def_id_to_hir_id(self))
2229 }
2230}
2231
2232impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for hir::OwnerId {
2233 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2234 hir::attrs::HasAttrs::get_attrs(self.def_id, tcx)
2235 }
2236}
2237
2238impl<'tcx> hir::attrs::HasAttrs<'tcx, TyCtxt<'tcx>> for hir::HirId {
2239 fn get_attrs(self, tcx: &TyCtxt<'tcx>) -> &'tcx [hir::Attribute] {
2240 tcx.hir_attrs(self)
2241 }
2242}
2243
2244pub fn provide(providers: &mut Providers) {
2245 closure::provide(providers);
2246 context::provide(providers);
2247 erase_regions::provide(providers);
2248 inhabitedness::provide(providers);
2249 util::provide(providers);
2250 print::provide(providers);
2251 super::util::bug::provide(providers);
2252 *providers = Providers {
2253 trait_impls_of: trait_def::trait_impls_of_provider,
2254 incoherent_impls: trait_def::incoherent_impls_provider,
2255 trait_impls_in_crate: trait_def::trait_impls_in_crate_provider,
2256 traits: trait_def::traits_provider,
2257 vtable_allocation: vtable::vtable_allocation_provider,
2258 ..*providers
2259 };
2260}
2261
2262#[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::HashStable for
CrateInherentImpls {
#[inline]
fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&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.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
2268pub struct CrateInherentImpls {
2269 pub inherent_impls: FxIndexMap<LocalDefId, Vec<DefId>>,
2270 pub incoherent_impls: FxIndexMap<SimplifiedType, Vec<LocalDefId>>,
2271}
2272
2273#[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::HashStable for
SymbolName<'tcx> {
#[inline]
fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
SymbolName { name: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
2274pub struct SymbolName<'tcx> {
2275 pub name: &'tcx str,
2277}
2278
2279impl<'tcx> SymbolName<'tcx> {
2280 pub fn new(tcx: TyCtxt<'tcx>, name: &str) -> SymbolName<'tcx> {
2281 SymbolName { name: tcx.arena.alloc_str(name) }
2282 }
2283}
2284
2285impl<'tcx> fmt::Display for SymbolName<'tcx> {
2286 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2287 fmt::Display::fmt(&self.name, fmt)
2288 }
2289}
2290
2291impl<'tcx> fmt::Debug for SymbolName<'tcx> {
2292 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2293 fmt::Display::fmt(&self.name, fmt)
2294 }
2295}
2296
2297#[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::HashStable for
DestructuredAdtConst<'tcx> {
#[inline]
fn hash_stable<__Hcx: ::rustc_data_structures::stable_hasher::HashStableContext>(&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.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
2299pub struct DestructuredAdtConst<'tcx> {
2300 pub variant: VariantIdx,
2301 pub fields: &'tcx [ty::Const<'tcx>],
2302}
2303
2304pub fn fnc_typetrees<'tcx>(tcx: TyCtxt<'tcx>, fn_ty: Ty<'tcx>) -> FncTree {
2308 if tcx.sess.opts.unstable_opts.autodiff.contains(&rustc_session::config::AutoDiff::NoTT) {
2310 return FncTree { args: ::alloc::vec::Vec::new()vec![], ret: TypeTree::new() };
2311 }
2312
2313 if !fn_ty.is_fn() {
2315 return FncTree { args: ::alloc::vec::Vec::new()vec![], ret: TypeTree::new() };
2316 }
2317
2318 let fn_sig = fn_ty.fn_sig(tcx);
2320 let sig = tcx.instantiate_bound_regions_with_erased(fn_sig);
2321
2322 let mut args = ::alloc::vec::Vec::new()vec![];
2324 for ty in sig.inputs().iter() {
2325 let type_tree = typetree_from_ty(tcx, *ty);
2326 args.push(type_tree);
2327 }
2328
2329 let ret = typetree_from_ty(tcx, sig.output());
2331
2332 FncTree { args, ret }
2333}
2334
2335pub fn typetree_from_ty<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> TypeTree {
2338 let mut visited = Vec::new();
2339 typetree_from_ty_inner(tcx, ty, 0, &mut visited)
2340}
2341
2342const MAX_TYPETREE_DEPTH: usize = 6;
2345
2346fn typetree_from_ty_inner<'tcx>(
2348 tcx: TyCtxt<'tcx>,
2349 ty: Ty<'tcx>,
2350 depth: usize,
2351 visited: &mut Vec<Ty<'tcx>>,
2352) -> TypeTree {
2353 if depth >= MAX_TYPETREE_DEPTH {
2354 {
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:2354",
"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(2354u32),
::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);
2355 return TypeTree::new();
2356 }
2357
2358 if visited.contains(&ty) {
2359 return TypeTree::new();
2360 }
2361
2362 visited.push(ty);
2363 let result = typetree_from_ty_impl(tcx, ty, depth, visited);
2364 visited.pop();
2365 result
2366}
2367
2368fn typetree_from_ty_impl<'tcx>(
2370 tcx: TyCtxt<'tcx>,
2371 ty: Ty<'tcx>,
2372 depth: usize,
2373 visited: &mut Vec<Ty<'tcx>>,
2374) -> TypeTree {
2375 typetree_from_ty_impl_inner(tcx, ty, depth, visited, false)
2376}
2377
2378fn typetree_from_ty_impl_inner<'tcx>(
2380 tcx: TyCtxt<'tcx>,
2381 ty: Ty<'tcx>,
2382 depth: usize,
2383 visited: &mut Vec<Ty<'tcx>>,
2384 is_reference_target: bool,
2385) -> TypeTree {
2386 if ty.is_scalar() {
2387 let (kind, size) = if ty.is_integral() || ty.is_char() || ty.is_bool() {
2388 (Kind::Integer, ty.primitive_size(tcx).bytes_usize())
2389 } else if ty.is_floating_point() {
2390 match ty {
2391 x if x == tcx.types.f16 => (Kind::Half, 2),
2392 x if x == tcx.types.f32 => (Kind::Float, 4),
2393 x if x == tcx.types.f64 => (Kind::Double, 8),
2394 x if x == tcx.types.f128 => (Kind::F128, 16),
2395 _ => (Kind::Integer, 0),
2396 }
2397 } else {
2398 (Kind::Integer, 0)
2399 };
2400
2401 let offset = if is_reference_target && !ty.is_array() { 0 } else { -1 };
2404 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() }]);
2405 }
2406
2407 if ty.is_ref() || ty.is_raw_ptr() || ty.is_box() {
2408 let Some(inner_ty) = ty.builtin_deref(true) else {
2409 return TypeTree::new();
2410 };
2411
2412 let child = typetree_from_ty_impl_inner(tcx, inner_ty, depth + 1, visited, true);
2413 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 {
2414 offset: -1,
2415 size: tcx.data_layout.pointer_size().bytes_usize(),
2416 kind: Kind::Pointer,
2417 child,
2418 }]);
2419 }
2420
2421 if ty.is_array() {
2422 if let ty::Array(element_ty, len_const) = ty.kind() {
2423 let len = len_const.try_to_target_usize(tcx).unwrap_or(0);
2424 if len == 0 {
2425 return TypeTree::new();
2426 }
2427 let element_tree =
2428 typetree_from_ty_impl_inner(tcx, *element_ty, depth + 1, visited, false);
2429 let mut types = Vec::new();
2430 for elem_type in &element_tree.0 {
2431 types.push(Type {
2432 offset: -1,
2433 size: elem_type.size,
2434 kind: elem_type.kind,
2435 child: elem_type.child.clone(),
2436 });
2437 }
2438
2439 return TypeTree(types);
2440 }
2441 }
2442
2443 if ty.is_slice() {
2444 if let ty::Slice(element_ty) = ty.kind() {
2445 let element_tree =
2446 typetree_from_ty_impl_inner(tcx, *element_ty, depth + 1, visited, false);
2447 return element_tree;
2448 }
2449 }
2450
2451 if let ty::Tuple(tuple_types) = ty.kind() {
2452 if tuple_types.is_empty() {
2453 return TypeTree::new();
2454 }
2455
2456 let mut types = Vec::new();
2457 let mut current_offset = 0;
2458
2459 for tuple_ty in tuple_types.iter() {
2460 let element_tree =
2461 typetree_from_ty_impl_inner(tcx, tuple_ty, depth + 1, visited, false);
2462
2463 let element_layout = tcx
2464 .layout_of(ty::TypingEnv::fully_monomorphized().as_query_input(tuple_ty))
2465 .ok()
2466 .map(|layout| layout.size.bytes_usize())
2467 .unwrap_or(0);
2468
2469 for elem_type in &element_tree.0 {
2470 types.push(Type {
2471 offset: if elem_type.offset == -1 {
2472 current_offset as isize
2473 } else {
2474 current_offset as isize + elem_type.offset
2475 },
2476 size: elem_type.size,
2477 kind: elem_type.kind,
2478 child: elem_type.child.clone(),
2479 });
2480 }
2481
2482 current_offset += element_layout;
2483 }
2484
2485 return TypeTree(types);
2486 }
2487
2488 if let ty::Adt(adt_def, args) = ty.kind() {
2489 if adt_def.is_struct() {
2490 let struct_layout =
2491 tcx.layout_of(ty::TypingEnv::fully_monomorphized().as_query_input(ty));
2492 if let Ok(layout) = struct_layout {
2493 let mut types = Vec::new();
2494
2495 for (field_idx, field_def) in adt_def.all_fields().enumerate() {
2496 let field_ty = field_def.ty(tcx, args);
2497 let field_tree =
2498 typetree_from_ty_impl_inner(tcx, field_ty, depth + 1, visited, false);
2499
2500 let field_offset = layout.fields.offset(field_idx).bytes_usize();
2501
2502 for elem_type in &field_tree.0 {
2503 types.push(Type {
2504 offset: if elem_type.offset == -1 {
2505 field_offset as isize
2506 } else {
2507 field_offset as isize + elem_type.offset
2508 },
2509 size: elem_type.size,
2510 kind: elem_type.kind,
2511 child: elem_type.child.clone(),
2512 });
2513 }
2514 }
2515
2516 return TypeTree(types);
2517 }
2518 }
2519 }
2520
2521 TypeTree::new()
2522}