1use std::borrow::Cow;
6use std::fmt::{self, Debug, Formatter};
7use std::iter;
8use std::ops::{Index, IndexMut};
9
10pub use basic_blocks::{BasicBlocks, SwitchTargetValue};
11use either::Either;
12use polonius_engine::Atom;
13use rustc_abi::{FieldIdx, VariantIdx};
14pub use rustc_ast::{Mutability, Pinnedness};
15use rustc_data_structures::fx::{FxHashMap, FxHashSet};
16use rustc_data_structures::graph::dominators::Dominators;
17use rustc_errors::ErrorGuaranteed;
18use rustc_hir::def::{CtorKind, Namespace};
19use rustc_hir::def_id::{CRATE_DEF_ID, DefId};
20use rustc_hir::{
21 self as hir, BindingMode, ByRef, CoroutineDesugaring, CoroutineKind, HirId, ImplicitSelfKind,
22};
23use rustc_index::bit_set::DenseBitSet;
24use rustc_index::{Idx, IndexSlice, IndexVec};
25use rustc_macros::{HashStable, TyDecodable, TyEncodable, TypeFoldable, TypeVisitable};
26use rustc_serialize::{Decodable, Encodable};
27use rustc_span::{DUMMY_SP, Span, Spanned, Symbol};
28use tracing::{debug, trace};
29
30pub use self::query::*;
31use crate::mir::interpret::{AllocRange, Scalar};
32use crate::ty::codec::{TyDecoder, TyEncoder};
33use crate::ty::print::{FmtPrinter, Printer, pretty_print_const, with_no_trimmed_paths};
34use crate::ty::{
35 self, GenericArg, GenericArgsRef, Instance, InstanceKind, List, Ty, TyCtxt, TypeVisitableExt,
36 TypingEnv, UserTypeAnnotationIndex,
37};
38
39mod basic_blocks;
40mod consts;
41pub mod coverage;
42mod generic_graph;
43pub mod generic_graphviz;
44pub mod graphviz;
45pub mod interpret;
46pub mod pretty;
47mod query;
48mod statement;
49mod syntax;
50mod terminator;
51pub mod traversal;
52pub mod visit;
53
54pub use consts::*;
55use pretty::pretty_print_const_value;
56pub use statement::*;
57pub use syntax::*;
58pub use terminator::*;
59
60pub use self::generic_graph::graphviz_safe_def_name;
61pub use self::graphviz::write_mir_graphviz;
62pub use self::pretty::{MirDumper, PassWhere, display_allocation, write_mir_pretty};
63
64pub type LocalDecls<'tcx> = IndexSlice<Local, LocalDecl<'tcx>>;
66
67pub trait HasLocalDecls<'tcx> {
68 fn local_decls(&self) -> &LocalDecls<'tcx>;
69}
70
71impl<'tcx> HasLocalDecls<'tcx> for IndexVec<Local, LocalDecl<'tcx>> {
72 #[inline]
73 fn local_decls(&self) -> &LocalDecls<'tcx> {
74 self
75 }
76}
77
78impl<'tcx> HasLocalDecls<'tcx> for LocalDecls<'tcx> {
79 #[inline]
80 fn local_decls(&self) -> &LocalDecls<'tcx> {
81 self
82 }
83}
84
85impl<'tcx> HasLocalDecls<'tcx> for Body<'tcx> {
86 #[inline]
87 fn local_decls(&self) -> &LocalDecls<'tcx> {
88 &self.local_decls
89 }
90}
91
92impl MirPhase {
93 pub fn name(&self) -> &'static str {
94 match *self {
95 MirPhase::Built => "built",
96 MirPhase::Analysis(AnalysisPhase::Initial) => "analysis",
97 MirPhase::Analysis(AnalysisPhase::PostCleanup) => "analysis-post-cleanup",
98 MirPhase::Runtime(RuntimePhase::Initial) => "runtime",
99 MirPhase::Runtime(RuntimePhase::PostCleanup) => "runtime-post-cleanup",
100 MirPhase::Runtime(RuntimePhase::Optimized) => "runtime-optimized",
101 }
102 }
103
104 pub fn index(&self) -> (usize, usize) {
107 match *self {
108 MirPhase::Built => (1, 1),
109 MirPhase::Analysis(analysis_phase) => (2, 1 + analysis_phase as usize),
110 MirPhase::Runtime(runtime_phase) => (3, 1 + runtime_phase as usize),
111 }
112 }
113}
114
115#[derive(#[automatically_derived]
impl<'tcx> ::core::marker::Copy for MirSource<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for MirSource<'tcx> {
#[inline]
fn clone(&self) -> MirSource<'tcx> {
let _: ::core::clone::AssertParamIsClone<InstanceKind<'tcx>>;
let _: ::core::clone::AssertParamIsClone<Option<Promoted>>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for MirSource<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "MirSource",
"instance", &self.instance, "promoted", &&self.promoted)
}
}Debug, #[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for MirSource<'tcx> {
#[inline]
fn eq(&self, other: &MirSource<'tcx>) -> bool {
self.instance == other.instance && self.promoted == other.promoted
}
}PartialEq, #[automatically_derived]
impl<'tcx> ::core::cmp::Eq for MirSource<'tcx> {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<InstanceKind<'tcx>>;
let _: ::core::cmp::AssertParamIsEq<Option<Promoted>>;
}
}Eq)]
117#[derive(const _: () =
{
impl<'tcx, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for MirSource<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
MirSource {
instance: ref __binding_0, promoted: 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 MirSource<'tcx> {
fn encode(&self, __encoder: &mut __E) {
match *self {
MirSource {
instance: ref __binding_0, promoted: 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 MirSource<'tcx> {
fn decode(__decoder: &mut __D) -> Self {
MirSource {
instance: ::rustc_serialize::Decodable::decode(__decoder),
promoted: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for MirSource<'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 {
MirSource { instance: __binding_0, promoted: __binding_1 }
=> {
MirSource {
instance: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
promoted: ::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 {
MirSource { instance: __binding_0, promoted: __binding_1 }
=> {
MirSource {
instance: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder),
promoted: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
__folder),
}
}
}
}
}
};TypeFoldable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for MirSource<'tcx> {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
MirSource {
instance: ref __binding_0, promoted: 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)]
118pub struct MirSource<'tcx> {
119 pub instance: InstanceKind<'tcx>,
120
121 pub promoted: Option<Promoted>,
123}
124
125impl<'tcx> MirSource<'tcx> {
126 pub fn item(def_id: DefId) -> Self {
127 MirSource { instance: InstanceKind::Item(def_id), promoted: None }
128 }
129
130 pub fn from_instance(instance: InstanceKind<'tcx>) -> Self {
131 MirSource { instance, promoted: None }
132 }
133
134 #[inline]
135 pub fn def_id(&self) -> DefId {
136 self.instance.def_id()
137 }
138}
139
140#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for CoroutineInfo<'tcx> {
#[inline]
fn clone(&self) -> CoroutineInfo<'tcx> {
CoroutineInfo {
yield_ty: ::core::clone::Clone::clone(&self.yield_ty),
resume_ty: ::core::clone::Clone::clone(&self.resume_ty),
coroutine_drop: ::core::clone::Clone::clone(&self.coroutine_drop),
coroutine_drop_async: ::core::clone::Clone::clone(&self.coroutine_drop_async),
coroutine_drop_proxy_async: ::core::clone::Clone::clone(&self.coroutine_drop_proxy_async),
coroutine_layout: ::core::clone::Clone::clone(&self.coroutine_layout),
coroutine_kind: ::core::clone::Clone::clone(&self.coroutine_kind),
}
}
}Clone, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for CoroutineInfo<'tcx> {
fn encode(&self, __encoder: &mut __E) {
match *self {
CoroutineInfo {
yield_ty: ref __binding_0,
resume_ty: ref __binding_1,
coroutine_drop: ref __binding_2,
coroutine_drop_async: ref __binding_3,
coroutine_drop_proxy_async: ref __binding_4,
coroutine_layout: ref __binding_5,
coroutine_kind: 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 CoroutineInfo<'tcx> {
fn decode(__decoder: &mut __D) -> Self {
CoroutineInfo {
yield_ty: ::rustc_serialize::Decodable::decode(__decoder),
resume_ty: ::rustc_serialize::Decodable::decode(__decoder),
coroutine_drop: ::rustc_serialize::Decodable::decode(__decoder),
coroutine_drop_async: ::rustc_serialize::Decodable::decode(__decoder),
coroutine_drop_proxy_async: ::rustc_serialize::Decodable::decode(__decoder),
coroutine_layout: ::rustc_serialize::Decodable::decode(__decoder),
coroutine_kind: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for CoroutineInfo<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["yield_ty", "resume_ty", "coroutine_drop",
"coroutine_drop_async", "coroutine_drop_proxy_async",
"coroutine_layout", "coroutine_kind"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.yield_ty, &self.resume_ty, &self.coroutine_drop,
&self.coroutine_drop_async,
&self.coroutine_drop_proxy_async, &self.coroutine_layout,
&&self.coroutine_kind];
::core::fmt::Formatter::debug_struct_fields_finish(f, "CoroutineInfo",
names, values)
}
}Debug, const _: () =
{
impl<'tcx, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for CoroutineInfo<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
CoroutineInfo {
yield_ty: ref __binding_0,
resume_ty: ref __binding_1,
coroutine_drop: ref __binding_2,
coroutine_drop_async: ref __binding_3,
coroutine_drop_proxy_async: ref __binding_4,
coroutine_layout: ref __binding_5,
coroutine_kind: 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>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for CoroutineInfo<'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 {
CoroutineInfo {
yield_ty: __binding_0,
resume_ty: __binding_1,
coroutine_drop: __binding_2,
coroutine_drop_async: __binding_3,
coroutine_drop_proxy_async: __binding_4,
coroutine_layout: __binding_5,
coroutine_kind: __binding_6 } => {
CoroutineInfo {
yield_ty: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
resume_ty: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
coroutine_drop: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_2,
__folder)?,
coroutine_drop_async: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_3,
__folder)?,
coroutine_drop_proxy_async: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_4,
__folder)?,
coroutine_layout: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_5,
__folder)?,
coroutine_kind: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_6,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Self {
match self {
CoroutineInfo {
yield_ty: __binding_0,
resume_ty: __binding_1,
coroutine_drop: __binding_2,
coroutine_drop_async: __binding_3,
coroutine_drop_proxy_async: __binding_4,
coroutine_layout: __binding_5,
coroutine_kind: __binding_6 } => {
CoroutineInfo {
yield_ty: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder),
resume_ty: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
__folder),
coroutine_drop: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_2,
__folder),
coroutine_drop_async: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_3,
__folder),
coroutine_drop_proxy_async: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_4,
__folder),
coroutine_layout: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_5,
__folder),
coroutine_kind: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_6,
__folder),
}
}
}
}
}
};TypeFoldable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for CoroutineInfo<'tcx> {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
CoroutineInfo {
yield_ty: ref __binding_0,
resume_ty: ref __binding_1,
coroutine_drop: ref __binding_2,
coroutine_drop_async: ref __binding_3,
coroutine_drop_proxy_async: ref __binding_4,
coroutine_layout: ref __binding_5,
coroutine_kind: ref __binding_6 } => {
{
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);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_2,
__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_3,
__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_4,
__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_5,
__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_6,
__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)]
146pub struct CoroutineInfo<'tcx> {
147 pub yield_ty: Option<Ty<'tcx>>,
149
150 pub resume_ty: Option<Ty<'tcx>>,
152
153 pub coroutine_drop: Option<Body<'tcx>>,
155
156 pub coroutine_drop_async: Option<Body<'tcx>>,
158
159 pub coroutine_drop_proxy_async: Option<Body<'tcx>>,
161
162 pub coroutine_layout: Option<CoroutineLayout<'tcx>>,
164
165 pub coroutine_kind: CoroutineKind,
168}
169
170impl<'tcx> CoroutineInfo<'tcx> {
171 pub fn initial(
173 coroutine_kind: CoroutineKind,
174 yield_ty: Ty<'tcx>,
175 resume_ty: Ty<'tcx>,
176 ) -> CoroutineInfo<'tcx> {
177 CoroutineInfo {
178 coroutine_kind,
179 yield_ty: Some(yield_ty),
180 resume_ty: Some(resume_ty),
181 coroutine_drop: None,
182 coroutine_drop_async: None,
183 coroutine_drop_proxy_async: None,
184 coroutine_layout: None,
185 }
186 }
187}
188
189#[derive(#[automatically_derived]
impl<'tcx> ::core::marker::Copy for MentionedItem<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for MentionedItem<'tcx> {
#[inline]
fn clone(&self) -> MentionedItem<'tcx> {
let _: ::core::clone::AssertParamIsClone<Ty<'tcx>>;
let _: ::core::clone::AssertParamIsClone<Ty<'tcx>>;
let _: ::core::clone::AssertParamIsClone<Ty<'tcx>>;
let _: ::core::clone::AssertParamIsClone<Ty<'tcx>>;
let _: ::core::clone::AssertParamIsClone<Ty<'tcx>>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for MentionedItem<'tcx> {
#[inline]
fn eq(&self, other: &MentionedItem<'tcx>) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(MentionedItem::Fn(__self_0), MentionedItem::Fn(__arg1_0)) =>
__self_0 == __arg1_0,
(MentionedItem::Drop(__self_0), MentionedItem::Drop(__arg1_0))
=> __self_0 == __arg1_0,
(MentionedItem::UnsizeCast {
source_ty: __self_0, target_ty: __self_1 },
MentionedItem::UnsizeCast {
source_ty: __arg1_0, target_ty: __arg1_1 }) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(MentionedItem::Closure(__self_0),
MentionedItem::Closure(__arg1_0)) => __self_0 == __arg1_0,
_ => unsafe { ::core::intrinsics::unreachable() }
}
}
}PartialEq, #[automatically_derived]
impl<'tcx> ::core::cmp::Eq for MentionedItem<'tcx> {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<Ty<'tcx>>;
let _: ::core::cmp::AssertParamIsEq<Ty<'tcx>>;
let _: ::core::cmp::AssertParamIsEq<Ty<'tcx>>;
let _: ::core::cmp::AssertParamIsEq<Ty<'tcx>>;
let _: ::core::cmp::AssertParamIsEq<Ty<'tcx>>;
}
}Eq, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for MentionedItem<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
MentionedItem::Fn(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Fn",
&__self_0),
MentionedItem::Drop(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Drop",
&__self_0),
MentionedItem::UnsizeCast {
source_ty: __self_0, target_ty: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"UnsizeCast", "source_ty", __self_0, "target_ty",
&__self_1),
MentionedItem::Closure(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Closure", &__self_0),
}
}
}Debug, #[automatically_derived]
impl<'tcx> ::core::hash::Hash for MentionedItem<'tcx> {
#[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 {
MentionedItem::Fn(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
MentionedItem::Drop(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
MentionedItem::UnsizeCast {
source_ty: __self_0, target_ty: __self_1 } => {
::core::hash::Hash::hash(__self_0, state);
::core::hash::Hash::hash(__self_1, state)
}
MentionedItem::Closure(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
}
}
}Hash, const _: () =
{
impl<'tcx, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for MentionedItem<'tcx> {
#[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 {
MentionedItem::Fn(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
MentionedItem::Drop(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
MentionedItem::UnsizeCast {
source_ty: ref __binding_0, target_ty: ref __binding_1 } =>
{
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
MentionedItem::Closure(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 MentionedItem<'tcx> {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
MentionedItem::Fn(ref __binding_0) => { 0usize }
MentionedItem::Drop(ref __binding_0) => { 1usize }
MentionedItem::UnsizeCast {
source_ty: ref __binding_0, target_ty: ref __binding_1 } =>
{
2usize
}
MentionedItem::Closure(ref __binding_0) => { 3usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
MentionedItem::Fn(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
MentionedItem::Drop(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
MentionedItem::UnsizeCast {
source_ty: ref __binding_0, target_ty: ref __binding_1 } =>
{
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
MentionedItem::Closure(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 MentionedItem<'tcx> {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
MentionedItem::Fn(::rustc_serialize::Decodable::decode(__decoder))
}
1usize => {
MentionedItem::Drop(::rustc_serialize::Decodable::decode(__decoder))
}
2usize => {
MentionedItem::UnsizeCast {
source_ty: ::rustc_serialize::Decodable::decode(__decoder),
target_ty: ::rustc_serialize::Decodable::decode(__decoder),
}
}
3usize => {
MentionedItem::Closure(::rustc_serialize::Decodable::decode(__decoder))
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `MentionedItem`, expected 0..4, actual {0}",
n));
}
}
}
}
};TyDecodable)]
191#[derive(const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for MentionedItem<'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 {
MentionedItem::Fn(__binding_0) => {
MentionedItem::Fn(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?)
}
MentionedItem::Drop(__binding_0) => {
MentionedItem::Drop(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?)
}
MentionedItem::UnsizeCast {
source_ty: __binding_0, target_ty: __binding_1 } => {
MentionedItem::UnsizeCast {
source_ty: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
target_ty: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
}
}
MentionedItem::Closure(__binding_0) => {
MentionedItem::Closure(::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 {
MentionedItem::Fn(__binding_0) => {
MentionedItem::Fn(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder))
}
MentionedItem::Drop(__binding_0) => {
MentionedItem::Drop(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder))
}
MentionedItem::UnsizeCast {
source_ty: __binding_0, target_ty: __binding_1 } => {
MentionedItem::UnsizeCast {
source_ty: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder),
target_ty: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
__folder),
}
}
MentionedItem::Closure(__binding_0) => {
MentionedItem::Closure(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder))
}
}
}
}
};TypeFoldable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for MentionedItem<'tcx> {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
MentionedItem::Fn(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);
}
}
}
}
MentionedItem::Drop(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);
}
}
}
}
MentionedItem::UnsizeCast {
source_ty: ref __binding_0, target_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);
}
}
}
}
MentionedItem::Closure(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)]
192pub enum MentionedItem<'tcx> {
193 Fn(Ty<'tcx>),
196 Drop(Ty<'tcx>),
198 UnsizeCast { source_ty: Ty<'tcx>, target_ty: Ty<'tcx> },
200 Closure(Ty<'tcx>),
202}
203
204#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for Body<'tcx> {
#[inline]
fn clone(&self) -> Body<'tcx> {
Body {
basic_blocks: ::core::clone::Clone::clone(&self.basic_blocks),
phase: ::core::clone::Clone::clone(&self.phase),
pass_count: ::core::clone::Clone::clone(&self.pass_count),
source: ::core::clone::Clone::clone(&self.source),
source_scopes: ::core::clone::Clone::clone(&self.source_scopes),
coroutine: ::core::clone::Clone::clone(&self.coroutine),
local_decls: ::core::clone::Clone::clone(&self.local_decls),
user_type_annotations: ::core::clone::Clone::clone(&self.user_type_annotations),
arg_count: ::core::clone::Clone::clone(&self.arg_count),
spread_arg: ::core::clone::Clone::clone(&self.spread_arg),
var_debug_info: ::core::clone::Clone::clone(&self.var_debug_info),
span: ::core::clone::Clone::clone(&self.span),
required_consts: ::core::clone::Clone::clone(&self.required_consts),
mentioned_items: ::core::clone::Clone::clone(&self.mentioned_items),
is_polymorphic: ::core::clone::Clone::clone(&self.is_polymorphic),
injection_phase: ::core::clone::Clone::clone(&self.injection_phase),
tainted_by_errors: ::core::clone::Clone::clone(&self.tainted_by_errors),
coverage_info_hi: ::core::clone::Clone::clone(&self.coverage_info_hi),
function_coverage_info: ::core::clone::Clone::clone(&self.function_coverage_info),
}
}
}Clone, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for Body<'tcx> {
fn encode(&self, __encoder: &mut __E) {
match *self {
Body {
basic_blocks: ref __binding_0,
phase: ref __binding_1,
pass_count: ref __binding_2,
source: ref __binding_3,
source_scopes: ref __binding_4,
coroutine: ref __binding_5,
local_decls: ref __binding_6,
user_type_annotations: ref __binding_7,
arg_count: ref __binding_8,
spread_arg: ref __binding_9,
var_debug_info: ref __binding_10,
span: ref __binding_11,
required_consts: ref __binding_12,
mentioned_items: ref __binding_13,
is_polymorphic: ref __binding_14,
injection_phase: ref __binding_15,
tainted_by_errors: ref __binding_16,
coverage_info_hi: ref __binding_17,
function_coverage_info: ref __binding_18 } => {
::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);
::rustc_serialize::Encodable::<__E>::encode(__binding_7,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_8,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_9,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_10,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_11,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_12,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_13,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_14,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_15,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_16,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_17,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_18,
__encoder);
}
}
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for Body<'tcx> {
fn decode(__decoder: &mut __D) -> Self {
Body {
basic_blocks: ::rustc_serialize::Decodable::decode(__decoder),
phase: ::rustc_serialize::Decodable::decode(__decoder),
pass_count: ::rustc_serialize::Decodable::decode(__decoder),
source: ::rustc_serialize::Decodable::decode(__decoder),
source_scopes: ::rustc_serialize::Decodable::decode(__decoder),
coroutine: ::rustc_serialize::Decodable::decode(__decoder),
local_decls: ::rustc_serialize::Decodable::decode(__decoder),
user_type_annotations: ::rustc_serialize::Decodable::decode(__decoder),
arg_count: ::rustc_serialize::Decodable::decode(__decoder),
spread_arg: ::rustc_serialize::Decodable::decode(__decoder),
var_debug_info: ::rustc_serialize::Decodable::decode(__decoder),
span: ::rustc_serialize::Decodable::decode(__decoder),
required_consts: ::rustc_serialize::Decodable::decode(__decoder),
mentioned_items: ::rustc_serialize::Decodable::decode(__decoder),
is_polymorphic: ::rustc_serialize::Decodable::decode(__decoder),
injection_phase: ::rustc_serialize::Decodable::decode(__decoder),
tainted_by_errors: ::rustc_serialize::Decodable::decode(__decoder),
coverage_info_hi: ::rustc_serialize::Decodable::decode(__decoder),
function_coverage_info: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for Body<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["basic_blocks", "phase", "pass_count", "source",
"source_scopes", "coroutine", "local_decls",
"user_type_annotations", "arg_count", "spread_arg",
"var_debug_info", "span", "required_consts",
"mentioned_items", "is_polymorphic", "injection_phase",
"tainted_by_errors", "coverage_info_hi",
"function_coverage_info"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.basic_blocks, &self.phase, &self.pass_count, &self.source,
&self.source_scopes, &self.coroutine, &self.local_decls,
&self.user_type_annotations, &self.arg_count,
&self.spread_arg, &self.var_debug_info, &self.span,
&self.required_consts, &self.mentioned_items,
&self.is_polymorphic, &self.injection_phase,
&self.tainted_by_errors, &self.coverage_info_hi,
&&self.function_coverage_info];
::core::fmt::Formatter::debug_struct_fields_finish(f, "Body", names,
values)
}
}Debug, const _: () =
{
impl<'tcx, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for Body<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
Body {
basic_blocks: ref __binding_0,
phase: ref __binding_1,
pass_count: ref __binding_2,
source: ref __binding_3,
source_scopes: ref __binding_4,
coroutine: ref __binding_5,
local_decls: ref __binding_6,
user_type_annotations: ref __binding_7,
arg_count: ref __binding_8,
spread_arg: ref __binding_9,
var_debug_info: ref __binding_10,
span: ref __binding_11,
required_consts: ref __binding_12,
mentioned_items: ref __binding_13,
is_polymorphic: ref __binding_14,
injection_phase: ref __binding_15,
tainted_by_errors: ref __binding_16,
coverage_info_hi: ref __binding_17,
function_coverage_info: ref __binding_18 } => {
{ __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); }
{ __binding_16.hash_stable(__hcx, __hasher); }
{ __binding_17.hash_stable(__hcx, __hasher); }
{ __binding_18.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for Body<'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 {
Body {
basic_blocks: __binding_0,
phase: __binding_1,
pass_count: __binding_2,
source: __binding_3,
source_scopes: __binding_4,
coroutine: __binding_5,
local_decls: __binding_6,
user_type_annotations: __binding_7,
arg_count: __binding_8,
spread_arg: __binding_9,
var_debug_info: __binding_10,
span: __binding_11,
required_consts: __binding_12,
mentioned_items: __binding_13,
is_polymorphic: __binding_14,
injection_phase: __binding_15,
tainted_by_errors: __binding_16,
coverage_info_hi: __binding_17,
function_coverage_info: __binding_18 } => {
Body {
basic_blocks: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
phase: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
pass_count: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_2,
__folder)?,
source: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_3,
__folder)?,
source_scopes: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_4,
__folder)?,
coroutine: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_5,
__folder)?,
local_decls: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_6,
__folder)?,
user_type_annotations: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_7,
__folder)?,
arg_count: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_8,
__folder)?,
spread_arg: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_9,
__folder)?,
var_debug_info: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_10,
__folder)?,
span: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_11,
__folder)?,
required_consts: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_12,
__folder)?,
mentioned_items: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_13,
__folder)?,
is_polymorphic: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_14,
__folder)?,
injection_phase: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_15,
__folder)?,
tainted_by_errors: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_16,
__folder)?,
coverage_info_hi: __binding_17,
function_coverage_info: __binding_18,
}
}
})
}
fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Self {
match self {
Body {
basic_blocks: __binding_0,
phase: __binding_1,
pass_count: __binding_2,
source: __binding_3,
source_scopes: __binding_4,
coroutine: __binding_5,
local_decls: __binding_6,
user_type_annotations: __binding_7,
arg_count: __binding_8,
spread_arg: __binding_9,
var_debug_info: __binding_10,
span: __binding_11,
required_consts: __binding_12,
mentioned_items: __binding_13,
is_polymorphic: __binding_14,
injection_phase: __binding_15,
tainted_by_errors: __binding_16,
coverage_info_hi: __binding_17,
function_coverage_info: __binding_18 } => {
Body {
basic_blocks: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder),
phase: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
__folder),
pass_count: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_2,
__folder),
source: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_3,
__folder),
source_scopes: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_4,
__folder),
coroutine: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_5,
__folder),
local_decls: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_6,
__folder),
user_type_annotations: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_7,
__folder),
arg_count: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_8,
__folder),
spread_arg: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_9,
__folder),
var_debug_info: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_10,
__folder),
span: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_11,
__folder),
required_consts: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_12,
__folder),
mentioned_items: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_13,
__folder),
is_polymorphic: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_14,
__folder),
injection_phase: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_15,
__folder),
tainted_by_errors: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_16,
__folder),
coverage_info_hi: __binding_17,
function_coverage_info: __binding_18,
}
}
}
}
}
};TypeFoldable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for Body<'tcx> {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
Body {
basic_blocks: ref __binding_0,
phase: ref __binding_1,
pass_count: ref __binding_2,
source: ref __binding_3,
source_scopes: ref __binding_4,
coroutine: ref __binding_5,
local_decls: ref __binding_6,
user_type_annotations: ref __binding_7,
arg_count: ref __binding_8,
spread_arg: ref __binding_9,
var_debug_info: ref __binding_10,
span: ref __binding_11,
required_consts: ref __binding_12,
mentioned_items: ref __binding_13,
is_polymorphic: ref __binding_14,
injection_phase: ref __binding_15,
tainted_by_errors: ref __binding_16, .. } => {
{
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);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_2,
__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_3,
__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_4,
__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_5,
__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_6,
__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_7,
__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_8,
__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_9,
__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_10,
__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_11,
__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_12,
__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_13,
__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_14,
__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_15,
__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_16,
__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)]
206pub struct Body<'tcx> {
207 pub basic_blocks: BasicBlocks<'tcx>,
210
211 pub phase: MirPhase,
217
218 pub pass_count: usize,
220
221 pub source: MirSource<'tcx>,
222
223 pub source_scopes: IndexVec<SourceScope, SourceScopeData<'tcx>>,
226
227 pub coroutine: Option<Box<CoroutineInfo<'tcx>>>,
234
235 pub local_decls: IndexVec<Local, LocalDecl<'tcx>>,
241
242 pub user_type_annotations: ty::CanonicalUserTypeAnnotations<'tcx>,
244
245 pub arg_count: usize,
252
253 pub spread_arg: Option<Local>,
258
259 pub var_debug_info: Vec<VarDebugInfo<'tcx>>,
261
262 pub span: Span,
264
265 pub required_consts: Option<Vec<ConstOperand<'tcx>>>,
272
273 pub mentioned_items: Option<Vec<Spanned<MentionedItem<'tcx>>>>,
286
287 pub is_polymorphic: bool,
303
304 pub injection_phase: Option<MirPhase>,
310
311 pub tainted_by_errors: Option<ErrorGuaranteed>,
312
313 #[type_foldable(identity)]
319 #[type_visitable(ignore)]
320 pub coverage_info_hi: Option<Box<coverage::CoverageInfoHi>>,
321
322 #[type_foldable(identity)]
329 #[type_visitable(ignore)]
330 pub function_coverage_info: Option<Box<coverage::FunctionCoverageInfo>>,
331}
332
333impl<'tcx> Body<'tcx> {
334 pub fn new(
335 source: MirSource<'tcx>,
336 basic_blocks: IndexVec<BasicBlock, BasicBlockData<'tcx>>,
337 source_scopes: IndexVec<SourceScope, SourceScopeData<'tcx>>,
338 local_decls: IndexVec<Local, LocalDecl<'tcx>>,
339 user_type_annotations: ty::CanonicalUserTypeAnnotations<'tcx>,
340 arg_count: usize,
341 var_debug_info: Vec<VarDebugInfo<'tcx>>,
342 span: Span,
343 coroutine: Option<Box<CoroutineInfo<'tcx>>>,
344 tainted_by_errors: Option<ErrorGuaranteed>,
345 ) -> Self {
346 if !(local_decls.len() > arg_count) {
{
::core::panicking::panic_fmt(format_args!("expected at least {0} locals, got {1}",
arg_count + 1, local_decls.len()));
}
};assert!(
348 local_decls.len() > arg_count,
349 "expected at least {} locals, got {}",
350 arg_count + 1,
351 local_decls.len()
352 );
353
354 let mut body = Body {
355 phase: MirPhase::Built,
356 pass_count: 0,
357 source,
358 basic_blocks: BasicBlocks::new(basic_blocks),
359 source_scopes,
360 coroutine,
361 local_decls,
362 user_type_annotations,
363 arg_count,
364 spread_arg: None,
365 var_debug_info,
366 span,
367 required_consts: None,
368 mentioned_items: None,
369 is_polymorphic: false,
370 injection_phase: None,
371 tainted_by_errors,
372 coverage_info_hi: None,
373 function_coverage_info: None,
374 };
375 body.is_polymorphic = body.has_non_region_param();
376 body
377 }
378
379 pub fn new_cfg_only(basic_blocks: IndexVec<BasicBlock, BasicBlockData<'tcx>>) -> Self {
385 let mut body = Body {
386 phase: MirPhase::Built,
387 pass_count: 0,
388 source: MirSource::item(CRATE_DEF_ID.to_def_id()),
389 basic_blocks: BasicBlocks::new(basic_blocks),
390 source_scopes: IndexVec::new(),
391 coroutine: None,
392 local_decls: IndexVec::new(),
393 user_type_annotations: IndexVec::new(),
394 arg_count: 0,
395 spread_arg: None,
396 span: DUMMY_SP,
397 required_consts: None,
398 mentioned_items: None,
399 var_debug_info: Vec::new(),
400 is_polymorphic: false,
401 injection_phase: None,
402 tainted_by_errors: None,
403 coverage_info_hi: None,
404 function_coverage_info: None,
405 };
406 body.is_polymorphic = body.has_non_region_param();
407 body
408 }
409
410 #[inline]
411 pub fn basic_blocks_mut(&mut self) -> &mut IndexVec<BasicBlock, BasicBlockData<'tcx>> {
412 self.basic_blocks.as_mut()
413 }
414
415 pub fn typing_env(&self, tcx: TyCtxt<'tcx>) -> TypingEnv<'tcx> {
416 match self.phase {
417 MirPhase::Built | MirPhase::Analysis(_) => TypingEnv::new(
419 tcx.param_env(self.source.def_id()),
420 ty::TypingMode::non_body_analysis(),
421 ),
422 MirPhase::Runtime(_) => TypingEnv::post_analysis(tcx, self.source.def_id()),
423 }
424 }
425
426 #[inline]
427 pub fn local_kind(&self, local: Local) -> LocalKind {
428 let index = local.as_usize();
429 if index == 0 {
430 if true {
if !(self.local_decls[local].mutability == Mutability::Mut) {
{
::core::panicking::panic_fmt(format_args!("return place should be mutable"));
}
};
};debug_assert!(
431 self.local_decls[local].mutability == Mutability::Mut,
432 "return place should be mutable"
433 );
434
435 LocalKind::ReturnPointer
436 } else if index < self.arg_count + 1 {
437 LocalKind::Arg
438 } else {
439 LocalKind::Temp
440 }
441 }
442
443 #[inline]
445 pub fn mut_vars_iter(&self) -> impl Iterator<Item = Local> {
446 (self.arg_count + 1..self.local_decls.len()).filter_map(move |index| {
447 let local = Local::new(index);
448 let decl = &self.local_decls[local];
449 (decl.is_user_variable() && decl.mutability.is_mut()).then_some(local)
450 })
451 }
452
453 #[inline]
455 pub fn mut_vars_and_args_iter(&self) -> impl Iterator<Item = Local> {
456 (1..self.local_decls.len()).filter_map(move |index| {
457 let local = Local::new(index);
458 let decl = &self.local_decls[local];
459 if (decl.is_user_variable() || index < self.arg_count + 1)
460 && decl.mutability == Mutability::Mut
461 {
462 Some(local)
463 } else {
464 None
465 }
466 })
467 }
468
469 #[inline]
471 pub fn args_iter(&self) -> impl Iterator<Item = Local> + ExactSizeIterator + use<> {
472 (1..self.arg_count + 1).map(Local::new)
473 }
474
475 #[inline]
478 pub fn vars_and_temps_iter(
479 &self,
480 ) -> impl DoubleEndedIterator<Item = Local> + ExactSizeIterator {
481 (self.arg_count + 1..self.local_decls.len()).map(Local::new)
482 }
483
484 #[inline]
485 pub fn drain_vars_and_temps(&mut self) -> impl Iterator<Item = LocalDecl<'tcx>> {
486 self.local_decls.drain(self.arg_count + 1..)
487 }
488
489 pub fn source_info(&self, location: Location) -> &SourceInfo {
491 let block = &self[location.block];
492 let stmts = &block.statements;
493 let idx = location.statement_index;
494 if idx < stmts.len() {
495 &stmts[idx].source_info
496 } else {
497 match (&idx, &stmts.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);
}
}
};assert_eq!(idx, stmts.len());
498 &block.terminator().source_info
499 }
500 }
501
502 #[inline]
504 pub fn return_ty(&self) -> Ty<'tcx> {
505 self.local_decls[RETURN_PLACE].ty
506 }
507
508 #[inline]
510 pub fn bound_return_ty(&self) -> ty::EarlyBinder<'tcx, Ty<'tcx>> {
511 ty::EarlyBinder::bind(self.local_decls[RETURN_PLACE].ty)
512 }
513
514 #[inline]
516 pub fn terminator_loc(&self, bb: BasicBlock) -> Location {
517 Location { block: bb, statement_index: self[bb].statements.len() }
518 }
519
520 pub fn stmt_at(&self, location: Location) -> Either<&Statement<'tcx>, &Terminator<'tcx>> {
521 let Location { block, statement_index } = location;
522 let block_data = &self.basic_blocks[block];
523 block_data
524 .statements
525 .get(statement_index)
526 .map(Either::Left)
527 .unwrap_or_else(|| Either::Right(block_data.terminator()))
528 }
529
530 #[inline]
531 pub fn yield_ty(&self) -> Option<Ty<'tcx>> {
532 self.coroutine.as_ref().and_then(|coroutine| coroutine.yield_ty)
533 }
534
535 #[inline]
536 pub fn resume_ty(&self) -> Option<Ty<'tcx>> {
537 self.coroutine.as_ref().and_then(|coroutine| coroutine.resume_ty)
538 }
539
540 #[inline]
542 pub fn coroutine_layout_raw(&self) -> Option<&CoroutineLayout<'tcx>> {
543 self.coroutine.as_ref().and_then(|coroutine| coroutine.coroutine_layout.as_ref())
544 }
545
546 #[inline]
547 pub fn coroutine_drop(&self) -> Option<&Body<'tcx>> {
548 self.coroutine.as_ref().and_then(|coroutine| coroutine.coroutine_drop.as_ref())
549 }
550
551 #[inline]
552 pub fn coroutine_drop_async(&self) -> Option<&Body<'tcx>> {
553 self.coroutine.as_ref().and_then(|coroutine| coroutine.coroutine_drop_async.as_ref())
554 }
555
556 #[inline]
557 pub fn coroutine_requires_async_drop(&self) -> bool {
558 self.coroutine_drop_async().is_some()
559 }
560
561 #[inline]
562 pub fn future_drop_poll(&self) -> Option<&Body<'tcx>> {
563 self.coroutine.as_ref().and_then(|coroutine| {
564 coroutine
565 .coroutine_drop_async
566 .as_ref()
567 .or(coroutine.coroutine_drop_proxy_async.as_ref())
568 })
569 }
570
571 #[inline]
572 pub fn coroutine_kind(&self) -> Option<CoroutineKind> {
573 self.coroutine.as_ref().map(|coroutine| coroutine.coroutine_kind)
574 }
575
576 #[inline]
577 pub fn should_skip(&self) -> bool {
578 let Some(injection_phase) = self.injection_phase else {
579 return false;
580 };
581 injection_phase > self.phase
582 }
583
584 #[inline]
585 pub fn is_custom_mir(&self) -> bool {
586 self.injection_phase.is_some()
587 }
588
589 fn try_const_mono_switchint<'a>(
593 tcx: TyCtxt<'tcx>,
594 instance: Instance<'tcx>,
595 block: &'a BasicBlockData<'tcx>,
596 ) -> Option<(u128, &'a SwitchTargets)> {
597 let eval_mono_const = |constant: &ConstOperand<'tcx>| {
599 let typing_env = ty::TypingEnv::fully_monomorphized();
601 let mono_literal = instance.instantiate_mir_and_normalize_erasing_regions(
602 tcx,
603 typing_env,
604 crate::ty::EarlyBinder::bind(constant.const_),
605 );
606 mono_literal.try_eval_bits(tcx, typing_env)
607 };
608
609 let TerminatorKind::SwitchInt { discr, targets } = &block.terminator().kind else {
610 return None;
611 };
612
613 let discr = match discr {
615 Operand::Constant(constant) => {
616 let bits = eval_mono_const(constant)?;
617 return Some((bits, targets));
618 }
619 Operand::RuntimeChecks(check) => {
620 let bits = check.value(tcx.sess) as u128;
621 return Some((bits, targets));
622 }
623 Operand::Move(place) | Operand::Copy(place) => place,
624 };
625
626 let last_stmt = block.statements.iter().rev().find(|stmt| {
642 !#[allow(non_exhaustive_omitted_patterns)] match stmt.kind {
StatementKind::StorageDead(_) | StatementKind::StorageLive(_) => true,
_ => false,
}matches!(stmt.kind, StatementKind::StorageDead(_) | StatementKind::StorageLive(_))
643 })?;
644
645 let (place, rvalue) = last_stmt.kind.as_assign()?;
646
647 if discr != place {
648 return None;
649 }
650
651 match rvalue {
652 Rvalue::Use(Operand::Constant(constant)) => {
653 let bits = eval_mono_const(constant)?;
654 Some((bits, targets))
655 }
656 _ => None,
657 }
658 }
659
660 pub fn caller_location_span<T>(
665 &self,
666 mut source_info: SourceInfo,
667 caller_location: Option<T>,
668 tcx: TyCtxt<'tcx>,
669 from_span: impl FnOnce(Span) -> T,
670 ) -> T {
671 loop {
672 let scope_data = &self.source_scopes[source_info.scope];
673
674 if let Some((callee, callsite_span)) = scope_data.inlined {
675 if !callee.def.requires_caller_location(tcx) {
678 return from_span(source_info.span);
679 }
680 source_info.span = callsite_span;
681 }
682
683 match scope_data.inlined_parent_scope {
685 Some(parent) => source_info.scope = parent,
686 None => break,
687 }
688 }
689
690 caller_location.unwrap_or_else(|| from_span(source_info.span))
692 }
693
694 #[track_caller]
695 pub fn set_required_consts(&mut self, required_consts: Vec<ConstOperand<'tcx>>) {
696 if !self.required_consts.is_none() {
{
::core::panicking::panic_fmt(format_args!("required_consts for {0:?} have already been set",
self.source.def_id()));
}
};assert!(
697 self.required_consts.is_none(),
698 "required_consts for {:?} have already been set",
699 self.source.def_id()
700 );
701 self.required_consts = Some(required_consts);
702 }
703 #[track_caller]
704 pub fn required_consts(&self) -> &[ConstOperand<'tcx>] {
705 match &self.required_consts {
706 Some(l) => l,
707 None => {
::core::panicking::panic_fmt(format_args!("required_consts for {0:?} have not yet been set",
self.source.def_id()));
}panic!("required_consts for {:?} have not yet been set", self.source.def_id()),
708 }
709 }
710
711 #[track_caller]
712 pub fn set_mentioned_items(&mut self, mentioned_items: Vec<Spanned<MentionedItem<'tcx>>>) {
713 if !self.mentioned_items.is_none() {
{
::core::panicking::panic_fmt(format_args!("mentioned_items for {0:?} have already been set",
self.source.def_id()));
}
};assert!(
714 self.mentioned_items.is_none(),
715 "mentioned_items for {:?} have already been set",
716 self.source.def_id()
717 );
718 self.mentioned_items = Some(mentioned_items);
719 }
720 #[track_caller]
721 pub fn mentioned_items(&self) -> &[Spanned<MentionedItem<'tcx>>] {
722 match &self.mentioned_items {
723 Some(l) => l,
724 None => {
::core::panicking::panic_fmt(format_args!("mentioned_items for {0:?} have not yet been set",
self.source.def_id()));
}panic!("mentioned_items for {:?} have not yet been set", self.source.def_id()),
725 }
726 }
727}
728
729impl<'tcx> Index<BasicBlock> for Body<'tcx> {
730 type Output = BasicBlockData<'tcx>;
731
732 #[inline]
733 fn index(&self, index: BasicBlock) -> &BasicBlockData<'tcx> {
734 &self.basic_blocks[index]
735 }
736}
737
738impl<'tcx> IndexMut<BasicBlock> for Body<'tcx> {
739 #[inline]
740 fn index_mut(&mut self, index: BasicBlock) -> &mut BasicBlockData<'tcx> {
741 &mut self.basic_blocks.as_mut()[index]
742 }
743}
744
745#[derive(#[automatically_derived]
impl<T: ::core::marker::Copy> ::core::marker::Copy for ClearCrossCrate<T> { }Copy, #[automatically_derived]
impl<T: ::core::clone::Clone> ::core::clone::Clone for ClearCrossCrate<T> {
#[inline]
fn clone(&self) -> ClearCrossCrate<T> {
match self {
ClearCrossCrate::Clear => ClearCrossCrate::Clear,
ClearCrossCrate::Set(__self_0) =>
ClearCrossCrate::Set(::core::clone::Clone::clone(__self_0)),
}
}
}Clone, #[automatically_derived]
impl<T: ::core::fmt::Debug> ::core::fmt::Debug for ClearCrossCrate<T> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
ClearCrossCrate::Clear =>
::core::fmt::Formatter::write_str(f, "Clear"),
ClearCrossCrate::Set(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Set",
&__self_0),
}
}
}Debug, const _: () =
{
impl<'__ctx, T>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for ClearCrossCrate<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) {
::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
match *self {
ClearCrossCrate::Clear => {}
ClearCrossCrate::Set(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, const _: () =
{
impl<'tcx, T>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for ClearCrossCrate<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 {
ClearCrossCrate::Clear => { ClearCrossCrate::Clear }
ClearCrossCrate::Set(__binding_0) => {
ClearCrossCrate::Set(::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 {
ClearCrossCrate::Clear => { ClearCrossCrate::Clear }
ClearCrossCrate::Set(__binding_0) => {
ClearCrossCrate::Set(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder))
}
}
}
}
};TypeFoldable, const _: () =
{
impl<'tcx, T>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for ClearCrossCrate<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 {
ClearCrossCrate::Clear => {}
ClearCrossCrate::Set(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)]
746pub enum ClearCrossCrate<T> {
747 Clear,
748 Set(T),
749}
750
751impl<T> ClearCrossCrate<T> {
752 pub fn as_ref(&self) -> ClearCrossCrate<&T> {
753 match self {
754 ClearCrossCrate::Clear => ClearCrossCrate::Clear,
755 ClearCrossCrate::Set(v) => ClearCrossCrate::Set(v),
756 }
757 }
758
759 pub fn as_mut(&mut self) -> ClearCrossCrate<&mut T> {
760 match self {
761 ClearCrossCrate::Clear => ClearCrossCrate::Clear,
762 ClearCrossCrate::Set(v) => ClearCrossCrate::Set(v),
763 }
764 }
765
766 pub fn unwrap_crate_local(self) -> T {
767 match self {
768 ClearCrossCrate::Clear => crate::util::bug::bug_fmt(format_args!("unwrapping cross-crate data"))bug!("unwrapping cross-crate data"),
769 ClearCrossCrate::Set(v) => v,
770 }
771 }
772}
773
774const TAG_CLEAR_CROSS_CRATE_CLEAR: u8 = 0;
775const TAG_CLEAR_CROSS_CRATE_SET: u8 = 1;
776
777impl<'tcx, E: TyEncoder<'tcx>, T: Encodable<E>> Encodable<E> for ClearCrossCrate<T> {
778 #[inline]
779 fn encode(&self, e: &mut E) {
780 if E::CLEAR_CROSS_CRATE {
781 return;
782 }
783
784 match *self {
785 ClearCrossCrate::Clear => TAG_CLEAR_CROSS_CRATE_CLEAR.encode(e),
786 ClearCrossCrate::Set(ref val) => {
787 TAG_CLEAR_CROSS_CRATE_SET.encode(e);
788 val.encode(e);
789 }
790 }
791 }
792}
793impl<'tcx, D: TyDecoder<'tcx>, T: Decodable<D>> Decodable<D> for ClearCrossCrate<T> {
794 #[inline]
795 fn decode(d: &mut D) -> ClearCrossCrate<T> {
796 if D::CLEAR_CROSS_CRATE {
797 return ClearCrossCrate::Clear;
798 }
799
800 let discr = u8::decode(d);
801
802 match discr {
803 TAG_CLEAR_CROSS_CRATE_CLEAR => ClearCrossCrate::Clear,
804 TAG_CLEAR_CROSS_CRATE_SET => {
805 let val = T::decode(d);
806 ClearCrossCrate::Set(val)
807 }
808 tag => {
::core::panicking::panic_fmt(format_args!("Invalid tag for ClearCrossCrate: {0:?}",
tag));
}panic!("Invalid tag for ClearCrossCrate: {tag:?}"),
809 }
810 }
811}
812
813#[derive(#[automatically_derived]
impl ::core::marker::Copy for SourceInfo { }Copy, #[automatically_derived]
impl ::core::clone::Clone for SourceInfo {
#[inline]
fn clone(&self) -> SourceInfo {
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<SourceScope>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for SourceInfo {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "SourceInfo",
"span", &self.span, "scope", &&self.scope)
}
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for SourceInfo {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<Span>;
let _: ::core::cmp::AssertParamIsEq<SourceScope>;
}
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for SourceInfo {
#[inline]
fn eq(&self, other: &SourceInfo) -> bool {
self.span == other.span && self.scope == other.scope
}
}PartialEq, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for SourceInfo {
fn encode(&self, __encoder: &mut __E) {
match *self {
SourceInfo { span: ref __binding_0, scope: 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 SourceInfo {
fn decode(__decoder: &mut __D) -> Self {
SourceInfo {
span: ::rustc_serialize::Decodable::decode(__decoder),
scope: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable, #[automatically_derived]
impl ::core::hash::Hash for SourceInfo {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.span, state);
::core::hash::Hash::hash(&self.scope, state)
}
}Hash, const _: () =
{
impl<'__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for SourceInfo {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
SourceInfo { span: ref __binding_0, scope: ref __binding_1 }
=> {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
819pub struct SourceInfo {
820 pub span: Span,
822
823 pub scope: SourceScope,
826}
827
828impl SourceInfo {
829 #[inline]
830 pub fn outermost(span: Span) -> Self {
831 SourceInfo { span, scope: OUTERMOST_SOURCE_SCOPE }
832 }
833}
834
835impl ::std::fmt::Debug for Local {
fn fmt(&self, fmt: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
fmt.write_fmt(format_args!("_{0}", self.as_u32()))
}
}rustc_index::newtype_index! {
839 #[stable_hash]
840 #[encodable]
841 #[orderable]
842 #[debug_format = "_{}"]
843 pub struct Local {
844 const RETURN_PLACE = 0;
845 }
846}
847
848impl Atom for Local {
849 fn index(self) -> usize {
850 Idx::index(self)
851 }
852}
853
854#[derive(#[automatically_derived]
impl ::core::clone::Clone for LocalKind {
#[inline]
fn clone(&self) -> LocalKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for LocalKind { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for LocalKind {
#[inline]
fn eq(&self, other: &LocalKind) -> 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 LocalKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for LocalKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
LocalKind::Temp => "Temp",
LocalKind::Arg => "Arg",
LocalKind::ReturnPointer => "ReturnPointer",
})
}
}Debug, const _: () =
{
impl<'__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for LocalKind {
#[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 {
LocalKind::Temp => {}
LocalKind::Arg => {}
LocalKind::ReturnPointer => {}
}
}
}
};HashStable)]
856pub enum LocalKind {
857 Temp,
859 Arg,
861 ReturnPointer,
863}
864
865#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for VarBindingForm<'tcx> {
#[inline]
fn clone(&self) -> VarBindingForm<'tcx> {
VarBindingForm {
binding_mode: ::core::clone::Clone::clone(&self.binding_mode),
opt_ty_info: ::core::clone::Clone::clone(&self.opt_ty_info),
opt_match_place: ::core::clone::Clone::clone(&self.opt_match_place),
pat_span: ::core::clone::Clone::clone(&self.pat_span),
introductions: ::core::clone::Clone::clone(&self.introductions),
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for VarBindingForm<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f,
"VarBindingForm", "binding_mode", &self.binding_mode,
"opt_ty_info", &self.opt_ty_info, "opt_match_place",
&self.opt_match_place, "pat_span", &self.pat_span,
"introductions", &&self.introductions)
}
}Debug, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for VarBindingForm<'tcx> {
fn encode(&self, __encoder: &mut __E) {
match *self {
VarBindingForm {
binding_mode: ref __binding_0,
opt_ty_info: ref __binding_1,
opt_match_place: ref __binding_2,
pat_span: ref __binding_3,
introductions: 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 VarBindingForm<'tcx> {
fn decode(__decoder: &mut __D) -> Self {
VarBindingForm {
binding_mode: ::rustc_serialize::Decodable::decode(__decoder),
opt_ty_info: ::rustc_serialize::Decodable::decode(__decoder),
opt_match_place: ::rustc_serialize::Decodable::decode(__decoder),
pat_span: ::rustc_serialize::Decodable::decode(__decoder),
introductions: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable, const _: () =
{
impl<'tcx, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for VarBindingForm<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
VarBindingForm {
binding_mode: ref __binding_0,
opt_ty_info: ref __binding_1,
opt_match_place: ref __binding_2,
pat_span: ref __binding_3,
introductions: 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)]
866pub struct VarBindingForm<'tcx> {
867 pub binding_mode: BindingMode,
869 pub opt_ty_info: Option<Span>,
876 pub opt_match_place: Option<(Option<Place<'tcx>>, Span)>,
883 pub pat_span: Span,
885 pub introductions: Vec<VarBindingIntroduction>,
888}
889
890#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for BindingForm<'tcx> {
#[inline]
fn clone(&self) -> BindingForm<'tcx> {
match self {
BindingForm::Var(__self_0) =>
BindingForm::Var(::core::clone::Clone::clone(__self_0)),
BindingForm::ImplicitSelf(__self_0) =>
BindingForm::ImplicitSelf(::core::clone::Clone::clone(__self_0)),
BindingForm::RefForGuard(__self_0) =>
BindingForm::RefForGuard(::core::clone::Clone::clone(__self_0)),
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for BindingForm<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
BindingForm::Var(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Var",
&__self_0),
BindingForm::ImplicitSelf(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"ImplicitSelf", &__self_0),
BindingForm::RefForGuard(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"RefForGuard", &__self_0),
}
}
}Debug, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for BindingForm<'tcx> {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
BindingForm::Var(ref __binding_0) => { 0usize }
BindingForm::ImplicitSelf(ref __binding_0) => { 1usize }
BindingForm::RefForGuard(ref __binding_0) => { 2usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
BindingForm::Var(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
BindingForm::ImplicitSelf(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
BindingForm::RefForGuard(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 BindingForm<'tcx> {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
BindingForm::Var(::rustc_serialize::Decodable::decode(__decoder))
}
1usize => {
BindingForm::ImplicitSelf(::rustc_serialize::Decodable::decode(__decoder))
}
2usize => {
BindingForm::RefForGuard(::rustc_serialize::Decodable::decode(__decoder))
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `BindingForm`, expected 0..3, actual {0}",
n));
}
}
}
}
};TyDecodable, const _: () =
{
impl<'tcx, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for BindingForm<'tcx> {
#[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 {
BindingForm::Var(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
BindingForm::ImplicitSelf(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
BindingForm::RefForGuard(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
891pub enum BindingForm<'tcx> {
892 Var(VarBindingForm<'tcx>),
894 ImplicitSelf(ImplicitSelfKind),
896 RefForGuard(Local),
898}
899
900#[derive(#[automatically_derived]
impl ::core::clone::Clone for VarBindingIntroduction {
#[inline]
fn clone(&self) -> VarBindingIntroduction {
VarBindingIntroduction {
span: ::core::clone::Clone::clone(&self.span),
is_shorthand: ::core::clone::Clone::clone(&self.is_shorthand),
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for VarBindingIntroduction {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"VarBindingIntroduction", "span", &self.span, "is_shorthand",
&&self.is_shorthand)
}
}Debug, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for VarBindingIntroduction {
fn encode(&self, __encoder: &mut __E) {
match *self {
VarBindingIntroduction {
span: ref __binding_0, is_shorthand: 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 VarBindingIntroduction {
fn decode(__decoder: &mut __D) -> Self {
VarBindingIntroduction {
span: ::rustc_serialize::Decodable::decode(__decoder),
is_shorthand: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable, const _: () =
{
impl<'__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for VarBindingIntroduction {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
VarBindingIntroduction {
span: ref __binding_0, is_shorthand: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
901pub struct VarBindingIntroduction {
902 pub span: Span,
904 pub is_shorthand: bool,
906}
907
908#[derive(#[automatically_derived]
impl ::core::clone::Clone for BlockTailInfo {
#[inline]
fn clone(&self) -> BlockTailInfo {
let _: ::core::clone::AssertParamIsClone<bool>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for BlockTailInfo { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for BlockTailInfo {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "BlockTailInfo",
"tail_result_is_ignored", &self.tail_result_is_ignored, "span",
&&self.span)
}
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for BlockTailInfo {
#[inline]
fn eq(&self, other: &BlockTailInfo) -> bool {
self.tail_result_is_ignored == other.tail_result_is_ignored &&
self.span == other.span
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for BlockTailInfo {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<bool>;
let _: ::core::cmp::AssertParamIsEq<Span>;
}
}Eq, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for BlockTailInfo {
fn encode(&self, __encoder: &mut __E) {
match *self {
BlockTailInfo {
tail_result_is_ignored: ref __binding_0,
span: 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 BlockTailInfo {
fn decode(__decoder: &mut __D) -> Self {
BlockTailInfo {
tail_result_is_ignored: ::rustc_serialize::Decodable::decode(__decoder),
span: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable, const _: () =
{
impl<'__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for BlockTailInfo {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
BlockTailInfo {
tail_result_is_ignored: ref __binding_0,
span: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
917pub struct BlockTailInfo {
918 pub tail_result_is_ignored: bool,
924
925 pub span: Span,
927}
928
929#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for LocalDecl<'tcx> {
#[inline]
fn clone(&self) -> LocalDecl<'tcx> {
LocalDecl {
mutability: ::core::clone::Clone::clone(&self.mutability),
local_info: ::core::clone::Clone::clone(&self.local_info),
ty: ::core::clone::Clone::clone(&self.ty),
user_ty: ::core::clone::Clone::clone(&self.user_ty),
source_info: ::core::clone::Clone::clone(&self.source_info),
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for LocalDecl<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f, "LocalDecl",
"mutability", &self.mutability, "local_info", &self.local_info,
"ty", &self.ty, "user_ty", &self.user_ty, "source_info",
&&self.source_info)
}
}Debug, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for LocalDecl<'tcx> {
fn encode(&self, __encoder: &mut __E) {
match *self {
LocalDecl {
mutability: ref __binding_0,
local_info: ref __binding_1,
ty: ref __binding_2,
user_ty: ref __binding_3,
source_info: 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 LocalDecl<'tcx> {
fn decode(__decoder: &mut __D) -> Self {
LocalDecl {
mutability: ::rustc_serialize::Decodable::decode(__decoder),
local_info: ::rustc_serialize::Decodable::decode(__decoder),
ty: ::rustc_serialize::Decodable::decode(__decoder),
user_ty: ::rustc_serialize::Decodable::decode(__decoder),
source_info: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable, const _: () =
{
impl<'tcx, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for LocalDecl<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
LocalDecl {
mutability: ref __binding_0,
local_info: ref __binding_1,
ty: ref __binding_2,
user_ty: ref __binding_3,
source_info: 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>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for LocalDecl<'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 {
LocalDecl {
mutability: __binding_0,
local_info: __binding_1,
ty: __binding_2,
user_ty: __binding_3,
source_info: __binding_4 } => {
LocalDecl {
mutability: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
local_info: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
ty: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_2,
__folder)?,
user_ty: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_3,
__folder)?,
source_info: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_4,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Self {
match self {
LocalDecl {
mutability: __binding_0,
local_info: __binding_1,
ty: __binding_2,
user_ty: __binding_3,
source_info: __binding_4 } => {
LocalDecl {
mutability: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder),
local_info: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
__folder),
ty: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_2,
__folder),
user_ty: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_3,
__folder),
source_info: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_4,
__folder),
}
}
}
}
}
};TypeFoldable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for LocalDecl<'tcx> {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
LocalDecl {
mutability: ref __binding_0,
local_info: ref __binding_1,
ty: ref __binding_2,
user_ty: ref __binding_3,
source_info: ref __binding_4 } => {
{
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);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_2,
__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_3,
__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_4,
__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)]
934pub struct LocalDecl<'tcx> {
935 pub mutability: Mutability,
939
940 pub local_info: ClearCrossCrate<Box<LocalInfo<'tcx>>>,
941
942 pub ty: Ty<'tcx>,
944
945 pub user_ty: Option<Box<UserTypeProjections>>,
950
951 pub source_info: SourceInfo,
1032}
1033
1034#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for LocalInfo<'tcx> {
#[inline]
fn clone(&self) -> LocalInfo<'tcx> {
match self {
LocalInfo::User(__self_0) =>
LocalInfo::User(::core::clone::Clone::clone(__self_0)),
LocalInfo::StaticRef { def_id: __self_0, is_thread_local: __self_1
} =>
LocalInfo::StaticRef {
def_id: ::core::clone::Clone::clone(__self_0),
is_thread_local: ::core::clone::Clone::clone(__self_1),
},
LocalInfo::ConstRef { def_id: __self_0 } =>
LocalInfo::ConstRef {
def_id: ::core::clone::Clone::clone(__self_0),
},
LocalInfo::AggregateTemp => LocalInfo::AggregateTemp,
LocalInfo::BlockTailTemp(__self_0) =>
LocalInfo::BlockTailTemp(::core::clone::Clone::clone(__self_0)),
LocalInfo::IfThenRescopeTemp { if_then: __self_0 } =>
LocalInfo::IfThenRescopeTemp {
if_then: ::core::clone::Clone::clone(__self_0),
},
LocalInfo::DerefTemp => LocalInfo::DerefTemp,
LocalInfo::FakeBorrow => LocalInfo::FakeBorrow,
LocalInfo::Boring => LocalInfo::Boring,
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for LocalInfo<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
LocalInfo::User(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "User",
&__self_0),
LocalInfo::StaticRef { def_id: __self_0, is_thread_local: __self_1
} =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"StaticRef", "def_id", __self_0, "is_thread_local",
&__self_1),
LocalInfo::ConstRef { def_id: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"ConstRef", "def_id", &__self_0),
LocalInfo::AggregateTemp =>
::core::fmt::Formatter::write_str(f, "AggregateTemp"),
LocalInfo::BlockTailTemp(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"BlockTailTemp", &__self_0),
LocalInfo::IfThenRescopeTemp { if_then: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"IfThenRescopeTemp", "if_then", &__self_0),
LocalInfo::DerefTemp =>
::core::fmt::Formatter::write_str(f, "DerefTemp"),
LocalInfo::FakeBorrow =>
::core::fmt::Formatter::write_str(f, "FakeBorrow"),
LocalInfo::Boring =>
::core::fmt::Formatter::write_str(f, "Boring"),
}
}
}Debug, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for LocalInfo<'tcx> {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
LocalInfo::User(ref __binding_0) => { 0usize }
LocalInfo::StaticRef {
def_id: ref __binding_0, is_thread_local: ref __binding_1 }
=> {
1usize
}
LocalInfo::ConstRef { def_id: ref __binding_0 } => {
2usize
}
LocalInfo::AggregateTemp => { 3usize }
LocalInfo::BlockTailTemp(ref __binding_0) => { 4usize }
LocalInfo::IfThenRescopeTemp { if_then: ref __binding_0 } =>
{
5usize
}
LocalInfo::DerefTemp => { 6usize }
LocalInfo::FakeBorrow => { 7usize }
LocalInfo::Boring => { 8usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
LocalInfo::User(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
LocalInfo::StaticRef {
def_id: ref __binding_0, is_thread_local: ref __binding_1 }
=> {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
LocalInfo::ConstRef { def_id: ref __binding_0 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
LocalInfo::AggregateTemp => {}
LocalInfo::BlockTailTemp(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
LocalInfo::IfThenRescopeTemp { if_then: ref __binding_0 } =>
{
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
LocalInfo::DerefTemp => {}
LocalInfo::FakeBorrow => {}
LocalInfo::Boring => {}
}
}
}
};TyEncodable, const _: () =
{
impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
::rustc_serialize::Decodable<__D> for LocalInfo<'tcx> {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
LocalInfo::User(::rustc_serialize::Decodable::decode(__decoder))
}
1usize => {
LocalInfo::StaticRef {
def_id: ::rustc_serialize::Decodable::decode(__decoder),
is_thread_local: ::rustc_serialize::Decodable::decode(__decoder),
}
}
2usize => {
LocalInfo::ConstRef {
def_id: ::rustc_serialize::Decodable::decode(__decoder),
}
}
3usize => { LocalInfo::AggregateTemp }
4usize => {
LocalInfo::BlockTailTemp(::rustc_serialize::Decodable::decode(__decoder))
}
5usize => {
LocalInfo::IfThenRescopeTemp {
if_then: ::rustc_serialize::Decodable::decode(__decoder),
}
}
6usize => { LocalInfo::DerefTemp }
7usize => { LocalInfo::FakeBorrow }
8usize => { LocalInfo::Boring }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `LocalInfo`, expected 0..9, actual {0}",
n));
}
}
}
}
};TyDecodable, const _: () =
{
impl<'tcx, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for LocalInfo<'tcx> {
#[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 {
LocalInfo::User(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
LocalInfo::StaticRef {
def_id: ref __binding_0, is_thread_local: ref __binding_1 }
=> {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
LocalInfo::ConstRef { def_id: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
LocalInfo::AggregateTemp => {}
LocalInfo::BlockTailTemp(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
LocalInfo::IfThenRescopeTemp { if_then: ref __binding_0 } =>
{
{ __binding_0.hash_stable(__hcx, __hasher); }
}
LocalInfo::DerefTemp => {}
LocalInfo::FakeBorrow => {}
LocalInfo::Boring => {}
}
}
}
};HashStable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for LocalInfo<'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 {
LocalInfo::User(__binding_0) => {
LocalInfo::User(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?)
}
LocalInfo::StaticRef {
def_id: __binding_0, is_thread_local: __binding_1 } => {
LocalInfo::StaticRef {
def_id: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
is_thread_local: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
}
}
LocalInfo::ConstRef { def_id: __binding_0 } => {
LocalInfo::ConstRef {
def_id: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
}
}
LocalInfo::AggregateTemp => { LocalInfo::AggregateTemp }
LocalInfo::BlockTailTemp(__binding_0) => {
LocalInfo::BlockTailTemp(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?)
}
LocalInfo::IfThenRescopeTemp { if_then: __binding_0 } => {
LocalInfo::IfThenRescopeTemp {
if_then: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
}
}
LocalInfo::DerefTemp => { LocalInfo::DerefTemp }
LocalInfo::FakeBorrow => { LocalInfo::FakeBorrow }
LocalInfo::Boring => { LocalInfo::Boring }
})
}
fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Self {
match self {
LocalInfo::User(__binding_0) => {
LocalInfo::User(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder))
}
LocalInfo::StaticRef {
def_id: __binding_0, is_thread_local: __binding_1 } => {
LocalInfo::StaticRef {
def_id: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder),
is_thread_local: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
__folder),
}
}
LocalInfo::ConstRef { def_id: __binding_0 } => {
LocalInfo::ConstRef {
def_id: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder),
}
}
LocalInfo::AggregateTemp => { LocalInfo::AggregateTemp }
LocalInfo::BlockTailTemp(__binding_0) => {
LocalInfo::BlockTailTemp(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder))
}
LocalInfo::IfThenRescopeTemp { if_then: __binding_0 } => {
LocalInfo::IfThenRescopeTemp {
if_then: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder),
}
}
LocalInfo::DerefTemp => { LocalInfo::DerefTemp }
LocalInfo::FakeBorrow => { LocalInfo::FakeBorrow }
LocalInfo::Boring => { LocalInfo::Boring }
}
}
}
};TypeFoldable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for LocalInfo<'tcx> {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
LocalInfo::User(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);
}
}
}
}
LocalInfo::StaticRef {
def_id: ref __binding_0, is_thread_local: 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);
}
}
}
}
LocalInfo::ConstRef { def_id: 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);
}
}
}
}
LocalInfo::AggregateTemp => {}
LocalInfo::BlockTailTemp(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);
}
}
}
}
LocalInfo::IfThenRescopeTemp { if_then: 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);
}
}
}
}
LocalInfo::DerefTemp => {}
LocalInfo::FakeBorrow => {}
LocalInfo::Boring => {}
}
<__V::Result as ::rustc_middle::ty::VisitorResult>::output()
}
}
};TypeVisitable)]
1041pub enum LocalInfo<'tcx> {
1042 User(BindingForm<'tcx>),
1048 StaticRef { def_id: DefId, is_thread_local: bool },
1050 ConstRef { def_id: DefId },
1052 AggregateTemp,
1055 BlockTailTemp(BlockTailInfo),
1058 IfThenRescopeTemp { if_then: HirId },
1061 DerefTemp,
1067 FakeBorrow,
1069 Boring,
1071}
1072
1073impl<'tcx> LocalDecl<'tcx> {
1074 pub fn local_info(&self) -> &LocalInfo<'tcx> {
1075 self.local_info.as_ref().unwrap_crate_local()
1076 }
1077
1078 pub fn can_be_made_mutable(&self) -> bool {
1085 #[allow(non_exhaustive_omitted_patterns)] match self.local_info() {
LocalInfo::User(BindingForm::Var(VarBindingForm {
binding_mode: BindingMode(ByRef::No, _), .. }) |
BindingForm::ImplicitSelf(ImplicitSelfKind::Imm)) => true,
_ => false,
}matches!(
1086 self.local_info(),
1087 LocalInfo::User(
1088 BindingForm::Var(VarBindingForm { binding_mode: BindingMode(ByRef::No, _), .. })
1089 | BindingForm::ImplicitSelf(ImplicitSelfKind::Imm),
1090 )
1091 )
1092 }
1093
1094 pub fn is_nonref_binding(&self) -> bool {
1098 #[allow(non_exhaustive_omitted_patterns)] match self.local_info() {
LocalInfo::User(BindingForm::Var(VarBindingForm {
binding_mode: BindingMode(ByRef::No, _), .. }) |
BindingForm::ImplicitSelf(_)) => true,
_ => false,
}matches!(
1099 self.local_info(),
1100 LocalInfo::User(
1101 BindingForm::Var(VarBindingForm { binding_mode: BindingMode(ByRef::No, _), .. })
1102 | BindingForm::ImplicitSelf(_),
1103 )
1104 )
1105 }
1106
1107 #[inline]
1110 pub fn is_user_variable(&self) -> bool {
1111 #[allow(non_exhaustive_omitted_patterns)] match self.local_info() {
LocalInfo::User(_) => true,
_ => false,
}matches!(self.local_info(), LocalInfo::User(_))
1112 }
1113
1114 pub fn is_ref_for_guard(&self) -> bool {
1118 #[allow(non_exhaustive_omitted_patterns)] match self.local_info() {
LocalInfo::User(BindingForm::RefForGuard(_)) => true,
_ => false,
}matches!(self.local_info(), LocalInfo::User(BindingForm::RefForGuard(_)))
1119 }
1120
1121 pub fn is_ref_to_static(&self) -> bool {
1124 #[allow(non_exhaustive_omitted_patterns)] match self.local_info() {
LocalInfo::StaticRef { .. } => true,
_ => false,
}matches!(self.local_info(), LocalInfo::StaticRef { .. })
1125 }
1126
1127 pub fn is_ref_to_thread_local(&self) -> bool {
1130 match self.local_info() {
1131 LocalInfo::StaticRef { is_thread_local, .. } => *is_thread_local,
1132 _ => false,
1133 }
1134 }
1135
1136 pub fn is_deref_temp(&self) -> bool {
1138 match self.local_info() {
1139 LocalInfo::DerefTemp => true,
1140 _ => false,
1141 }
1142 }
1143
1144 #[inline]
1147 pub fn from_compiler_desugaring(&self) -> bool {
1148 self.source_info.span.desugaring_kind().is_some()
1149 }
1150
1151 #[inline]
1153 pub fn new(ty: Ty<'tcx>, span: Span) -> Self {
1154 Self::with_source_info(ty, SourceInfo::outermost(span))
1155 }
1156
1157 #[inline]
1159 pub fn with_source_info(ty: Ty<'tcx>, source_info: SourceInfo) -> Self {
1160 LocalDecl {
1161 mutability: Mutability::Mut,
1162 local_info: ClearCrossCrate::Set(Box::new(LocalInfo::Boring)),
1163 ty,
1164 user_ty: None,
1165 source_info,
1166 }
1167 }
1168
1169 #[inline]
1171 pub fn immutable(mut self) -> Self {
1172 self.mutability = Mutability::Not;
1173 self
1174 }
1175}
1176
1177#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for VarDebugInfoContents<'tcx> {
#[inline]
fn clone(&self) -> VarDebugInfoContents<'tcx> {
match self {
VarDebugInfoContents::Place(__self_0) =>
VarDebugInfoContents::Place(::core::clone::Clone::clone(__self_0)),
VarDebugInfoContents::Const(__self_0) =>
VarDebugInfoContents::Const(::core::clone::Clone::clone(__self_0)),
}
}
}Clone, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for VarDebugInfoContents<'tcx> {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
VarDebugInfoContents::Place(ref __binding_0) => { 0usize }
VarDebugInfoContents::Const(ref __binding_0) => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
VarDebugInfoContents::Place(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
VarDebugInfoContents::Const(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 VarDebugInfoContents<'tcx> {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
VarDebugInfoContents::Place(::rustc_serialize::Decodable::decode(__decoder))
}
1usize => {
VarDebugInfoContents::Const(::rustc_serialize::Decodable::decode(__decoder))
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `VarDebugInfoContents`, expected 0..2, actual {0}",
n));
}
}
}
}
};TyDecodable, const _: () =
{
impl<'tcx, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for VarDebugInfoContents<'tcx> {
#[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 {
VarDebugInfoContents::Place(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
VarDebugInfoContents::Const(ref __binding_0) => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for VarDebugInfoContents<'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 {
VarDebugInfoContents::Place(__binding_0) => {
VarDebugInfoContents::Place(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?)
}
VarDebugInfoContents::Const(__binding_0) => {
VarDebugInfoContents::Const(::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 {
VarDebugInfoContents::Place(__binding_0) => {
VarDebugInfoContents::Place(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder))
}
VarDebugInfoContents::Const(__binding_0) => {
VarDebugInfoContents::Const(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder))
}
}
}
}
};TypeFoldable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for VarDebugInfoContents<'tcx> {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
VarDebugInfoContents::Place(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);
}
}
}
}
VarDebugInfoContents::Const(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)]
1178pub enum VarDebugInfoContents<'tcx> {
1179 Place(Place<'tcx>),
1181 Const(ConstOperand<'tcx>),
1182}
1183
1184impl<'tcx> Debug for VarDebugInfoContents<'tcx> {
1185 fn fmt(&self, fmt: &mut Formatter<'_>) -> fmt::Result {
1186 match self {
1187 VarDebugInfoContents::Const(c) => fmt.write_fmt(format_args!("{0}", c))write!(fmt, "{c}"),
1188 VarDebugInfoContents::Place(p) => fmt.write_fmt(format_args!("{0:?}", p))write!(fmt, "{p:?}"),
1189 }
1190 }
1191}
1192
1193#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for VarDebugInfoFragment<'tcx> {
#[inline]
fn clone(&self) -> VarDebugInfoFragment<'tcx> {
VarDebugInfoFragment {
ty: ::core::clone::Clone::clone(&self.ty),
projection: ::core::clone::Clone::clone(&self.projection),
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for VarDebugInfoFragment<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"VarDebugInfoFragment", "ty", &self.ty, "projection",
&&self.projection)
}
}Debug, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for VarDebugInfoFragment<'tcx> {
fn encode(&self, __encoder: &mut __E) {
match *self {
VarDebugInfoFragment {
ty: ref __binding_0, projection: 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 VarDebugInfoFragment<'tcx> {
fn decode(__decoder: &mut __D) -> Self {
VarDebugInfoFragment {
ty: ::rustc_serialize::Decodable::decode(__decoder),
projection: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable, const _: () =
{
impl<'tcx, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for VarDebugInfoFragment<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
VarDebugInfoFragment {
ty: ref __binding_0, projection: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for VarDebugInfoFragment<'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 {
VarDebugInfoFragment {
ty: __binding_0, projection: __binding_1 } => {
VarDebugInfoFragment {
ty: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
projection: ::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 {
VarDebugInfoFragment {
ty: __binding_0, projection: __binding_1 } => {
VarDebugInfoFragment {
ty: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder),
projection: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
__folder),
}
}
}
}
}
};TypeFoldable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for VarDebugInfoFragment<'tcx> {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
VarDebugInfoFragment {
ty: ref __binding_0, projection: 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)]
1194pub struct VarDebugInfoFragment<'tcx> {
1195 pub ty: Ty<'tcx>,
1198
1199 pub projection: Vec<PlaceElem<'tcx>>,
1209}
1210
1211#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for VarDebugInfo<'tcx> {
#[inline]
fn clone(&self) -> VarDebugInfo<'tcx> {
VarDebugInfo {
name: ::core::clone::Clone::clone(&self.name),
source_info: ::core::clone::Clone::clone(&self.source_info),
composite: ::core::clone::Clone::clone(&self.composite),
value: ::core::clone::Clone::clone(&self.value),
argument_index: ::core::clone::Clone::clone(&self.argument_index),
}
}
}Clone, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for VarDebugInfo<'tcx> {
fn encode(&self, __encoder: &mut __E) {
match *self {
VarDebugInfo {
name: ref __binding_0,
source_info: ref __binding_1,
composite: ref __binding_2,
value: ref __binding_3,
argument_index: 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 VarDebugInfo<'tcx> {
fn decode(__decoder: &mut __D) -> Self {
VarDebugInfo {
name: ::rustc_serialize::Decodable::decode(__decoder),
source_info: ::rustc_serialize::Decodable::decode(__decoder),
composite: ::rustc_serialize::Decodable::decode(__decoder),
value: ::rustc_serialize::Decodable::decode(__decoder),
argument_index: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable, const _: () =
{
impl<'tcx, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for VarDebugInfo<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
VarDebugInfo {
name: ref __binding_0,
source_info: ref __binding_1,
composite: ref __binding_2,
value: ref __binding_3,
argument_index: 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>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for VarDebugInfo<'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 {
VarDebugInfo {
name: __binding_0,
source_info: __binding_1,
composite: __binding_2,
value: __binding_3,
argument_index: __binding_4 } => {
VarDebugInfo {
name: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
source_info: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
composite: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_2,
__folder)?,
value: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_3,
__folder)?,
argument_index: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_4,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Self {
match self {
VarDebugInfo {
name: __binding_0,
source_info: __binding_1,
composite: __binding_2,
value: __binding_3,
argument_index: __binding_4 } => {
VarDebugInfo {
name: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder),
source_info: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
__folder),
composite: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_2,
__folder),
value: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_3,
__folder),
argument_index: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_4,
__folder),
}
}
}
}
}
};TypeFoldable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for VarDebugInfo<'tcx> {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
VarDebugInfo {
name: ref __binding_0,
source_info: ref __binding_1,
composite: ref __binding_2,
value: ref __binding_3,
argument_index: ref __binding_4 } => {
{
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);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_2,
__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_3,
__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_4,
__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)]
1213pub struct VarDebugInfo<'tcx> {
1214 pub name: Symbol,
1215
1216 pub source_info: SourceInfo,
1220
1221 pub composite: Option<Box<VarDebugInfoFragment<'tcx>>>,
1227
1228 pub value: VarDebugInfoContents<'tcx>,
1230
1231 pub argument_index: Option<u16>,
1235}
1236
1237impl ::std::fmt::Debug for BasicBlock {
fn fmt(&self, fmt: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
fmt.write_fmt(format_args!("bb{0}", self.as_u32()))
}
}rustc_index::newtype_index! {
1241 #[stable_hash]
1264 #[encodable]
1265 #[orderable]
1266 #[debug_format = "bb{}"]
1267 pub struct BasicBlock {
1268 const START_BLOCK = 0;
1269 }
1270}
1271
1272impl BasicBlock {
1273 pub fn start_location(self) -> Location {
1274 Location { block: self, statement_index: 0 }
1275 }
1276}
1277
1278#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for BasicBlockData<'tcx> {
#[inline]
fn clone(&self) -> BasicBlockData<'tcx> {
BasicBlockData {
statements: ::core::clone::Clone::clone(&self.statements),
after_last_stmt_debuginfos: ::core::clone::Clone::clone(&self.after_last_stmt_debuginfos),
terminator: ::core::clone::Clone::clone(&self.terminator),
is_cleanup: ::core::clone::Clone::clone(&self.is_cleanup),
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for BasicBlockData<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f,
"BasicBlockData", "statements", &self.statements,
"after_last_stmt_debuginfos", &self.after_last_stmt_debuginfos,
"terminator", &self.terminator, "is_cleanup", &&self.is_cleanup)
}
}Debug, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for BasicBlockData<'tcx> {
fn encode(&self, __encoder: &mut __E) {
match *self {
BasicBlockData {
statements: ref __binding_0,
after_last_stmt_debuginfos: ref __binding_1,
terminator: ref __binding_2,
is_cleanup: 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 BasicBlockData<'tcx> {
fn decode(__decoder: &mut __D) -> Self {
BasicBlockData {
statements: ::rustc_serialize::Decodable::decode(__decoder),
after_last_stmt_debuginfos: ::rustc_serialize::Decodable::decode(__decoder),
terminator: ::rustc_serialize::Decodable::decode(__decoder),
is_cleanup: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable, const _: () =
{
impl<'tcx, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for BasicBlockData<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
BasicBlockData {
statements: ref __binding_0,
after_last_stmt_debuginfos: ref __binding_1,
terminator: ref __binding_2,
is_cleanup: 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, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for BasicBlockData<'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 {
BasicBlockData {
statements: __binding_0,
after_last_stmt_debuginfos: __binding_1,
terminator: __binding_2,
is_cleanup: __binding_3 } => {
BasicBlockData {
statements: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
after_last_stmt_debuginfos: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
terminator: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_2,
__folder)?,
is_cleanup: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_3,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Self {
match self {
BasicBlockData {
statements: __binding_0,
after_last_stmt_debuginfos: __binding_1,
terminator: __binding_2,
is_cleanup: __binding_3 } => {
BasicBlockData {
statements: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder),
after_last_stmt_debuginfos: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
__folder),
terminator: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_2,
__folder),
is_cleanup: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_3,
__folder),
}
}
}
}
}
};TypeFoldable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for BasicBlockData<'tcx> {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
BasicBlockData {
statements: ref __binding_0,
after_last_stmt_debuginfos: ref __binding_1,
terminator: ref __binding_2,
is_cleanup: ref __binding_3 } => {
{
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);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_2,
__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_3,
__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)]
1285#[non_exhaustive]
1286pub struct BasicBlockData<'tcx> {
1287 pub statements: Vec<Statement<'tcx>>,
1289
1290 pub after_last_stmt_debuginfos: StmtDebugInfos<'tcx>,
1293
1294 pub terminator: Option<Terminator<'tcx>>,
1303
1304 pub is_cleanup: bool,
1309}
1310
1311impl<'tcx> BasicBlockData<'tcx> {
1312 pub fn new(terminator: Option<Terminator<'tcx>>, is_cleanup: bool) -> BasicBlockData<'tcx> {
1313 BasicBlockData::new_stmts(Vec::new(), terminator, is_cleanup)
1314 }
1315
1316 pub fn new_stmts(
1317 statements: Vec<Statement<'tcx>>,
1318 terminator: Option<Terminator<'tcx>>,
1319 is_cleanup: bool,
1320 ) -> BasicBlockData<'tcx> {
1321 BasicBlockData {
1322 statements,
1323 after_last_stmt_debuginfos: StmtDebugInfos::default(),
1324 terminator,
1325 is_cleanup,
1326 }
1327 }
1328
1329 #[inline]
1334 pub fn terminator(&self) -> &Terminator<'tcx> {
1335 self.terminator.as_ref().expect("invalid terminator state")
1336 }
1337
1338 #[inline]
1339 pub fn terminator_mut(&mut self) -> &mut Terminator<'tcx> {
1340 self.terminator.as_mut().expect("invalid terminator state")
1341 }
1342
1343 #[inline]
1345 pub fn is_empty_unreachable(&self) -> bool {
1346 self.statements.is_empty() && #[allow(non_exhaustive_omitted_patterns)] match self.terminator().kind {
TerminatorKind::Unreachable => true,
_ => false,
}matches!(self.terminator().kind, TerminatorKind::Unreachable)
1347 }
1348
1349 pub fn mono_successors(&self, tcx: TyCtxt<'tcx>, instance: Instance<'tcx>) -> Successors<'_> {
1355 if let Some((bits, targets)) = Body::try_const_mono_switchint(tcx, instance, self) {
1356 targets.successors_for_value(bits)
1357 } else {
1358 self.terminator().successors()
1359 }
1360 }
1361
1362 pub fn retain_statements<F>(&mut self, mut f: F)
1363 where
1364 F: FnMut(&Statement<'tcx>) -> bool,
1365 {
1366 let mut debuginfos = StmtDebugInfos::default();
1369 self.statements.retain_mut(|stmt| {
1370 let retain = f(stmt);
1371 if retain {
1372 stmt.debuginfos.prepend(&mut debuginfos);
1373 } else {
1374 debuginfos.append(&mut stmt.debuginfos);
1375 }
1376 retain
1377 });
1378 self.after_last_stmt_debuginfos.prepend(&mut debuginfos);
1379 }
1380
1381 pub fn strip_nops(&mut self) {
1382 self.retain_statements(|stmt| !#[allow(non_exhaustive_omitted_patterns)] match stmt.kind {
StatementKind::Nop => true,
_ => false,
}matches!(stmt.kind, StatementKind::Nop))
1383 }
1384
1385 pub fn drop_debuginfo(&mut self) {
1386 self.after_last_stmt_debuginfos.drop_debuginfo();
1387 for stmt in self.statements.iter_mut() {
1388 stmt.debuginfos.drop_debuginfo();
1389 }
1390 }
1391}
1392
1393impl ::std::fmt::Debug for SourceScope {
fn fmt(&self, fmt: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
fmt.write_fmt(format_args!("scope[{0}]", self.as_u32()))
}
}rustc_index::newtype_index! {
1397 #[stable_hash]
1398 #[encodable]
1399 #[debug_format = "scope[{}]"]
1400 pub struct SourceScope {
1401 const OUTERMOST_SOURCE_SCOPE = 0;
1402 }
1403}
1404
1405impl SourceScope {
1406 pub fn lint_root(
1410 self,
1411 source_scopes: &IndexSlice<SourceScope, SourceScopeData<'_>>,
1412 ) -> Option<HirId> {
1413 let mut data = &source_scopes[self];
1414 while data.inlined.is_some() {
1417 {
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/mir/mod.rs:1417",
"rustc_middle::mir", ::tracing::Level::TRACE,
::tracing_core::__macro_support::Option::Some("compiler/rustc_middle/src/mir/mod.rs"),
::tracing_core::__macro_support::Option::Some(1417u32),
::tracing_core::__macro_support::Option::Some("rustc_middle::mir"),
::tracing_core::field::FieldSet::new(&["data"],
::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(&debug(&data) as
&dyn Value))])
});
} else { ; }
};trace!(?data);
1418 data = &source_scopes[data.parent_scope.unwrap()];
1419 }
1420 {
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/mir/mod.rs:1420",
"rustc_middle::mir", ::tracing::Level::TRACE,
::tracing_core::__macro_support::Option::Some("compiler/rustc_middle/src/mir/mod.rs"),
::tracing_core::__macro_support::Option::Some(1420u32),
::tracing_core::__macro_support::Option::Some("rustc_middle::mir"),
::tracing_core::field::FieldSet::new(&["data"],
::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(&debug(&data) as
&dyn Value))])
});
} else { ; }
};trace!(?data);
1421 match &data.local_data {
1422 ClearCrossCrate::Set(data) => Some(data.lint_root),
1423 ClearCrossCrate::Clear => None,
1424 }
1425 }
1426
1427 #[inline]
1429 pub fn inlined_instance<'tcx>(
1430 self,
1431 source_scopes: &IndexSlice<SourceScope, SourceScopeData<'tcx>>,
1432 ) -> Option<ty::Instance<'tcx>> {
1433 let scope_data = &source_scopes[self];
1434 if let Some((inlined_instance, _)) = scope_data.inlined {
1435 Some(inlined_instance)
1436 } else if let Some(inlined_scope) = scope_data.inlined_parent_scope {
1437 Some(source_scopes[inlined_scope].inlined.unwrap().0)
1438 } else {
1439 None
1440 }
1441 }
1442}
1443
1444#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for SourceScopeData<'tcx> {
#[inline]
fn clone(&self) -> SourceScopeData<'tcx> {
SourceScopeData {
span: ::core::clone::Clone::clone(&self.span),
parent_scope: ::core::clone::Clone::clone(&self.parent_scope),
inlined: ::core::clone::Clone::clone(&self.inlined),
inlined_parent_scope: ::core::clone::Clone::clone(&self.inlined_parent_scope),
local_data: ::core::clone::Clone::clone(&self.local_data),
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for SourceScopeData<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f,
"SourceScopeData", "span", &self.span, "parent_scope",
&self.parent_scope, "inlined", &self.inlined,
"inlined_parent_scope", &self.inlined_parent_scope, "local_data",
&&self.local_data)
}
}Debug, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for SourceScopeData<'tcx> {
fn encode(&self, __encoder: &mut __E) {
match *self {
SourceScopeData {
span: ref __binding_0,
parent_scope: ref __binding_1,
inlined: ref __binding_2,
inlined_parent_scope: ref __binding_3,
local_data: 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 SourceScopeData<'tcx> {
fn decode(__decoder: &mut __D) -> Self {
SourceScopeData {
span: ::rustc_serialize::Decodable::decode(__decoder),
parent_scope: ::rustc_serialize::Decodable::decode(__decoder),
inlined: ::rustc_serialize::Decodable::decode(__decoder),
inlined_parent_scope: ::rustc_serialize::Decodable::decode(__decoder),
local_data: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable, const _: () =
{
impl<'tcx, '__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for SourceScopeData<'tcx> {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
SourceScopeData {
span: ref __binding_0,
parent_scope: ref __binding_1,
inlined: ref __binding_2,
inlined_parent_scope: ref __binding_3,
local_data: 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>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for SourceScopeData<'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 {
SourceScopeData {
span: __binding_0,
parent_scope: __binding_1,
inlined: __binding_2,
inlined_parent_scope: __binding_3,
local_data: __binding_4 } => {
SourceScopeData {
span: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
parent_scope: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
__folder)?,
inlined: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_2,
__folder)?,
inlined_parent_scope: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_3,
__folder)?,
local_data: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_4,
__folder)?,
}
}
})
}
fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
__folder: &mut __F) -> Self {
match self {
SourceScopeData {
span: __binding_0,
parent_scope: __binding_1,
inlined: __binding_2,
inlined_parent_scope: __binding_3,
local_data: __binding_4 } => {
SourceScopeData {
span: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder),
parent_scope: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
__folder),
inlined: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_2,
__folder),
inlined_parent_scope: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_3,
__folder),
local_data: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_4,
__folder),
}
}
}
}
}
};TypeFoldable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for SourceScopeData<'tcx> {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
SourceScopeData {
span: ref __binding_0,
parent_scope: ref __binding_1,
inlined: ref __binding_2,
inlined_parent_scope: ref __binding_3,
local_data: ref __binding_4 } => {
{
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);
}
}
}
{
match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_2,
__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_3,
__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_4,
__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)]
1445pub struct SourceScopeData<'tcx> {
1446 pub span: Span,
1447 pub parent_scope: Option<SourceScope>,
1448
1449 pub inlined: Option<(ty::Instance<'tcx>, Span)>,
1453
1454 pub inlined_parent_scope: Option<SourceScope>,
1458
1459 pub local_data: ClearCrossCrate<SourceScopeLocalData>,
1462}
1463
1464#[derive(#[automatically_derived]
impl ::core::clone::Clone for SourceScopeLocalData {
#[inline]
fn clone(&self) -> SourceScopeLocalData {
SourceScopeLocalData {
lint_root: ::core::clone::Clone::clone(&self.lint_root),
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for SourceScopeLocalData {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f,
"SourceScopeLocalData", "lint_root", &&self.lint_root)
}
}Debug, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for SourceScopeLocalData {
fn encode(&self, __encoder: &mut __E) {
match *self {
SourceScopeLocalData { lint_root: 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 SourceScopeLocalData {
fn decode(__decoder: &mut __D) -> Self {
SourceScopeLocalData {
lint_root: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable, const _: () =
{
impl<'__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for SourceScopeLocalData {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
SourceScopeLocalData { lint_root: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
1465pub struct SourceScopeLocalData {
1466 pub lint_root: HirId,
1468}
1469
1470#[derive(#[automatically_derived]
impl ::core::clone::Clone for UserTypeProjections {
#[inline]
fn clone(&self) -> UserTypeProjections {
UserTypeProjections {
contents: ::core::clone::Clone::clone(&self.contents),
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for UserTypeProjections {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f,
"UserTypeProjections", "contents", &&self.contents)
}
}Debug, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for UserTypeProjections {
fn encode(&self, __encoder: &mut __E) {
match *self {
UserTypeProjections { contents: 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 UserTypeProjections {
fn decode(__decoder: &mut __D) -> Self {
UserTypeProjections {
contents: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable, const _: () =
{
impl<'__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for UserTypeProjections {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
UserTypeProjections { contents: ref __binding_0 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for UserTypeProjections {
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 {
UserTypeProjections { contents: __binding_0 } => {
UserTypeProjections {
contents: ::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 {
UserTypeProjections { contents: __binding_0 } => {
UserTypeProjections {
contents: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder),
}
}
}
}
}
};TypeFoldable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for UserTypeProjections {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
UserTypeProjections { contents: 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)]
1503pub struct UserTypeProjections {
1504 pub contents: Vec<UserTypeProjection>,
1505}
1506
1507impl UserTypeProjections {
1508 pub fn projections(&self) -> impl Iterator<Item = &UserTypeProjection> + ExactSizeIterator {
1509 self.contents.iter()
1510 }
1511}
1512
1513#[derive(#[automatically_derived]
impl ::core::clone::Clone for UserTypeProjection {
#[inline]
fn clone(&self) -> UserTypeProjection {
UserTypeProjection {
base: ::core::clone::Clone::clone(&self.base),
projs: ::core::clone::Clone::clone(&self.projs),
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for UserTypeProjection {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"UserTypeProjection", "base", &self.base, "projs", &&self.projs)
}
}Debug, const _: () =
{
impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
::rustc_serialize::Encodable<__E> for UserTypeProjection {
fn encode(&self, __encoder: &mut __E) {
match *self {
UserTypeProjection {
base: ref __binding_0, projs: 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 UserTypeProjection {
fn decode(__decoder: &mut __D) -> Self {
UserTypeProjection {
base: ::rustc_serialize::Decodable::decode(__decoder),
projs: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};TyDecodable, #[automatically_derived]
impl ::core::hash::Hash for UserTypeProjection {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.base, state);
::core::hash::Hash::hash(&self.projs, state)
}
}Hash, const _: () =
{
impl<'__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for UserTypeProjection {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
UserTypeProjection {
base: ref __binding_0, projs: ref __binding_1 } => {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable, #[automatically_derived]
impl ::core::cmp::PartialEq for UserTypeProjection {
#[inline]
fn eq(&self, other: &UserTypeProjection) -> bool {
self.base == other.base && self.projs == other.projs
}
}PartialEq)]
1529#[derive(const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
for UserTypeProjection {
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 {
UserTypeProjection { base: __binding_0, projs: __binding_1 }
=> {
UserTypeProjection {
base: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
__folder)?,
projs: ::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 {
UserTypeProjection { base: __binding_0, projs: __binding_1 }
=> {
UserTypeProjection {
base: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
__folder),
projs: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
__folder),
}
}
}
}
}
};TypeFoldable, const _: () =
{
impl<'tcx>
::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
for UserTypeProjection {
fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
__visitor: &mut __V) -> __V::Result {
match *self {
UserTypeProjection {
base: ref __binding_0, projs: 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)]
1530pub struct UserTypeProjection {
1531 pub base: UserTypeAnnotationIndex,
1532 pub projs: Vec<ProjectionKind>,
1533}
1534
1535impl ::std::fmt::Debug for Promoted {
fn fmt(&self, fmt: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
fmt.write_fmt(format_args!("promoted[{0}]", self.as_u32()))
}
}rustc_index::newtype_index! {
1536 #[stable_hash]
1537 #[encodable]
1538 #[orderable]
1539 #[debug_format = "promoted[{}]"]
1540 pub struct Promoted {}
1541}
1542
1543#[derive(#[automatically_derived]
impl ::core::marker::Copy for Location { }Copy, #[automatically_derived]
impl ::core::clone::Clone for Location {
#[inline]
fn clone(&self) -> Location {
let _: ::core::clone::AssertParamIsClone<BasicBlock>;
let _: ::core::clone::AssertParamIsClone<usize>;
*self
}
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for Location {
#[inline]
fn eq(&self, other: &Location) -> bool {
self.block == other.block &&
self.statement_index == other.statement_index
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Location {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<BasicBlock>;
let _: ::core::cmp::AssertParamIsEq<usize>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for Location {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.block, state);
::core::hash::Hash::hash(&self.statement_index, state)
}
}Hash, #[automatically_derived]
impl ::core::cmp::Ord for Location {
#[inline]
fn cmp(&self, other: &Location) -> ::core::cmp::Ordering {
match ::core::cmp::Ord::cmp(&self.block, &other.block) {
::core::cmp::Ordering::Equal =>
::core::cmp::Ord::cmp(&self.statement_index,
&other.statement_index),
cmp => cmp,
}
}
}Ord, #[automatically_derived]
impl ::core::cmp::PartialOrd for Location {
#[inline]
fn partial_cmp(&self, other: &Location)
-> ::core::option::Option<::core::cmp::Ordering> {
match ::core::cmp::PartialOrd::partial_cmp(&self.block, &other.block)
{
::core::option::Option::Some(::core::cmp::Ordering::Equal) =>
::core::cmp::PartialOrd::partial_cmp(&self.statement_index,
&other.statement_index),
cmp => cmp,
}
}
}PartialOrd, const _: () =
{
impl<'__ctx>
::rustc_data_structures::stable_hasher::HashStable<::rustc_middle::ich::StableHashingContext<'__ctx>>
for Location {
#[inline]
fn hash_stable(&self,
__hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>,
__hasher:
&mut ::rustc_data_structures::stable_hasher::StableHasher) {
match *self {
Location {
block: ref __binding_0, statement_index: ref __binding_1 }
=> {
{ __binding_0.hash_stable(__hcx, __hasher); }
{ __binding_1.hash_stable(__hcx, __hasher); }
}
}
}
}
};HashStable)]
1547pub struct Location {
1548 pub block: BasicBlock,
1550
1551 pub statement_index: usize,
1552}
1553
1554impl fmt::Debug for Location {
1555 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
1556 fmt.write_fmt(format_args!("{0:?}[{1}]", self.block, self.statement_index))write!(fmt, "{:?}[{}]", self.block, self.statement_index)
1557 }
1558}
1559
1560impl Location {
1561 pub const START: Location = Location { block: START_BLOCK, statement_index: 0 };
1562
1563 #[inline]
1568 pub fn successor_within_block(&self) -> Location {
1569 Location { block: self.block, statement_index: self.statement_index + 1 }
1570 }
1571
1572 pub fn is_predecessor_of<'tcx>(&self, other: Location, body: &Body<'tcx>) -> bool {
1574 if self.block == other.block && self.statement_index < other.statement_index {
1577 return true;
1578 }
1579
1580 let predecessors = body.basic_blocks.predecessors();
1581
1582 let mut queue: Vec<BasicBlock> = predecessors[other.block].to_vec();
1584 let mut visited = FxHashSet::default();
1585
1586 while let Some(block) = queue.pop() {
1587 if visited.insert(block) {
1589 queue.extend(predecessors[block].iter().cloned());
1590 } else {
1591 continue;
1592 }
1593
1594 if self.block == block {
1597 return true;
1598 }
1599 }
1600
1601 false
1602 }
1603
1604 #[inline]
1605 pub fn dominates(&self, other: Location, dominators: &Dominators<BasicBlock>) -> bool {
1606 if self.block == other.block {
1607 self.statement_index <= other.statement_index
1608 } else {
1609 dominators.dominates(self.block, other.block)
1610 }
1611 }
1612}
1613
1614#[derive(#[automatically_derived]
impl ::core::marker::Copy for DefLocation { }Copy, #[automatically_derived]
impl ::core::clone::Clone for DefLocation {
#[inline]
fn clone(&self) -> DefLocation {
let _: ::core::clone::AssertParamIsClone<Location>;
let _: ::core::clone::AssertParamIsClone<BasicBlock>;
let _: ::core::clone::AssertParamIsClone<Option<BasicBlock>>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for DefLocation {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
DefLocation::Argument =>
::core::fmt::Formatter::write_str(f, "Argument"),
DefLocation::Assignment(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Assignment", &__self_0),
DefLocation::CallReturn { call: __self_0, target: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"CallReturn", "call", __self_0, "target", &__self_1),
}
}
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for DefLocation {
#[inline]
fn eq(&self, other: &DefLocation) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(DefLocation::Assignment(__self_0),
DefLocation::Assignment(__arg1_0)) => __self_0 == __arg1_0,
(DefLocation::CallReturn { call: __self_0, target: __self_1 },
DefLocation::CallReturn { call: __arg1_0, target: __arg1_1
}) => __self_0 == __arg1_0 && __self_1 == __arg1_1,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for DefLocation {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<Location>;
let _: ::core::cmp::AssertParamIsEq<BasicBlock>;
let _: ::core::cmp::AssertParamIsEq<Option<BasicBlock>>;
}
}Eq)]
1617pub enum DefLocation {
1618 Argument,
1619 Assignment(Location),
1620 CallReturn { call: BasicBlock, target: Option<BasicBlock> },
1621}
1622
1623impl DefLocation {
1624 #[inline]
1625 pub fn dominates(self, location: Location, dominators: &Dominators<BasicBlock>) -> bool {
1626 match self {
1627 DefLocation::Argument => true,
1628 DefLocation::Assignment(def) => {
1629 def.successor_within_block().dominates(location, dominators)
1630 }
1631 DefLocation::CallReturn { target: None, .. } => false,
1632 DefLocation::CallReturn { call, target: Some(target) } => {
1633 call != target
1640 && dominators.dominates(call, target)
1641 && dominators.dominates(target, location.block)
1642 }
1643 }
1644 }
1645}
1646
1647pub fn find_self_call<'tcx>(
1651 tcx: TyCtxt<'tcx>,
1652 body: &Body<'tcx>,
1653 local: Local,
1654 block: BasicBlock,
1655) -> Option<(DefId, GenericArgsRef<'tcx>)> {
1656 {
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/mir/mod.rs:1656",
"rustc_middle::mir", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_middle/src/mir/mod.rs"),
::tracing_core::__macro_support::Option::Some(1656u32),
::tracing_core::__macro_support::Option::Some("rustc_middle::mir"),
::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!("find_self_call(local={0:?}): terminator={1:?}",
local, body[block].terminator) as &dyn Value))])
});
} else { ; }
};debug!("find_self_call(local={:?}): terminator={:?}", local, body[block].terminator);
1657 if let Some(Terminator { kind: TerminatorKind::Call { func, args, .. }, .. }) =
1658 &body[block].terminator
1659 && let Operand::Constant(box ConstOperand { const_, .. }) = func
1660 && let ty::FnDef(def_id, fn_args) = *const_.ty().kind()
1661 && let Some(item) = tcx.opt_associated_item(def_id)
1662 && item.is_method()
1663 && let [Spanned { node: Operand::Move(self_place) | Operand::Copy(self_place), .. }, ..] =
1664 **args
1665 {
1666 if self_place.as_local() == Some(local) {
1667 return Some((def_id, fn_args));
1668 }
1669
1670 for stmt in &body[block].statements {
1673 if let StatementKind::Assign(box (place, rvalue)) = &stmt.kind
1674 && let Some(reborrow_local) = place.as_local()
1675 && self_place.as_local() == Some(reborrow_local)
1676 && let Rvalue::Ref(_, _, deref_place) = rvalue
1677 && let PlaceRef { local: deref_local, projection: [ProjectionElem::Deref] } =
1678 deref_place.as_ref()
1679 && deref_local == local
1680 {
1681 return Some((def_id, fn_args));
1682 }
1683 }
1684 }
1685 None
1686}
1687
1688#[cfg(target_pointer_width = "64")]
1690mod size_asserts {
1691 use rustc_data_structures::static_assert_size;
1692
1693 use super::*;
1694 const _: [(); 152] = [(); ::std::mem::size_of::<BasicBlockData<'_>>()];static_assert_size!(BasicBlockData<'_>, 152);
1696 const _: [(); 40] = [(); ::std::mem::size_of::<LocalDecl<'_>>()];static_assert_size!(LocalDecl<'_>, 40);
1697 const _: [(); 64] = [(); ::std::mem::size_of::<SourceScopeData<'_>>()];static_assert_size!(SourceScopeData<'_>, 64);
1698 const _: [(); 56] = [(); ::std::mem::size_of::<Statement<'_>>()];static_assert_size!(Statement<'_>, 56);
1699 const _: [(); 96] = [(); ::std::mem::size_of::<Terminator<'_>>()];static_assert_size!(Terminator<'_>, 96);
1700 const _: [(); 88] = [(); ::std::mem::size_of::<VarDebugInfo<'_>>()];static_assert_size!(VarDebugInfo<'_>, 88);
1701 }