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::{DiagArgName, DiagArgValue, DiagMessage, ErrorGuaranteed, IntoDiagArg};
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 mono;
47pub mod pretty;
48mod query;
49mod statement;
50mod syntax;
51mod terminator;
52
53pub mod loops;
54pub mod traversal;
55pub mod visit;
56
57pub use consts::*;
58use pretty::pretty_print_const_value;
59pub use statement::*;
60pub use syntax::*;
61pub use terminator::*;
62
63pub use self::generic_graph::graphviz_safe_def_name;
64pub use self::graphviz::write_mir_graphviz;
65pub use self::pretty::{MirDumper, PassWhere, display_allocation, write_mir_pretty};
66
67pub type LocalDecls<'tcx> = IndexSlice<Local, LocalDecl<'tcx>>;
69
70pub trait HasLocalDecls<'tcx> {
71 fn local_decls(&self) -> &LocalDecls<'tcx>;
72}
73
74impl<'tcx> HasLocalDecls<'tcx> for IndexVec<Local, LocalDecl<'tcx>> {
75 #[inline]
76 fn local_decls(&self) -> &LocalDecls<'tcx> {
77 self
78 }
79}
80
81impl<'tcx> HasLocalDecls<'tcx> for LocalDecls<'tcx> {
82 #[inline]
83 fn local_decls(&self) -> &LocalDecls<'tcx> {
84 self
85 }
86}
87
88impl<'tcx> HasLocalDecls<'tcx> for Body<'tcx> {
89 #[inline]
90 fn local_decls(&self) -> &LocalDecls<'tcx> {
91 &self.local_decls
92 }
93}
94
95impl MirPhase {
96 pub fn name(&self) -> &'static str {
97 match *self {
98 MirPhase::Built => "built",
99 MirPhase::Analysis(AnalysisPhase::Initial) => "analysis",
100 MirPhase::Analysis(AnalysisPhase::PostCleanup) => "analysis-post-cleanup",
101 MirPhase::Runtime(RuntimePhase::Initial) => "runtime",
102 MirPhase::Runtime(RuntimePhase::PostCleanup) => "runtime-post-cleanup",
103 MirPhase::Runtime(RuntimePhase::Optimized) => "runtime-optimized",
104 }
105 }
106
107 pub fn index(&self) -> (usize, usize) {
110 match *self {
111 MirPhase::Built => (1, 1),
112 MirPhase::Analysis(analysis_phase) => (2, 1 + analysis_phase as usize),
113 MirPhase::Runtime(runtime_phase) => (3, 1 + runtime_phase as usize),
114 }
115 }
116}
117
118#[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)]
120#[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)]
121pub struct MirSource<'tcx> {
122 pub instance: InstanceKind<'tcx>,
123
124 pub promoted: Option<Promoted>,
126}
127
128impl<'tcx> MirSource<'tcx> {
129 pub fn item(def_id: DefId) -> Self {
130 MirSource { instance: InstanceKind::Item(def_id), promoted: None }
131 }
132
133 pub fn from_instance(instance: InstanceKind<'tcx>) -> Self {
134 MirSource { instance, promoted: None }
135 }
136
137 #[inline]
138 pub fn def_id(&self) -> DefId {
139 self.instance.def_id()
140 }
141}
142
143#[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)]
149pub struct CoroutineInfo<'tcx> {
150 pub yield_ty: Option<Ty<'tcx>>,
152
153 pub resume_ty: Option<Ty<'tcx>>,
155
156 pub coroutine_drop: Option<Body<'tcx>>,
158
159 pub coroutine_drop_async: Option<Body<'tcx>>,
161
162 pub coroutine_drop_proxy_async: Option<Body<'tcx>>,
164
165 pub coroutine_layout: Option<CoroutineLayout<'tcx>>,
167
168 pub coroutine_kind: CoroutineKind,
171}
172
173impl<'tcx> CoroutineInfo<'tcx> {
174 pub fn initial(
176 coroutine_kind: CoroutineKind,
177 yield_ty: Ty<'tcx>,
178 resume_ty: Ty<'tcx>,
179 ) -> CoroutineInfo<'tcx> {
180 CoroutineInfo {
181 coroutine_kind,
182 yield_ty: Some(yield_ty),
183 resume_ty: Some(resume_ty),
184 coroutine_drop: None,
185 coroutine_drop_async: None,
186 coroutine_drop_proxy_async: None,
187 coroutine_layout: None,
188 }
189 }
190}
191
192#[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)]
194#[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)]
195pub enum MentionedItem<'tcx> {
196 Fn(Ty<'tcx>),
199 Drop(Ty<'tcx>),
201 UnsizeCast { source_ty: Ty<'tcx>, target_ty: Ty<'tcx> },
203 Closure(Ty<'tcx>),
205}
206
207#[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)]
209pub struct Body<'tcx> {
210 pub basic_blocks: BasicBlocks<'tcx>,
213
214 pub phase: MirPhase,
220
221 pub pass_count: usize,
223
224 pub source: MirSource<'tcx>,
225
226 pub source_scopes: IndexVec<SourceScope, SourceScopeData<'tcx>>,
229
230 pub coroutine: Option<Box<CoroutineInfo<'tcx>>>,
237
238 pub local_decls: IndexVec<Local, LocalDecl<'tcx>>,
244
245 pub user_type_annotations: ty::CanonicalUserTypeAnnotations<'tcx>,
247
248 pub arg_count: usize,
255
256 pub spread_arg: Option<Local>,
261
262 pub var_debug_info: Vec<VarDebugInfo<'tcx>>,
264
265 pub span: Span,
267
268 pub required_consts: Option<Vec<ConstOperand<'tcx>>>,
275
276 pub mentioned_items: Option<Vec<Spanned<MentionedItem<'tcx>>>>,
289
290 pub is_polymorphic: bool,
306
307 pub injection_phase: Option<MirPhase>,
313
314 pub tainted_by_errors: Option<ErrorGuaranteed>,
315
316 #[type_foldable(identity)]
322 #[type_visitable(ignore)]
323 pub coverage_info_hi: Option<Box<coverage::CoverageInfoHi>>,
324
325 #[type_foldable(identity)]
332 #[type_visitable(ignore)]
333 pub function_coverage_info: Option<Box<coverage::FunctionCoverageInfo>>,
334}
335
336impl<'tcx> Body<'tcx> {
337 pub fn new(
338 source: MirSource<'tcx>,
339 basic_blocks: IndexVec<BasicBlock, BasicBlockData<'tcx>>,
340 source_scopes: IndexVec<SourceScope, SourceScopeData<'tcx>>,
341 local_decls: IndexVec<Local, LocalDecl<'tcx>>,
342 user_type_annotations: ty::CanonicalUserTypeAnnotations<'tcx>,
343 arg_count: usize,
344 var_debug_info: Vec<VarDebugInfo<'tcx>>,
345 span: Span,
346 coroutine: Option<Box<CoroutineInfo<'tcx>>>,
347 tainted_by_errors: Option<ErrorGuaranteed>,
348 ) -> Self {
349 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!(
351 local_decls.len() > arg_count,
352 "expected at least {} locals, got {}",
353 arg_count + 1,
354 local_decls.len()
355 );
356
357 let mut body = Body {
358 phase: MirPhase::Built,
359 pass_count: 0,
360 source,
361 basic_blocks: BasicBlocks::new(basic_blocks),
362 source_scopes,
363 coroutine,
364 local_decls,
365 user_type_annotations,
366 arg_count,
367 spread_arg: None,
368 var_debug_info,
369 span,
370 required_consts: None,
371 mentioned_items: None,
372 is_polymorphic: false,
373 injection_phase: None,
374 tainted_by_errors,
375 coverage_info_hi: None,
376 function_coverage_info: None,
377 };
378 body.is_polymorphic = body.has_non_region_param();
379 body
380 }
381
382 pub fn new_cfg_only(basic_blocks: IndexVec<BasicBlock, BasicBlockData<'tcx>>) -> Self {
388 let mut body = Body {
389 phase: MirPhase::Built,
390 pass_count: 0,
391 source: MirSource::item(CRATE_DEF_ID.to_def_id()),
392 basic_blocks: BasicBlocks::new(basic_blocks),
393 source_scopes: IndexVec::new(),
394 coroutine: None,
395 local_decls: IndexVec::new(),
396 user_type_annotations: IndexVec::new(),
397 arg_count: 0,
398 spread_arg: None,
399 span: DUMMY_SP,
400 required_consts: None,
401 mentioned_items: None,
402 var_debug_info: Vec::new(),
403 is_polymorphic: false,
404 injection_phase: None,
405 tainted_by_errors: None,
406 coverage_info_hi: None,
407 function_coverage_info: None,
408 };
409 body.is_polymorphic = body.has_non_region_param();
410 body
411 }
412
413 #[inline]
414 pub fn basic_blocks_mut(&mut self) -> &mut IndexVec<BasicBlock, BasicBlockData<'tcx>> {
415 self.basic_blocks.as_mut()
416 }
417
418 pub fn typing_env(&self, tcx: TyCtxt<'tcx>) -> TypingEnv<'tcx> {
419 match self.phase {
420 MirPhase::Built | MirPhase::Analysis(_) => TypingEnv {
422 typing_mode: ty::TypingMode::non_body_analysis(),
423 param_env: tcx.param_env(self.source.def_id()),
424 },
425 MirPhase::Runtime(_) => TypingEnv::post_analysis(tcx, self.source.def_id()),
426 }
427 }
428
429 #[inline]
430 pub fn local_kind(&self, local: Local) -> LocalKind {
431 let index = local.as_usize();
432 if index == 0 {
433 if true {
if !(self.local_decls[local].mutability == Mutability::Mut) {
{
::core::panicking::panic_fmt(format_args!("return place should be mutable"));
}
};
};debug_assert!(
434 self.local_decls[local].mutability == Mutability::Mut,
435 "return place should be mutable"
436 );
437
438 LocalKind::ReturnPointer
439 } else if index < self.arg_count + 1 {
440 LocalKind::Arg
441 } else {
442 LocalKind::Temp
443 }
444 }
445
446 #[inline]
448 pub fn mut_vars_iter(&self) -> impl Iterator<Item = Local> {
449 (self.arg_count + 1..self.local_decls.len()).filter_map(move |index| {
450 let local = Local::new(index);
451 let decl = &self.local_decls[local];
452 (decl.is_user_variable() && decl.mutability.is_mut()).then_some(local)
453 })
454 }
455
456 #[inline]
458 pub fn mut_vars_and_args_iter(&self) -> impl Iterator<Item = Local> {
459 (1..self.local_decls.len()).filter_map(move |index| {
460 let local = Local::new(index);
461 let decl = &self.local_decls[local];
462 if (decl.is_user_variable() || index < self.arg_count + 1)
463 && decl.mutability == Mutability::Mut
464 {
465 Some(local)
466 } else {
467 None
468 }
469 })
470 }
471
472 #[inline]
474 pub fn args_iter(&self) -> impl Iterator<Item = Local> + ExactSizeIterator + use<> {
475 (1..self.arg_count + 1).map(Local::new)
476 }
477
478 #[inline]
481 pub fn vars_and_temps_iter(
482 &self,
483 ) -> impl DoubleEndedIterator<Item = Local> + ExactSizeIterator {
484 (self.arg_count + 1..self.local_decls.len()).map(Local::new)
485 }
486
487 #[inline]
488 pub fn drain_vars_and_temps(&mut self) -> impl Iterator<Item = LocalDecl<'tcx>> {
489 self.local_decls.drain(self.arg_count + 1..)
490 }
491
492 pub fn source_info(&self, location: Location) -> &SourceInfo {
494 let block = &self[location.block];
495 let stmts = &block.statements;
496 let idx = location.statement_index;
497 if idx < stmts.len() {
498 &stmts[idx].source_info
499 } else {
500 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());
501 &block.terminator().source_info
502 }
503 }
504
505 #[inline]
507 pub fn return_ty(&self) -> Ty<'tcx> {
508 self.local_decls[RETURN_PLACE].ty
509 }
510
511 #[inline]
513 pub fn bound_return_ty(&self) -> ty::EarlyBinder<'tcx, Ty<'tcx>> {
514 ty::EarlyBinder::bind(self.local_decls[RETURN_PLACE].ty)
515 }
516
517 #[inline]
519 pub fn terminator_loc(&self, bb: BasicBlock) -> Location {
520 Location { block: bb, statement_index: self[bb].statements.len() }
521 }
522
523 pub fn stmt_at(&self, location: Location) -> Either<&Statement<'tcx>, &Terminator<'tcx>> {
524 let Location { block, statement_index } = location;
525 let block_data = &self.basic_blocks[block];
526 block_data
527 .statements
528 .get(statement_index)
529 .map(Either::Left)
530 .unwrap_or_else(|| Either::Right(block_data.terminator()))
531 }
532
533 #[inline]
534 pub fn yield_ty(&self) -> Option<Ty<'tcx>> {
535 self.coroutine.as_ref().and_then(|coroutine| coroutine.yield_ty)
536 }
537
538 #[inline]
539 pub fn resume_ty(&self) -> Option<Ty<'tcx>> {
540 self.coroutine.as_ref().and_then(|coroutine| coroutine.resume_ty)
541 }
542
543 #[inline]
545 pub fn coroutine_layout_raw(&self) -> Option<&CoroutineLayout<'tcx>> {
546 self.coroutine.as_ref().and_then(|coroutine| coroutine.coroutine_layout.as_ref())
547 }
548
549 #[inline]
550 pub fn coroutine_drop(&self) -> Option<&Body<'tcx>> {
551 self.coroutine.as_ref().and_then(|coroutine| coroutine.coroutine_drop.as_ref())
552 }
553
554 #[inline]
555 pub fn coroutine_drop_async(&self) -> Option<&Body<'tcx>> {
556 self.coroutine.as_ref().and_then(|coroutine| coroutine.coroutine_drop_async.as_ref())
557 }
558
559 #[inline]
560 pub fn coroutine_requires_async_drop(&self) -> bool {
561 self.coroutine_drop_async().is_some()
562 }
563
564 #[inline]
565 pub fn future_drop_poll(&self) -> Option<&Body<'tcx>> {
566 self.coroutine.as_ref().and_then(|coroutine| {
567 coroutine
568 .coroutine_drop_async
569 .as_ref()
570 .or(coroutine.coroutine_drop_proxy_async.as_ref())
571 })
572 }
573
574 #[inline]
575 pub fn coroutine_kind(&self) -> Option<CoroutineKind> {
576 self.coroutine.as_ref().map(|coroutine| coroutine.coroutine_kind)
577 }
578
579 #[inline]
580 pub fn should_skip(&self) -> bool {
581 let Some(injection_phase) = self.injection_phase else {
582 return false;
583 };
584 injection_phase > self.phase
585 }
586
587 #[inline]
588 pub fn is_custom_mir(&self) -> bool {
589 self.injection_phase.is_some()
590 }
591
592 fn try_const_mono_switchint<'a>(
596 tcx: TyCtxt<'tcx>,
597 instance: Instance<'tcx>,
598 block: &'a BasicBlockData<'tcx>,
599 ) -> Option<(u128, &'a SwitchTargets)> {
600 let eval_mono_const = |constant: &ConstOperand<'tcx>| {
602 let typing_env = ty::TypingEnv::fully_monomorphized();
604 let mono_literal = instance.instantiate_mir_and_normalize_erasing_regions(
605 tcx,
606 typing_env,
607 crate::ty::EarlyBinder::bind(constant.const_),
608 );
609 mono_literal.try_eval_bits(tcx, typing_env)
610 };
611
612 let TerminatorKind::SwitchInt { discr, targets } = &block.terminator().kind else {
613 return None;
614 };
615
616 let discr = match discr {
618 Operand::Constant(constant) => {
619 let bits = eval_mono_const(constant)?;
620 return Some((bits, targets));
621 }
622 Operand::RuntimeChecks(check) => {
623 let bits = check.value(tcx.sess) as u128;
624 return Some((bits, targets));
625 }
626 Operand::Move(place) | Operand::Copy(place) => place,
627 };
628
629 let last_stmt = block.statements.iter().rev().find(|stmt| {
645 !#[allow(non_exhaustive_omitted_patterns)] match stmt.kind {
StatementKind::StorageDead(_) | StatementKind::StorageLive(_) => true,
_ => false,
}matches!(stmt.kind, StatementKind::StorageDead(_) | StatementKind::StorageLive(_))
646 })?;
647
648 let (place, rvalue) = last_stmt.kind.as_assign()?;
649
650 if discr != place {
651 return None;
652 }
653
654 match rvalue {
655 Rvalue::Use(Operand::Constant(constant)) => {
656 let bits = eval_mono_const(constant)?;
657 Some((bits, targets))
658 }
659 _ => None,
660 }
661 }
662
663 pub fn caller_location_span<T>(
668 &self,
669 mut source_info: SourceInfo,
670 caller_location: Option<T>,
671 tcx: TyCtxt<'tcx>,
672 from_span: impl FnOnce(Span) -> T,
673 ) -> T {
674 loop {
675 let scope_data = &self.source_scopes[source_info.scope];
676
677 if let Some((callee, callsite_span)) = scope_data.inlined {
678 if !callee.def.requires_caller_location(tcx) {
681 return from_span(source_info.span);
682 }
683 source_info.span = callsite_span;
684 }
685
686 match scope_data.inlined_parent_scope {
688 Some(parent) => source_info.scope = parent,
689 None => break,
690 }
691 }
692
693 caller_location.unwrap_or_else(|| from_span(source_info.span))
695 }
696
697 #[track_caller]
698 pub fn set_required_consts(&mut self, required_consts: Vec<ConstOperand<'tcx>>) {
699 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!(
700 self.required_consts.is_none(),
701 "required_consts for {:?} have already been set",
702 self.source.def_id()
703 );
704 self.required_consts = Some(required_consts);
705 }
706 #[track_caller]
707 pub fn required_consts(&self) -> &[ConstOperand<'tcx>] {
708 match &self.required_consts {
709 Some(l) => l,
710 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()),
711 }
712 }
713
714 #[track_caller]
715 pub fn set_mentioned_items(&mut self, mentioned_items: Vec<Spanned<MentionedItem<'tcx>>>) {
716 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!(
717 self.mentioned_items.is_none(),
718 "mentioned_items for {:?} have already been set",
719 self.source.def_id()
720 );
721 self.mentioned_items = Some(mentioned_items);
722 }
723 #[track_caller]
724 pub fn mentioned_items(&self) -> &[Spanned<MentionedItem<'tcx>>] {
725 match &self.mentioned_items {
726 Some(l) => l,
727 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()),
728 }
729 }
730}
731
732impl<'tcx> Index<BasicBlock> for Body<'tcx> {
733 type Output = BasicBlockData<'tcx>;
734
735 #[inline]
736 fn index(&self, index: BasicBlock) -> &BasicBlockData<'tcx> {
737 &self.basic_blocks[index]
738 }
739}
740
741impl<'tcx> IndexMut<BasicBlock> for Body<'tcx> {
742 #[inline]
743 fn index_mut(&mut self, index: BasicBlock) -> &mut BasicBlockData<'tcx> {
744 &mut self.basic_blocks.as_mut()[index]
745 }
746}
747
748#[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)]
749pub enum ClearCrossCrate<T> {
750 Clear,
751 Set(T),
752}
753
754impl<T> ClearCrossCrate<T> {
755 pub fn as_ref(&self) -> ClearCrossCrate<&T> {
756 match self {
757 ClearCrossCrate::Clear => ClearCrossCrate::Clear,
758 ClearCrossCrate::Set(v) => ClearCrossCrate::Set(v),
759 }
760 }
761
762 pub fn as_mut(&mut self) -> ClearCrossCrate<&mut T> {
763 match self {
764 ClearCrossCrate::Clear => ClearCrossCrate::Clear,
765 ClearCrossCrate::Set(v) => ClearCrossCrate::Set(v),
766 }
767 }
768
769 pub fn unwrap_crate_local(self) -> T {
770 match self {
771 ClearCrossCrate::Clear => crate::util::bug::bug_fmt(format_args!("unwrapping cross-crate data"))bug!("unwrapping cross-crate data"),
772 ClearCrossCrate::Set(v) => v,
773 }
774 }
775}
776
777const TAG_CLEAR_CROSS_CRATE_CLEAR: u8 = 0;
778const TAG_CLEAR_CROSS_CRATE_SET: u8 = 1;
779
780impl<'tcx, E: TyEncoder<'tcx>, T: Encodable<E>> Encodable<E> for ClearCrossCrate<T> {
781 #[inline]
782 fn encode(&self, e: &mut E) {
783 if E::CLEAR_CROSS_CRATE {
784 return;
785 }
786
787 match *self {
788 ClearCrossCrate::Clear => TAG_CLEAR_CROSS_CRATE_CLEAR.encode(e),
789 ClearCrossCrate::Set(ref val) => {
790 TAG_CLEAR_CROSS_CRATE_SET.encode(e);
791 val.encode(e);
792 }
793 }
794 }
795}
796impl<'tcx, D: TyDecoder<'tcx>, T: Decodable<D>> Decodable<D> for ClearCrossCrate<T> {
797 #[inline]
798 fn decode(d: &mut D) -> ClearCrossCrate<T> {
799 if D::CLEAR_CROSS_CRATE {
800 return ClearCrossCrate::Clear;
801 }
802
803 let discr = u8::decode(d);
804
805 match discr {
806 TAG_CLEAR_CROSS_CRATE_CLEAR => ClearCrossCrate::Clear,
807 TAG_CLEAR_CROSS_CRATE_SET => {
808 let val = T::decode(d);
809 ClearCrossCrate::Set(val)
810 }
811 tag => {
::core::panicking::panic_fmt(format_args!("Invalid tag for ClearCrossCrate: {0:?}",
tag));
}panic!("Invalid tag for ClearCrossCrate: {tag:?}"),
812 }
813 }
814}
815
816#[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)]
822pub struct SourceInfo {
823 pub span: Span,
825
826 pub scope: SourceScope,
829}
830
831impl SourceInfo {
832 #[inline]
833 pub fn outermost(span: Span) -> Self {
834 SourceInfo { span, scope: OUTERMOST_SOURCE_SCOPE }
835 }
836}
837
838impl ::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! {
842 #[derive(HashStable)]
843 #[encodable]
844 #[orderable]
845 #[debug_format = "_{}"]
846 pub struct Local {
847 const RETURN_PLACE = 0;
848 }
849}
850
851impl Atom for Local {
852 fn index(self) -> usize {
853 Idx::index(self)
854 }
855}
856
857#[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)]
859pub enum LocalKind {
860 Temp,
862 Arg,
864 ReturnPointer,
866}
867
868#[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)]
869pub struct VarBindingForm<'tcx> {
870 pub binding_mode: BindingMode,
872 pub opt_ty_info: Option<Span>,
879 pub opt_match_place: Option<(Option<Place<'tcx>>, Span)>,
886 pub pat_span: Span,
888 pub introductions: Vec<VarBindingIntroduction>,
891}
892
893#[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)]
894pub enum BindingForm<'tcx> {
895 Var(VarBindingForm<'tcx>),
897 ImplicitSelf(ImplicitSelfKind),
899 RefForGuard(Local),
901}
902
903#[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)]
904pub struct VarBindingIntroduction {
905 pub span: Span,
907 pub is_shorthand: bool,
909}
910
911#[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)]
920pub struct BlockTailInfo {
921 pub tail_result_is_ignored: bool,
927
928 pub span: Span,
930}
931
932#[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)]
937pub struct LocalDecl<'tcx> {
938 pub mutability: Mutability,
942
943 pub local_info: ClearCrossCrate<Box<LocalInfo<'tcx>>>,
944
945 pub ty: Ty<'tcx>,
947
948 pub user_ty: Option<Box<UserTypeProjections>>,
953
954 pub source_info: SourceInfo,
1035}
1036
1037#[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)]
1044pub enum LocalInfo<'tcx> {
1045 User(BindingForm<'tcx>),
1051 StaticRef { def_id: DefId, is_thread_local: bool },
1053 ConstRef { def_id: DefId },
1055 AggregateTemp,
1058 BlockTailTemp(BlockTailInfo),
1061 IfThenRescopeTemp { if_then: HirId },
1064 DerefTemp,
1070 FakeBorrow,
1072 Boring,
1074}
1075
1076impl<'tcx> LocalDecl<'tcx> {
1077 pub fn local_info(&self) -> &LocalInfo<'tcx> {
1078 self.local_info.as_ref().unwrap_crate_local()
1079 }
1080
1081 pub fn can_be_made_mutable(&self) -> bool {
1088 #[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!(
1089 self.local_info(),
1090 LocalInfo::User(
1091 BindingForm::Var(VarBindingForm { binding_mode: BindingMode(ByRef::No, _), .. })
1092 | BindingForm::ImplicitSelf(ImplicitSelfKind::Imm),
1093 )
1094 )
1095 }
1096
1097 pub fn is_nonref_binding(&self) -> bool {
1101 #[allow(non_exhaustive_omitted_patterns)] match self.local_info() {
LocalInfo::User(BindingForm::Var(VarBindingForm {
binding_mode: BindingMode(ByRef::No, _), .. }) |
BindingForm::ImplicitSelf(_)) => true,
_ => false,
}matches!(
1102 self.local_info(),
1103 LocalInfo::User(
1104 BindingForm::Var(VarBindingForm { binding_mode: BindingMode(ByRef::No, _), .. })
1105 | BindingForm::ImplicitSelf(_),
1106 )
1107 )
1108 }
1109
1110 #[inline]
1113 pub fn is_user_variable(&self) -> bool {
1114 #[allow(non_exhaustive_omitted_patterns)] match self.local_info() {
LocalInfo::User(_) => true,
_ => false,
}matches!(self.local_info(), LocalInfo::User(_))
1115 }
1116
1117 pub fn is_ref_for_guard(&self) -> bool {
1121 #[allow(non_exhaustive_omitted_patterns)] match self.local_info() {
LocalInfo::User(BindingForm::RefForGuard(_)) => true,
_ => false,
}matches!(self.local_info(), LocalInfo::User(BindingForm::RefForGuard(_)))
1122 }
1123
1124 pub fn is_ref_to_static(&self) -> bool {
1127 #[allow(non_exhaustive_omitted_patterns)] match self.local_info() {
LocalInfo::StaticRef { .. } => true,
_ => false,
}matches!(self.local_info(), LocalInfo::StaticRef { .. })
1128 }
1129
1130 pub fn is_ref_to_thread_local(&self) -> bool {
1133 match self.local_info() {
1134 LocalInfo::StaticRef { is_thread_local, .. } => *is_thread_local,
1135 _ => false,
1136 }
1137 }
1138
1139 pub fn is_deref_temp(&self) -> bool {
1141 match self.local_info() {
1142 LocalInfo::DerefTemp => true,
1143 _ => false,
1144 }
1145 }
1146
1147 #[inline]
1150 pub fn from_compiler_desugaring(&self) -> bool {
1151 self.source_info.span.desugaring_kind().is_some()
1152 }
1153
1154 #[inline]
1156 pub fn new(ty: Ty<'tcx>, span: Span) -> Self {
1157 Self::with_source_info(ty, SourceInfo::outermost(span))
1158 }
1159
1160 #[inline]
1162 pub fn with_source_info(ty: Ty<'tcx>, source_info: SourceInfo) -> Self {
1163 LocalDecl {
1164 mutability: Mutability::Mut,
1165 local_info: ClearCrossCrate::Set(Box::new(LocalInfo::Boring)),
1166 ty,
1167 user_ty: None,
1168 source_info,
1169 }
1170 }
1171
1172 #[inline]
1174 pub fn immutable(mut self) -> Self {
1175 self.mutability = Mutability::Not;
1176 self
1177 }
1178}
1179
1180#[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)]
1181pub enum VarDebugInfoContents<'tcx> {
1182 Place(Place<'tcx>),
1184 Const(ConstOperand<'tcx>),
1185}
1186
1187impl<'tcx> Debug for VarDebugInfoContents<'tcx> {
1188 fn fmt(&self, fmt: &mut Formatter<'_>) -> fmt::Result {
1189 match self {
1190 VarDebugInfoContents::Const(c) => fmt.write_fmt(format_args!("{0}", c))write!(fmt, "{c}"),
1191 VarDebugInfoContents::Place(p) => fmt.write_fmt(format_args!("{0:?}", p))write!(fmt, "{p:?}"),
1192 }
1193 }
1194}
1195
1196#[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)]
1197pub struct VarDebugInfoFragment<'tcx> {
1198 pub ty: Ty<'tcx>,
1201
1202 pub projection: Vec<PlaceElem<'tcx>>,
1212}
1213
1214#[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)]
1216pub struct VarDebugInfo<'tcx> {
1217 pub name: Symbol,
1218
1219 pub source_info: SourceInfo,
1223
1224 pub composite: Option<Box<VarDebugInfoFragment<'tcx>>>,
1230
1231 pub value: VarDebugInfoContents<'tcx>,
1233
1234 pub argument_index: Option<u16>,
1238}
1239
1240impl ::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! {
1244 #[derive(HashStable)]
1267 #[encodable]
1268 #[orderable]
1269 #[debug_format = "bb{}"]
1270 pub struct BasicBlock {
1271 const START_BLOCK = 0;
1272 }
1273}
1274
1275impl BasicBlock {
1276 pub fn start_location(self) -> Location {
1277 Location { block: self, statement_index: 0 }
1278 }
1279}
1280
1281#[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)]
1288#[non_exhaustive]
1289pub struct BasicBlockData<'tcx> {
1290 pub statements: Vec<Statement<'tcx>>,
1292
1293 pub after_last_stmt_debuginfos: StmtDebugInfos<'tcx>,
1296
1297 pub terminator: Option<Terminator<'tcx>>,
1306
1307 pub is_cleanup: bool,
1312}
1313
1314impl<'tcx> BasicBlockData<'tcx> {
1315 pub fn new(terminator: Option<Terminator<'tcx>>, is_cleanup: bool) -> BasicBlockData<'tcx> {
1316 BasicBlockData::new_stmts(Vec::new(), terminator, is_cleanup)
1317 }
1318
1319 pub fn new_stmts(
1320 statements: Vec<Statement<'tcx>>,
1321 terminator: Option<Terminator<'tcx>>,
1322 is_cleanup: bool,
1323 ) -> BasicBlockData<'tcx> {
1324 BasicBlockData {
1325 statements,
1326 after_last_stmt_debuginfos: StmtDebugInfos::default(),
1327 terminator,
1328 is_cleanup,
1329 }
1330 }
1331
1332 #[inline]
1337 pub fn terminator(&self) -> &Terminator<'tcx> {
1338 self.terminator.as_ref().expect("invalid terminator state")
1339 }
1340
1341 #[inline]
1342 pub fn terminator_mut(&mut self) -> &mut Terminator<'tcx> {
1343 self.terminator.as_mut().expect("invalid terminator state")
1344 }
1345
1346 #[inline]
1348 pub fn is_empty_unreachable(&self) -> bool {
1349 self.statements.is_empty() && #[allow(non_exhaustive_omitted_patterns)] match self.terminator().kind {
TerminatorKind::Unreachable => true,
_ => false,
}matches!(self.terminator().kind, TerminatorKind::Unreachable)
1350 }
1351
1352 pub fn mono_successors(&self, tcx: TyCtxt<'tcx>, instance: Instance<'tcx>) -> Successors<'_> {
1358 if let Some((bits, targets)) = Body::try_const_mono_switchint(tcx, instance, self) {
1359 targets.successors_for_value(bits)
1360 } else {
1361 self.terminator().successors()
1362 }
1363 }
1364
1365 pub fn retain_statements<F>(&mut self, mut f: F)
1366 where
1367 F: FnMut(&Statement<'tcx>) -> bool,
1368 {
1369 let mut debuginfos = StmtDebugInfos::default();
1372 self.statements.retain_mut(|stmt| {
1373 let retain = f(stmt);
1374 if retain {
1375 stmt.debuginfos.prepend(&mut debuginfos);
1376 } else {
1377 debuginfos.append(&mut stmt.debuginfos);
1378 }
1379 retain
1380 });
1381 self.after_last_stmt_debuginfos.prepend(&mut debuginfos);
1382 }
1383
1384 pub fn strip_nops(&mut self) {
1385 self.retain_statements(|stmt| !#[allow(non_exhaustive_omitted_patterns)] match stmt.kind {
StatementKind::Nop => true,
_ => false,
}matches!(stmt.kind, StatementKind::Nop))
1386 }
1387
1388 pub fn drop_debuginfo(&mut self) {
1389 self.after_last_stmt_debuginfos.drop_debuginfo();
1390 for stmt in self.statements.iter_mut() {
1391 stmt.debuginfos.drop_debuginfo();
1392 }
1393 }
1394}
1395
1396impl ::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! {
1400 #[derive(HashStable)]
1401 #[encodable]
1402 #[debug_format = "scope[{}]"]
1403 pub struct SourceScope {
1404 const OUTERMOST_SOURCE_SCOPE = 0;
1405 }
1406}
1407
1408impl SourceScope {
1409 pub fn lint_root(
1413 self,
1414 source_scopes: &IndexSlice<SourceScope, SourceScopeData<'_>>,
1415 ) -> Option<HirId> {
1416 let mut data = &source_scopes[self];
1417 while data.inlined.is_some() {
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 data = &source_scopes[data.parent_scope.unwrap()];
1422 }
1423 {
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:1423",
"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(1423u32),
::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);
1424 match &data.local_data {
1425 ClearCrossCrate::Set(data) => Some(data.lint_root),
1426 ClearCrossCrate::Clear => None,
1427 }
1428 }
1429
1430 #[inline]
1432 pub fn inlined_instance<'tcx>(
1433 self,
1434 source_scopes: &IndexSlice<SourceScope, SourceScopeData<'tcx>>,
1435 ) -> Option<ty::Instance<'tcx>> {
1436 let scope_data = &source_scopes[self];
1437 if let Some((inlined_instance, _)) = scope_data.inlined {
1438 Some(inlined_instance)
1439 } else if let Some(inlined_scope) = scope_data.inlined_parent_scope {
1440 Some(source_scopes[inlined_scope].inlined.unwrap().0)
1441 } else {
1442 None
1443 }
1444 }
1445}
1446
1447#[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)]
1448pub struct SourceScopeData<'tcx> {
1449 pub span: Span,
1450 pub parent_scope: Option<SourceScope>,
1451
1452 pub inlined: Option<(ty::Instance<'tcx>, Span)>,
1456
1457 pub inlined_parent_scope: Option<SourceScope>,
1461
1462 pub local_data: ClearCrossCrate<SourceScopeLocalData>,
1465}
1466
1467#[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)]
1468pub struct SourceScopeLocalData {
1469 pub lint_root: HirId,
1471}
1472
1473#[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)]
1506pub struct UserTypeProjections {
1507 pub contents: Vec<UserTypeProjection>,
1508}
1509
1510impl UserTypeProjections {
1511 pub fn projections(&self) -> impl Iterator<Item = &UserTypeProjection> + ExactSizeIterator {
1512 self.contents.iter()
1513 }
1514}
1515
1516#[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)]
1532#[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)]
1533pub struct UserTypeProjection {
1534 pub base: UserTypeAnnotationIndex,
1535 pub projs: Vec<ProjectionKind>,
1536}
1537
1538impl ::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! {
1539 #[derive(HashStable)]
1540 #[encodable]
1541 #[orderable]
1542 #[debug_format = "promoted[{}]"]
1543 pub struct Promoted {}
1544}
1545
1546#[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)]
1550pub struct Location {
1551 pub block: BasicBlock,
1553
1554 pub statement_index: usize,
1555}
1556
1557impl fmt::Debug for Location {
1558 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
1559 fmt.write_fmt(format_args!("{0:?}[{1}]", self.block, self.statement_index))write!(fmt, "{:?}[{}]", self.block, self.statement_index)
1560 }
1561}
1562
1563impl Location {
1564 pub const START: Location = Location { block: START_BLOCK, statement_index: 0 };
1565
1566 #[inline]
1571 pub fn successor_within_block(&self) -> Location {
1572 Location { block: self.block, statement_index: self.statement_index + 1 }
1573 }
1574
1575 pub fn is_predecessor_of<'tcx>(&self, other: Location, body: &Body<'tcx>) -> bool {
1577 if self.block == other.block && self.statement_index < other.statement_index {
1580 return true;
1581 }
1582
1583 let predecessors = body.basic_blocks.predecessors();
1584
1585 let mut queue: Vec<BasicBlock> = predecessors[other.block].to_vec();
1587 let mut visited = FxHashSet::default();
1588
1589 while let Some(block) = queue.pop() {
1590 if visited.insert(block) {
1592 queue.extend(predecessors[block].iter().cloned());
1593 } else {
1594 continue;
1595 }
1596
1597 if self.block == block {
1600 return true;
1601 }
1602 }
1603
1604 false
1605 }
1606
1607 #[inline]
1608 pub fn dominates(&self, other: Location, dominators: &Dominators<BasicBlock>) -> bool {
1609 if self.block == other.block {
1610 self.statement_index <= other.statement_index
1611 } else {
1612 dominators.dominates(self.block, other.block)
1613 }
1614 }
1615}
1616
1617#[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)]
1620pub enum DefLocation {
1621 Argument,
1622 Assignment(Location),
1623 CallReturn { call: BasicBlock, target: Option<BasicBlock> },
1624}
1625
1626impl DefLocation {
1627 #[inline]
1628 pub fn dominates(self, location: Location, dominators: &Dominators<BasicBlock>) -> bool {
1629 match self {
1630 DefLocation::Argument => true,
1631 DefLocation::Assignment(def) => {
1632 def.successor_within_block().dominates(location, dominators)
1633 }
1634 DefLocation::CallReturn { target: None, .. } => false,
1635 DefLocation::CallReturn { call, target: Some(target) } => {
1636 call != target
1643 && dominators.dominates(call, target)
1644 && dominators.dominates(target, location.block)
1645 }
1646 }
1647 }
1648}
1649
1650pub fn find_self_call<'tcx>(
1654 tcx: TyCtxt<'tcx>,
1655 body: &Body<'tcx>,
1656 local: Local,
1657 block: BasicBlock,
1658) -> Option<(DefId, GenericArgsRef<'tcx>)> {
1659 {
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:1659",
"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(1659u32),
::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);
1660 if let Some(Terminator { kind: TerminatorKind::Call { func, args, .. }, .. }) =
1661 &body[block].terminator
1662 && let Operand::Constant(box ConstOperand { const_, .. }) = func
1663 && let ty::FnDef(def_id, fn_args) = *const_.ty().kind()
1664 && let Some(item) = tcx.opt_associated_item(def_id)
1665 && item.is_method()
1666 && let [Spanned { node: Operand::Move(self_place) | Operand::Copy(self_place), .. }, ..] =
1667 **args
1668 {
1669 if self_place.as_local() == Some(local) {
1670 return Some((def_id, fn_args));
1671 }
1672
1673 for stmt in &body[block].statements {
1676 if let StatementKind::Assign(box (place, rvalue)) = &stmt.kind
1677 && let Some(reborrow_local) = place.as_local()
1678 && self_place.as_local() == Some(reborrow_local)
1679 && let Rvalue::Ref(_, _, deref_place) = rvalue
1680 && let PlaceRef { local: deref_local, projection: [ProjectionElem::Deref] } =
1681 deref_place.as_ref()
1682 && deref_local == local
1683 {
1684 return Some((def_id, fn_args));
1685 }
1686 }
1687 }
1688 None
1689}
1690
1691#[cfg(target_pointer_width = "64")]
1693mod size_asserts {
1694 use rustc_data_structures::static_assert_size;
1695
1696 use super::*;
1697 const _: [(); 152] = [(); ::std::mem::size_of::<BasicBlockData<'_>>()];static_assert_size!(BasicBlockData<'_>, 152);
1699 const _: [(); 40] = [(); ::std::mem::size_of::<LocalDecl<'_>>()];static_assert_size!(LocalDecl<'_>, 40);
1700 const _: [(); 64] = [(); ::std::mem::size_of::<SourceScopeData<'_>>()];static_assert_size!(SourceScopeData<'_>, 64);
1701 const _: [(); 56] = [(); ::std::mem::size_of::<Statement<'_>>()];static_assert_size!(Statement<'_>, 56);
1702 const _: [(); 96] = [(); ::std::mem::size_of::<Terminator<'_>>()];static_assert_size!(Terminator<'_>, 96);
1703 const _: [(); 88] = [(); ::std::mem::size_of::<VarDebugInfo<'_>>()];static_assert_size!(VarDebugInfo<'_>, 88);
1704 }