Skip to main content

rustc_middle/mir/
syntax.rs

1//! This defines the syntax of MIR, i.e., the set of available MIR operations, and other definitions
2//! closely related to MIR semantics.
3//! This is in a dedicated file so that changes to this file can be reviewed more carefully.
4//! The intention is that this file only contains datatype declarations, no code.
5
6use rustc_abi::{FieldIdx, VariantIdx};
7use rustc_ast::{InlineAsmOptions, InlineAsmTemplatePiece, Mutability};
8use rustc_attr_ir::UnrollAttr;
9use rustc_data_structures::packed::Pu128;
10use rustc_hir::CoroutineKind;
11use rustc_hir::def_id::DefId;
12use rustc_index::IndexVec;
13use rustc_macros::{StableHash, TyDecodable, TyEncodable, TypeFoldable, TypeVisitable};
14use rustc_span::def_id::LocalDefId;
15use rustc_span::{Span, Spanned, Symbol};
16use rustc_target::asm::InlineAsmRegOrRegClass;
17use smallvec::SmallVec;
18use thin_vec::ThinVec;
19
20use super::{BasicBlock, Const, Local, UserTypeProjection};
21use crate::mir::coverage::CoverageKind;
22use crate::ty::adjustment::PointerCoercion;
23use crate::ty::{self, GenericArgsRef, List, Region, Ty, UserTypeAnnotationIndex};
24
25/// Represents the "flavors" of MIR.
26///
27/// The MIR pipeline is structured into a few major dialects, with one or more phases within each
28/// dialect. A MIR flavor is identified by a dialect-phase pair. A single `MirPhase` value
29/// specifies such a pair. All flavors of MIR use the same data structure to represent the program.
30///
31/// Different MIR dialects have different semantics. (The differences between dialects are small,
32/// but they do exist.) The progression from one MIR dialect to the next is technically a lowering
33/// from one IR to another. In other words, a single well-formed [`Body`](crate::mir::Body) might
34/// have different semantic meaning and different behavior at runtime in the different dialects.
35/// The specific differences between dialects are described on the variants below.
36///
37/// Phases exist only to place restrictions on what language constructs are permitted in
38/// well-formed MIR, and subsequent phases mostly increase those restrictions. I.e. to convert MIR
39/// from one phase to the next might require removing/replacing certain MIR constructs.
40///
41/// When adding dialects or phases, remember to update [`MirPhase::index`].
42#[derive(#[automatically_derived]
impl ::core::marker::Copy for MirPhase { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for MirPhase { }
#[automatically_derived]
impl ::core::clone::Clone for MirPhase {
    #[inline]
    fn clone(&self) -> Self {
        let _: ::core::clone::AssertParamIsClone<AnalysisPhase>;
        let _: ::core::clone::AssertParamIsClone<RuntimePhase>;
        *self
    }
}Clone, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for MirPhase {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        MirPhase::Built => { 0usize }
                        MirPhase::Analysis(ref __binding_0) => { 1usize }
                        MirPhase::Runtime(ref __binding_0) => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    MirPhase::Built => {}
                    MirPhase::Analysis(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    MirPhase::Runtime(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 MirPhase {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { MirPhase::Built }
                    1usize => {
                        MirPhase::Analysis(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        MirPhase::Runtime(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `MirPhase`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable, #[automatically_derived]
impl ::core::fmt::Debug for MirPhase {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Self::Built => ::core::fmt::Formatter::write_str(f, "Built"),
            Self::Analysis(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Analysis", &__self_0),
            Self::Runtime(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Runtime", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for MirPhase { }
#[automatically_derived]
impl ::core::cmp::PartialEq for MirPhase {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Analysis(__self_0), Self::Analysis(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::Runtime(__self_0), Self::Runtime(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for MirPhase {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<AnalysisPhase>;
        let _: ::core::cmp::AssertParamIsEq<RuntimePhase>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for MirPhase {
    #[inline]
    fn partial_cmp(&self, other: &Self)
        -> ::core::option::Option<::core::cmp::Ordering> {
        ::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
    }
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for MirPhase {
    #[inline]
    fn cmp(&self, other: &Self) -> ::core::cmp::Ordering {
        match (self, other) {
            (Self::Analysis(__self_0), Self::Analysis(__arg1_0)) =>
                ::core::cmp::Ord::cmp(__self_0, __arg1_0),
            (Self::Runtime(__self_0), Self::Runtime(__arg1_0)) =>
                ::core::cmp::Ord::cmp(__self_0, __arg1_0),
            _ =>
                ::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
                    &::core::intrinsics::discriminant_value(other)),
        }
    }
}Ord)]
43#[derive(const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for MirPhase {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    MirPhase::Built => {}
                    MirPhase::Analysis(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    MirPhase::Runtime(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
44pub enum MirPhase {
45    /// The "built MIR" dialect, as generated by MIR building.
46    ///
47    /// The only things that operate on this dialect are unsafeck, the various MIR lints, and const
48    /// qualifs.
49    ///
50    /// This dialect has just the one (implicit) phase, which places few restrictions on what MIR
51    /// constructs are allowed.
52    Built,
53
54    /// The "analysis MIR" dialect, used for borrowck and friends.
55    ///
56    /// The only semantic difference between built MIR and analysis MIR relates to constant
57    /// promotion. In built MIR, sequences of statements that would generally be subject to
58    /// constant promotion are semantically constants, while in analysis MIR all constants are
59    /// explicit.
60    ///
61    /// The result of const promotion is available from the `mir_promoted` and `promoted_mir`
62    /// queries.
63    ///
64    /// The phases of this dialect are described in `AnalysisPhase`.
65    Analysis(AnalysisPhase),
66
67    /// The "runtime MIR" dialect, used for CTFE, optimizations, and codegen.
68    ///
69    /// The semantic differences between analysis MIR and runtime MIR are as follows.
70    ///
71    /// - Drops: In analysis MIR, `Drop` terminators represent *conditional* drops; roughly
72    ///   speaking, if dataflow analysis determines that the place being dropped is uninitialized,
73    ///   the drop will not be executed. The exact semantics of this aren't written down anywhere,
74    ///   which means they are essentially "what drop elaboration does." In runtime MIR, the drops
75    ///   are unconditional; when a `Drop` terminator is reached, if the type has drop glue that
76    ///   drop glue is always executed. This may be UB if the underlying place is not initialized.
77    /// - Packed drops: Places might in general be misaligned - in most cases this is UB, the
78    ///   exception is fields of packed structs. In analysis MIR, `Drop(P)` for a `P` that might be
79    ///   misaligned for this reason implicitly moves `P` to a temporary before dropping. Runtime
80    ///   MIR has no such rules, and dropping a misaligned place is simply UB.
81    /// - Async drops: after drop elaboration some drops may become async (`drop`, `async_fut` fields).
82    ///   StateTransform pass will expand those async drops or reset to sync.
83    /// - Unwinding: in analysis MIR, unwinding from a function which may not unwind aborts. In
84    ///   runtime MIR, this is UB.
85    /// - Coroutine bodies: In analysis MIR, locals may actually be behind a pointer that user code
86    ///   has access to. This occurs in coroutine bodies. Such locals do not behave like other
87    ///   locals, because they e.g. may be aliased in surprising ways. Runtime MIR has no such
88    ///   special locals. All coroutine bodies are lowered and so all places that look like locals
89    ///   really are locals.
90    ///
91    /// Also note that the lint pass which reports eg `200_u8 + 200_u8` as an error is run as a part
92    /// of analysis to runtime MIR lowering. To ensure lints are reported reliably, this means that
93    /// transformations that can suppress such errors should not run on analysis MIR.
94    ///
95    /// The phases of this dialect are described in `RuntimePhase`.
96    Runtime(RuntimePhase),
97}
98
99/// See [`MirPhase::Analysis`].
100#[derive(#[automatically_derived]
impl ::core::marker::Copy for AnalysisPhase { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for AnalysisPhase { }
#[automatically_derived]
impl ::core::clone::Clone for AnalysisPhase {
    #[inline]
    fn clone(&self) -> Self { *self }
}Clone, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for AnalysisPhase {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        AnalysisPhase::Initial => { 0usize }
                        AnalysisPhase::PostCleanup => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for AnalysisPhase {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { AnalysisPhase::Initial }
                    1usize => { AnalysisPhase::PostCleanup }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `AnalysisPhase`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable, #[automatically_derived]
impl ::core::fmt::Debug for AnalysisPhase {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                AnalysisPhase::Initial => "Initial",
                AnalysisPhase::PostCleanup => "PostCleanup",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for AnalysisPhase { }
#[automatically_derived]
impl ::core::cmp::PartialEq for AnalysisPhase {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for AnalysisPhase { }Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for AnalysisPhase {
    #[inline]
    fn partial_cmp(&self, other: &Self)
        -> ::core::option::Option<::core::cmp::Ordering> {
        ::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
    }
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for AnalysisPhase {
    #[inline]
    fn cmp(&self, other: &Self) -> ::core::cmp::Ordering {
        ::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
            &::core::intrinsics::discriminant_value(other))
    }
}Ord)]
101#[derive(const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            AnalysisPhase {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    AnalysisPhase::Initial => {}
                    AnalysisPhase::PostCleanup => {}
                }
            }
        }
    };StableHash)]
102pub enum AnalysisPhase {
103    Initial = 0,
104    /// Beginning in this phase, the following variants are disallowed:
105    /// * [`TerminatorKind::FalseUnwind`]
106    /// * [`TerminatorKind::FalseEdge`]
107    /// * [`StatementKind::FakeRead`]
108    /// * [`StatementKind::AscribeUserType`]
109    /// * [`StatementKind::Coverage`] with [`CoverageKind::is_removed_after_analysis`]
110    /// * [`Rvalue::Ref`] with `BorrowKind::Fake`
111    /// * [`CastKind::PointerCoercion`] with any of the following:
112    ///   * [`PointerCoercion::ArrayToPointer`]
113    ///   * [`PointerCoercion::MutToConstPointer`]
114    ///
115    /// [`CoverageKind::is_removed_after_analysis`]: crate::mir::coverage::CoverageKind::is_removed_after_analysis
116    ///
117    /// Furthermore, `Deref` projections must be the first projection within any place (if they
118    /// appear at all)
119    PostCleanup = 1,
120}
121
122/// See [`MirPhase::Runtime`].
123#[derive(#[automatically_derived]
impl ::core::marker::Copy for RuntimePhase { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for RuntimePhase { }
#[automatically_derived]
impl ::core::clone::Clone for RuntimePhase {
    #[inline]
    fn clone(&self) -> Self { *self }
}Clone, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for RuntimePhase {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        RuntimePhase::Initial => { 0usize }
                        RuntimePhase::PostCleanup => { 1usize }
                        RuntimePhase::Optimized => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for RuntimePhase {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { RuntimePhase::Initial }
                    1usize => { RuntimePhase::PostCleanup }
                    2usize => { RuntimePhase::Optimized }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `RuntimePhase`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable, #[automatically_derived]
impl ::core::fmt::Debug for RuntimePhase {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                RuntimePhase::Initial => "Initial",
                RuntimePhase::PostCleanup => "PostCleanup",
                RuntimePhase::Optimized => "Optimized",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for RuntimePhase { }
#[automatically_derived]
impl ::core::cmp::PartialEq for RuntimePhase {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for RuntimePhase { }Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for RuntimePhase {
    #[inline]
    fn partial_cmp(&self, other: &Self)
        -> ::core::option::Option<::core::cmp::Ordering> {
        ::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
    }
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for RuntimePhase {
    #[inline]
    fn cmp(&self, other: &Self) -> ::core::cmp::Ordering {
        ::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
            &::core::intrinsics::discriminant_value(other))
    }
}Ord)]
124#[derive(const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for RuntimePhase
            {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    RuntimePhase::Initial => {}
                    RuntimePhase::PostCleanup => {}
                    RuntimePhase::Optimized => {}
                }
            }
        }
    };StableHash)]
125pub enum RuntimePhase {
126    /// In addition to the semantic changes, beginning with this phase, the following variants are
127    /// disallowed:
128    /// * [`TerminatorKind::Yield`]
129    /// * [`TerminatorKind::CoroutineDrop`]
130    /// * [`Rvalue::Aggregate`] for any `AggregateKind` except `Array`
131    /// * [`Rvalue::CopyForDeref`]
132    /// * [`PlaceElem::OpaqueCast`]
133    /// * [`LocalInfo::DerefTemp`](super::LocalInfo::DerefTemp)
134    ///
135    /// And the following variants are allowed:
136    /// * [`StatementKind::SetDiscriminant`]
137    /// * [`PlaceElem::ConstantIndex`] / [`PlaceElem::Subslice`] after [`PlaceElem::Subslice`]
138    ///
139    /// Furthermore, `Copy` operands are allowed for non-`Copy` types.
140    Initial = 0,
141    /// Beginning with this phase, the following variant is disallowed:
142    /// * [`ProjectionElem::Deref`] of `Box`
143    PostCleanup = 1,
144    Optimized = 2,
145}
146
147///////////////////////////////////////////////////////////////////////////
148// Borrow kinds
149
150#[derive(#[automatically_derived]
impl ::core::marker::Copy for BorrowKind { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for BorrowKind { }
#[automatically_derived]
impl ::core::clone::Clone for BorrowKind {
    #[inline]
    fn clone(&self) -> Self {
        let _: ::core::clone::AssertParamIsClone<FakeBorrowKind>;
        let _: ::core::clone::AssertParamIsClone<MutBorrowKind>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for BorrowKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Self::Shared => ::core::fmt::Formatter::write_str(f, "Shared"),
            Self::Fake(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Fake",
                    &__self_0),
            Self::Mut { kind: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Mut",
                    "kind", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for BorrowKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for BorrowKind {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Fake(__self_0), Self::Fake(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::Mut { kind: __self_0 }, Self::Mut { kind: __arg1_0 })
                    => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for BorrowKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<FakeBorrowKind>;
        let _: ::core::cmp::AssertParamIsEq<MutBorrowKind>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for BorrowKind {
    #[inline]
    fn partial_cmp(&self, other: &Self)
        -> ::core::option::Option<::core::cmp::Ordering> {
        ::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
    }
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for BorrowKind {
    #[inline]
    fn cmp(&self, other: &Self) -> ::core::cmp::Ordering {
        match (self, other) {
            (Self::Fake(__self_0), Self::Fake(__arg1_0)) =>
                ::core::cmp::Ord::cmp(__self_0, __arg1_0),
            (Self::Mut { kind: __self_0 }, Self::Mut { kind: __arg1_0 }) =>
                ::core::cmp::Ord::cmp(__self_0, __arg1_0),
            _ =>
                ::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
                    &::core::intrinsics::discriminant_value(other)),
        }
    }
}Ord, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for BorrowKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        BorrowKind::Shared => { 0usize }
                        BorrowKind::Fake(ref __binding_0) => { 1usize }
                        BorrowKind::Mut { kind: ref __binding_0 } => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    BorrowKind::Shared => {}
                    BorrowKind::Fake(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    BorrowKind::Mut { kind: 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 BorrowKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { BorrowKind::Shared }
                    1usize => {
                        BorrowKind::Fake(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        BorrowKind::Mut {
                            kind: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `BorrowKind`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable)]
151#[derive(#[automatically_derived]
impl ::core::hash::Hash for BorrowKind {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
            state);
        match self {
            Self::Fake(__self_0) => ::core::hash::Hash::hash(__self_0, state),
            Self::Mut { kind: __self_0 } =>
                ::core::hash::Hash::hash(__self_0, state),
            _ => {}
        }
    }
}Hash, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for BorrowKind {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    BorrowKind::Shared => {}
                    BorrowKind::Fake(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    BorrowKind::Mut { kind: ref __binding_0 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
152pub enum BorrowKind {
153    /// Data must be immutable and is aliasable.
154    Shared,
155
156    /// An immutable, aliasable borrow that is discarded after borrow-checking. Can behave either
157    /// like a normal shared borrow or like a special shallow borrow (see [`FakeBorrowKind`]).
158    ///
159    /// This is used when lowering index expressions and matches. This is used to prevent code like
160    /// the following from compiling:
161    /// ```compile_fail,E0510
162    /// let mut x: &[_] = &[[0, 1]];
163    /// let y: &[_] = &[];
164    /// let _ = x[0][{x = y; 1}];
165    /// ```
166    /// ```compile_fail,E0510
167    /// let mut x = &Some(0);
168    /// match *x {
169    ///     None => (),
170    ///     Some(_) if { x = &None; false } => (),
171    ///     Some(_) => (),
172    /// }
173    /// ```
174    /// We can also report errors with this kind of borrow differently.
175    Fake(FakeBorrowKind),
176
177    /// Data is mutable and not aliasable.
178    Mut { kind: MutBorrowKind },
179}
180
181#[derive(#[automatically_derived]
impl ::core::marker::Copy for RawPtrKind { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for RawPtrKind { }
#[automatically_derived]
impl ::core::clone::Clone for RawPtrKind {
    #[inline]
    fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for RawPtrKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                RawPtrKind::Mut => "Mut",
                RawPtrKind::Const => "Const",
                RawPtrKind::FakeForPtrMetadata => "FakeForPtrMetadata",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for RawPtrKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for RawPtrKind {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for RawPtrKind { }Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for RawPtrKind {
    #[inline]
    fn partial_cmp(&self, other: &Self)
        -> ::core::option::Option<::core::cmp::Ordering> {
        ::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
    }
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for RawPtrKind {
    #[inline]
    fn cmp(&self, other: &Self) -> ::core::cmp::Ordering {
        ::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
            &::core::intrinsics::discriminant_value(other))
    }
}Ord, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for RawPtrKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        RawPtrKind::Mut => { 0usize }
                        RawPtrKind::Const => { 1usize }
                        RawPtrKind::FakeForPtrMetadata => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for RawPtrKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { RawPtrKind::Mut }
                    1usize => { RawPtrKind::Const }
                    2usize => { RawPtrKind::FakeForPtrMetadata }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `RawPtrKind`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable)]
182#[derive(#[automatically_derived]
impl ::core::hash::Hash for RawPtrKind {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
            state)
    }
}Hash, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for RawPtrKind {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    RawPtrKind::Mut => {}
                    RawPtrKind::Const => {}
                    RawPtrKind::FakeForPtrMetadata => {}
                }
            }
        }
    };StableHash)]
183pub enum RawPtrKind {
184    Mut,
185    Const,
186    /// Creates a raw pointer to a place that will only be used to access its metadata,
187    /// not the data behind the pointer. Note that this limitation is *not* enforced
188    /// by the validator.
189    ///
190    /// The borrow checker allows overlap of these raw pointers with references to the
191    /// data. This is sound even if the pointer is "misused" since any such use is anyway
192    /// unsafe. In terms of the operational semantics (i.e., Miri), this is equivalent
193    /// to `RawPtrKind::Mut`, but will never incur a retag.
194    FakeForPtrMetadata,
195}
196
197#[derive(#[automatically_derived]
impl ::core::marker::Copy for MutBorrowKind { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for MutBorrowKind { }
#[automatically_derived]
impl ::core::clone::Clone for MutBorrowKind {
    #[inline]
    fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for MutBorrowKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                MutBorrowKind::Default => "Default",
                MutBorrowKind::TwoPhaseBorrow => "TwoPhaseBorrow",
                MutBorrowKind::ClosureCapture => "ClosureCapture",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for MutBorrowKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for MutBorrowKind {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for MutBorrowKind { }Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for MutBorrowKind {
    #[inline]
    fn partial_cmp(&self, other: &Self)
        -> ::core::option::Option<::core::cmp::Ordering> {
        ::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
    }
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for MutBorrowKind {
    #[inline]
    fn cmp(&self, other: &Self) -> ::core::cmp::Ordering {
        ::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
            &::core::intrinsics::discriminant_value(other))
    }
}Ord, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for MutBorrowKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        MutBorrowKind::Default => { 0usize }
                        MutBorrowKind::TwoPhaseBorrow => { 1usize }
                        MutBorrowKind::ClosureCapture => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for MutBorrowKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { MutBorrowKind::Default }
                    1usize => { MutBorrowKind::TwoPhaseBorrow }
                    2usize => { MutBorrowKind::ClosureCapture }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `MutBorrowKind`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable)]
198#[derive(#[automatically_derived]
impl ::core::hash::Hash for MutBorrowKind {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
            state)
    }
}Hash, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            MutBorrowKind {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    MutBorrowKind::Default => {}
                    MutBorrowKind::TwoPhaseBorrow => {}
                    MutBorrowKind::ClosureCapture => {}
                }
            }
        }
    };StableHash)]
199pub enum MutBorrowKind {
200    Default,
201    /// This borrow arose from method-call auto-ref. (i.e., `adjustment::Adjust::Borrow`)
202    TwoPhaseBorrow,
203    /// Data must be immutable but not aliasable. This kind of borrow
204    /// cannot currently be expressed by the user and is used only in
205    /// implicit closure bindings. It is needed when the closure is
206    /// borrowing or mutating a mutable referent, e.g.:
207    /// ```
208    /// let mut z = 3;
209    /// let x: &mut isize = &mut z;
210    /// let y = || *x += 5;
211    /// ```
212    /// If we were to try to translate this closure into a more explicit
213    /// form, we'd encounter an error with the code as written:
214    /// ```compile_fail,E0594
215    /// struct Env<'a> { x: &'a &'a mut isize }
216    /// let mut z = 3;
217    /// let x: &mut isize = &mut z;
218    /// let y = (&mut Env { x: &x }, fn_ptr);  // Closure is pair of env and fn
219    /// fn fn_ptr(env: &mut Env) { **env.x += 5; }
220    /// ```
221    /// This is then illegal because you cannot mutate an `&mut` found
222    /// in an aliasable location. To solve, you'd have to translate with
223    /// an `&mut` borrow:
224    /// ```compile_fail,E0596
225    /// struct Env<'a> { x: &'a mut &'a mut isize }
226    /// let mut z = 3;
227    /// let x: &mut isize = &mut z;
228    /// let y = (&mut Env { x: &mut x }, fn_ptr); // changed from &x to &mut x
229    /// fn fn_ptr(env: &mut Env) { **env.x += 5; }
230    /// ```
231    /// Now the assignment to `**env.x` is legal, but creating a
232    /// mutable pointer to `x` is not because `x` is not mutable. We
233    /// could fix this by declaring `x` as `let mut x`. This is ok in
234    /// user code, if awkward, but extra weird for closures, since the
235    /// borrow is hidden.
236    ///
237    /// So we introduce a `ClosureCapture` borrow -- user will not have to mark the variable
238    /// containing the mutable reference as `mut`, as they didn't ever
239    /// intend to mutate the mutable reference itself. We still mutable capture it in order to
240    /// mutate the pointed value through it (but not mutating the reference itself).
241    ///
242    /// This solves the problem. For simplicity, we don't give users the way to express this
243    /// borrow, it's just used when translating closures.
244    ClosureCapture,
245}
246
247#[derive(#[automatically_derived]
impl ::core::marker::Copy for FakeBorrowKind { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for FakeBorrowKind { }
#[automatically_derived]
impl ::core::clone::Clone for FakeBorrowKind {
    #[inline]
    fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for FakeBorrowKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                FakeBorrowKind::Shallow => "Shallow",
                FakeBorrowKind::Deep => "Deep",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for FakeBorrowKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for FakeBorrowKind {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for FakeBorrowKind { }Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for FakeBorrowKind {
    #[inline]
    fn partial_cmp(&self, other: &Self)
        -> ::core::option::Option<::core::cmp::Ordering> {
        ::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
    }
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for FakeBorrowKind {
    #[inline]
    fn cmp(&self, other: &Self) -> ::core::cmp::Ordering {
        ::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
            &::core::intrinsics::discriminant_value(other))
    }
}Ord, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for FakeBorrowKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        FakeBorrowKind::Shallow => { 0usize }
                        FakeBorrowKind::Deep => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for FakeBorrowKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { FakeBorrowKind::Shallow }
                    1usize => { FakeBorrowKind::Deep }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `FakeBorrowKind`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable)]
248#[derive(#[automatically_derived]
impl ::core::hash::Hash for FakeBorrowKind {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
            state)
    }
}Hash, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            FakeBorrowKind {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    FakeBorrowKind::Shallow => {}
                    FakeBorrowKind::Deep => {}
                }
            }
        }
    };StableHash)]
249pub enum FakeBorrowKind {
250    /// A shared shallow borrow. The immediately borrowed place must be immutable, but projections
251    /// from it don't need to be. For example, a shallow borrow of `a.b` doesn't conflict with a
252    /// mutable borrow of `a.b.c`.
253    ///
254    /// This is used when lowering matches: when matching on a place we want to ensure that place
255    /// have the same value from the start of the match until an arm is selected. This prevents this
256    /// code from compiling:
257    /// ```compile_fail,E0510
258    /// let mut x = &Some(0);
259    /// match *x {
260    ///     None => (),
261    ///     Some(_) if { x = &None; false } => (),
262    ///     Some(_) => (),
263    /// }
264    /// ```
265    /// This can't be a shared borrow because mutably borrowing `(*x as Some).0` should not checking
266    /// the discriminant or accessing other variants, because the mutating `(*x as Some).0` can't
267    /// affect the discriminant of `x`. E.g. the following is allowed:
268    /// ```rust
269    /// let mut x = Some(0);
270    /// match x {
271    ///     Some(_)
272    ///         if {
273    ///             if let Some(ref mut y) = x {
274    ///                 *y += 1;
275    ///             };
276    ///             true
277    ///         } => {}
278    ///     _ => {}
279    /// }
280    /// ```
281    Shallow,
282    /// A shared (deep) borrow. Data must be immutable and is aliasable.
283    ///
284    /// This is used when lowering deref patterns, where shallow borrows wouldn't prevent something
285    /// like:
286    /// ```compile_fail
287    /// let mut b = Box::new(false);
288    /// match b {
289    ///     deref!(true) => {} // not reached because `*b == false`
290    ///     _ if { *b = true; false } => {} // not reached because the guard is `false`
291    ///     deref!(false) => {} // not reached because the guard changed it
292    ///     // UB because we reached the unreachable.
293    /// }
294    /// ```
295    Deep,
296}
297
298///////////////////////////////////////////////////////////////////////////
299// Statements
300
301/// The various kinds of statements that can appear in MIR.
302///
303/// Not all of these are allowed at every [`MirPhase`]. Check the documentation there to see which
304/// ones you do not have to worry about. The MIR validator will generally enforce such restrictions,
305/// causing an ICE if they are violated.
306#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for StatementKind<'tcx> {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Assign(__self_0) =>
                StatementKind::Assign(::core::clone::Clone::clone(__self_0)),
            Self::FakeRead(__self_0) =>
                StatementKind::FakeRead(::core::clone::Clone::clone(__self_0)),
            Self::SetDiscriminant { place: __self_0, variant_index: __self_1 }
                =>
                StatementKind::SetDiscriminant {
                    place: ::core::clone::Clone::clone(__self_0),
                    variant_index: ::core::clone::Clone::clone(__self_1),
                },
            Self::StorageLive(__self_0) =>
                StatementKind::StorageLive(::core::clone::Clone::clone(__self_0)),
            Self::StorageDead(__self_0) =>
                StatementKind::StorageDead(::core::clone::Clone::clone(__self_0)),
            Self::PlaceMention(__self_0) =>
                StatementKind::PlaceMention(::core::clone::Clone::clone(__self_0)),
            Self::AscribeUserType(__self_0, __self_1) =>
                StatementKind::AscribeUserType(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::Coverage(__self_0) =>
                StatementKind::Coverage(::core::clone::Clone::clone(__self_0)),
            Self::Intrinsic(__self_0) =>
                StatementKind::Intrinsic(::core::clone::Clone::clone(__self_0)),
            Self::ConstEvalCounter => StatementKind::ConstEvalCounter,
            Self::Nop => StatementKind::Nop,
            Self::BackwardIncompatibleDropHint {
                place: __self_0, reason: __self_1 } =>
                StatementKind::BackwardIncompatibleDropHint {
                    place: ::core::clone::Clone::clone(__self_0),
                    reason: ::core::clone::Clone::clone(__self_1),
                },
        }
    }
}Clone, #[automatically_derived]
impl<'tcx> ::core::marker::StructuralPartialEq for StatementKind<'tcx> { }
#[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for StatementKind<'tcx> {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Assign(__self_0), Self::Assign(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::FakeRead(__self_0), Self::FakeRead(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::SetDiscriminant {
                    place: __self_0, variant_index: __self_1 },
                    Self::SetDiscriminant {
                    place: __arg1_0, variant_index: __arg1_1 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (Self::StorageLive(__self_0), Self::StorageLive(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::StorageDead(__self_0), Self::StorageDead(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::PlaceMention(__self_0), Self::PlaceMention(__arg1_0))
                    => __self_0 == __arg1_0,
                (Self::AscribeUserType(__self_0, __self_1),
                    Self::AscribeUserType(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (Self::Coverage(__self_0), Self::Coverage(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::Intrinsic(__self_0), Self::Intrinsic(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::BackwardIncompatibleDropHint {
                    place: __self_0, reason: __self_1 },
                    Self::BackwardIncompatibleDropHint {
                    place: __arg1_0, reason: __arg1_1 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                _ => true,
            }
    }
}PartialEq, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for StatementKind<'tcx> {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        StatementKind::Assign(ref __binding_0) => { 0usize }
                        StatementKind::FakeRead(ref __binding_0) => { 1usize }
                        StatementKind::SetDiscriminant {
                            place: ref __binding_0, variant_index: ref __binding_1 } =>
                            {
                            2usize
                        }
                        StatementKind::StorageLive(ref __binding_0) => { 3usize }
                        StatementKind::StorageDead(ref __binding_0) => { 4usize }
                        StatementKind::PlaceMention(ref __binding_0) => { 5usize }
                        StatementKind::AscribeUserType(ref __binding_0,
                            ref __binding_1) => {
                            6usize
                        }
                        StatementKind::Coverage(ref __binding_0) => { 7usize }
                        StatementKind::Intrinsic(ref __binding_0) => { 8usize }
                        StatementKind::ConstEvalCounter => { 9usize }
                        StatementKind::Nop => { 10usize }
                        StatementKind::BackwardIncompatibleDropHint {
                            place: ref __binding_0, reason: ref __binding_1 } => {
                            11usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    StatementKind::Assign(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    StatementKind::FakeRead(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    StatementKind::SetDiscriminant {
                        place: ref __binding_0, variant_index: ref __binding_1 } =>
                        {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    StatementKind::StorageLive(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    StatementKind::StorageDead(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    StatementKind::PlaceMention(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    StatementKind::AscribeUserType(ref __binding_0,
                        ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    StatementKind::Coverage(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    StatementKind::Intrinsic(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    StatementKind::ConstEvalCounter => {}
                    StatementKind::Nop => {}
                    StatementKind::BackwardIncompatibleDropHint {
                        place: ref __binding_0, reason: 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 StatementKind<'tcx> {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        StatementKind::Assign(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        StatementKind::FakeRead(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        StatementKind::SetDiscriminant {
                            place: ::rustc_serialize::Decodable::decode(__decoder),
                            variant_index: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    3usize => {
                        StatementKind::StorageLive(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    4usize => {
                        StatementKind::StorageDead(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    5usize => {
                        StatementKind::PlaceMention(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    6usize => {
                        StatementKind::AscribeUserType(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    7usize => {
                        StatementKind::Coverage(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    8usize => {
                        StatementKind::Intrinsic(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    9usize => { StatementKind::ConstEvalCounter }
                    10usize => { StatementKind::Nop }
                    11usize => {
                        StatementKind::BackwardIncompatibleDropHint {
                            place: ::rustc_serialize::Decodable::decode(__decoder),
                            reason: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `StatementKind`, expected 0..12, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable, const _: () =
    {
        impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
            StatementKind<'tcx> {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    StatementKind::Assign(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    StatementKind::FakeRead(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    StatementKind::SetDiscriminant {
                        place: ref __binding_0, variant_index: ref __binding_1 } =>
                        {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    StatementKind::StorageLive(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    StatementKind::StorageDead(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    StatementKind::PlaceMention(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    StatementKind::AscribeUserType(ref __binding_0,
                        ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    StatementKind::Coverage(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    StatementKind::Intrinsic(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    StatementKind::ConstEvalCounter => {}
                    StatementKind::Nop => {}
                    StatementKind::BackwardIncompatibleDropHint {
                        place: ref __binding_0, reason: ref __binding_1 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
307#[derive(const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            for StatementKind<'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 {
                        StatementKind::Assign(__binding_0) => {
                            StatementKind::Assign(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        StatementKind::FakeRead(__binding_0) => {
                            StatementKind::FakeRead(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        StatementKind::SetDiscriminant {
                            place: __binding_0, variant_index: __binding_1 } => {
                            StatementKind::SetDiscriminant {
                                place: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                variant_index: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                            }
                        }
                        StatementKind::StorageLive(__binding_0) => {
                            StatementKind::StorageLive(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        StatementKind::StorageDead(__binding_0) => {
                            StatementKind::StorageDead(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        StatementKind::PlaceMention(__binding_0) => {
                            StatementKind::PlaceMention(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        StatementKind::AscribeUserType(__binding_0, __binding_1) =>
                            {
                            StatementKind::AscribeUserType(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?)
                        }
                        StatementKind::Coverage(__binding_0) => {
                            StatementKind::Coverage(__binding_0)
                        }
                        StatementKind::Intrinsic(__binding_0) => {
                            StatementKind::Intrinsic(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        StatementKind::ConstEvalCounter => {
                            StatementKind::ConstEvalCounter
                        }
                        StatementKind::Nop => { StatementKind::Nop }
                        StatementKind::BackwardIncompatibleDropHint {
                            place: __binding_0, reason: __binding_1 } => {
                            StatementKind::BackwardIncompatibleDropHint {
                                place: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                reason: ::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 {
                    StatementKind::Assign(__binding_0) => {
                        StatementKind::Assign(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    StatementKind::FakeRead(__binding_0) => {
                        StatementKind::FakeRead(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    StatementKind::SetDiscriminant {
                        place: __binding_0, variant_index: __binding_1 } => {
                        StatementKind::SetDiscriminant {
                            place: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            variant_index: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                        }
                    }
                    StatementKind::StorageLive(__binding_0) => {
                        StatementKind::StorageLive(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    StatementKind::StorageDead(__binding_0) => {
                        StatementKind::StorageDead(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    StatementKind::PlaceMention(__binding_0) => {
                        StatementKind::PlaceMention(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    StatementKind::AscribeUserType(__binding_0, __binding_1) =>
                        {
                        StatementKind::AscribeUserType(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder))
                    }
                    StatementKind::Coverage(__binding_0) => {
                        StatementKind::Coverage(__binding_0)
                    }
                    StatementKind::Intrinsic(__binding_0) => {
                        StatementKind::Intrinsic(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    StatementKind::ConstEvalCounter => {
                        StatementKind::ConstEvalCounter
                    }
                    StatementKind::Nop => { StatementKind::Nop }
                    StatementKind::BackwardIncompatibleDropHint {
                        place: __binding_0, reason: __binding_1 } => {
                        StatementKind::BackwardIncompatibleDropHint {
                            place: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            reason: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
            for StatementKind<'tcx> {
            fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    StatementKind::Assign(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);
                                }
                            }
                        }
                    }
                    StatementKind::FakeRead(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);
                                }
                            }
                        }
                    }
                    StatementKind::SetDiscriminant {
                        place: ref __binding_0, variant_index: 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);
                                }
                            }
                        }
                    }
                    StatementKind::StorageLive(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);
                                }
                            }
                        }
                    }
                    StatementKind::StorageDead(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);
                                }
                            }
                        }
                    }
                    StatementKind::PlaceMention(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);
                                }
                            }
                        }
                    }
                    StatementKind::AscribeUserType(ref __binding_0,
                        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);
                                }
                            }
                        }
                    }
                    StatementKind::Coverage(..) => {}
                    StatementKind::Intrinsic(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);
                                }
                            }
                        }
                    }
                    StatementKind::ConstEvalCounter => {}
                    StatementKind::Nop => {}
                    StatementKind::BackwardIncompatibleDropHint {
                        place: ref __binding_0, reason: 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)]
308pub enum StatementKind<'tcx> {
309    /// Assign statements roughly correspond to an assignment in Rust proper (`x = ...`) except
310    /// without the possibility of dropping the previous value (that must be done separately, if at
311    /// all). The *exact* way this works is undecided. It probably does something like evaluating
312    /// the LHS to a place, then the RHS to a value, and then storing the value to the place.
313    /// Various parts of this may do type specific things that are more complicated than simply
314    /// copying bytes. In particular, the assignment will typically erase the contents of padding,
315    /// erase provenance from non-pointer types, and implicitly "retag" all references and boxes
316    /// that it copies, meaning that the resulting value is not an exact duplicate for all intents
317    /// and purposes of the original value.
318    ///
319    /// **Needs clarification**: The implication of the above idea would be that assignment implies
320    /// that the resulting value is initialized. I believe we could commit to this separately from
321    /// committing to whatever part of the memory model we would need to decide on to make the above
322    /// paragraph precise. Do we want to?
323    ///
324    /// Assignments in which the types of the place and rvalue differ are not well-formed.
325    ///
326    /// **Needs clarification**: Do we ever want to worry about non-free (in the body) lifetimes for
327    /// the typing requirement in post drop-elaboration MIR? I think probably not - I'm not sure we
328    /// could meaningfully require this anyway. How about free lifetimes? Is ignoring this
329    /// interesting for optimizations? Do we want to allow such optimizations?
330    ///
331    /// **Needs clarification**: We currently require that the LHS place not overlap with any place
332    /// read as part of computation of the RHS for some rvalues. This requirement is under
333    /// discussion in [#68364]. Specifically, overlap is permitted only for assignments of a type
334    /// with `BackendRepr::Scalar | BackendRepr::ScalarPair` where all the scalar fields are
335    /// [`Scalar::Initialized`][rustc_abi::Scalar::Initialized]. As a part of this discussion, it is
336    /// also unclear in what order the components are evaluated.
337    ///
338    /// [#68364]: https://github.com/rust-lang/rust/issues/68364
339    ///
340    /// See [`Rvalue`] documentation for details on each of those.
341    Assign(Box<(Place<'tcx>, Rvalue<'tcx>)>),
342
343    /// When executed at runtime, this is a nop.
344    ///
345    /// During static analysis, a fake read:
346    /// - requires that the value being read is initialized (or, in the case
347    ///   of closures, that it was fully initialized at some point in the past)
348    /// - constitutes a use of a value for the purposes of NLL (i.e. if the
349    ///   value being fake-read is a reference, the lifetime of that reference
350    ///   will be extended to cover the `FakeRead`)
351    /// - but, unlike an actual read, does *not* invalidate any exclusive
352    ///   borrows.
353    ///
354    /// See [`FakeReadCause`] for more details on the situations in which a
355    /// `FakeRead` is emitted.
356    ///
357    /// Disallowed after drop elaboration.
358    FakeRead(Box<(FakeReadCause, Place<'tcx>)>),
359
360    /// Write the discriminant for a variant to the enum Place.
361    ///
362    /// This is permitted for both coroutines and ADTs. This does not necessarily write to the
363    /// entire place; instead, it writes to the minimum set of bytes as required by the layout for
364    /// the type.
365    SetDiscriminant { place: Box<Place<'tcx>>, variant_index: VariantIdx },
366
367    /// `StorageLive` and `StorageDead` statements mark the live range of a local.
368    ///
369    /// At any point during the execution of a function, each local is either allocated or
370    /// unallocated. Except as noted below, all locals except function parameters are initially
371    /// unallocated. `StorageLive` statements cause memory to be allocated for the local while
372    /// `StorageDead` statements cause the memory to be freed. In other words,
373    /// `StorageLive`/`StorageDead` act like the heap operations `allocate`/`deallocate`, but for
374    /// stack-allocated local variables. Using a local in any way (not only reading/writing from it)
375    /// while it is unallocated is UB.
376    ///
377    /// Some locals have no `StorageLive` or `StorageDead` statements within the entire MIR body.
378    /// These locals are implicitly allocated for the full duration of the function. There is a
379    /// convenience method at `rustc_mir_dataflow::storage::always_storage_live_locals` for
380    /// computing these locals.
381    ///
382    /// If the local is already allocated, calling `StorageLive` again will implicitly free the
383    /// local and then allocate fresh uninitialized memory. If a local is already deallocated,
384    /// calling `StorageDead` again is a NOP.
385    StorageLive(Local),
386
387    /// See `StorageLive` above.
388    StorageDead(Local),
389
390    /// This statement exists to preserve a trace of a scrutinee matched against a wildcard binding.
391    /// This is especially useful for `let _ = PLACE;` bindings that desugar to a single
392    /// `PlaceMention(PLACE)`.
393    ///
394    /// When executed at runtime, this computes the given place, but then discards
395    /// it without doing a load. `let _ = *ptr;` is fine even if the pointer is dangling.
396    PlaceMention(Box<Place<'tcx>>),
397
398    /// Encodes a user's type ascription. These need to be preserved
399    /// intact so that NLL can respect them. For example:
400    /// ```ignore (illustrative)
401    /// let a: T = y;
402    /// ```
403    /// The effect of this annotation is to relate the type `T_y` of the place `y`
404    /// to the user-given type `T`. The effect depends on the specified variance:
405    ///
406    /// - `Covariant` -- requires that `T_y <: T`
407    /// - `Contravariant` -- requires that `T_y :> T`
408    /// - `Invariant` -- requires that `T_y == T`
409    /// - `Bivariant` -- no effect
410    ///
411    /// When executed at runtime this is a nop.
412    ///
413    /// Disallowed after drop elaboration.
414    AscribeUserType(Box<(Place<'tcx>, UserTypeProjection)>, ty::Variance),
415
416    /// Carries control-flow-sensitive information injected by `-Cinstrument-coverage`,
417    /// such as where to generate physical coverage-counter-increments during codegen.
418    ///
419    /// Coverage statements are used in conjunction with the coverage mappings and other
420    /// information stored in the function's
421    /// [`mir::Body::coverage_mir_info`](crate::mir::Body::coverage_mir_info).
422    /// (For inlined MIR, take care to look up the *original function's* coverage info.)
423    ///
424    /// Interpreters and codegen backends that don't support coverage instrumentation
425    /// can usually treat this as a no-op.
426    Coverage(
427        // Coverage statements are unlikely to ever contain type information in
428        // the foreseeable future, so excluding them from TypeFoldable/TypeVisitable
429        // avoids some unhelpful derive boilerplate.
430        #[type_foldable(identity)]
431        #[type_visitable(ignore)]
432        CoverageKind,
433    ),
434
435    /// Denotes a call to an intrinsic that does not require an unwind path and always returns.
436    /// This avoids adding a new block and a terminator for simple intrinsics.
437    Intrinsic(Box<NonDivergingIntrinsic<'tcx>>),
438
439    /// Instructs the const eval interpreter to increment a counter; this counter is used to track
440    /// how many steps the interpreter has taken. It is used to prevent the user from writing const
441    /// code that runs for too long or infinitely. Other than in the const eval interpreter, this
442    /// is a no-op.
443    ConstEvalCounter,
444
445    /// No-op. Useful for deleting instructions without affecting statement indices.
446    Nop,
447
448    /// Marker statement indicating where `place` would be dropped.
449    /// This is semantically equivalent to `Nop`, so codegen and MIRI should interpret this
450    /// statement as such.
451    /// The only use case of this statement is for linting in MIR to detect temporary lifetime
452    /// changes.
453    BackwardIncompatibleDropHint {
454        /// Place to drop
455        place: Box<Place<'tcx>>,
456        /// Reason for backward incompatibility
457        reason: BackwardIncompatibleDropReason,
458    },
459}
460
461#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for NonDivergingIntrinsic<'tcx> {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Assume(__self_0) =>
                NonDivergingIntrinsic::Assume(::core::clone::Clone::clone(__self_0)),
            Self::CopyNonOverlapping(__self_0) =>
                NonDivergingIntrinsic::CopyNonOverlapping(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for NonDivergingIntrinsic<'tcx>
            {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        NonDivergingIntrinsic::Assume(ref __binding_0) => { 0usize }
                        NonDivergingIntrinsic::CopyNonOverlapping(ref __binding_0)
                            => {
                            1usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    NonDivergingIntrinsic::Assume(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    NonDivergingIntrinsic::CopyNonOverlapping(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 NonDivergingIntrinsic<'tcx>
            {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        NonDivergingIntrinsic::Assume(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        NonDivergingIntrinsic::CopyNonOverlapping(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `NonDivergingIntrinsic`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for NonDivergingIntrinsic<'tcx> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Self::Assume(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Assume",
                    &__self_0),
            Self::CopyNonOverlapping(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "CopyNonOverlapping", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl<'tcx> ::core::marker::StructuralPartialEq for NonDivergingIntrinsic<'tcx>
    {
}
#[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for NonDivergingIntrinsic<'tcx> {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Assume(__self_0), Self::Assume(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::CopyNonOverlapping(__self_0),
                    Self::CopyNonOverlapping(__arg1_0)) => __self_0 == __arg1_0,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, const _: () =
    {
        impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
            NonDivergingIntrinsic<'tcx> {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    NonDivergingIntrinsic::Assume(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    NonDivergingIntrinsic::CopyNonOverlapping(ref __binding_0)
                        => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
462#[derive(const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            for NonDivergingIntrinsic<'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 {
                        NonDivergingIntrinsic::Assume(__binding_0) => {
                            NonDivergingIntrinsic::Assume(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        NonDivergingIntrinsic::CopyNonOverlapping(__binding_0) => {
                            NonDivergingIntrinsic::CopyNonOverlapping(::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 {
                    NonDivergingIntrinsic::Assume(__binding_0) => {
                        NonDivergingIntrinsic::Assume(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    NonDivergingIntrinsic::CopyNonOverlapping(__binding_0) => {
                        NonDivergingIntrinsic::CopyNonOverlapping(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                }
            }
        }
    };TypeFoldable, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
            for NonDivergingIntrinsic<'tcx> {
            fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    NonDivergingIntrinsic::Assume(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);
                                }
                            }
                        }
                    }
                    NonDivergingIntrinsic::CopyNonOverlapping(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)]
463pub enum NonDivergingIntrinsic<'tcx> {
464    /// Denotes a call to the intrinsic function `assume`.
465    ///
466    /// The operand must be a boolean. Optimizers may use the value of the boolean to backtrack its
467    /// computation to infer information about other variables. So if the boolean came from a
468    /// `x < y` operation, subsequent operations on `x` and `y` could elide various bound checks.
469    /// If the argument is `false`, this operation is equivalent to `TerminatorKind::Unreachable`.
470    Assume(Operand<'tcx>),
471
472    /// Denotes a call to the intrinsic function `copy_nonoverlapping`.
473    ///
474    /// First, all three operands are evaluated. `src` and `dest` must each be a reference, pointer,
475    /// or `Box` pointing to the same type `T`. `count` must evaluate to a `usize`. Then, `src` and
476    /// `dest` are dereferenced, and `count * size_of::<T>()` bytes beginning with the first byte of
477    /// the `src` place are copied to the contiguous range of bytes beginning with the first byte
478    /// of `dest`.
479    ///
480    /// **Needs clarification**: In what order are operands computed and dereferenced? It should
481    /// probably match the order for assignment, but that is also undecided.
482    ///
483    /// **Needs clarification**: Is this typed or not, ie is there a typed load and store involved?
484    /// I vaguely remember Ralf saying somewhere that he thought it should not be.
485    CopyNonOverlapping(CopyNonOverlapping<'tcx>),
486}
487
488/// Describes whether this operand use performs a retag.
489#[derive(#[automatically_derived]
impl ::core::marker::Copy for WithRetag { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for WithRetag { }
#[automatically_derived]
impl ::core::clone::Clone for WithRetag {
    #[inline]
    fn clone(&self) -> Self { *self }
}Clone, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for WithRetag {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        WithRetag::Yes => { 0usize }
                        WithRetag::No => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for WithRetag {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { WithRetag::Yes }
                    1usize => { WithRetag::No }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `WithRetag`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable, #[automatically_derived]
impl ::core::fmt::Debug for WithRetag {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self { WithRetag::Yes => "Yes", WithRetag::No => "No", })
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for WithRetag { }
#[automatically_derived]
impl ::core::cmp::PartialEq for WithRetag {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for WithRetag { }Eq, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for WithRetag {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self { WithRetag::Yes => {} WithRetag::No => {} }
            }
        }
    };StableHash)]
490#[rustc_pass_by_value]
491pub enum WithRetag {
492    Yes,
493    No,
494}
495
496impl WithRetag {
497    #[inline]
498    pub fn yes(self) -> bool {
499        #[allow(non_exhaustive_omitted_patterns)] match self {
    Self::Yes => true,
    _ => false,
}matches!(self, Self::Yes)
500    }
501    #[inline]
502    pub fn no(self) -> bool {
503        #[allow(non_exhaustive_omitted_patterns)] match self {
    Self::No => true,
    _ => false,
}matches!(self, Self::No)
504    }
505}
506
507/// The `FakeReadCause` describes the type of pattern why a FakeRead statement exists.
508#[derive(#[automatically_derived]
impl ::core::marker::Copy for FakeReadCause { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for FakeReadCause { }
#[automatically_derived]
impl ::core::clone::Clone for FakeReadCause {
    #[inline]
    fn clone(&self) -> Self {
        let _: ::core::clone::AssertParamIsClone<Option<LocalDefId>>;
        let _: ::core::clone::AssertParamIsClone<Option<LocalDefId>>;
        *self
    }
}Clone, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for FakeReadCause {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        FakeReadCause::ForMatchGuard => { 0usize }
                        FakeReadCause::ForMatchedPlace(ref __binding_0) => {
                            1usize
                        }
                        FakeReadCause::ForGuardBinding => { 2usize }
                        FakeReadCause::ForLet(ref __binding_0) => { 3usize }
                        FakeReadCause::ForIndex => { 4usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    FakeReadCause::ForMatchGuard => {}
                    FakeReadCause::ForMatchedPlace(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    FakeReadCause::ForGuardBinding => {}
                    FakeReadCause::ForLet(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    FakeReadCause::ForIndex => {}
                }
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for FakeReadCause {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { FakeReadCause::ForMatchGuard }
                    1usize => {
                        FakeReadCause::ForMatchedPlace(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => { FakeReadCause::ForGuardBinding }
                    3usize => {
                        FakeReadCause::ForLet(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    4usize => { FakeReadCause::ForIndex }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `FakeReadCause`, expected 0..5, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable, #[automatically_derived]
impl ::core::fmt::Debug for FakeReadCause {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Self::ForMatchGuard =>
                ::core::fmt::Formatter::write_str(f, "ForMatchGuard"),
            Self::ForMatchedPlace(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ForMatchedPlace", &__self_0),
            Self::ForGuardBinding =>
                ::core::fmt::Formatter::write_str(f, "ForGuardBinding"),
            Self::ForLet(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "ForLet",
                    &__self_0),
            Self::ForIndex =>
                ::core::fmt::Formatter::write_str(f, "ForIndex"),
        }
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            FakeReadCause {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    FakeReadCause::ForMatchGuard => {}
                    FakeReadCause::ForMatchedPlace(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    FakeReadCause::ForGuardBinding => {}
                    FakeReadCause::ForLet(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    FakeReadCause::ForIndex => {}
                }
            }
        }
    };StableHash, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for FakeReadCause { }
#[automatically_derived]
impl ::core::cmp::PartialEq for FakeReadCause {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::ForMatchedPlace(__self_0),
                    Self::ForMatchedPlace(__arg1_0)) => __self_0 == __arg1_0,
                (Self::ForLet(__self_0), Self::ForLet(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq)]
509pub enum FakeReadCause {
510    /// A fake read injected into a match guard to ensure that the discriminants
511    /// that are being matched on aren't modified while the match guard is being
512    /// evaluated.
513    ///
514    /// At the beginning of each match guard, a [fake borrow][FakeBorrowKind] is
515    /// inserted for each discriminant accessed in the entire `match` statement.
516    ///
517    /// Then, at the end of the match guard, a `FakeRead(ForMatchGuard)` is
518    /// inserted to keep the fake borrows alive until that point.
519    ///
520    /// This should ensure that you cannot change the variant for an enum while
521    /// you are in the midst of matching on it.
522    ForMatchGuard,
523
524    /// Fake read of the scrutinee of a `match` or destructuring `let`
525    /// (i.e. `let` with non-trivial pattern).
526    ///
527    /// In `match x { ... }`, we generate a `FakeRead(ForMatchedPlace, x)`
528    /// and insert it into the `otherwise_block` (which is supposed to be
529    /// unreachable for irrefutable pattern-matches like `match` or `let`).
530    ///
531    /// This is necessary because `let x: !; match x {}` doesn't generate any
532    /// actual read of x, so we need to generate a `FakeRead` to check that it
533    /// is initialized.
534    ///
535    /// If the `FakeRead(ForMatchedPlace)` is being performed with a closure
536    /// that doesn't capture the required upvars, the `FakeRead` within the
537    /// closure is omitted entirely.
538    ///
539    /// To make sure that this is still sound, if a closure matches against
540    /// a Place starting with an Upvar, we hoist the `FakeRead` to the
541    /// definition point of the closure.
542    ///
543    /// If the `FakeRead` comes from being hoisted out of a closure like this,
544    /// we record the `LocalDefId` of the closure. Otherwise, the `Option` will be `None`.
545    //
546    // We can use LocalDefId here since fake read statements are removed
547    // before codegen in the `CleanupNonCodegenStatements` pass.
548    ForMatchedPlace(Option<LocalDefId>),
549
550    /// A fake read injected into a match guard to ensure that the places
551    /// bound by the pattern are immutable for the duration of the match guard.
552    ///
553    /// Within a match guard, references are created for each place that the
554    /// pattern creates a binding for — this is known as the `RefWithinGuard`
555    /// version of the variables. To make sure that the references stay
556    /// alive until the end of the match guard, and properly prevent the
557    /// places in question from being modified, a `FakeRead(ForGuardBinding)`
558    /// is inserted at the end of the match guard.
559    ///
560    /// For details on how these references are created, see the extensive
561    /// documentation on `bind_matched_candidate_for_guard` in
562    /// `rustc_mir_build`.
563    ForGuardBinding,
564
565    /// Officially, the semantics of
566    ///
567    /// `let pattern = <expr>;`
568    ///
569    /// is that `<expr>` is evaluated into a temporary and then this temporary is
570    /// into the pattern.
571    ///
572    /// However, if we see the simple pattern `let var = <expr>`, we optimize this to
573    /// evaluate `<expr>` directly into the variable `var`. This is mostly unobservable,
574    /// but in some cases it can affect the borrow checker, as in #53695.
575    ///
576    /// Therefore, we insert a `FakeRead(ForLet)` immediately after each `let`
577    /// with a trivial pattern.
578    ///
579    /// FIXME: `ExprUseVisitor` has an entirely different opinion on what `FakeRead(ForLet)`
580    /// is supposed to mean. If it was accurate to what MIR lowering does,
581    /// would it even make sense to hoist these out of closures like
582    /// `ForMatchedPlace`?
583    ForLet(Option<LocalDefId>),
584
585    /// Currently, index expressions overloaded through the `Index` trait
586    /// get lowered differently than index expressions with builtin semantics
587    /// for arrays and slices — the latter will emit code to perform
588    /// bound checks, and then return a MIR place that will only perform the
589    /// indexing "for real" when it gets incorporated into an instruction.
590    ///
591    /// This is observable in the fact that the following compiles:
592    ///
593    /// ```
594    /// fn f(x: &mut [&mut [u32]], i: usize) {
595    ///     x[i][x[i].len() - 1] += 1;
596    /// }
597    /// ```
598    ///
599    /// However, we need to be careful to not let the user invalidate the
600    /// bound check with an expression like
601    ///
602    /// `(*x)[1][{ x = y; 4}]`
603    ///
604    /// Here, the first bounds check would be invalidated when we evaluate the
605    /// second index expression. To make sure that this doesn't happen, we
606    /// create a fake borrow of `x` and hold it while we evaluate the second
607    /// index.
608    ///
609    /// This borrow is kept alive by a `FakeRead(ForIndex)` at the end of its
610    /// scope.
611    ForIndex,
612}
613
614#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for CopyNonOverlapping<'tcx> {
    #[inline]
    fn clone(&self) -> Self {
        CopyNonOverlapping {
            src: ::core::clone::Clone::clone(&self.src),
            dst: ::core::clone::Clone::clone(&self.dst),
            count: ::core::clone::Clone::clone(&self.count),
        }
    }
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for CopyNonOverlapping<'tcx> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f,
            "CopyNonOverlapping", "src", &self.src, "dst", &self.dst, "count",
            &&self.count)
    }
}Debug, #[automatically_derived]
impl<'tcx> ::core::marker::StructuralPartialEq for CopyNonOverlapping<'tcx> {
}
#[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for CopyNonOverlapping<'tcx> {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        self.src == other.src && self.dst == other.dst &&
            self.count == other.count
    }
}PartialEq, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for CopyNonOverlapping<'tcx> {
            fn encode(&self, __encoder: &mut __E) {
                let CopyNonOverlapping {
                        src: ref __binding_0,
                        dst: ref __binding_1,
                        count: ref __binding_2 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for CopyNonOverlapping<'tcx> {
            fn decode(__decoder: &mut __D) -> Self {
                CopyNonOverlapping {
                    src: ::rustc_serialize::Decodable::decode(__decoder),
                    dst: ::rustc_serialize::Decodable::decode(__decoder),
                    count: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };TyDecodable, const _: () =
    {
        impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
            CopyNonOverlapping<'tcx> {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    CopyNonOverlapping {
                        src: ref __binding_0,
                        dst: ref __binding_1,
                        count: ref __binding_2 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
615#[derive(const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            for CopyNonOverlapping<'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 {
                        CopyNonOverlapping {
                            src: __binding_0, dst: __binding_1, count: __binding_2 } =>
                            {
                            CopyNonOverlapping {
                                src: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                dst: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                                count: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_2,
                                        __folder)?,
                            }
                        }
                    })
            }
            fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    CopyNonOverlapping {
                        src: __binding_0, dst: __binding_1, count: __binding_2 } =>
                        {
                        CopyNonOverlapping {
                            src: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            dst: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                            count: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_2,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
            for CopyNonOverlapping<'tcx> {
            fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    CopyNonOverlapping {
                        src: ref __binding_0,
                        dst: ref __binding_1,
                        count: ref __binding_2 } => {
                        {
                            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);
                                }
                            }
                        }
                    }
                }
                <__V::Result as ::rustc_middle::ty::VisitorResult>::output()
            }
        }
    };TypeVisitable)]
616pub struct CopyNonOverlapping<'tcx> {
617    pub src: Operand<'tcx>,
618    pub dst: Operand<'tcx>,
619    /// Number of elements to copy from src to dest, not bytes.
620    pub count: Operand<'tcx>,
621}
622
623/// Represents how a [`TerminatorKind::Call`] was constructed.
624/// Used only for diagnostics.
625#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for CallSource { }
#[automatically_derived]
impl ::core::clone::Clone for CallSource {
    #[inline]
    fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for CallSource { }Copy, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for CallSource {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        CallSource::OverloadedOperator => { 0usize }
                        CallSource::MatchCmp => { 1usize }
                        CallSource::Misc => { 2usize }
                        CallSource::Use => { 3usize }
                        CallSource::Normal => { 4usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for CallSource {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { CallSource::OverloadedOperator }
                    1usize => { CallSource::MatchCmp }
                    2usize => { CallSource::Misc }
                    3usize => { CallSource::Use }
                    4usize => { CallSource::Normal }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `CallSource`, expected 0..5, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable, #[automatically_derived]
impl ::core::fmt::Debug for CallSource {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                CallSource::OverloadedOperator => "OverloadedOperator",
                CallSource::MatchCmp => "MatchCmp",
                CallSource::Misc => "Misc",
                CallSource::Use => "Use",
                CallSource::Normal => "Normal",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for CallSource { }
#[automatically_derived]
impl ::core::cmp::PartialEq for CallSource {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}PartialEq, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for CallSource {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    CallSource::OverloadedOperator => {}
                    CallSource::MatchCmp => {}
                    CallSource::Misc => {}
                    CallSource::Use => {}
                    CallSource::Normal => {}
                }
            }
        }
    };StableHash)]
626#[derive(const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            for CallSource {
            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 {
                        CallSource::OverloadedOperator => {
                            CallSource::OverloadedOperator
                        }
                        CallSource::MatchCmp => { CallSource::MatchCmp }
                        CallSource::Misc => { CallSource::Misc }
                        CallSource::Use => { CallSource::Use }
                        CallSource::Normal => { CallSource::Normal }
                    })
            }
            fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    CallSource::OverloadedOperator => {
                        CallSource::OverloadedOperator
                    }
                    CallSource::MatchCmp => { CallSource::MatchCmp }
                    CallSource::Misc => { CallSource::Misc }
                    CallSource::Use => { CallSource::Use }
                    CallSource::Normal => { CallSource::Normal }
                }
            }
        }
    };TypeFoldable, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
            for CallSource {
            fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    CallSource::OverloadedOperator => {}
                    CallSource::MatchCmp => {}
                    CallSource::Misc => {}
                    CallSource::Use => {}
                    CallSource::Normal => {}
                }
                <__V::Result as ::rustc_middle::ty::VisitorResult>::output()
            }
        }
    };TypeVisitable)]
627pub enum CallSource {
628    /// This came from something such as `a > b` or `a + b`. In THIR, if `from_hir_call`
629    /// is false then this is the desugaring.
630    OverloadedOperator,
631    /// This was from comparison generated by a match, used by const-eval for better errors
632    /// when the comparison cannot be done in compile time.
633    ///
634    /// (see <https://github.com/rust-lang/rust/issues/90237>)
635    MatchCmp,
636    /// Other types of desugaring that did not come from the HIR, but we don't care about
637    /// for diagnostics (yet).
638    Misc,
639    /// Use of value, generating a clone function call
640    Use,
641    /// Normal function call, no special source
642    Normal,
643}
644
645#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for InlineAsmMacro { }
#[automatically_derived]
impl ::core::clone::Clone for InlineAsmMacro {
    #[inline]
    fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for InlineAsmMacro { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for InlineAsmMacro {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                InlineAsmMacro::Asm => "Asm",
                InlineAsmMacro::NakedAsm => "NakedAsm",
            })
    }
}Debug, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for InlineAsmMacro {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        InlineAsmMacro::Asm => { 0usize }
                        InlineAsmMacro::NakedAsm => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for InlineAsmMacro {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { InlineAsmMacro::Asm }
                    1usize => { InlineAsmMacro::NakedAsm }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `InlineAsmMacro`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            InlineAsmMacro {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    InlineAsmMacro::Asm => {}
                    InlineAsmMacro::NakedAsm => {}
                }
            }
        }
    };StableHash, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for InlineAsmMacro { }
#[automatically_derived]
impl ::core::cmp::PartialEq for InlineAsmMacro {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}PartialEq)]
646#[derive(const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            for InlineAsmMacro {
            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 {
                        InlineAsmMacro::Asm => { InlineAsmMacro::Asm }
                        InlineAsmMacro::NakedAsm => { InlineAsmMacro::NakedAsm }
                    })
            }
            fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    InlineAsmMacro::Asm => { InlineAsmMacro::Asm }
                    InlineAsmMacro::NakedAsm => { InlineAsmMacro::NakedAsm }
                }
            }
        }
    };TypeFoldable, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
            for InlineAsmMacro {
            fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    InlineAsmMacro::Asm => {}
                    InlineAsmMacro::NakedAsm => {}
                }
                <__V::Result as ::rustc_middle::ty::VisitorResult>::output()
            }
        }
    };TypeVisitable)]
647/// The macro that an inline assembly block was created by
648pub enum InlineAsmMacro {
649    /// The `asm!` macro
650    Asm,
651    /// The `naked_asm!` macro
652    NakedAsm,
653}
654
655///////////////////////////////////////////////////////////////////////////
656// Terminators
657
658/// The various kinds of terminators, representing ways of exiting from a basic block.
659///
660/// A note on unwinding: Panics may occur during the execution of some terminators. Depending on the
661/// `-C panic` flag, this may either cause the program to abort or the call stack to unwind. Such
662/// terminators have a `unwind: UnwindAction` field on them. If stack unwinding occurs, then
663/// once the current function is reached, an action will be taken based on the `unwind` field.
664/// If the action is `Cleanup`, then the execution continues at the given basic block. If the
665/// action is `Continue` then no cleanup is performed, and the stack continues unwinding.
666///
667/// The basic block pointed to by a `Cleanup` unwind action must have its `cleanup` flag set.
668/// `cleanup` basic blocks have a couple restrictions:
669///  1. All `unwind` fields in them must be `UnwindAction::Terminate` or `UnwindAction::Unreachable`.
670///  2. `Return` terminators are not allowed in them. `Terminate` and `Resume` terminators are.
671///  3. All other basic blocks (in the current body) that are reachable from `cleanup` basic blocks
672///     must also be `cleanup`. This is a part of the type system and checked statically, so it is
673///     still an error to have such an edge in the CFG even if it's known that it won't be taken at
674///     runtime.
675///  4. The control flow between cleanup blocks must look like an upside down tree. Roughly
676///     speaking, this means that control flow that looks like a V is allowed, while control flow
677///     that looks like a W is not. This is necessary to ensure that landing pad information can be
678///     correctly codegened on MSVC. More precisely:
679///
680///     Begin with the standard control flow graph `G`. Modify `G` as follows: for any two cleanup
681///     vertices `u` and `v` such that `u` dominates `v`, contract `u` and `v` into a single vertex,
682///     deleting self edges and duplicate edges in the process. Now remove all vertices from `G`
683///     that are not cleanup vertices or are not reachable. The resulting graph must be an inverted
684///     tree, that is each vertex may have at most one successor and there may be no cycles.
685#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for TerminatorKind<'tcx> {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Goto { target: __self_0, loop_hint_attrs: __self_1 } =>
                TerminatorKind::Goto {
                    target: ::core::clone::Clone::clone(__self_0),
                    loop_hint_attrs: ::core::clone::Clone::clone(__self_1),
                },
            Self::SwitchInt { discr: __self_0, targets: __self_1 } =>
                TerminatorKind::SwitchInt {
                    discr: ::core::clone::Clone::clone(__self_0),
                    targets: ::core::clone::Clone::clone(__self_1),
                },
            Self::UnwindResume => TerminatorKind::UnwindResume,
            Self::UnwindTerminate(__self_0) =>
                TerminatorKind::UnwindTerminate(::core::clone::Clone::clone(__self_0)),
            Self::Return => TerminatorKind::Return,
            Self::Unreachable => TerminatorKind::Unreachable,
            Self::Drop {
                place: __self_0,
                target: __self_1,
                unwind: __self_2,
                replace: __self_3,
                drop: __self_4 } =>
                TerminatorKind::Drop {
                    place: ::core::clone::Clone::clone(__self_0),
                    target: ::core::clone::Clone::clone(__self_1),
                    unwind: ::core::clone::Clone::clone(__self_2),
                    replace: ::core::clone::Clone::clone(__self_3),
                    drop: ::core::clone::Clone::clone(__self_4),
                },
            Self::Call {
                func: __self_0,
                args: __self_1,
                destination: __self_2,
                target: __self_3,
                unwind: __self_4,
                call_source: __self_5,
                fn_span: __self_6 } =>
                TerminatorKind::Call {
                    func: ::core::clone::Clone::clone(__self_0),
                    args: ::core::clone::Clone::clone(__self_1),
                    destination: ::core::clone::Clone::clone(__self_2),
                    target: ::core::clone::Clone::clone(__self_3),
                    unwind: ::core::clone::Clone::clone(__self_4),
                    call_source: ::core::clone::Clone::clone(__self_5),
                    fn_span: ::core::clone::Clone::clone(__self_6),
                },
            Self::TailCall { func: __self_0, args: __self_1, fn_span: __self_2
                } =>
                TerminatorKind::TailCall {
                    func: ::core::clone::Clone::clone(__self_0),
                    args: ::core::clone::Clone::clone(__self_1),
                    fn_span: ::core::clone::Clone::clone(__self_2),
                },
            Self::Assert {
                cond: __self_0,
                expected: __self_1,
                msg: __self_2,
                target: __self_3,
                unwind: __self_4 } =>
                TerminatorKind::Assert {
                    cond: ::core::clone::Clone::clone(__self_0),
                    expected: ::core::clone::Clone::clone(__self_1),
                    msg: ::core::clone::Clone::clone(__self_2),
                    target: ::core::clone::Clone::clone(__self_3),
                    unwind: ::core::clone::Clone::clone(__self_4),
                },
            Self::Yield {
                value: __self_0,
                resume: __self_1,
                resume_arg: __self_2,
                drop: __self_3 } =>
                TerminatorKind::Yield {
                    value: ::core::clone::Clone::clone(__self_0),
                    resume: ::core::clone::Clone::clone(__self_1),
                    resume_arg: ::core::clone::Clone::clone(__self_2),
                    drop: ::core::clone::Clone::clone(__self_3),
                },
            Self::CoroutineDrop => TerminatorKind::CoroutineDrop,
            Self::FalseEdge {
                real_target: __self_0, imaginary_target: __self_1 } =>
                TerminatorKind::FalseEdge {
                    real_target: ::core::clone::Clone::clone(__self_0),
                    imaginary_target: ::core::clone::Clone::clone(__self_1),
                },
            Self::FalseUnwind { real_target: __self_0, unwind: __self_1 } =>
                TerminatorKind::FalseUnwind {
                    real_target: ::core::clone::Clone::clone(__self_0),
                    unwind: ::core::clone::Clone::clone(__self_1),
                },
            Self::InlineAsm {
                asm_macro: __self_0,
                template: __self_1,
                operands: __self_2,
                options: __self_3,
                line_spans: __self_4,
                targets: __self_5,
                unwind: __self_6 } =>
                TerminatorKind::InlineAsm {
                    asm_macro: ::core::clone::Clone::clone(__self_0),
                    template: ::core::clone::Clone::clone(__self_1),
                    operands: ::core::clone::Clone::clone(__self_2),
                    options: ::core::clone::Clone::clone(__self_3),
                    line_spans: ::core::clone::Clone::clone(__self_4),
                    targets: ::core::clone::Clone::clone(__self_5),
                    unwind: ::core::clone::Clone::clone(__self_6),
                },
        }
    }
}Clone, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for TerminatorKind<'tcx> {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        TerminatorKind::Goto {
                            target: ref __binding_0, loop_hint_attrs: ref __binding_1 }
                            => {
                            0usize
                        }
                        TerminatorKind::SwitchInt {
                            discr: ref __binding_0, targets: ref __binding_1 } => {
                            1usize
                        }
                        TerminatorKind::UnwindResume => { 2usize }
                        TerminatorKind::UnwindTerminate(ref __binding_0) => {
                            3usize
                        }
                        TerminatorKind::Return => { 4usize }
                        TerminatorKind::Unreachable => { 5usize }
                        TerminatorKind::Drop {
                            place: ref __binding_0,
                            target: ref __binding_1,
                            unwind: ref __binding_2,
                            replace: ref __binding_3,
                            drop: ref __binding_4 } => {
                            6usize
                        }
                        TerminatorKind::Call {
                            func: ref __binding_0,
                            args: ref __binding_1,
                            destination: ref __binding_2,
                            target: ref __binding_3,
                            unwind: ref __binding_4,
                            call_source: ref __binding_5,
                            fn_span: ref __binding_6 } => {
                            7usize
                        }
                        TerminatorKind::TailCall {
                            func: ref __binding_0,
                            args: ref __binding_1,
                            fn_span: ref __binding_2 } => {
                            8usize
                        }
                        TerminatorKind::Assert {
                            cond: ref __binding_0,
                            expected: ref __binding_1,
                            msg: ref __binding_2,
                            target: ref __binding_3,
                            unwind: ref __binding_4 } => {
                            9usize
                        }
                        TerminatorKind::Yield {
                            value: ref __binding_0,
                            resume: ref __binding_1,
                            resume_arg: ref __binding_2,
                            drop: ref __binding_3 } => {
                            10usize
                        }
                        TerminatorKind::CoroutineDrop => { 11usize }
                        TerminatorKind::FalseEdge {
                            real_target: ref __binding_0,
                            imaginary_target: ref __binding_1 } => {
                            12usize
                        }
                        TerminatorKind::FalseUnwind {
                            real_target: ref __binding_0, unwind: ref __binding_1 } => {
                            13usize
                        }
                        TerminatorKind::InlineAsm {
                            asm_macro: ref __binding_0,
                            template: __binding_1,
                            operands: ref __binding_2,
                            options: ref __binding_3,
                            line_spans: __binding_4,
                            targets: ref __binding_5,
                            unwind: ref __binding_6 } => {
                            14usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    TerminatorKind::Goto {
                        target: ref __binding_0, loop_hint_attrs: ref __binding_1 }
                        => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TerminatorKind::SwitchInt {
                        discr: ref __binding_0, targets: ref __binding_1 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TerminatorKind::UnwindResume => {}
                    TerminatorKind::UnwindTerminate(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TerminatorKind::Return => {}
                    TerminatorKind::Unreachable => {}
                    TerminatorKind::Drop {
                        place: ref __binding_0,
                        target: ref __binding_1,
                        unwind: ref __binding_2,
                        replace: ref __binding_3,
                        drop: 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);
                    }
                    TerminatorKind::Call {
                        func: ref __binding_0,
                        args: ref __binding_1,
                        destination: ref __binding_2,
                        target: ref __binding_3,
                        unwind: ref __binding_4,
                        call_source: ref __binding_5,
                        fn_span: 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);
                    }
                    TerminatorKind::TailCall {
                        func: ref __binding_0,
                        args: ref __binding_1,
                        fn_span: ref __binding_2 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    TerminatorKind::Assert {
                        cond: ref __binding_0,
                        expected: ref __binding_1,
                        msg: ref __binding_2,
                        target: ref __binding_3,
                        unwind: 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);
                    }
                    TerminatorKind::Yield {
                        value: ref __binding_0,
                        resume: ref __binding_1,
                        resume_arg: ref __binding_2,
                        drop: 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);
                    }
                    TerminatorKind::CoroutineDrop => {}
                    TerminatorKind::FalseEdge {
                        real_target: ref __binding_0,
                        imaginary_target: ref __binding_1 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TerminatorKind::FalseUnwind {
                        real_target: ref __binding_0, unwind: ref __binding_1 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TerminatorKind::InlineAsm {
                        asm_macro: ref __binding_0,
                        template: __binding_1,
                        operands: ref __binding_2,
                        options: ref __binding_3,
                        line_spans: __binding_4,
                        targets: ref __binding_5,
                        unwind: 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 TerminatorKind<'tcx> {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        TerminatorKind::Goto {
                            target: ::rustc_serialize::Decodable::decode(__decoder),
                            loop_hint_attrs: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    1usize => {
                        TerminatorKind::SwitchInt {
                            discr: ::rustc_serialize::Decodable::decode(__decoder),
                            targets: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    2usize => { TerminatorKind::UnwindResume }
                    3usize => {
                        TerminatorKind::UnwindTerminate(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    4usize => { TerminatorKind::Return }
                    5usize => { TerminatorKind::Unreachable }
                    6usize => {
                        TerminatorKind::Drop {
                            place: ::rustc_serialize::Decodable::decode(__decoder),
                            target: ::rustc_serialize::Decodable::decode(__decoder),
                            unwind: ::rustc_serialize::Decodable::decode(__decoder),
                            replace: ::rustc_serialize::Decodable::decode(__decoder),
                            drop: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    7usize => {
                        TerminatorKind::Call {
                            func: ::rustc_serialize::Decodable::decode(__decoder),
                            args: ::rustc_serialize::Decodable::decode(__decoder),
                            destination: ::rustc_serialize::Decodable::decode(__decoder),
                            target: ::rustc_serialize::Decodable::decode(__decoder),
                            unwind: ::rustc_serialize::Decodable::decode(__decoder),
                            call_source: ::rustc_serialize::Decodable::decode(__decoder),
                            fn_span: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    8usize => {
                        TerminatorKind::TailCall {
                            func: ::rustc_serialize::Decodable::decode(__decoder),
                            args: ::rustc_serialize::Decodable::decode(__decoder),
                            fn_span: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    9usize => {
                        TerminatorKind::Assert {
                            cond: ::rustc_serialize::Decodable::decode(__decoder),
                            expected: ::rustc_serialize::Decodable::decode(__decoder),
                            msg: ::rustc_serialize::Decodable::decode(__decoder),
                            target: ::rustc_serialize::Decodable::decode(__decoder),
                            unwind: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    10usize => {
                        TerminatorKind::Yield {
                            value: ::rustc_serialize::Decodable::decode(__decoder),
                            resume: ::rustc_serialize::Decodable::decode(__decoder),
                            resume_arg: ::rustc_serialize::Decodable::decode(__decoder),
                            drop: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    11usize => { TerminatorKind::CoroutineDrop }
                    12usize => {
                        TerminatorKind::FalseEdge {
                            real_target: ::rustc_serialize::Decodable::decode(__decoder),
                            imaginary_target: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    13usize => {
                        TerminatorKind::FalseUnwind {
                            real_target: ::rustc_serialize::Decodable::decode(__decoder),
                            unwind: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    14usize => {
                        TerminatorKind::InlineAsm {
                            asm_macro: ::rustc_serialize::Decodable::decode(__decoder),
                            template: ::rustc_middle::ty::codec::RefDecodable::decode(__decoder),
                            operands: ::rustc_serialize::Decodable::decode(__decoder),
                            options: ::rustc_serialize::Decodable::decode(__decoder),
                            line_spans: ::rustc_middle::ty::codec::RefDecodable::decode(__decoder),
                            targets: ::rustc_serialize::Decodable::decode(__decoder),
                            unwind: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `TerminatorKind`, expected 0..15, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable, const _: () =
    {
        impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
            TerminatorKind<'tcx> {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    TerminatorKind::Goto {
                        target: ref __binding_0, loop_hint_attrs: ref __binding_1 }
                        => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    TerminatorKind::SwitchInt {
                        discr: ref __binding_0, targets: ref __binding_1 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    TerminatorKind::UnwindResume => {}
                    TerminatorKind::UnwindTerminate(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    TerminatorKind::Return => {}
                    TerminatorKind::Unreachable => {}
                    TerminatorKind::Drop {
                        place: ref __binding_0,
                        target: ref __binding_1,
                        unwind: ref __binding_2,
                        replace: ref __binding_3,
                        drop: ref __binding_4 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                        { __binding_3.stable_hash(__hcx, __hasher); }
                        { __binding_4.stable_hash(__hcx, __hasher); }
                    }
                    TerminatorKind::Call {
                        func: ref __binding_0,
                        args: ref __binding_1,
                        destination: ref __binding_2,
                        target: ref __binding_3,
                        unwind: ref __binding_4,
                        call_source: ref __binding_5,
                        fn_span: ref __binding_6 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                        { __binding_3.stable_hash(__hcx, __hasher); }
                        { __binding_4.stable_hash(__hcx, __hasher); }
                        { __binding_5.stable_hash(__hcx, __hasher); }
                        { __binding_6.stable_hash(__hcx, __hasher); }
                    }
                    TerminatorKind::TailCall {
                        func: ref __binding_0,
                        args: ref __binding_1,
                        fn_span: ref __binding_2 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                    }
                    TerminatorKind::Assert {
                        cond: ref __binding_0,
                        expected: ref __binding_1,
                        msg: ref __binding_2,
                        target: ref __binding_3,
                        unwind: ref __binding_4 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                        { __binding_3.stable_hash(__hcx, __hasher); }
                        { __binding_4.stable_hash(__hcx, __hasher); }
                    }
                    TerminatorKind::Yield {
                        value: ref __binding_0,
                        resume: ref __binding_1,
                        resume_arg: ref __binding_2,
                        drop: ref __binding_3 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                        { __binding_3.stable_hash(__hcx, __hasher); }
                    }
                    TerminatorKind::CoroutineDrop => {}
                    TerminatorKind::FalseEdge {
                        real_target: ref __binding_0,
                        imaginary_target: ref __binding_1 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    TerminatorKind::FalseUnwind {
                        real_target: ref __binding_0, unwind: ref __binding_1 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    TerminatorKind::InlineAsm {
                        asm_macro: ref __binding_0,
                        template: ref __binding_1,
                        operands: ref __binding_2,
                        options: ref __binding_3,
                        line_spans: ref __binding_4,
                        targets: ref __binding_5,
                        unwind: ref __binding_6 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                        { __binding_3.stable_hash(__hcx, __hasher); }
                        { __binding_4.stable_hash(__hcx, __hasher); }
                        { __binding_5.stable_hash(__hcx, __hasher); }
                        { __binding_6.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, #[automatically_derived]
impl<'tcx> ::core::marker::StructuralPartialEq for TerminatorKind<'tcx> { }
#[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for TerminatorKind<'tcx> {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Goto { target: __self_0, loop_hint_attrs: __self_1 },
                    Self::Goto { target: __arg1_0, loop_hint_attrs: __arg1_1 })
                    => __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (Self::SwitchInt { discr: __self_0, targets: __self_1 },
                    Self::SwitchInt { discr: __arg1_0, targets: __arg1_1 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (Self::UnwindTerminate(__self_0),
                    Self::UnwindTerminate(__arg1_0)) => __self_0 == __arg1_0,
                (Self::Drop {
                    place: __self_0,
                    target: __self_1,
                    unwind: __self_2,
                    replace: __self_3,
                    drop: __self_4 }, Self::Drop {
                    place: __arg1_0,
                    target: __arg1_1,
                    unwind: __arg1_2,
                    replace: __arg1_3,
                    drop: __arg1_4 }) =>
                    __self_3 == __arg1_3 && __self_0 == __arg1_0 &&
                                __self_1 == __arg1_1 && __self_2 == __arg1_2 &&
                        __self_4 == __arg1_4,
                (Self::Call {
                    func: __self_0,
                    args: __self_1,
                    destination: __self_2,
                    target: __self_3,
                    unwind: __self_4,
                    call_source: __self_5,
                    fn_span: __self_6 }, Self::Call {
                    func: __arg1_0,
                    args: __arg1_1,
                    destination: __arg1_2,
                    target: __arg1_3,
                    unwind: __arg1_4,
                    call_source: __arg1_5,
                    fn_span: __arg1_6 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1 &&
                                        __self_2 == __arg1_2 && __self_3 == __arg1_3 &&
                                __self_4 == __arg1_4 && __self_5 == __arg1_5 &&
                        __self_6 == __arg1_6,
                (Self::TailCall {
                    func: __self_0, args: __self_1, fn_span: __self_2 },
                    Self::TailCall {
                    func: __arg1_0, args: __arg1_1, fn_span: __arg1_2 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1 &&
                        __self_2 == __arg1_2,
                (Self::Assert {
                    cond: __self_0,
                    expected: __self_1,
                    msg: __self_2,
                    target: __self_3,
                    unwind: __self_4 }, Self::Assert {
                    cond: __arg1_0,
                    expected: __arg1_1,
                    msg: __arg1_2,
                    target: __arg1_3,
                    unwind: __arg1_4 }) =>
                    __self_1 == __arg1_1 && __self_0 == __arg1_0 &&
                                __self_2 == __arg1_2 && __self_3 == __arg1_3 &&
                        __self_4 == __arg1_4,
                (Self::Yield {
                    value: __self_0,
                    resume: __self_1,
                    resume_arg: __self_2,
                    drop: __self_3 }, Self::Yield {
                    value: __arg1_0,
                    resume: __arg1_1,
                    resume_arg: __arg1_2,
                    drop: __arg1_3 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1 &&
                            __self_2 == __arg1_2 && __self_3 == __arg1_3,
                (Self::FalseEdge {
                    real_target: __self_0, imaginary_target: __self_1 },
                    Self::FalseEdge {
                    real_target: __arg1_0, imaginary_target: __arg1_1 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (Self::FalseUnwind { real_target: __self_0, unwind: __self_1
                    }, Self::FalseUnwind {
                    real_target: __arg1_0, unwind: __arg1_1 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (Self::InlineAsm {
                    asm_macro: __self_0,
                    template: __self_1,
                    operands: __self_2,
                    options: __self_3,
                    line_spans: __self_4,
                    targets: __self_5,
                    unwind: __self_6 }, Self::InlineAsm {
                    asm_macro: __arg1_0,
                    template: __arg1_1,
                    operands: __arg1_2,
                    options: __arg1_3,
                    line_spans: __arg1_4,
                    targets: __arg1_5,
                    unwind: __arg1_6 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1 &&
                                        __self_2 == __arg1_2 && __self_3 == __arg1_3 &&
                                __self_4 == __arg1_4 && __self_5 == __arg1_5 &&
                        __self_6 == __arg1_6,
                _ => true,
            }
    }
}PartialEq, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            for TerminatorKind<'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 {
                        TerminatorKind::Goto {
                            target: __binding_0, loop_hint_attrs: __binding_1 } => {
                            TerminatorKind::Goto {
                                target: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                loop_hint_attrs: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                            }
                        }
                        TerminatorKind::SwitchInt {
                            discr: __binding_0, targets: __binding_1 } => {
                            TerminatorKind::SwitchInt {
                                discr: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                targets: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                            }
                        }
                        TerminatorKind::UnwindResume => {
                            TerminatorKind::UnwindResume
                        }
                        TerminatorKind::UnwindTerminate(__binding_0) => {
                            TerminatorKind::UnwindTerminate(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        TerminatorKind::Return => { TerminatorKind::Return }
                        TerminatorKind::Unreachable => {
                            TerminatorKind::Unreachable
                        }
                        TerminatorKind::Drop {
                            place: __binding_0,
                            target: __binding_1,
                            unwind: __binding_2,
                            replace: __binding_3,
                            drop: __binding_4 } => {
                            TerminatorKind::Drop {
                                place: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                target: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                                unwind: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_2,
                                        __folder)?,
                                replace: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_3,
                                        __folder)?,
                                drop: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_4,
                                        __folder)?,
                            }
                        }
                        TerminatorKind::Call {
                            func: __binding_0,
                            args: __binding_1,
                            destination: __binding_2,
                            target: __binding_3,
                            unwind: __binding_4,
                            call_source: __binding_5,
                            fn_span: __binding_6 } => {
                            TerminatorKind::Call {
                                func: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                args: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                                destination: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_2,
                                        __folder)?,
                                target: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_3,
                                        __folder)?,
                                unwind: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_4,
                                        __folder)?,
                                call_source: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_5,
                                        __folder)?,
                                fn_span: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_6,
                                        __folder)?,
                            }
                        }
                        TerminatorKind::TailCall {
                            func: __binding_0, args: __binding_1, fn_span: __binding_2 }
                            => {
                            TerminatorKind::TailCall {
                                func: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                args: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                                fn_span: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_2,
                                        __folder)?,
                            }
                        }
                        TerminatorKind::Assert {
                            cond: __binding_0,
                            expected: __binding_1,
                            msg: __binding_2,
                            target: __binding_3,
                            unwind: __binding_4 } => {
                            TerminatorKind::Assert {
                                cond: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                expected: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                                msg: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_2,
                                        __folder)?,
                                target: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_3,
                                        __folder)?,
                                unwind: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_4,
                                        __folder)?,
                            }
                        }
                        TerminatorKind::Yield {
                            value: __binding_0,
                            resume: __binding_1,
                            resume_arg: __binding_2,
                            drop: __binding_3 } => {
                            TerminatorKind::Yield {
                                value: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                resume: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                                resume_arg: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_2,
                                        __folder)?,
                                drop: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_3,
                                        __folder)?,
                            }
                        }
                        TerminatorKind::CoroutineDrop => {
                            TerminatorKind::CoroutineDrop
                        }
                        TerminatorKind::FalseEdge {
                            real_target: __binding_0, imaginary_target: __binding_1 } =>
                            {
                            TerminatorKind::FalseEdge {
                                real_target: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                imaginary_target: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                            }
                        }
                        TerminatorKind::FalseUnwind {
                            real_target: __binding_0, unwind: __binding_1 } => {
                            TerminatorKind::FalseUnwind {
                                real_target: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                unwind: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                            }
                        }
                        TerminatorKind::InlineAsm {
                            asm_macro: __binding_0,
                            template: __binding_1,
                            operands: __binding_2,
                            options: __binding_3,
                            line_spans: __binding_4,
                            targets: __binding_5,
                            unwind: __binding_6 } => {
                            TerminatorKind::InlineAsm {
                                asm_macro: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                template: __binding_1,
                                operands: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_2,
                                        __folder)?,
                                options: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_3,
                                        __folder)?,
                                line_spans: __binding_4,
                                targets: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_5,
                                        __folder)?,
                                unwind: ::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 {
                    TerminatorKind::Goto {
                        target: __binding_0, loop_hint_attrs: __binding_1 } => {
                        TerminatorKind::Goto {
                            target: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            loop_hint_attrs: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                        }
                    }
                    TerminatorKind::SwitchInt {
                        discr: __binding_0, targets: __binding_1 } => {
                        TerminatorKind::SwitchInt {
                            discr: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            targets: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                        }
                    }
                    TerminatorKind::UnwindResume => {
                        TerminatorKind::UnwindResume
                    }
                    TerminatorKind::UnwindTerminate(__binding_0) => {
                        TerminatorKind::UnwindTerminate(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    TerminatorKind::Return => { TerminatorKind::Return }
                    TerminatorKind::Unreachable => {
                        TerminatorKind::Unreachable
                    }
                    TerminatorKind::Drop {
                        place: __binding_0,
                        target: __binding_1,
                        unwind: __binding_2,
                        replace: __binding_3,
                        drop: __binding_4 } => {
                        TerminatorKind::Drop {
                            place: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            target: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                            unwind: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_2,
                                __folder),
                            replace: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_3,
                                __folder),
                            drop: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_4,
                                __folder),
                        }
                    }
                    TerminatorKind::Call {
                        func: __binding_0,
                        args: __binding_1,
                        destination: __binding_2,
                        target: __binding_3,
                        unwind: __binding_4,
                        call_source: __binding_5,
                        fn_span: __binding_6 } => {
                        TerminatorKind::Call {
                            func: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            args: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                            destination: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_2,
                                __folder),
                            target: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_3,
                                __folder),
                            unwind: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_4,
                                __folder),
                            call_source: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_5,
                                __folder),
                            fn_span: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_6,
                                __folder),
                        }
                    }
                    TerminatorKind::TailCall {
                        func: __binding_0, args: __binding_1, fn_span: __binding_2 }
                        => {
                        TerminatorKind::TailCall {
                            func: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            args: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                            fn_span: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_2,
                                __folder),
                        }
                    }
                    TerminatorKind::Assert {
                        cond: __binding_0,
                        expected: __binding_1,
                        msg: __binding_2,
                        target: __binding_3,
                        unwind: __binding_4 } => {
                        TerminatorKind::Assert {
                            cond: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            expected: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                            msg: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_2,
                                __folder),
                            target: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_3,
                                __folder),
                            unwind: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_4,
                                __folder),
                        }
                    }
                    TerminatorKind::Yield {
                        value: __binding_0,
                        resume: __binding_1,
                        resume_arg: __binding_2,
                        drop: __binding_3 } => {
                        TerminatorKind::Yield {
                            value: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            resume: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                            resume_arg: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_2,
                                __folder),
                            drop: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_3,
                                __folder),
                        }
                    }
                    TerminatorKind::CoroutineDrop => {
                        TerminatorKind::CoroutineDrop
                    }
                    TerminatorKind::FalseEdge {
                        real_target: __binding_0, imaginary_target: __binding_1 } =>
                        {
                        TerminatorKind::FalseEdge {
                            real_target: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            imaginary_target: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                        }
                    }
                    TerminatorKind::FalseUnwind {
                        real_target: __binding_0, unwind: __binding_1 } => {
                        TerminatorKind::FalseUnwind {
                            real_target: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            unwind: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                        }
                    }
                    TerminatorKind::InlineAsm {
                        asm_macro: __binding_0,
                        template: __binding_1,
                        operands: __binding_2,
                        options: __binding_3,
                        line_spans: __binding_4,
                        targets: __binding_5,
                        unwind: __binding_6 } => {
                        TerminatorKind::InlineAsm {
                            asm_macro: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            template: __binding_1,
                            operands: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_2,
                                __folder),
                            options: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_3,
                                __folder),
                            line_spans: __binding_4,
                            targets: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_5,
                                __folder),
                            unwind: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_6,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
            for TerminatorKind<'tcx> {
            fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    TerminatorKind::Goto {
                        target: ref __binding_0, loop_hint_attrs: 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);
                                }
                            }
                        }
                    }
                    TerminatorKind::SwitchInt {
                        discr: ref __binding_0, targets: 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);
                                }
                            }
                        }
                    }
                    TerminatorKind::UnwindResume => {}
                    TerminatorKind::UnwindTerminate(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);
                                }
                            }
                        }
                    }
                    TerminatorKind::Return => {}
                    TerminatorKind::Unreachable => {}
                    TerminatorKind::Drop {
                        place: ref __binding_0,
                        target: ref __binding_1,
                        unwind: ref __binding_2,
                        replace: ref __binding_3,
                        drop: 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);
                                }
                            }
                        }
                    }
                    TerminatorKind::Call {
                        func: ref __binding_0,
                        args: ref __binding_1,
                        destination: ref __binding_2,
                        target: ref __binding_3,
                        unwind: ref __binding_4,
                        call_source: ref __binding_5,
                        fn_span: 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);
                                }
                            }
                        }
                    }
                    TerminatorKind::TailCall {
                        func: ref __binding_0,
                        args: ref __binding_1,
                        fn_span: ref __binding_2 } => {
                        {
                            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);
                                }
                            }
                        }
                    }
                    TerminatorKind::Assert {
                        cond: ref __binding_0,
                        expected: ref __binding_1,
                        msg: ref __binding_2,
                        target: ref __binding_3,
                        unwind: 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);
                                }
                            }
                        }
                    }
                    TerminatorKind::Yield {
                        value: ref __binding_0,
                        resume: ref __binding_1,
                        resume_arg: ref __binding_2,
                        drop: 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);
                                }
                            }
                        }
                    }
                    TerminatorKind::CoroutineDrop => {}
                    TerminatorKind::FalseEdge {
                        real_target: ref __binding_0,
                        imaginary_target: 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);
                                }
                            }
                        }
                    }
                    TerminatorKind::FalseUnwind {
                        real_target: ref __binding_0, unwind: 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);
                                }
                            }
                        }
                    }
                    TerminatorKind::InlineAsm {
                        asm_macro: ref __binding_0,
                        operands: ref __binding_2,
                        options: ref __binding_3,
                        targets: ref __binding_5,
                        unwind: 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_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_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)]
