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