686pub enum TerminatorKind<'tcx> {
687    /// Block has one successor; we continue execution there.
688    Goto { target: BasicBlock, loop_hint_attrs: ThinVec<UnrollAttr> },
689
690    /// Switches based on the computed value.
691    ///
692    /// First, evaluates the `discr` operand. The type of the operand must be a signed or unsigned
693    /// integer, char, or bool, and must match the given type. Then, if the list of switch targets
694    /// contains the computed value, continues execution at the associated basic block. Otherwise,
695    /// continues execution at the "otherwise" basic block.
696    ///
697    /// Target values may not appear more than once.
698    SwitchInt {
699        /// The discriminant value being tested.
700        discr: Operand<'tcx>,
701        targets: SwitchTargets,
702    },
703
704    /// Indicates that the landing pad is finished and that the process should continue unwinding.
705    ///
706    /// Like a return, this marks the end of this invocation of the function.
707    ///
708    /// Only permitted in cleanup blocks. `Resume` is not permitted with `-C unwind=abort` after
709    /// deaggregation runs.
710    UnwindResume,
711
712    /// Indicates that the landing pad is finished and that the process should terminate.
713    ///
714    /// Used to prevent unwinding for foreign items or with `-C unwind=abort`. Only permitted in
715    /// cleanup blocks.
716    UnwindTerminate(UnwindTerminateReason),
717
718    /// Returns from the function.
719    ///
720    /// Like function calls, the exact semantics of returns in Rust are unclear. Returning very
721    /// likely at least assigns the value currently in the return place (`_0`) to the place
722    /// specified in the associated `Call` terminator in the calling function, as if assigned via
723    /// `dest = move _0`. It might additionally do other things, like have side-effects in the
724    /// aliasing model.
725    ///
726    /// If the body is a coroutine body, this has slightly different semantics; it instead causes a
727    /// `CoroutineState::Returned(_0)` to be created (as if by an `Aggregate` rvalue) and assigned
728    /// to the return place.
729    Return,
730
731    /// Indicates a terminator that can never be reached.
732    ///
733    /// Executing this terminator is UB.
734    Unreachable,
735
736    /// The behavior of this statement differs significantly before and after drop elaboration.
737    ///
738    /// After drop elaboration: `Drop` terminators are a complete nop for types that have no drop
739    /// glue. For other types, `Drop` terminators behave exactly like a call to
740    /// `core::mem::drop_glue` with a reference to the given place.
741    ///
742    /// `Drop` before drop elaboration is a *conditional* execution of the drop glue. Specifically,
743    /// the `Drop` will be executed if...
744    ///
745    /// **Needs clarification**: End of that sentence. This in effect should document the exact
746    /// behavior of drop elaboration. The following sounds vaguely right, but I'm not quite sure:
747    ///
748    /// > The drop glue is executed if, among all statements executed within this `Body`, an assignment to
749    /// > the place or one of its "parents" occurred more recently than a move out of it. This does not
750    /// > consider indirect assignments.
751    ///
752    /// The `replace` flag indicates whether this terminator was created as part of an assignment.
753    /// This should only be used for diagnostic purposes, and does not have any operational
754    /// meaning.
755    ///
756    /// Async drop processing:
757    ///   MIR building detects possible async drops, and constructs a complete CFG. To correctly
758    ///   handle the coroutine being dropped while itself drops, we need a 'drop' target
759    ///   similar to `Yield` terminator (see `drops.build_mir::<CoroutineDrop>`).
760    ///
761    ///   Drop elaboration later refines the set of useful async drops. If there is no need for an
762    ///   async drop, it is downgraded to a sync drop by setting `drop` to `None` If this is an
763    ///   actual async drop, it is expanded to an `await` loop over the `async_drop_in_place` or
764    ///   `AsyncDrop::drop` coroutine.
765    ///
766    ///   When a coroutine has any internal async drop, the coroutine drop function will be async
767    ///   (generated by `create_coroutine_drop_shim_async`, not `create_coroutine_drop_shim`).
768    Drop {
769        place: Place<'tcx>,
770        target: BasicBlock,
771        unwind: UnwindAction,
772        replace: bool,
773        /// Cleanup to be done if the coroutine is dropped at this suspend point (for async drop).
774        drop: Option<BasicBlock>,
775    },
776
777    /// Roughly speaking, evaluates the `func` operand and the arguments, and starts execution of
778    /// the referred to function. The operand types must match the argument types of the function.
779    /// The return place type must match the return type. The type of the `func` operand must be
780    /// callable, meaning either a function pointer, a function type, or a closure type.
781    ///
782    /// **Needs clarification**: The exact semantics of this. Current backends rely on `move`
783    /// operands not aliasing the return place. It is unclear how this is justified in MIR, see
784    /// [#71117].
785    ///
786    /// The evaluation order is currently "first compute destination place, then `func` operand,
787    /// then the arguments in left-to-right order".
788    ///
789    /// [#71117]: https://github.com/rust-lang/rust/issues/71117
790    Call {
791        /// The function that’s being called.
792        func: Operand<'tcx>,
793        /// Arguments the function is called with.
794        /// These are owned by the callee, which is free to modify them.
795        /// This allows the memory occupied by "by-value" arguments to be
796        /// reused across function calls without duplicating the contents.
797        /// The span for each arg is also included
798        /// (e.g. `a` and `b` in `x.foo(a, b)`).
799        args: Box<[Spanned<Operand<'tcx>>]>,
800        /// Where the returned value will be written
801        destination: Place<'tcx>,
802        /// Where to go after this call returns. If none, the call necessarily diverges.
803        target: Option<BasicBlock>,
804        /// Action to be taken if the call unwinds.
805        unwind: UnwindAction,
806        /// Where this call came from in HIR/THIR.
807        call_source: CallSource,
808        /// This `Span` is the span of the function, without the dot and receiver
809        /// e.g. `foo(a, b)` in `x.foo(a, b)`
810        fn_span: Span,
811    },
812
813    /// Tail call.
814    ///
815    /// Roughly speaking this is a chimera of [`Call`] and [`Return`], with some caveats.
816    /// Semantically tail calls consists of two actions:
817    /// - pop of the current stack frame
818    /// - a call to the `func`, with the return address of the **current** caller
819    ///   - so that a `return` inside `func` returns to the caller of the caller
820    ///     of the function that is currently being executed
821    ///
822    /// Note that in difference with [`Call`] this is missing
823    /// - `destination` (because it's always the return place)
824    /// - `target` (because it's always taken from the current stack frame)
825    /// - `unwind` (because it's always taken from the current stack frame)
826    ///
827    /// [`Call`]: TerminatorKind::Call
828    /// [`Return`]: TerminatorKind::Return
829    TailCall {
830        /// The function that’s being called.
831        func: Operand<'tcx>,
832        /// Arguments the function is called with.
833        /// These are owned by the callee, which is free to modify them.
834        /// This allows the memory occupied by "by-value" arguments to be
835        /// reused across function calls without duplicating the contents.
836        args: Box<[Spanned<Operand<'tcx>>]>,
837        // FIXME(explicit_tail_calls): should we have the span for `become`? is this span accurate? do we need it?
838        /// This `Span` is the span of the function, without the dot and receiver
839        /// (e.g. `foo(a, b)` in `x.foo(a, b)`
840        fn_span: Span,
841    },
842
843    /// Evaluates the operand, which must have type `bool`. If it is not equal to `expected`,
844    /// initiates a panic. Initiating a panic corresponds to a `Call` terminator with some
845    /// unspecified constant as the function to call, all the operands stored in the `AssertMessage`
846    /// as parameters, and `None` for the destination. Keep in mind that the `cleanup` path is not
847    /// necessarily executed even in the case of a panic, for example in `-C panic=abort`. If the
848    /// assertion does not fail, execution continues at the specified basic block.
849    ///
850    /// When overflow checking is disabled and this is run-time MIR (as opposed to compile-time MIR
851    /// that is used for CTFE), the following variants of this terminator behave as `goto target`:
852    /// - `OverflowNeg(..)`,
853    /// - `Overflow(op, ..)` if op is add, sub, mul, shl, shr, but NOT div or rem.
854    Assert {
855        cond: Operand<'tcx>,
856        expected: bool,
857        msg: Box<AssertMessage<'tcx>>,
858        target: BasicBlock,
859        unwind: UnwindAction,
860    },
861
862    /// Marks a suspend point.
863    ///
864    /// Like `Return` terminators in coroutine bodies, this computes `value` and then a
865    /// `CoroutineState::Yielded(value)` as if by `Aggregate` rvalue. That value is then assigned
866    /// to the return place provided by the caller function, and execution continues in this caller
867    /// function.
868    ///
869    /// When the coroutine is resumed/polled, execution of this function continues at the `resume`
870    /// basic block, the `resume_arg` place is evaluated and the second argument to `resume/poll`
871    /// is written to it.
872    ///
873    /// If the coroutine is dropped before then, execution of this function continues at the `drop`
874    /// basic block and the `resume_arg` place expression is evaluated. For async drop, the second
875    /// argument to the destructor `resume/poll` method is written to `resume_arg`. For synchronous
876    /// drops, uninitialized bytes are written to `resume_arg`.
877    ///
878    /// Note that coroutines can be (unstably) cloned under certain conditions, which means that
879    /// this terminator can **return multiple times**! MIR optimizations that reorder code into
880    /// different basic blocks needs to be aware of that.
881    /// See <https://github.com/rust-lang/rust/issues/95360>.
882    ///
883    /// Not permitted in bodies that are not coroutine bodies, or after coroutine lowering.
884    Yield {
885        /// The value to return.
886        value: Operand<'tcx>,
887        /// Where to resume to.
888        resume: BasicBlock,
889        /// The place to store the resume argument in.
890        resume_arg: Place<'tcx>,
891        /// Cleanup to be done if the coroutine is dropped at this suspend point.
892        drop: Option<BasicBlock>,
893    },
894
895    /// Indicates the end of dropping a coroutine.
896    ///
897    /// Semantically just a `return` (from the coroutines drop glue). Only permitted in the same situations
898    /// as `yield`.
899    ///
900    /// **Needs clarification**: Is that even correct? The coroutine drop code is always confusing
901    /// to me, because it's not even really in the current body.
902    ///
903    /// **Needs clarification**: Are there type system constraints on these terminators? Should
904    /// there be a "block type" like `cleanup` blocks for them?
905    CoroutineDrop,
906
907    /// A block where control flow only ever takes one real path, but borrowck needs to be more
908    /// conservative.
909    ///
910    /// At runtime this is semantically just a goto.
911    ///
912    /// Disallowed after drop elaboration.
913    FalseEdge {
914        /// The target normal control flow will take.
915        real_target: BasicBlock,
916        /// A block control flow could conceptually jump to, but won't in
917        /// practice.
918        imaginary_target: BasicBlock,
919    },
920
921    /// A terminator for blocks that only take one path in reality, but where we reserve the right
922    /// to unwind in borrowck, even if it won't happen in practice. This can arise in infinite loops
923    /// with no function calls for example.
924    ///
925    /// At runtime this is semantically just a goto.
926    ///
927    /// Disallowed after drop elaboration.
928    FalseUnwind {
929        /// The target normal control flow will take.
930        real_target: BasicBlock,
931        /// The imaginary cleanup block link. This particular path will never be taken
932        /// in practice, but in order to avoid fragility we want to always
933        /// consider it in borrowck. We don't want to accept programs which
934        /// pass borrowck only when `panic=abort` or some assertions are disabled
935        /// due to release vs. debug mode builds.
936        unwind: UnwindAction,
937    },
938
939    /// Block ends with an inline assembly block. This is a terminator since
940    /// inline assembly is allowed to diverge.
941    InlineAsm {
942        /// Macro used to create this inline asm: one of `asm!` or `naked_asm!`
943        asm_macro: InlineAsmMacro,
944
945        /// The template for the inline assembly, with placeholders.
946        #[type_foldable(identity)]
947        #[type_visitable(ignore)]
948        template: &'tcx [InlineAsmTemplatePiece],
949
950        /// The operands for the inline assembly, as `Operand`s or `Place`s.
951        operands: Box<[InlineAsmOperand<'tcx>]>,
952
953        /// Miscellaneous options for the inline assembly.
954        options: InlineAsmOptions,
955
956        /// Source spans for each line of the inline assembly code. These are
957        /// used to map assembler errors back to the line in the source code.
958        #[type_foldable(identity)]
959        #[type_visitable(ignore)]
960        line_spans: &'tcx [Span],
961
962        /// Valid targets for the inline assembly.
963        /// The first element is the fallthrough destination, unless
964        /// asm_macro == InlineAsmMacro::NakedAsm or InlineAsmOptions::NORETURN is set.
965        targets: Box<[BasicBlock]>,
966
967        /// Action to be taken if the inline assembly unwinds. This is present
968        /// if and only if InlineAsmOptions::MAY_UNWIND is set.
969        unwind: UnwindAction,
970    },
971}
972
973#[derive(#[automatically_derived]
impl ::core::clone::Clone for BackwardIncompatibleDropReason {
    #[inline]
    fn clone(&self) -> Self { BackwardIncompatibleDropReason::Edition2024 }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for BackwardIncompatibleDropReason {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f, "Edition2024")
    }
}Debug, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for
            BackwardIncompatibleDropReason {
            fn encode(&self, __encoder: &mut __E) {}
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for
            BackwardIncompatibleDropReason {
            fn decode(__decoder: &mut __D) -> Self {
                BackwardIncompatibleDropReason::Edition2024
            }
        }
    };TyDecodable, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            BackwardIncompatibleDropReason {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    BackwardIncompatibleDropReason::Edition2024 => {}
                }
            }
        }
    };StableHash, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for BackwardIncompatibleDropReason {
}
#[automatically_derived]
impl ::core::cmp::PartialEq for BackwardIncompatibleDropReason {
    #[inline]
    fn eq(&self, other: &Self) -> bool { true }
}PartialEq)]
974#[derive(const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            for BackwardIncompatibleDropReason {
            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 {
                        BackwardIncompatibleDropReason::Edition2024 => {
                            BackwardIncompatibleDropReason::Edition2024
                        }
                    })
            }
            fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    BackwardIncompatibleDropReason::Edition2024 => {
                        BackwardIncompatibleDropReason::Edition2024
                    }
                }
            }
        }
    };TypeFoldable, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
            for BackwardIncompatibleDropReason {
            fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    BackwardIncompatibleDropReason::Edition2024 => {}
                }
                <__V::Result as ::rustc_middle::ty::VisitorResult>::output()
            }
        }
    };TypeVisitable)]
975pub enum BackwardIncompatibleDropReason {
976    Edition2024,
977}
978
979#[derive(#[automatically_derived]
impl ::core::fmt::Debug for SwitchTargets {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "SwitchTargets",
            "values", &self.values, "targets", &&self.targets)
    }
}Debug, #[automatically_derived]
impl ::core::clone::Clone for SwitchTargets {
    #[inline]
    fn clone(&self) -> Self {
        SwitchTargets {
            values: ::core::clone::Clone::clone(&self.values),
            targets: ::core::clone::Clone::clone(&self.targets),
        }
    }
}Clone, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for SwitchTargets {
            fn encode(&self, __encoder: &mut __E) {
                let SwitchTargets {
                        values: ref __binding_0, targets: ref __binding_1 } = *self;
                ::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 SwitchTargets {
            fn decode(__decoder: &mut __D) -> Self {
                SwitchTargets {
                    values: ::rustc_serialize::Decodable::decode(__decoder),
                    targets: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };TyDecodable, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            SwitchTargets {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    SwitchTargets {
                        values: ref __binding_0, targets: ref __binding_1 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for SwitchTargets { }
#[automatically_derived]
impl ::core::cmp::PartialEq for SwitchTargets {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        self.values == other.values && self.targets == other.targets
    }
}PartialEq)]
980pub struct SwitchTargets {
981    /// Possible values. For each value, the location to branch to is found in
982    /// the corresponding element in the `targets` vector.
983    pub(super) values: SmallVec<[Pu128; 1]>,
984
985    /// Possible branch targets. The last element of this vector is used for
986    /// the "otherwise" branch, so `targets.len() == values.len() + 1` always
987    /// holds.
988    //
989    // Note: This invariant is non-obvious and easy to violate. This would be a
990    // more rigorous representation:
991    //
992    //   normal: SmallVec<[(Pu128, BasicBlock); 1]>,
993    //   otherwise: BasicBlock,
994    //
995    // But it's important to have the targets in a sliceable type, because
996    // target slices show up elsewhere. E.g. `TerminatorKind::InlineAsm` has a
997    // boxed slice, and `TerminatorKind::FalseEdge` has a single target that
998    // can be converted to a slice with `slice::from_ref`.
999    //
1000    // Why does this matter? In functions like `TerminatorKind::successors` we
1001    // return `impl Iterator` and a non-slice-of-targets representation here
1002    // causes problems because multiple different concrete iterator types would
1003    // be involved and we would need a boxed trait object, which requires an
1004    // allocation, which is expensive if done frequently.
1005    pub(super) targets: SmallVec<[BasicBlock; 2]>,
1006}
1007
1008/// Action to be taken when a stack unwind happens.
1009#[derive(#[automatically_derived]
impl ::core::marker::Copy for UnwindAction { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for UnwindAction { }
#[automatically_derived]
impl ::core::clone::Clone for UnwindAction {
    #[inline]
    fn clone(&self) -> Self {
        let _: ::core::clone::AssertParamIsClone<UnwindTerminateReason>;
        let _: ::core::clone::AssertParamIsClone<BasicBlock>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for UnwindAction {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Self::Continue =>
                ::core::fmt::Formatter::write_str(f, "Continue"),
            Self::Unreachable =>
                ::core::fmt::Formatter::write_str(f, "Unreachable"),
            Self::Terminate(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Terminate", &__self_0),
            Self::Cleanup(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Cleanup", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for UnwindAction { }
#[automatically_derived]
impl ::core::cmp::PartialEq for UnwindAction {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Terminate(__self_0), Self::Terminate(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::Cleanup(__self_0), Self::Cleanup(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for UnwindAction {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<UnwindTerminateReason>;
        let _: ::core::cmp::AssertParamIsEq<BasicBlock>;
    }
}Eq, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for UnwindAction {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        UnwindAction::Continue => { 0usize }
                        UnwindAction::Unreachable => { 1usize }
                        UnwindAction::Terminate(ref __binding_0) => { 2usize }
                        UnwindAction::Cleanup(ref __binding_0) => { 3usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    UnwindAction::Continue => {}
                    UnwindAction::Unreachable => {}
                    UnwindAction::Terminate(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    UnwindAction::Cleanup(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 UnwindAction {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { UnwindAction::Continue }
                    1usize => { UnwindAction::Unreachable }
                    2usize => {
                        UnwindAction::Terminate(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => {
                        UnwindAction::Cleanup(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `UnwindAction`, expected 0..4, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for UnwindAction
            {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    UnwindAction::Continue => {}
                    UnwindAction::Unreachable => {}
                    UnwindAction::Terminate(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    UnwindAction::Cleanup(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
1010#[derive(const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            for UnwindAction {
            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 {
                        UnwindAction::Continue => { UnwindAction::Continue }
                        UnwindAction::Unreachable => { UnwindAction::Unreachable }
                        UnwindAction::Terminate(__binding_0) => {
                            UnwindAction::Terminate(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        UnwindAction::Cleanup(__binding_0) => {
                            UnwindAction::Cleanup(::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 {
                    UnwindAction::Continue => { UnwindAction::Continue }
                    UnwindAction::Unreachable => { UnwindAction::Unreachable }
                    UnwindAction::Terminate(__binding_0) => {
                        UnwindAction::Terminate(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    UnwindAction::Cleanup(__binding_0) => {
                        UnwindAction::Cleanup(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                }
            }
        }
    };TypeFoldable, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
            for UnwindAction {
            fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    UnwindAction::Continue => {}
                    UnwindAction::Unreachable => {}
                    UnwindAction::Terminate(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);
                                }
                            }
                        }
                    }
                    UnwindAction::Cleanup(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)]
1011pub enum UnwindAction {
1012    /// No action is to be taken. Continue unwinding.
1013    ///
1014    /// This is similar to `Cleanup(bb)` where `bb` does nothing but `Resume`, but they are not
1015    /// equivalent, as presence of `Cleanup(_)` will make a frame non-POF.
1016    Continue,
1017    /// Triggers undefined behavior if unwind happens.
1018    Unreachable,
1019    /// Terminates the execution if unwind happens.
1020    ///
1021    /// Depending on the platform and situation this may cause a non-unwindable panic or abort.
1022    Terminate(UnwindTerminateReason),
1023    /// Cleanups to be done.
1024    Cleanup(BasicBlock),
1025}
1026
1027/// The reason we are terminating the process during unwinding.
1028#[derive(#[automatically_derived]
impl ::core::marker::Copy for UnwindTerminateReason { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for UnwindTerminateReason { }
#[automatically_derived]
impl ::core::clone::Clone for UnwindTerminateReason {
    #[inline]
    fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for UnwindTerminateReason {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                UnwindTerminateReason::Abi => "Abi",
                UnwindTerminateReason::InCleanup => "InCleanup",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for UnwindTerminateReason { }
#[automatically_derived]
impl ::core::cmp::PartialEq for UnwindTerminateReason {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for UnwindTerminateReason { }Eq, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for UnwindTerminateReason {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        UnwindTerminateReason::Abi => { 0usize }
                        UnwindTerminateReason::InCleanup => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for UnwindTerminateReason {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { UnwindTerminateReason::Abi }
                    1usize => { UnwindTerminateReason::InCleanup }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `UnwindTerminateReason`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            UnwindTerminateReason {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    UnwindTerminateReason::Abi => {}
                    UnwindTerminateReason::InCleanup => {}
                }
            }
        }
    };StableHash)]
1029#[derive(const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            for UnwindTerminateReason {
            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 {
                        UnwindTerminateReason::Abi => { UnwindTerminateReason::Abi }
                        UnwindTerminateReason::InCleanup => {
                            UnwindTerminateReason::InCleanup
                        }
                    })
            }
            fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    UnwindTerminateReason::Abi => { UnwindTerminateReason::Abi }
                    UnwindTerminateReason::InCleanup => {
                        UnwindTerminateReason::InCleanup
                    }
                }
            }
        }
    };TypeFoldable, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
            for UnwindTerminateReason {
            fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    UnwindTerminateReason::Abi => {}
                    UnwindTerminateReason::InCleanup => {}
                }
                <__V::Result as ::rustc_middle::ty::VisitorResult>::output()
            }
        }
    };TypeVisitable)]
1030pub enum UnwindTerminateReason {
1031    /// Unwinding is just not possible given the ABI of this function.
1032    Abi,
1033    /// We were already cleaning up for an ongoing unwind, and a *second*, *nested* unwind was
1034    /// triggered by the drop glue.
1035    InCleanup,
1036}
1037
1038/// Information about an assertion failure.
1039#[derive(#[automatically_derived]
impl<O: ::core::clone::Clone> ::core::clone::Clone for AssertKind<O> {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::BoundsCheck { len: __self_0, index: __self_1 } =>
                AssertKind::BoundsCheck {
                    len: ::core::clone::Clone::clone(__self_0),
                    index: ::core::clone::Clone::clone(__self_1),
                },
            Self::Overflow(__self_0, __self_1, __self_2) =>
                AssertKind::Overflow(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            Self::OverflowNeg(__self_0) =>
                AssertKind::OverflowNeg(::core::clone::Clone::clone(__self_0)),
            Self::DivisionByZero(__self_0) =>
                AssertKind::DivisionByZero(::core::clone::Clone::clone(__self_0)),
            Self::RemainderByZero(__self_0) =>
                AssertKind::RemainderByZero(::core::clone::Clone::clone(__self_0)),
            Self::ResumedAfterReturn(__self_0) =>
                AssertKind::ResumedAfterReturn(::core::clone::Clone::clone(__self_0)),
            Self::ResumedAfterPanic(__self_0) =>
                AssertKind::ResumedAfterPanic(::core::clone::Clone::clone(__self_0)),
            Self::ResumedAfterDrop(__self_0) =>
                AssertKind::ResumedAfterDrop(::core::clone::Clone::clone(__self_0)),
            Self::MisalignedPointerDereference {
                required: __self_0, found: __self_1 } =>
                AssertKind::MisalignedPointerDereference {
                    required: ::core::clone::Clone::clone(__self_0),
                    found: ::core::clone::Clone::clone(__self_1),
                },
            Self::NullPointerDereference =>
                AssertKind::NullPointerDereference,
            Self::NullReferenceConstructed =>
                AssertKind::NullReferenceConstructed,
            Self::InvalidEnumConstruction(__self_0) =>
                AssertKind::InvalidEnumConstruction(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<O> ::rustc_data_structures::stable_hash::StableHash for
            AssertKind<O> where
            O: ::rustc_data_structures::stable_hash::StableHash {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    AssertKind::BoundsCheck {
                        len: ref __binding_0, index: ref __binding_1 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    AssertKind::Overflow(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                    }
                    AssertKind::OverflowNeg(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    AssertKind::DivisionByZero(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    AssertKind::RemainderByZero(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    AssertKind::ResumedAfterReturn(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    AssertKind::ResumedAfterPanic(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    AssertKind::ResumedAfterDrop(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    AssertKind::MisalignedPointerDereference {
                        required: ref __binding_0, found: ref __binding_1 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    AssertKind::NullPointerDereference => {}
                    AssertKind::NullReferenceConstructed => {}
                    AssertKind::InvalidEnumConstruction(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, #[automatically_derived]
impl<O: ::core::cmp::PartialEq> ::core::marker::StructuralPartialEq for
    AssertKind<O> {
}
#[automatically_derived]
impl<O: ::core::cmp::PartialEq> ::core::cmp::PartialEq for AssertKind<O> {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::BoundsCheck { len: __self_0, index: __self_1 },
                    Self::BoundsCheck { len: __arg1_0, index: __arg1_1 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (Self::Overflow(__self_0, __self_1, __self_2),
                    Self::Overflow(__arg1_0, __arg1_1, __arg1_2)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1 &&
                        __self_2 == __arg1_2,
                (Self::OverflowNeg(__self_0), Self::OverflowNeg(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::DivisionByZero(__self_0),
                    Self::DivisionByZero(__arg1_0)) => __self_0 == __arg1_0,
                (Self::RemainderByZero(__self_0),
                    Self::RemainderByZero(__arg1_0)) => __self_0 == __arg1_0,
                (Self::ResumedAfterReturn(__self_0),
                    Self::ResumedAfterReturn(__arg1_0)) => __self_0 == __arg1_0,
                (Self::ResumedAfterPanic(__self_0),
                    Self::ResumedAfterPanic(__arg1_0)) => __self_0 == __arg1_0,
                (Self::ResumedAfterDrop(__self_0),
                    Self::ResumedAfterDrop(__arg1_0)) => __self_0 == __arg1_0,
                (Self::MisalignedPointerDereference {
                    required: __self_0, found: __self_1 },
                    Self::MisalignedPointerDereference {
                    required: __arg1_0, found: __arg1_1 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (Self::InvalidEnumConstruction(__self_0),
                    Self::InvalidEnumConstruction(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl<O: ::core::fmt::Debug> ::core::fmt::Debug for AssertKind<O> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Self::BoundsCheck { len: __self_0, index: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "BoundsCheck", "len", __self_0, "index", &__self_1),
            Self::Overflow(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f,
                    "Overflow", __self_0, __self_1, &__self_2),
            Self::OverflowNeg(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "OverflowNeg", &__self_0),
            Self::DivisionByZero(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "DivisionByZero", &__self_0),
            Self::RemainderByZero(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "RemainderByZero", &__self_0),
            Self::ResumedAfterReturn(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ResumedAfterReturn", &__self_0),
            Self::ResumedAfterPanic(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ResumedAfterPanic", &__self_0),
            Self::ResumedAfterDrop(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ResumedAfterDrop", &__self_0),
            Self::MisalignedPointerDereference {
                required: __self_0, found: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "MisalignedPointerDereference", "required", __self_0,
                    "found", &__self_1),
            Self::NullPointerDereference =>
                ::core::fmt::Formatter::write_str(f,
                    "NullPointerDereference"),
            Self::NullReferenceConstructed =>
                ::core::fmt::Formatter::write_str(f,
                    "NullReferenceConstructed"),
            Self::InvalidEnumConstruction(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "InvalidEnumConstruction", &__self_0),
        }
    }
}Debug)]
1040#[derive(const _: () =
    {
        impl<'tcx, O, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for AssertKind<O> where
            O: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        AssertKind::BoundsCheck {
                            len: ref __binding_0, index: ref __binding_1 } => {
                            0usize
                        }
                        AssertKind::Overflow(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            1usize
                        }
                        AssertKind::OverflowNeg(ref __binding_0) => { 2usize }
                        AssertKind::DivisionByZero(ref __binding_0) => { 3usize }
                        AssertKind::RemainderByZero(ref __binding_0) => { 4usize }
                        AssertKind::ResumedAfterReturn(ref __binding_0) => {
                            5usize
                        }
                        AssertKind::ResumedAfterPanic(ref __binding_0) => { 6usize }
                        AssertKind::ResumedAfterDrop(ref __binding_0) => { 7usize }
                        AssertKind::MisalignedPointerDereference {
                            required: ref __binding_0, found: ref __binding_1 } => {
                            8usize
                        }
                        AssertKind::NullPointerDereference => { 9usize }
                        AssertKind::NullReferenceConstructed => { 10usize }
                        AssertKind::InvalidEnumConstruction(ref __binding_0) => {
                            11usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    AssertKind::BoundsCheck {
                        len: ref __binding_0, index: ref __binding_1 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    AssertKind::Overflow(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    AssertKind::OverflowNeg(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AssertKind::DivisionByZero(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AssertKind::RemainderByZero(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AssertKind::ResumedAfterReturn(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AssertKind::ResumedAfterPanic(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AssertKind::ResumedAfterDrop(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AssertKind::MisalignedPointerDereference {
                        required: ref __binding_0, found: ref __binding_1 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    AssertKind::NullPointerDereference => {}
                    AssertKind::NullReferenceConstructed => {}
                    AssertKind::InvalidEnumConstruction(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, O, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for AssertKind<O> where
            O: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        AssertKind::BoundsCheck {
                            len: ::rustc_serialize::Decodable::decode(__decoder),
                            index: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    1usize => {
                        AssertKind::Overflow(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        AssertKind::OverflowNeg(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => {
                        AssertKind::DivisionByZero(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    4usize => {
                        AssertKind::RemainderByZero(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    5usize => {
                        AssertKind::ResumedAfterReturn(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    6usize => {
                        AssertKind::ResumedAfterPanic(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    7usize => {
                        AssertKind::ResumedAfterDrop(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    8usize => {
                        AssertKind::MisalignedPointerDereference {
                            required: ::rustc_serialize::Decodable::decode(__decoder),
                            found: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    9usize => { AssertKind::NullPointerDereference }
                    10usize => { AssertKind::NullReferenceConstructed }
                    11usize => {
                        AssertKind::InvalidEnumConstruction(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `AssertKind`, expected 0..12, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable, const _: () =
    {
        impl<'tcx, O>
            ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            for AssertKind<O> where
            O: ::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 {
                        AssertKind::BoundsCheck {
                            len: __binding_0, index: __binding_1 } => {
                            AssertKind::BoundsCheck {
                                len: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                index: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                            }
                        }
                        AssertKind::Overflow(__binding_0, __binding_1, __binding_2)
                            => {
                            AssertKind::Overflow(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                                ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_2,
                                        __folder)?)
                        }
                        AssertKind::OverflowNeg(__binding_0) => {
                            AssertKind::OverflowNeg(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        AssertKind::DivisionByZero(__binding_0) => {
                            AssertKind::DivisionByZero(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        AssertKind::RemainderByZero(__binding_0) => {
                            AssertKind::RemainderByZero(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        AssertKind::ResumedAfterReturn(__binding_0) => {
                            AssertKind::ResumedAfterReturn(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        AssertKind::ResumedAfterPanic(__binding_0) => {
                            AssertKind::ResumedAfterPanic(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        AssertKind::ResumedAfterDrop(__binding_0) => {
                            AssertKind::ResumedAfterDrop(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        AssertKind::MisalignedPointerDereference {
                            required: __binding_0, found: __binding_1 } => {
                            AssertKind::MisalignedPointerDereference {
                                required: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                found: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                            }
                        }
                        AssertKind::NullPointerDereference => {
                            AssertKind::NullPointerDereference
                        }
                        AssertKind::NullReferenceConstructed => {
                            AssertKind::NullReferenceConstructed
                        }
                        AssertKind::InvalidEnumConstruction(__binding_0) => {
                            AssertKind::InvalidEnumConstruction(::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 {
                    AssertKind::BoundsCheck {
                        len: __binding_0, index: __binding_1 } => {
                        AssertKind::BoundsCheck {
                            len: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            index: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                        }
                    }
                    AssertKind::Overflow(__binding_0, __binding_1, __binding_2)
                        => {
                        AssertKind::Overflow(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                            ::rustc_middle::ty::TypeFoldable::fold_with(__binding_2,
                                __folder))
                    }
                    AssertKind::OverflowNeg(__binding_0) => {
                        AssertKind::OverflowNeg(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    AssertKind::DivisionByZero(__binding_0) => {
                        AssertKind::DivisionByZero(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    AssertKind::RemainderByZero(__binding_0) => {
                        AssertKind::RemainderByZero(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    AssertKind::ResumedAfterReturn(__binding_0) => {
                        AssertKind::ResumedAfterReturn(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    AssertKind::ResumedAfterPanic(__binding_0) => {
                        AssertKind::ResumedAfterPanic(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    AssertKind::ResumedAfterDrop(__binding_0) => {
                        AssertKind::ResumedAfterDrop(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    AssertKind::MisalignedPointerDereference {
                        required: __binding_0, found: __binding_1 } => {
                        AssertKind::MisalignedPointerDereference {
                            required: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            found: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                        }
                    }
                    AssertKind::NullPointerDereference => {
                        AssertKind::NullPointerDereference
                    }
                    AssertKind::NullReferenceConstructed => {
                        AssertKind::NullReferenceConstructed
                    }
                    AssertKind::InvalidEnumConstruction(__binding_0) => {
                        AssertKind::InvalidEnumConstruction(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                }
            }
        }
    };TypeFoldable, const _: () =
    {
        impl<'tcx, O>
            ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
            for AssertKind<O> where
            O: ::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 {
                    AssertKind::BoundsCheck {
                        len: ref __binding_0, index: 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);
                                }
                            }
                        }
                    }
                    AssertKind::Overflow(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        {
                            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);
                                }
                            }
                        }
                    }
                    AssertKind::OverflowNeg(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);
                                }
                            }
                        }
                    }
                    AssertKind::DivisionByZero(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);
                                }
                            }
                        }
                    }
                    AssertKind::RemainderByZero(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);
                                }
                            }
                        }
                    }
                    AssertKind::ResumedAfterReturn(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);
                                }
                            }
                        }
                    }
                    AssertKind::ResumedAfterPanic(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);
                                }
                            }
                        }
                    }
                    AssertKind::ResumedAfterDrop(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);
                                }
                            }
                        }
                    }
                    AssertKind::MisalignedPointerDereference {
                        required: ref __binding_0, found: 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);
                                }
                            }
                        }
                    }
                    AssertKind::NullPointerDereference => {}
                    AssertKind::NullReferenceConstructed => {}
                    AssertKind::InvalidEnumConstruction(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)]
1041pub enum AssertKind<O> {
1042    BoundsCheck { len: O, index: O },
1043    Overflow(BinOp, O, O),
1044    OverflowNeg(O),
1045    DivisionByZero(O),
1046    RemainderByZero(O),
1047    ResumedAfterReturn(CoroutineKind),
1048    ResumedAfterPanic(CoroutineKind),
1049    ResumedAfterDrop(CoroutineKind),
1050    MisalignedPointerDereference { required: O, found: O },
1051    NullPointerDereference,
1052    NullReferenceConstructed,
1053    InvalidEnumConstruction(O),
1054}
1055
1056#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for InlineAsmOperand<'tcx> {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::In { reg: __self_0, value: __self_1 } =>
                InlineAsmOperand::In {
                    reg: ::core::clone::Clone::clone(__self_0),
                    value: ::core::clone::Clone::clone(__self_1),
                },
            Self::Out { reg: __self_0, late: __self_1, place: __self_2 } =>
                InlineAsmOperand::Out {
                    reg: ::core::clone::Clone::clone(__self_0),
                    late: ::core::clone::Clone::clone(__self_1),
                    place: ::core::clone::Clone::clone(__self_2),
                },
            Self::InOut {
                reg: __self_0,
                late: __self_1,
                in_value: __self_2,
                out_place: __self_3 } =>
                InlineAsmOperand::InOut {
                    reg: ::core::clone::Clone::clone(__self_0),
                    late: ::core::clone::Clone::clone(__self_1),
                    in_value: ::core::clone::Clone::clone(__self_2),
                    out_place: ::core::clone::Clone::clone(__self_3),
                },
            Self::Const { value: __self_0 } =>
                InlineAsmOperand::Const {
                    value: ::core::clone::Clone::clone(__self_0),
                },
            Self::SymFn { value: __self_0 } =>
                InlineAsmOperand::SymFn {
                    value: ::core::clone::Clone::clone(__self_0),
                },
            Self::SymStatic { def_id: __self_0 } =>
                InlineAsmOperand::SymStatic {
                    def_id: ::core::clone::Clone::clone(__self_0),
                },
            Self::Label { target_index: __self_0 } =>
                InlineAsmOperand::Label {
                    target_index: ::core::clone::Clone::clone(__self_0),
                },
        }
    }
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for InlineAsmOperand<'tcx> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Self::In { reg: __self_0, value: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f, "In",
                    "reg", __self_0, "value", &__self_1),
            Self::Out { reg: __self_0, late: __self_1, place: __self_2 } =>
                ::core::fmt::Formatter::debug_struct_field3_finish(f, "Out",
                    "reg", __self_0, "late", __self_1, "place", &__self_2),
            Self::InOut {
                reg: __self_0,
                late: __self_1,
                in_value: __self_2,
                out_place: __self_3 } =>
                ::core::fmt::Formatter::debug_struct_field4_finish(f, "InOut",
                    "reg", __self_0, "late", __self_1, "in_value", __self_2,
                    "out_place", &__self_3),
            Self::Const { value: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Const",
                    "value", &__self_0),
            Self::SymFn { value: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "SymFn",
                    "value", &__self_0),
            Self::SymStatic { def_id: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "SymStatic", "def_id", &__self_0),
            Self::Label { target_index: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Label",
                    "target_index", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl<'tcx> ::core::marker::StructuralPartialEq for InlineAsmOperand<'tcx> { }
#[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for InlineAsmOperand<'tcx> {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::In { reg: __self_0, value: __self_1 }, Self::In {
                    reg: __arg1_0, value: __arg1_1 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (Self::Out { reg: __self_0, late: __self_1, place: __self_2 },
                    Self::Out { reg: __arg1_0, late: __arg1_1, place: __arg1_2
                    }) =>
                    __self_1 == __arg1_1 && __self_0 == __arg1_0 &&
                        __self_2 == __arg1_2,
                (Self::InOut {
                    reg: __self_0,
                    late: __self_1,
                    in_value: __self_2,
                    out_place: __self_3 }, Self::InOut {
                    reg: __arg1_0,
                    late: __arg1_1,
                    in_value: __arg1_2,
                    out_place: __arg1_3 }) =>
                    __self_1 == __arg1_1 && __self_0 == __arg1_0 &&
                            __self_2 == __arg1_2 && __self_3 == __arg1_3,
                (Self::Const { value: __self_0 }, Self::Const {
                    value: __arg1_0 }) => __self_0 == __arg1_0,
                (Self::SymFn { value: __self_0 }, Self::SymFn {
                    value: __arg1_0 }) => __self_0 == __arg1_0,
                (Self::SymStatic { def_id: __self_0 }, Self::SymStatic {
                    def_id: __arg1_0 }) => __self_0 == __arg1_0,
                (Self::Label { target_index: __self_0 }, Self::Label {
                    target_index: __arg1_0 }) => __self_0 == __arg1_0,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for InlineAsmOperand<'tcx> {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        InlineAsmOperand::In {
                            reg: ref __binding_0, value: ref __binding_1 } => {
                            0usize
                        }
                        InlineAsmOperand::Out {
                            reg: ref __binding_0,
                            late: ref __binding_1,
                            place: ref __binding_2 } => {
                            1usize
                        }
                        InlineAsmOperand::InOut {
                            reg: ref __binding_0,
                            late: ref __binding_1,
                            in_value: ref __binding_2,
                            out_place: ref __binding_3 } => {
                            2usize
                        }
                        InlineAsmOperand::Const { value: ref __binding_0 } => {
                            3usize
                        }
                        InlineAsmOperand::SymFn { value: ref __binding_0 } => {
                            4usize
                        }
                        InlineAsmOperand::SymStatic { def_id: ref __binding_0 } => {
                            5usize
                        }
                        InlineAsmOperand::Label { target_index: ref __binding_0 } =>
                            {
                            6usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    InlineAsmOperand::In {
                        reg: ref __binding_0, value: ref __binding_1 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    InlineAsmOperand::Out {
                        reg: ref __binding_0,
                        late: ref __binding_1,
                        place: ref __binding_2 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    InlineAsmOperand::InOut {
                        reg: ref __binding_0,
                        late: ref __binding_1,
                        in_value: ref __binding_2,
                        out_place: 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);
                    }
                    InlineAsmOperand::Const { value: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    InlineAsmOperand::SymFn { value: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    InlineAsmOperand::SymStatic { def_id: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    InlineAsmOperand::Label { target_index: 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 InlineAsmOperand<'tcx> {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        InlineAsmOperand::In {
                            reg: ::rustc_serialize::Decodable::decode(__decoder),
                            value: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    1usize => {
                        InlineAsmOperand::Out {
                            reg: ::rustc_serialize::Decodable::decode(__decoder),
                            late: ::rustc_serialize::Decodable::decode(__decoder),
                            place: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    2usize => {
                        InlineAsmOperand::InOut {
                            reg: ::rustc_serialize::Decodable::decode(__decoder),
                            late: ::rustc_serialize::Decodable::decode(__decoder),
                            in_value: ::rustc_serialize::Decodable::decode(__decoder),
                            out_place: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    3usize => {
                        InlineAsmOperand::Const {
                            value: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    4usize => {
                        InlineAsmOperand::SymFn {
                            value: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    5usize => {
                        InlineAsmOperand::SymStatic {
                            def_id: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    6usize => {
                        InlineAsmOperand::Label {
                            target_index: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `InlineAsmOperand`, expected 0..7, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable, const _: () =
    {
        impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
            InlineAsmOperand<'tcx> {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    InlineAsmOperand::In {
                        reg: ref __binding_0, value: ref __binding_1 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    InlineAsmOperand::Out {
                        reg: ref __binding_0,
                        late: ref __binding_1,
                        place: ref __binding_2 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                    }
                    InlineAsmOperand::InOut {
                        reg: ref __binding_0,
                        late: ref __binding_1,
                        in_value: ref __binding_2,
                        out_place: ref __binding_3 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                        { __binding_3.stable_hash(__hcx, __hasher); }
                    }
                    InlineAsmOperand::Const { value: ref __binding_0 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    InlineAsmOperand::SymFn { value: ref __binding_0 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    InlineAsmOperand::SymStatic { def_id: ref __binding_0 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    InlineAsmOperand::Label { target_index: ref __binding_0 } =>
                        {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
1057#[derive(const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            for InlineAsmOperand<'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 {
                        InlineAsmOperand::In { reg: __binding_0, value: __binding_1
                            } => {
                            InlineAsmOperand::In {
                                reg: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                value: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                            }
                        }
                        InlineAsmOperand::Out {
                            reg: __binding_0, late: __binding_1, place: __binding_2 } =>
                            {
                            InlineAsmOperand::Out {
                                reg: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                late: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                                place: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_2,
                                        __folder)?,
                            }
                        }
                        InlineAsmOperand::InOut {
                            reg: __binding_0,
                            late: __binding_1,
                            in_value: __binding_2,
                            out_place: __binding_3 } => {
                            InlineAsmOperand::InOut {
                                reg: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                late: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                                in_value: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_2,
                                        __folder)?,
                                out_place: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_3,
                                        __folder)?,
                            }
                        }
                        InlineAsmOperand::Const { value: __binding_0 } => {
                            InlineAsmOperand::Const {
                                value: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                            }
                        }
                        InlineAsmOperand::SymFn { value: __binding_0 } => {
                            InlineAsmOperand::SymFn {
                                value: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                            }
                        }
                        InlineAsmOperand::SymStatic { def_id: __binding_0 } => {
                            InlineAsmOperand::SymStatic {
                                def_id: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                            }
                        }
                        InlineAsmOperand::Label { target_index: __binding_0 } => {
                            InlineAsmOperand::Label {
                                target_index: ::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 {
                    InlineAsmOperand::In { reg: __binding_0, value: __binding_1
                        } => {
                        InlineAsmOperand::In {
                            reg: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            value: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                        }
                    }
                    InlineAsmOperand::Out {
                        reg: __binding_0, late: __binding_1, place: __binding_2 } =>
                        {
                        InlineAsmOperand::Out {
                            reg: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            late: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                            place: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_2,
                                __folder),
                        }
                    }
                    InlineAsmOperand::InOut {
                        reg: __binding_0,
                        late: __binding_1,
                        in_value: __binding_2,
                        out_place: __binding_3 } => {
                        InlineAsmOperand::InOut {
                            reg: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            late: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                            in_value: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_2,
                                __folder),
                            out_place: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_3,
                                __folder),
                        }
                    }
                    InlineAsmOperand::Const { value: __binding_0 } => {
                        InlineAsmOperand::Const {
                            value: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                        }
                    }
                    InlineAsmOperand::SymFn { value: __binding_0 } => {
                        InlineAsmOperand::SymFn {
                            value: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                        }
                    }
                    InlineAsmOperand::SymStatic { def_id: __binding_0 } => {
                        InlineAsmOperand::SymStatic {
                            def_id: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                        }
                    }
                    InlineAsmOperand::Label { target_index: __binding_0 } => {
                        InlineAsmOperand::Label {
                            target_index: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
            for InlineAsmOperand<'tcx> {
            fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    InlineAsmOperand::In {
                        reg: ref __binding_0, value: ref __binding_1 } => {
                        {
                            match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_0,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_middle::ty::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_middle::ty::VisitorResult::branch(::rustc_middle::ty::TypeVisitable::visit_with(__binding_1,
                                        __visitor)) {
                                ::core::ops::ControlFlow::Continue(()) => {}
                                ::core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_middle::ty::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    InlineAsmOperand::Out {
                        reg: ref __binding_0,
                        late: ref __binding_1,
                        place: ref __binding_2 } => {
                        {
                            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);
                                }
                            }
                        }
                    }
                    InlineAsmOperand::InOut {
                        reg: ref __binding_0,
                        late: ref __binding_1,
                        in_value: ref __binding_2,
                        out_place: 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);
                                }
                            }
                        }
                    }
                    InlineAsmOperand::Const { value: 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);
                                }
                            }
                        }
                    }
                    InlineAsmOperand::SymFn { value: 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);
                                }
                            }
                        }
                    }
                    InlineAsmOperand::SymStatic { 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);
                                }
                            }
                        }
                    }
                    InlineAsmOperand::Label { target_index: 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)]
1058pub enum InlineAsmOperand<'tcx> {
1059    In {
1060        reg: InlineAsmRegOrRegClass,
1061        value: Operand<'tcx>,
1062    },
1063    Out {
1064        reg: InlineAsmRegOrRegClass,
1065        late: bool,
1066        place: Option<Place<'tcx>>,
1067    },
1068    InOut {
1069        reg: InlineAsmRegOrRegClass,
1070        late: bool,
1071        in_value: Operand<'tcx>,
1072        out_place: Option<Place<'tcx>>,
1073    },
1074    Const {
1075        value: Box<ConstOperand<'tcx>>,
1076    },
1077    SymFn {
1078        value: Box<ConstOperand<'tcx>>,
1079    },
1080    SymStatic {
1081        def_id: DefId,
1082    },
1083    Label {
1084        /// This represents the index into the `targets` array in `TerminatorKind::InlineAsm`.
1085        target_index: usize,
1086    },
1087}
1088
1089/// Type for MIR `Assert` terminator error messages.
1090pub type AssertMessage<'tcx> = AssertKind<Operand<'tcx>>;
1091
1092///////////////////////////////////////////////////////////////////////////
1093// Places
1094
1095/// Places roughly correspond to a "location in memory." Places in MIR are the same mathematical
1096/// object as places in Rust. This of course means that what exactly they are is undecided and part
1097/// of the Rust memory model. However, they will likely contain at least the following pieces of
1098/// information in some form:
1099///
1100///  1. The address in memory that the place refers to.
1101///  2. The provenance with which the place is being accessed.
1102///  3. The type of the place and an optional variant index. See [`PlaceTy`][super::PlaceTy].
1103///  4. Optionally, some metadata. This exists if and only if the type of the place is not `Sized`.
1104///
1105/// We'll give a description below of how all pieces of the place except for the provenance are
1106/// calculated. We cannot give a description of the provenance, because that is part of the
1107/// undecided aliasing model - we only include it here at all to acknowledge its existence.
1108///
1109/// Each local naturally corresponds to the place `Place { local, projection: [] }`. This place has
1110/// the address of the local's allocation and the type of the local.
1111///
1112/// For places that are not locals, ie they have a non-empty list of projections, we define the
1113/// values as a function of the parent place, that is the place with its last [`ProjectionElem`]
1114/// stripped. The way this is computed of course depends on the kind of that last projection
1115/// element:
1116///
1117///  - [`Downcast`](ProjectionElem::Downcast): This projection sets the place's variant index to the
1118///    given one, and makes no other changes. A `Downcast` projection must always be followed
1119///    immediately by a `Field` projection.
1120///  - [`Field`](ProjectionElem::Field): `Field` projections take their parent place and create a
1121///    place referring to one of the fields of the type. The resulting address is the parent
1122///    address, plus the offset of the field. The type becomes the type of the field. If the parent
1123///    was unsized and so had metadata associated with it, then the metadata is retained if the
1124///    field is unsized and thrown out if it is sized.
1125///
1126///    These projections are only legal for tuples, ADTs, closures, and coroutines. If the ADT or
1127///    coroutine has more than one variant, the parent place's variant index must be set, indicating
1128///    which variant is being used. If it has just one variant, the variant index may or may not be
1129///    included - the single possible variant is inferred if it is not included.
1130///  - [`OpaqueCast`](ProjectionElem::OpaqueCast): This projection changes the place's type to the
1131///    given one, and makes no other changes. A `OpaqueCast` projection on any type other than an
1132///    opaque type from the current crate is not well-formed.
1133///  - [`ConstantIndex`](ProjectionElem::ConstantIndex): Computes an offset in units of `T` into the
1134///    place as described in the documentation for the `ProjectionElem`. The resulting address is
1135///    the parent's address plus that offset, and the type is `T`. This is only legal if the parent
1136///    place has type `[T;  N]` or `[T]` (*not* `&[T]`). Since such a `T` is always sized, any
1137///    resulting metadata is thrown out.
1138///  - [`Subslice`](ProjectionElem::Subslice): This projection calculates an offset and a new
1139///    address in a similar manner as `ConstantIndex`. It is also only legal on `[T; N]` and `[T]`.
1140///    However, this yields a `Place` of type `[T]`, and additionally sets the metadata to be the
1141///    length of the subslice.
1142///  - [`Index`](ProjectionElem::Index): Like `ConstantIndex`, only legal on `[T; N]` or `[T]`.
1143///    However, `Index` additionally takes a local from which the value of the index is computed at
1144///    runtime. Computing the value of the index involves interpreting the `Local` as a
1145///    `Place { local, projection: [] }`, and then computing its value as if done via
1146///    [`Operand::Copy`]. The array/slice is then indexed with the resulting value. The local must
1147///    have type `usize`.
1148///  - [`Deref`](ProjectionElem::Deref): Derefs are the last type of projection, and the most
1149///    complicated. They are only legal on parent places that are references, pointers, or `Box`. A
1150///    `Deref` projection begins by loading a value from the parent place, as if by
1151///    [`Operand::Copy`]. It then dereferences the resulting pointer, creating a place of the
1152///    pointee's type. The resulting address is the address that was stored in the pointer. If the
1153///    pointee type is unsized, the pointer additionally stored the value of the metadata.
1154///
1155/// The "validity invariant" of places is the same as that of raw pointers, meaning that e.g.
1156/// `*ptr` on a dangling or unaligned pointer is never UB. (Later doing a load/store on that place
1157/// or turning it into a reference can be UB though!) The only ways for a place computation can
1158/// cause UB are:
1159/// - On a `Deref` projection, we do an actual load of the inner place, with all the usual
1160///   consequences (the inner place must be based on an aligned pointer, it must point to allocated
1161///   memory, the aliasig model must allow reads, this must not be a data race).
1162/// - For the projections that perform pointer arithmetic, the offset must in-bounds of an
1163///   allocation (i.e., the preconditions of `ptr::offset` must be met).
1164#[derive(#[automatically_derived]
impl<'tcx> ::core::marker::Copy for Place<'tcx> { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'tcx> ::core::clone::TrivialClone for Place<'tcx> { }
#[automatically_derived]
impl<'tcx> ::core::clone::Clone for Place<'tcx> {
    #[inline]
    fn clone(&self) -> Self {
        let _: ::core::clone::AssertParamIsClone<Local>;
        let _: ::core::clone::AssertParamIsClone<&'tcx List<PlaceElem<'tcx>>>;
        *self
    }
}Clone, #[automatically_derived]
impl<'tcx> ::core::marker::StructuralPartialEq for Place<'tcx> { }
#[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for Place<'tcx> {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        self.local == other.local && self.projection == other.projection
    }
}PartialEq, #[automatically_derived]
impl<'tcx> ::core::cmp::Eq for Place<'tcx> {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Local>;
        let _: ::core::cmp::AssertParamIsEq<&'tcx List<PlaceElem<'tcx>>>;
    }
}Eq, #[automatically_derived]
impl<'tcx> ::core::hash::Hash for Place<'tcx> {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.local, state);
        ::core::hash::Hash::hash(&self.projection, state)
    }
}Hash, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for Place<'tcx> {
            fn encode(&self, __encoder: &mut __E) {
                let Place { local: ref __binding_0, projection: __binding_1
                        } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
            Place<'tcx> {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    Place { local: ref __binding_0, projection: ref __binding_1
                        } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            for Place<'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 {
                        Place { local: __binding_0, projection: __binding_1 } => {
                            Place {
                                local: ::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 {
                    Place { local: __binding_0, projection: __binding_1 } => {
                        Place {
                            local: ::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 Place<'tcx> {
            fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    Place { local: 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)]
1165pub struct Place<'tcx> {
1166    pub local: Local,
1167
1168    /// projection out of a place (access a field, deref a pointer, etc)
1169    pub projection: &'tcx List<PlaceElem<'tcx>>,
1170}
1171
1172#[derive(#[automatically_derived]
impl<V: ::core::marker::Copy, T: ::core::marker::Copy> ::core::marker::Copy
    for ProjectionElem<V, T> {
}Copy, #[automatically_derived]
impl<V: ::core::clone::Clone, T: ::core::clone::Clone> ::core::clone::Clone
    for ProjectionElem<V, T> {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Deref => ProjectionElem::Deref,
            Self::Field(__self_0, __self_1) =>
                ProjectionElem::Field(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::Index(__self_0) =>
                ProjectionElem::Index(::core::clone::Clone::clone(__self_0)),
            Self::ConstantIndex {
                offset: __self_0, min_length: __self_1, from_end: __self_2 }
                =>
                ProjectionElem::ConstantIndex {
                    offset: ::core::clone::Clone::clone(__self_0),
                    min_length: ::core::clone::Clone::clone(__self_1),
                    from_end: ::core::clone::Clone::clone(__self_2),
                },
            Self::Subslice { from: __self_0, to: __self_1, from_end: __self_2
                } =>
                ProjectionElem::Subslice {
                    from: ::core::clone::Clone::clone(__self_0),
                    to: ::core::clone::Clone::clone(__self_1),
                    from_end: ::core::clone::Clone::clone(__self_2),
                },
            Self::Downcast(__self_0, __self_1) =>
                ProjectionElem::Downcast(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::OpaqueCast(__self_0) =>
                ProjectionElem::OpaqueCast(::core::clone::Clone::clone(__self_0)),
            Self::UnwrapUnsafeBinder(__self_0) =>
                ProjectionElem::UnwrapUnsafeBinder(::core::clone::Clone::clone(__self_0)),
            Self::PhantomDeref => ProjectionElem::PhantomDeref,
        }
    }
}Clone, #[automatically_derived]
impl<V: ::core::fmt::Debug, T: ::core::fmt::Debug> ::core::fmt::Debug for
    ProjectionElem<V, T> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Self::Deref => ::core::fmt::Formatter::write_str(f, "Deref"),
            Self::Field(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Field",
                    __self_0, &__self_1),
            Self::Index(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Index",
                    &__self_0),
            Self::ConstantIndex {
                offset: __self_0, min_length: __self_1, from_end: __self_2 }
                =>
                ::core::fmt::Formatter::debug_struct_field3_finish(f,
                    "ConstantIndex", "offset", __self_0, "min_length", __self_1,
                    "from_end", &__self_2),
            Self::Subslice { from: __self_0, to: __self_1, from_end: __self_2
                } =>
                ::core::fmt::Formatter::debug_struct_field3_finish(f,
                    "Subslice", "from", __self_0, "to", __self_1, "from_end",
                    &__self_2),
            Self::Downcast(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "Downcast", __self_0, &__self_1),
            Self::OpaqueCast(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "OpaqueCast", &__self_0),
            Self::UnwrapUnsafeBinder(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "UnwrapUnsafeBinder", &__self_0),
            Self::PhantomDeref =>
                ::core::fmt::Formatter::write_str(f, "PhantomDeref"),
        }
    }
}Debug, #[automatically_derived]
impl<V: ::core::cmp::PartialEq, T: ::core::cmp::PartialEq>
    ::core::marker::StructuralPartialEq for ProjectionElem<V, T> {
}
#[automatically_derived]
impl<V: ::core::cmp::PartialEq, T: ::core::cmp::PartialEq>
    ::core::cmp::PartialEq for ProjectionElem<V, T> {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Field(__self_0, __self_1),
                    Self::Field(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (Self::Index(__self_0), Self::Index(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::ConstantIndex {
                    offset: __self_0, min_length: __self_1, from_end: __self_2
                    }, Self::ConstantIndex {
                    offset: __arg1_0, min_length: __arg1_1, from_end: __arg1_2
                    }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1 &&
                        __self_2 == __arg1_2,
                (Self::Subslice {
                    from: __self_0, to: __self_1, from_end: __self_2 },
                    Self::Subslice {
                    from: __arg1_0, to: __arg1_1, from_end: __arg1_2 }) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1 &&
                        __self_2 == __arg1_2,
                (Self::Downcast(__self_0, __self_1),
                    Self::Downcast(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (Self::OpaqueCast(__self_0), Self::OpaqueCast(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::UnwrapUnsafeBinder(__self_0),
                    Self::UnwrapUnsafeBinder(__arg1_0)) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl<V: ::core::cmp::Eq, T: ::core::cmp::Eq> ::core::cmp::Eq for
    ProjectionElem<V, T> {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<FieldIdx>;
        let _: ::core::cmp::AssertParamIsEq<T>;
        let _: ::core::cmp::AssertParamIsEq<V>;
        let _: ::core::cmp::AssertParamIsEq<u64>;
        let _: ::core::cmp::AssertParamIsEq<bool>;
        let _: ::core::cmp::AssertParamIsEq<Option<Symbol>>;
        let _: ::core::cmp::AssertParamIsEq<VariantIdx>;
    }
}Eq, #[automatically_derived]
impl<V: ::core::hash::Hash, T: ::core::hash::Hash> ::core::hash::Hash for
    ProjectionElem<V, T> {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
            state);
        match self {
            Self::Field(__self_0, __self_1) => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            Self::Index(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            Self::ConstantIndex {
                offset: __self_0, min_length: __self_1, from_end: __self_2 }
                => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state);
                ::core::hash::Hash::hash(__self_2, state)
            }
            Self::Subslice { from: __self_0, to: __self_1, from_end: __self_2
                } => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state);
                ::core::hash::Hash::hash(__self_2, state)
            }
            Self::Downcast(__self_0, __self_1) => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            Self::OpaqueCast(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            Self::UnwrapUnsafeBinder(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            _ => {}
        }
    }
}Hash)]
1173#[derive(const _: () =
    {
        impl<'tcx, V, T, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for ProjectionElem<V, T> where
            T: ::rustc_serialize::Encodable<__E>,
            V: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        ProjectionElem::Deref => { 0usize }
                        ProjectionElem::Field(ref __binding_0, ref __binding_1) => {
                            1usize
                        }
                        ProjectionElem::Index(ref __binding_0) => { 2usize }
                        ProjectionElem::ConstantIndex {
                            offset: ref __binding_0,
                            min_length: ref __binding_1,
                            from_end: ref __binding_2 } => {
                            3usize
                        }
                        ProjectionElem::Subslice {
                            from: ref __binding_0,
                            to: ref __binding_1,
                            from_end: ref __binding_2 } => {
                            4usize
                        }
                        ProjectionElem::Downcast(ref __binding_0, ref __binding_1)
                            => {
                            5usize
                        }
                        ProjectionElem::OpaqueCast(ref __binding_0) => { 6usize }
                        ProjectionElem::UnwrapUnsafeBinder(ref __binding_0) => {
                            7usize
                        }
                        ProjectionElem::PhantomDeref => { 8usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    ProjectionElem::Deref => {}
                    ProjectionElem::Field(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ProjectionElem::Index(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ProjectionElem::ConstantIndex {
                        offset: ref __binding_0,
                        min_length: ref __binding_1,
                        from_end: ref __binding_2 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    ProjectionElem::Subslice {
                        from: ref __binding_0,
                        to: ref __binding_1,
                        from_end: ref __binding_2 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    ProjectionElem::Downcast(ref __binding_0, ref __binding_1)
                        => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ProjectionElem::OpaqueCast(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ProjectionElem::UnwrapUnsafeBinder(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ProjectionElem::PhantomDeref => {}
                }
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, V, T, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for ProjectionElem<V, T> where
            T: ::rustc_serialize::Decodable<__D>,
            V: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { ProjectionElem::Deref }
                    1usize => {
                        ProjectionElem::Field(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        ProjectionElem::Index(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => {
                        ProjectionElem::ConstantIndex {
                            offset: ::rustc_serialize::Decodable::decode(__decoder),
                            min_length: ::rustc_serialize::Decodable::decode(__decoder),
                            from_end: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    4usize => {
                        ProjectionElem::Subslice {
                            from: ::rustc_serialize::Decodable::decode(__decoder),
                            to: ::rustc_serialize::Decodable::decode(__decoder),
                            from_end: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    5usize => {
                        ProjectionElem::Downcast(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    6usize => {
                        ProjectionElem::OpaqueCast(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    7usize => {
                        ProjectionElem::UnwrapUnsafeBinder(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    8usize => { ProjectionElem::PhantomDeref }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `ProjectionElem`, expected 0..9, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable, const _: () =
    {
        impl<V, T> ::rustc_data_structures::stable_hash::StableHash for
            ProjectionElem<V, T> where
            T: ::rustc_data_structures::stable_hash::StableHash,
            V: ::rustc_data_structures::stable_hash::StableHash {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    ProjectionElem::Deref => {}
                    ProjectionElem::Field(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    ProjectionElem::Index(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    ProjectionElem::ConstantIndex {
                        offset: ref __binding_0,
                        min_length: ref __binding_1,
                        from_end: ref __binding_2 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                    }
                    ProjectionElem::Subslice {
                        from: ref __binding_0,
                        to: ref __binding_1,
                        from_end: ref __binding_2 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                    }
                    ProjectionElem::Downcast(ref __binding_0, ref __binding_1)
                        => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    ProjectionElem::OpaqueCast(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    ProjectionElem::UnwrapUnsafeBinder(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    ProjectionElem::PhantomDeref => {}
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'tcx, V, T>
            ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            for ProjectionElem<V, T> where
            T: ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>,
            V: ::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 {
                        ProjectionElem::Deref => { ProjectionElem::Deref }
                        ProjectionElem::Field(__binding_0, __binding_1) => {
                            ProjectionElem::Field(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?)
                        }
                        ProjectionElem::Index(__binding_0) => {
                            ProjectionElem::Index(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        ProjectionElem::ConstantIndex {
                            offset: __binding_0,
                            min_length: __binding_1,
                            from_end: __binding_2 } => {
                            ProjectionElem::ConstantIndex {
                                offset: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                min_length: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                                from_end: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_2,
                                        __folder)?,
                            }
                        }
                        ProjectionElem::Subslice {
                            from: __binding_0, to: __binding_1, from_end: __binding_2 }
                            => {
                            ProjectionElem::Subslice {
                                from: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                to: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                                from_end: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_2,
                                        __folder)?,
                            }
                        }
                        ProjectionElem::Downcast(__binding_0, __binding_1) => {
                            ProjectionElem::Downcast(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?)
                        }
                        ProjectionElem::OpaqueCast(__binding_0) => {
                            ProjectionElem::OpaqueCast(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        ProjectionElem::UnwrapUnsafeBinder(__binding_0) => {
                            ProjectionElem::UnwrapUnsafeBinder(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        ProjectionElem::PhantomDeref => {
                            ProjectionElem::PhantomDeref
                        }
                    })
            }
            fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    ProjectionElem::Deref => { ProjectionElem::Deref }
                    ProjectionElem::Field(__binding_0, __binding_1) => {
                        ProjectionElem::Field(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder))
                    }
                    ProjectionElem::Index(__binding_0) => {
                        ProjectionElem::Index(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    ProjectionElem::ConstantIndex {
                        offset: __binding_0,
                        min_length: __binding_1,
                        from_end: __binding_2 } => {
                        ProjectionElem::ConstantIndex {
                            offset: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            min_length: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                            from_end: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_2,
                                __folder),
                        }
                    }
                    ProjectionElem::Subslice {
                        from: __binding_0, to: __binding_1, from_end: __binding_2 }
                        => {
                        ProjectionElem::Subslice {
                            from: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            to: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                            from_end: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_2,
                                __folder),
                        }
                    }
                    ProjectionElem::Downcast(__binding_0, __binding_1) => {
                        ProjectionElem::Downcast(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder))
                    }
                    ProjectionElem::OpaqueCast(__binding_0) => {
                        ProjectionElem::OpaqueCast(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    ProjectionElem::UnwrapUnsafeBinder(__binding_0) => {
                        ProjectionElem::UnwrapUnsafeBinder(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    ProjectionElem::PhantomDeref => {
                        ProjectionElem::PhantomDeref
                    }
                }
            }
        }
    };TypeFoldable, const _: () =
    {
        impl<'tcx, V, T>
            ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
            for ProjectionElem<V, T> where
            T: ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>,
            V: ::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 {
                    ProjectionElem::Deref => {}
                    ProjectionElem::Field(ref __binding_0, 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);
                                }
                            }
                        }
                    }
                    ProjectionElem::Index(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);
                                }
                            }
                        }
                    }
                    ProjectionElem::ConstantIndex {
                        offset: ref __binding_0,
                        min_length: ref __binding_1,
                        from_end: ref __binding_2 } => {
                        {
                            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);
                                }
                            }
                        }
                    }
                    ProjectionElem::Subslice {
                        from: ref __binding_0,
                        to: ref __binding_1,
                        from_end: ref __binding_2 } => {
                        {
                            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);
                                }
                            }
                        }
                    }
                    ProjectionElem::Downcast(ref __binding_0, 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);
                                }
                            }
                        }
                    }
                    ProjectionElem::OpaqueCast(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);
                                }
                            }
                        }
                    }
                    ProjectionElem::UnwrapUnsafeBinder(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);
                                }
                            }
                        }
                    }
                    ProjectionElem::PhantomDeref => {}
                }
                <__V::Result as ::rustc_middle::ty::VisitorResult>::output()
            }
        }
    };TypeVisitable)]
1174pub enum ProjectionElem<V, T> {
1175    Deref,
1176
1177    /// A field (e.g., `f` in `_1.f`) is one variant of [`ProjectionElem`]. Conceptually,
1178    /// rustc can identify that a field projection refers to either two different regions of memory
1179    /// or the same one between the base and the 'projection element'.
1180    /// Read more about projections in the [rustc-dev-guide][mir-datatypes]
1181    ///
1182    /// [mir-datatypes]: https://rustc-dev-guide.rust-lang.org/mir/index.html#mir-data-types
1183    Field(FieldIdx, T),
1184
1185    /// Index into a slice/array.
1186    ///
1187    /// Note that this does not also dereference, and so it does not exactly correspond to slice
1188    /// indexing in Rust. In other words, in the below Rust code:
1189    ///
1190    /// ```rust
1191    /// let x = &[1, 2, 3, 4];
1192    /// let i = 2;
1193    /// x[i];
1194    /// ```
1195    ///
1196    /// The `x[i]` is turned into a `Deref` followed by an `Index`, not just an `Index`. The same
1197    /// thing is true of the `ConstantIndex` and `Subslice` projections below.
1198    Index(V),
1199
1200    /// These endpoint-relative indices are generated by slice/array patterns.
1201    ///
1202    /// For array types, `offset` is always relative to the start of the array.
1203    /// For slice types, `from_end` determines whether `offset` is relative to
1204    /// the start or the end of the slice being inspected.
1205    ///
1206    /// Slice-pattern indices are easiest to explain by the position of `X` in
1207    /// these examples:
1208    ///
1209    /// ```ignore (illustrative)
1210    /// [X, _, .., _, _] => { offset: 0, min_length: 4, from_end: false },
1211    /// [_, X, .., _, _] => { offset: 1, min_length: 4, from_end: false },
1212    /// [_, _, .., X, _] => { offset: 2, min_length: 4, from_end: true },
1213    /// [_, _, .., _, X] => { offset: 1, min_length: 4, from_end: true },
1214    /// ```
1215    ConstantIndex {
1216        /// - If `from_end == false`, this is a 0-based offset from the start of the array/slice.
1217        /// - If `from_end == true`, this is a 1-based offset from the end of the slice.
1218        offset: u64,
1219        /// The thing being indexed must be at least this long -- otherwise, the
1220        /// projection is UB.
1221        ///
1222        /// For arrays this is always the exact length.
1223        min_length: u64,
1224        /// If `true`, `offset` is a 1-based offset from the end of the slice.
1225        /// Always false when indexing an array.
1226        from_end: bool,
1227    },
1228
1229    /// These indices are generated by slice patterns.
1230    ///
1231    /// If `from_end` is true `slice[from..slice.len() - to]`.
1232    /// Otherwise `array[from..to]`.
1233    ///
1234    /// This projection cannot have `ConstantIndex` or additional `Subslice` projections after it
1235    /// before runtime MIR.
1236    Subslice {
1237        from: u64,
1238        to: u64,
1239        /// Whether `to` counts from the start or end of the array/slice.
1240        /// For `PlaceElem`s this is `true` if and only if the base is a slice.
1241        /// For `ProjectionKind`, this can also be `true` for arrays.
1242        from_end: bool,
1243    },
1244
1245    /// "Downcast" to a variant of an enum or a coroutine.
1246    ///
1247    /// The included Symbol is the name of the variant, used for printing MIR.
1248    ///
1249    /// This operation itself is never UB, all it does is change the type of the place.
1250    Downcast(Option<Symbol>, VariantIdx),
1251
1252    /// Like an explicit cast from an opaque type to a concrete type, but without
1253    /// requiring an intermediate variable.
1254    ///
1255    /// This is unused with `-Znext-solver`.
1256    OpaqueCast(T),
1257
1258    /// A transmute from an unsafe binder to the type that it wraps. This is a projection
1259    /// of a place, so it doesn't necessarily constitute a move out of the binder.
1260    UnwrapUnsafeBinder(T),
1261
1262    /// A symbolic dereference of a `Reborrow` type that does not contain any `&mut T` fields.
1263    ///
1264    /// If a type is `Reborrow` and contains a `&mut T` field then reborrowing it reborrows the `T`,
1265    /// producing a borrow on an indirect place, producing a value that can be returned from the
1266    /// function since it does not capture any local place. If no such field exists, then
1267    /// reborrowing the type must dereference the type itself to find an indirect place, but
1268    /// generally such types will not implement `Deref`. Therefore, in borrow checking we instead
1269    /// perform a "phantom dereference" (named so because the type will usually contain some
1270    /// `PhantomData<&'a ()>` or equivalent that captures the lifetime) to access an indeterminate
1271    /// indirect place.
1272    ///
1273    /// FIXME(reborrow): currently this variant is not considered an indirect place for whatever
1274    /// reason. This variant makes no sense if that cannot be fixed.
1275    ///
1276    /// FIXME(reborrow): if the Reborrow traits experiment is rejected, this variant can be removed:
1277    /// see the [PR].
1278    ///
1279    /// [PR]: https://github.com/rust-lang/rust/pull/159103
1280    PhantomDeref,
1281}
1282
1283/// Alias for projections as they appear in places, where the base is a place
1284/// and the index is a local.
1285pub type PlaceElem<'tcx> = ProjectionElem<Local, Ty<'tcx>>;
1286
1287///////////////////////////////////////////////////////////////////////////
1288// Operands
1289
1290/// An operand in MIR represents a "value" in Rust, the definition of which is undecided and part of
1291/// the memory model. One proposal for a definition of values can be found [on UCG][value-def].
1292///
1293/// [value-def]: https://github.com/rust-lang/unsafe-code-guidelines/blob/master/wip/value-domain.md
1294///
1295/// The most common way to create values is via loading a place. Loading a place is an operation
1296/// which reads the memory of the place and converts it to a value. This is a fundamentally *typed*
1297/// operation. The nature of the value produced depends on the type of the conversion. Furthermore,
1298/// there may be other effects: if the type has a validity constraint loading the place might be UB
1299/// if the validity constraint is not met.
1300///
1301/// **Needs clarification:** Is loading a place that has its variant index set well-formed? Miri
1302/// currently implements it, but it seems like this may be something to check against in the
1303/// validator.
1304#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for Operand<'tcx> {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Copy(__self_0) =>
                Operand::Copy(::core::clone::Clone::clone(__self_0)),
            Self::Move(__self_0) =>
                Operand::Move(::core::clone::Clone::clone(__self_0)),
            Self::Constant(__self_0) =>
                Operand::Constant(::core::clone::Clone::clone(__self_0)),
            Self::RuntimeChecks(__self_0) =>
                Operand::RuntimeChecks(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, #[automatically_derived]
impl<'tcx> ::core::marker::StructuralPartialEq for Operand<'tcx> { }
#[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for Operand<'tcx> {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Copy(__self_0), Self::Copy(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::Move(__self_0), Self::Move(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::Constant(__self_0), Self::Constant(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::RuntimeChecks(__self_0), Self::RuntimeChecks(__arg1_0))
                    => __self_0 == __arg1_0,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for Operand<'tcx> {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        Operand::Copy(ref __binding_0) => { 0usize }
                        Operand::Move(ref __binding_0) => { 1usize }
                        Operand::Constant(ref __binding_0) => { 2usize }
                        Operand::RuntimeChecks(ref __binding_0) => { 3usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    Operand::Copy(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    Operand::Move(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    Operand::Constant(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    Operand::RuntimeChecks(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 Operand<'tcx> {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        Operand::Copy(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        Operand::Move(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        Operand::Constant(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => {
                        Operand::RuntimeChecks(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Operand`, expected 0..4, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable, const _: () =
    {
        impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
            Operand<'tcx> {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    Operand::Copy(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    Operand::Move(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    Operand::Constant(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    Operand::RuntimeChecks(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            for Operand<'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 {
                        Operand::Copy(__binding_0) => {
                            Operand::Copy(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        Operand::Move(__binding_0) => {
                            Operand::Move(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        Operand::Constant(__binding_0) => {
                            Operand::Constant(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        Operand::RuntimeChecks(__binding_0) => {
                            Operand::RuntimeChecks(::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 {
                    Operand::Copy(__binding_0) => {
                        Operand::Copy(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    Operand::Move(__binding_0) => {
                        Operand::Move(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    Operand::Constant(__binding_0) => {
                        Operand::Constant(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    Operand::RuntimeChecks(__binding_0) => {
                        Operand::RuntimeChecks(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                }
            }
        }
    };TypeFoldable, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
            for Operand<'tcx> {
            fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    Operand::Copy(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);
                                }
                            }
                        }
                    }
                    Operand::Move(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);
                                }
                            }
                        }
                    }
                    Operand::Constant(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);
                                }
                            }
                        }
                    }
                    Operand::RuntimeChecks(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)]
1305pub enum Operand<'tcx> {
1306    /// Creates a value by loading the given place.
1307    ///
1308    /// Before drop elaboration, the type of the place must be `Copy`. After drop elaboration there
1309    /// is no such requirement.
1310    Copy(Place<'tcx>),
1311
1312    /// Creates a value by performing loading the place, just like the `Copy` operand.
1313    ///
1314    /// This *may* additionally overwrite the place with `uninit` bytes, depending on how we decide
1315    /// in [UCG#188]. You should not emit MIR that may attempt a subsequent second load of this
1316    /// place without first re-initializing it.
1317    ///
1318    /// **Needs clarification:** The operational impact of `Move` is unclear. Currently (both in
1319    /// Miri and codegen) it has no effect at all unless it appears in an argument to `Call`; for
1320    /// `Call` it allows the argument to be passed to the callee "in-place", i.e. the callee might
1321    /// just get a reference to this place instead of a full copy. Miri implements this with a
1322    /// combination of aliasing model "protectors" and putting `uninit` into the place. Ralf
1323    /// proposes that we don't want these semantics for `Move` in regular assignments, because
1324    /// loading a place should not have side-effects, and the aliasing model "protectors" are
1325    /// inherently tied to a function call. Are these the semantics we want for MIR? Is this
1326    /// something we can even decide without knowing more about Rust's memory model?
1327    ///
1328    /// [UCG#188]: https://github.com/rust-lang/unsafe-code-guidelines/issues/188
1329    Move(Place<'tcx>),
1330
1331    /// Constants are already semantically values, and remain unchanged.
1332    Constant(Box<ConstOperand<'tcx>>),
1333
1334    /// Query the compilation session of the current crate for a particular flag. This is not quite
1335    /// a const since its value can differ across crates within a single crate graph.
1336    RuntimeChecks(RuntimeChecks),
1337}
1338
1339#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl<'tcx> ::core::clone::TrivialClone for ConstOperand<'tcx> { }
#[automatically_derived]
impl<'tcx> ::core::clone::Clone for ConstOperand<'tcx> {
    #[inline]
    fn clone(&self) -> Self {
        let _: ::core::clone::AssertParamIsClone<Span>;
        let _:
                ::core::clone::AssertParamIsClone<Option<UserTypeAnnotationIndex>>;
        let _: ::core::clone::AssertParamIsClone<Const<'tcx>>;
        *self
    }
}Clone, #[automatically_derived]
impl<'tcx> ::core::marker::Copy for ConstOperand<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::marker::StructuralPartialEq for ConstOperand<'tcx> { }
#[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for ConstOperand<'tcx> {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        self.span == other.span && self.user_ty == other.user_ty &&
            self.const_ == other.const_
    }
}PartialEq, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for ConstOperand<'tcx> {
            fn encode(&self, __encoder: &mut __E) {
                let ConstOperand {
                        span: ref __binding_0,
                        user_ty: ref __binding_1,
                        const_: ref __binding_2 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for ConstOperand<'tcx> {
            fn decode(__decoder: &mut __D) -> Self {
                ConstOperand {
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    user_ty: ::rustc_serialize::Decodable::decode(__decoder),
                    const_: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };TyDecodable, const _: () =
    {
        impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
            ConstOperand<'tcx> {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    ConstOperand {
                        span: ref __binding_0,
                        user_ty: ref __binding_1,
                        const_: ref __binding_2 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
1340#[derive(const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            for ConstOperand<'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 {
                        ConstOperand {
                            span: __binding_0, user_ty: __binding_1, const_: __binding_2
                            } => {
                            ConstOperand {
                                span: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                user_ty: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                                const_: ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_2,
                                        __folder)?,
                            }
                        }
                    })
            }
            fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    ConstOperand {
                        span: __binding_0, user_ty: __binding_1, const_: __binding_2
                        } => {
                        ConstOperand {
                            span: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            user_ty: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                            const_: ::rustc_middle::ty::TypeFoldable::fold_with(__binding_2,
                                __folder),
                        }
                    }
                }
            }
        }
    };TypeFoldable, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
            for ConstOperand<'tcx> {
            fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    ConstOperand {
                        span: ref __binding_0,
                        user_ty: ref __binding_1,
                        const_: ref __binding_2 } => {
                        {
                            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);
                                }
                            }
                        }
                    }
                }
                <__V::Result as ::rustc_middle::ty::VisitorResult>::output()
            }
        }
    };TypeVisitable)]
1341pub struct ConstOperand<'tcx> {
1342    pub span: Span,
1343
1344    /// Optional user-given type: for something like
1345    /// `collect::<Vec<_>>`, this would be present and would
1346    /// indicate that `Vec<_>` was explicitly specified.
1347    ///
1348    /// Needed for NLL to impose user-given type constraints.
1349    pub user_ty: Option<UserTypeAnnotationIndex>,
1350
1351    pub const_: Const<'tcx>,
1352}
1353
1354///////////////////////////////////////////////////////////////////////////
1355// Rvalues
1356
1357/// The various kinds of rvalues that can appear in MIR.
1358///
1359/// Not all of these are allowed at every [`MirPhase`] - when this is the case, it's stated below.
1360///
1361/// Computing any rvalue begins by evaluating the places and operands in some order (**Needs
1362/// clarification**: Which order?). These are then used to produce a "value" - the same kind of
1363/// value that an [`Operand`] produces.
1364#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for Rvalue<'tcx> {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Use(__self_0, __self_1) =>
                Rvalue::Use(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::Repeat(__self_0, __self_1) =>
                Rvalue::Repeat(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::Ref(__self_0, __self_1, __self_2) =>
                Rvalue::Ref(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            Self::ThreadLocalRef(__self_0) =>
                Rvalue::ThreadLocalRef(::core::clone::Clone::clone(__self_0)),
            Self::RawPtr(__self_0, __self_1) =>
                Rvalue::RawPtr(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::Cast(__self_0, __self_1, __self_2) =>
                Rvalue::Cast(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            Self::BinaryOp(__self_0, __self_1) =>
                Rvalue::BinaryOp(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::UnaryOp(__self_0, __self_1) =>
                Rvalue::UnaryOp(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::Discriminant(__self_0) =>
                Rvalue::Discriminant(::core::clone::Clone::clone(__self_0)),
            Self::Aggregate(__self_0, __self_1) =>
                Rvalue::Aggregate(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::CopyForDeref(__self_0) =>
                Rvalue::CopyForDeref(::core::clone::Clone::clone(__self_0)),
            Self::WrapUnsafeBinder(__self_0, __self_1) =>
                Rvalue::WrapUnsafeBinder(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::Reborrow(__self_0, __self_1, __self_2) =>
                Rvalue::Reborrow(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
        }
    }
}Clone, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for Rvalue<'tcx> {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        Rvalue::Use(ref __binding_0, ref __binding_1) => { 0usize }
                        Rvalue::Repeat(ref __binding_0, ref __binding_1) => {
                            1usize
                        }
                        Rvalue::Ref(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            2usize
                        }
                        Rvalue::ThreadLocalRef(ref __binding_0) => { 3usize }
                        Rvalue::RawPtr(ref __binding_0, ref __binding_1) => {
                            4usize
                        }
                        Rvalue::Cast(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            5usize
                        }
                        Rvalue::BinaryOp(ref __binding_0, ref __binding_1) => {
                            6usize
                        }
                        Rvalue::UnaryOp(ref __binding_0, ref __binding_1) => {
                            7usize
                        }
                        Rvalue::Discriminant(ref __binding_0) => { 8usize }
                        Rvalue::Aggregate(ref __binding_0, ref __binding_1) => {
                            9usize
                        }
                        Rvalue::CopyForDeref(ref __binding_0) => { 10usize }
                        Rvalue::WrapUnsafeBinder(ref __binding_0, ref __binding_1)
                            => {
                            11usize
                        }
                        Rvalue::Reborrow(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            12usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    Rvalue::Use(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    Rvalue::Repeat(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    Rvalue::Ref(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    Rvalue::ThreadLocalRef(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    Rvalue::RawPtr(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    Rvalue::Cast(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    Rvalue::BinaryOp(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    Rvalue::UnaryOp(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    Rvalue::Discriminant(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    Rvalue::Aggregate(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    Rvalue::CopyForDeref(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    Rvalue::WrapUnsafeBinder(ref __binding_0, ref __binding_1)
                        => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    Rvalue::Reborrow(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                }
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for Rvalue<'tcx> {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        Rvalue::Use(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        Rvalue::Repeat(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        Rvalue::Ref(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => {
                        Rvalue::ThreadLocalRef(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    4usize => {
                        Rvalue::RawPtr(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    5usize => {
                        Rvalue::Cast(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    6usize => {
                        Rvalue::BinaryOp(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    7usize => {
                        Rvalue::UnaryOp(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    8usize => {
                        Rvalue::Discriminant(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    9usize => {
                        Rvalue::Aggregate(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    10usize => {
                        Rvalue::CopyForDeref(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    11usize => {
                        Rvalue::WrapUnsafeBinder(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    12usize => {
                        Rvalue::Reborrow(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Rvalue`, expected 0..13, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable, const _: () =
    {
        impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
            Rvalue<'tcx> {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    Rvalue::Use(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    Rvalue::Repeat(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    Rvalue::Ref(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                    }
                    Rvalue::ThreadLocalRef(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    Rvalue::RawPtr(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    Rvalue::Cast(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                    }
                    Rvalue::BinaryOp(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    Rvalue::UnaryOp(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    Rvalue::Discriminant(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    Rvalue::Aggregate(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    Rvalue::CopyForDeref(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    Rvalue::WrapUnsafeBinder(ref __binding_0, ref __binding_1)
                        => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    Rvalue::Reborrow(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, #[automatically_derived]
impl<'tcx> ::core::marker::StructuralPartialEq for Rvalue<'tcx> { }
#[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for Rvalue<'tcx> {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Use(__self_0, __self_1), Self::Use(__arg1_0, __arg1_1))
                    => __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (Self::Repeat(__self_0, __self_1),
                    Self::Repeat(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (Self::Ref(__self_0, __self_1, __self_2),
                    Self::Ref(__arg1_0, __arg1_1, __arg1_2)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1 &&
                        __self_2 == __arg1_2,
                (Self::ThreadLocalRef(__self_0),
                    Self::ThreadLocalRef(__arg1_0)) => __self_0 == __arg1_0,
                (Self::RawPtr(__self_0, __self_1),
                    Self::RawPtr(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (Self::Cast(__self_0, __self_1, __self_2),
                    Self::Cast(__arg1_0, __arg1_1, __arg1_2)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1 &&
                        __self_2 == __arg1_2,
                (Self::BinaryOp(__self_0, __self_1),
                    Self::BinaryOp(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (Self::UnaryOp(__self_0, __self_1),
                    Self::UnaryOp(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (Self::Discriminant(__self_0), Self::Discriminant(__arg1_0))
                    => __self_0 == __arg1_0,
                (Self::Aggregate(__self_0, __self_1),
                    Self::Aggregate(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (Self::CopyForDeref(__self_0), Self::CopyForDeref(__arg1_0))
                    => __self_0 == __arg1_0,
                (Self::WrapUnsafeBinder(__self_0, __self_1),
                    Self::WrapUnsafeBinder(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (Self::Reborrow(__self_0, __self_1, __self_2),
                    Self::Reborrow(__arg1_0, __arg1_1, __arg1_2)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1 &&
                        __self_2 == __arg1_2,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            for Rvalue<'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 {
                        Rvalue::Use(__binding_0, __binding_1) => {
                            Rvalue::Use(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?)
                        }
                        Rvalue::Repeat(__binding_0, __binding_1) => {
                            Rvalue::Repeat(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?)
                        }
                        Rvalue::Ref(__binding_0, __binding_1, __binding_2) => {
                            Rvalue::Ref(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                                ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_2,
                                        __folder)?)
                        }
                        Rvalue::ThreadLocalRef(__binding_0) => {
                            Rvalue::ThreadLocalRef(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        Rvalue::RawPtr(__binding_0, __binding_1) => {
                            Rvalue::RawPtr(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?)
                        }
                        Rvalue::Cast(__binding_0, __binding_1, __binding_2) => {
                            Rvalue::Cast(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                                ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_2,
                                        __folder)?)
                        }
                        Rvalue::BinaryOp(__binding_0, __binding_1) => {
                            Rvalue::BinaryOp(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?)
                        }
                        Rvalue::UnaryOp(__binding_0, __binding_1) => {
                            Rvalue::UnaryOp(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?)
                        }
                        Rvalue::Discriminant(__binding_0) => {
                            Rvalue::Discriminant(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        Rvalue::Aggregate(__binding_0, __binding_1) => {
                            Rvalue::Aggregate(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?)
                        }
                        Rvalue::CopyForDeref(__binding_0) => {
                            Rvalue::CopyForDeref(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        Rvalue::WrapUnsafeBinder(__binding_0, __binding_1) => {
                            Rvalue::WrapUnsafeBinder(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?)
                        }
                        Rvalue::Reborrow(__binding_0, __binding_1, __binding_2) => {
                            Rvalue::Reborrow(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                                ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_2,
                                        __folder)?)
                        }
                    })
            }
            fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    Rvalue::Use(__binding_0, __binding_1) => {
                        Rvalue::Use(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder))
                    }
                    Rvalue::Repeat(__binding_0, __binding_1) => {
                        Rvalue::Repeat(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder))
                    }
                    Rvalue::Ref(__binding_0, __binding_1, __binding_2) => {
                        Rvalue::Ref(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                            ::rustc_middle::ty::TypeFoldable::fold_with(__binding_2,
                                __folder))
                    }
                    Rvalue::ThreadLocalRef(__binding_0) => {
                        Rvalue::ThreadLocalRef(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    Rvalue::RawPtr(__binding_0, __binding_1) => {
                        Rvalue::RawPtr(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder))
                    }
                    Rvalue::Cast(__binding_0, __binding_1, __binding_2) => {
                        Rvalue::Cast(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                            ::rustc_middle::ty::TypeFoldable::fold_with(__binding_2,
                                __folder))
                    }
                    Rvalue::BinaryOp(__binding_0, __binding_1) => {
                        Rvalue::BinaryOp(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder))
                    }
                    Rvalue::UnaryOp(__binding_0, __binding_1) => {
                        Rvalue::UnaryOp(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder))
                    }
                    Rvalue::Discriminant(__binding_0) => {
                        Rvalue::Discriminant(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    Rvalue::Aggregate(__binding_0, __binding_1) => {
                        Rvalue::Aggregate(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder))
                    }
                    Rvalue::CopyForDeref(__binding_0) => {
                        Rvalue::CopyForDeref(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    Rvalue::WrapUnsafeBinder(__binding_0, __binding_1) => {
                        Rvalue::WrapUnsafeBinder(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder))
                    }
                    Rvalue::Reborrow(__binding_0, __binding_1, __binding_2) => {
                        Rvalue::Reborrow(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                            ::rustc_middle::ty::TypeFoldable::fold_with(__binding_2,
                                __folder))
                    }
                }
            }
        }
    };TypeFoldable, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
            for Rvalue<'tcx> {
            fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    Rvalue::Use(ref __binding_0, 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);
                                }
                            }
                        }
                    }
                    Rvalue::Repeat(ref __binding_0, 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);
                                }
                            }
                        }
                    }
                    Rvalue::Ref(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        {
                            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);
                                }
                            }
                        }
                    }
                    Rvalue::ThreadLocalRef(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);
                                }
                            }
                        }
                    }
                    Rvalue::RawPtr(ref __binding_0, 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);
                                }
                            }
                        }
                    }
                    Rvalue::Cast(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        {
                            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);
                                }
                            }
                        }
                    }
                    Rvalue::BinaryOp(ref __binding_0, 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);
                                }
                            }
                        }
                    }
                    Rvalue::UnaryOp(ref __binding_0, 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);
                                }
                            }
                        }
                    }
                    Rvalue::Discriminant(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);
                                }
                            }
                        }
                    }
                    Rvalue::Aggregate(ref __binding_0, 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);
                                }
                            }
                        }
                    }
                    Rvalue::CopyForDeref(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);
                                }
                            }
                        }
                    }
                    Rvalue::WrapUnsafeBinder(ref __binding_0, 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);
                                }
                            }
                        }
                    }
                    Rvalue::Reborrow(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        {
                            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);
                                }
                            }
                        }
                    }
                }
                <__V::Result as ::rustc_middle::ty::VisitorResult>::output()
            }
        }
    };TypeVisitable)]
1365pub enum Rvalue<'tcx> {
1366    /// Yields the operand unchanged, except for a potential retag.
1367    Use(Operand<'tcx>, WithRetag),
1368
1369    /// Creates an array where each element is the value of the operand.
1370    ///
1371    /// Corresponds to source code like `[x; 32]`.
1372    Repeat(Operand<'tcx>, ty::Const<'tcx>),
1373
1374    /// Creates a reference of the indicated kind to the place.
1375    ///
1376    /// There is not much to document here, because besides the obvious parts the semantics of this
1377    /// are essentially entirely a part of the aliasing model. There are many UCG issues discussing
1378    /// exactly what the behavior of this operation should be.
1379    ///
1380    /// `Shallow` borrows are disallowed after drop lowering.
1381    Ref(Region<'tcx>, BorrowKind, Place<'tcx>),
1382
1383    /// Creates a pointer/reference to the given thread local.
1384    ///
1385    /// The yielded type is a `*mut T` if the static is mutable, otherwise if the static is extern a
1386    /// `*const T`, and if neither of those apply a `&T`.
1387    ///
1388    /// **Note:** This is a runtime operation that actually executes code and is in this sense more
1389    /// like a function call. Also, eliminating dead stores of this rvalue causes `fn main() {}` to
1390    /// SIGILL for some reason that I (JakobDegen) never got a chance to look into.
1391    ///
1392    /// **Needs clarification**: Are there weird additional semantics here related to the runtime
1393    /// nature of this operation?
1394    ThreadLocalRef(DefId),
1395
1396    /// Creates a raw pointer with the indicated mutability to the place.
1397    ///
1398    /// This is generated by pointer casts like `&v as *const _` or raw borrow expressions like
1399    /// `&raw const v`.
1400    ///
1401    /// Like with references, the semantics of this operation are heavily dependent on the aliasing
1402    /// model.
1403    RawPtr(RawPtrKind, Place<'tcx>),
1404
1405    /// Performs essentially all of the casts that can be performed via `as`.
1406    ///
1407    /// This allows for casts from/to a variety of types.
1408    ///
1409    /// **FIXME**: Document exactly which `CastKind`s allow which types of casts.
1410    Cast(CastKind, Operand<'tcx>, Ty<'tcx>),
1411
1412    /// * `Offset` has the same semantics as [`offset`](pointer::offset), except that the second
1413    ///   parameter may be a `usize` as well.
1414    /// * The comparison operations accept `bool`s, `char`s, signed or unsigned integers, floats,
1415    ///   raw pointers, or function pointers and return a `bool`. The types of the operands must be
1416    ///   matching, up to the usual caveat of the lifetimes in function pointers.
1417    /// * Left and right shift operations accept signed or unsigned integers not necessarily of the
1418    ///   same type and return a value of the same type as their LHS. Like in Rust, the RHS is
1419    ///   truncated as needed.
1420    /// * The `Bit*` operations accept signed integers, unsigned integers, or bools with matching
1421    ///   types and return a value of that type.
1422    /// * The `FooWithOverflow` are like the `Foo`, but returning `(T, bool)` instead of just `T`,
1423    ///   where the `bool` is true if the result is not equal to the infinite-precision result.
1424    /// * The remaining operations accept signed integers, unsigned integers, or floats with
1425    ///   matching types and return a value of that type.
1426    BinaryOp(BinOp, Box<(Operand<'tcx>, Operand<'tcx>)>),
1427
1428    /// Exactly like `BinaryOp`, but less operands.
1429    ///
1430    /// Also does two's-complement arithmetic. Negation requires a signed integer or a float;
1431    /// bitwise not requires a signed integer, unsigned integer, or bool. Both operation kinds
1432    /// return a value with the same type as their operand.
1433    UnaryOp(UnOp, Operand<'tcx>),
1434
1435    /// Computes the discriminant of the place, returning it as an integer of type
1436    /// [`discriminant_ty`]. Returns zero for types without discriminant.
1437    ///
1438    /// The validity requirements for the underlying value are undecided for this rvalue, see
1439    /// [#91095]. Note too that the value of the discriminant is not the same thing as the
1440    /// variant index; use [`discriminant_for_variant`] to convert.
1441    ///
1442    /// [`discriminant_ty`]: crate::ty::Ty::discriminant_ty
1443    /// [#91095]: https://github.com/rust-lang/rust/issues/91095
1444    /// [`discriminant_for_variant`]: crate::ty::Ty::discriminant_for_variant
1445    Discriminant(Place<'tcx>),
1446
1447    /// Creates an aggregate value, like a tuple or struct.
1448    ///
1449    /// This is needed because dataflow analysis needs to distinguish
1450    /// `dest = Foo { x: ..., y: ... }` from `dest.x = ...; dest.y = ...;` in the case that `Foo`
1451    /// has a destructor.
1452    ///
1453    /// Disallowed after deaggregation for all aggregate kinds except `Array` and `Coroutine`. After
1454    /// coroutine lowering, `Coroutine` aggregate kinds are disallowed too.
1455    Aggregate(Box<AggregateKind<'tcx>>, IndexVec<FieldIdx, Operand<'tcx>>),
1456
1457    /// A CopyForDeref is equivalent to a read from a place at the
1458    /// codegen level, but is treated specially by drop elaboration. When such a read happens, it
1459    /// is guaranteed (via nature of the mir_opt `Derefer` in rustc_mir_transform/src/deref_separator)
1460    /// that the returned value is written into a `DerefTemp` local and that its only use is a deref operation,
1461    /// immediately followed by one or more projections. Drop elaboration treats this rvalue as if the
1462    /// read never happened and just projects further. This allows simplifying various MIR
1463    /// optimizations and codegen backends that previously had to handle deref operations anywhere
1464    /// in a place.
1465    ///
1466    /// Disallowed in runtime MIR and is replaced by normal copies.
1467    CopyForDeref(Place<'tcx>),
1468
1469    /// Wraps a value in an unsafe binder.
1470    WrapUnsafeBinder(Operand<'tcx>, Ty<'tcx>),
1471
1472    /// Creates a bitwise copy of the indicated place with the same type (if Mut) or its
1473    /// CoerceShared target type (if Not). The type is known to be an ADT with exactly one lifetime
1474    /// parameter, and it is known to implement the Reborrow trait (for Mut), and the CoerceShared
1475    /// trait (only if Not). The CoerceShared target type is known to also have exactly one lifetime
1476    /// parameter, implement Copy and (currently) have the same memory layout as the source type.
1477    ///
1478    /// The borrow checker uses the single lifetime in the source and target types to create a
1479    /// Covariant outlives-bound between the source and target with the Mutability of the Reborrow.
1480    /// This makes accessing the source value for writes (and reads if Mut) for the lifetime of the
1481    /// target value a borrow check error, imitating `&mut T` and `&T`'s reborrowing on user ADTs.
1482    ///
1483    /// Future work may add support for multiple lifetimes and changing memory layout as part of
1484    /// CoerceShared. These may be end up implemented as multiple MIR operations.
1485    ///
1486    /// This is produced by the [`ExprKind::Reborrow`].
1487    ///
1488    /// [`ExprKind::Reborrow`]: crate::thir::ExprKind::Reborrow
1489    Reborrow(Ty<'tcx>, Mutability, Place<'tcx>),
1490}
1491
1492#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for CastKind { }
#[automatically_derived]
impl ::core::clone::Clone for CastKind {
    #[inline]
    fn clone(&self) -> Self {
        let _: ::core::clone::AssertParamIsClone<PointerCoercion>;
        let _: ::core::clone::AssertParamIsClone<CoercionSource>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for CastKind { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for CastKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Self::PointerExposeProvenance =>
                ::core::fmt::Formatter::write_str(f,
                    "PointerExposeProvenance"),
            Self::PointerWithExposedProvenance =>
                ::core::fmt::Formatter::write_str(f,
                    "PointerWithExposedProvenance"),
            Self::PointerCoercion(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "PointerCoercion", __self_0, &__self_1),
            Self::IntToInt =>
                ::core::fmt::Formatter::write_str(f, "IntToInt"),
            Self::FloatToInt =>
                ::core::fmt::Formatter::write_str(f, "FloatToInt"),
            Self::FloatToFloat =>
                ::core::fmt::Formatter::write_str(f, "FloatToFloat"),
            Self::IntToFloat =>
                ::core::fmt::Formatter::write_str(f, "IntToFloat"),
            Self::PtrToPtr =>
                ::core::fmt::Formatter::write_str(f, "PtrToPtr"),
            Self::FnPtrToPtr =>
                ::core::fmt::Formatter::write_str(f, "FnPtrToPtr"),
            Self::Transmute =>
                ::core::fmt::Formatter::write_str(f, "Transmute"),
            Self::BoxDerefTransmute =>
                ::core::fmt::Formatter::write_str(f, "BoxDerefTransmute"),
            Self::Subtype => ::core::fmt::Formatter::write_str(f, "Subtype"),
        }
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for CastKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for CastKind {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::PointerCoercion(__self_0, __self_1),
                    Self::PointerCoercion(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for CastKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<PointerCoercion>;
        let _: ::core::cmp::AssertParamIsEq<CoercionSource>;
    }
}Eq, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for CastKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        CastKind::PointerExposeProvenance => { 0usize }
                        CastKind::PointerWithExposedProvenance => { 1usize }
                        CastKind::PointerCoercion(ref __binding_0, ref __binding_1)
                            => {
                            2usize
                        }
                        CastKind::IntToInt => { 3usize }
                        CastKind::FloatToInt => { 4usize }
                        CastKind::FloatToFloat => { 5usize }
                        CastKind::IntToFloat => { 6usize }
                        CastKind::PtrToPtr => { 7usize }
                        CastKind::FnPtrToPtr => { 8usize }
                        CastKind::Transmute => { 9usize }
                        CastKind::BoxDerefTransmute => { 10usize }
                        CastKind::Subtype => { 11usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    CastKind::PointerExposeProvenance => {}
                    CastKind::PointerWithExposedProvenance => {}
                    CastKind::PointerCoercion(ref __binding_0, ref __binding_1)
                        => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    CastKind::IntToInt => {}
                    CastKind::FloatToInt => {}
                    CastKind::FloatToFloat => {}
                    CastKind::IntToFloat => {}
                    CastKind::PtrToPtr => {}
                    CastKind::FnPtrToPtr => {}
                    CastKind::Transmute => {}
                    CastKind::BoxDerefTransmute => {}
                    CastKind::Subtype => {}
                }
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for CastKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { CastKind::PointerExposeProvenance }
                    1usize => { CastKind::PointerWithExposedProvenance }
                    2usize => {
                        CastKind::PointerCoercion(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => { CastKind::IntToInt }
                    4usize => { CastKind::FloatToInt }
                    5usize => { CastKind::FloatToFloat }
                    6usize => { CastKind::IntToFloat }
                    7usize => { CastKind::PtrToPtr }
                    8usize => { CastKind::FnPtrToPtr }
                    9usize => { CastKind::Transmute }
                    10usize => { CastKind::BoxDerefTransmute }
                    11usize => { CastKind::Subtype }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `CastKind`, expected 0..12, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable, #[automatically_derived]
impl ::core::hash::Hash for CastKind {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
            state);
        match self {
            Self::PointerCoercion(__self_0, __self_1) => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            _ => {}
        }
    }
}Hash, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for CastKind {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    CastKind::PointerExposeProvenance => {}
                    CastKind::PointerWithExposedProvenance => {}
                    CastKind::PointerCoercion(ref __binding_0, ref __binding_1)
                        => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    CastKind::IntToInt => {}
                    CastKind::FloatToInt => {}
                    CastKind::FloatToFloat => {}
                    CastKind::IntToFloat => {}
                    CastKind::PtrToPtr => {}
                    CastKind::FnPtrToPtr => {}
                    CastKind::Transmute => {}
                    CastKind::BoxDerefTransmute => {}
                    CastKind::Subtype => {}
                }
            }
        }
    };StableHash)]
1493pub enum CastKind {
1494    /// An exposing pointer to address cast. A cast between a pointer and an integer type, or
1495    /// between a function pointer and an integer type.
1496    /// See the docs on `expose_provenance` for more details.
1497    PointerExposeProvenance,
1498    /// An address-to-pointer cast that picks up an exposed provenance.
1499    /// See the docs on `with_exposed_provenance` for more details.
1500    PointerWithExposedProvenance,
1501    /// Pointer related casts that are done by coercions. Note that reference-to-raw-ptr casts are
1502    /// translated into `&raw mut/const *r`, i.e., they are not actually casts.
1503    ///
1504    /// The following are allowed in [`AnalysisPhase::Initial`] as they're needed for borrowck,
1505    /// but after that are forbidden (including in all phases of runtime MIR):
1506    /// * [`PointerCoercion::ArrayToPointer`]
1507    /// * [`PointerCoercion::MutToConstPointer`]
1508    ///
1509    /// Both are runtime nops, so should be [`CastKind::PtrToPtr`] instead in runtime MIR.
1510    PointerCoercion(PointerCoercion, CoercionSource),
1511    IntToInt,
1512    FloatToInt,
1513    FloatToFloat,
1514    IntToFloat,
1515    PtrToPtr,
1516    FnPtrToPtr,
1517    /// Reinterpret the bits of the input as a different type.
1518    ///
1519    /// MIR is well-formed if the input and output types have different sizes,
1520    /// but running a transmute between differently-sized types is UB.
1521    Transmute,
1522    /// A special transmute used by elaborated `box` deref's to turn the inner pointer into a raw
1523    /// pointer. This is almost equivalent to a regular transmute except that if the input would not
1524    /// be valid as `Box<T>`, the cast is UB. Backends that do not care about UB detection can treat
1525    /// this like a regular transmute.
1526    ///
1527    /// Well-formedness: The input type must be a pointer type or a newtype around one (e.g.
1528    /// `NonNull`). The output type must be a raw pointer.
1529    BoxDerefTransmute,
1530
1531    /// A `Subtype` cast is applied to any [`StatementKind::Assign`] where
1532    /// type of lvalue doesn't match the type of rvalue, the primary goal is making subtyping
1533    /// explicit during optimizations and codegen.
1534    ///
1535    /// This cast doesn't impact the runtime behavior of the program except for potentially changing
1536    /// some type metadata of the interpreter or codegen backend.
1537    ///
1538    /// This goal is achieved with mir_transform pass `Subtyper`, which runs right after
1539    /// borrowchecker, as we only care about subtyping that can affect trait selection and
1540    /// `TypeId`.
1541    Subtype,
1542}
1543
1544/// Represents how a [`CastKind::PointerCoercion`] was constructed.
1545/// Used only for diagnostics.
1546#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for CoercionSource { }
#[automatically_derived]
impl ::core::clone::Clone for CoercionSource {
    #[inline]
    fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for CoercionSource { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for CoercionSource {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                CoercionSource::AsCast => "AsCast",
                CoercionSource::Implicit => "Implicit",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for CoercionSource { }
#[automatically_derived]
impl ::core::cmp::PartialEq for CoercionSource {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for CoercionSource { }Eq, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for CoercionSource {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        CoercionSource::AsCast => { 0usize }
                        CoercionSource::Implicit => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for CoercionSource {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { CoercionSource::AsCast }
                    1usize => { CoercionSource::Implicit }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `CoercionSource`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable, #[automatically_derived]
impl ::core::hash::Hash for CoercionSource {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
            state)
    }
}Hash, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            CoercionSource {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    CoercionSource::AsCast => {}
                    CoercionSource::Implicit => {}
                }
            }
        }
    };StableHash)]
1547pub enum CoercionSource {
1548    /// The coercion was manually written by the user with an `as` cast.
1549    AsCast,
1550    /// The coercion was automatically inserted by the compiler.
1551    Implicit,
1552}
1553
1554#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for AggregateKind<'tcx> {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Array(__self_0) =>
                AggregateKind::Array(::core::clone::Clone::clone(__self_0)),
            Self::Tuple => AggregateKind::Tuple,
            Self::Adt(__self_0, __self_1, __self_2, __self_3, __self_4) =>
                AggregateKind::Adt(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2),
                    ::core::clone::Clone::clone(__self_3),
                    ::core::clone::Clone::clone(__self_4)),
            Self::Closure(__self_0, __self_1) =>
                AggregateKind::Closure(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::Coroutine(__self_0, __self_1) =>
                AggregateKind::Coroutine(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::CoroutineClosure(__self_0, __self_1) =>
                AggregateKind::CoroutineClosure(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::RawPtr(__self_0, __self_1) =>
                AggregateKind::RawPtr(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
        }
    }
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for AggregateKind<'tcx> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Self::Array(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Array",
                    &__self_0),
            Self::Tuple => ::core::fmt::Formatter::write_str(f, "Tuple"),
            Self::Adt(__self_0, __self_1, __self_2, __self_3, __self_4) =>
                ::core::fmt::Formatter::debug_tuple_field5_finish(f, "Adt",
                    __self_0, __self_1, __self_2, __self_3, &__self_4),
            Self::Closure(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "Closure", __self_0, &__self_1),
            Self::Coroutine(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "Coroutine", __self_0, &__self_1),
            Self::CoroutineClosure(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "CoroutineClosure", __self_0, &__self_1),
            Self::RawPtr(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "RawPtr",
                    __self_0, &__self_1),
        }
    }
}Debug, #[automatically_derived]
impl<'tcx> ::core::marker::StructuralPartialEq for AggregateKind<'tcx> { }
#[automatically_derived]
impl<'tcx> ::core::cmp::PartialEq for AggregateKind<'tcx> {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Array(__self_0), Self::Array(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::Adt(__self_0, __self_1, __self_2, __self_3, __self_4),
                    Self::Adt(__arg1_0, __arg1_1, __arg1_2, __arg1_3, __arg1_4))
                    =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1 &&
                                __self_2 == __arg1_2 && __self_3 == __arg1_3 &&
                        __self_4 == __arg1_4,
                (Self::Closure(__self_0, __self_1),
                    Self::Closure(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (Self::Coroutine(__self_0, __self_1),
                    Self::Coroutine(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (Self::CoroutineClosure(__self_0, __self_1),
                    Self::CoroutineClosure(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (Self::RawPtr(__self_0, __self_1),
                    Self::RawPtr(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl<'tcx> ::core::cmp::Eq for AggregateKind<'tcx> {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Ty<'tcx>>;
        let _: ::core::cmp::AssertParamIsEq<DefId>;
        let _: ::core::cmp::AssertParamIsEq<VariantIdx>;
        let _: ::core::cmp::AssertParamIsEq<GenericArgsRef<'tcx>>;
        let _: ::core::cmp::AssertParamIsEq<Option<UserTypeAnnotationIndex>>;
        let _: ::core::cmp::AssertParamIsEq<Option<FieldIdx>>;
        let _: ::core::cmp::AssertParamIsEq<GenericArgsRef<'tcx>>;
        let _: ::core::cmp::AssertParamIsEq<GenericArgsRef<'tcx>>;
        let _: ::core::cmp::AssertParamIsEq<GenericArgsRef<'tcx>>;
        let _: ::core::cmp::AssertParamIsEq<Ty<'tcx>>;
        let _: ::core::cmp::AssertParamIsEq<Mutability>;
    }
}Eq, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for AggregateKind<'tcx> {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        AggregateKind::Array(ref __binding_0) => { 0usize }
                        AggregateKind::Tuple => { 1usize }
                        AggregateKind::Adt(ref __binding_0, ref __binding_1,
                            ref __binding_2, ref __binding_3, ref __binding_4) => {
                            2usize
                        }
                        AggregateKind::Closure(ref __binding_0, ref __binding_1) =>
                            {
                            3usize
                        }
                        AggregateKind::Coroutine(ref __binding_0, ref __binding_1)
                            => {
                            4usize
                        }
                        AggregateKind::CoroutineClosure(ref __binding_0,
                            ref __binding_1) => {
                            5usize
                        }
                        AggregateKind::RawPtr(ref __binding_0, ref __binding_1) => {
                            6usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    AggregateKind::Array(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AggregateKind::Tuple => {}
                    AggregateKind::Adt(ref __binding_0, ref __binding_1,
                        ref __binding_2, ref __binding_3, 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);
                    }
                    AggregateKind::Closure(ref __binding_0, ref __binding_1) =>
                        {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    AggregateKind::Coroutine(ref __binding_0, ref __binding_1)
                        => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    AggregateKind::CoroutineClosure(ref __binding_0,
                        ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    AggregateKind::RawPtr(ref __binding_0, 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 AggregateKind<'tcx> {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        AggregateKind::Array(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => { AggregateKind::Tuple }
                    2usize => {
                        AggregateKind::Adt(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => {
                        AggregateKind::Closure(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    4usize => {
                        AggregateKind::Coroutine(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    5usize => {
                        AggregateKind::CoroutineClosure(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    6usize => {
                        AggregateKind::RawPtr(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `AggregateKind`, expected 0..7, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable, const _: () =
    {
        impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
            AggregateKind<'tcx> {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    AggregateKind::Array(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    AggregateKind::Tuple => {}
                    AggregateKind::Adt(ref __binding_0, ref __binding_1,
                        ref __binding_2, ref __binding_3, ref __binding_4) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                        { __binding_3.stable_hash(__hcx, __hasher); }
                        { __binding_4.stable_hash(__hcx, __hasher); }
                    }
                    AggregateKind::Closure(ref __binding_0, ref __binding_1) =>
                        {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    AggregateKind::Coroutine(ref __binding_0, ref __binding_1)
                        => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    AggregateKind::CoroutineClosure(ref __binding_0,
                        ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    AggregateKind::RawPtr(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
1555#[derive(const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            for AggregateKind<'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 {
                        AggregateKind::Array(__binding_0) => {
                            AggregateKind::Array(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?)
                        }
                        AggregateKind::Tuple => { AggregateKind::Tuple }
                        AggregateKind::Adt(__binding_0, __binding_1, __binding_2,
                            __binding_3, __binding_4) => {
                            AggregateKind::Adt(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?,
                                ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_2,
                                        __folder)?,
                                ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_3,
                                        __folder)?,
                                ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_4,
                                        __folder)?)
                        }
                        AggregateKind::Closure(__binding_0, __binding_1) => {
                            AggregateKind::Closure(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?)
                        }
                        AggregateKind::Coroutine(__binding_0, __binding_1) => {
                            AggregateKind::Coroutine(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?)
                        }
                        AggregateKind::CoroutineClosure(__binding_0, __binding_1) =>
                            {
                            AggregateKind::CoroutineClosure(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                ::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_1,
                                        __folder)?)
                        }
                        AggregateKind::RawPtr(__binding_0, __binding_1) => {
                            AggregateKind::RawPtr(::rustc_middle::ty::TypeFoldable::try_fold_with(__binding_0,
                                        __folder)?,
                                ::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 {
                    AggregateKind::Array(__binding_0) => {
                        AggregateKind::Array(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder))
                    }
                    AggregateKind::Tuple => { AggregateKind::Tuple }
                    AggregateKind::Adt(__binding_0, __binding_1, __binding_2,
                        __binding_3, __binding_4) => {
                        AggregateKind::Adt(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder),
                            ::rustc_middle::ty::TypeFoldable::fold_with(__binding_2,
                                __folder),
                            ::rustc_middle::ty::TypeFoldable::fold_with(__binding_3,
                                __folder),
                            ::rustc_middle::ty::TypeFoldable::fold_with(__binding_4,
                                __folder))
                    }
                    AggregateKind::Closure(__binding_0, __binding_1) => {
                        AggregateKind::Closure(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder))
                    }
                    AggregateKind::Coroutine(__binding_0, __binding_1) => {
                        AggregateKind::Coroutine(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder))
                    }
                    AggregateKind::CoroutineClosure(__binding_0, __binding_1) =>
                        {
                        AggregateKind::CoroutineClosure(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder))
                    }
                    AggregateKind::RawPtr(__binding_0, __binding_1) => {
                        AggregateKind::RawPtr(::rustc_middle::ty::TypeFoldable::fold_with(__binding_0,
                                __folder),
                            ::rustc_middle::ty::TypeFoldable::fold_with(__binding_1,
                                __folder))
                    }
                }
            }
        }
    };TypeFoldable, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
            for AggregateKind<'tcx> {
            fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    AggregateKind::Array(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);
                                }
                            }
                        }
                    }
                    AggregateKind::Tuple => {}
                    AggregateKind::Adt(ref __binding_0, ref __binding_1,
                        ref __binding_2, ref __binding_3, 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);
                                }
                            }
                        }
                    }
                    AggregateKind::Closure(ref __binding_0, 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);
                                }
                            }
                        }
                    }
                    AggregateKind::Coroutine(ref __binding_0, 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);
                                }
                            }
                        }
                    }
                    AggregateKind::CoroutineClosure(ref __binding_0,
                        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);
                                }
                            }
                        }
                    }
                    AggregateKind::RawPtr(ref __binding_0, 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)]
1556pub enum AggregateKind<'tcx> {
1557    /// The type is of the element
1558    Array(Ty<'tcx>),
1559    Tuple,
1560
1561    /// The second field is the variant index. It's equal to 0 for struct
1562    /// and union expressions. The last field is the
1563    /// active field number and is present only for union expressions
1564    /// -- e.g., for a union expression `SomeUnion { c: .. }`, the
1565    /// active field index would identity the field `c`
1566    Adt(DefId, VariantIdx, GenericArgsRef<'tcx>, Option<UserTypeAnnotationIndex>, Option<FieldIdx>),
1567
1568    Closure(DefId, GenericArgsRef<'tcx>),
1569    Coroutine(DefId, GenericArgsRef<'tcx>),
1570    CoroutineClosure(DefId, GenericArgsRef<'tcx>),
1571
1572    /// Construct a raw pointer from the data pointer and metadata.
1573    ///
1574    /// The `Ty` here is the type of the *pointee*, not the pointer itself.
1575    /// The `Mutability` indicates whether this produces a `*const` or `*mut`.
1576    ///
1577    /// The [`Rvalue::Aggregate`] operands for thus must be
1578    ///
1579    /// 0. A raw pointer of matching mutability with any [`core::ptr::Thin`] pointee
1580    /// 1. A value of the appropriate [`core::ptr::Pointee::Metadata`] type
1581    ///
1582    /// *Both* operands must always be included, even the unit value if this is
1583    /// creating a thin pointer. If you're just converting between thin pointers,
1584    /// you may want an [`Rvalue::Cast`] with [`CastKind::PtrToPtr`] instead.
1585    RawPtr(Ty<'tcx>, Mutability),
1586}
1587
1588#[derive(#[automatically_derived]
impl ::core::marker::Copy for RuntimeChecks { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for RuntimeChecks { }
#[automatically_derived]
impl ::core::clone::Clone for RuntimeChecks {
    #[inline]
    fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for RuntimeChecks {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                RuntimeChecks::UbChecks => "UbChecks",
                RuntimeChecks::ContractChecks => "ContractChecks",
                RuntimeChecks::OverflowChecks => "OverflowChecks",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for RuntimeChecks { }
#[automatically_derived]
impl ::core::cmp::PartialEq for RuntimeChecks {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for RuntimeChecks { }Eq, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for RuntimeChecks {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        RuntimeChecks::UbChecks => { 0usize }
                        RuntimeChecks::ContractChecks => { 1usize }
                        RuntimeChecks::OverflowChecks => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for RuntimeChecks {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { RuntimeChecks::UbChecks }
                    1usize => { RuntimeChecks::ContractChecks }
                    2usize => { RuntimeChecks::OverflowChecks }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `RuntimeChecks`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable, #[automatically_derived]
impl ::core::hash::Hash for RuntimeChecks {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
            state)
    }
}Hash, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            RuntimeChecks {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    RuntimeChecks::UbChecks => {}
                    RuntimeChecks::ContractChecks => {}
                    RuntimeChecks::OverflowChecks => {}
                }
            }
        }
    };StableHash)]
1589pub enum RuntimeChecks {
1590    /// Returns whether we should perform some UB-checking at runtime.
1591    /// See the `ub_checks` intrinsic docs for details.
1592    UbChecks,
1593    /// Returns whether we should perform contract-checking at runtime.
1594    /// See the `contract_checks` intrinsic docs for details.
1595    ContractChecks,
1596    /// Returns whether we should perform some overflow-checking at runtime.
1597    /// See the `overflow_checks` intrinsic docs for details.
1598    OverflowChecks,
1599}
1600
1601impl RuntimeChecks {
1602    pub fn value(self, sess: &rustc_session::Session) -> bool {
1603        match self {
1604            Self::UbChecks => sess.ub_checks(),
1605            Self::ContractChecks => sess.contract_checks(),
1606            Self::OverflowChecks => sess.overflow_checks(),
1607        }
1608    }
1609}
1610
1611#[derive(#[automatically_derived]
impl ::core::marker::Copy for UnOp { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for UnOp { }
#[automatically_derived]
impl ::core::clone::Clone for UnOp {
    #[inline]
    fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for UnOp {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                UnOp::Not => "Not",
                UnOp::Neg => "Neg",
                UnOp::PtrMetadata => "PtrMetadata",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for UnOp { }
#[automatically_derived]
impl ::core::cmp::PartialEq for UnOp {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for UnOp { }Eq, #[automatically_derived]
impl ::core::hash::Hash for UnOp {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
            state)
    }
}Hash)]
1612#[derive(const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for UnOp {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    UnOp::Not => {}
                    UnOp::Neg => {}
                    UnOp::PtrMetadata => {}
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for UnOp {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        UnOp::Not => { 0usize }
                        UnOp::Neg => { 1usize }
                        UnOp::PtrMetadata => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for UnOp {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { UnOp::Not }
                    1usize => { UnOp::Neg }
                    2usize => { UnOp::PtrMetadata }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `UnOp`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            for UnOp {
            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 {
                        UnOp::Not => { UnOp::Not }
                        UnOp::Neg => { UnOp::Neg }
                        UnOp::PtrMetadata => { UnOp::PtrMetadata }
                    })
            }
            fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    UnOp::Not => { UnOp::Not }
                    UnOp::Neg => { UnOp::Neg }
                    UnOp::PtrMetadata => { UnOp::PtrMetadata }
                }
            }
        }
    };TypeFoldable, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
            for UnOp {
            fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    UnOp::Not => {}
                    UnOp::Neg => {}
                    UnOp::PtrMetadata => {}
                }
                <__V::Result as ::rustc_middle::ty::VisitorResult>::output()
            }
        }
    };TypeVisitable)]
1613pub enum UnOp {
1614    /// The `!` operator for logical inversion
1615    Not,
1616    /// The `-` operator for negation
1617    Neg,
1618    /// Gets the metadata `M` from a `*const`/`*mut`/`&`/`&mut` to
1619    /// `impl Pointee<Metadata = M>`.
1620    ///
1621    /// For example, this will give a `()` from `*const i32`, a `usize` from
1622    /// `&mut [u8]`, or a `ptr::DynMetadata<dyn Foo>` (internally a pointer)
1623    /// from a `*mut dyn Foo`.
1624    ///
1625    /// Allowed only in [`MirPhase::Runtime`]; earlier it's an intrinsic.
1626    PtrMetadata,
1627}
1628
1629#[derive(#[automatically_derived]
impl ::core::marker::Copy for BinOp { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for BinOp { }
#[automatically_derived]
impl ::core::clone::Clone for BinOp {
    #[inline]
    fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for BinOp {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                BinOp::Add => "Add",
                BinOp::AddUnchecked => "AddUnchecked",
                BinOp::AddWithOverflow => "AddWithOverflow",
                BinOp::Sub => "Sub",
                BinOp::SubUnchecked => "SubUnchecked",
                BinOp::SubWithOverflow => "SubWithOverflow",
                BinOp::Mul => "Mul",
                BinOp::MulUnchecked => "MulUnchecked",
                BinOp::MulWithOverflow => "MulWithOverflow",
                BinOp::Div => "Div",
                BinOp::Rem => "Rem",
                BinOp::BitXor => "BitXor",
                BinOp::BitAnd => "BitAnd",
                BinOp::BitOr => "BitOr",
                BinOp::Shl => "Shl",
                BinOp::ShlUnchecked => "ShlUnchecked",
                BinOp::Shr => "Shr",
                BinOp::ShrUnchecked => "ShrUnchecked",
                BinOp::Eq => "Eq",
                BinOp::Lt => "Lt",
                BinOp::Le => "Le",
                BinOp::Ne => "Ne",
                BinOp::Ge => "Ge",
                BinOp::Gt => "Gt",
                BinOp::Cmp => "Cmp",
                BinOp::Offset => "Offset",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for BinOp { }
#[automatically_derived]
impl ::core::cmp::PartialEq for BinOp {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for BinOp { }Eq, #[automatically_derived]
impl ::core::hash::Hash for BinOp {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
            state)
    }
}Hash)]
1630#[derive(const _: () =
    {
        impl<'tcx, __E: ::rustc_middle::ty::codec::TyEncoder<'tcx>>
            ::rustc_serialize::Encodable<__E> for BinOp {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        BinOp::Add => { 0usize }
                        BinOp::AddUnchecked => { 1usize }
                        BinOp::AddWithOverflow => { 2usize }
                        BinOp::Sub => { 3usize }
                        BinOp::SubUnchecked => { 4usize }
                        BinOp::SubWithOverflow => { 5usize }
                        BinOp::Mul => { 6usize }
                        BinOp::MulUnchecked => { 7usize }
                        BinOp::MulWithOverflow => { 8usize }
                        BinOp::Div => { 9usize }
                        BinOp::Rem => { 10usize }
                        BinOp::BitXor => { 11usize }
                        BinOp::BitAnd => { 12usize }
                        BinOp::BitOr => { 13usize }
                        BinOp::Shl => { 14usize }
                        BinOp::ShlUnchecked => { 15usize }
                        BinOp::Shr => { 16usize }
                        BinOp::ShrUnchecked => { 17usize }
                        BinOp::Eq => { 18usize }
                        BinOp::Lt => { 19usize }
                        BinOp::Le => { 20usize }
                        BinOp::Ne => { 21usize }
                        BinOp::Ge => { 22usize }
                        BinOp::Gt => { 23usize }
                        BinOp::Cmp => { 24usize }
                        BinOp::Offset => { 25usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };TyEncodable, const _: () =
    {
        impl<'tcx, __D: ::rustc_middle::ty::codec::TyDecoder<'tcx>>
            ::rustc_serialize::Decodable<__D> for BinOp {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { BinOp::Add }
                    1usize => { BinOp::AddUnchecked }
                    2usize => { BinOp::AddWithOverflow }
                    3usize => { BinOp::Sub }
                    4usize => { BinOp::SubUnchecked }
                    5usize => { BinOp::SubWithOverflow }
                    6usize => { BinOp::Mul }
                    7usize => { BinOp::MulUnchecked }
                    8usize => { BinOp::MulWithOverflow }
                    9usize => { BinOp::Div }
                    10usize => { BinOp::Rem }
                    11usize => { BinOp::BitXor }
                    12usize => { BinOp::BitAnd }
                    13usize => { BinOp::BitOr }
                    14usize => { BinOp::Shl }
                    15usize => { BinOp::ShlUnchecked }
                    16usize => { BinOp::Shr }
                    17usize => { BinOp::ShrUnchecked }
                    18usize => { BinOp::Eq }
                    19usize => { BinOp::Lt }
                    20usize => { BinOp::Le }
                    21usize => { BinOp::Ne }
                    22usize => { BinOp::Ge }
                    23usize => { BinOp::Gt }
                    24usize => { BinOp::Cmp }
                    25usize => { BinOp::Offset }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `BinOp`, expected 0..26, actual {0}",
                                n));
                    }
                }
            }
        }
    };TyDecodable, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for BinOp {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    BinOp::Add => {}
                    BinOp::AddUnchecked => {}
                    BinOp::AddWithOverflow => {}
                    BinOp::Sub => {}
                    BinOp::SubUnchecked => {}
                    BinOp::SubWithOverflow => {}
                    BinOp::Mul => {}
                    BinOp::MulUnchecked => {}
                    BinOp::MulWithOverflow => {}
                    BinOp::Div => {}
                    BinOp::Rem => {}
                    BinOp::BitXor => {}
                    BinOp::BitAnd => {}
                    BinOp::BitOr => {}
                    BinOp::Shl => {}
                    BinOp::ShlUnchecked => {}
                    BinOp::Shr => {}
                    BinOp::ShrUnchecked => {}
                    BinOp::Eq => {}
                    BinOp::Lt => {}
                    BinOp::Le => {}
                    BinOp::Ne => {}
                    BinOp::Ge => {}
                    BinOp::Gt => {}
                    BinOp::Cmp => {}
                    BinOp::Offset => {}
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeFoldable<::rustc_middle::ty::TyCtxt<'tcx>>
            for BinOp {
            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 {
                        BinOp::Add => { BinOp::Add }
                        BinOp::AddUnchecked => { BinOp::AddUnchecked }
                        BinOp::AddWithOverflow => { BinOp::AddWithOverflow }
                        BinOp::Sub => { BinOp::Sub }
                        BinOp::SubUnchecked => { BinOp::SubUnchecked }
                        BinOp::SubWithOverflow => { BinOp::SubWithOverflow }
                        BinOp::Mul => { BinOp::Mul }
                        BinOp::MulUnchecked => { BinOp::MulUnchecked }
                        BinOp::MulWithOverflow => { BinOp::MulWithOverflow }
                        BinOp::Div => { BinOp::Div }
                        BinOp::Rem => { BinOp::Rem }
                        BinOp::BitXor => { BinOp::BitXor }
                        BinOp::BitAnd => { BinOp::BitAnd }
                        BinOp::BitOr => { BinOp::BitOr }
                        BinOp::Shl => { BinOp::Shl }
                        BinOp::ShlUnchecked => { BinOp::ShlUnchecked }
                        BinOp::Shr => { BinOp::Shr }
                        BinOp::ShrUnchecked => { BinOp::ShrUnchecked }
                        BinOp::Eq => { BinOp::Eq }
                        BinOp::Lt => { BinOp::Lt }
                        BinOp::Le => { BinOp::Le }
                        BinOp::Ne => { BinOp::Ne }
                        BinOp::Ge => { BinOp::Ge }
                        BinOp::Gt => { BinOp::Gt }
                        BinOp::Cmp => { BinOp::Cmp }
                        BinOp::Offset => { BinOp::Offset }
                    })
            }
            fn fold_with<__F: ::rustc_middle::ty::TypeFolder<::rustc_middle::ty::TyCtxt<'tcx>>>(self,
                __folder: &mut __F) -> Self {
                match self {
                    BinOp::Add => { BinOp::Add }
                    BinOp::AddUnchecked => { BinOp::AddUnchecked }
                    BinOp::AddWithOverflow => { BinOp::AddWithOverflow }
                    BinOp::Sub => { BinOp::Sub }
                    BinOp::SubUnchecked => { BinOp::SubUnchecked }
                    BinOp::SubWithOverflow => { BinOp::SubWithOverflow }
                    BinOp::Mul => { BinOp::Mul }
                    BinOp::MulUnchecked => { BinOp::MulUnchecked }
                    BinOp::MulWithOverflow => { BinOp::MulWithOverflow }
                    BinOp::Div => { BinOp::Div }
                    BinOp::Rem => { BinOp::Rem }
                    BinOp::BitXor => { BinOp::BitXor }
                    BinOp::BitAnd => { BinOp::BitAnd }
                    BinOp::BitOr => { BinOp::BitOr }
                    BinOp::Shl => { BinOp::Shl }
                    BinOp::ShlUnchecked => { BinOp::ShlUnchecked }
                    BinOp::Shr => { BinOp::Shr }
                    BinOp::ShrUnchecked => { BinOp::ShrUnchecked }
                    BinOp::Eq => { BinOp::Eq }
                    BinOp::Lt => { BinOp::Lt }
                    BinOp::Le => { BinOp::Le }
                    BinOp::Ne => { BinOp::Ne }
                    BinOp::Ge => { BinOp::Ge }
                    BinOp::Gt => { BinOp::Gt }
                    BinOp::Cmp => { BinOp::Cmp }
                    BinOp::Offset => { BinOp::Offset }
                }
            }
        }
    };TypeFoldable, const _: () =
    {
        impl<'tcx>
            ::rustc_middle::ty::TypeVisitable<::rustc_middle::ty::TyCtxt<'tcx>>
            for BinOp {
            fn visit_with<__V: ::rustc_middle::ty::TypeVisitor<::rustc_middle::ty::TyCtxt<'tcx>>>(&self,
                __visitor: &mut __V) -> __V::Result {
                match *self {
                    BinOp::Add => {}
                    BinOp::AddUnchecked => {}
                    BinOp::AddWithOverflow => {}
                    BinOp::Sub => {}
                    BinOp::SubUnchecked => {}
                    BinOp::SubWithOverflow => {}
                    BinOp::Mul => {}
                    BinOp::MulUnchecked => {}
                    BinOp::MulWithOverflow => {}
                    BinOp::Div => {}
                    BinOp::Rem => {}
                    BinOp::BitXor => {}
                    BinOp::BitAnd => {}
                    BinOp::BitOr => {}
                    BinOp::Shl => {}
                    BinOp::ShlUnchecked => {}
                    BinOp::Shr => {}
                    BinOp::ShrUnchecked => {}
                    BinOp::Eq => {}
                    BinOp::Lt => {}
                    BinOp::Le => {}
                    BinOp::Ne => {}
                    BinOp::Ge => {}
                    BinOp::Gt => {}
                    BinOp::Cmp => {}
                    BinOp::Offset => {}
                }
                <__V::Result as ::rustc_middle::ty::VisitorResult>::output()
            }
        }
    };TypeVisitable)]
1631pub enum BinOp {
1632    /// The `+` operator (addition)
1633    Add,
1634    /// Like `Add`, but with UB on overflow.  (Integers only.)
1635    AddUnchecked,
1636    /// Like `Add`, but returns `(T, bool)` of both the wrapped result
1637    /// and a bool indicating whether it overflowed.
1638    AddWithOverflow,
1639    /// The `-` operator (subtraction)
1640    Sub,
1641    /// Like `Sub`, but with UB on overflow.  (Integers only.)
1642    SubUnchecked,
1643    /// Like `Sub`, but returns `(T, bool)` of both the wrapped result
1644    /// and a bool indicating whether it overflowed.
1645    SubWithOverflow,
1646    /// The `*` operator (multiplication)
1647    Mul,
1648    /// Like `Mul`, but with UB on overflow.  (Integers only.)
1649    MulUnchecked,
1650    /// Like `Mul`, but returns `(T, bool)` of both the wrapped result
1651    /// and a bool indicating whether it overflowed.
1652    MulWithOverflow,
1653    /// The `/` operator (division)
1654    ///
1655    /// For integer types, division by zero is UB, as is `MIN / -1` for signed.
1656    /// The compiler should have inserted checks prior to this.
1657    ///
1658    /// Floating-point division by zero is safe, and does not need guards.
1659    Div,
1660    /// The `%` operator (modulus)
1661    ///
1662    /// For integer types, using zero as the modulus (second operand) is UB,
1663    /// as is `MIN % -1` for signed.
1664    /// The compiler should have inserted checks prior to this.
1665    ///
1666    /// Floating-point remainder by zero is safe, and does not need guards.
1667    Rem,
1668    /// The `^` operator (bitwise xor)
1669    BitXor,
1670    /// The `&` operator (bitwise and)
1671    BitAnd,
1672    /// The `|` operator (bitwise or)
1673    BitOr,
1674    /// The `<<` operator (shift left)
1675    ///
1676    /// The offset is given by `RHS.rem_euclid(LHS::BITS)`.
1677    /// In other words, it is (uniquely) determined as follows:
1678    /// - it is "equal modulo LHS::BITS" to the RHS
1679    /// - it is in the range `0..LHS::BITS`
1680    Shl,
1681    /// Like `Shl`, but is UB if the RHS >= LHS::BITS or RHS < 0
1682    ShlUnchecked,
1683    /// The `>>` operator (shift right)
1684    ///
1685    /// The offset is given by `RHS.rem_euclid(LHS::BITS)`.
1686    /// In other words, it is (uniquely) determined as follows:
1687    /// - it is "equal modulo LHS::BITS" to the RHS
1688    /// - it is in the range `0..LHS::BITS`
1689    ///
1690    /// This is an arithmetic shift if the LHS is signed
1691    /// and a logical shift if the LHS is unsigned.
1692    Shr,
1693    /// Like `Shl`, but is UB if the RHS >= LHS::BITS or RHS < 0
1694    ShrUnchecked,
1695    /// The `==` operator (equality)
1696    Eq,
1697    /// The `<` operator (less than)
1698    Lt,
1699    /// The `<=` operator (less than or equal to)
1700    Le,
1701    /// The `!=` operator (not equal to)
1702    Ne,
1703    /// The `>=` operator (greater than or equal to)
1704    Ge,
1705    /// The `>` operator (greater than)
1706    Gt,
1707    /// The `<=>` operator (three-way comparison, like `Ord::cmp`)
1708    ///
1709    /// This is supported only on the integer types and `char`, always returning
1710    /// [`LangItem::OrderingEnum`] (aka [`std::cmp::Ordering`]).
1711    ///
1712    /// [`Rvalue::BinaryOp`]`(BinOp::Cmp, A, B)` returns
1713    /// - `Ordering::Less` (`-1_i8`, as a Scalar) if `A < B`
1714    /// - `Ordering::Equal` (`0_i8`, as a Scalar) if `A == B`
1715    /// - `Ordering::Greater` (`+1_i8`, as a Scalar) if `A > B`
1716    ///
1717    /// [`LangItem::OrderingEnum`]: rustc_attr_ir::lang_items::LangItem
1718    Cmp,
1719    /// The `ptr.offset` operator
1720    Offset,
1721}
1722
1723// Assignment operators, e.g. `+=`. See comments on the corresponding variants
1724// in `BinOp` for details.
1725#[derive(#[automatically_derived]
impl ::core::marker::Copy for AssignOp { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for AssignOp { }
#[automatically_derived]
impl ::core::clone::Clone for AssignOp {
    #[inline]
    fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for AssignOp {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                AssignOp::AddAssign => "AddAssign",
                AssignOp::SubAssign => "SubAssign",
                AssignOp::MulAssign => "MulAssign",
                AssignOp::DivAssign => "DivAssign",
                AssignOp::RemAssign => "RemAssign",
                AssignOp::BitXorAssign => "BitXorAssign",
                AssignOp::BitAndAssign => "BitAndAssign",
                AssignOp::BitOrAssign => "BitOrAssign",
                AssignOp::ShlAssign => "ShlAssign",
                AssignOp::ShrAssign => "ShrAssign",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for AssignOp { }
#[automatically_derived]
impl ::core::cmp::PartialEq for AssignOp {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for AssignOp { }Eq, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for AssignOp {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    AssignOp::AddAssign => {}
                    AssignOp::SubAssign => {}
                    AssignOp::MulAssign => {}
                    AssignOp::DivAssign => {}
                    AssignOp::RemAssign => {}
                    AssignOp::BitXorAssign => {}
                    AssignOp::BitAndAssign => {}
                    AssignOp::BitOrAssign => {}
                    AssignOp::ShlAssign => {}
                    AssignOp::ShrAssign => {}
                }
            }
        }
    };StableHash)]
1726pub enum AssignOp {
1727    AddAssign,
1728    SubAssign,
1729    MulAssign,
1730    DivAssign,
1731    RemAssign,
1732    BitXorAssign,
1733    BitAndAssign,
1734    BitOrAssign,
1735    ShlAssign,
1736    ShrAssign,
1737}
1738
1739// Sometimes `BinOp` and `AssignOp` need the same treatment. The operations
1740// covered by `AssignOp` are a subset of those covered by `BinOp`, so it makes
1741// sense to convert `AssignOp` to `BinOp`.
1742impl From<AssignOp> for BinOp {
1743    fn from(op: AssignOp) -> BinOp {
1744        match op {
1745            AssignOp::AddAssign => BinOp::Add,
1746            AssignOp::SubAssign => BinOp::Sub,
1747            AssignOp::MulAssign => BinOp::Mul,
1748            AssignOp::DivAssign => BinOp::Div,
1749            AssignOp::RemAssign => BinOp::Rem,
1750            AssignOp::BitXorAssign => BinOp::BitXor,
1751            AssignOp::BitAndAssign => BinOp::BitAnd,
1752            AssignOp::BitOrAssign => BinOp::BitOr,
1753            AssignOp::ShlAssign => BinOp::Shl,
1754            AssignOp::ShrAssign => BinOp::Shr,
1755        }
1756    }
1757}
1758
1759// Some nodes are used a lot. Make sure they don't unintentionally get bigger.
1760#[cfg(target_pointer_width = "64")]
1761mod size_asserts {
1762    use rustc_data_structures::static_assert_size;
1763
1764    use super::*;
1765    // tidy-alphabetical-start
1766    const _: [(); 32] = [(); ::std::mem::size_of::<AggregateKind<'_>>()];static_assert_size!(AggregateKind<'_>, 32);
1767    const _: [(); 24] = [(); ::std::mem::size_of::<Operand<'_>>()];static_assert_size!(Operand<'_>, 24);
1768    const _: [(); 16] = [(); ::std::mem::size_of::<Place<'_>>()];static_assert_size!(Place<'_>, 16);
1769    const _: [(); 24] = [(); ::std::mem::size_of::<PlaceElem<'_>>()];static_assert_size!(PlaceElem<'_>, 24);
1770    const _: [(); 40] = [(); ::std::mem::size_of::<Rvalue<'_>>()];static_assert_size!(Rvalue<'_>, 40);
1771    const _: [(); 16] = [(); ::std::mem::size_of::<StatementKind<'_>>()];static_assert_size!(StatementKind<'_>, 16);
1772    const _: [(); 80] = [(); ::std::mem::size_of::<TerminatorKind<'_>>()];static_assert_size!(TerminatorKind<'_>, 80);
1773    // tidy-alphabetical-end
1774}