Skip to main content

rustc_ast/
ast.rs

1//! The Rust abstract syntax tree module.
2//!
3//! This module contains common structures forming the language AST.
4//! Two main entities in the module are [`Item`] (which represents an AST element with
5//! additional metadata), and [`ItemKind`] (which represents a concrete type and contains
6//! information specific to the type of the item).
7//!
8//! Other module items worth mentioning:
9//! - [`Ty`] and [`TyKind`]: A parsed Rust type.
10//! - [`Expr`] and [`ExprKind`]: A parsed Rust expression.
11//! - [`Pat`] and [`PatKind`]: A parsed Rust pattern. Patterns are often dual to expressions.
12//! - [`Stmt`] and [`StmtKind`]: An executable action that does not return a value.
13//! - [`FnDecl`], [`FnHeader`] and [`Param`]: Metadata associated with a function declaration.
14//! - [`Generics`], [`GenericParam`], [`WhereClause`]: Metadata associated with generic parameters.
15//! - [`EnumDef`] and [`Variant`]: Enum declaration.
16//! - [`MetaItemLit`] and [`LitKind`]: Literal expressions.
17//! - [`MacroDef`], [`MacStmtStyle`], [`MacCall`]: Macro definition and invocation.
18//! - [`Attribute`]: Metadata associated with item.
19//! - [`UnOp`], [`BinOp`], and [`BinOpKind`]: Unary and binary operators.
20
21use std::borrow::{Borrow, Cow};
22use std::{cmp, fmt};
23
24pub use GenericArgs::*;
25pub use UnsafeSource::*;
26pub use rustc_ast_ir::{FloatTy, IntTy, Movability, Mutability, Pinnedness, UintTy};
27use rustc_data_structures::packed::Pu128;
28use rustc_data_structures::stable_hash::{StableHash, StableHashCtxt, StableHasher};
29use rustc_data_structures::tagged_ptr::Tag;
30use rustc_macros::{Decodable, Encodable, StableHash, Walkable};
31pub use rustc_span::AttrId;
32use rustc_span::{
33    ByteSymbol, DUMMY_SP, ErrorGuaranteed, Ident, LocalExpnId, Span, Spanned, Symbol, kw, respan,
34    sym,
35};
36use thin_vec::{ThinVec, thin_vec};
37
38use crate::attr::data_structures::CfgEntry;
39pub use crate::format::*;
40use crate::token::{self, CommentKind, Delimiter};
41use crate::tokenstream::{DelimSpan, LazyAttrTokenStream, TokenStream};
42use crate::util::parser::{ExprPrecedence, Fixity};
43use crate::visit::{AssocCtxt, BoundKind, LifetimeCtxt};
44
45/// A "Label" is an identifier of some point in sources,
46/// e.g. in the following code:
47///
48/// ```rust
49/// 'outer: loop {
50///     break 'outer;
51/// }
52/// ```
53///
54/// `'outer` is a label.
55#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Label { }
#[automatically_derived]
impl ::core::clone::Clone for Label {
    #[inline]
    fn clone(&self) -> Label {
        let _: ::core::clone::AssertParamIsClone<Ident>;
        *self
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Label {
            fn encode(&self, __encoder: &mut __E) {
                let Label { ident: ref __binding_0 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Label {
            fn decode(__decoder: &mut __D) -> Self {
                Label {
                    ident: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::marker::Copy for Label { }Copy, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for Label {
            #[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 {
                    Label { ident: ref __binding_0 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, #[automatically_derived]
impl ::core::cmp::Eq for Label {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Ident>;
    }
}Eq, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for Label { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Label {
    #[inline]
    fn eq(&self, other: &Label) -> bool { self.ident == other.ident }
}PartialEq, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Label where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Label { ident: ref __binding_0 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Label where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Label { ident: ref mut __binding_0 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
56pub struct Label {
57    pub ident: Ident,
58}
59
60impl fmt::Debug for Label {
61    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
62        f.write_fmt(format_args!("label({0:?})", self.ident))write!(f, "label({:?})", self.ident)
63    }
64}
65
66/// A "Lifetime" is an annotation of the scope in which variable
67/// can be used, e.g. `'a` in `&'a i32`.
68#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Lifetime { }
#[automatically_derived]
impl ::core::clone::Clone for Lifetime {
    #[inline]
    fn clone(&self) -> Lifetime {
        let _: ::core::clone::AssertParamIsClone<NodeId>;
        let _: ::core::clone::AssertParamIsClone<Ident>;
        *self
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Lifetime {
            fn encode(&self, __encoder: &mut __E) {
                let Lifetime { id: ref __binding_0, ident: ref __binding_1 } =
                    *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Lifetime {
            fn decode(__decoder: &mut __D) -> Self {
                Lifetime {
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    ident: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::marker::Copy for Lifetime { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for Lifetime { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Lifetime {
    #[inline]
    fn eq(&self, other: &Lifetime) -> bool {
        self.id == other.id && self.ident == other.ident
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Lifetime {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<NodeId>;
        let _: ::core::cmp::AssertParamIsEq<Ident>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for Lifetime {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.id, state);
        ::core::hash::Hash::hash(&self.ident, state)
    }
}Hash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Lifetime
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Lifetime { id: ref __binding_0, ident: ref __binding_1 } =>
                        {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Lifetime where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Lifetime {
                        id: ref mut __binding_0, ident: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
69pub struct Lifetime {
70    pub id: NodeId,
71    pub ident: Ident,
72}
73
74impl fmt::Debug for Lifetime {
75    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
76        f.write_fmt(format_args!("lifetime({0}: {1})", self.id, self))write!(f, "lifetime({}: {})", self.id, self)
77    }
78}
79
80impl fmt::Display for Lifetime {
81    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
82        f.write_fmt(format_args!("{0}", self.ident.name))write!(f, "{}", self.ident.name)
83    }
84}
85
86/// A "Path" is essentially Rust's notion of a name.
87///
88/// It's represented as a sequence of identifiers,
89/// along with a bunch of supporting information.
90///
91/// E.g., `std::cmp::PartialEq`.
92#[derive(#[automatically_derived]
impl ::core::clone::Clone for Path {
    #[inline]
    fn clone(&self) -> Path {
        Path {
            span: ::core::clone::Clone::clone(&self.span),
            segments: ::core::clone::Clone::clone(&self.segments),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Path {
            fn encode(&self, __encoder: &mut __E) {
                let Path { span: ref __binding_0, segments: ref __binding_1
                        } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Path {
            fn decode(__decoder: &mut __D) -> Self {
                Path {
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    segments: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Path {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "Path", "span",
            &self.span, "segments", &&self.segments)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Path where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Path { span: ref __binding_0, segments: ref __binding_1 } =>
                        {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Path where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Path {
                        span: ref mut __binding_0, segments: ref mut __binding_1 }
                        => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
93pub struct Path {
94    pub span: Span,
95    /// The segments in the path: the things separated by `::`.
96    /// Global paths begin with `kw::PathRoot`.
97    pub segments: ThinVec<PathSegment>,
98}
99
100// Succeeds if the path has a single segment that is arg-free and matches the given symbol.
101impl PartialEq<Symbol> for Path {
102    #[inline]
103    fn eq(&self, name: &Symbol) -> bool {
104        if let [segment] = self.segments.as_ref()
105            && segment == name
106        {
107            true
108        } else {
109            false
110        }
111    }
112}
113
114// Succeeds if the path has segments that are arg-free and match the given symbols.
115impl PartialEq<&[Symbol]> for Path {
116    #[inline]
117    fn eq(&self, names: &&[Symbol]) -> bool {
118        self.segments.iter().eq(*names)
119    }
120}
121
122impl StableHash for Path {
123    fn stable_hash<Hcx: StableHashCtxt>(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
124        self.segments.len().stable_hash(hcx, hasher);
125        for segment in &self.segments {
126            segment.ident.stable_hash(hcx, hasher);
127        }
128    }
129}
130
131impl Path {
132    /// Convert a span and an identifier to the corresponding
133    /// one-segment path.
134    pub fn from_ident(ident: Ident) -> Path {
135        Path { segments: {
    let len = [()].len();
    let mut vec = ::thin_vec::ThinVec::with_capacity(len);
    vec.push(PathSegment::from_ident(ident));
    vec
}thin_vec![PathSegment::from_ident(ident)], span: ident.span }
136    }
137
138    pub fn is_global(&self) -> bool {
139        self.segments.first().is_some_and(|segment| segment.ident.name == kw::PathRoot)
140    }
141
142    /// Checks if this path is just a simple one-word `PATH` - i.e. the inverse of
143    /// [`Path::from_ident`]
144    pub fn is_single_argless_ident(&self) -> bool {
145        self.segments.len() == 1 && self.segments[0].args.is_none()
146    }
147
148    /// The inverse of [`Path::from_ident`] - if this path is just a simple one-word `PATH`
149    pub fn as_single_argless_ident(&self) -> Option<Ident> {
150        self.is_single_argless_ident().then(|| self.segments[0].ident)
151    }
152}
153
154/// Joins multiple symbols with "::" into a path, e.g. "a::b::c". If the first
155/// segment is `kw::PathRoot` it will be printed as empty, e.g. "::b::c".
156///
157/// The generics on the `path` argument mean it can accept many forms, such as:
158/// - `&[Symbol]`
159/// - `Vec<Symbol>`
160/// - `Vec<&Symbol>`
161/// - `impl Iterator<Item = Symbol>`
162/// - `impl Iterator<Item = &Symbol>`
163///
164/// Panics if `path` is empty or a segment after the first is `kw::PathRoot`.
165pub fn join_path_syms(path: impl IntoIterator<Item = impl Borrow<Symbol>>) -> String {
166    // This is a guess at the needed capacity that works well in practice. It is slightly faster
167    // than (a) starting with an empty string, or (b) computing the exact capacity required.
168    // `8` works well because it's about the right size and jemalloc's size classes are all
169    // multiples of 8.
170    let mut iter = path.into_iter();
171    let len_hint = iter.size_hint().1.unwrap_or(1);
172    let mut s = String::with_capacity(len_hint * 8);
173
174    let first_sym = *iter.next().unwrap().borrow();
175    if first_sym != kw::PathRoot {
176        s.push_str(first_sym.as_str());
177    }
178    for sym in iter {
179        let sym = *sym.borrow();
180        if true {
    {
        match (&sym, &kw::PathRoot) {
            (left_val, right_val) => {
                if *left_val == *right_val {
                    let kind = ::core::panicking::AssertKind::Ne;
                    ::core::panicking::assert_failed(kind, &*left_val,
                        &*right_val, ::core::option::Option::None);
                }
            }
        }
    };
};debug_assert_ne!(sym, kw::PathRoot);
181        s.push_str("::");
182        s.push_str(sym.as_str());
183    }
184    s
185}
186
187/// Like `join_path_syms`, but for `Ident`s. This function is necessary because
188/// `Ident::to_string` does more than just print the symbol in the `name` field.
189pub fn join_path_idents(path: impl IntoIterator<Item = impl Borrow<Ident>>) -> String {
190    let mut iter = path.into_iter();
191    let len_hint = iter.size_hint().1.unwrap_or(1);
192    let mut s = String::with_capacity(len_hint * 8);
193
194    let first_ident = *iter.next().unwrap().borrow();
195    if first_ident.name != kw::PathRoot {
196        s.push_str(&first_ident.to_string());
197    }
198    for ident in iter {
199        let ident = *ident.borrow();
200        if true {
    {
        match (&ident.name, &kw::PathRoot) {
            (left_val, right_val) => {
                if *left_val == *right_val {
                    let kind = ::core::panicking::AssertKind::Ne;
                    ::core::panicking::assert_failed(kind, &*left_val,
                        &*right_val, ::core::option::Option::None);
                }
            }
        }
    };
};debug_assert_ne!(ident.name, kw::PathRoot);
201        s.push_str("::");
202        s.push_str(&ident.to_string());
203    }
204    s
205}
206
207/// A segment of a path: an identifier, an optional lifetime, and a set of types.
208///
209/// E.g., `std`, `String` or `Box<T>`.
210#[derive(#[automatically_derived]
impl ::core::clone::Clone for PathSegment {
    #[inline]
    fn clone(&self) -> PathSegment {
        PathSegment {
            ident: ::core::clone::Clone::clone(&self.ident),
            id: ::core::clone::Clone::clone(&self.id),
            args: ::core::clone::Clone::clone(&self.args),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for PathSegment {
            fn encode(&self, __encoder: &mut __E) {
                let PathSegment {
                        ident: ref __binding_0,
                        id: ref __binding_1,
                        args: 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);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for PathSegment {
            fn decode(__decoder: &mut __D) -> Self {
                PathSegment {
                    ident: ::rustc_serialize::Decodable::decode(__decoder),
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    args: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for PathSegment {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "PathSegment",
            "ident", &self.ident, "id", &self.id, "args", &&self.args)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for PathSegment
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    PathSegment {
                        ident: ref __binding_0,
                        id: ref __binding_1,
                        args: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for PathSegment where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    PathSegment {
                        ident: ref mut __binding_0,
                        id: ref mut __binding_1,
                        args: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
211pub struct PathSegment {
212    /// The identifier portion of this path segment.
213    pub ident: Ident,
214
215    pub id: NodeId,
216
217    /// Type/lifetime parameters attached to this path. They come in
218    /// two flavors: `Path<A,B,C>` and `Path(A,B) -> C`.
219    /// `None` means that no parameter list is supplied (`Path`),
220    /// `Some` means that parameter list is supplied (`Path<X, Y>`)
221    /// but it can be empty (`Path<>`).
222    /// `Box` is used as a size optimization for the common case with no parameters.
223    pub args: Option<Box<GenericArgs>>,
224}
225
226// Succeeds if the path segment is arg-free and matches the given symbol.
227impl PartialEq<Symbol> for PathSegment {
228    #[inline]
229    fn eq(&self, name: &Symbol) -> bool {
230        self.args.is_none() && self.ident.name == *name
231    }
232}
233
234impl PathSegment {
235    pub fn from_ident(ident: Ident) -> Self {
236        PathSegment { ident, id: DUMMY_NODE_ID, args: None }
237    }
238
239    pub fn path_root(span: Span) -> Self {
240        PathSegment::from_ident(Ident::new(kw::PathRoot, span))
241    }
242
243    pub fn span(&self) -> Span {
244        match &self.args {
245            Some(args) => self.ident.span.to(args.span()),
246            None => self.ident.span,
247        }
248    }
249}
250
251/// The generic arguments and associated item constraints of a path segment.
252///
253/// E.g., `<A, B>` as in `Foo<A, B>` or `(A, B)` as in `Foo(A, B)`.
254#[derive(#[automatically_derived]
impl ::core::clone::Clone for GenericArgs {
    #[inline]
    fn clone(&self) -> GenericArgs {
        match self {
            GenericArgs::AngleBracketed(__self_0) =>
                GenericArgs::AngleBracketed(::core::clone::Clone::clone(__self_0)),
            GenericArgs::Parenthesized(__self_0) =>
                GenericArgs::Parenthesized(::core::clone::Clone::clone(__self_0)),
            GenericArgs::ParenthesizedElided(__self_0) =>
                GenericArgs::ParenthesizedElided(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for GenericArgs {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        GenericArgs::AngleBracketed(ref __binding_0) => { 0usize }
                        GenericArgs::Parenthesized(ref __binding_0) => { 1usize }
                        GenericArgs::ParenthesizedElided(ref __binding_0) => {
                            2usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    GenericArgs::AngleBracketed(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    GenericArgs::Parenthesized(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    GenericArgs::ParenthesizedElided(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for GenericArgs {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        GenericArgs::AngleBracketed(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        GenericArgs::Parenthesized(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        GenericArgs::ParenthesizedElided(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `GenericArgs`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for GenericArgs {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            GenericArgs::AngleBracketed(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "AngleBracketed", &__self_0),
            GenericArgs::Parenthesized(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Parenthesized", &__self_0),
            GenericArgs::ParenthesizedElided(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ParenthesizedElided", &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for GenericArgs
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    GenericArgs::AngleBracketed(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    GenericArgs::Parenthesized(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    GenericArgs::ParenthesizedElided(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for GenericArgs where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    GenericArgs::AngleBracketed(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    GenericArgs::Parenthesized(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    GenericArgs::ParenthesizedElided(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
255pub enum GenericArgs {
256    /// The `<'a, A, B, C>` in `foo::bar::baz::<'a, A, B, C>`.
257    AngleBracketed(AngleBracketedArgs),
258    /// The `(A, B)` and `C` in `Foo(A, B) -> C`.
259    Parenthesized(ParenthesizedArgs),
260    /// `(..)` in return type notation.
261    ParenthesizedElided(Span),
262}
263
264impl GenericArgs {
265    pub fn is_angle_bracketed(&self) -> bool {
266        #[allow(non_exhaustive_omitted_patterns)] match self {
    AngleBracketed(..) => true,
    _ => false,
}matches!(self, AngleBracketed(..))
267    }
268
269    pub fn span(&self) -> Span {
270        match self {
271            AngleBracketed(data) => data.span,
272            Parenthesized(data) => data.span,
273            ParenthesizedElided(span) => *span,
274        }
275    }
276}
277
278/// Concrete argument in the sequence of generic args.
279#[derive(#[automatically_derived]
impl ::core::clone::Clone for GenericArg {
    #[inline]
    fn clone(&self) -> GenericArg {
        match self {
            GenericArg::Lifetime(__self_0) =>
                GenericArg::Lifetime(::core::clone::Clone::clone(__self_0)),
            GenericArg::Type(__self_0) =>
                GenericArg::Type(::core::clone::Clone::clone(__self_0)),
            GenericArg::Const(__self_0) =>
                GenericArg::Const(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for GenericArg {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        GenericArg::Lifetime(ref __binding_0) => { 0usize }
                        GenericArg::Type(ref __binding_0) => { 1usize }
                        GenericArg::Const(ref __binding_0) => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    GenericArg::Lifetime(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    GenericArg::Type(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    GenericArg::Const(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for GenericArg {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        GenericArg::Lifetime(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        GenericArg::Type(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        GenericArg::Const(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `GenericArg`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for GenericArg {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            GenericArg::Lifetime(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Lifetime", &__self_0),
            GenericArg::Type(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Type",
                    &__self_0),
            GenericArg::Const(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Const",
                    &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for GenericArg
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    GenericArg::Lifetime(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, (LifetimeCtxt::GenericArg))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    GenericArg::Type(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    GenericArg::Const(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for GenericArg where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    GenericArg::Lifetime(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, (LifetimeCtxt::GenericArg))
                        }
                    }
                    GenericArg::Type(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    GenericArg::Const(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
280pub enum GenericArg {
281    /// `'a` in `Foo<'a>`.
282    Lifetime(#[visitable(extra = LifetimeCtxt::GenericArg)] Lifetime),
283    /// `Bar` in `Foo<Bar>`.
284    Type(Box<Ty>),
285    /// `1` in `Foo<1>`.
286    Const(AnonConst),
287}
288
289impl GenericArg {
290    pub fn span(&self) -> Span {
291        match self {
292            GenericArg::Lifetime(lt) => lt.ident.span,
293            GenericArg::Type(ty) => ty.span,
294            GenericArg::Const(ct) => ct.value.span,
295        }
296    }
297}
298
299/// A path like `Foo<'a, T>`.
300#[derive(#[automatically_derived]
impl ::core::clone::Clone for AngleBracketedArgs {
    #[inline]
    fn clone(&self) -> AngleBracketedArgs {
        AngleBracketedArgs {
            span: ::core::clone::Clone::clone(&self.span),
            args: ::core::clone::Clone::clone(&self.args),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for AngleBracketedArgs {
            fn encode(&self, __encoder: &mut __E) {
                let AngleBracketedArgs {
                        span: ref __binding_0, args: ref __binding_1 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for AngleBracketedArgs {
            fn decode(__decoder: &mut __D) -> Self {
                AngleBracketedArgs {
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    args: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for AngleBracketedArgs {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "AngleBracketedArgs", "span", &self.span, "args", &&self.args)
    }
}Debug, #[automatically_derived]
impl ::core::default::Default for AngleBracketedArgs {
    #[inline]
    fn default() -> AngleBracketedArgs {
        AngleBracketedArgs {
            span: ::core::default::Default::default(),
            args: ::core::default::Default::default(),
        }
    }
}Default, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            AngleBracketedArgs where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    AngleBracketedArgs {
                        span: ref __binding_0, args: ref __binding_1 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for AngleBracketedArgs
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    AngleBracketedArgs {
                        span: ref mut __binding_0, args: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
301pub struct AngleBracketedArgs {
302    /// The overall span.
303    pub span: Span,
304    /// The comma separated parts in the `<...>`.
305    pub args: ThinVec<AngleBracketedArg>,
306}
307
308/// Either an argument for a generic parameter or a constraint on an associated item.
309#[derive(#[automatically_derived]
impl ::core::clone::Clone for AngleBracketedArg {
    #[inline]
    fn clone(&self) -> AngleBracketedArg {
        match self {
            AngleBracketedArg::Arg(__self_0) =>
                AngleBracketedArg::Arg(::core::clone::Clone::clone(__self_0)),
            AngleBracketedArg::Constraint(__self_0) =>
                AngleBracketedArg::Constraint(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for AngleBracketedArg {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        AngleBracketedArg::Arg(ref __binding_0) => { 0usize }
                        AngleBracketedArg::Constraint(ref __binding_0) => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    AngleBracketedArg::Arg(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AngleBracketedArg::Constraint(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for AngleBracketedArg {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        AngleBracketedArg::Arg(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        AngleBracketedArg::Constraint(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `AngleBracketedArg`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for AngleBracketedArg {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            AngleBracketedArg::Arg(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Arg",
                    &__self_0),
            AngleBracketedArg::Constraint(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Constraint", &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            AngleBracketedArg where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    AngleBracketedArg::Arg(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    AngleBracketedArg::Constraint(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for AngleBracketedArg
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    AngleBracketedArg::Arg(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    AngleBracketedArg::Constraint(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
310pub enum AngleBracketedArg {
311    /// A generic argument for a generic parameter.
312    Arg(GenericArg),
313    /// A constraint on an associated item.
314    Constraint(AssocItemConstraint),
315}
316
317impl AngleBracketedArg {
318    pub fn span(&self) -> Span {
319        match self {
320            AngleBracketedArg::Arg(arg) => arg.span(),
321            AngleBracketedArg::Constraint(constraint) => constraint.span,
322        }
323    }
324}
325
326impl From<AngleBracketedArgs> for Box<GenericArgs> {
327    fn from(val: AngleBracketedArgs) -> Self {
328        Box::new(GenericArgs::AngleBracketed(val))
329    }
330}
331
332impl From<ParenthesizedArgs> for Box<GenericArgs> {
333    fn from(val: ParenthesizedArgs) -> Self {
334        Box::new(GenericArgs::Parenthesized(val))
335    }
336}
337
338/// A path like `Foo(A, B) -> C`.
339#[derive(#[automatically_derived]
impl ::core::clone::Clone for ParenthesizedArgs {
    #[inline]
    fn clone(&self) -> ParenthesizedArgs {
        ParenthesizedArgs {
            span: ::core::clone::Clone::clone(&self.span),
            inputs: ::core::clone::Clone::clone(&self.inputs),
            inputs_span: ::core::clone::Clone::clone(&self.inputs_span),
            output: ::core::clone::Clone::clone(&self.output),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ParenthesizedArgs {
            fn encode(&self, __encoder: &mut __E) {
                let ParenthesizedArgs {
                        span: ref __binding_0,
                        inputs: ref __binding_1,
                        inputs_span: ref __binding_2,
                        output: ref __binding_3 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ParenthesizedArgs {
            fn decode(__decoder: &mut __D) -> Self {
                ParenthesizedArgs {
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    inputs: ::rustc_serialize::Decodable::decode(__decoder),
                    inputs_span: ::rustc_serialize::Decodable::decode(__decoder),
                    output: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ParenthesizedArgs {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f,
            "ParenthesizedArgs", "span", &self.span, "inputs", &self.inputs,
            "inputs_span", &self.inputs_span, "output", &&self.output)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            ParenthesizedArgs where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    ParenthesizedArgs {
                        span: ref __binding_0,
                        inputs: ref __binding_1,
                        inputs_span: ref __binding_2,
                        output: ref __binding_3 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for ParenthesizedArgs
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    ParenthesizedArgs {
                        span: ref mut __binding_0,
                        inputs: ref mut __binding_1,
                        inputs_span: ref mut __binding_2,
                        output: ref mut __binding_3 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
340pub struct ParenthesizedArgs {
341    /// ```text
342    /// Foo(A, B) -> C
343    /// ^^^^^^^^^^^^^^
344    /// ```
345    pub span: Span,
346
347    /// `(A, B)`
348    pub inputs: ThinVec<Param>,
349
350    /// ```text
351    /// Foo(A, B) -> C
352    ///    ^^^^^^
353    /// ```
354    pub inputs_span: Span,
355
356    /// `C`
357    pub output: FnRetTy,
358}
359
360impl ParenthesizedArgs {
361    pub fn as_angle_bracketed_args(&self) -> AngleBracketedArgs {
362        let args = self
363            .inputs
364            .iter()
365            .cloned()
366            .map(|input| AngleBracketedArg::Arg(GenericArg::Type(input.ty)))
367            .collect();
368        AngleBracketedArgs { span: self.inputs_span, args }
369    }
370}
371
372pub use crate::node_id::{CRATE_NODE_ID, DUMMY_NODE_ID, NodeId};
373
374/// Modifiers on a trait bound like `[const]`, `?` and `!`.
375#[derive(#[automatically_derived]
impl ::core::marker::Copy for TraitBoundModifiers { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for TraitBoundModifiers { }
#[automatically_derived]
impl ::core::clone::Clone for TraitBoundModifiers {
    #[inline]
    fn clone(&self) -> TraitBoundModifiers {
        let _: ::core::clone::AssertParamIsClone<BoundConstness>;
        let _: ::core::clone::AssertParamIsClone<BoundAsyncness>;
        let _: ::core::clone::AssertParamIsClone<BoundPolarity>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for TraitBoundModifiers { }
#[automatically_derived]
impl ::core::cmp::PartialEq for TraitBoundModifiers {
    #[inline]
    fn eq(&self, other: &TraitBoundModifiers) -> bool {
        self.constness == other.constness && self.asyncness == other.asyncness
            && self.polarity == other.polarity
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for TraitBoundModifiers {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<BoundConstness>;
        let _: ::core::cmp::AssertParamIsEq<BoundAsyncness>;
        let _: ::core::cmp::AssertParamIsEq<BoundPolarity>;
    }
}Eq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for TraitBoundModifiers {
            fn encode(&self, __encoder: &mut __E) {
                let TraitBoundModifiers {
                        constness: ref __binding_0,
                        asyncness: ref __binding_1,
                        polarity: 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);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for TraitBoundModifiers {
            fn decode(__decoder: &mut __D) -> Self {
                TraitBoundModifiers {
                    constness: ::rustc_serialize::Decodable::decode(__decoder),
                    asyncness: ::rustc_serialize::Decodable::decode(__decoder),
                    polarity: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for TraitBoundModifiers {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f,
            "TraitBoundModifiers", "constness", &self.constness, "asyncness",
            &self.asyncness, "polarity", &&self.polarity)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            TraitBoundModifiers where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    TraitBoundModifiers {
                        constness: ref __binding_0,
                        asyncness: ref __binding_1,
                        polarity: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for TraitBoundModifiers
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    TraitBoundModifiers {
                        constness: ref mut __binding_0,
                        asyncness: ref mut __binding_1,
                        polarity: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
376pub struct TraitBoundModifiers {
377    pub constness: BoundConstness,
378    pub asyncness: BoundAsyncness,
379    pub polarity: BoundPolarity,
380}
381
382impl TraitBoundModifiers {
383    pub const NONE: Self = Self {
384        constness: BoundConstness::Never,
385        asyncness: BoundAsyncness::Normal,
386        polarity: BoundPolarity::Positive,
387    };
388}
389
390#[derive(#[automatically_derived]
impl ::core::clone::Clone for GenericBound {
    #[inline]
    fn clone(&self) -> GenericBound {
        match self {
            GenericBound::Trait(__self_0) =>
                GenericBound::Trait(::core::clone::Clone::clone(__self_0)),
            GenericBound::Outlives(__self_0) =>
                GenericBound::Outlives(::core::clone::Clone::clone(__self_0)),
            GenericBound::Use(__self_0, __self_1) =>
                GenericBound::Use(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for GenericBound {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        GenericBound::Trait(ref __binding_0) => { 0usize }
                        GenericBound::Outlives(ref __binding_0) => { 1usize }
                        GenericBound::Use(ref __binding_0, ref __binding_1) => {
                            2usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    GenericBound::Trait(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    GenericBound::Outlives(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    GenericBound::Use(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for GenericBound {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        GenericBound::Trait(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        GenericBound::Outlives(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        GenericBound::Use(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `GenericBound`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for GenericBound {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            GenericBound::Trait(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Trait",
                    &__self_0),
            GenericBound::Outlives(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Outlives", &__self_0),
            GenericBound::Use(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Use",
                    __self_0, &__self_1),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for GenericBound
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    GenericBound::Trait(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    GenericBound::Outlives(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, (LifetimeCtxt::Bound))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    GenericBound::Use(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for GenericBound where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    GenericBound::Trait(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    GenericBound::Outlives(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, (LifetimeCtxt::Bound))
                        }
                    }
                    GenericBound::Use(ref mut __binding_0, ref mut __binding_1)
                        => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
391pub enum GenericBound {
392    Trait(PolyTraitRef),
393    Outlives(#[visitable(extra = LifetimeCtxt::Bound)] Lifetime),
394    /// Precise capturing syntax: `impl Sized + use<'a>`
395    Use(ThinVec<PreciseCapturingArg>, Span),
396}
397
398impl GenericBound {
399    pub fn span(&self) -> Span {
400        match self {
401            GenericBound::Trait(t, ..) => t.span,
402            GenericBound::Outlives(l) => l.ident.span,
403            GenericBound::Use(_, span) => *span,
404        }
405    }
406}
407
408pub type GenericBounds = ThinVec<GenericBound>;
409
410/// Specifies the enforced ordering for generic parameters. In the future,
411/// if we wanted to relax this order, we could override `PartialEq` and
412/// `PartialOrd`, to allow the kinds to be unordered.
413#[derive(#[automatically_derived]
impl ::core::hash::Hash for ParamKindOrd {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state)
    }
}Hash, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for ParamKindOrd { }
#[automatically_derived]
impl ::core::clone::Clone for ParamKindOrd {
    #[inline]
    fn clone(&self) -> ParamKindOrd { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for ParamKindOrd { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for ParamKindOrd { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ParamKindOrd {
    #[inline]
    fn eq(&self, other: &ParamKindOrd) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ParamKindOrd {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for ParamKindOrd {
    #[inline]
    fn partial_cmp(&self, other: &ParamKindOrd)
        -> ::core::option::Option<::core::cmp::Ordering> {
        ::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
    }
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for ParamKindOrd {
    #[inline]
    fn cmp(&self, other: &ParamKindOrd) -> ::core::cmp::Ordering {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        ::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
    }
}Ord)]
414pub enum ParamKindOrd {
415    Lifetime,
416    TypeOrConst,
417}
418
419impl fmt::Display for ParamKindOrd {
420    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
421        match self {
422            ParamKindOrd::Lifetime => "lifetime".fmt(f),
423            ParamKindOrd::TypeOrConst => "type and const".fmt(f),
424        }
425    }
426}
427
428#[derive(#[automatically_derived]
impl ::core::clone::Clone for GenericParamKind {
    #[inline]
    fn clone(&self) -> GenericParamKind {
        match self {
            GenericParamKind::Lifetime => GenericParamKind::Lifetime,
            GenericParamKind::Type { default: __self_0 } =>
                GenericParamKind::Type {
                    default: ::core::clone::Clone::clone(__self_0),
                },
            GenericParamKind::Const {
                ty: __self_0, span: __self_1, default: __self_2 } =>
                GenericParamKind::Const {
                    ty: ::core::clone::Clone::clone(__self_0),
                    span: ::core::clone::Clone::clone(__self_1),
                    default: ::core::clone::Clone::clone(__self_2),
                },
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for GenericParamKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        GenericParamKind::Lifetime => { 0usize }
                        GenericParamKind::Type { default: ref __binding_0 } => {
                            1usize
                        }
                        GenericParamKind::Const {
                            ty: ref __binding_0,
                            span: ref __binding_1,
                            default: ref __binding_2 } => {
                            2usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    GenericParamKind::Lifetime => {}
                    GenericParamKind::Type { default: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    GenericParamKind::Const {
                        ty: ref __binding_0,
                        span: ref __binding_1,
                        default: 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);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for GenericParamKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { GenericParamKind::Lifetime }
                    1usize => {
                        GenericParamKind::Type {
                            default: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    2usize => {
                        GenericParamKind::Const {
                            ty: ::rustc_serialize::Decodable::decode(__decoder),
                            span: ::rustc_serialize::Decodable::decode(__decoder),
                            default: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `GenericParamKind`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for GenericParamKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            GenericParamKind::Lifetime =>
                ::core::fmt::Formatter::write_str(f, "Lifetime"),
            GenericParamKind::Type { default: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Type",
                    "default", &__self_0),
            GenericParamKind::Const {
                ty: __self_0, span: __self_1, default: __self_2 } =>
                ::core::fmt::Formatter::debug_struct_field3_finish(f, "Const",
                    "ty", __self_0, "span", __self_1, "default", &__self_2),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            GenericParamKind where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    GenericParamKind::Lifetime => {}
                    GenericParamKind::Type { default: ref __binding_0 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    GenericParamKind::Const {
                        ty: ref __binding_0,
                        span: ref __binding_1,
                        default: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for GenericParamKind
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    GenericParamKind::Lifetime => {}
                    GenericParamKind::Type { default: ref mut __binding_0 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    GenericParamKind::Const {
                        ty: ref mut __binding_0,
                        span: ref mut __binding_1,
                        default: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
429pub enum GenericParamKind {
430    /// A lifetime definition (e.g., `'a: 'b + 'c + 'd`).
431    Lifetime,
432    Type {
433        default: Option<Box<Ty>>,
434    },
435    Const {
436        ty: Box<Ty>,
437        /// Span of the whole parameter definition, including default.
438        span: Span,
439        /// Optional default value for the const generic param.
440        default: Option<AnonConst>,
441    },
442}
443
444#[derive(#[automatically_derived]
impl ::core::clone::Clone for GenericParam {
    #[inline]
    fn clone(&self) -> GenericParam {
        GenericParam {
            id: ::core::clone::Clone::clone(&self.id),
            ident: ::core::clone::Clone::clone(&self.ident),
            attrs: ::core::clone::Clone::clone(&self.attrs),
            bounds: ::core::clone::Clone::clone(&self.bounds),
            is_placeholder: ::core::clone::Clone::clone(&self.is_placeholder),
            kind: ::core::clone::Clone::clone(&self.kind),
            colon_span: ::core::clone::Clone::clone(&self.colon_span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for GenericParam {
            fn encode(&self, __encoder: &mut __E) {
                let GenericParam {
                        id: ref __binding_0,
                        ident: ref __binding_1,
                        attrs: ref __binding_2,
                        bounds: ref __binding_3,
                        is_placeholder: ref __binding_4,
                        kind: ref __binding_5,
                        colon_span: ref __binding_6 } = *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);
                ::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);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for GenericParam {
            fn decode(__decoder: &mut __D) -> Self {
                GenericParam {
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    ident: ::rustc_serialize::Decodable::decode(__decoder),
                    attrs: ::rustc_serialize::Decodable::decode(__decoder),
                    bounds: ::rustc_serialize::Decodable::decode(__decoder),
                    is_placeholder: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    colon_span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for GenericParam {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["id", "ident", "attrs", "bounds", "is_placeholder", "kind",
                        "colon_span"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.id, &self.ident, &self.attrs, &self.bounds,
                        &self.is_placeholder, &self.kind, &&self.colon_span];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "GenericParam",
            names, values)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for GenericParam
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    GenericParam {
                        id: ref __binding_0,
                        ident: ref __binding_1,
                        attrs: ref __binding_2,
                        bounds: ref __binding_3,
                        is_placeholder: ref __binding_4,
                        kind: ref __binding_5,
                        colon_span: ref __binding_6 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, (BoundKind::Bound))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_5,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_6,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for GenericParam where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    GenericParam {
                        id: ref mut __binding_0,
                        ident: ref mut __binding_1,
                        attrs: ref mut __binding_2,
                        bounds: ref mut __binding_3,
                        is_placeholder: ref mut __binding_4,
                        kind: ref mut __binding_5,
                        colon_span: ref mut __binding_6 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, (BoundKind::Bound))
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_5,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_6,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
445pub struct GenericParam {
446    pub id: NodeId,
447    pub ident: Ident,
448    pub attrs: AttrVec,
449    #[visitable(extra = BoundKind::Bound)]
450    pub bounds: GenericBounds,
451    pub is_placeholder: bool,
452    pub kind: GenericParamKind,
453    pub colon_span: Option<Span>,
454}
455
456impl GenericParam {
457    pub fn span(&self) -> Span {
458        match &self.kind {
459            GenericParamKind::Lifetime | GenericParamKind::Type { default: None } => {
460                self.ident.span
461            }
462            GenericParamKind::Type { default: Some(ty) } => self.ident.span.to(ty.span),
463            GenericParamKind::Const { span, .. } => *span,
464        }
465    }
466}
467
468/// Represents lifetime, type and const parameters attached to a declaration of
469/// a function, enum, trait, etc.
470#[derive(#[automatically_derived]
impl ::core::clone::Clone for Generics {
    #[inline]
    fn clone(&self) -> Generics {
        Generics {
            params: ::core::clone::Clone::clone(&self.params),
            where_clause: ::core::clone::Clone::clone(&self.where_clause),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Generics {
            fn encode(&self, __encoder: &mut __E) {
                let Generics {
                        params: ref __binding_0,
                        where_clause: ref __binding_1,
                        span: 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);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Generics {
            fn decode(__decoder: &mut __D) -> Self {
                Generics {
                    params: ::rustc_serialize::Decodable::decode(__decoder),
                    where_clause: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Generics {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "Generics",
            "params", &self.params, "where_clause", &self.where_clause,
            "span", &&self.span)
    }
}Debug, #[automatically_derived]
impl ::core::default::Default for Generics {
    #[inline]
    fn default() -> Generics {
        Generics {
            params: ::core::default::Default::default(),
            where_clause: ::core::default::Default::default(),
            span: ::core::default::Default::default(),
        }
    }
}Default, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Generics
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Generics {
                        params: ref __binding_0,
                        where_clause: ref __binding_1,
                        span: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Generics where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Generics {
                        params: ref mut __binding_0,
                        where_clause: ref mut __binding_1,
                        span: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
471pub struct Generics {
472    pub params: ThinVec<GenericParam>,
473    pub where_clause: WhereClause,
474    pub span: Span,
475}
476
477/// A where-clause in a definition.
478#[derive(#[automatically_derived]
impl ::core::clone::Clone for WhereClause {
    #[inline]
    fn clone(&self) -> WhereClause {
        WhereClause {
            has_where_token: ::core::clone::Clone::clone(&self.has_where_token),
            predicates: ::core::clone::Clone::clone(&self.predicates),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for WhereClause {
            fn encode(&self, __encoder: &mut __E) {
                let WhereClause {
                        has_where_token: ref __binding_0,
                        predicates: ref __binding_1,
                        span: 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);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for WhereClause {
            fn decode(__decoder: &mut __D) -> Self {
                WhereClause {
                    has_where_token: ::rustc_serialize::Decodable::decode(__decoder),
                    predicates: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for WhereClause {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "WhereClause",
            "has_where_token", &self.has_where_token, "predicates",
            &self.predicates, "span", &&self.span)
    }
}Debug, #[automatically_derived]
impl ::core::default::Default for WhereClause {
    #[inline]
    fn default() -> WhereClause {
        WhereClause {
            has_where_token: ::core::default::Default::default(),
            predicates: ::core::default::Default::default(),
            span: ::core::default::Default::default(),
        }
    }
}Default, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for WhereClause
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    WhereClause {
                        has_where_token: ref __binding_0,
                        predicates: ref __binding_1,
                        span: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for WhereClause where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    WhereClause {
                        has_where_token: ref mut __binding_0,
                        predicates: ref mut __binding_1,
                        span: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
479pub struct WhereClause {
480    /// `true` if we ate a `where` token.
481    ///
482    /// This can happen if we parsed no predicates, e.g., `struct Foo where {}`.
483    /// This allows us to pretty-print accurately and provide correct suggestion diagnostics.
484    pub has_where_token: bool,
485    pub predicates: ThinVec<WherePredicate>,
486    pub span: Span,
487}
488
489impl WhereClause {
490    pub fn is_empty(&self) -> bool {
491        !self.has_where_token && self.predicates.is_empty()
492    }
493}
494
495/// A single predicate in a where-clause.
496#[derive(#[automatically_derived]
impl ::core::clone::Clone for WherePredicate {
    #[inline]
    fn clone(&self) -> WherePredicate {
        WherePredicate {
            attrs: ::core::clone::Clone::clone(&self.attrs),
            kind: ::core::clone::Clone::clone(&self.kind),
            id: ::core::clone::Clone::clone(&self.id),
            span: ::core::clone::Clone::clone(&self.span),
            is_placeholder: ::core::clone::Clone::clone(&self.is_placeholder),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for WherePredicate {
            fn encode(&self, __encoder: &mut __E) {
                let WherePredicate {
                        attrs: ref __binding_0,
                        kind: ref __binding_1,
                        id: ref __binding_2,
                        span: ref __binding_3,
                        is_placeholder: ref __binding_4 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for WherePredicate {
            fn decode(__decoder: &mut __D) -> Self {
                WherePredicate {
                    attrs: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    is_placeholder: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for WherePredicate {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f,
            "WherePredicate", "attrs", &self.attrs, "kind", &self.kind, "id",
            &self.id, "span", &self.span, "is_placeholder",
            &&self.is_placeholder)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            WherePredicate where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    WherePredicate {
                        attrs: ref __binding_0,
                        kind: ref __binding_1,
                        id: ref __binding_2,
                        span: ref __binding_3,
                        is_placeholder: ref __binding_4 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for WherePredicate where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    WherePredicate {
                        attrs: ref mut __binding_0,
                        kind: ref mut __binding_1,
                        id: ref mut __binding_2,
                        span: ref mut __binding_3,
                        is_placeholder: ref mut __binding_4 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
497pub struct WherePredicate {
498    pub attrs: AttrVec,
499    pub kind: WherePredicateKind,
500    pub id: NodeId,
501    pub span: Span,
502    pub is_placeholder: bool,
503}
504
505/// Predicate kind in where-clause.
506#[derive(#[automatically_derived]
impl ::core::clone::Clone for WherePredicateKind {
    #[inline]
    fn clone(&self) -> WherePredicateKind {
        match self {
            WherePredicateKind::BoundPredicate(__self_0) =>
                WherePredicateKind::BoundPredicate(::core::clone::Clone::clone(__self_0)),
            WherePredicateKind::RegionPredicate(__self_0) =>
                WherePredicateKind::RegionPredicate(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for WherePredicateKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        WherePredicateKind::BoundPredicate(ref __binding_0) => {
                            0usize
                        }
                        WherePredicateKind::RegionPredicate(ref __binding_0) => {
                            1usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    WherePredicateKind::BoundPredicate(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    WherePredicateKind::RegionPredicate(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for WherePredicateKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        WherePredicateKind::BoundPredicate(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        WherePredicateKind::RegionPredicate(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `WherePredicateKind`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for WherePredicateKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            WherePredicateKind::BoundPredicate(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "BoundPredicate", &__self_0),
            WherePredicateKind::RegionPredicate(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "RegionPredicate", &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            WherePredicateKind where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    WherePredicateKind::BoundPredicate(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    WherePredicateKind::RegionPredicate(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for WherePredicateKind
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    WherePredicateKind::BoundPredicate(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    WherePredicateKind::RegionPredicate(ref mut __binding_0) =>
                        {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
507pub enum WherePredicateKind {
508    /// A type bound (e.g., `for<'c> Foo: Send + Clone + 'c`).
509    BoundPredicate(WhereBoundPredicate),
510    /// A lifetime predicate (e.g., `'a: 'b + 'c`).
511    RegionPredicate(WhereRegionPredicate),
512}
513
514/// A type bound.
515///
516/// E.g., `for<'c> Foo: Send + Clone + 'c`.
517#[derive(#[automatically_derived]
impl ::core::clone::Clone for WhereBoundPredicate {
    #[inline]
    fn clone(&self) -> WhereBoundPredicate {
        WhereBoundPredicate {
            bound_generic_params: ::core::clone::Clone::clone(&self.bound_generic_params),
            bounded_ty: ::core::clone::Clone::clone(&self.bounded_ty),
            bounds: ::core::clone::Clone::clone(&self.bounds),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for WhereBoundPredicate {
            fn encode(&self, __encoder: &mut __E) {
                let WhereBoundPredicate {
                        bound_generic_params: ref __binding_0,
                        bounded_ty: ref __binding_1,
                        bounds: 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);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for WhereBoundPredicate {
            fn decode(__decoder: &mut __D) -> Self {
                WhereBoundPredicate {
                    bound_generic_params: ::rustc_serialize::Decodable::decode(__decoder),
                    bounded_ty: ::rustc_serialize::Decodable::decode(__decoder),
                    bounds: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for WhereBoundPredicate {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f,
            "WhereBoundPredicate", "bound_generic_params",
            &self.bound_generic_params, "bounded_ty", &self.bounded_ty,
            "bounds", &&self.bounds)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            WhereBoundPredicate where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    WhereBoundPredicate {
                        bound_generic_params: ref __binding_0,
                        bounded_ty: ref __binding_1,
                        bounds: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, (BoundKind::Bound))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for WhereBoundPredicate
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    WhereBoundPredicate {
                        bound_generic_params: ref mut __binding_0,
                        bounded_ty: ref mut __binding_1,
                        bounds: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, (BoundKind::Bound))
                        }
                    }
                }
            }
        }
    };Walkable)]
518pub struct WhereBoundPredicate {
519    /// Any generics from a `for` binding.
520    pub bound_generic_params: ThinVec<GenericParam>,
521    /// The type being bounded.
522    pub bounded_ty: Box<Ty>,
523    /// Trait and lifetime bounds (`Clone + Send + 'static`).
524    #[visitable(extra = BoundKind::Bound)]
525    pub bounds: GenericBounds,
526}
527
528/// A lifetime predicate.
529///
530/// E.g., `'a: 'b + 'c`.
531#[derive(#[automatically_derived]
impl ::core::clone::Clone for WhereRegionPredicate {
    #[inline]
    fn clone(&self) -> WhereRegionPredicate {
        WhereRegionPredicate {
            lifetime: ::core::clone::Clone::clone(&self.lifetime),
            bounds: ::core::clone::Clone::clone(&self.bounds),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for WhereRegionPredicate {
            fn encode(&self, __encoder: &mut __E) {
                let WhereRegionPredicate {
                        lifetime: ref __binding_0, bounds: ref __binding_1 } =
                    *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for WhereRegionPredicate {
            fn decode(__decoder: &mut __D) -> Self {
                WhereRegionPredicate {
                    lifetime: ::rustc_serialize::Decodable::decode(__decoder),
                    bounds: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for WhereRegionPredicate {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "WhereRegionPredicate", "lifetime", &self.lifetime, "bounds",
            &&self.bounds)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            WhereRegionPredicate where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    WhereRegionPredicate {
                        lifetime: ref __binding_0, bounds: ref __binding_1 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, (LifetimeCtxt::Bound))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, (BoundKind::Bound))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for WhereRegionPredicate
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    WhereRegionPredicate {
                        lifetime: ref mut __binding_0, bounds: ref mut __binding_1 }
                        => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, (LifetimeCtxt::Bound))
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, (BoundKind::Bound))
                        }
                    }
                }
            }
        }
    };Walkable)]
532pub struct WhereRegionPredicate {
533    #[visitable(extra = LifetimeCtxt::Bound)]
534    pub lifetime: Lifetime,
535    #[visitable(extra = BoundKind::Bound)]
536    pub bounds: GenericBounds,
537}
538
539/// An equality predicate (unsupported).
540///
541/// E.g., `T = int`.
542#[derive(#[automatically_derived]
impl ::core::clone::Clone for WhereEqPredicate {
    #[inline]
    fn clone(&self) -> WhereEqPredicate {
        WhereEqPredicate {
            lhs_ty: ::core::clone::Clone::clone(&self.lhs_ty),
            rhs_ty: ::core::clone::Clone::clone(&self.rhs_ty),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for WhereEqPredicate {
            fn encode(&self, __encoder: &mut __E) {
                let WhereEqPredicate {
                        lhs_ty: ref __binding_0, rhs_ty: ref __binding_1 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for WhereEqPredicate {
            fn decode(__decoder: &mut __D) -> Self {
                WhereEqPredicate {
                    lhs_ty: ::rustc_serialize::Decodable::decode(__decoder),
                    rhs_ty: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for WhereEqPredicate {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "WhereEqPredicate", "lhs_ty", &self.lhs_ty, "rhs_ty",
            &&self.rhs_ty)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            WhereEqPredicate where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    WhereEqPredicate {
                        lhs_ty: ref __binding_0, rhs_ty: ref __binding_1 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for WhereEqPredicate
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    WhereEqPredicate {
                        lhs_ty: ref mut __binding_0, rhs_ty: ref mut __binding_1 }
                        => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
543pub struct WhereEqPredicate {
544    pub lhs_ty: Box<Ty>,
545    pub rhs_ty: Box<Ty>,
546}
547
548#[derive(#[automatically_derived]
impl ::core::clone::Clone for Crate {
    #[inline]
    fn clone(&self) -> Crate {
        Crate {
            id: ::core::clone::Clone::clone(&self.id),
            attrs: ::core::clone::Clone::clone(&self.attrs),
            items: ::core::clone::Clone::clone(&self.items),
            spans: ::core::clone::Clone::clone(&self.spans),
            is_placeholder: ::core::clone::Clone::clone(&self.is_placeholder),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Crate {
            fn encode(&self, __encoder: &mut __E) {
                let Crate {
                        id: ref __binding_0,
                        attrs: ref __binding_1,
                        items: ref __binding_2,
                        spans: ref __binding_3,
                        is_placeholder: ref __binding_4 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Crate {
            fn decode(__decoder: &mut __D) -> Self {
                Crate {
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    attrs: ::rustc_serialize::Decodable::decode(__decoder),
                    items: ::rustc_serialize::Decodable::decode(__decoder),
                    spans: ::rustc_serialize::Decodable::decode(__decoder),
                    is_placeholder: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Crate {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f, "Crate", "id",
            &self.id, "attrs", &self.attrs, "items", &self.items, "spans",
            &self.spans, "is_placeholder", &&self.is_placeholder)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Crate where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Crate {
                        id: ref __binding_0,
                        attrs: ref __binding_1,
                        items: ref __binding_2,
                        spans: ref __binding_3,
                        is_placeholder: ref __binding_4 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Crate where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Crate {
                        id: ref mut __binding_0,
                        attrs: ref mut __binding_1,
                        items: ref mut __binding_2,
                        spans: ref mut __binding_3,
                        is_placeholder: ref mut __binding_4 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
549pub struct Crate {
550    /// Must be equal to `CRATE_NODE_ID` after the crate root is expanded, but may hold
551    /// expansion placeholders or an unassigned value (`DUMMY_NODE_ID`) before that.
552    pub id: NodeId,
553    pub attrs: AttrVec,
554    pub items: ThinVec<Box<Item>>,
555    pub spans: ModSpans,
556    pub is_placeholder: bool,
557}
558
559/// A semantic representation of a meta item.
560///
561/// A meta item is a slightly restricted form of an attribute -- it can only contain
562/// expressions in certain leaf positions, rather than arbitrary token streams -- that is used
563/// for most built-in attributes.
564///
565/// E.g., `#[test]`, `#[derive(..)]`, `#[rustfmt::skip]` or `#[feature = "foo"]`.
566#[derive(#[automatically_derived]
impl ::core::clone::Clone for MetaItem {
    #[inline]
    fn clone(&self) -> MetaItem {
        MetaItem {
            unsafety: ::core::clone::Clone::clone(&self.unsafety),
            path: ::core::clone::Clone::clone(&self.path),
            kind: ::core::clone::Clone::clone(&self.kind),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for MetaItem {
            fn encode(&self, __encoder: &mut __E) {
                let MetaItem {
                        unsafety: ref __binding_0,
                        path: ref __binding_1,
                        kind: ref __binding_2,
                        span: ref __binding_3 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for MetaItem {
            fn decode(__decoder: &mut __D) -> Self {
                MetaItem {
                    unsafety: ::rustc_serialize::Decodable::decode(__decoder),
                    path: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for MetaItem {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "MetaItem",
            "unsafety", &self.unsafety, "path", &self.path, "kind",
            &self.kind, "span", &&self.span)
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for MetaItem {
            #[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 {
                    MetaItem {
                        unsafety: ref __binding_0,
                        path: ref __binding_1,
                        kind: ref __binding_2,
                        span: 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); }
                    }
                }
            }
        }
    };StableHash)]
567pub struct MetaItem {
568    pub unsafety: Safety,
569    pub path: Path,
570    pub kind: MetaItemKind,
571    pub span: Span,
572}
573
574/// The meta item kind, containing the data after the initial path.
575#[derive(#[automatically_derived]
impl ::core::clone::Clone for MetaItemKind {
    #[inline]
    fn clone(&self) -> MetaItemKind {
        match self {
            MetaItemKind::Word => MetaItemKind::Word,
            MetaItemKind::List(__self_0) =>
                MetaItemKind::List(::core::clone::Clone::clone(__self_0)),
            MetaItemKind::NameValue(__self_0) =>
                MetaItemKind::NameValue(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for MetaItemKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        MetaItemKind::Word => { 0usize }
                        MetaItemKind::List(ref __binding_0) => { 1usize }
                        MetaItemKind::NameValue(ref __binding_0) => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    MetaItemKind::Word => {}
                    MetaItemKind::List(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    MetaItemKind::NameValue(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for MetaItemKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { MetaItemKind::Word }
                    1usize => {
                        MetaItemKind::List(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        MetaItemKind::NameValue(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `MetaItemKind`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for MetaItemKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            MetaItemKind::Word =>
                ::core::fmt::Formatter::write_str(f, "Word"),
            MetaItemKind::List(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "List",
                    &__self_0),
            MetaItemKind::NameValue(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "NameValue", &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for MetaItemKind
            {
            #[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 {
                    MetaItemKind::Word => {}
                    MetaItemKind::List(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    MetaItemKind::NameValue(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
576pub enum MetaItemKind {
577    /// Word meta item.
578    ///
579    /// E.g., `#[test]`, which lacks any arguments after `test`.
580    Word,
581
582    /// List meta item.
583    ///
584    /// E.g., `#[derive(..)]`, where the field represents the `..`.
585    List(ThinVec<MetaItemInner>),
586
587    /// Name value meta item.
588    ///
589    /// E.g., `#[feature = "foo"]`, where the field represents the `"foo"`.
590    NameValue(MetaItemLit),
591}
592
593/// Values inside meta item lists.
594///
595/// E.g., each of `Clone`, `Copy` in `#[derive(Clone, Copy)]`.
596#[derive(#[automatically_derived]
impl ::core::clone::Clone for MetaItemInner {
    #[inline]
    fn clone(&self) -> MetaItemInner {
        match self {
            MetaItemInner::MetaItem(__self_0) =>
                MetaItemInner::MetaItem(::core::clone::Clone::clone(__self_0)),
            MetaItemInner::Lit(__self_0) =>
                MetaItemInner::Lit(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for MetaItemInner {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        MetaItemInner::MetaItem(ref __binding_0) => { 0usize }
                        MetaItemInner::Lit(ref __binding_0) => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    MetaItemInner::MetaItem(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    MetaItemInner::Lit(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for MetaItemInner {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        MetaItemInner::MetaItem(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        MetaItemInner::Lit(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `MetaItemInner`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for MetaItemInner {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            MetaItemInner::MetaItem(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "MetaItem", &__self_0),
            MetaItemInner::Lit(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Lit",
                    &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            MetaItemInner {
            #[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 {
                    MetaItemInner::MetaItem(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    MetaItemInner::Lit(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
597pub enum MetaItemInner {
598    /// A full MetaItem, for recursive meta items.
599    MetaItem(MetaItem),
600
601    /// A literal.
602    ///
603    /// E.g., `"foo"`, `64`, `true`.
604    Lit(MetaItemLit),
605}
606
607/// A block (`{ .. }`).
608///
609/// E.g., `{ .. }` as in `fn foo() { .. }`.
610#[derive(#[automatically_derived]
impl ::core::clone::Clone for Block {
    #[inline]
    fn clone(&self) -> Block {
        Block {
            stmts: ::core::clone::Clone::clone(&self.stmts),
            id: ::core::clone::Clone::clone(&self.id),
            rules: ::core::clone::Clone::clone(&self.rules),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Block {
            fn encode(&self, __encoder: &mut __E) {
                let Block {
                        stmts: ref __binding_0,
                        id: ref __binding_1,
                        rules: ref __binding_2,
                        span: ref __binding_3 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Block {
            fn decode(__decoder: &mut __D) -> Self {
                Block {
                    stmts: ::rustc_serialize::Decodable::decode(__decoder),
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    rules: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Block {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "Block",
            "stmts", &self.stmts, "id", &self.id, "rules", &self.rules,
            "span", &&self.span)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Block where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Block {
                        stmts: ref __binding_0,
                        id: ref __binding_1,
                        rules: ref __binding_2,
                        span: ref __binding_3 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Block where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Block {
                        stmts: ref mut __binding_0,
                        id: ref mut __binding_1,
                        rules: ref mut __binding_2,
                        span: ref mut __binding_3 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
611pub struct Block {
612    /// The statements in the block.
613    pub stmts: ThinVec<Stmt>,
614    pub id: NodeId,
615    /// Distinguishes between `unsafe { ... }` and `{ ... }`.
616    pub rules: BlockCheckMode,
617    pub span: Span,
618}
619
620/// A match pattern.
621///
622/// Patterns appear in match statements and some other contexts, such as `let` and `if let`.
623#[derive(#[automatically_derived]
impl ::core::clone::Clone for Pat {
    #[inline]
    fn clone(&self) -> Pat {
        Pat {
            id: ::core::clone::Clone::clone(&self.id),
            kind: ::core::clone::Clone::clone(&self.kind),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Pat {
            fn encode(&self, __encoder: &mut __E) {
                let Pat {
                        id: ref __binding_0,
                        kind: ref __binding_1,
                        span: 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);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Pat {
            fn decode(__decoder: &mut __D) -> Self {
                Pat {
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Pat {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "Pat", "id",
            &self.id, "kind", &self.kind, "span", &&self.span)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Pat where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Pat {
                        id: ref __binding_0,
                        kind: ref __binding_1,
                        span: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Pat where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Pat {
                        id: ref mut __binding_0,
                        kind: ref mut __binding_1,
                        span: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
624pub struct Pat {
625    pub id: NodeId,
626    pub kind: PatKind,
627    pub span: Span,
628}
629
630impl Pat {
631    /// Attempt reparsing the pattern as a type.
632    /// This is intended for use by diagnostics.
633    pub fn to_ty(&self) -> Option<Box<Ty>> {
634        let kind = match &self.kind {
635            PatKind::Missing => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
636            // In a type expression `_` is an inference variable.
637            PatKind::Wild => TyKind::Infer,
638            // An IDENT pattern with no binding mode would be valid as path to a type. E.g. `u32`.
639            PatKind::Ident(BindingMode::NONE, ident, None) => {
640                TyKind::Path(None, Path::from_ident(*ident))
641            }
642            PatKind::Path(qself, path) => TyKind::Path(qself.clone(), path.clone()),
643            PatKind::MacCall(mac) => TyKind::MacCall(mac.clone()),
644            // `&mut? P` can be reinterpreted as `&mut? T` where `T` is `P` reparsed as a type.
645            PatKind::Ref(pat, pinned, mutbl) => pat.to_ty().map(|ty| match pinned {
646                Pinnedness::Not => TyKind::Ref(None, MutTy { ty, mutbl: *mutbl }),
647                Pinnedness::Pinned => TyKind::PinnedRef(None, MutTy { ty, mutbl: *mutbl }),
648            })?,
649            // A slice/array pattern `[P]` can be reparsed as `[T]`, an unsized array,
650            // when `P` can be reparsed as a type `T`.
651            PatKind::Slice(pats) if let [pat] = pats.as_slice() => {
652                pat.to_ty().map(TyKind::Slice)?
653            }
654            // A tuple pattern `(P0, .., Pn)` can be reparsed as `(T0, .., Tn)`
655            // assuming `T0` to `Tn` are all syntactically valid as types.
656            PatKind::Tuple(pats) => {
657                let tys = pats.iter().map(|pat| pat.to_ty()).collect::<Option<ThinVec<_>>>()?;
658                TyKind::Tup(tys)
659            }
660            _ => return None,
661        };
662
663        Some(Box::new(Ty { kind, id: self.id, span: self.span }))
664    }
665
666    /// Walk top-down and call `it` in each place where a pattern occurs
667    /// starting with the root pattern `walk` is called on. If `it` returns
668    /// false then we will descend no further but siblings will be processed.
669    pub fn walk<'ast>(&'ast self, it: &mut impl FnMut(&'ast Pat) -> bool) {
670        if !it(self) {
671            return;
672        }
673
674        match &self.kind {
675            // Walk into the pattern associated with `Ident` (if any).
676            PatKind::Ident(_, _, Some(p)) => p.walk(it),
677
678            // Walk into each field of struct.
679            PatKind::Struct(_, _, fields, _) => fields.iter().for_each(|field| field.pat.walk(it)),
680
681            // Sequence of patterns.
682            PatKind::TupleStruct(_, _, s)
683            | PatKind::Tuple(s)
684            | PatKind::Slice(s)
685            | PatKind::Or(s) => s.iter().for_each(|p| p.walk(it)),
686
687            // Trivial wrappers over inner patterns.
688            PatKind::Deref(s)
689            | PatKind::Ref(s, _, _)
690            | PatKind::Paren(s)
691            | PatKind::Guard(s, _) => s.walk(it),
692
693            // These patterns do not contain subpatterns, skip.
694            PatKind::Missing
695            | PatKind::Wild
696            | PatKind::Rest
697            | PatKind::Never
698            | PatKind::Expr(_)
699            | PatKind::Range(..)
700            | PatKind::Ident(..)
701            | PatKind::Path(..)
702            | PatKind::MacCall(_)
703            | PatKind::Err(_) => {}
704        }
705    }
706
707    /// Strip off all reference patterns (`&`, `&mut`) and return the inner pattern.
708    pub fn peel_refs(&self) -> &Pat {
709        let mut current = self;
710        while let PatKind::Ref(inner, _, _) = &current.kind {
711            current = inner;
712        }
713        current
714    }
715
716    /// Is this a `..` pattern?
717    pub fn is_rest(&self) -> bool {
718        #[allow(non_exhaustive_omitted_patterns)] match self.kind {
    PatKind::Rest => true,
    _ => false,
}matches!(self.kind, PatKind::Rest)
719    }
720
721    /// Whether this could be a never pattern, taking into account that a macro invocation can
722    /// return a never pattern. Used to inform errors during parsing.
723    pub fn could_be_never_pattern(&self) -> bool {
724        let mut could_be_never_pattern = false;
725        self.walk(&mut |pat| match &pat.kind {
726            PatKind::Never | PatKind::MacCall(_) => {
727                could_be_never_pattern = true;
728                false
729            }
730            PatKind::Or(s) => {
731                could_be_never_pattern = s.iter().all(|p| p.could_be_never_pattern());
732                false
733            }
734            _ => true,
735        });
736        could_be_never_pattern
737    }
738
739    /// Whether this contains a `!` pattern. This in particular means that a feature gate error will
740    /// be raised if the feature is off. Used to avoid gating the feature twice.
741    pub fn contains_never_pattern(&self) -> bool {
742        let mut contains_never_pattern = false;
743        self.walk(&mut |pat| {
744            if #[allow(non_exhaustive_omitted_patterns)] match pat.kind {
    PatKind::Never => true,
    _ => false,
}matches!(pat.kind, PatKind::Never) {
745                contains_never_pattern = true;
746            }
747            true
748        });
749        contains_never_pattern
750    }
751
752    /// Return a name suitable for diagnostics.
753    pub fn descr(&self) -> Option<String> {
754        match &self.kind {
755            PatKind::Missing => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
756            PatKind::Wild => Some("_".to_string()),
757            PatKind::Ident(BindingMode::NONE, ident, None) => Some(::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("{0}", ident))
    })format!("{ident}")),
758            PatKind::Ref(pat, pinned, mutbl) => {
759                pat.descr().map(|d| ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("&{0}{1}",
                pinned.prefix_str(*mutbl), d))
    })format!("&{}{d}", pinned.prefix_str(*mutbl)))
760            }
761            _ => None,
762        }
763    }
764}
765
766impl From<Box<Pat>> for Pat {
767    fn from(value: Box<Pat>) -> Self {
768        *value
769    }
770}
771
772/// A single field in a struct pattern.
773///
774/// Patterns like the fields of `Foo { x, ref y, ref mut z }`
775/// are treated the same as `x: x, y: ref y, z: ref mut z`,
776/// except when `is_shorthand` is true.
777#[derive(#[automatically_derived]
impl ::core::clone::Clone for PatField {
    #[inline]
    fn clone(&self) -> PatField {
        PatField {
            ident: ::core::clone::Clone::clone(&self.ident),
            pat: ::core::clone::Clone::clone(&self.pat),
            is_shorthand: ::core::clone::Clone::clone(&self.is_shorthand),
            attrs: ::core::clone::Clone::clone(&self.attrs),
            id: ::core::clone::Clone::clone(&self.id),
            span: ::core::clone::Clone::clone(&self.span),
            is_placeholder: ::core::clone::Clone::clone(&self.is_placeholder),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for PatField {
            fn encode(&self, __encoder: &mut __E) {
                let PatField {
                        ident: ref __binding_0,
                        pat: ref __binding_1,
                        is_shorthand: ref __binding_2,
                        attrs: ref __binding_3,
                        id: ref __binding_4,
                        span: ref __binding_5,
                        is_placeholder: ref __binding_6 } = *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);
                ::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);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for PatField {
            fn decode(__decoder: &mut __D) -> Self {
                PatField {
                    ident: ::rustc_serialize::Decodable::decode(__decoder),
                    pat: ::rustc_serialize::Decodable::decode(__decoder),
                    is_shorthand: ::rustc_serialize::Decodable::decode(__decoder),
                    attrs: ::rustc_serialize::Decodable::decode(__decoder),
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    is_placeholder: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for PatField {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["ident", "pat", "is_shorthand", "attrs", "id", "span",
                        "is_placeholder"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.ident, &self.pat, &self.is_shorthand, &self.attrs,
                        &self.id, &self.span, &&self.is_placeholder];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "PatField",
            names, values)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for PatField
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    PatField {
                        ident: ref __binding_0,
                        pat: ref __binding_1,
                        is_shorthand: ref __binding_2,
                        attrs: ref __binding_3,
                        id: ref __binding_4,
                        span: ref __binding_5,
                        is_placeholder: ref __binding_6 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_5,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_6,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for PatField where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    PatField {
                        ident: ref mut __binding_0,
                        pat: ref mut __binding_1,
                        is_shorthand: ref mut __binding_2,
                        attrs: ref mut __binding_3,
                        id: ref mut __binding_4,
                        span: ref mut __binding_5,
                        is_placeholder: ref mut __binding_6 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_5,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_6,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
778pub struct PatField {
779    /// The identifier for the field.
780    pub ident: Ident,
781    /// The pattern the field is destructured to.
782    pub pat: Box<Pat>,
783    pub is_shorthand: bool,
784    pub attrs: AttrVec,
785    pub id: NodeId,
786    pub span: Span,
787    pub is_placeholder: bool,
788}
789
790#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for ByRef { }
#[automatically_derived]
impl ::core::clone::Clone for ByRef {
    #[inline]
    fn clone(&self) -> ByRef {
        let _: ::core::clone::AssertParamIsClone<Pinnedness>;
        let _: ::core::clone::AssertParamIsClone<Mutability>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for ByRef { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for ByRef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            ByRef::Yes(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Yes",
                    __self_0, &__self_1),
            ByRef::No => ::core::fmt::Formatter::write_str(f, "No"),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for ByRef {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Pinnedness>;
        let _: ::core::cmp::AssertParamIsEq<Mutability>;
    }
}Eq, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for ByRef { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ByRef {
    #[inline]
    fn eq(&self, other: &ByRef) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (ByRef::Yes(__self_0, __self_1),
                    ByRef::Yes(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                _ => true,
            }
    }
}PartialEq)]
791#[derive(const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ByRef {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        ByRef::Yes(ref __binding_0, ref __binding_1) => { 0usize }
                        ByRef::No => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    ByRef::Yes(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ByRef::No => {}
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ByRef {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        ByRef::Yes(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => { ByRef::No }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `ByRef`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for ByRef {
            #[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 {
                    ByRef::Yes(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    ByRef::No => {}
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for ByRef where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    ByRef::Yes(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    ByRef::No => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for ByRef where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    ByRef::Yes(ref mut __binding_0, ref mut __binding_1) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                    ByRef::No => {}
                }
            }
        }
    };Walkable)]
792pub enum ByRef {
793    Yes(Pinnedness, Mutability),
794    No,
795}
796
797impl ByRef {
798    #[must_use]
799    pub fn cap_ref_mutability(mut self, mutbl: Mutability) -> Self {
800        if let ByRef::Yes(_, old_mutbl) = &mut self {
801            *old_mutbl = cmp::min(*old_mutbl, mutbl);
802        }
803        self
804    }
805}
806
807/// The mode of a binding (`mut`, `ref mut`, etc).
808///
809/// Used for both the explicit binding annotations given in the HIR for a binding
810/// and the final binding mode that we infer after type inference/match ergonomics.
811/// `.0` is the by-reference mode (`ref`, `ref mut`, or by value),
812/// `.1` is the mutability of the binding.
813#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for BindingMode { }
#[automatically_derived]
impl ::core::clone::Clone for BindingMode {
    #[inline]
    fn clone(&self) -> BindingMode {
        let _: ::core::clone::AssertParamIsClone<ByRef>;
        let _: ::core::clone::AssertParamIsClone<Mutability>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for BindingMode { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for BindingMode {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field2_finish(f, "BindingMode",
            &self.0, &&self.1)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for BindingMode {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<ByRef>;
        let _: ::core::cmp::AssertParamIsEq<Mutability>;
    }
}Eq, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for BindingMode { }
#[automatically_derived]
impl ::core::cmp::PartialEq for BindingMode {
    #[inline]
    fn eq(&self, other: &BindingMode) -> bool {
        self.0 == other.0 && self.1 == other.1
    }
}PartialEq)]
814#[derive(const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for BindingMode {
            fn encode(&self, __encoder: &mut __E) {
                let BindingMode(ref __binding_0, ref __binding_1) = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for BindingMode {
            fn decode(__decoder: &mut __D) -> Self {
                BindingMode(::rustc_serialize::Decodable::decode(__decoder),
                    ::rustc_serialize::Decodable::decode(__decoder))
            }
        }
    };Decodable, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for BindingMode
            {
            #[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 {
                    BindingMode(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for BindingMode
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    BindingMode(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for BindingMode where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    BindingMode(ref mut __binding_0, ref mut __binding_1) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
815pub struct BindingMode(pub ByRef, pub Mutability);
816
817impl BindingMode {
818    pub const NONE: Self = Self(ByRef::No, Mutability::Not);
819    pub const REF: Self = Self(ByRef::Yes(Pinnedness::Not, Mutability::Not), Mutability::Not);
820    pub const REF_PIN: Self =
821        Self(ByRef::Yes(Pinnedness::Pinned, Mutability::Not), Mutability::Not);
822    pub const MUT: Self = Self(ByRef::No, Mutability::Mut);
823    pub const REF_MUT: Self = Self(ByRef::Yes(Pinnedness::Not, Mutability::Mut), Mutability::Not);
824    pub const REF_PIN_MUT: Self =
825        Self(ByRef::Yes(Pinnedness::Pinned, Mutability::Mut), Mutability::Not);
826    pub const MUT_REF: Self = Self(ByRef::Yes(Pinnedness::Not, Mutability::Not), Mutability::Mut);
827    pub const MUT_REF_PIN: Self =
828        Self(ByRef::Yes(Pinnedness::Pinned, Mutability::Not), Mutability::Mut);
829    pub const MUT_REF_MUT: Self =
830        Self(ByRef::Yes(Pinnedness::Not, Mutability::Mut), Mutability::Mut);
831    pub const MUT_REF_PIN_MUT: Self =
832        Self(ByRef::Yes(Pinnedness::Pinned, Mutability::Mut), Mutability::Mut);
833
834    pub fn prefix_str(self) -> &'static str {
835        match self {
836            Self::NONE => "",
837            Self::REF => "ref ",
838            Self::REF_PIN => "ref pin const ",
839            Self::MUT => "mut ",
840            Self::REF_MUT => "ref mut ",
841            Self::REF_PIN_MUT => "ref pin mut ",
842            Self::MUT_REF => "mut ref ",
843            Self::MUT_REF_PIN => "mut ref pin ",
844            Self::MUT_REF_MUT => "mut ref mut ",
845            Self::MUT_REF_PIN_MUT => "mut ref pin mut ",
846        }
847    }
848}
849
850#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for RangeEnd { }
#[automatically_derived]
impl ::core::clone::Clone for RangeEnd {
    #[inline]
    fn clone(&self) -> RangeEnd {
        let _: ::core::clone::AssertParamIsClone<RangeSyntax>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for RangeEnd { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for RangeEnd {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        RangeEnd::Included(ref __binding_0) => { 0usize }
                        RangeEnd::Excluded => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    RangeEnd::Included(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    RangeEnd::Excluded => {}
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for RangeEnd {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        RangeEnd::Included(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => { RangeEnd::Excluded }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `RangeEnd`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for RangeEnd {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            RangeEnd::Included(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Included", &__self_0),
            RangeEnd::Excluded =>
                ::core::fmt::Formatter::write_str(f, "Excluded"),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for RangeEnd
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    RangeEnd::Included(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    RangeEnd::Excluded => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for RangeEnd where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    RangeEnd::Included(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    RangeEnd::Excluded => {}
                }
            }
        }
    };Walkable)]
851pub enum RangeEnd {
852    /// `..=` or `...`
853    Included(RangeSyntax),
854    /// `..`
855    Excluded,
856}
857
858#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for RangeSyntax { }
#[automatically_derived]
impl ::core::clone::Clone for RangeSyntax {
    #[inline]
    fn clone(&self) -> RangeSyntax { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for RangeSyntax { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for RangeSyntax {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        RangeSyntax::DotDotDot => { 0usize }
                        RangeSyntax::DotDotEq => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for RangeSyntax {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { RangeSyntax::DotDotDot }
                    1usize => { RangeSyntax::DotDotEq }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `RangeSyntax`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for RangeSyntax {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                RangeSyntax::DotDotDot => "DotDotDot",
                RangeSyntax::DotDotEq => "DotDotEq",
            })
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for RangeSyntax
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    RangeSyntax::DotDotDot => {}
                    RangeSyntax::DotDotEq => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for RangeSyntax where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    RangeSyntax::DotDotDot => {}
                    RangeSyntax::DotDotEq => {}
                }
            }
        }
    };Walkable)]
859pub enum RangeSyntax {
860    /// `...`
861    DotDotDot,
862    /// `..=`
863    DotDotEq,
864}
865
866/// All the different flavors of pattern that Rust recognizes.
867//
868// Adding a new variant? Please update `test_pat` in `tests/ui/macros/stringify.rs`.
869#[derive(#[automatically_derived]
impl ::core::clone::Clone for PatKind {
    #[inline]
    fn clone(&self) -> PatKind {
        match self {
            PatKind::Missing => PatKind::Missing,
            PatKind::Wild => PatKind::Wild,
            PatKind::Ident(__self_0, __self_1, __self_2) =>
                PatKind::Ident(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            PatKind::Struct(__self_0, __self_1, __self_2, __self_3) =>
                PatKind::Struct(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2),
                    ::core::clone::Clone::clone(__self_3)),
            PatKind::TupleStruct(__self_0, __self_1, __self_2) =>
                PatKind::TupleStruct(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            PatKind::Or(__self_0) =>
                PatKind::Or(::core::clone::Clone::clone(__self_0)),
            PatKind::Path(__self_0, __self_1) =>
                PatKind::Path(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            PatKind::Tuple(__self_0) =>
                PatKind::Tuple(::core::clone::Clone::clone(__self_0)),
            PatKind::Deref(__self_0) =>
                PatKind::Deref(::core::clone::Clone::clone(__self_0)),
            PatKind::Ref(__self_0, __self_1, __self_2) =>
                PatKind::Ref(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            PatKind::Expr(__self_0) =>
                PatKind::Expr(::core::clone::Clone::clone(__self_0)),
            PatKind::Range(__self_0, __self_1, __self_2) =>
                PatKind::Range(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            PatKind::Slice(__self_0) =>
                PatKind::Slice(::core::clone::Clone::clone(__self_0)),
            PatKind::Rest => PatKind::Rest,
            PatKind::Never => PatKind::Never,
            PatKind::Guard(__self_0, __self_1) =>
                PatKind::Guard(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            PatKind::Paren(__self_0) =>
                PatKind::Paren(::core::clone::Clone::clone(__self_0)),
            PatKind::MacCall(__self_0) =>
                PatKind::MacCall(::core::clone::Clone::clone(__self_0)),
            PatKind::Err(__self_0) =>
                PatKind::Err(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for PatKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        PatKind::Missing => { 0usize }
                        PatKind::Wild => { 1usize }
                        PatKind::Ident(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            2usize
                        }
                        PatKind::Struct(ref __binding_0, ref __binding_1,
                            ref __binding_2, ref __binding_3) => {
                            3usize
                        }
                        PatKind::TupleStruct(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            4usize
                        }
                        PatKind::Or(ref __binding_0) => { 5usize }
                        PatKind::Path(ref __binding_0, ref __binding_1) => {
                            6usize
                        }
                        PatKind::Tuple(ref __binding_0) => { 7usize }
                        PatKind::Deref(ref __binding_0) => { 8usize }
                        PatKind::Ref(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            9usize
                        }
                        PatKind::Expr(ref __binding_0) => { 10usize }
                        PatKind::Range(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            11usize
                        }
                        PatKind::Slice(ref __binding_0) => { 12usize }
                        PatKind::Rest => { 13usize }
                        PatKind::Never => { 14usize }
                        PatKind::Guard(ref __binding_0, ref __binding_1) => {
                            15usize
                        }
                        PatKind::Paren(ref __binding_0) => { 16usize }
                        PatKind::MacCall(ref __binding_0) => { 17usize }
                        PatKind::Err(ref __binding_0) => { 18usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    PatKind::Missing => {}
                    PatKind::Wild => {}
                    PatKind::Ident(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);
                    }
                    PatKind::Struct(ref __binding_0, ref __binding_1,
                        ref __binding_2, 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);
                    }
                    PatKind::TupleStruct(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);
                    }
                    PatKind::Or(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    PatKind::Path(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    PatKind::Tuple(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    PatKind::Deref(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    PatKind::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);
                    }
                    PatKind::Expr(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    PatKind::Range(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);
                    }
                    PatKind::Slice(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    PatKind::Rest => {}
                    PatKind::Never => {}
                    PatKind::Guard(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    PatKind::Paren(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    PatKind::MacCall(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    PatKind::Err(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for PatKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { PatKind::Missing }
                    1usize => { PatKind::Wild }
                    2usize => {
                        PatKind::Ident(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => {
                        PatKind::Struct(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    4usize => {
                        PatKind::TupleStruct(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    5usize => {
                        PatKind::Or(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    6usize => {
                        PatKind::Path(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    7usize => {
                        PatKind::Tuple(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    8usize => {
                        PatKind::Deref(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    9usize => {
                        PatKind::Ref(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    10usize => {
                        PatKind::Expr(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    11usize => {
                        PatKind::Range(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    12usize => {
                        PatKind::Slice(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    13usize => { PatKind::Rest }
                    14usize => { PatKind::Never }
                    15usize => {
                        PatKind::Guard(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    16usize => {
                        PatKind::Paren(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    17usize => {
                        PatKind::MacCall(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    18usize => {
                        PatKind::Err(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `PatKind`, expected 0..19, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for PatKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            PatKind::Missing =>
                ::core::fmt::Formatter::write_str(f, "Missing"),
            PatKind::Wild => ::core::fmt::Formatter::write_str(f, "Wild"),
            PatKind::Ident(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Ident",
                    __self_0, __self_1, &__self_2),
            PatKind::Struct(__self_0, __self_1, __self_2, __self_3) =>
                ::core::fmt::Formatter::debug_tuple_field4_finish(f, "Struct",
                    __self_0, __self_1, __self_2, &__self_3),
            PatKind::TupleStruct(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f,
                    "TupleStruct", __self_0, __self_1, &__self_2),
            PatKind::Or(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Or",
                    &__self_0),
            PatKind::Path(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Path",
                    __self_0, &__self_1),
            PatKind::Tuple(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Tuple",
                    &__self_0),
            PatKind::Deref(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Deref",
                    &__self_0),
            PatKind::Ref(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Ref",
                    __self_0, __self_1, &__self_2),
            PatKind::Expr(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Expr",
                    &__self_0),
            PatKind::Range(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Range",
                    __self_0, __self_1, &__self_2),
            PatKind::Slice(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Slice",
                    &__self_0),
            PatKind::Rest => ::core::fmt::Formatter::write_str(f, "Rest"),
            PatKind::Never => ::core::fmt::Formatter::write_str(f, "Never"),
            PatKind::Guard(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Guard",
                    __self_0, &__self_1),
            PatKind::Paren(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Paren",
                    &__self_0),
            PatKind::MacCall(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "MacCall", &__self_0),
            PatKind::Err(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Err",
                    &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for PatKind
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    PatKind::Missing => {}
                    PatKind::Wild => {}
                    PatKind::Ident(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::Struct(ref __binding_0, ref __binding_1,
                        ref __binding_2, ref __binding_3) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::TupleStruct(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::Or(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::Path(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::Tuple(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::Deref(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::Ref(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::Expr(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::Range(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::Slice(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::Rest => {}
                    PatKind::Never => {}
                    PatKind::Guard(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::Paren(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::MacCall(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::Err(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for PatKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    PatKind::Missing => {}
                    PatKind::Wild => {}
                    PatKind::Ident(ref mut __binding_0, ref mut __binding_1,
                        ref mut __binding_2) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                    PatKind::Struct(ref mut __binding_0, ref mut __binding_1,
                        ref mut __binding_2, ref mut __binding_3) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                    }
                    PatKind::TupleStruct(ref mut __binding_0,
                        ref mut __binding_1, ref mut __binding_2) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                    PatKind::Or(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    PatKind::Path(ref mut __binding_0, ref mut __binding_1) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                    PatKind::Tuple(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    PatKind::Deref(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    PatKind::Ref(ref mut __binding_0, ref mut __binding_1,
                        ref mut __binding_2) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                    PatKind::Expr(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    PatKind::Range(ref mut __binding_0, ref mut __binding_1,
                        ref mut __binding_2) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                    PatKind::Slice(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    PatKind::Rest => {}
                    PatKind::Never => {}
                    PatKind::Guard(ref mut __binding_0, ref mut __binding_1) =>
                        {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                    PatKind::Paren(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    PatKind::MacCall(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    PatKind::Err(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
870pub enum PatKind {
871    /// A missing pattern, e.g. for an anonymous param in a bare fn like `fn f(u32)`.
872    Missing,
873
874    /// Represents a wildcard pattern (`_`).
875    Wild,
876
877    /// A `PatKind::Ident` may either be a new bound variable (`ref mut binding @ OPT_SUBPATTERN`),
878    /// or a unit struct/variant pattern, or a const pattern (in the last two cases the third
879    /// field must be `None`). Disambiguation cannot be done with parser alone, so it happens
880    /// during name resolution.
881    Ident(BindingMode, Ident, Option<Box<Pat>>),
882
883    /// A struct or struct variant pattern (e.g., `Variant {x, y, ..}`).
884    Struct(Option<Box<QSelf>>, Path, ThinVec<PatField>, PatFieldsRest),
885
886    /// A tuple struct/variant pattern (`Variant(x, y, .., z)`).
887    TupleStruct(Option<Box<QSelf>>, Path, ThinVec<Pat>),
888
889    /// An or-pattern `A | B | C`.
890    /// Invariant: `pats.len() >= 2`.
891    Or(ThinVec<Pat>),
892
893    /// A possibly qualified path pattern.
894    /// Unqualified path patterns `A::B::C` can legally refer to variants, structs, constants
895    /// or associated constants. Qualified path patterns `<A>::B::C`/`<A as Trait>::B::C` can
896    /// only legally refer to associated constants.
897    Path(Option<Box<QSelf>>, Path),
898
899    /// A tuple pattern (`(a, b)`).
900    Tuple(ThinVec<Pat>),
901
902    /// A `deref` pattern (currently `deref!()` macro-based syntax).
903    Deref(Box<Pat>),
904
905    /// A reference pattern (e.g., `&mut (a, b)`).
906    Ref(Box<Pat>, Pinnedness, Mutability),
907
908    /// A literal, const block or path.
909    Expr(Box<Expr>),
910
911    /// A range pattern (e.g., `1...2`, `1..2`, `1..`, `..2`, `1..=2`, `..=2`).
912    Range(Option<Box<Expr>>, Option<Box<Expr>>, Spanned<RangeEnd>),
913
914    /// A slice pattern `[a, b, c]`.
915    Slice(ThinVec<Pat>),
916
917    /// A rest pattern `..`.
918    ///
919    /// Syntactically it is valid anywhere.
920    ///
921    /// Semantically however, it only has meaning immediately inside:
922    /// - a slice pattern: `[a, .., b]`,
923    /// - a binding pattern immediately inside a slice pattern: `[a, r @ ..]`,
924    /// - a tuple pattern: `(a, .., b)`,
925    /// - a tuple struct/variant pattern: `$path(a, .., b)`.
926    ///
927    /// In all of these cases, an additional restriction applies,
928    /// only one rest pattern may occur in the pattern sequences.
929    Rest,
930
931    // A never pattern `!`.
932    Never,
933
934    /// A guard pattern (e.g., `x if guard(x)`).
935    Guard(Box<Pat>, Box<Guard>),
936
937    /// Parentheses in patterns used for grouping (i.e., `(PAT)`).
938    Paren(Box<Pat>),
939
940    /// A macro pattern; pre-expansion.
941    MacCall(Box<MacCall>),
942
943    /// Placeholder for a pattern that wasn't syntactically well formed in some way.
944    Err(ErrorGuaranteed),
945}
946
947/// Whether the `..` is present in a struct fields pattern.
948#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for PatFieldsRest { }
#[automatically_derived]
impl ::core::clone::Clone for PatFieldsRest {
    #[inline]
    fn clone(&self) -> PatFieldsRest {
        let _: ::core::clone::AssertParamIsClone<Span>;
        let _: ::core::clone::AssertParamIsClone<ErrorGuaranteed>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for PatFieldsRest { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for PatFieldsRest {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        PatFieldsRest::Rest(ref __binding_0) => { 0usize }
                        PatFieldsRest::Recovered(ref __binding_0) => { 1usize }
                        PatFieldsRest::None => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    PatFieldsRest::Rest(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    PatFieldsRest::Recovered(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    PatFieldsRest::None => {}
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for PatFieldsRest {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        PatFieldsRest::Rest(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        PatFieldsRest::Recovered(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => { PatFieldsRest::None }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `PatFieldsRest`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for PatFieldsRest {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            PatFieldsRest::Rest(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Rest",
                    &__self_0),
            PatFieldsRest::Recovered(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Recovered", &__self_0),
            PatFieldsRest::None =>
                ::core::fmt::Formatter::write_str(f, "None"),
        }
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for PatFieldsRest { }
#[automatically_derived]
impl ::core::cmp::PartialEq for PatFieldsRest {
    #[inline]
    fn eq(&self, other: &PatFieldsRest) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (PatFieldsRest::Rest(__self_0), PatFieldsRest::Rest(__arg1_0))
                    => __self_0 == __arg1_0,
                (PatFieldsRest::Recovered(__self_0),
                    PatFieldsRest::Recovered(__arg1_0)) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            PatFieldsRest where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    PatFieldsRest::Rest(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatFieldsRest::Recovered(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatFieldsRest::None => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for PatFieldsRest where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    PatFieldsRest::Rest(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    PatFieldsRest::Recovered(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    PatFieldsRest::None => {}
                }
            }
        }
    };Walkable)]
949pub enum PatFieldsRest {
950    /// `module::StructName { field, ..}`
951    Rest(Span),
952    /// `module::StructName { field, syntax error }`
953    Recovered(ErrorGuaranteed),
954    /// `module::StructName { field }`
955    None,
956}
957
958/// The kind of borrow in an `AddrOf` expression,
959/// e.g., `&place` or `&raw const place`.
960#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for BorrowKind { }
#[automatically_derived]
impl ::core::clone::Clone for BorrowKind {
    #[inline]
    fn clone(&self) -> BorrowKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for BorrowKind { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for BorrowKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for BorrowKind {
    #[inline]
    fn eq(&self, other: &BorrowKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for BorrowKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for BorrowKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                BorrowKind::Ref => "Ref",
                BorrowKind::Raw => "Raw",
                BorrowKind::Pin => "Pin",
            })
    }
}Debug)]
961#[derive(const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for BorrowKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        BorrowKind::Ref => { 0usize }
                        BorrowKind::Raw => { 1usize }
                        BorrowKind::Pin => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for BorrowKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { BorrowKind::Ref }
                    1usize => { BorrowKind::Raw }
                    2usize => { BorrowKind::Pin }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `BorrowKind`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, 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::Ref => {}
                    BorrowKind::Raw => {}
                    BorrowKind::Pin => {}
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for BorrowKind
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    BorrowKind::Ref => {}
                    BorrowKind::Raw => {}
                    BorrowKind::Pin => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for BorrowKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    BorrowKind::Ref => {}
                    BorrowKind::Raw => {}
                    BorrowKind::Pin => {}
                }
            }
        }
    };Walkable)]
962pub enum BorrowKind {
963    /// A normal borrow, `&$expr` or `&mut $expr`.
964    /// The resulting type is either `&'a T` or `&'a mut T`
965    /// where `T = typeof($expr)` and `'a` is some lifetime.
966    Ref,
967    /// A raw borrow, `&raw const $expr` or `&raw mut $expr`.
968    /// The resulting type is either `*const T` or `*mut T`
969    /// where `T = typeof($expr)`.
970    Raw,
971    /// A pinned borrow, `&pin const $expr` or `&pin mut $expr`.
972    /// The resulting type is either `Pin<&'a T>` or `Pin<&'a mut T>`
973    /// where `T = typeof($expr)` and `'a` is some lifetime.
974    Pin,
975}
976
977#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for BinOpKind { }
#[automatically_derived]
impl ::core::clone::Clone for BinOpKind {
    #[inline]
    fn clone(&self) -> BinOpKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for BinOpKind { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for BinOpKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                BinOpKind::Add => "Add",
                BinOpKind::Sub => "Sub",
                BinOpKind::Mul => "Mul",
                BinOpKind::Div => "Div",
                BinOpKind::Rem => "Rem",
                BinOpKind::And => "And",
                BinOpKind::Or => "Or",
                BinOpKind::BitXor => "BitXor",
                BinOpKind::BitAnd => "BitAnd",
                BinOpKind::BitOr => "BitOr",
                BinOpKind::Shl => "Shl",
                BinOpKind::Shr => "Shr",
                BinOpKind::Eq => "Eq",
                BinOpKind::Lt => "Lt",
                BinOpKind::Le => "Le",
                BinOpKind::Ne => "Ne",
                BinOpKind::Ge => "Ge",
                BinOpKind::Gt => "Gt",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for BinOpKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for BinOpKind {
    #[inline]
    fn eq(&self, other: &BinOpKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for BinOpKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        BinOpKind::Add => { 0usize }
                        BinOpKind::Sub => { 1usize }
                        BinOpKind::Mul => { 2usize }
                        BinOpKind::Div => { 3usize }
                        BinOpKind::Rem => { 4usize }
                        BinOpKind::And => { 5usize }
                        BinOpKind::Or => { 6usize }
                        BinOpKind::BitXor => { 7usize }
                        BinOpKind::BitAnd => { 8usize }
                        BinOpKind::BitOr => { 9usize }
                        BinOpKind::Shl => { 10usize }
                        BinOpKind::Shr => { 11usize }
                        BinOpKind::Eq => { 12usize }
                        BinOpKind::Lt => { 13usize }
                        BinOpKind::Le => { 14usize }
                        BinOpKind::Ne => { 15usize }
                        BinOpKind::Ge => { 16usize }
                        BinOpKind::Gt => { 17usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for BinOpKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { BinOpKind::Add }
                    1usize => { BinOpKind::Sub }
                    2usize => { BinOpKind::Mul }
                    3usize => { BinOpKind::Div }
                    4usize => { BinOpKind::Rem }
                    5usize => { BinOpKind::And }
                    6usize => { BinOpKind::Or }
                    7usize => { BinOpKind::BitXor }
                    8usize => { BinOpKind::BitAnd }
                    9usize => { BinOpKind::BitOr }
                    10usize => { BinOpKind::Shl }
                    11usize => { BinOpKind::Shr }
                    12usize => { BinOpKind::Eq }
                    13usize => { BinOpKind::Lt }
                    14usize => { BinOpKind::Le }
                    15usize => { BinOpKind::Ne }
                    16usize => { BinOpKind::Ge }
                    17usize => { BinOpKind::Gt }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `BinOpKind`, expected 0..18, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for BinOpKind {
            #[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 {
                    BinOpKind::Add => {}
                    BinOpKind::Sub => {}
                    BinOpKind::Mul => {}
                    BinOpKind::Div => {}
                    BinOpKind::Rem => {}
                    BinOpKind::And => {}
                    BinOpKind::Or => {}
                    BinOpKind::BitXor => {}
                    BinOpKind::BitAnd => {}
                    BinOpKind::BitOr => {}
                    BinOpKind::Shl => {}
                    BinOpKind::Shr => {}
                    BinOpKind::Eq => {}
                    BinOpKind::Lt => {}
                    BinOpKind::Le => {}
                    BinOpKind::Ne => {}
                    BinOpKind::Ge => {}
                    BinOpKind::Gt => {}
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for BinOpKind
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    BinOpKind::Add => {}
                    BinOpKind::Sub => {}
                    BinOpKind::Mul => {}
                    BinOpKind::Div => {}
                    BinOpKind::Rem => {}
                    BinOpKind::And => {}
                    BinOpKind::Or => {}
                    BinOpKind::BitXor => {}
                    BinOpKind::BitAnd => {}
                    BinOpKind::BitOr => {}
                    BinOpKind::Shl => {}
                    BinOpKind::Shr => {}
                    BinOpKind::Eq => {}
                    BinOpKind::Lt => {}
                    BinOpKind::Le => {}
                    BinOpKind::Ne => {}
                    BinOpKind::Ge => {}
                    BinOpKind::Gt => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for BinOpKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    BinOpKind::Add => {}
                    BinOpKind::Sub => {}
                    BinOpKind::Mul => {}
                    BinOpKind::Div => {}
                    BinOpKind::Rem => {}
                    BinOpKind::And => {}
                    BinOpKind::Or => {}
                    BinOpKind::BitXor => {}
                    BinOpKind::BitAnd => {}
                    BinOpKind::BitOr => {}
                    BinOpKind::Shl => {}
                    BinOpKind::Shr => {}
                    BinOpKind::Eq => {}
                    BinOpKind::Lt => {}
                    BinOpKind::Le => {}
                    BinOpKind::Ne => {}
                    BinOpKind::Ge => {}
                    BinOpKind::Gt => {}
                }
            }
        }
    };Walkable)]
978pub enum BinOpKind {
979    /// The `+` operator (addition)
980    Add,
981    /// The `-` operator (subtraction)
982    Sub,
983    /// The `*` operator (multiplication)
984    Mul,
985    /// The `/` operator (division)
986    Div,
987    /// The `%` operator (modulus)
988    Rem,
989    /// The `&&` operator (logical and)
990    And,
991    /// The `||` operator (logical or)
992    Or,
993    /// The `^` operator (bitwise xor)
994    BitXor,
995    /// The `&` operator (bitwise and)
996    BitAnd,
997    /// The `|` operator (bitwise or)
998    BitOr,
999    /// The `<<` operator (shift left)
1000    Shl,
1001    /// The `>>` operator (shift right)
1002    Shr,
1003    /// The `==` operator (equality)
1004    Eq,
1005    /// The `<` operator (less than)
1006    Lt,
1007    /// The `<=` operator (less than or equal to)
1008    Le,
1009    /// The `!=` operator (not equal to)
1010    Ne,
1011    /// The `>=` operator (greater than or equal to)
1012    Ge,
1013    /// The `>` operator (greater than)
1014    Gt,
1015}
1016
1017impl BinOpKind {
1018    pub fn as_str(&self) -> &'static str {
1019        use BinOpKind::*;
1020        match self {
1021            Add => "+",
1022            Sub => "-",
1023            Mul => "*",
1024            Div => "/",
1025            Rem => "%",
1026            And => "&&",
1027            Or => "||",
1028            BitXor => "^",
1029            BitAnd => "&",
1030            BitOr => "|",
1031            Shl => "<<",
1032            Shr => ">>",
1033            Eq => "==",
1034            Lt => "<",
1035            Le => "<=",
1036            Ne => "!=",
1037            Ge => ">=",
1038            Gt => ">",
1039        }
1040    }
1041
1042    pub fn is_lazy(&self) -> bool {
1043        #[allow(non_exhaustive_omitted_patterns)] match self {
    BinOpKind::And | BinOpKind::Or => true,
    _ => false,
}matches!(self, BinOpKind::And | BinOpKind::Or)
1044    }
1045
1046    pub fn precedence(&self) -> ExprPrecedence {
1047        use BinOpKind::*;
1048        match *self {
1049            Mul | Div | Rem => ExprPrecedence::Product,
1050            Add | Sub => ExprPrecedence::Sum,
1051            Shl | Shr => ExprPrecedence::Shift,
1052            BitAnd => ExprPrecedence::BitAnd,
1053            BitXor => ExprPrecedence::BitXor,
1054            BitOr => ExprPrecedence::BitOr,
1055            Lt | Gt | Le | Ge | Eq | Ne => ExprPrecedence::Compare,
1056            And => ExprPrecedence::LAnd,
1057            Or => ExprPrecedence::LOr,
1058        }
1059    }
1060
1061    pub fn fixity(&self) -> Fixity {
1062        use BinOpKind::*;
1063        match self {
1064            Eq | Ne | Lt | Le | Gt | Ge => Fixity::None,
1065            Add | Sub | Mul | Div | Rem | And | Or | BitXor | BitAnd | BitOr | Shl | Shr => {
1066                Fixity::Left
1067            }
1068        }
1069    }
1070
1071    pub fn is_comparison(self) -> bool {
1072        use BinOpKind::*;
1073        match self {
1074            Eq | Ne | Lt | Le | Gt | Ge => true,
1075            Add | Sub | Mul | Div | Rem | And | Or | BitXor | BitAnd | BitOr | Shl | Shr => false,
1076        }
1077    }
1078
1079    /// Returns `true` if the binary operator takes its arguments by value.
1080    pub fn is_by_value(self) -> bool {
1081        !self.is_comparison()
1082    }
1083}
1084
1085pub type BinOp = Spanned<BinOpKind>;
1086
1087// Sometimes `BinOpKind` and `AssignOpKind` need the same treatment. The
1088// operations covered by `AssignOpKind` are a subset of those covered by
1089// `BinOpKind`, so it makes sense to convert `AssignOpKind` to `BinOpKind`.
1090impl From<AssignOpKind> for BinOpKind {
1091    fn from(op: AssignOpKind) -> BinOpKind {
1092        match op {
1093            AssignOpKind::AddAssign => BinOpKind::Add,
1094            AssignOpKind::SubAssign => BinOpKind::Sub,
1095            AssignOpKind::MulAssign => BinOpKind::Mul,
1096            AssignOpKind::DivAssign => BinOpKind::Div,
1097            AssignOpKind::RemAssign => BinOpKind::Rem,
1098            AssignOpKind::BitXorAssign => BinOpKind::BitXor,
1099            AssignOpKind::BitAndAssign => BinOpKind::BitAnd,
1100            AssignOpKind::BitOrAssign => BinOpKind::BitOr,
1101            AssignOpKind::ShlAssign => BinOpKind::Shl,
1102            AssignOpKind::ShrAssign => BinOpKind::Shr,
1103        }
1104    }
1105}
1106
1107#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for AssignOpKind { }
#[automatically_derived]
impl ::core::clone::Clone for AssignOpKind {
    #[inline]
    fn clone(&self) -> AssignOpKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for AssignOpKind { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for AssignOpKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                AssignOpKind::AddAssign => "AddAssign",
                AssignOpKind::SubAssign => "SubAssign",
                AssignOpKind::MulAssign => "MulAssign",
                AssignOpKind::DivAssign => "DivAssign",
                AssignOpKind::RemAssign => "RemAssign",
                AssignOpKind::BitXorAssign => "BitXorAssign",
                AssignOpKind::BitAndAssign => "BitAndAssign",
                AssignOpKind::BitOrAssign => "BitOrAssign",
                AssignOpKind::ShlAssign => "ShlAssign",
                AssignOpKind::ShrAssign => "ShrAssign",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for AssignOpKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for AssignOpKind {
    #[inline]
    fn eq(&self, other: &AssignOpKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for AssignOpKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        AssignOpKind::AddAssign => { 0usize }
                        AssignOpKind::SubAssign => { 1usize }
                        AssignOpKind::MulAssign => { 2usize }
                        AssignOpKind::DivAssign => { 3usize }
                        AssignOpKind::RemAssign => { 4usize }
                        AssignOpKind::BitXorAssign => { 5usize }
                        AssignOpKind::BitAndAssign => { 6usize }
                        AssignOpKind::BitOrAssign => { 7usize }
                        AssignOpKind::ShlAssign => { 8usize }
                        AssignOpKind::ShrAssign => { 9usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for AssignOpKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { AssignOpKind::AddAssign }
                    1usize => { AssignOpKind::SubAssign }
                    2usize => { AssignOpKind::MulAssign }
                    3usize => { AssignOpKind::DivAssign }
                    4usize => { AssignOpKind::RemAssign }
                    5usize => { AssignOpKind::BitXorAssign }
                    6usize => { AssignOpKind::BitAndAssign }
                    7usize => { AssignOpKind::BitOrAssign }
                    8usize => { AssignOpKind::ShlAssign }
                    9usize => { AssignOpKind::ShrAssign }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `AssignOpKind`, expected 0..10, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for AssignOpKind
            {
            #[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 {
                    AssignOpKind::AddAssign => {}
                    AssignOpKind::SubAssign => {}
                    AssignOpKind::MulAssign => {}
                    AssignOpKind::DivAssign => {}
                    AssignOpKind::RemAssign => {}
                    AssignOpKind::BitXorAssign => {}
                    AssignOpKind::BitAndAssign => {}
                    AssignOpKind::BitOrAssign => {}
                    AssignOpKind::ShlAssign => {}
                    AssignOpKind::ShrAssign => {}
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for AssignOpKind
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    AssignOpKind::AddAssign => {}
                    AssignOpKind::SubAssign => {}
                    AssignOpKind::MulAssign => {}
                    AssignOpKind::DivAssign => {}
                    AssignOpKind::RemAssign => {}
                    AssignOpKind::BitXorAssign => {}
                    AssignOpKind::BitAndAssign => {}
                    AssignOpKind::BitOrAssign => {}
                    AssignOpKind::ShlAssign => {}
                    AssignOpKind::ShrAssign => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for AssignOpKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    AssignOpKind::AddAssign => {}
                    AssignOpKind::SubAssign => {}
                    AssignOpKind::MulAssign => {}
                    AssignOpKind::DivAssign => {}
                    AssignOpKind::RemAssign => {}
                    AssignOpKind::BitXorAssign => {}
                    AssignOpKind::BitAndAssign => {}
                    AssignOpKind::BitOrAssign => {}
                    AssignOpKind::ShlAssign => {}
                    AssignOpKind::ShrAssign => {}
                }
            }
        }
    };Walkable)]
1108pub enum AssignOpKind {
1109    /// The `+=` operator (addition)
1110    AddAssign,
1111    /// The `-=` operator (subtraction)
1112    SubAssign,
1113    /// The `*=` operator (multiplication)
1114    MulAssign,
1115    /// The `/=` operator (division)
1116    DivAssign,
1117    /// The `%=` operator (modulus)
1118    RemAssign,
1119    /// The `^=` operator (bitwise xor)
1120    BitXorAssign,
1121    /// The `&=` operator (bitwise and)
1122    BitAndAssign,
1123    /// The `|=` operator (bitwise or)
1124    BitOrAssign,
1125    /// The `<<=` operator (shift left)
1126    ShlAssign,
1127    /// The `>>=` operator (shift right)
1128    ShrAssign,
1129}
1130
1131impl AssignOpKind {
1132    pub fn as_str(&self) -> &'static str {
1133        use AssignOpKind::*;
1134        match self {
1135            AddAssign => "+=",
1136            SubAssign => "-=",
1137            MulAssign => "*=",
1138            DivAssign => "/=",
1139            RemAssign => "%=",
1140            BitXorAssign => "^=",
1141            BitAndAssign => "&=",
1142            BitOrAssign => "|=",
1143            ShlAssign => "<<=",
1144            ShrAssign => ">>=",
1145        }
1146    }
1147
1148    /// AssignOps are always by value.
1149    pub fn is_by_value(self) -> bool {
1150        true
1151    }
1152}
1153
1154pub type AssignOp = Spanned<AssignOpKind>;
1155
1156/// Unary operator.
1157///
1158/// Note that `&data` is not an operator, it's an `AddrOf` expression.
1159#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for UnOp { }
#[automatically_derived]
impl ::core::clone::Clone for UnOp {
    #[inline]
    fn clone(&self) -> UnOp { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for UnOp { }Copy, #[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::Deref => "Deref",
                UnOp::Not => "Not",
                UnOp::Neg => "Neg",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for UnOp { }
#[automatically_derived]
impl ::core::cmp::PartialEq for UnOp {
    #[inline]
    fn eq(&self, other: &UnOp) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for UnOp {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        UnOp::Deref => { 0usize }
                        UnOp::Not => { 1usize }
                        UnOp::Neg => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for UnOp {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { UnOp::Deref }
                    1usize => { UnOp::Not }
                    2usize => { UnOp::Neg }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `UnOp`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, 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::Deref => {}
                    UnOp::Not => {}
                    UnOp::Neg => {}
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for UnOp where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    UnOp::Deref => {}
                    UnOp::Not => {}
                    UnOp::Neg => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for UnOp where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    UnOp::Deref => {}
                    UnOp::Not => {}
                    UnOp::Neg => {}
                }
            }
        }
    };Walkable)]
1160pub enum UnOp {
1161    /// The `*` operator for dereferencing
1162    Deref,
1163    /// The `!` operator for logical inversion
1164    Not,
1165    /// The `-` operator for negation
1166    Neg,
1167}
1168
1169impl UnOp {
1170    pub fn as_str(&self) -> &'static str {
1171        match self {
1172            UnOp::Deref => "*",
1173            UnOp::Not => "!",
1174            UnOp::Neg => "-",
1175        }
1176    }
1177
1178    /// Returns `true` if the unary operator takes its argument by value.
1179    pub fn is_by_value(self) -> bool {
1180        #[allow(non_exhaustive_omitted_patterns)] match self {
    Self::Neg | Self::Not => true,
    _ => false,
}matches!(self, Self::Neg | Self::Not)
1181    }
1182}
1183
1184/// A statement.
1185///
1186/// No `attrs` or `tokens` fields because each `StmtKind` variant
1187/// contains an AST node with those fields. (Except for `StmtKind::Empty`,
1188/// which never has attrs or tokens)
1189#[derive(#[automatically_derived]
impl ::core::clone::Clone for Stmt {
    #[inline]
    fn clone(&self) -> Stmt {
        Stmt {
            id: ::core::clone::Clone::clone(&self.id),
            kind: ::core::clone::Clone::clone(&self.kind),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Stmt {
            fn encode(&self, __encoder: &mut __E) {
                let Stmt {
                        id: ref __binding_0,
                        kind: ref __binding_1,
                        span: 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);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Stmt {
            fn decode(__decoder: &mut __D) -> Self {
                Stmt {
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Stmt {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "Stmt", "id",
            &self.id, "kind", &self.kind, "span", &&self.span)
    }
}Debug)]
1190pub struct Stmt {
1191    pub id: NodeId,
1192    pub kind: StmtKind,
1193    pub span: Span,
1194}
1195
1196impl Stmt {
1197    pub fn has_trailing_semicolon(&self) -> bool {
1198        match &self.kind {
1199            StmtKind::Semi(_) => true,
1200            StmtKind::MacCall(mac) => #[allow(non_exhaustive_omitted_patterns)] match mac.style {
    MacStmtStyle::Semicolon => true,
    _ => false,
}matches!(mac.style, MacStmtStyle::Semicolon),
1201            _ => false,
1202        }
1203    }
1204
1205    /// Converts a parsed `Stmt` to a `Stmt` with
1206    /// a trailing semicolon.
1207    ///
1208    /// This only modifies the parsed AST struct, not the attached
1209    /// `LazyAttrTokenStream`. The parser is responsible for calling
1210    /// `ToAttrTokenStream::add_trailing_semi` when there is actually
1211    /// a semicolon in the tokenstream.
1212    pub fn add_trailing_semicolon(mut self) -> Self {
1213        self.kind = match self.kind {
1214            StmtKind::Expr(expr) => StmtKind::Semi(expr),
1215            StmtKind::MacCall(mut mac) => {
1216                mac.style = MacStmtStyle::Semicolon;
1217                StmtKind::MacCall(mac)
1218            }
1219            kind => kind,
1220        };
1221
1222        self
1223    }
1224
1225    pub fn is_item(&self) -> bool {
1226        #[allow(non_exhaustive_omitted_patterns)] match self.kind {
    StmtKind::Item(_) => true,
    _ => false,
}matches!(self.kind, StmtKind::Item(_))
1227    }
1228
1229    pub fn is_expr(&self) -> bool {
1230        #[allow(non_exhaustive_omitted_patterns)] match self.kind {
    StmtKind::Expr(_) => true,
    _ => false,
}matches!(self.kind, StmtKind::Expr(_))
1231    }
1232}
1233
1234// Adding a new variant? Please update `test_stmt` in `tests/ui/macros/stringify.rs`.
1235#[derive(#[automatically_derived]
impl ::core::clone::Clone for StmtKind {
    #[inline]
    fn clone(&self) -> StmtKind {
        match self {
            StmtKind::Let(__self_0) =>
                StmtKind::Let(::core::clone::Clone::clone(__self_0)),
            StmtKind::Item(__self_0) =>
                StmtKind::Item(::core::clone::Clone::clone(__self_0)),
            StmtKind::Expr(__self_0) =>
                StmtKind::Expr(::core::clone::Clone::clone(__self_0)),
            StmtKind::Semi(__self_0) =>
                StmtKind::Semi(::core::clone::Clone::clone(__self_0)),
            StmtKind::Empty => StmtKind::Empty,
            StmtKind::MacCall(__self_0) =>
                StmtKind::MacCall(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for StmtKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        StmtKind::Let(ref __binding_0) => { 0usize }
                        StmtKind::Item(ref __binding_0) => { 1usize }
                        StmtKind::Expr(ref __binding_0) => { 2usize }
                        StmtKind::Semi(ref __binding_0) => { 3usize }
                        StmtKind::Empty => { 4usize }
                        StmtKind::MacCall(ref __binding_0) => { 5usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    StmtKind::Let(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    StmtKind::Item(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    StmtKind::Expr(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    StmtKind::Semi(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    StmtKind::Empty => {}
                    StmtKind::MacCall(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for StmtKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        StmtKind::Let(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        StmtKind::Item(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        StmtKind::Expr(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => {
                        StmtKind::Semi(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    4usize => { StmtKind::Empty }
                    5usize => {
                        StmtKind::MacCall(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `StmtKind`, expected 0..6, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for StmtKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            StmtKind::Let(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Let",
                    &__self_0),
            StmtKind::Item(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Item",
                    &__self_0),
            StmtKind::Expr(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Expr",
                    &__self_0),
            StmtKind::Semi(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Semi",
                    &__self_0),
            StmtKind::Empty => ::core::fmt::Formatter::write_str(f, "Empty"),
            StmtKind::MacCall(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "MacCall", &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for StmtKind
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    StmtKind::Let(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    StmtKind::Item(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    StmtKind::Expr(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    StmtKind::Semi(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    StmtKind::Empty => {}
                    StmtKind::MacCall(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for StmtKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    StmtKind::Let(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    StmtKind::Item(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    StmtKind::Expr(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    StmtKind::Semi(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    StmtKind::Empty => {}
                    StmtKind::MacCall(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
1236pub enum StmtKind {
1237    /// A local (let) binding.
1238    Let(Box<Local>),
1239    /// An item definition.
1240    Item(Box<Item>),
1241    /// Expr without trailing semi-colon.
1242    Expr(Box<Expr>),
1243    /// Expr with a trailing semi-colon.
1244    Semi(Box<Expr>),
1245    /// Just a trailing semi-colon.
1246    Empty,
1247    /// Macro.
1248    MacCall(Box<MacCallStmt>),
1249}
1250
1251impl StmtKind {
1252    pub fn descr(&self) -> &'static str {
1253        match self {
1254            StmtKind::Let(_) => "local",
1255            StmtKind::Item(_) => "item",
1256            StmtKind::Expr(_) => "expression",
1257            StmtKind::Semi(_) => "statement",
1258            StmtKind::Empty => "semicolon",
1259            StmtKind::MacCall(_) => "macro call",
1260        }
1261    }
1262}
1263
1264#[derive(#[automatically_derived]
impl ::core::clone::Clone for MacCallStmt {
    #[inline]
    fn clone(&self) -> MacCallStmt {
        MacCallStmt {
            mac: ::core::clone::Clone::clone(&self.mac),
            style: ::core::clone::Clone::clone(&self.style),
            attrs: ::core::clone::Clone::clone(&self.attrs),
            tokens: ::core::clone::Clone::clone(&self.tokens),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for MacCallStmt {
            fn encode(&self, __encoder: &mut __E) {
                let MacCallStmt {
                        mac: ref __binding_0,
                        style: ref __binding_1,
                        attrs: ref __binding_2,
                        tokens: ref __binding_3 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for MacCallStmt {
            fn decode(__decoder: &mut __D) -> Self {
                MacCallStmt {
                    mac: ::rustc_serialize::Decodable::decode(__decoder),
                    style: ::rustc_serialize::Decodable::decode(__decoder),
                    attrs: ::rustc_serialize::Decodable::decode(__decoder),
                    tokens: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for MacCallStmt {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "MacCallStmt",
            "mac", &self.mac, "style", &self.style, "attrs", &self.attrs,
            "tokens", &&self.tokens)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for MacCallStmt
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    MacCallStmt {
                        mac: ref __binding_0,
                        style: ref __binding_1,
                        attrs: ref __binding_2,
                        tokens: ref __binding_3 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for MacCallStmt where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    MacCallStmt {
                        mac: ref mut __binding_0,
                        style: ref mut __binding_1,
                        attrs: ref mut __binding_2,
                        tokens: ref mut __binding_3 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
1265pub struct MacCallStmt {
1266    pub mac: Box<MacCall>,
1267    pub style: MacStmtStyle,
1268    pub attrs: AttrVec,
1269    pub tokens: Option<LazyAttrTokenStream>,
1270}
1271
1272#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for MacStmtStyle { }
#[automatically_derived]
impl ::core::clone::Clone for MacStmtStyle {
    #[inline]
    fn clone(&self) -> MacStmtStyle { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for MacStmtStyle { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for MacStmtStyle { }
#[automatically_derived]
impl ::core::cmp::PartialEq for MacStmtStyle {
    #[inline]
    fn eq(&self, other: &MacStmtStyle) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for MacStmtStyle {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        MacStmtStyle::Semicolon => { 0usize }
                        MacStmtStyle::Braces => { 1usize }
                        MacStmtStyle::NoBraces => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for MacStmtStyle {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { MacStmtStyle::Semicolon }
                    1usize => { MacStmtStyle::Braces }
                    2usize => { MacStmtStyle::NoBraces }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `MacStmtStyle`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for MacStmtStyle {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                MacStmtStyle::Semicolon => "Semicolon",
                MacStmtStyle::Braces => "Braces",
                MacStmtStyle::NoBraces => "NoBraces",
            })
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for MacStmtStyle
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    MacStmtStyle::Semicolon => {}
                    MacStmtStyle::Braces => {}
                    MacStmtStyle::NoBraces => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for MacStmtStyle where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    MacStmtStyle::Semicolon => {}
                    MacStmtStyle::Braces => {}
                    MacStmtStyle::NoBraces => {}
                }
            }
        }
    };Walkable)]
1273pub enum MacStmtStyle {
1274    /// The macro statement had a trailing semicolon (e.g., `foo! { ... };`
1275    /// `foo!(...);`, `foo![...];`).
1276    Semicolon,
1277    /// The macro statement had braces (e.g., `foo! { ... }`).
1278    Braces,
1279    /// The macro statement had parentheses or brackets and no semicolon (e.g.,
1280    /// `foo!(...)`). All of these will end up being converted into macro
1281    /// expressions.
1282    NoBraces,
1283}
1284
1285/// Local represents a `let` statement, e.g., `let <pat>:<ty> = <expr>;`.
1286#[derive(#[automatically_derived]
impl ::core::clone::Clone for Local {
    #[inline]
    fn clone(&self) -> Local {
        Local {
            id: ::core::clone::Clone::clone(&self.id),
            super_: ::core::clone::Clone::clone(&self.super_),
            pat: ::core::clone::Clone::clone(&self.pat),
            ty: ::core::clone::Clone::clone(&self.ty),
            kind: ::core::clone::Clone::clone(&self.kind),
            span: ::core::clone::Clone::clone(&self.span),
            colon_sp: ::core::clone::Clone::clone(&self.colon_sp),
            attrs: ::core::clone::Clone::clone(&self.attrs),
            tokens: ::core::clone::Clone::clone(&self.tokens),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Local {
            fn encode(&self, __encoder: &mut __E) {
                let Local {
                        id: ref __binding_0,
                        super_: ref __binding_1,
                        pat: ref __binding_2,
                        ty: ref __binding_3,
                        kind: ref __binding_4,
                        span: ref __binding_5,
                        colon_sp: ref __binding_6,
                        attrs: ref __binding_7,
                        tokens: ref __binding_8 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_5,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_6,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_7,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_8,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Local {
            fn decode(__decoder: &mut __D) -> Self {
                Local {
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    super_: ::rustc_serialize::Decodable::decode(__decoder),
                    pat: ::rustc_serialize::Decodable::decode(__decoder),
                    ty: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    colon_sp: ::rustc_serialize::Decodable::decode(__decoder),
                    attrs: ::rustc_serialize::Decodable::decode(__decoder),
                    tokens: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Local {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["id", "super_", "pat", "ty", "kind", "span", "colon_sp",
                        "attrs", "tokens"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.id, &self.super_, &self.pat, &self.ty, &self.kind,
                        &self.span, &self.colon_sp, &self.attrs, &&self.tokens];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "Local", names,
            values)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Local where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Local {
                        id: ref __binding_0,
                        super_: ref __binding_1,
                        pat: ref __binding_2,
                        ty: ref __binding_3,
                        kind: ref __binding_4,
                        span: ref __binding_5,
                        colon_sp: ref __binding_6,
                        attrs: ref __binding_7,
                        tokens: ref __binding_8 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_5,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_6,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_7,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_8,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Local where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Local {
                        id: ref mut __binding_0,
                        super_: ref mut __binding_1,
                        pat: ref mut __binding_2,
                        ty: ref mut __binding_3,
                        kind: ref mut __binding_4,
                        span: ref mut __binding_5,
                        colon_sp: ref mut __binding_6,
                        attrs: ref mut __binding_7,
                        tokens: ref mut __binding_8 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_5,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_6,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_7,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_8,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
1287pub struct Local {
1288    pub id: NodeId,
1289    pub super_: Option<Span>,
1290    pub pat: Box<Pat>,
1291    pub ty: Option<Box<Ty>>,
1292    pub kind: LocalKind,
1293    pub span: Span,
1294    pub colon_sp: Option<Span>,
1295    pub attrs: AttrVec,
1296    pub tokens: Option<LazyAttrTokenStream>,
1297}
1298
1299#[derive(#[automatically_derived]
impl ::core::clone::Clone for LocalKind {
    #[inline]
    fn clone(&self) -> LocalKind {
        match self {
            LocalKind::Decl => LocalKind::Decl,
            LocalKind::Init(__self_0) =>
                LocalKind::Init(::core::clone::Clone::clone(__self_0)),
            LocalKind::InitElse(__self_0, __self_1) =>
                LocalKind::InitElse(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for LocalKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        LocalKind::Decl => { 0usize }
                        LocalKind::Init(ref __binding_0) => { 1usize }
                        LocalKind::InitElse(ref __binding_0, ref __binding_1) => {
                            2usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    LocalKind::Decl => {}
                    LocalKind::Init(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    LocalKind::InitElse(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for LocalKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { LocalKind::Decl }
                    1usize => {
                        LocalKind::Init(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        LocalKind::InitElse(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `LocalKind`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for LocalKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            LocalKind::Decl => ::core::fmt::Formatter::write_str(f, "Decl"),
            LocalKind::Init(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Init",
                    &__self_0),
            LocalKind::InitElse(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "InitElse", __self_0, &__self_1),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for LocalKind
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    LocalKind::Decl => {}
                    LocalKind::Init(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    LocalKind::InitElse(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for LocalKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    LocalKind::Decl => {}
                    LocalKind::Init(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    LocalKind::InitElse(ref mut __binding_0,
                        ref mut __binding_1) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
1300pub enum LocalKind {
1301    /// Local declaration.
1302    /// Example: `let x;`
1303    Decl,
1304    /// Local declaration with an initializer.
1305    /// Example: `let x = y;`
1306    Init(Box<Expr>),
1307    /// Local declaration with an initializer and an `else` clause.
1308    /// Example: `let Some(x) = y else { return };`
1309    InitElse(Box<Expr>, Box<Block>),
1310}
1311
1312impl LocalKind {
1313    pub fn init(&self) -> Option<&Expr> {
1314        match self {
1315            Self::Decl => None,
1316            Self::Init(i) | Self::InitElse(i, _) => Some(i),
1317        }
1318    }
1319
1320    pub fn init_else_opt(&self) -> Option<(&Expr, Option<&Block>)> {
1321        match self {
1322            Self::Decl => None,
1323            Self::Init(init) => Some((init, None)),
1324            Self::InitElse(init, els) => Some((init, Some(els))),
1325        }
1326    }
1327}
1328
1329/// An arm of a 'match'.
1330///
1331/// E.g., `0..=10 => { println!("match!") }` as in
1332///
1333/// ```
1334/// match 123 {
1335///     0..=10 => { println!("match!") },
1336///     _ => { println!("no match!") },
1337/// }
1338/// ```
1339#[derive(#[automatically_derived]
impl ::core::clone::Clone for Arm {
    #[inline]
    fn clone(&self) -> Arm {
        Arm {
            attrs: ::core::clone::Clone::clone(&self.attrs),
            pat: ::core::clone::Clone::clone(&self.pat),
            guard: ::core::clone::Clone::clone(&self.guard),
            body: ::core::clone::Clone::clone(&self.body),
            span: ::core::clone::Clone::clone(&self.span),
            id: ::core::clone::Clone::clone(&self.id),
            is_placeholder: ::core::clone::Clone::clone(&self.is_placeholder),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Arm {
            fn encode(&self, __encoder: &mut __E) {
                let Arm {
                        attrs: ref __binding_0,
                        pat: ref __binding_1,
                        guard: ref __binding_2,
                        body: ref __binding_3,
                        span: ref __binding_4,
                        id: ref __binding_5,
                        is_placeholder: ref __binding_6 } = *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);
                ::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);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Arm {
            fn decode(__decoder: &mut __D) -> Self {
                Arm {
                    attrs: ::rustc_serialize::Decodable::decode(__decoder),
                    pat: ::rustc_serialize::Decodable::decode(__decoder),
                    guard: ::rustc_serialize::Decodable::decode(__decoder),
                    body: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    is_placeholder: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Arm {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["attrs", "pat", "guard", "body", "span", "id",
                        "is_placeholder"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.attrs, &self.pat, &self.guard, &self.body, &self.span,
                        &self.id, &&self.is_placeholder];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "Arm", names,
            values)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Arm where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Arm {
                        attrs: ref __binding_0,
                        pat: ref __binding_1,
                        guard: ref __binding_2,
                        body: ref __binding_3,
                        span: ref __binding_4,
                        id: ref __binding_5,
                        is_placeholder: ref __binding_6 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_5,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_6,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Arm where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Arm {
                        attrs: ref mut __binding_0,
                        pat: ref mut __binding_1,
                        guard: ref mut __binding_2,
                        body: ref mut __binding_3,
                        span: ref mut __binding_4,
                        id: ref mut __binding_5,
                        is_placeholder: ref mut __binding_6 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_5,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_6,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
1340pub struct Arm {
1341    pub attrs: AttrVec,
1342    /// Match arm pattern, e.g. `10` in `match foo { 10 => {}, _ => {} }`.
1343    pub pat: Box<Pat>,
1344    /// Match arm guard, e.g. `n > 10` in `match foo { n if n > 10 => {}, _ => {} }`.
1345    pub guard: Option<Box<Guard>>,
1346    /// Match arm body. Omitted if the pattern is a never pattern.
1347    pub body: Option<Box<Expr>>,
1348    pub span: Span,
1349    pub id: NodeId,
1350    pub is_placeholder: bool,
1351}
1352
1353/// A single field in a struct expression, e.g. `x: value` and `y` in `Foo { x: value, y }`.
1354#[derive(#[automatically_derived]
impl ::core::clone::Clone for ExprField {
    #[inline]
    fn clone(&self) -> ExprField {
        ExprField {
            attrs: ::core::clone::Clone::clone(&self.attrs),
            id: ::core::clone::Clone::clone(&self.id),
            span: ::core::clone::Clone::clone(&self.span),
            ident: ::core::clone::Clone::clone(&self.ident),
            expr: ::core::clone::Clone::clone(&self.expr),
            is_shorthand: ::core::clone::Clone::clone(&self.is_shorthand),
            is_placeholder: ::core::clone::Clone::clone(&self.is_placeholder),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ExprField {
            fn encode(&self, __encoder: &mut __E) {
                let ExprField {
                        attrs: ref __binding_0,
                        id: ref __binding_1,
                        span: ref __binding_2,
                        ident: ref __binding_3,
                        expr: ref __binding_4,
                        is_shorthand: ref __binding_5,
                        is_placeholder: ref __binding_6 } = *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);
                ::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);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ExprField {
            fn decode(__decoder: &mut __D) -> Self {
                ExprField {
                    attrs: ::rustc_serialize::Decodable::decode(__decoder),
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    ident: ::rustc_serialize::Decodable::decode(__decoder),
                    expr: ::rustc_serialize::Decodable::decode(__decoder),
                    is_shorthand: ::rustc_serialize::Decodable::decode(__decoder),
                    is_placeholder: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ExprField {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["attrs", "id", "span", "ident", "expr", "is_shorthand",
                        "is_placeholder"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.attrs, &self.id, &self.span, &self.ident, &self.expr,
                        &self.is_shorthand, &&self.is_placeholder];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "ExprField",
            names, values)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for ExprField
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    ExprField {
                        attrs: ref __binding_0,
                        id: ref __binding_1,
                        span: ref __binding_2,
                        ident: ref __binding_3,
                        expr: ref __binding_4,
                        is_shorthand: ref __binding_5,
                        is_placeholder: ref __binding_6 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_5,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_6,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for ExprField where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    ExprField {
                        attrs: ref mut __binding_0,
                        id: ref mut __binding_1,
                        span: ref mut __binding_2,
                        ident: ref mut __binding_3,
                        expr: ref mut __binding_4,
                        is_shorthand: ref mut __binding_5,
                        is_placeholder: ref mut __binding_6 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_5,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_6,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
1355pub struct ExprField {
1356    pub attrs: AttrVec,
1357    pub id: NodeId,
1358    pub span: Span,
1359    pub ident: Ident,
1360    pub expr: Box<Expr>,
1361    pub is_shorthand: bool,
1362    pub is_placeholder: bool,
1363}
1364
1365#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for BlockCheckMode { }
#[automatically_derived]
impl ::core::clone::Clone for BlockCheckMode {
    #[inline]
    fn clone(&self) -> BlockCheckMode {
        let _: ::core::clone::AssertParamIsClone<UnsafeSource>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for BlockCheckMode { }
#[automatically_derived]
impl ::core::cmp::PartialEq for BlockCheckMode {
    #[inline]
    fn eq(&self, other: &BlockCheckMode) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (BlockCheckMode::Unsafe(__self_0),
                    BlockCheckMode::Unsafe(__arg1_0)) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for BlockCheckMode {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        BlockCheckMode::Default => { 0usize }
                        BlockCheckMode::Unsafe(ref __binding_0) => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    BlockCheckMode::Default => {}
                    BlockCheckMode::Unsafe(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for BlockCheckMode {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { BlockCheckMode::Default }
                    1usize => {
                        BlockCheckMode::Unsafe(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `BlockCheckMode`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for BlockCheckMode {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            BlockCheckMode::Default =>
                ::core::fmt::Formatter::write_str(f, "Default"),
            BlockCheckMode::Unsafe(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Unsafe",
                    &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::marker::Copy for BlockCheckMode { }Copy, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            BlockCheckMode where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    BlockCheckMode::Default => {}
                    BlockCheckMode::Unsafe(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for BlockCheckMode where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    BlockCheckMode::Default => {}
                    BlockCheckMode::Unsafe(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
1366pub enum BlockCheckMode {
1367    Default,
1368    Unsafe(UnsafeSource),
1369}
1370
1371#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for UnsafeSource { }
#[automatically_derived]
impl ::core::clone::Clone for UnsafeSource {
    #[inline]
    fn clone(&self) -> UnsafeSource { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for UnsafeSource { }
#[automatically_derived]
impl ::core::cmp::PartialEq for UnsafeSource {
    #[inline]
    fn eq(&self, other: &UnsafeSource) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for UnsafeSource {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        UnsafeSource::CompilerGenerated => { 0usize }
                        UnsafeSource::UserProvided => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for UnsafeSource {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { UnsafeSource::CompilerGenerated }
                    1usize => { UnsafeSource::UserProvided }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `UnsafeSource`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for UnsafeSource {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                UnsafeSource::CompilerGenerated => "CompilerGenerated",
                UnsafeSource::UserProvided => "UserProvided",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::Copy for UnsafeSource { }Copy, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for UnsafeSource
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    UnsafeSource::CompilerGenerated => {}
                    UnsafeSource::UserProvided => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for UnsafeSource where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    UnsafeSource::CompilerGenerated => {}
                    UnsafeSource::UserProvided => {}
                }
            }
        }
    };Walkable)]
1372pub enum UnsafeSource {
1373    CompilerGenerated,
1374    UserProvided,
1375}
1376
1377/// An anonymous constant.
1378///
1379/// A constant (expression) that's not an item or associated item,
1380/// but needs its own `DefId` for type-checking, const-eval, etc.
1381/// These are usually found nested inside types (e.g., array lengths)
1382/// or expressions (e.g., repeat counts), and also used to define
1383/// explicit discriminant values for enum variants.
1384#[derive(#[automatically_derived]
impl ::core::clone::Clone for AnonConst {
    #[inline]
    fn clone(&self) -> AnonConst {
        AnonConst {
            id: ::core::clone::Clone::clone(&self.id),
            value: ::core::clone::Clone::clone(&self.value),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for AnonConst {
            fn encode(&self, __encoder: &mut __E) {
                let AnonConst { id: ref __binding_0, value: ref __binding_1
                        } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for AnonConst {
            fn decode(__decoder: &mut __D) -> Self {
                AnonConst {
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    value: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for AnonConst {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "AnonConst",
            "id", &self.id, "value", &&self.value)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for AnonConst
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    AnonConst { id: ref __binding_0, value: ref __binding_1 } =>
                        {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for AnonConst where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    AnonConst {
                        id: ref mut __binding_0, value: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
1385pub struct AnonConst {
1386    pub id: NodeId,
1387    pub value: Box<Expr>,
1388}
1389
1390/// An expression.
1391#[derive(#[automatically_derived]
impl ::core::clone::Clone for Expr {
    #[inline]
    fn clone(&self) -> Expr {
        Expr {
            id: ::core::clone::Clone::clone(&self.id),
            kind: ::core::clone::Clone::clone(&self.kind),
            span: ::core::clone::Clone::clone(&self.span),
            attrs: ::core::clone::Clone::clone(&self.attrs),
            tokens: ::core::clone::Clone::clone(&self.tokens),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Expr {
            fn encode(&self, __encoder: &mut __E) {
                let Expr {
                        id: ref __binding_0,
                        kind: ref __binding_1,
                        span: ref __binding_2,
                        attrs: ref __binding_3,
                        tokens: ref __binding_4 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Expr {
            fn decode(__decoder: &mut __D) -> Self {
                Expr {
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    attrs: ::rustc_serialize::Decodable::decode(__decoder),
                    tokens: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Expr {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f, "Expr", "id",
            &self.id, "kind", &self.kind, "span", &self.span, "attrs",
            &self.attrs, "tokens", &&self.tokens)
    }
}Debug)]
1392pub struct Expr {
1393    pub id: NodeId,
1394    pub kind: ExprKind,
1395    pub span: Span,
1396    pub attrs: AttrVec,
1397    pub tokens: Option<LazyAttrTokenStream>,
1398}
1399
1400impl Expr {
1401    /// Check if this expression is potentially a trivial const arg, i.e., one that can _potentially_
1402    /// be represented without an anon const in the HIR.
1403    ///
1404    /// This will unwrap at most one block level (curly braces). After that, if the expression
1405    /// is a path, it mostly dispatches to [`Path::is_single_argless_ident`].
1406    ///
1407    /// This function will only allow paths with no qself, before dispatching to the `Path`
1408    /// function of the same name.
1409    ///
1410    /// Does not ensure that the path resolves to a const param/item, the caller should check this.
1411    /// This also does not consider macros, so it's only correct after macro-expansion.
1412    pub fn is_potential_trivial_const_arg(&self) -> bool {
1413        let this = self.maybe_unwrap_block();
1414        if let ExprKind::Path(None, path) = &this.kind
1415            && path.is_single_argless_ident()
1416        {
1417            true
1418        } else {
1419            false
1420        }
1421    }
1422
1423    /// Returns an expression with (when possible) *one* outer brace removed
1424    pub fn maybe_unwrap_block(&self) -> &Expr {
1425        if let ExprKind::Block(block, None) = &self.kind
1426            && let [stmt] = block.stmts.as_slice()
1427            && let StmtKind::Expr(expr) = &stmt.kind
1428        {
1429            expr
1430        } else {
1431            self
1432        }
1433    }
1434
1435    /// Determines whether this expression is a macro call optionally wrapped in braces . If
1436    /// `already_stripped_block` is set then we do not attempt to peel off a layer of braces.
1437    ///
1438    /// Returns the [`NodeId`] of the macro call and whether a layer of braces has been peeled
1439    /// either before, or part of, this function.
1440    pub fn optionally_braced_mac_call(
1441        &self,
1442        already_stripped_block: bool,
1443    ) -> Option<(bool, NodeId)> {
1444        match &self.kind {
1445            ExprKind::Block(block, None)
1446                if let [stmt] = &*block.stmts
1447                    && !already_stripped_block =>
1448            {
1449                match &stmt.kind {
1450                    StmtKind::MacCall(_) => Some((true, stmt.id)),
1451                    StmtKind::Expr(expr) if let ExprKind::MacCall(_) = &expr.kind => {
1452                        Some((true, expr.id))
1453                    }
1454                    _ => None,
1455                }
1456            }
1457            ExprKind::MacCall(_) => Some((already_stripped_block, self.id)),
1458            _ => None,
1459        }
1460    }
1461
1462    pub fn to_bound(&self) -> Option<GenericBound> {
1463        match &self.kind {
1464            ExprKind::Path(None, path) => Some(GenericBound::Trait(PolyTraitRef::new(
1465                ThinVec::new(),
1466                path.clone(),
1467                TraitBoundModifiers::NONE,
1468                self.span,
1469                Parens::No,
1470            ))),
1471            _ => None,
1472        }
1473    }
1474
1475    pub fn peel_parens(&self) -> &Expr {
1476        let mut expr = self;
1477        while let ExprKind::Paren(inner) = &expr.kind {
1478            expr = inner;
1479        }
1480        expr
1481    }
1482
1483    pub fn peel_parens_and_refs(&self) -> &Expr {
1484        let mut expr = self;
1485        while let ExprKind::Paren(inner) | ExprKind::AddrOf(BorrowKind::Ref, _, inner) = &expr.kind
1486        {
1487            expr = inner;
1488        }
1489        expr
1490    }
1491
1492    /// Attempts to reparse as `Ty` (for diagnostic purposes).
1493    pub fn to_ty(&self) -> Option<Box<Ty>> {
1494        let kind = match &self.kind {
1495            // Trivial conversions.
1496            ExprKind::Path(qself, path) => TyKind::Path(qself.clone(), path.clone()),
1497            ExprKind::MacCall(mac) => TyKind::MacCall(mac.clone()),
1498
1499            ExprKind::Paren(expr) => expr.to_ty().map(TyKind::Paren)?,
1500
1501            ExprKind::AddrOf(BorrowKind::Ref, mutbl, expr) => {
1502                expr.to_ty().map(|ty| TyKind::Ref(None, MutTy { ty, mutbl: *mutbl }))?
1503            }
1504
1505            ExprKind::Repeat(expr, expr_len) => {
1506                expr.to_ty().map(|ty| TyKind::Array(ty, expr_len.clone()))?
1507            }
1508
1509            ExprKind::Array(exprs) if let [expr] = exprs.as_slice() => {
1510                expr.to_ty().map(TyKind::Slice)?
1511            }
1512
1513            ExprKind::Tup(exprs) => {
1514                let tys = exprs.iter().map(|expr| expr.to_ty()).collect::<Option<ThinVec<_>>>()?;
1515                TyKind::Tup(tys)
1516            }
1517
1518            // If binary operator is `Add` and both `lhs` and `rhs` are trait bounds,
1519            // then type of result is trait object.
1520            // Otherwise we don't assume the result type.
1521            ExprKind::Binary(binop, lhs, rhs) if binop.node == BinOpKind::Add => {
1522                let (Some(lhs), Some(rhs)) = (lhs.to_bound(), rhs.to_bound()) else {
1523                    return None;
1524                };
1525                TyKind::TraitObject({
    let len = [(), ()].len();
    let mut vec = ::thin_vec::ThinVec::with_capacity(len);
    vec.push(lhs);
    vec.push(rhs);
    vec
}thin_vec![lhs, rhs], TraitObjectSyntax::None)
1526            }
1527
1528            ExprKind::Underscore => TyKind::Infer,
1529
1530            // This expression doesn't look like a type syntactically.
1531            _ => return None,
1532        };
1533
1534        Some(Box::new(Ty { kind, id: self.id, span: self.span }))
1535    }
1536
1537    pub fn precedence(&self) -> ExprPrecedence {
1538        fn prefix_attrs_precedence(attrs: &AttrVec) -> ExprPrecedence {
1539            for attr in attrs {
1540                if let AttrStyle::Outer = attr.style {
1541                    return ExprPrecedence::Prefix;
1542                }
1543            }
1544            ExprPrecedence::Unambiguous
1545        }
1546
1547        match &self.kind {
1548            ExprKind::Closure(closure) => match closure.fn_decl.output {
1549                FnRetTy::Default(_) => ExprPrecedence::Jump,
1550                FnRetTy::Ty(_) => prefix_attrs_precedence(&self.attrs),
1551            },
1552
1553            ExprKind::Break(_ /*label*/, value)
1554            | ExprKind::Ret(value)
1555            | ExprKind::Yield(YieldKind::Prefix(value))
1556            | ExprKind::Yeet(value) => match value {
1557                Some(_) => ExprPrecedence::Jump,
1558                None => prefix_attrs_precedence(&self.attrs),
1559            },
1560
1561            ExprKind::Become(_) => ExprPrecedence::Jump,
1562
1563            // `Range` claims to have higher precedence than `Assign`, but `x .. x = x` fails to
1564            // parse, instead of parsing as `(x .. x) = x`. Giving `Range` a lower precedence
1565            // ensures that `pprust` will add parentheses in the right places to get the desired
1566            // parse.
1567            ExprKind::Range(..) => ExprPrecedence::Range,
1568
1569            // Binop-like expr kinds, handled by `AssocOp`.
1570            ExprKind::Binary(op, ..) => op.node.precedence(),
1571            ExprKind::Cast(..) => ExprPrecedence::Cast,
1572
1573            ExprKind::Assign(..) | ExprKind::AssignOp(..) => ExprPrecedence::Assign,
1574
1575            // Unary, prefix
1576            ExprKind::AddrOf(..) => ExprPrecedence::Prefix,
1577
1578            // Here `let pats = expr` has `let pats =` as a "unary" prefix of `expr`.
1579            // However, this is not exactly right. When `let _ = a` is the LHS of a binop we
1580            // need parens sometimes. E.g. we can print `(let _ = a) && b` as `let _ = a && b`
1581            // but we need to print `(let _ = a) < b` as-is with parens.
1582            ExprKind::Let(..) | ExprKind::Move(..) | ExprKind::Unary(..) => ExprPrecedence::Prefix,
1583
1584            // Need parens if and only if there are prefix attributes.
1585            ExprKind::Array(_)
1586            | ExprKind::Await(..)
1587            | ExprKind::Use(..)
1588            | ExprKind::Block(..)
1589            | ExprKind::Call(..)
1590            | ExprKind::ConstBlock(_)
1591            | ExprKind::Continue(..)
1592            | ExprKind::Field(..)
1593            | ExprKind::ForLoop { .. }
1594            | ExprKind::FormatArgs(..)
1595            | ExprKind::Gen(..)
1596            | ExprKind::If(..)
1597            | ExprKind::IncludedBytes(..)
1598            | ExprKind::Index(..)
1599            | ExprKind::InlineAsm(..)
1600            | ExprKind::Lit(_)
1601            | ExprKind::Loop(..)
1602            | ExprKind::MacCall(..)
1603            | ExprKind::Match(..)
1604            | ExprKind::MethodCall(..)
1605            | ExprKind::OffsetOf(..)
1606            | ExprKind::Paren(..)
1607            | ExprKind::Path(..)
1608            | ExprKind::Repeat(..)
1609            | ExprKind::Struct(..)
1610            | ExprKind::Try(..)
1611            | ExprKind::TryBlock(..)
1612            | ExprKind::Tup(_)
1613            | ExprKind::Type(..)
1614            | ExprKind::Underscore
1615            | ExprKind::UnsafeBinderCast(..)
1616            | ExprKind::While(..)
1617            | ExprKind::Yield(YieldKind::Postfix(..))
1618            | ExprKind::DirectConstArg(..)
1619            | ExprKind::Err(_)
1620            | ExprKind::Dummy => prefix_attrs_precedence(&self.attrs),
1621        }
1622    }
1623
1624    /// To a first-order approximation, is this a pattern?
1625    pub fn is_approximately_pattern(&self) -> bool {
1626        #[allow(non_exhaustive_omitted_patterns)] match &self.peel_parens().kind {
    ExprKind::Array(_) | ExprKind::Call(_, _) | ExprKind::Tup(_) |
        ExprKind::Lit(_) | ExprKind::Range(_, _, _) | ExprKind::Underscore |
        ExprKind::Path(_, _) | ExprKind::Struct(_) => true,
    _ => false,
}matches!(
1627            &self.peel_parens().kind,
1628            ExprKind::Array(_)
1629                | ExprKind::Call(_, _)
1630                | ExprKind::Tup(_)
1631                | ExprKind::Lit(_)
1632                | ExprKind::Range(_, _, _)
1633                | ExprKind::Underscore
1634                | ExprKind::Path(_, _)
1635                | ExprKind::Struct(_)
1636        )
1637    }
1638
1639    /// Creates a dummy `Expr`.
1640    ///
1641    /// Should only be used when it will be replaced afterwards or as a return value when an error was encountered.
1642    pub fn dummy() -> Expr {
1643        Expr {
1644            id: DUMMY_NODE_ID,
1645            kind: ExprKind::Dummy,
1646            span: DUMMY_SP,
1647            attrs: ThinVec::new(),
1648            tokens: None,
1649        }
1650    }
1651}
1652
1653impl From<Box<Expr>> for Expr {
1654    fn from(value: Box<Expr>) -> Self {
1655        *value
1656    }
1657}
1658
1659#[derive(#[automatically_derived]
impl ::core::clone::Clone for ForLoop {
    #[inline]
    fn clone(&self) -> ForLoop {
        ForLoop {
            pat: ::core::clone::Clone::clone(&self.pat),
            iter: ::core::clone::Clone::clone(&self.iter),
            body: ::core::clone::Clone::clone(&self.body),
            label: ::core::clone::Clone::clone(&self.label),
            kind: ::core::clone::Clone::clone(&self.kind),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ForLoop {
            fn encode(&self, __encoder: &mut __E) {
                let ForLoop {
                        pat: ref __binding_0,
                        iter: ref __binding_1,
                        body: ref __binding_2,
                        label: ref __binding_3,
                        kind: ref __binding_4 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ForLoop {
            fn decode(__decoder: &mut __D) -> Self {
                ForLoop {
                    pat: ::rustc_serialize::Decodable::decode(__decoder),
                    iter: ::rustc_serialize::Decodable::decode(__decoder),
                    body: ::rustc_serialize::Decodable::decode(__decoder),
                    label: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ForLoop {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f, "ForLoop",
            "pat", &self.pat, "iter", &self.iter, "body", &self.body, "label",
            &self.label, "kind", &&self.kind)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for ForLoop
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    ForLoop {
                        pat: ref __binding_0,
                        iter: ref __binding_1,
                        body: ref __binding_2,
                        label: ref __binding_3,
                        kind: ref __binding_4 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for ForLoop where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    ForLoop {
                        pat: ref mut __binding_0,
                        iter: ref mut __binding_1,
                        body: ref mut __binding_2,
                        label: ref mut __binding_3,
                        kind: ref mut __binding_4 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
1660pub struct ForLoop {
1661    pub pat: Box<Pat>,
1662    pub iter: Box<Expr>,
1663    pub body: Box<Block>,
1664    pub label: Option<Label>,
1665    pub kind: ForLoopKind,
1666}
1667
1668#[derive(#[automatically_derived]
impl ::core::clone::Clone for Closure {
    #[inline]
    fn clone(&self) -> Closure {
        Closure {
            binder: ::core::clone::Clone::clone(&self.binder),
            capture_clause: ::core::clone::Clone::clone(&self.capture_clause),
            constness: ::core::clone::Clone::clone(&self.constness),
            coroutine_marker: ::core::clone::Clone::clone(&self.coroutine_marker),
            movability: ::core::clone::Clone::clone(&self.movability),
            fn_decl: ::core::clone::Clone::clone(&self.fn_decl),
            body: ::core::clone::Clone::clone(&self.body),
            fn_decl_span: ::core::clone::Clone::clone(&self.fn_decl_span),
            fn_arg_span: ::core::clone::Clone::clone(&self.fn_arg_span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Closure {
            fn encode(&self, __encoder: &mut __E) {
                let Closure {
                        binder: ref __binding_0,
                        capture_clause: ref __binding_1,
                        constness: ref __binding_2,
                        coroutine_marker: ref __binding_3,
                        movability: ref __binding_4,
                        fn_decl: ref __binding_5,
                        body: ref __binding_6,
                        fn_decl_span: ref __binding_7,
                        fn_arg_span: ref __binding_8 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_5,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_6,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_7,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_8,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Closure {
            fn decode(__decoder: &mut __D) -> Self {
                Closure {
                    binder: ::rustc_serialize::Decodable::decode(__decoder),
                    capture_clause: ::rustc_serialize::Decodable::decode(__decoder),
                    constness: ::rustc_serialize::Decodable::decode(__decoder),
                    coroutine_marker: ::rustc_serialize::Decodable::decode(__decoder),
                    movability: ::rustc_serialize::Decodable::decode(__decoder),
                    fn_decl: ::rustc_serialize::Decodable::decode(__decoder),
                    body: ::rustc_serialize::Decodable::decode(__decoder),
                    fn_decl_span: ::rustc_serialize::Decodable::decode(__decoder),
                    fn_arg_span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Closure {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["binder", "capture_clause", "constness", "coroutine_marker",
                        "movability", "fn_decl", "body", "fn_decl_span",
                        "fn_arg_span"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.binder, &self.capture_clause, &self.constness,
                        &self.coroutine_marker, &self.movability, &self.fn_decl,
                        &self.body, &self.fn_decl_span, &&self.fn_arg_span];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "Closure",
            names, values)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Closure
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Closure {
                        binder: ref __binding_0,
                        capture_clause: ref __binding_1,
                        constness: ref __binding_2,
                        coroutine_marker: ref __binding_3,
                        movability: ref __binding_4,
                        fn_decl: ref __binding_5,
                        body: ref __binding_6,
                        fn_decl_span: ref __binding_7,
                        fn_arg_span: ref __binding_8 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_5,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_6,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_7,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_8,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Closure where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Closure {
                        binder: ref mut __binding_0,
                        capture_clause: ref mut __binding_1,
                        constness: ref mut __binding_2,
                        coroutine_marker: ref mut __binding_3,
                        movability: ref mut __binding_4,
                        fn_decl: ref mut __binding_5,
                        body: ref mut __binding_6,
                        fn_decl_span: ref mut __binding_7,
                        fn_arg_span: ref mut __binding_8 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_5,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_6,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_7,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_8,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
1669pub struct Closure {
1670    pub binder: ClosureBinder,
1671    pub capture_clause: CaptureBy,
1672    pub constness: Const,
1673    pub coroutine_marker: Option<CoroutineMarker>,
1674    pub movability: Movability,
1675    pub fn_decl: Box<FnDecl>,
1676    pub body: Box<Expr>,
1677    /// The span of the declaration block: 'move |...| -> ...'
1678    pub fn_decl_span: Span,
1679    /// The span of the argument block `|...|`
1680    pub fn_arg_span: Span,
1681}
1682
1683/// Limit types of a range (inclusive or exclusive).
1684#[derive(#[automatically_derived]
impl ::core::marker::Copy for RangeLimits { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for RangeLimits { }
#[automatically_derived]
impl ::core::clone::Clone for RangeLimits {
    #[inline]
    fn clone(&self) -> RangeLimits { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for RangeLimits { }
#[automatically_derived]
impl ::core::cmp::PartialEq for RangeLimits {
    #[inline]
    fn eq(&self, other: &RangeLimits) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for RangeLimits {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        RangeLimits::HalfOpen => { 0usize }
                        RangeLimits::Closed => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for RangeLimits {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { RangeLimits::HalfOpen }
                    1usize => { RangeLimits::Closed }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `RangeLimits`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for RangeLimits {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                RangeLimits::HalfOpen => "HalfOpen",
                RangeLimits::Closed => "Closed",
            })
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for RangeLimits
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    RangeLimits::HalfOpen => {}
                    RangeLimits::Closed => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for RangeLimits where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    RangeLimits::HalfOpen => {}
                    RangeLimits::Closed => {}
                }
            }
        }
    };Walkable)]
1685pub enum RangeLimits {
1686    /// Inclusive at the beginning, exclusive at the end.
1687    HalfOpen,
1688    /// Inclusive at the beginning and end.
1689    Closed,
1690}
1691
1692impl RangeLimits {
1693    pub fn as_str(&self) -> &'static str {
1694        match self {
1695            RangeLimits::HalfOpen => "..",
1696            RangeLimits::Closed => "..=",
1697        }
1698    }
1699}
1700
1701/// A method call (e.g. `x.foo::<Bar, Baz>(a, b, c)`).
1702#[derive(#[automatically_derived]
impl ::core::clone::Clone for MethodCall {
    #[inline]
    fn clone(&self) -> MethodCall {
        MethodCall {
            seg: ::core::clone::Clone::clone(&self.seg),
            receiver: ::core::clone::Clone::clone(&self.receiver),
            args: ::core::clone::Clone::clone(&self.args),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for MethodCall {
            fn encode(&self, __encoder: &mut __E) {
                let MethodCall {
                        seg: ref __binding_0,
                        receiver: ref __binding_1,
                        args: ref __binding_2,
                        span: ref __binding_3 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for MethodCall {
            fn decode(__decoder: &mut __D) -> Self {
                MethodCall {
                    seg: ::rustc_serialize::Decodable::decode(__decoder),
                    receiver: ::rustc_serialize::Decodable::decode(__decoder),
                    args: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for MethodCall {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "MethodCall",
            "seg", &self.seg, "receiver", &self.receiver, "args", &self.args,
            "span", &&self.span)
    }
}Debug)]
1703pub struct MethodCall {
1704    /// The method name and its generic arguments, e.g. `foo::<Bar, Baz>`.
1705    pub seg: PathSegment,
1706    /// The receiver, e.g. `x`.
1707    pub receiver: Box<Expr>,
1708    /// The arguments, e.g. `a, b, c`.
1709    pub args: ThinVec<Box<Expr>>,
1710    /// The span of the function, without the dot and receiver e.g. `foo::<Bar,
1711    /// Baz>(a, b, c)`.
1712    pub span: Span,
1713}
1714
1715#[derive(#[automatically_derived]
impl ::core::clone::Clone for StructRest {
    #[inline]
    fn clone(&self) -> StructRest {
        match self {
            StructRest::Base(__self_0) =>
                StructRest::Base(::core::clone::Clone::clone(__self_0)),
            StructRest::Rest(__self_0) =>
                StructRest::Rest(::core::clone::Clone::clone(__self_0)),
            StructRest::None => StructRest::None,
            StructRest::NoneWithError(__self_0) =>
                StructRest::NoneWithError(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for StructRest {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        StructRest::Base(ref __binding_0) => { 0usize }
                        StructRest::Rest(ref __binding_0) => { 1usize }
                        StructRest::None => { 2usize }
                        StructRest::NoneWithError(ref __binding_0) => { 3usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    StructRest::Base(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    StructRest::Rest(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    StructRest::None => {}
                    StructRest::NoneWithError(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for StructRest {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        StructRest::Base(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        StructRest::Rest(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => { StructRest::None }
                    3usize => {
                        StructRest::NoneWithError(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `StructRest`, expected 0..4, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for StructRest {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            StructRest::Base(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Base",
                    &__self_0),
            StructRest::Rest(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Rest",
                    &__self_0),
            StructRest::None => ::core::fmt::Formatter::write_str(f, "None"),
            StructRest::NoneWithError(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "NoneWithError", &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for StructRest
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    StructRest::Base(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    StructRest::Rest(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    StructRest::None => {}
                    StructRest::NoneWithError(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for StructRest where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    StructRest::Base(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    StructRest::Rest(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    StructRest::None => {}
                    StructRest::NoneWithError(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
1716pub enum StructRest {
1717    /// `..x`.
1718    Base(Box<Expr>),
1719    /// `..`.
1720    Rest(Span),
1721    /// No trailing `..` or expression.
1722    None,
1723    /// No trailing `..` or expression, and also, a parse error occurred inside the struct braces.
1724    ///
1725    /// This struct should be treated similarly to as if it had an `..` in it,
1726    /// in particular rather than reporting missing fields, because the parse error
1727    /// makes which fields the struct was intended to have not fully known.
1728    NoneWithError(ErrorGuaranteed),
1729}
1730
1731#[derive(#[automatically_derived]
impl ::core::clone::Clone for StructExpr {
    #[inline]
    fn clone(&self) -> StructExpr {
        StructExpr {
            qself: ::core::clone::Clone::clone(&self.qself),
            path: ::core::clone::Clone::clone(&self.path),
            fields: ::core::clone::Clone::clone(&self.fields),
            rest: ::core::clone::Clone::clone(&self.rest),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for StructExpr {
            fn encode(&self, __encoder: &mut __E) {
                let StructExpr {
                        qself: ref __binding_0,
                        path: ref __binding_1,
                        fields: ref __binding_2,
                        rest: ref __binding_3 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for StructExpr {
            fn decode(__decoder: &mut __D) -> Self {
                StructExpr {
                    qself: ::rustc_serialize::Decodable::decode(__decoder),
                    path: ::rustc_serialize::Decodable::decode(__decoder),
                    fields: ::rustc_serialize::Decodable::decode(__decoder),
                    rest: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for StructExpr {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "StructExpr",
            "qself", &self.qself, "path", &self.path, "fields", &self.fields,
            "rest", &&self.rest)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for StructExpr
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    StructExpr {
                        qself: ref __binding_0,
                        path: ref __binding_1,
                        fields: ref __binding_2,
                        rest: ref __binding_3 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for StructExpr where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    StructExpr {
                        qself: ref mut __binding_0,
                        path: ref mut __binding_1,
                        fields: ref mut __binding_2,
                        rest: ref mut __binding_3 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
1732pub struct StructExpr {
1733    pub qself: Option<Box<QSelf>>,
1734    pub path: Path,
1735    pub fields: ThinVec<ExprField>,
1736    pub rest: StructRest,
1737}
1738
1739// Adding a new variant? Please update `test_expr` in `tests/ui/macros/stringify.rs`.
1740#[derive(#[automatically_derived]
impl ::core::clone::Clone for ExprKind {
    #[inline]
    fn clone(&self) -> ExprKind {
        match self {
            ExprKind::Array(__self_0) =>
                ExprKind::Array(::core::clone::Clone::clone(__self_0)),
            ExprKind::ConstBlock(__self_0) =>
                ExprKind::ConstBlock(::core::clone::Clone::clone(__self_0)),
            ExprKind::Call(__self_0, __self_1) =>
                ExprKind::Call(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::MethodCall(__self_0) =>
                ExprKind::MethodCall(::core::clone::Clone::clone(__self_0)),
            ExprKind::Tup(__self_0) =>
                ExprKind::Tup(::core::clone::Clone::clone(__self_0)),
            ExprKind::Binary(__self_0, __self_1, __self_2) =>
                ExprKind::Binary(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ExprKind::Unary(__self_0, __self_1) =>
                ExprKind::Unary(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::Move(__self_0, __self_1) =>
                ExprKind::Move(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::Lit(__self_0) =>
                ExprKind::Lit(::core::clone::Clone::clone(__self_0)),
            ExprKind::Cast(__self_0, __self_1) =>
                ExprKind::Cast(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::Type(__self_0, __self_1) =>
                ExprKind::Type(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::Let(__self_0, __self_1, __self_2, __self_3) =>
                ExprKind::Let(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2),
                    ::core::clone::Clone::clone(__self_3)),
            ExprKind::If(__self_0, __self_1, __self_2) =>
                ExprKind::If(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ExprKind::While(__self_0, __self_1, __self_2) =>
                ExprKind::While(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ExprKind::ForLoop(__self_0) =>
                ExprKind::ForLoop(::core::clone::Clone::clone(__self_0)),
            ExprKind::Loop(__self_0, __self_1, __self_2) =>
                ExprKind::Loop(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ExprKind::Match(__self_0, __self_1, __self_2) =>
                ExprKind::Match(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ExprKind::Closure(__self_0) =>
                ExprKind::Closure(::core::clone::Clone::clone(__self_0)),
            ExprKind::Block(__self_0, __self_1) =>
                ExprKind::Block(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::Gen(__self_0, __self_1, __self_2, __self_3) =>
                ExprKind::Gen(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2),
                    ::core::clone::Clone::clone(__self_3)),
            ExprKind::Await(__self_0, __self_1) =>
                ExprKind::Await(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::Use(__self_0, __self_1) =>
                ExprKind::Use(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::TryBlock(__self_0, __self_1) =>
                ExprKind::TryBlock(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::Assign(__self_0, __self_1, __self_2) =>
                ExprKind::Assign(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ExprKind::AssignOp(__self_0, __self_1, __self_2) =>
                ExprKind::AssignOp(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ExprKind::Field(__self_0, __self_1) =>
                ExprKind::Field(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::Index(__self_0, __self_1, __self_2) =>
                ExprKind::Index(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ExprKind::Range(__self_0, __self_1, __self_2) =>
                ExprKind::Range(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ExprKind::Underscore => ExprKind::Underscore,
            ExprKind::Path(__self_0, __self_1) =>
                ExprKind::Path(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::AddrOf(__self_0, __self_1, __self_2) =>
                ExprKind::AddrOf(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ExprKind::Break(__self_0, __self_1) =>
                ExprKind::Break(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::Continue(__self_0) =>
                ExprKind::Continue(::core::clone::Clone::clone(__self_0)),
            ExprKind::Ret(__self_0) =>
                ExprKind::Ret(::core::clone::Clone::clone(__self_0)),
            ExprKind::InlineAsm(__self_0) =>
                ExprKind::InlineAsm(::core::clone::Clone::clone(__self_0)),
            ExprKind::OffsetOf(__self_0, __self_1) =>
                ExprKind::OffsetOf(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::MacCall(__self_0) =>
                ExprKind::MacCall(::core::clone::Clone::clone(__self_0)),
            ExprKind::Struct(__self_0) =>
                ExprKind::Struct(::core::clone::Clone::clone(__self_0)),
            ExprKind::Repeat(__self_0, __self_1) =>
                ExprKind::Repeat(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::Paren(__self_0) =>
                ExprKind::Paren(::core::clone::Clone::clone(__self_0)),
            ExprKind::Try(__self_0) =>
                ExprKind::Try(::core::clone::Clone::clone(__self_0)),
            ExprKind::Yield(__self_0) =>
                ExprKind::Yield(::core::clone::Clone::clone(__self_0)),
            ExprKind::Yeet(__self_0) =>
                ExprKind::Yeet(::core::clone::Clone::clone(__self_0)),
            ExprKind::Become(__self_0) =>
                ExprKind::Become(::core::clone::Clone::clone(__self_0)),
            ExprKind::IncludedBytes(__self_0) =>
                ExprKind::IncludedBytes(::core::clone::Clone::clone(__self_0)),
            ExprKind::FormatArgs(__self_0) =>
                ExprKind::FormatArgs(::core::clone::Clone::clone(__self_0)),
            ExprKind::UnsafeBinderCast(__self_0, __self_1, __self_2) =>
                ExprKind::UnsafeBinderCast(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ExprKind::DirectConstArg(__self_0) =>
                ExprKind::DirectConstArg(::core::clone::Clone::clone(__self_0)),
            ExprKind::Err(__self_0) =>
                ExprKind::Err(::core::clone::Clone::clone(__self_0)),
            ExprKind::Dummy => ExprKind::Dummy,
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ExprKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        ExprKind::Array(ref __binding_0) => { 0usize }
                        ExprKind::ConstBlock(ref __binding_0) => { 1usize }
                        ExprKind::Call(ref __binding_0, ref __binding_1) => {
                            2usize
                        }
                        ExprKind::MethodCall(ref __binding_0) => { 3usize }
                        ExprKind::Tup(ref __binding_0) => { 4usize }
                        ExprKind::Binary(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            5usize
                        }
                        ExprKind::Unary(ref __binding_0, ref __binding_1) => {
                            6usize
                        }
                        ExprKind::Move(ref __binding_0, ref __binding_1) => {
                            7usize
                        }
                        ExprKind::Lit(ref __binding_0) => { 8usize }
                        ExprKind::Cast(ref __binding_0, ref __binding_1) => {
                            9usize
                        }
                        ExprKind::Type(ref __binding_0, ref __binding_1) => {
                            10usize
                        }
                        ExprKind::Let(ref __binding_0, ref __binding_1,
                            ref __binding_2, ref __binding_3) => {
                            11usize
                        }
                        ExprKind::If(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            12usize
                        }
                        ExprKind::While(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            13usize
                        }
                        ExprKind::ForLoop(ref __binding_0) => { 14usize }
                        ExprKind::Loop(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            15usize
                        }
                        ExprKind::Match(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            16usize
                        }
                        ExprKind::Closure(ref __binding_0) => { 17usize }
                        ExprKind::Block(ref __binding_0, ref __binding_1) => {
                            18usize
                        }
                        ExprKind::Gen(ref __binding_0, ref __binding_1,
                            ref __binding_2, ref __binding_3) => {
                            19usize
                        }
                        ExprKind::Await(ref __binding_0, ref __binding_1) => {
                            20usize
                        }
                        ExprKind::Use(ref __binding_0, ref __binding_1) => {
                            21usize
                        }
                        ExprKind::TryBlock(ref __binding_0, ref __binding_1) => {
                            22usize
                        }
                        ExprKind::Assign(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            23usize
                        }
                        ExprKind::AssignOp(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            24usize
                        }
                        ExprKind::Field(ref __binding_0, ref __binding_1) => {
                            25usize
                        }
                        ExprKind::Index(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            26usize
                        }
                        ExprKind::Range(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            27usize
                        }
                        ExprKind::Underscore => { 28usize }
                        ExprKind::Path(ref __binding_0, ref __binding_1) => {
                            29usize
                        }
                        ExprKind::AddrOf(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            30usize
                        }
                        ExprKind::Break(ref __binding_0, ref __binding_1) => {
                            31usize
                        }
                        ExprKind::Continue(ref __binding_0) => { 32usize }
                        ExprKind::Ret(ref __binding_0) => { 33usize }
                        ExprKind::InlineAsm(ref __binding_0) => { 34usize }
                        ExprKind::OffsetOf(ref __binding_0, ref __binding_1) => {
                            35usize
                        }
                        ExprKind::MacCall(ref __binding_0) => { 36usize }
                        ExprKind::Struct(ref __binding_0) => { 37usize }
                        ExprKind::Repeat(ref __binding_0, ref __binding_1) => {
                            38usize
                        }
                        ExprKind::Paren(ref __binding_0) => { 39usize }
                        ExprKind::Try(ref __binding_0) => { 40usize }
                        ExprKind::Yield(ref __binding_0) => { 41usize }
                        ExprKind::Yeet(ref __binding_0) => { 42usize }
                        ExprKind::Become(ref __binding_0) => { 43usize }
                        ExprKind::IncludedBytes(ref __binding_0) => { 44usize }
                        ExprKind::FormatArgs(ref __binding_0) => { 45usize }
                        ExprKind::UnsafeBinderCast(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            46usize
                        }
                        ExprKind::DirectConstArg(ref __binding_0) => { 47usize }
                        ExprKind::Err(ref __binding_0) => { 48usize }
                        ExprKind::Dummy => { 49usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    ExprKind::Array(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::ConstBlock(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Call(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::MethodCall(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Tup(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Binary(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);
                    }
                    ExprKind::Unary(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::Move(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::Lit(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Cast(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::Type(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::Let(ref __binding_0, ref __binding_1,
                        ref __binding_2, 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);
                    }
                    ExprKind::If(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);
                    }
                    ExprKind::While(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);
                    }
                    ExprKind::ForLoop(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Loop(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);
                    }
                    ExprKind::Match(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);
                    }
                    ExprKind::Closure(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Block(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::Gen(ref __binding_0, ref __binding_1,
                        ref __binding_2, 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);
                    }
                    ExprKind::Await(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::Use(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::TryBlock(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::Assign(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);
                    }
                    ExprKind::AssignOp(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);
                    }
                    ExprKind::Field(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::Index(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);
                    }
                    ExprKind::Range(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);
                    }
                    ExprKind::Underscore => {}
                    ExprKind::Path(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::AddrOf(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);
                    }
                    ExprKind::Break(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::Continue(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Ret(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::InlineAsm(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::OffsetOf(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::MacCall(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Struct(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Repeat(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::Paren(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Try(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Yield(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Yeet(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Become(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::IncludedBytes(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::FormatArgs(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::UnsafeBinderCast(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);
                    }
                    ExprKind::DirectConstArg(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Err(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Dummy => {}
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ExprKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        ExprKind::Array(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        ExprKind::ConstBlock(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        ExprKind::Call(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => {
                        ExprKind::MethodCall(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    4usize => {
                        ExprKind::Tup(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    5usize => {
                        ExprKind::Binary(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    6usize => {
                        ExprKind::Unary(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    7usize => {
                        ExprKind::Move(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    8usize => {
                        ExprKind::Lit(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    9usize => {
                        ExprKind::Cast(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    10usize => {
                        ExprKind::Type(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    11usize => {
                        ExprKind::Let(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    12usize => {
                        ExprKind::If(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    13usize => {
                        ExprKind::While(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    14usize => {
                        ExprKind::ForLoop(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    15usize => {
                        ExprKind::Loop(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    16usize => {
                        ExprKind::Match(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    17usize => {
                        ExprKind::Closure(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    18usize => {
                        ExprKind::Block(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    19usize => {
                        ExprKind::Gen(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    20usize => {
                        ExprKind::Await(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    21usize => {
                        ExprKind::Use(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    22usize => {
                        ExprKind::TryBlock(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    23usize => {
                        ExprKind::Assign(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    24usize => {
                        ExprKind::AssignOp(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    25usize => {
                        ExprKind::Field(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    26usize => {
                        ExprKind::Index(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    27usize => {
                        ExprKind::Range(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    28usize => { ExprKind::Underscore }
                    29usize => {
                        ExprKind::Path(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    30usize => {
                        ExprKind::AddrOf(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    31usize => {
                        ExprKind::Break(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    32usize => {
                        ExprKind::Continue(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    33usize => {
                        ExprKind::Ret(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    34usize => {
                        ExprKind::InlineAsm(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    35usize => {
                        ExprKind::OffsetOf(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    36usize => {
                        ExprKind::MacCall(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    37usize => {
                        ExprKind::Struct(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    38usize => {
                        ExprKind::Repeat(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    39usize => {
                        ExprKind::Paren(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    40usize => {
                        ExprKind::Try(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    41usize => {
                        ExprKind::Yield(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    42usize => {
                        ExprKind::Yeet(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    43usize => {
                        ExprKind::Become(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    44usize => {
                        ExprKind::IncludedBytes(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    45usize => {
                        ExprKind::FormatArgs(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    46usize => {
                        ExprKind::UnsafeBinderCast(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    47usize => {
                        ExprKind::DirectConstArg(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    48usize => {
                        ExprKind::Err(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    49usize => { ExprKind::Dummy }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `ExprKind`, expected 0..50, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ExprKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            ExprKind::Array(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Array",
                    &__self_0),
            ExprKind::ConstBlock(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ConstBlock", &__self_0),
            ExprKind::Call(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Call",
                    __self_0, &__self_1),
            ExprKind::MethodCall(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "MethodCall", &__self_0),
            ExprKind::Tup(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Tup",
                    &__self_0),
            ExprKind::Binary(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Binary",
                    __self_0, __self_1, &__self_2),
            ExprKind::Unary(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Unary",
                    __self_0, &__self_1),
            ExprKind::Move(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Move",
                    __self_0, &__self_1),
            ExprKind::Lit(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Lit",
                    &__self_0),
            ExprKind::Cast(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Cast",
                    __self_0, &__self_1),
            ExprKind::Type(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Type",
                    __self_0, &__self_1),
            ExprKind::Let(__self_0, __self_1, __self_2, __self_3) =>
                ::core::fmt::Formatter::debug_tuple_field4_finish(f, "Let",
                    __self_0, __self_1, __self_2, &__self_3),
            ExprKind::If(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "If",
                    __self_0, __self_1, &__self_2),
            ExprKind::While(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "While",
                    __self_0, __self_1, &__self_2),
            ExprKind::ForLoop(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ForLoop", &__self_0),
            ExprKind::Loop(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Loop",
                    __self_0, __self_1, &__self_2),
            ExprKind::Match(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Match",
                    __self_0, __self_1, &__self_2),
            ExprKind::Closure(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Closure", &__self_0),
            ExprKind::Block(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Block",
                    __self_0, &__self_1),
            ExprKind::Gen(__self_0, __self_1, __self_2, __self_3) =>
                ::core::fmt::Formatter::debug_tuple_field4_finish(f, "Gen",
                    __self_0, __self_1, __self_2, &__self_3),
            ExprKind::Await(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Await",
                    __self_0, &__self_1),
            ExprKind::Use(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Use",
                    __self_0, &__self_1),
            ExprKind::TryBlock(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "TryBlock", __self_0, &__self_1),
            ExprKind::Assign(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Assign",
                    __self_0, __self_1, &__self_2),
            ExprKind::AssignOp(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f,
                    "AssignOp", __self_0, __self_1, &__self_2),
            ExprKind::Field(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Field",
                    __self_0, &__self_1),
            ExprKind::Index(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Index",
                    __self_0, __self_1, &__self_2),
            ExprKind::Range(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Range",
                    __self_0, __self_1, &__self_2),
            ExprKind::Underscore =>
                ::core::fmt::Formatter::write_str(f, "Underscore"),
            ExprKind::Path(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Path",
                    __self_0, &__self_1),
            ExprKind::AddrOf(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "AddrOf",
                    __self_0, __self_1, &__self_2),
            ExprKind::Break(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Break",
                    __self_0, &__self_1),
            ExprKind::Continue(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Continue", &__self_0),
            ExprKind::Ret(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Ret",
                    &__self_0),
            ExprKind::InlineAsm(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "InlineAsm", &__self_0),
            ExprKind::OffsetOf(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "OffsetOf", __self_0, &__self_1),
            ExprKind::MacCall(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "MacCall", &__self_0),
            ExprKind::Struct(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Struct",
                    &__self_0),
            ExprKind::Repeat(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Repeat",
                    __self_0, &__self_1),
            ExprKind::Paren(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Paren",
                    &__self_0),
            ExprKind::Try(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Try",
                    &__self_0),
            ExprKind::Yield(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Yield",
                    &__self_0),
            ExprKind::Yeet(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Yeet",
                    &__self_0),
            ExprKind::Become(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Become",
                    &__self_0),
            ExprKind::IncludedBytes(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "IncludedBytes", &__self_0),
            ExprKind::FormatArgs(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "FormatArgs", &__self_0),
            ExprKind::UnsafeBinderCast(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f,
                    "UnsafeBinderCast", __self_0, __self_1, &__self_2),
            ExprKind::DirectConstArg(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "DirectConstArg", &__self_0),
            ExprKind::Err(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Err",
                    &__self_0),
            ExprKind::Dummy => ::core::fmt::Formatter::write_str(f, "Dummy"),
        }
    }
}Debug)]
1741pub enum ExprKind {
1742    /// An array (e.g, `[a, b, c, d]`).
1743    Array(ThinVec<Box<Expr>>),
1744    /// Allow anonymous constants from an inline `const` block.
1745    ConstBlock(AnonConst),
1746    /// A function call.
1747    ///
1748    /// The first field resolves to the function itself,
1749    /// and the second field is the list of arguments.
1750    /// This also represents calling the constructor of
1751    /// tuple-like ADTs such as tuple structs and enum variants.
1752    Call(Box<Expr>, ThinVec<Box<Expr>>),
1753    /// A method call (e.g., `x.foo::<Bar, Baz>(a, b, c)`).
1754    MethodCall(Box<MethodCall>),
1755    /// A tuple (e.g., `(a, b, c, d)`).
1756    Tup(ThinVec<Box<Expr>>),
1757    /// A binary operation (e.g., `a + b`, `a * b`).
1758    Binary(BinOp, Box<Expr>, Box<Expr>),
1759    /// A unary operation (e.g., `!x`, `*x`).
1760    Unary(UnOp, Box<Expr>),
1761    /// A `move(expr)` expression.
1762    Move(Box<Expr>, Span),
1763    /// A literal (e.g., `1`, `"foo"`).
1764    Lit(token::Lit),
1765    /// A cast (e.g., `foo as f64`).
1766    Cast(Box<Expr>, Box<Ty>),
1767    /// A type ascription (e.g., `builtin # type_ascribe(42, usize)`).
1768    ///
1769    /// Usually not written directly in user code but
1770    /// indirectly via the macro `type_ascribe!(...)`.
1771    Type(Box<Expr>, Box<Ty>),
1772    /// A `let pat = expr` expression that is only semantically allowed in the condition
1773    /// of `if` / `while` expressions. (e.g., `if let 0 = x { .. }`).
1774    ///
1775    /// `Span` represents the whole `let pat = expr` statement.
1776    Let(Box<Pat>, Box<Expr>, Span, Recovered),
1777    /// An `if` block, with an optional `else` block.
1778    ///
1779    /// `if expr { block } else { expr }`
1780    ///
1781    /// If present, the "else" expr is always `ExprKind::Block` (for `else`) or
1782    /// `ExprKind::If` (for `else if`).
1783    If(Box<Expr>, Box<Block>, Option<Box<Expr>>),
1784    /// A while loop, with an optional label.
1785    ///
1786    /// `'label: while expr { block }`
1787    While(Box<Expr>, Box<Block>, Option<Label>),
1788    /// A `for` loop, with an optional label.
1789    ///
1790    /// `'label: for await? pat in iter { block }`
1791    ///
1792    /// This is desugared to a combination of `loop` and `match` expressions.
1793    ForLoop(Box<ForLoop>),
1794    /// Conditionless loop (can be exited with `break`, `continue`, or `return`).
1795    ///
1796    /// `'label: loop { block }`
1797    Loop(Box<Block>, Option<Label>, Span),
1798    /// A `match` block.
1799    Match(Box<Expr>, ThinVec<Arm>, MatchKind),
1800    /// A closure (e.g., `move |a, b, c| a + b + c`).
1801    Closure(Box<Closure>),
1802    /// A block (`'label: { ... }`).
1803    Block(Box<Block>, Option<Label>),
1804    /// An `async` block (`async move { ... }`),
1805    /// or a `gen` block (`gen move { ... }`).
1806    ///
1807    /// The span is the "decl", which is the header before the body `{ }`
1808    /// including the `async`/`gen` keywords and possibly `move`.
1809    Gen(CaptureBy, Box<Block>, CoroutineKind, Span),
1810    /// An await expression (`my_future.await`). Span is of await keyword.
1811    Await(Box<Expr>, Span),
1812    /// A use expression (`x.use`). Span is of use keyword.
1813    Use(Box<Expr>, Span),
1814
1815    /// A try block (`try { ... }`), if the type is `None`, or
1816    /// A try block (`try bikeshed Ty { ... }`) if the type is `Some`.
1817    ///
1818    /// Note that `try bikeshed` is a *deliberately ridiculous* placeholder
1819    /// syntax to avoid deciding what keyword or symbol should go there.
1820    /// It's that way for experimentation only; an RFC to decide the final
1821    /// semantics and syntax would be needed to put it on stabilization-track.
1822    TryBlock(Box<Block>, Option<Box<Ty>>),
1823
1824    /// An assignment (`a = foo()`).
1825    /// The `Span` argument is the span of the `=` token.
1826    Assign(Box<Expr>, Box<Expr>, Span),
1827    /// An assignment with an operator.
1828    ///
1829    /// E.g., `a += 1`.
1830    AssignOp(AssignOp, Box<Expr>, Box<Expr>),
1831    /// Access of a named (e.g., `obj.foo`) or unnamed (e.g., `obj.0`) struct field.
1832    Field(Box<Expr>, Ident),
1833    /// An indexing operation (e.g., `foo[2]`).
1834    /// The span represents the span of the `[2]`, including brackets.
1835    Index(Box<Expr>, Box<Expr>, Span),
1836    /// A range (e.g., `1..2`, `1..`, `..2`, `1..=2`, `..=2`; and `..` in destructuring assignment).
1837    Range(Option<Box<Expr>>, Option<Box<Expr>>, RangeLimits),
1838    /// An underscore, used in destructuring assignment to ignore a value.
1839    Underscore,
1840
1841    /// Variable reference, possibly containing `::` and/or type
1842    /// parameters (e.g., `foo::bar::<baz>`).
1843    ///
1844    /// Optionally "qualified" (e.g., `<Vec<T> as SomeTrait>::SomeType`).
1845    Path(Option<Box<QSelf>>, Path),
1846
1847    /// A referencing operation (`&a`, `&mut a`, `&raw const a` or `&raw mut a`).
1848    AddrOf(BorrowKind, Mutability, Box<Expr>),
1849    /// A `break`, with an optional label to break, and an optional expression.
1850    Break(Option<Label>, Option<Box<Expr>>),
1851    /// A `continue`, with an optional label.
1852    Continue(Option<Label>),
1853    /// A `return`, with an optional value to be returned.
1854    Ret(Option<Box<Expr>>),
1855
1856    /// Output of the `asm!()` macro.
1857    InlineAsm(Box<InlineAsm>),
1858
1859    /// An `offset_of` expression (e.g., `builtin # offset_of(Struct, field)`).
1860    ///
1861    /// Usually not written directly in user code but
1862    /// indirectly via the macro `core::mem::offset_of!(...)`.
1863    OffsetOf(Box<Ty>, ThinVec<Ident>),
1864
1865    /// A macro invocation; pre-expansion.
1866    MacCall(Box<MacCall>),
1867
1868    /// A struct literal expression.
1869    ///
1870    /// E.g., `Foo {x: 1, y: 2}`, or `Foo {x: 1, .. rest}`.
1871    Struct(Box<StructExpr>),
1872
1873    /// An array literal constructed from one repeated element.
1874    ///
1875    /// E.g., `[1; 5]`. The expression is the element to be
1876    /// repeated; the constant is the number of times to repeat it.
1877    Repeat(Box<Expr>, AnonConst),
1878
1879    /// No-op: used solely so we can pretty-print faithfully.
1880    Paren(Box<Expr>),
1881
1882    /// A try expression (`expr?`).
1883    Try(Box<Expr>),
1884
1885    /// A `yield`, with an optional value to be yielded.
1886    Yield(YieldKind),
1887
1888    /// A `do yeet` (aka `throw`/`fail`/`bail`/`raise`/whatever),
1889    /// with an optional value to be returned.
1890    Yeet(Option<Box<Expr>>),
1891
1892    /// A tail call return, with the value to be returned.
1893    ///
1894    /// While `.0` must be a function call, we check this later, after parsing.
1895    Become(Box<Expr>),
1896
1897    /// Bytes included via `include_bytes!`
1898    ///
1899    /// Added for optimization purposes to avoid the need to escape
1900    /// large binary blobs - should always behave like [`ExprKind::Lit`]
1901    /// with a `ByteStr` literal.
1902    ///
1903    /// The value is stored as a `ByteSymbol`. It's unfortunate that we need to
1904    /// intern (hash) the bytes because they're likely to be large and unique.
1905    /// But it's necessary because this will eventually be lowered to
1906    /// `LitKind::ByteStr`, which needs a `ByteSymbol` to impl `Copy` and avoid
1907    /// arena allocation.
1908    IncludedBytes(ByteSymbol),
1909
1910    /// A `format_args!()` expression.
1911    FormatArgs(Box<FormatArgs>),
1912
1913    UnsafeBinderCast(UnsafeBinderCastKind, Box<Expr>, Option<Box<Ty>>),
1914
1915    /// An mGCA `direct_const_arg!()` expression.
1916    DirectConstArg(Box<Expr>),
1917
1918    /// Placeholder for an expression that wasn't syntactically well formed in some way.
1919    Err(ErrorGuaranteed),
1920
1921    /// Acts as a null expression. Lowering it will always emit a bug.
1922    Dummy,
1923}
1924
1925/// Used to differentiate between `for` loops and `for await` loops.
1926#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for ForLoopKind { }
#[automatically_derived]
impl ::core::clone::Clone for ForLoopKind {
    #[inline]
    fn clone(&self) -> ForLoopKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for ForLoopKind { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ForLoopKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        ForLoopKind::For => { 0usize }
                        ForLoopKind::ForAwait => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ForLoopKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { ForLoopKind::For }
                    1usize => { ForLoopKind::ForAwait }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `ForLoopKind`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ForLoopKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                ForLoopKind::For => "For",
                ForLoopKind::ForAwait => "ForAwait",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for ForLoopKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ForLoopKind {
    #[inline]
    fn eq(&self, other: &ForLoopKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ForLoopKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for ForLoopKind
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    ForLoopKind::For => {}
                    ForLoopKind::ForAwait => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for ForLoopKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    ForLoopKind::For => {}
                    ForLoopKind::ForAwait => {}
                }
            }
        }
    };Walkable)]
1927pub enum ForLoopKind {
1928    For,
1929    ForAwait,
1930}
1931
1932#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for CoroutineKind { }
#[automatically_derived]
impl ::core::clone::Clone for CoroutineKind {
    #[inline]
    fn clone(&self) -> CoroutineKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for CoroutineKind { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for CoroutineKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        CoroutineKind::Async => { 0usize }
                        CoroutineKind::Gen => { 1usize }
                        CoroutineKind::AsyncGen => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for CoroutineKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { CoroutineKind::Async }
                    1usize => { CoroutineKind::Gen }
                    2usize => { CoroutineKind::AsyncGen }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `CoroutineKind`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for CoroutineKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                CoroutineKind::Async => "Async",
                CoroutineKind::Gen => "Gen",
                CoroutineKind::AsyncGen => "AsyncGen",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for CoroutineKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for CoroutineKind {
    #[inline]
    fn eq(&self, other: &CoroutineKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for CoroutineKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            CoroutineKind where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    CoroutineKind::Async => {}
                    CoroutineKind::Gen => {}
                    CoroutineKind::AsyncGen => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for CoroutineKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    CoroutineKind::Async => {}
                    CoroutineKind::Gen => {}
                    CoroutineKind::AsyncGen => {}
                }
            }
        }
    };Walkable)]
1933pub enum CoroutineKind {
1934    Async,
1935    Gen,
1936    AsyncGen,
1937}
1938
1939impl fmt::Display for CoroutineKind {
1940    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1941        self.as_str().fmt(f)
1942    }
1943}
1944
1945impl CoroutineKind {
1946    /// Matches `Gen` and `AsyncGen`.
1947    pub fn is_gen(&self) -> bool {
1948        match self {
1949            CoroutineKind::Async => false,
1950            CoroutineKind::Gen | CoroutineKind::AsyncGen => true,
1951        }
1952    }
1953
1954    pub fn as_str(&self) -> &'static str {
1955        match self {
1956            CoroutineKind::Async => "async",
1957            CoroutineKind::Gen => "gen",
1958            CoroutineKind::AsyncGen => "async gen",
1959        }
1960    }
1961}
1962
1963/// Whether we're unwrapping or wrapping an unsafe binder
1964#[derive(#[automatically_derived]
impl ::core::marker::Copy for UnsafeBinderCastKind { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for UnsafeBinderCastKind { }
#[automatically_derived]
impl ::core::clone::Clone for UnsafeBinderCastKind {
    #[inline]
    fn clone(&self) -> UnsafeBinderCastKind { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for UnsafeBinderCastKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                UnsafeBinderCastKind::Wrap => "Wrap",
                UnsafeBinderCastKind::Unwrap => "Unwrap",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for UnsafeBinderCastKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for UnsafeBinderCastKind {
    #[inline]
    fn eq(&self, other: &UnsafeBinderCastKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for UnsafeBinderCastKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for UnsafeBinderCastKind {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state)
    }
}Hash)]
1965#[derive(const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for UnsafeBinderCastKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        UnsafeBinderCastKind::Wrap => { 0usize }
                        UnsafeBinderCastKind::Unwrap => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for UnsafeBinderCastKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { UnsafeBinderCastKind::Wrap }
                    1usize => { UnsafeBinderCastKind::Unwrap }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `UnsafeBinderCastKind`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            UnsafeBinderCastKind {
            #[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 {
                    UnsafeBinderCastKind::Wrap => {}
                    UnsafeBinderCastKind::Unwrap => {}
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            UnsafeBinderCastKind where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    UnsafeBinderCastKind::Wrap => {}
                    UnsafeBinderCastKind::Unwrap => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for UnsafeBinderCastKind
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    UnsafeBinderCastKind::Wrap => {}
                    UnsafeBinderCastKind::Unwrap => {}
                }
            }
        }
    };Walkable)]
1966pub enum UnsafeBinderCastKind {
1967    // e.g. `&i32` -> `unsafe<'a> &'a i32`
1968    Wrap,
1969    // e.g. `unsafe<'a> &'a i32` -> `&i32`
1970    Unwrap,
1971}
1972
1973/// The explicit `Self` type in a "qualified path".
1974///
1975/// The actual path, including the trait and the associated item, is stored
1976/// separately. `position` represents the index of the associated
1977/// item qualified with this `Self` type.
1978///
1979/// ```ignore (only-for-syntax-highlight)
1980/// <Vec<T> as a::b::Trait>::AssociatedItem
1981///  ^~~~~     ~~~~~~~~~~~~~~^
1982///  ty        position = 3
1983///
1984/// <Vec<T>>::AssociatedItem
1985///  ^~~~~    ^
1986///  ty       position = 0
1987/// ```
1988#[derive(#[automatically_derived]
impl ::core::clone::Clone for QSelf {
    #[inline]
    fn clone(&self) -> QSelf {
        QSelf {
            ty: ::core::clone::Clone::clone(&self.ty),
            path_span: ::core::clone::Clone::clone(&self.path_span),
            position: ::core::clone::Clone::clone(&self.position),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for QSelf {
            fn encode(&self, __encoder: &mut __E) {
                let QSelf {
                        ty: ref __binding_0,
                        path_span: ref __binding_1,
                        position: 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);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for QSelf {
            fn decode(__decoder: &mut __D) -> Self {
                QSelf {
                    ty: ::rustc_serialize::Decodable::decode(__decoder),
                    path_span: ::rustc_serialize::Decodable::decode(__decoder),
                    position: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for QSelf {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "QSelf", "ty",
            &self.ty, "path_span", &self.path_span, "position",
            &&self.position)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for QSelf where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    QSelf {
                        ty: ref __binding_0,
                        path_span: ref __binding_1,
                        position: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for QSelf where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    QSelf {
                        ty: ref mut __binding_0,
                        path_span: ref mut __binding_1,
                        position: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
1989pub struct QSelf {
1990    pub ty: Box<Ty>,
1991
1992    /// The span of `a::b::Trait` in a path like `<Vec<T> as
1993    /// a::b::Trait>::AssociatedItem`; in the case where `position ==
1994    /// 0`, this is an empty span.
1995    pub path_span: Span,
1996    pub position: usize,
1997}
1998
1999/// A capture clause used in closures and `async` blocks.
2000#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for CaptureBy { }
#[automatically_derived]
impl ::core::clone::Clone for CaptureBy {
    #[inline]
    fn clone(&self) -> CaptureBy {
        let _: ::core::clone::AssertParamIsClone<Span>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for CaptureBy { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for CaptureBy { }
#[automatically_derived]
impl ::core::cmp::PartialEq for CaptureBy {
    #[inline]
    fn eq(&self, other: &CaptureBy) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (CaptureBy::Value { move_kw: __self_0 }, CaptureBy::Value {
                    move_kw: __arg1_0 }) => __self_0 == __arg1_0,
                (CaptureBy::Use { use_kw: __self_0 }, CaptureBy::Use {
                    use_kw: __arg1_0 }) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for CaptureBy {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        CaptureBy::Value { move_kw: ref __binding_0 } => { 0usize }
                        CaptureBy::Ref => { 1usize }
                        CaptureBy::Use { use_kw: ref __binding_0 } => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    CaptureBy::Value { move_kw: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    CaptureBy::Ref => {}
                    CaptureBy::Use { use_kw: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for CaptureBy {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        CaptureBy::Value {
                            move_kw: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    1usize => { CaptureBy::Ref }
                    2usize => {
                        CaptureBy::Use {
                            use_kw: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `CaptureBy`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for CaptureBy {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            CaptureBy::Value { move_kw: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Value",
                    "move_kw", &__self_0),
            CaptureBy::Ref => ::core::fmt::Formatter::write_str(f, "Ref"),
            CaptureBy::Use { use_kw: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Use",
                    "use_kw", &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for CaptureBy {
            #[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 {
                    CaptureBy::Value { move_kw: ref __binding_0 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    CaptureBy::Ref => {}
                    CaptureBy::Use { use_kw: ref __binding_0 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for CaptureBy
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    CaptureBy::Value { move_kw: ref __binding_0 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    CaptureBy::Ref => {}
                    CaptureBy::Use { use_kw: ref __binding_0 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for CaptureBy where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    CaptureBy::Value { move_kw: ref mut __binding_0 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    CaptureBy::Ref => {}
                    CaptureBy::Use { use_kw: ref mut __binding_0 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2001pub enum CaptureBy {
2002    /// `move |x| y + x`.
2003    Value {
2004        /// The span of the `move` keyword.
2005        move_kw: Span,
2006    },
2007    /// `move` or `use` keywords were not specified.
2008    Ref,
2009    /// `use |x| y + x`.
2010    ///
2011    /// Note that if you have a regular closure like `|| x.use`, this will *not* result
2012    /// in a `Use` capture. Instead, the `ExprUseVisitor` will look at the type
2013    /// of `x` and treat `x.use` as either a copy/clone/move as appropriate.
2014    Use {
2015        /// The span of the `use` keyword.
2016        use_kw: Span,
2017    },
2018}
2019
2020/// Closure lifetime binder, `for<'a, 'b>` in `for<'a, 'b> |_: &'a (), _: &'b ()|`.
2021#[derive(#[automatically_derived]
impl ::core::clone::Clone for ClosureBinder {
    #[inline]
    fn clone(&self) -> ClosureBinder {
        match self {
            ClosureBinder::NotPresent => ClosureBinder::NotPresent,
            ClosureBinder::For { span: __self_0, generic_params: __self_1 } =>
                ClosureBinder::For {
                    span: ::core::clone::Clone::clone(__self_0),
                    generic_params: ::core::clone::Clone::clone(__self_1),
                },
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ClosureBinder {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        ClosureBinder::NotPresent => { 0usize }
                        ClosureBinder::For {
                            span: ref __binding_0, generic_params: ref __binding_1 } =>
                            {
                            1usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    ClosureBinder::NotPresent => {}
                    ClosureBinder::For {
                        span: ref __binding_0, generic_params: ref __binding_1 } =>
                        {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ClosureBinder {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { ClosureBinder::NotPresent }
                    1usize => {
                        ClosureBinder::For {
                            span: ::rustc_serialize::Decodable::decode(__decoder),
                            generic_params: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `ClosureBinder`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ClosureBinder {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            ClosureBinder::NotPresent =>
                ::core::fmt::Formatter::write_str(f, "NotPresent"),
            ClosureBinder::For { span: __self_0, generic_params: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f, "For",
                    "span", __self_0, "generic_params", &__self_1),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            ClosureBinder where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    ClosureBinder::NotPresent => {}
                    ClosureBinder::For {
                        span: ref __binding_0, generic_params: ref __binding_1 } =>
                        {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for ClosureBinder where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    ClosureBinder::NotPresent => {}
                    ClosureBinder::For {
                        span: ref mut __binding_0,
                        generic_params: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2022pub enum ClosureBinder {
2023    /// The binder is not present, all closure lifetimes are inferred.
2024    NotPresent,
2025    /// The binder is present.
2026    For {
2027        /// Span of the whole `for<>` clause
2028        ///
2029        /// ```text
2030        /// for<'a, 'b> |_: &'a (), _: &'b ()| { ... }
2031        /// ^^^^^^^^^^^ -- this
2032        /// ```
2033        span: Span,
2034
2035        /// Lifetimes in the `for<>` closure
2036        ///
2037        /// ```text
2038        /// for<'a, 'b> |_: &'a (), _: &'b ()| { ... }
2039        ///     ^^^^^^ -- this
2040        /// ```
2041        generic_params: ThinVec<GenericParam>,
2042    },
2043}
2044
2045/// Represents a macro invocation. The `path` indicates which macro
2046/// is being invoked, and the `args` are arguments passed to it.
2047#[derive(#[automatically_derived]
impl ::core::clone::Clone for MacCall {
    #[inline]
    fn clone(&self) -> MacCall {
        MacCall {
            path: ::core::clone::Clone::clone(&self.path),
            args: ::core::clone::Clone::clone(&self.args),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for MacCall {
            fn encode(&self, __encoder: &mut __E) {
                let MacCall { path: ref __binding_0, args: ref __binding_1 } =
                    *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for MacCall {
            fn decode(__decoder: &mut __D) -> Self {
                MacCall {
                    path: ::rustc_serialize::Decodable::decode(__decoder),
                    args: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for MacCall {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "MacCall",
            "path", &self.path, "args", &&self.args)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for MacCall
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    MacCall { path: ref __binding_0, args: ref __binding_1 } =>
                        {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for MacCall where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    MacCall {
                        path: ref mut __binding_0, args: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2048pub struct MacCall {
2049    pub path: Path,
2050    pub args: Box<DelimArgs>,
2051}
2052
2053impl MacCall {
2054    pub fn span(&self) -> Span {
2055        self.path.span.to(self.args.dspan.entire())
2056    }
2057}
2058
2059/// Arguments passed to an attribute macro.
2060#[derive(#[automatically_derived]
impl ::core::clone::Clone for AttrArgs {
    #[inline]
    fn clone(&self) -> AttrArgs {
        match self {
            AttrArgs::Empty => AttrArgs::Empty,
            AttrArgs::Delimited(__self_0) =>
                AttrArgs::Delimited(::core::clone::Clone::clone(__self_0)),
            AttrArgs::Eq { eq_span: __self_0, expr: __self_1 } =>
                AttrArgs::Eq {
                    eq_span: ::core::clone::Clone::clone(__self_0),
                    expr: ::core::clone::Clone::clone(__self_1),
                },
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for AttrArgs {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        AttrArgs::Empty => { 0usize }
                        AttrArgs::Delimited(ref __binding_0) => { 1usize }
                        AttrArgs::Eq {
                            eq_span: ref __binding_0, expr: ref __binding_1 } => {
                            2usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    AttrArgs::Empty => {}
                    AttrArgs::Delimited(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AttrArgs::Eq {
                        eq_span: ref __binding_0, expr: ref __binding_1 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for AttrArgs {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { AttrArgs::Empty }
                    1usize => {
                        AttrArgs::Delimited(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        AttrArgs::Eq {
                            eq_span: ::rustc_serialize::Decodable::decode(__decoder),
                            expr: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `AttrArgs`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for AttrArgs {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            AttrArgs::Empty => ::core::fmt::Formatter::write_str(f, "Empty"),
            AttrArgs::Delimited(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Delimited", &__self_0),
            AttrArgs::Eq { eq_span: __self_0, expr: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f, "Eq",
                    "eq_span", __self_0, "expr", &__self_1),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for AttrArgs
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    AttrArgs::Empty => {}
                    AttrArgs::Delimited(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    AttrArgs::Eq {
                        eq_span: ref __binding_0, expr: ref __binding_1 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for AttrArgs where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    AttrArgs::Empty => {}
                    AttrArgs::Delimited(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    AttrArgs::Eq {
                        eq_span: ref mut __binding_0, expr: ref mut __binding_1 } =>
                        {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2061pub enum AttrArgs {
2062    /// No arguments: `#[attr]`.
2063    Empty,
2064    /// Delimited arguments: `#[attr()/[]/{}]`.
2065    Delimited(DelimArgs),
2066    /// Arguments of a key-value attribute: `#[attr = "value"]`.
2067    Eq {
2068        /// Span of the `=` token.
2069        eq_span: Span,
2070        expr: Box<Expr>,
2071    },
2072}
2073
2074impl AttrArgs {
2075    pub fn span(&self) -> Option<Span> {
2076        match self {
2077            AttrArgs::Empty => None,
2078            AttrArgs::Delimited(args) => Some(args.dspan.entire()),
2079            AttrArgs::Eq { eq_span, expr } => Some(eq_span.to(expr.span)),
2080        }
2081    }
2082
2083    /// Tokens inside the delimiters or after `=`.
2084    /// Proc macros see these tokens, for example.
2085    pub fn inner_tokens(&self) -> TokenStream {
2086        match self {
2087            AttrArgs::Empty => TokenStream::default(),
2088            AttrArgs::Delimited(args) => args.tokens.clone(),
2089            AttrArgs::Eq { expr, .. } => TokenStream::from_ast(expr),
2090        }
2091    }
2092}
2093
2094/// Delimited arguments, as used in `#[attr()/[]/{}]` or `mac!()/[]/{}`.
2095#[derive(#[automatically_derived]
impl ::core::clone::Clone for DelimArgs {
    #[inline]
    fn clone(&self) -> DelimArgs {
        DelimArgs {
            dspan: ::core::clone::Clone::clone(&self.dspan),
            delim: ::core::clone::Clone::clone(&self.delim),
            tokens: ::core::clone::Clone::clone(&self.tokens),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for DelimArgs {
            fn encode(&self, __encoder: &mut __E) {
                let DelimArgs {
                        dspan: ref __binding_0,
                        delim: ref __binding_1,
                        tokens: 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);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for DelimArgs {
            fn decode(__decoder: &mut __D) -> Self {
                DelimArgs {
                    dspan: ::rustc_serialize::Decodable::decode(__decoder),
                    delim: ::rustc_serialize::Decodable::decode(__decoder),
                    tokens: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for DelimArgs {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "DelimArgs",
            "dspan", &self.dspan, "delim", &self.delim, "tokens",
            &&self.tokens)
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for DelimArgs {
            #[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 {
                    DelimArgs {
                        dspan: ref __binding_0,
                        delim: ref __binding_1,
                        tokens: ref __binding_2 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for DelimArgs
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    DelimArgs {
                        dspan: ref __binding_0,
                        delim: ref __binding_1,
                        tokens: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for DelimArgs where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    DelimArgs {
                        dspan: ref mut __binding_0,
                        delim: ref mut __binding_1,
                        tokens: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2096pub struct DelimArgs {
2097    pub dspan: DelimSpan,
2098    pub delim: Delimiter, // Note: `Delimiter::Invisible` never occurs
2099    pub tokens: TokenStream,
2100}
2101
2102impl DelimArgs {
2103    /// Whether a macro with these arguments needs a semicolon
2104    /// when used as a standalone item or statement.
2105    pub fn need_semicolon(&self) -> bool {
2106        !#[allow(non_exhaustive_omitted_patterns)] match self {
    DelimArgs { delim: Delimiter::Brace, .. } => true,
    _ => false,
}matches!(self, DelimArgs { delim: Delimiter::Brace, .. })
2107    }
2108}
2109
2110/// Represents a macro definition.
2111#[derive(#[automatically_derived]
impl ::core::clone::Clone for MacroDef {
    #[inline]
    fn clone(&self) -> MacroDef {
        MacroDef {
            body: ::core::clone::Clone::clone(&self.body),
            macro_rules: ::core::clone::Clone::clone(&self.macro_rules),
            eii_declaration: ::core::clone::Clone::clone(&self.eii_declaration),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for MacroDef {
            fn encode(&self, __encoder: &mut __E) {
                let MacroDef {
                        body: ref __binding_0,
                        macro_rules: ref __binding_1,
                        eii_declaration: 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);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for MacroDef {
            fn decode(__decoder: &mut __D) -> Self {
                MacroDef {
                    body: ::rustc_serialize::Decodable::decode(__decoder),
                    macro_rules: ::rustc_serialize::Decodable::decode(__decoder),
                    eii_declaration: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for MacroDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "MacroDef",
            "body", &self.body, "macro_rules", &self.macro_rules,
            "eii_declaration", &&self.eii_declaration)
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for MacroDef {
            #[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 {
                    MacroDef {
                        body: ref __binding_0,
                        macro_rules: ref __binding_1,
                        eii_declaration: ref __binding_2 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for MacroDef
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    MacroDef {
                        body: ref __binding_0,
                        macro_rules: ref __binding_1,
                        eii_declaration: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for MacroDef where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    MacroDef {
                        body: ref mut __binding_0,
                        macro_rules: ref mut __binding_1,
                        eii_declaration: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2112pub struct MacroDef {
2113    pub body: Box<DelimArgs>,
2114    /// `true` if macro was defined with `macro_rules`.
2115    pub macro_rules: bool,
2116
2117    /// Corresponds to `#[eii_declaration(...)]`.
2118    /// `#[eii_declaration(...)]` is a built-in attribute macro, not a built-in attribute,
2119    /// because we require some name resolution to occur in the parameters of this attribute.
2120    /// Name resolution isn't possible in attributes otherwise, so we encode it in the AST.
2121    /// During ast lowering, we turn it back into an attribute again
2122    pub eii_declaration: Option<EiiDecl>,
2123}
2124
2125#[derive(#[automatically_derived]
impl ::core::clone::Clone for EiiDecl {
    #[inline]
    fn clone(&self) -> EiiDecl {
        EiiDecl {
            foreign_item: ::core::clone::Clone::clone(&self.foreign_item),
            impl_unsafe: ::core::clone::Clone::clone(&self.impl_unsafe),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for EiiDecl {
            fn encode(&self, __encoder: &mut __E) {
                let EiiDecl {
                        foreign_item: ref __binding_0, impl_unsafe: ref __binding_1
                        } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for EiiDecl {
            fn decode(__decoder: &mut __D) -> Self {
                EiiDecl {
                    foreign_item: ::rustc_serialize::Decodable::decode(__decoder),
                    impl_unsafe: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for EiiDecl {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "EiiDecl",
            "foreign_item", &self.foreign_item, "impl_unsafe",
            &&self.impl_unsafe)
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for EiiDecl {
            #[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 {
                    EiiDecl {
                        foreign_item: ref __binding_0, impl_unsafe: ref __binding_1
                        } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for EiiDecl
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    EiiDecl {
                        foreign_item: ref __binding_0, impl_unsafe: ref __binding_1
                        } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for EiiDecl where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    EiiDecl {
                        foreign_item: ref mut __binding_0,
                        impl_unsafe: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2126pub struct EiiDecl {
2127    /// path to the extern item we're targeting
2128    pub foreign_item: Path,
2129    pub impl_unsafe: bool,
2130}
2131
2132#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for StrStyle { }
#[automatically_derived]
impl ::core::clone::Clone for StrStyle {
    #[inline]
    fn clone(&self) -> StrStyle {
        let _: ::core::clone::AssertParamIsClone<u8>;
        *self
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for StrStyle {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        StrStyle::Cooked => { 0usize }
                        StrStyle::Raw(ref __binding_0) => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    StrStyle::Cooked => {}
                    StrStyle::Raw(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for StrStyle {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { StrStyle::Cooked }
                    1usize => {
                        StrStyle::Raw(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `StrStyle`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for StrStyle {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            StrStyle::Cooked =>
                ::core::fmt::Formatter::write_str(f, "Cooked"),
            StrStyle::Raw(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Raw",
                    &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::marker::Copy for StrStyle { }Copy, #[automatically_derived]
impl ::core::hash::Hash for StrStyle {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            StrStyle::Raw(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            _ => {}
        }
    }
}Hash, #[automatically_derived]
impl ::core::cmp::Eq for StrStyle {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<u8>;
    }
}Eq, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for StrStyle { }
#[automatically_derived]
impl ::core::cmp::PartialEq for StrStyle {
    #[inline]
    fn eq(&self, other: &StrStyle) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (StrStyle::Raw(__self_0), StrStyle::Raw(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq)]
2133#[derive(const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for StrStyle {
            #[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 {
                    StrStyle::Cooked => {}
                    StrStyle::Raw(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for StrStyle
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    StrStyle::Cooked => {}
                    StrStyle::Raw(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for StrStyle where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    StrStyle::Cooked => {}
                    StrStyle::Raw(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2134pub enum StrStyle {
2135    /// A regular string, like `"foo"`.
2136    Cooked,
2137    /// A raw string, like `r##"foo"##`.
2138    ///
2139    /// The value is the number of `#` symbols used.
2140    Raw(u8),
2141}
2142
2143/// The kind of match expression
2144#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for MatchKind { }
#[automatically_derived]
impl ::core::clone::Clone for MatchKind {
    #[inline]
    fn clone(&self) -> MatchKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for MatchKind { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for MatchKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        MatchKind::Prefix => { 0usize }
                        MatchKind::Postfix => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for MatchKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { MatchKind::Prefix }
                    1usize => { MatchKind::Postfix }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `MatchKind`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for MatchKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                MatchKind::Prefix => "Prefix",
                MatchKind::Postfix => "Postfix",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for MatchKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for MatchKind {
    #[inline]
    fn eq(&self, other: &MatchKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for MatchKind
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    MatchKind::Prefix => {}
                    MatchKind::Postfix => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for MatchKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    MatchKind::Prefix => {}
                    MatchKind::Postfix => {}
                }
            }
        }
    };Walkable)]
2145pub enum MatchKind {
2146    /// match expr { ... }
2147    Prefix,
2148    /// expr.match { ... }
2149    Postfix,
2150}
2151
2152/// The kind of yield expression
2153#[derive(#[automatically_derived]
impl ::core::clone::Clone for YieldKind {
    #[inline]
    fn clone(&self) -> YieldKind {
        match self {
            YieldKind::Prefix(__self_0) =>
                YieldKind::Prefix(::core::clone::Clone::clone(__self_0)),
            YieldKind::Postfix(__self_0) =>
                YieldKind::Postfix(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for YieldKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        YieldKind::Prefix(ref __binding_0) => { 0usize }
                        YieldKind::Postfix(ref __binding_0) => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    YieldKind::Prefix(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    YieldKind::Postfix(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for YieldKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        YieldKind::Prefix(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        YieldKind::Postfix(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `YieldKind`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for YieldKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            YieldKind::Prefix(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Prefix",
                    &__self_0),
            YieldKind::Postfix(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Postfix", &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for YieldKind
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    YieldKind::Prefix(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    YieldKind::Postfix(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for YieldKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    YieldKind::Prefix(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    YieldKind::Postfix(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2154pub enum YieldKind {
2155    /// yield expr { ... }
2156    Prefix(Option<Box<Expr>>),
2157    /// expr.yield { ... }
2158    Postfix(Box<Expr>),
2159}
2160
2161impl YieldKind {
2162    /// Returns the expression inside the yield expression, if any.
2163    ///
2164    /// For postfix yields, this is guaranteed to be `Some`.
2165    pub const fn expr(&self) -> Option<&Box<Expr>> {
2166        match self {
2167            YieldKind::Prefix(expr) => expr.as_ref(),
2168            YieldKind::Postfix(expr) => Some(expr),
2169        }
2170    }
2171
2172    /// Returns a mutable reference to the expression being yielded, if any.
2173    pub const fn expr_mut(&mut self) -> Option<&mut Box<Expr>> {
2174        match self {
2175            YieldKind::Prefix(expr) => expr.as_mut(),
2176            YieldKind::Postfix(expr) => Some(expr),
2177        }
2178    }
2179
2180    /// Returns true if both yields are prefix or both are postfix.
2181    pub const fn same_kind(&self, other: &Self) -> bool {
2182        match (self, other) {
2183            (YieldKind::Prefix(_), YieldKind::Prefix(_)) => true,
2184            (YieldKind::Postfix(_), YieldKind::Postfix(_)) => true,
2185            _ => false,
2186        }
2187    }
2188}
2189
2190/// A literal in a meta item.
2191#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for MetaItemLit { }
#[automatically_derived]
impl ::core::clone::Clone for MetaItemLit {
    #[inline]
    fn clone(&self) -> MetaItemLit {
        let _: ::core::clone::AssertParamIsClone<Symbol>;
        let _: ::core::clone::AssertParamIsClone<Option<Symbol>>;
        let _: ::core::clone::AssertParamIsClone<LitKind>;
        let _: ::core::clone::AssertParamIsClone<Span>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for MetaItemLit { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for MetaItemLit {
            fn encode(&self, __encoder: &mut __E) {
                let MetaItemLit {
                        symbol: ref __binding_0,
                        suffix: ref __binding_1,
                        kind: ref __binding_2,
                        span: ref __binding_3 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for MetaItemLit {
            fn decode(__decoder: &mut __D) -> Self {
                MetaItemLit {
                    symbol: ::rustc_serialize::Decodable::decode(__decoder),
                    suffix: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for MetaItemLit {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "MetaItemLit",
            "symbol", &self.symbol, "suffix", &self.suffix, "kind",
            &self.kind, "span", &&self.span)
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for MetaItemLit
            {
            #[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 {
                    MetaItemLit {
                        symbol: ref __binding_0,
                        suffix: ref __binding_1,
                        kind: ref __binding_2,
                        span: 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); }
                    }
                }
            }
        }
    };StableHash)]
2192pub struct MetaItemLit {
2193    /// The original literal as written in the source code.
2194    pub symbol: Symbol,
2195    /// The original suffix as written in the source code.
2196    pub suffix: Option<Symbol>,
2197    /// The "semantic" representation of the literal lowered from the original tokens.
2198    /// Strings are unescaped, hexadecimal forms are eliminated, etc.
2199    pub kind: LitKind,
2200    pub span: Span,
2201}
2202
2203/// Similar to `MetaItemLit`, but restricted to string literals.
2204#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for StrLit { }
#[automatically_derived]
impl ::core::clone::Clone for StrLit {
    #[inline]
    fn clone(&self) -> StrLit {
        let _: ::core::clone::AssertParamIsClone<Symbol>;
        let _: ::core::clone::AssertParamIsClone<Option<Symbol>>;
        let _: ::core::clone::AssertParamIsClone<StrStyle>;
        let _: ::core::clone::AssertParamIsClone<Span>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for StrLit { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for StrLit {
            fn encode(&self, __encoder: &mut __E) {
                let StrLit {
                        symbol: ref __binding_0,
                        suffix: ref __binding_1,
                        symbol_unescaped: ref __binding_2,
                        style: ref __binding_3,
                        span: ref __binding_4 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for StrLit {
            fn decode(__decoder: &mut __D) -> Self {
                StrLit {
                    symbol: ::rustc_serialize::Decodable::decode(__decoder),
                    suffix: ::rustc_serialize::Decodable::decode(__decoder),
                    symbol_unescaped: ::rustc_serialize::Decodable::decode(__decoder),
                    style: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for StrLit {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f, "StrLit",
            "symbol", &self.symbol, "suffix", &self.suffix,
            "symbol_unescaped", &self.symbol_unescaped, "style", &self.style,
            "span", &&self.span)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for StrLit where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    StrLit {
                        symbol: ref __binding_0,
                        suffix: ref __binding_1,
                        symbol_unescaped: ref __binding_2,
                        style: ref __binding_3,
                        span: ref __binding_4 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for StrLit where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    StrLit {
                        symbol: ref mut __binding_0,
                        suffix: ref mut __binding_1,
                        symbol_unescaped: ref mut __binding_2,
                        style: ref mut __binding_3,
                        span: ref mut __binding_4 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2205pub struct StrLit {
2206    /// The original literal as written in source code.
2207    pub symbol: Symbol,
2208    /// The original suffix as written in source code.
2209    pub suffix: Option<Symbol>,
2210    /// The semantic (unescaped) representation of the literal.
2211    pub symbol_unescaped: Symbol,
2212    pub style: StrStyle,
2213    pub span: Span,
2214}
2215
2216impl StrLit {
2217    pub fn as_token_lit(&self) -> token::Lit {
2218        let token_kind = match self.style {
2219            StrStyle::Cooked => token::Str,
2220            StrStyle::Raw(n) => token::StrRaw(n),
2221        };
2222        token::Lit::new(token_kind, self.symbol, self.suffix)
2223    }
2224}
2225
2226/// Type of the integer literal based on provided suffix.
2227#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for LitIntType { }
#[automatically_derived]
impl ::core::clone::Clone for LitIntType {
    #[inline]
    fn clone(&self) -> LitIntType {
        let _: ::core::clone::AssertParamIsClone<IntTy>;
        let _: ::core::clone::AssertParamIsClone<UintTy>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for LitIntType { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for LitIntType {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        LitIntType::Signed(ref __binding_0) => { 0usize }
                        LitIntType::Unsigned(ref __binding_0) => { 1usize }
                        LitIntType::Unsuffixed => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    LitIntType::Signed(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    LitIntType::Unsigned(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    LitIntType::Unsuffixed => {}
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for LitIntType {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        LitIntType::Signed(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        LitIntType::Unsigned(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => { LitIntType::Unsuffixed }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `LitIntType`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for LitIntType {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            LitIntType::Signed(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Signed",
                    &__self_0),
            LitIntType::Unsigned(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Unsigned", &__self_0),
            LitIntType::Unsuffixed =>
                ::core::fmt::Formatter::write_str(f, "Unsuffixed"),
        }
    }
}Debug, #[automatically_derived]
impl ::core::hash::Hash for LitIntType {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            LitIntType::Signed(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            LitIntType::Unsigned(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            _ => {}
        }
    }
}Hash, #[automatically_derived]
impl ::core::cmp::Eq for LitIntType {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<IntTy>;
        let _: ::core::cmp::AssertParamIsEq<UintTy>;
    }
}Eq, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for LitIntType { }
#[automatically_derived]
impl ::core::cmp::PartialEq for LitIntType {
    #[inline]
    fn eq(&self, other: &LitIntType) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (LitIntType::Signed(__self_0), LitIntType::Signed(__arg1_0))
                    => __self_0 == __arg1_0,
                (LitIntType::Unsigned(__self_0),
                    LitIntType::Unsigned(__arg1_0)) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq)]
2228#[derive(const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for LitIntType {
            #[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 {
                    LitIntType::Signed(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    LitIntType::Unsigned(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    LitIntType::Unsuffixed => {}
                }
            }
        }
    };StableHash)]
2229pub enum LitIntType {
2230    /// e.g. `42_i32`.
2231    Signed(IntTy),
2232    /// e.g. `42_u32`.
2233    Unsigned(UintTy),
2234    /// e.g. `42`.
2235    Unsuffixed,
2236}
2237
2238/// Type of the float literal based on provided suffix.
2239#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for LitFloatType { }
#[automatically_derived]
impl ::core::clone::Clone for LitFloatType {
    #[inline]
    fn clone(&self) -> LitFloatType {
        let _: ::core::clone::AssertParamIsClone<FloatTy>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for LitFloatType { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for LitFloatType {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        LitFloatType::Suffixed(ref __binding_0) => { 0usize }
                        LitFloatType::Unsuffixed => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    LitFloatType::Suffixed(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    LitFloatType::Unsuffixed => {}
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for LitFloatType {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        LitFloatType::Suffixed(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => { LitFloatType::Unsuffixed }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `LitFloatType`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for LitFloatType {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            LitFloatType::Suffixed(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Suffixed", &__self_0),
            LitFloatType::Unsuffixed =>
                ::core::fmt::Formatter::write_str(f, "Unsuffixed"),
        }
    }
}Debug, #[automatically_derived]
impl ::core::hash::Hash for LitFloatType {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            LitFloatType::Suffixed(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            _ => {}
        }
    }
}Hash, #[automatically_derived]
impl ::core::cmp::Eq for LitFloatType {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<FloatTy>;
    }
}Eq, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for LitFloatType { }
#[automatically_derived]
impl ::core::cmp::PartialEq for LitFloatType {
    #[inline]
    fn eq(&self, other: &LitFloatType) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (LitFloatType::Suffixed(__self_0),
                    LitFloatType::Suffixed(__arg1_0)) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq)]
2240#[derive(const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for LitFloatType
            {
            #[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 {
                    LitFloatType::Suffixed(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    LitFloatType::Unsuffixed => {}
                }
            }
        }
    };StableHash)]
2241pub enum LitFloatType {
2242    /// A float literal with a suffix (`1f32` or `1E10f32`).
2243    Suffixed(FloatTy),
2244    /// A float literal without a suffix (`1.0 or 1.0E10`).
2245    Unsuffixed,
2246}
2247
2248/// This type is used within both `ast::MetaItemLit` and `hir::Lit`.
2249///
2250/// Note that the entire literal (including the suffix) is considered when
2251/// deciding the `LitKind`. This means that float literals like `1f32` are
2252/// classified by this type as `Float`. This is different to `token::LitKind`
2253/// which does *not* consider the suffix.
2254#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for LitKind { }
#[automatically_derived]
impl ::core::clone::Clone for LitKind {
    #[inline]
    fn clone(&self) -> LitKind {
        let _: ::core::clone::AssertParamIsClone<Symbol>;
        let _: ::core::clone::AssertParamIsClone<StrStyle>;
        let _: ::core::clone::AssertParamIsClone<ByteSymbol>;
        let _: ::core::clone::AssertParamIsClone<u8>;
        let _: ::core::clone::AssertParamIsClone<char>;
        let _: ::core::clone::AssertParamIsClone<Pu128>;
        let _: ::core::clone::AssertParamIsClone<LitIntType>;
        let _: ::core::clone::AssertParamIsClone<LitFloatType>;
        let _: ::core::clone::AssertParamIsClone<bool>;
        let _: ::core::clone::AssertParamIsClone<ErrorGuaranteed>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for LitKind { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for LitKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        LitKind::Str(ref __binding_0, ref __binding_1) => { 0usize }
                        LitKind::ByteStr(ref __binding_0, ref __binding_1) => {
                            1usize
                        }
                        LitKind::CStr(ref __binding_0, ref __binding_1) => {
                            2usize
                        }
                        LitKind::Byte(ref __binding_0) => { 3usize }
                        LitKind::Char(ref __binding_0) => { 4usize }
                        LitKind::Int(ref __binding_0, ref __binding_1) => { 5usize }
                        LitKind::Float(ref __binding_0, ref __binding_1) => {
                            6usize
                        }
                        LitKind::Bool(ref __binding_0) => { 7usize }
                        LitKind::Err(ref __binding_0) => { 8usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    LitKind::Str(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    LitKind::ByteStr(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    LitKind::CStr(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    LitKind::Byte(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    LitKind::Char(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    LitKind::Int(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    LitKind::Float(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    LitKind::Bool(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    LitKind::Err(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for LitKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        LitKind::Str(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        LitKind::ByteStr(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        LitKind::CStr(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => {
                        LitKind::Byte(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    4usize => {
                        LitKind::Char(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    5usize => {
                        LitKind::Int(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    6usize => {
                        LitKind::Float(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    7usize => {
                        LitKind::Bool(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    8usize => {
                        LitKind::Err(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `LitKind`, expected 0..9, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for LitKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            LitKind::Str(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Str",
                    __self_0, &__self_1),
            LitKind::ByteStr(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "ByteStr", __self_0, &__self_1),
            LitKind::CStr(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "CStr",
                    __self_0, &__self_1),
            LitKind::Byte(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Byte",
                    &__self_0),
            LitKind::Char(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Char",
                    &__self_0),
            LitKind::Int(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Int",
                    __self_0, &__self_1),
            LitKind::Float(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Float",
                    __self_0, &__self_1),
            LitKind::Bool(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Bool",
                    &__self_0),
            LitKind::Err(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Err",
                    &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::hash::Hash for LitKind {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            LitKind::Str(__self_0, __self_1) => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            LitKind::ByteStr(__self_0, __self_1) => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            LitKind::CStr(__self_0, __self_1) => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            LitKind::Byte(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            LitKind::Char(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            LitKind::Int(__self_0, __self_1) => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            LitKind::Float(__self_0, __self_1) => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            LitKind::Bool(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            LitKind::Err(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
        }
    }
}Hash, #[automatically_derived]
impl ::core::cmp::Eq for LitKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Symbol>;
        let _: ::core::cmp::AssertParamIsEq<StrStyle>;
        let _: ::core::cmp::AssertParamIsEq<ByteSymbol>;
        let _: ::core::cmp::AssertParamIsEq<u8>;
        let _: ::core::cmp::AssertParamIsEq<char>;
        let _: ::core::cmp::AssertParamIsEq<Pu128>;
        let _: ::core::cmp::AssertParamIsEq<LitIntType>;
        let _: ::core::cmp::AssertParamIsEq<LitFloatType>;
        let _: ::core::cmp::AssertParamIsEq<bool>;
        let _: ::core::cmp::AssertParamIsEq<ErrorGuaranteed>;
    }
}Eq, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for LitKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for LitKind {
    #[inline]
    fn eq(&self, other: &LitKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (LitKind::Str(__self_0, __self_1),
                    LitKind::Str(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (LitKind::ByteStr(__self_0, __self_1),
                    LitKind::ByteStr(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (LitKind::CStr(__self_0, __self_1),
                    LitKind::CStr(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (LitKind::Byte(__self_0), LitKind::Byte(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (LitKind::Char(__self_0), LitKind::Char(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (LitKind::Int(__self_0, __self_1),
                    LitKind::Int(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (LitKind::Float(__self_0, __self_1),
                    LitKind::Float(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (LitKind::Bool(__self_0), LitKind::Bool(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (LitKind::Err(__self_0), LitKind::Err(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for LitKind {
            #[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 {
                    LitKind::Str(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    LitKind::ByteStr(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    LitKind::CStr(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    LitKind::Byte(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    LitKind::Char(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    LitKind::Int(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    LitKind::Float(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    LitKind::Bool(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    LitKind::Err(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
2255pub enum LitKind {
2256    /// A string literal (`"foo"`). The symbol is unescaped, and so may differ
2257    /// from the original token's symbol.
2258    Str(Symbol, StrStyle),
2259    /// A byte string (`b"foo"`). The symbol is unescaped, and so may differ
2260    /// from the original token's symbol.
2261    ByteStr(ByteSymbol, StrStyle),
2262    /// A C String (`c"foo"`). Guaranteed to only have `\0` at the end. The
2263    /// symbol is unescaped, and so may differ from the original token's
2264    /// symbol.
2265    CStr(ByteSymbol, StrStyle),
2266    /// A byte char (`b'f'`).
2267    Byte(u8),
2268    /// A character literal (`'a'`).
2269    Char(char),
2270    /// An integer literal (`1`).
2271    Int(Pu128, LitIntType),
2272    /// A float literal (`1.0`, `1f64` or `1E10f64`). The pre-suffix part is
2273    /// stored as a symbol rather than `f64` so that `LitKind` can impl `Eq`
2274    /// and `Hash`.
2275    Float(Symbol, LitFloatType),
2276    /// A boolean literal (`true`, `false`).
2277    Bool(bool),
2278    /// Placeholder for a literal that wasn't well-formed in some way.
2279    Err(ErrorGuaranteed),
2280}
2281
2282impl LitKind {
2283    pub fn str(&self) -> Option<Symbol> {
2284        match *self {
2285            LitKind::Str(s, _) => Some(s),
2286            _ => None,
2287        }
2288    }
2289
2290    /// Returns `true` if this literal is a string.
2291    pub fn is_str(&self) -> bool {
2292        #[allow(non_exhaustive_omitted_patterns)] match self {
    LitKind::Str(..) => true,
    _ => false,
}matches!(self, LitKind::Str(..))
2293    }
2294
2295    /// Returns `true` if this literal is byte literal string.
2296    pub fn is_bytestr(&self) -> bool {
2297        #[allow(non_exhaustive_omitted_patterns)] match self {
    LitKind::ByteStr(..) => true,
    _ => false,
}matches!(self, LitKind::ByteStr(..))
2298    }
2299
2300    /// Returns `true` if this is a numeric literal.
2301    pub fn is_numeric(&self) -> bool {
2302        #[allow(non_exhaustive_omitted_patterns)] match self {
    LitKind::Int(..) | LitKind::Float(..) => true,
    _ => false,
}matches!(self, LitKind::Int(..) | LitKind::Float(..))
2303    }
2304
2305    /// Returns `true` if this literal has no suffix.
2306    /// Note: this will return true for literals with prefixes such as raw strings and byte strings.
2307    pub fn is_unsuffixed(&self) -> bool {
2308        !self.is_suffixed()
2309    }
2310
2311    /// Returns `true` if this literal has a suffix.
2312    pub fn is_suffixed(&self) -> bool {
2313        match *self {
2314            // suffixed variants
2315            LitKind::Int(_, LitIntType::Signed(..) | LitIntType::Unsigned(..))
2316            | LitKind::Float(_, LitFloatType::Suffixed(..)) => true,
2317            // unsuffixed variants
2318            LitKind::Str(..)
2319            | LitKind::ByteStr(..)
2320            | LitKind::CStr(..)
2321            | LitKind::Byte(..)
2322            | LitKind::Char(..)
2323            | LitKind::Int(_, LitIntType::Unsuffixed)
2324            | LitKind::Float(_, LitFloatType::Unsuffixed)
2325            | LitKind::Bool(..)
2326            | LitKind::Err(_) => false,
2327        }
2328    }
2329}
2330
2331// N.B., If you change this, you'll probably want to change the corresponding
2332// type structure in `middle/ty.rs` as well.
2333#[derive(#[automatically_derived]
impl ::core::clone::Clone for MutTy {
    #[inline]
    fn clone(&self) -> MutTy {
        MutTy {
            ty: ::core::clone::Clone::clone(&self.ty),
            mutbl: ::core::clone::Clone::clone(&self.mutbl),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for MutTy {
            fn encode(&self, __encoder: &mut __E) {
                let MutTy { ty: ref __binding_0, mutbl: ref __binding_1 } =
                    *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for MutTy {
            fn decode(__decoder: &mut __D) -> Self {
                MutTy {
                    ty: ::rustc_serialize::Decodable::decode(__decoder),
                    mutbl: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for MutTy {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "MutTy", "ty",
            &self.ty, "mutbl", &&self.mutbl)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for MutTy where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    MutTy { ty: ref __binding_0, mutbl: ref __binding_1 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for MutTy where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    MutTy { ty: ref mut __binding_0, mutbl: ref mut __binding_1
                        } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2334pub struct MutTy {
2335    pub ty: Box<Ty>,
2336    pub mutbl: Mutability,
2337}
2338
2339/// Represents a function's signature in a trait declaration,
2340/// trait implementation, or free function.
2341#[derive(#[automatically_derived]
impl ::core::clone::Clone for FnSig {
    #[inline]
    fn clone(&self) -> FnSig {
        FnSig {
            header: ::core::clone::Clone::clone(&self.header),
            decl: ::core::clone::Clone::clone(&self.decl),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for FnSig {
            fn encode(&self, __encoder: &mut __E) {
                let FnSig {
                        header: ref __binding_0,
                        decl: ref __binding_1,
                        span: 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);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for FnSig {
            fn decode(__decoder: &mut __D) -> Self {
                FnSig {
                    header: ::rustc_serialize::Decodable::decode(__decoder),
                    decl: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for FnSig {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "FnSig",
            "header", &self.header, "decl", &self.decl, "span", &&self.span)
    }
}Debug)]
2342pub struct FnSig {
2343    pub header: FnHeader,
2344    pub decl: Box<FnDecl>,
2345    pub span: Span,
2346}
2347
2348impl FnSig {
2349    /// Return a span encompassing the header, or where to insert it if empty.
2350    pub fn header_span(&self) -> Span {
2351        self.header.span().unwrap_or(self.span.shrink_to_lo())
2352    }
2353
2354    /// The span of the header's safety, or where to insert it if empty.
2355    pub fn safety_span(&self) -> Span {
2356        match self.header.safety {
2357            Safety::Unsafe(span) | Safety::Safe(span) => span,
2358            Safety::Default => {
2359                // Insert after the `coroutine_marker` if available.
2360                if let Some(extern_span) = self.header.ext.span() {
2361                    return extern_span.shrink_to_lo();
2362                }
2363
2364                // Insert right at the front of the signature.
2365                self.header_span().shrink_to_hi()
2366            }
2367        }
2368    }
2369
2370    /// The span of the header's extern, or where to insert it if empty.
2371    pub fn extern_span(&self) -> Span {
2372        self.header.ext.span().unwrap_or(self.safety_span().shrink_to_hi())
2373    }
2374
2375    pub fn as_borrowed(&self) -> BorrowedFnSig<'_> {
2376        BorrowedFnSig { header: self.header, decl: &self.decl, span: self.span }
2377    }
2378}
2379
2380/// A borrowed version of `FnSig`, used to share logic between function declarations and function
2381/// pointer types.
2382#[derive(#[automatically_derived]
impl<'a> ::core::clone::Clone for BorrowedFnSig<'a> {
    #[inline]
    fn clone(&self) -> BorrowedFnSig<'a> {
        BorrowedFnSig {
            header: ::core::clone::Clone::clone(&self.header),
            decl: ::core::clone::Clone::clone(&self.decl),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, #[automatically_derived]
impl<'a> ::core::fmt::Debug for BorrowedFnSig<'a> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "BorrowedFnSig",
            "header", &self.header, "decl", &self.decl, "span", &&self.span)
    }
}Debug)]
2383pub struct BorrowedFnSig<'a> {
2384    pub header: FnHeader,
2385    pub decl: &'a FnDecl,
2386    pub span: Span,
2387}
2388
2389/// A constraint on an associated item.
2390///
2391/// ### Examples
2392///
2393/// * the `A = Ty` and `B = Ty` in `Trait<A = Ty, B = Ty>`
2394/// * the `G<Ty> = Ty` in `Trait<G<Ty> = Ty>`
2395/// * the `A: Bound` in `Trait<A: Bound>`
2396/// * the `RetTy` in `Trait(ArgTy, ArgTy) -> RetTy`
2397/// * the `C = { Ct }` in `Trait<C = { Ct }>` (feature `min_generic_const_args`)
2398/// * the `f(..): Bound` in `Trait<f(..): Bound>` (feature `return_type_notation`)
2399#[derive(#[automatically_derived]
impl ::core::clone::Clone for AssocItemConstraint {
    #[inline]
    fn clone(&self) -> AssocItemConstraint {
        AssocItemConstraint {
            id: ::core::clone::Clone::clone(&self.id),
            ident: ::core::clone::Clone::clone(&self.ident),
            gen_args: ::core::clone::Clone::clone(&self.gen_args),
            kind: ::core::clone::Clone::clone(&self.kind),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for AssocItemConstraint {
            fn encode(&self, __encoder: &mut __E) {
                let AssocItemConstraint {
                        id: ref __binding_0,
                        ident: ref __binding_1,
                        gen_args: ref __binding_2,
                        kind: ref __binding_3,
                        span: ref __binding_4 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for AssocItemConstraint {
            fn decode(__decoder: &mut __D) -> Self {
                AssocItemConstraint {
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    ident: ::rustc_serialize::Decodable::decode(__decoder),
                    gen_args: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for AssocItemConstraint {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f,
            "AssocItemConstraint", "id", &self.id, "ident", &self.ident,
            "gen_args", &self.gen_args, "kind", &self.kind, "span",
            &&self.span)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            AssocItemConstraint where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    AssocItemConstraint {
                        id: ref __binding_0,
                        ident: ref __binding_1,
                        gen_args: ref __binding_2,
                        kind: ref __binding_3,
                        span: ref __binding_4 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for AssocItemConstraint
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    AssocItemConstraint {
                        id: ref mut __binding_0,
                        ident: ref mut __binding_1,
                        gen_args: ref mut __binding_2,
                        kind: ref mut __binding_3,
                        span: ref mut __binding_4 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2400pub struct AssocItemConstraint {
2401    pub id: NodeId,
2402    pub ident: Ident,
2403    pub gen_args: Option<GenericArgs>,
2404    pub kind: AssocItemConstraintKind,
2405    pub span: Span,
2406}
2407
2408#[derive(#[automatically_derived]
impl ::core::clone::Clone for Term {
    #[inline]
    fn clone(&self) -> Term {
        match self {
            Term::Ty(__self_0) =>
                Term::Ty(::core::clone::Clone::clone(__self_0)),
            Term::Const(__self_0) =>
                Term::Const(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Term {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        Term::Ty(ref __binding_0) => { 0usize }
                        Term::Const(ref __binding_0) => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    Term::Ty(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    Term::Const(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Term {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        Term::Ty(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        Term::Const(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Term`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Term {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Term::Ty(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Ty",
                    &__self_0),
            Term::Const(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Const",
                    &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Term where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Term::Ty(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    Term::Const(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Term where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Term::Ty(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    Term::Const(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2409pub enum Term {
2410    Ty(Box<Ty>),
2411    Const(AnonConst),
2412}
2413
2414impl From<Box<Ty>> for Term {
2415    fn from(v: Box<Ty>) -> Self {
2416        Term::Ty(v)
2417    }
2418}
2419
2420impl From<AnonConst> for Term {
2421    fn from(v: AnonConst) -> Self {
2422        Term::Const(v)
2423    }
2424}
2425
2426/// The kind of [associated item constraint][AssocItemConstraint].
2427#[derive(#[automatically_derived]
impl ::core::clone::Clone for AssocItemConstraintKind {
    #[inline]
    fn clone(&self) -> AssocItemConstraintKind {
        match self {
            AssocItemConstraintKind::Equality { term: __self_0 } =>
                AssocItemConstraintKind::Equality {
                    term: ::core::clone::Clone::clone(__self_0),
                },
            AssocItemConstraintKind::Bound { bounds: __self_0 } =>
                AssocItemConstraintKind::Bound {
                    bounds: ::core::clone::Clone::clone(__self_0),
                },
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for AssocItemConstraintKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        AssocItemConstraintKind::Equality { term: ref __binding_0 }
                            => {
                            0usize
                        }
                        AssocItemConstraintKind::Bound { bounds: ref __binding_0 }
                            => {
                            1usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    AssocItemConstraintKind::Equality { term: ref __binding_0 }
                        => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AssocItemConstraintKind::Bound { bounds: ref __binding_0 }
                        => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for AssocItemConstraintKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        AssocItemConstraintKind::Equality {
                            term: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    1usize => {
                        AssocItemConstraintKind::Bound {
                            bounds: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `AssocItemConstraintKind`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for AssocItemConstraintKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            AssocItemConstraintKind::Equality { term: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "Equality", "term", &__self_0),
            AssocItemConstraintKind::Bound { bounds: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Bound",
                    "bounds", &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            AssocItemConstraintKind where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    AssocItemConstraintKind::Equality { term: ref __binding_0 }
                        => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    AssocItemConstraintKind::Bound { bounds: ref __binding_0 }
                        => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, (BoundKind::Bound))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for
            AssocItemConstraintKind where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    AssocItemConstraintKind::Equality {
                        term: ref mut __binding_0 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    AssocItemConstraintKind::Bound { bounds: ref mut __binding_0
                        } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, (BoundKind::Bound))
                        }
                    }
                }
            }
        }
    };Walkable)]
2428pub enum AssocItemConstraintKind {
2429    /// An equality constraint for an associated item (e.g., `AssocTy = Ty` in `Trait<AssocTy = Ty>`).
2430    ///
2431    /// Also known as an *associated item binding* (we *bind* an associated item to a term).
2432    ///
2433    /// Furthermore, associated type equality constraints can also be referred to as *associated type
2434    /// bindings*. Similarly with associated const equality constraints and *associated const bindings*.
2435    Equality { term: Term },
2436    /// A bound on an associated type (e.g., `AssocTy: Bound` in `Trait<AssocTy: Bound>`).
2437    Bound {
2438        #[visitable(extra = BoundKind::Bound)]
2439        bounds: GenericBounds,
2440    },
2441}
2442
2443#[derive(const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Ty {
            fn encode(&self, __encoder: &mut __E) {
                let Ty {
                        id: ref __binding_0,
                        kind: ref __binding_1,
                        span: 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);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Ty {
            fn decode(__decoder: &mut __D) -> Self {
                Ty {
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Ty {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "Ty", "id",
            &self.id, "kind", &self.kind, "span", &&self.span)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Ty where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Ty {
                        id: ref __binding_0,
                        kind: ref __binding_1,
                        span: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Ty where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Ty {
                        id: ref mut __binding_0,
                        kind: ref mut __binding_1,
                        span: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2444pub struct Ty {
2445    pub id: NodeId,
2446    pub kind: TyKind,
2447    pub span: Span,
2448}
2449
2450impl Clone for Ty {
2451    fn clone(&self) -> Self {
2452        Self { id: self.id, kind: self.kind.clone(), span: self.span }
2453    }
2454}
2455
2456impl From<Box<Ty>> for Ty {
2457    fn from(value: Box<Ty>) -> Self {
2458        *value
2459    }
2460}
2461
2462impl Ty {
2463    pub fn peel_refs(&self) -> &Self {
2464        let mut final_ty = self;
2465        while let TyKind::Ref(_, MutTy { ty, .. }) | TyKind::Ptr(MutTy { ty, .. }) = &final_ty.kind
2466        {
2467            final_ty = ty;
2468        }
2469        final_ty
2470    }
2471
2472    pub fn is_maybe_parenthesised_infer(&self) -> bool {
2473        match &self.kind {
2474            TyKind::Infer => true,
2475            TyKind::Paren(inner) => inner.is_maybe_parenthesised_infer(),
2476            _ => false,
2477        }
2478    }
2479}
2480
2481#[derive(#[automatically_derived]
impl ::core::clone::Clone for FnPtrTy {
    #[inline]
    fn clone(&self) -> FnPtrTy {
        FnPtrTy {
            safety: ::core::clone::Clone::clone(&self.safety),
            ext: ::core::clone::Clone::clone(&self.ext),
            generic_params: ::core::clone::Clone::clone(&self.generic_params),
            decl: ::core::clone::Clone::clone(&self.decl),
            decl_span: ::core::clone::Clone::clone(&self.decl_span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for FnPtrTy {
            fn encode(&self, __encoder: &mut __E) {
                let FnPtrTy {
                        safety: ref __binding_0,
                        ext: ref __binding_1,
                        generic_params: ref __binding_2,
                        decl: ref __binding_3,
                        decl_span: ref __binding_4 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for FnPtrTy {
            fn decode(__decoder: &mut __D) -> Self {
                FnPtrTy {
                    safety: ::rustc_serialize::Decodable::decode(__decoder),
                    ext: ::rustc_serialize::Decodable::decode(__decoder),
                    generic_params: ::rustc_serialize::Decodable::decode(__decoder),
                    decl: ::rustc_serialize::Decodable::decode(__decoder),
                    decl_span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for FnPtrTy {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f, "FnPtrTy",
            "safety", &self.safety, "ext", &self.ext, "generic_params",
            &self.generic_params, "decl", &self.decl, "decl_span",
            &&self.decl_span)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for FnPtrTy
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    FnPtrTy {
                        safety: ref __binding_0,
                        ext: ref __binding_1,
                        generic_params: ref __binding_2,
                        decl: ref __binding_3,
                        decl_span: ref __binding_4 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for FnPtrTy where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    FnPtrTy {
                        safety: ref mut __binding_0,
                        ext: ref mut __binding_1,
                        generic_params: ref mut __binding_2,
                        decl: ref mut __binding_3,
                        decl_span: ref mut __binding_4 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2482pub struct FnPtrTy {
2483    pub safety: Safety,
2484    pub ext: Extern,
2485    pub generic_params: ThinVec<GenericParam>,
2486    pub decl: Box<FnDecl>,
2487    /// Span of the `[unsafe] [extern] fn(...) -> ...` part, i.e. everything
2488    /// after the generic params (if there are any, e.g. `for<'a>`).
2489    pub decl_span: Span,
2490}
2491
2492impl FnPtrTy {
2493    pub fn header(&self) -> FnHeader {
2494        FnHeader {
2495            constness: Const::No,
2496            coroutine_marker: None,
2497            safety: self.safety,
2498            ext: self.ext,
2499        }
2500    }
2501
2502    pub fn as_borrowed_fn_sig<'a>(&'a self) -> BorrowedFnSig<'a> {
2503        BorrowedFnSig { header: self.header(), decl: &self.decl, span: self.decl_span }
2504    }
2505}
2506
2507#[derive(#[automatically_derived]
impl ::core::clone::Clone for UnsafeBinderTy {
    #[inline]
    fn clone(&self) -> UnsafeBinderTy {
        UnsafeBinderTy {
            generic_params: ::core::clone::Clone::clone(&self.generic_params),
            inner_ty: ::core::clone::Clone::clone(&self.inner_ty),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for UnsafeBinderTy {
            fn encode(&self, __encoder: &mut __E) {
                let UnsafeBinderTy {
                        generic_params: ref __binding_0, inner_ty: ref __binding_1
                        } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for UnsafeBinderTy {
            fn decode(__decoder: &mut __D) -> Self {
                UnsafeBinderTy {
                    generic_params: ::rustc_serialize::Decodable::decode(__decoder),
                    inner_ty: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for UnsafeBinderTy {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "UnsafeBinderTy", "generic_params", &self.generic_params,
            "inner_ty", &&self.inner_ty)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            UnsafeBinderTy where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    UnsafeBinderTy {
                        generic_params: ref __binding_0, inner_ty: ref __binding_1 }
                        => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for UnsafeBinderTy where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    UnsafeBinderTy {
                        generic_params: ref mut __binding_0,
                        inner_ty: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2508pub struct UnsafeBinderTy {
2509    pub generic_params: ThinVec<GenericParam>,
2510    pub inner_ty: Box<Ty>,
2511}
2512
2513/// The various kinds of type recognized by the compiler.
2514//
2515// Adding a new variant? Please update `test_ty` in `tests/ui/macros/stringify.rs`.
2516#[derive(#[automatically_derived]
impl ::core::clone::Clone for TyKind {
    #[inline]
    fn clone(&self) -> TyKind {
        match self {
            TyKind::Slice(__self_0) =>
                TyKind::Slice(::core::clone::Clone::clone(__self_0)),
            TyKind::Array(__self_0, __self_1) =>
                TyKind::Array(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            TyKind::Ptr(__self_0) =>
                TyKind::Ptr(::core::clone::Clone::clone(__self_0)),
            TyKind::Ref(__self_0, __self_1) =>
                TyKind::Ref(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            TyKind::PinnedRef(__self_0, __self_1) =>
                TyKind::PinnedRef(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            TyKind::FnPtr(__self_0) =>
                TyKind::FnPtr(::core::clone::Clone::clone(__self_0)),
            TyKind::UnsafeBinder(__self_0) =>
                TyKind::UnsafeBinder(::core::clone::Clone::clone(__self_0)),
            TyKind::Never => TyKind::Never,
            TyKind::Tup(__self_0) =>
                TyKind::Tup(::core::clone::Clone::clone(__self_0)),
            TyKind::Path(__self_0, __self_1) =>
                TyKind::Path(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            TyKind::TraitObject(__self_0, __self_1) =>
                TyKind::TraitObject(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            TyKind::ImplTrait(__self_0, __self_1) =>
                TyKind::ImplTrait(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            TyKind::Paren(__self_0) =>
                TyKind::Paren(::core::clone::Clone::clone(__self_0)),
            TyKind::Infer => TyKind::Infer,
            TyKind::ImplicitSelf => TyKind::ImplicitSelf,
            TyKind::MacCall(__self_0) =>
                TyKind::MacCall(::core::clone::Clone::clone(__self_0)),
            TyKind::CVarArgs => TyKind::CVarArgs,
            TyKind::Pat(__self_0, __self_1) =>
                TyKind::Pat(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            TyKind::FieldOf(__self_0, __self_1, __self_2) =>
                TyKind::FieldOf(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            TyKind::View(__self_0, __self_1) =>
                TyKind::View(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            TyKind::DirectConstArg(__self_0) =>
                TyKind::DirectConstArg(::core::clone::Clone::clone(__self_0)),
            TyKind::Dummy => TyKind::Dummy,
            TyKind::Err(__self_0) =>
                TyKind::Err(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for TyKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        TyKind::Slice(ref __binding_0) => { 0usize }
                        TyKind::Array(ref __binding_0, ref __binding_1) => {
                            1usize
                        }
                        TyKind::Ptr(ref __binding_0) => { 2usize }
                        TyKind::Ref(ref __binding_0, ref __binding_1) => { 3usize }
                        TyKind::PinnedRef(ref __binding_0, ref __binding_1) => {
                            4usize
                        }
                        TyKind::FnPtr(ref __binding_0) => { 5usize }
                        TyKind::UnsafeBinder(ref __binding_0) => { 6usize }
                        TyKind::Never => { 7usize }
                        TyKind::Tup(ref __binding_0) => { 8usize }
                        TyKind::Path(ref __binding_0, ref __binding_1) => { 9usize }
                        TyKind::TraitObject(ref __binding_0, ref __binding_1) => {
                            10usize
                        }
                        TyKind::ImplTrait(ref __binding_0, ref __binding_1) => {
                            11usize
                        }
                        TyKind::Paren(ref __binding_0) => { 12usize }
                        TyKind::Infer => { 13usize }
                        TyKind::ImplicitSelf => { 14usize }
                        TyKind::MacCall(ref __binding_0) => { 15usize }
                        TyKind::CVarArgs => { 16usize }
                        TyKind::Pat(ref __binding_0, ref __binding_1) => { 17usize }
                        TyKind::FieldOf(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            18usize
                        }
                        TyKind::View(ref __binding_0, ref __binding_1) => {
                            19usize
                        }
                        TyKind::DirectConstArg(ref __binding_0) => { 20usize }
                        TyKind::Dummy => { 21usize }
                        TyKind::Err(ref __binding_0) => { 22usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    TyKind::Slice(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyKind::Array(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::Ptr(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyKind::Ref(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::PinnedRef(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::FnPtr(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyKind::UnsafeBinder(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyKind::Never => {}
                    TyKind::Tup(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyKind::Path(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::TraitObject(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::ImplTrait(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::Paren(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyKind::Infer => {}
                    TyKind::ImplicitSelf => {}
                    TyKind::MacCall(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyKind::CVarArgs => {}
                    TyKind::Pat(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::FieldOf(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);
                    }
                    TyKind::View(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::DirectConstArg(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyKind::Dummy => {}
                    TyKind::Err(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for TyKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        TyKind::Slice(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        TyKind::Array(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        TyKind::Ptr(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => {
                        TyKind::Ref(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    4usize => {
                        TyKind::PinnedRef(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    5usize => {
                        TyKind::FnPtr(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    6usize => {
                        TyKind::UnsafeBinder(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    7usize => { TyKind::Never }
                    8usize => {
                        TyKind::Tup(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    9usize => {
                        TyKind::Path(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    10usize => {
                        TyKind::TraitObject(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    11usize => {
                        TyKind::ImplTrait(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    12usize => {
                        TyKind::Paren(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    13usize => { TyKind::Infer }
                    14usize => { TyKind::ImplicitSelf }
                    15usize => {
                        TyKind::MacCall(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    16usize => { TyKind::CVarArgs }
                    17usize => {
                        TyKind::Pat(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    18usize => {
                        TyKind::FieldOf(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    19usize => {
                        TyKind::View(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    20usize => {
                        TyKind::DirectConstArg(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    21usize => { TyKind::Dummy }
                    22usize => {
                        TyKind::Err(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `TyKind`, expected 0..23, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for TyKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            TyKind::Slice(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Slice",
                    &__self_0),
            TyKind::Array(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Array",
                    __self_0, &__self_1),
            TyKind::Ptr(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Ptr",
                    &__self_0),
            TyKind::Ref(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Ref",
                    __self_0, &__self_1),
            TyKind::PinnedRef(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "PinnedRef", __self_0, &__self_1),
            TyKind::FnPtr(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "FnPtr",
                    &__self_0),
            TyKind::UnsafeBinder(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "UnsafeBinder", &__self_0),
            TyKind::Never => ::core::fmt::Formatter::write_str(f, "Never"),
            TyKind::Tup(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Tup",
                    &__self_0),
            TyKind::Path(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Path",
                    __self_0, &__self_1),
            TyKind::TraitObject(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "TraitObject", __self_0, &__self_1),
            TyKind::ImplTrait(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "ImplTrait", __self_0, &__self_1),
            TyKind::Paren(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Paren",
                    &__self_0),
            TyKind::Infer => ::core::fmt::Formatter::write_str(f, "Infer"),
            TyKind::ImplicitSelf =>
                ::core::fmt::Formatter::write_str(f, "ImplicitSelf"),
            TyKind::MacCall(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "MacCall", &__self_0),
            TyKind::CVarArgs =>
                ::core::fmt::Formatter::write_str(f, "CVarArgs"),
            TyKind::Pat(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Pat",
                    __self_0, &__self_1),
            TyKind::FieldOf(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f,
                    "FieldOf", __self_0, __self_1, &__self_2),
            TyKind::View(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "View",
                    __self_0, &__self_1),
            TyKind::DirectConstArg(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "DirectConstArg", &__self_0),
            TyKind::Dummy => ::core::fmt::Formatter::write_str(f, "Dummy"),
            TyKind::Err(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Err",
                    &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for TyKind where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    TyKind::Slice(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::Array(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::Ptr(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::Ref(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, (LifetimeCtxt::Ref))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::PinnedRef(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, (LifetimeCtxt::Ref))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::FnPtr(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::UnsafeBinder(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::Never => {}
                    TyKind::Tup(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::Path(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::TraitObject(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, (BoundKind::TraitObject))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::ImplTrait(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, (BoundKind::Impl))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::Paren(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::Infer => {}
                    TyKind::ImplicitSelf => {}
                    TyKind::MacCall(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::CVarArgs => {}
                    TyKind::Pat(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::FieldOf(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::View(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {}
                    }
                    TyKind::DirectConstArg(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::Dummy => {}
                    TyKind::Err(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for TyKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    TyKind::Slice(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    TyKind::Array(ref mut __binding_0, ref mut __binding_1) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                    TyKind::Ptr(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    TyKind::Ref(ref mut __binding_0, ref mut __binding_1) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, (LifetimeCtxt::Ref))
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                    TyKind::PinnedRef(ref mut __binding_0, ref mut __binding_1)
                        => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, (LifetimeCtxt::Ref))
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                    TyKind::FnPtr(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    TyKind::UnsafeBinder(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    TyKind::Never => {}
                    TyKind::Tup(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    TyKind::Path(ref mut __binding_0, ref mut __binding_1) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                    TyKind::TraitObject(ref mut __binding_0,
                        ref mut __binding_1) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, (BoundKind::TraitObject))
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                    TyKind::ImplTrait(ref mut __binding_0, ref mut __binding_1)
                        => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, (BoundKind::Impl))
                        }
                    }
                    TyKind::Paren(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    TyKind::Infer => {}
                    TyKind::ImplicitSelf => {}
                    TyKind::MacCall(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    TyKind::CVarArgs => {}
                    TyKind::Pat(ref mut __binding_0, ref mut __binding_1) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                    TyKind::FieldOf(ref mut __binding_0, ref mut __binding_1,
                        ref mut __binding_2) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                    TyKind::View(ref mut __binding_0, ref mut __binding_1) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {}
                    }
                    TyKind::DirectConstArg(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    TyKind::Dummy => {}
                    TyKind::Err(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2517pub enum TyKind {
2518    /// A variable-length slice (`[T]`).
2519    Slice(Box<Ty>),
2520    /// A fixed length array (`[T; n]`).
2521    Array(Box<Ty>, AnonConst),
2522    /// A raw pointer (`*const T` or `*mut T`).
2523    Ptr(MutTy),
2524    /// A reference (`&'a T` or `&'a mut T`).
2525    Ref(#[visitable(extra = LifetimeCtxt::Ref)] Option<Lifetime>, MutTy),
2526    /// A pinned reference (`&'a pin const T` or `&'a pin mut T`).
2527    ///
2528    /// Desugars into `Pin<&'a T>` or `Pin<&'a mut T>`.
2529    PinnedRef(#[visitable(extra = LifetimeCtxt::Ref)] Option<Lifetime>, MutTy),
2530    /// A function pointer type (e.g., `fn(usize) -> bool`).
2531    FnPtr(Box<FnPtrTy>),
2532    /// An unsafe existential lifetime binder (e.g., `unsafe<'a> &'a ()`).
2533    UnsafeBinder(Box<UnsafeBinderTy>),
2534    /// The never type (`!`).
2535    Never,
2536    /// A tuple (`(A, B, C, D,...)`).
2537    Tup(ThinVec<Box<Ty>>),
2538    /// A path (`module::module::...::Type`), optionally
2539    /// "qualified", e.g., `<Vec<T> as SomeTrait>::SomeType`.
2540    ///
2541    /// Type parameters are stored in the `Path` itself.
2542    Path(Option<Box<QSelf>>, Path),
2543    /// A trait object type `Bound1 + Bound2 + Bound3`
2544    /// where `Bound` is a trait or a lifetime.
2545    TraitObject(#[visitable(extra = BoundKind::TraitObject)] GenericBounds, TraitObjectSyntax),
2546    /// An `impl Bound1 + Bound2 + Bound3` type
2547    /// where `Bound` is a trait or a lifetime.
2548    ///
2549    /// The `NodeId` exists to prevent lowering from having to
2550    /// generate `NodeId`s on the fly, which would complicate
2551    /// the generation of opaque `type Foo = impl Trait` items significantly.
2552    ImplTrait(NodeId, #[visitable(extra = BoundKind::Impl)] GenericBounds),
2553    /// No-op; kept solely so that we can pretty-print faithfully.
2554    Paren(Box<Ty>),
2555    /// This means the type should be inferred instead of it having been
2556    /// specified. This can appear anywhere in a type.
2557    Infer,
2558    /// Inferred type of a `self` or `&self` argument in a method.
2559    ImplicitSelf,
2560    /// A macro in the type position.
2561    MacCall(Box<MacCall>),
2562    /// Placeholder for a `va_list`.
2563    CVarArgs,
2564    /// Pattern types like `pattern_type!(u32 is 1..=)`, which is the same as `NonZero<u32>`,
2565    /// just as part of the type system.
2566    Pat(Box<Ty>, Box<TyPat>),
2567    /// A `field_of` expression (e.g., `builtin # field_of(Struct, field)`).
2568    ///
2569    /// Usually not written directly in user code but indirectly via the macro
2570    /// `core::field::field_of!(...)`.
2571    FieldOf(Box<Ty>, Option<Ident>, Ident),
2572    /// A view of a type. `T.{ field_1, field_2 }`.
2573    View(Box<Ty>, #[visitable(ignore)] ThinVec<Ident>),
2574    /// An mGCA `direct_const_arg!()` expression.
2575    DirectConstArg(Box<Expr>),
2576    /// Sometimes we need a dummy value when no error has occurred.
2577    Dummy,
2578    /// Placeholder for a kind that has failed to be defined.
2579    Err(ErrorGuaranteed),
2580}
2581
2582impl TyKind {
2583    pub fn is_implicit_self(&self) -> bool {
2584        #[allow(non_exhaustive_omitted_patterns)] match self {
    TyKind::ImplicitSelf => true,
    _ => false,
}matches!(self, TyKind::ImplicitSelf)
2585    }
2586
2587    pub fn is_unit(&self) -> bool {
2588        #[allow(non_exhaustive_omitted_patterns)] match self {
    TyKind::Tup(tys) if tys.is_empty() => true,
    _ => false,
}matches!(self, TyKind::Tup(tys) if tys.is_empty())
2589    }
2590
2591    pub fn is_simple_path(&self) -> Option<Symbol> {
2592        if let TyKind::Path(None, Path { segments, .. }) = &self
2593            && let [segment] = &segments[..]
2594            && segment.args.is_none()
2595        {
2596            Some(segment.ident.name)
2597        } else {
2598            None
2599        }
2600    }
2601
2602    /// Returns `true` if this type is considered a scalar primitive (e.g.,
2603    /// `i32`, `u8`, `bool`, etc).
2604    ///
2605    /// This check is based on **symbol equality** and does **not** remove any
2606    /// path prefixes or references. If a type alias or shadowing is present
2607    /// (e.g., `type i32 = CustomType;`), this method will still return `true`
2608    /// for `i32`, even though it may not refer to the primitive type.
2609    pub fn maybe_scalar(&self) -> bool {
2610        let Some(ty_sym) = self.is_simple_path() else {
2611            // unit type
2612            return self.is_unit();
2613        };
2614        #[allow(non_exhaustive_omitted_patterns)] match ty_sym {
    sym::i8 | sym::i16 | sym::i32 | sym::i64 | sym::i128 | sym::u8 | sym::u16
        | sym::u32 | sym::u64 | sym::u128 | sym::f16 | sym::f32 | sym::f64 |
        sym::f128 | sym::char | sym::bool => true,
    _ => false,
}matches!(
2615            ty_sym,
2616            sym::i8
2617                | sym::i16
2618                | sym::i32
2619                | sym::i64
2620                | sym::i128
2621                | sym::u8
2622                | sym::u16
2623                | sym::u32
2624                | sym::u64
2625                | sym::u128
2626                | sym::f16
2627                | sym::f32
2628                | sym::f64
2629                | sym::f128
2630                | sym::char
2631                | sym::bool
2632        )
2633    }
2634}
2635
2636/// A pattern type pattern.
2637#[derive(#[automatically_derived]
impl ::core::clone::Clone for TyPat {
    #[inline]
    fn clone(&self) -> TyPat {
        TyPat {
            id: ::core::clone::Clone::clone(&self.id),
            kind: ::core::clone::Clone::clone(&self.kind),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for TyPat {
            fn encode(&self, __encoder: &mut __E) {
                let TyPat {
                        id: ref __binding_0,
                        kind: ref __binding_1,
                        span: 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);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for TyPat {
            fn decode(__decoder: &mut __D) -> Self {
                TyPat {
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for TyPat {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "TyPat", "id",
            &self.id, "kind", &self.kind, "span", &&self.span)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for TyPat where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    TyPat {
                        id: ref __binding_0,
                        kind: ref __binding_1,
                        span: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for TyPat where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    TyPat {
                        id: ref mut __binding_0,
                        kind: ref mut __binding_1,
                        span: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2638pub struct TyPat {
2639    pub id: NodeId,
2640    pub kind: TyPatKind,
2641    pub span: Span,
2642}
2643
2644/// All the different flavors of pattern that Rust recognizes.
2645//
2646// Adding a new variant? Please update `test_pat` in `tests/ui/macros/stringify.rs`.
2647#[derive(#[automatically_derived]
impl ::core::clone::Clone for TyPatKind {
    #[inline]
    fn clone(&self) -> TyPatKind {
        match self {
            TyPatKind::Range(__self_0, __self_1, __self_2) =>
                TyPatKind::Range(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            TyPatKind::NotNull => TyPatKind::NotNull,
            TyPatKind::Or(__self_0) =>
                TyPatKind::Or(::core::clone::Clone::clone(__self_0)),
            TyPatKind::Err(__self_0) =>
                TyPatKind::Err(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for TyPatKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        TyPatKind::Range(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            0usize
                        }
                        TyPatKind::NotNull => { 1usize }
                        TyPatKind::Or(ref __binding_0) => { 2usize }
                        TyPatKind::Err(ref __binding_0) => { 3usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    TyPatKind::Range(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);
                    }
                    TyPatKind::NotNull => {}
                    TyPatKind::Or(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyPatKind::Err(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for TyPatKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        TyPatKind::Range(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => { TyPatKind::NotNull }
                    2usize => {
                        TyPatKind::Or(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => {
                        TyPatKind::Err(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `TyPatKind`, expected 0..4, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for TyPatKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            TyPatKind::Range(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Range",
                    __self_0, __self_1, &__self_2),
            TyPatKind::NotNull =>
                ::core::fmt::Formatter::write_str(f, "NotNull"),
            TyPatKind::Or(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Or",
                    &__self_0),
            TyPatKind::Err(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Err",
                    &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for TyPatKind
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    TyPatKind::Range(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyPatKind::NotNull => {}
                    TyPatKind::Or(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyPatKind::Err(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for TyPatKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    TyPatKind::Range(ref mut __binding_0, ref mut __binding_1,
                        ref mut __binding_2) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                    TyPatKind::NotNull => {}
                    TyPatKind::Or(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    TyPatKind::Err(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2648pub enum TyPatKind {
2649    /// A range pattern (e.g., `1...2`, `1..2`, `1..`, `..2`, `1..=2`, `..=2`).
2650    Range(Option<Box<AnonConst>>, Option<Box<AnonConst>>, Spanned<RangeEnd>),
2651
2652    /// A `!null` pattern for raw pointers.
2653    NotNull,
2654
2655    Or(ThinVec<TyPat>),
2656
2657    /// Placeholder for a pattern that wasn't syntactically well formed in some way.
2658    Err(ErrorGuaranteed),
2659}
2660
2661/// Syntax used to declare a trait object.
2662#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for TraitObjectSyntax { }
#[automatically_derived]
impl ::core::clone::Clone for TraitObjectSyntax {
    #[inline]
    fn clone(&self) -> TraitObjectSyntax { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for TraitObjectSyntax { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for TraitObjectSyntax { }
#[automatically_derived]
impl ::core::cmp::PartialEq for TraitObjectSyntax {
    #[inline]
    fn eq(&self, other: &TraitObjectSyntax) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for TraitObjectSyntax {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        TraitObjectSyntax::Dyn => { 0usize }
                        TraitObjectSyntax::None => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for TraitObjectSyntax {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { TraitObjectSyntax::Dyn }
                    1usize => { TraitObjectSyntax::None }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `TraitObjectSyntax`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for TraitObjectSyntax {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                TraitObjectSyntax::Dyn => "Dyn",
                TraitObjectSyntax::None => "None",
            })
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            TraitObjectSyntax {
            #[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 {
                    TraitObjectSyntax::Dyn => {}
                    TraitObjectSyntax::None => {}
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            TraitObjectSyntax where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    TraitObjectSyntax::Dyn => {}
                    TraitObjectSyntax::None => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for TraitObjectSyntax
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    TraitObjectSyntax::Dyn => {}
                    TraitObjectSyntax::None => {}
                }
            }
        }
    };Walkable)]
2663#[repr(u8)]
2664pub enum TraitObjectSyntax {
2665    // SAFETY: When adding new variants make sure to update the `Tag` impl.
2666    Dyn = 0,
2667    None = 1,
2668}
2669
2670/// SAFETY: `TraitObjectSyntax` only has 3 data-less variants which means
2671/// it can be represented with a `u2`. We use `repr(u8)` to guarantee the
2672/// discriminants of the variants are no greater than `3`.
2673unsafe impl Tag for TraitObjectSyntax {
2674    const BITS: u32 = 2;
2675
2676    fn into_usize(self) -> usize {
2677        self as u8 as usize
2678    }
2679
2680    unsafe fn from_usize(tag: usize) -> Self {
2681        match tag {
2682            0 => TraitObjectSyntax::Dyn,
2683            1 => TraitObjectSyntax::None,
2684            _ => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
2685        }
2686    }
2687}
2688
2689#[derive(#[automatically_derived]
impl ::core::clone::Clone for PreciseCapturingArg {
    #[inline]
    fn clone(&self) -> PreciseCapturingArg {
        match self {
            PreciseCapturingArg::Lifetime(__self_0) =>
                PreciseCapturingArg::Lifetime(::core::clone::Clone::clone(__self_0)),
            PreciseCapturingArg::Arg(__self_0, __self_1) =>
                PreciseCapturingArg::Arg(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for PreciseCapturingArg {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        PreciseCapturingArg::Lifetime(ref __binding_0) => { 0usize }
                        PreciseCapturingArg::Arg(ref __binding_0, ref __binding_1)
                            => {
                            1usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    PreciseCapturingArg::Lifetime(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    PreciseCapturingArg::Arg(ref __binding_0, ref __binding_1)
                        => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for PreciseCapturingArg {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        PreciseCapturingArg::Lifetime(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        PreciseCapturingArg::Arg(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `PreciseCapturingArg`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for PreciseCapturingArg {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            PreciseCapturingArg::Lifetime(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Lifetime", &__self_0),
            PreciseCapturingArg::Arg(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Arg",
                    __self_0, &__self_1),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            PreciseCapturingArg where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    PreciseCapturingArg::Lifetime(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, (LifetimeCtxt::GenericArg))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PreciseCapturingArg::Arg(ref __binding_0, ref __binding_1)
                        => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for PreciseCapturingArg
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    PreciseCapturingArg::Lifetime(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, (LifetimeCtxt::GenericArg))
                        }
                    }
                    PreciseCapturingArg::Arg(ref mut __binding_0,
                        ref mut __binding_1) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2690pub enum PreciseCapturingArg {
2691    /// Lifetime parameter.
2692    Lifetime(#[visitable(extra = LifetimeCtxt::GenericArg)] Lifetime),
2693    /// Type or const parameter.
2694    Arg(Path, NodeId),
2695}
2696
2697/// Inline assembly operand explicit register or register class.
2698///
2699/// E.g., `"eax"` as in `asm!("mov eax, 2", out("eax") result)`.
2700#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for InlineAsmRegOrRegClass { }
#[automatically_derived]
impl ::core::clone::Clone for InlineAsmRegOrRegClass {
    #[inline]
    fn clone(&self) -> InlineAsmRegOrRegClass {
        let _: ::core::clone::AssertParamIsClone<Symbol>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for InlineAsmRegOrRegClass { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for InlineAsmRegOrRegClass {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        InlineAsmRegOrRegClass::Reg(ref __binding_0) => { 0usize }
                        InlineAsmRegOrRegClass::RegClass(ref __binding_0) => {
                            1usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    InlineAsmRegOrRegClass::Reg(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    InlineAsmRegOrRegClass::RegClass(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for InlineAsmRegOrRegClass {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        InlineAsmRegOrRegClass::Reg(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        InlineAsmRegOrRegClass::RegClass(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `InlineAsmRegOrRegClass`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for InlineAsmRegOrRegClass {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            InlineAsmRegOrRegClass::Reg(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Reg",
                    &__self_0),
            InlineAsmRegOrRegClass::RegClass(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "RegClass", &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            InlineAsmRegOrRegClass where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    InlineAsmRegOrRegClass::Reg(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    InlineAsmRegOrRegClass::RegClass(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for
            InlineAsmRegOrRegClass where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    InlineAsmRegOrRegClass::Reg(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    InlineAsmRegOrRegClass::RegClass(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2701pub enum InlineAsmRegOrRegClass {
2702    Reg(Symbol),
2703    RegClass(Symbol),
2704}
2705
2706#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for InlineAsmOptions { }
#[automatically_derived]
impl ::core::clone::Clone for InlineAsmOptions {
    #[inline]
    fn clone(&self) -> InlineAsmOptions {
        let _: ::core::clone::AssertParamIsClone<u16>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for InlineAsmOptions { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for InlineAsmOptions { }
#[automatically_derived]
impl ::core::cmp::PartialEq for InlineAsmOptions {
    #[inline]
    fn eq(&self, other: &InlineAsmOptions) -> bool { self.0 == other.0 }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for InlineAsmOptions {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<u16>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for InlineAsmOptions {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}Hash, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for InlineAsmOptions {
            fn encode(&self, __encoder: &mut __E) {
                let InlineAsmOptions(ref __binding_0) = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for InlineAsmOptions {
            fn decode(__decoder: &mut __D) -> Self {
                InlineAsmOptions(::rustc_serialize::Decodable::decode(__decoder))
            }
        }
    };Decodable, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            InlineAsmOptions {
            #[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 {
                    InlineAsmOptions(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
2707pub struct InlineAsmOptions(u16);
2708impl InlineAsmOptions {
    #[allow(deprecated, non_upper_case_globals,)]
    pub const PURE: Self = Self::from_bits_retain(1 << 0);
    #[allow(deprecated, non_upper_case_globals,)]
    pub const NOMEM: Self = Self::from_bits_retain(1 << 1);
    #[allow(deprecated, non_upper_case_globals,)]
    pub const READONLY: Self = Self::from_bits_retain(1 << 2);
    #[allow(deprecated, non_upper_case_globals,)]
    pub const PRESERVES_FLAGS: Self = Self::from_bits_retain(1 << 3);
    #[allow(deprecated, non_upper_case_globals,)]
    pub const NORETURN: Self = Self::from_bits_retain(1 << 4);
    #[allow(deprecated, non_upper_case_globals,)]
    pub const NOSTACK: Self = Self::from_bits_retain(1 << 5);
    #[allow(deprecated, non_upper_case_globals,)]
    pub const ATT_SYNTAX: Self = Self::from_bits_retain(1 << 6);
    #[allow(deprecated, non_upper_case_globals,)]
    pub const RAW: Self = Self::from_bits_retain(1 << 7);
    #[allow(deprecated, non_upper_case_globals,)]
    pub const MAY_UNWIND: Self = Self::from_bits_retain(1 << 8);
}
impl ::bitflags::Flags for InlineAsmOptions {
    const FLAGS: &'static [::bitflags::Flag<InlineAsmOptions>] =
        &[{

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("PURE", InlineAsmOptions::PURE)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("NOMEM", InlineAsmOptions::NOMEM)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("READONLY",
                            InlineAsmOptions::READONLY)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("PRESERVES_FLAGS",
                            InlineAsmOptions::PRESERVES_FLAGS)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("NORETURN",
                            InlineAsmOptions::NORETURN)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("NOSTACK", InlineAsmOptions::NOSTACK)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("ATT_SYNTAX",
                            InlineAsmOptions::ATT_SYNTAX)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("RAW", InlineAsmOptions::RAW)
                    },
                    {

                        #[allow(deprecated, non_upper_case_globals,)]
                        ::bitflags::Flag::new("MAY_UNWIND",
                            InlineAsmOptions::MAY_UNWIND)
                    }];
    type Bits = u16;
    fn bits(&self) -> u16 { InlineAsmOptions::bits(self) }
    fn from_bits_retain(bits: u16) -> InlineAsmOptions {
        InlineAsmOptions::from_bits_retain(bits)
    }
}
#[allow(dead_code, deprecated, unused_doc_comments, unused_attributes,
unused_mut, unused_imports, non_upper_case_globals, clippy ::
assign_op_pattern, clippy :: iter_without_into_iter,)]
const _: () =
    {
        #[allow(dead_code, deprecated, unused_attributes)]
        impl InlineAsmOptions {
            /// Get a flags value with all bits unset.
            #[inline]
            pub const fn empty() -> Self {
                Self(<u16 as ::bitflags::Bits>::EMPTY)
            }
            /// Get a flags value with all known bits set.
            #[inline]
            pub const fn all() -> Self {
                let mut truncated = <u16 as ::bitflags::Bits>::EMPTY;
                let mut i = 0;
                {
                    {
                        let flag =
                            <InlineAsmOptions as
                                            ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <InlineAsmOptions as
                                            ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <InlineAsmOptions as
                                            ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <InlineAsmOptions as
                                            ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <InlineAsmOptions as
                                            ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <InlineAsmOptions as
                                            ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <InlineAsmOptions as
                                            ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <InlineAsmOptions as
                                            ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                {
                    {
                        let flag =
                            <InlineAsmOptions as
                                            ::bitflags::Flags>::FLAGS[i].value().bits();
                        truncated = truncated | flag;
                        i += 1;
                    }
                };
                let _ = i;
                Self(truncated)
            }
            /// Get the underlying bits value.
            ///
            /// The returned value is exactly the bits set in this flags value.
            #[inline]
            pub const fn bits(&self) -> u16 { self.0 }
            /// Convert from a bits value.
            ///
            /// This method will return `None` if any unknown bits are set.
            #[inline]
            pub const fn from_bits(bits: u16)
                -> ::bitflags::__private::core::option::Option<Self> {
                let truncated = Self::from_bits_truncate(bits).0;
                if truncated == bits {
                    ::bitflags::__private::core::option::Option::Some(Self(bits))
                } else { ::bitflags::__private::core::option::Option::None }
            }
            /// Convert from a bits value, unsetting any unknown bits.
            #[inline]
            pub const fn from_bits_truncate(bits: u16) -> Self {
                Self(bits & Self::all().0)
            }
            /// Convert from a bits value exactly.
            #[inline]
            pub const fn from_bits_retain(bits: u16) -> Self { Self(bits) }
            /// Get a flags value with the bits of a flag with the given name set.
            ///
            /// This method will return `None` if `name` is empty or doesn't
            /// correspond to any named flag.
            #[inline]
            pub fn from_name(name: &str)
                -> ::bitflags::__private::core::option::Option<Self> {
                {
                    if name == "PURE" {
                        return ::bitflags::__private::core::option::Option::Some(Self(InlineAsmOptions::PURE.bits()));
                    }
                };
                ;
                {
                    if name == "NOMEM" {
                        return ::bitflags::__private::core::option::Option::Some(Self(InlineAsmOptions::NOMEM.bits()));
                    }
                };
                ;
                {
                    if name == "READONLY" {
                        return ::bitflags::__private::core::option::Option::Some(Self(InlineAsmOptions::READONLY.bits()));
                    }
                };
                ;
                {
                    if name == "PRESERVES_FLAGS" {
                        return ::bitflags::__private::core::option::Option::Some(Self(InlineAsmOptions::PRESERVES_FLAGS.bits()));
                    }
                };
                ;
                {
                    if name == "NORETURN" {
                        return ::bitflags::__private::core::option::Option::Some(Self(InlineAsmOptions::NORETURN.bits()));
                    }
                };
                ;
                {
                    if name == "NOSTACK" {
                        return ::bitflags::__private::core::option::Option::Some(Self(InlineAsmOptions::NOSTACK.bits()));
                    }
                };
                ;
                {
                    if name == "ATT_SYNTAX" {
                        return ::bitflags::__private::core::option::Option::Some(Self(InlineAsmOptions::ATT_SYNTAX.bits()));
                    }
                };
                ;
                {
                    if name == "RAW" {
                        return ::bitflags::__private::core::option::Option::Some(Self(InlineAsmOptions::RAW.bits()));
                    }
                };
                ;
                {
                    if name == "MAY_UNWIND" {
                        return ::bitflags::__private::core::option::Option::Some(Self(InlineAsmOptions::MAY_UNWIND.bits()));
                    }
                };
                ;
                let _ = name;
                ::bitflags::__private::core::option::Option::None
            }
            /// Whether all bits in this flags value are unset.
            #[inline]
            pub const fn is_empty(&self) -> bool {
                self.0 == <u16 as ::bitflags::Bits>::EMPTY
            }
            /// Whether all known bits in this flags value are set.
            #[inline]
            pub const fn is_all(&self) -> bool {
                Self::all().0 | self.0 == self.0
            }
            /// Whether any set bits in a source flags value are also set in a target flags value.
            #[inline]
            pub const fn intersects(&self, other: Self) -> bool {
                self.0 & other.0 != <u16 as ::bitflags::Bits>::EMPTY
            }
            /// Whether all set bits in a source flags value are also set in a target flags value.
            #[inline]
            pub const fn contains(&self, other: Self) -> bool {
                self.0 & other.0 == other.0
            }
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            pub fn insert(&mut self, other: Self) {
                *self = Self(self.0).union(other);
            }
            /// The intersection of a source flags value with the complement of a target flags
            /// value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `remove` won't truncate `other`, but the `!` operator will.
            #[inline]
            pub fn remove(&mut self, other: Self) {
                *self = Self(self.0).difference(other);
            }
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            pub fn toggle(&mut self, other: Self) {
                *self = Self(self.0).symmetric_difference(other);
            }
            /// Call `insert` when `value` is `true` or `remove` when `value` is `false`.
            #[inline]
            pub fn set(&mut self, other: Self, value: bool) {
                if value { self.insert(other); } else { self.remove(other); }
            }
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn intersection(self, other: Self) -> Self {
                Self(self.0 & other.0)
            }
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn union(self, other: Self) -> Self {
                Self(self.0 | other.0)
            }
            /// The intersection of a source flags value with the complement of a target flags
            /// value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            #[must_use]
            pub const fn difference(self, other: Self) -> Self {
                Self(self.0 & !other.0)
            }
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            #[must_use]
            pub const fn symmetric_difference(self, other: Self) -> Self {
                Self(self.0 ^ other.0)
            }
            /// The bitwise negation (`!`) of the bits in a flags value, truncating the result.
            #[inline]
            #[must_use]
            pub const fn complement(self) -> Self {
                Self::from_bits_truncate(!self.0)
            }
        }
        impl ::bitflags::__private::core::fmt::Binary for InlineAsmOptions {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::Binary::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::Octal for InlineAsmOptions {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::Octal::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::LowerHex for InlineAsmOptions {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::LowerHex::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::fmt::UpperHex for InlineAsmOptions {
            fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
                -> ::bitflags::__private::core::fmt::Result {
                let inner = self.0;
                ::bitflags::__private::core::fmt::UpperHex::fmt(&inner, f)
            }
        }
        impl ::bitflags::__private::core::ops::BitOr for InlineAsmOptions {
            type Output = Self;
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            fn bitor(self, other: InlineAsmOptions) -> Self {
                self.union(other)
            }
        }
        impl ::bitflags::__private::core::ops::BitOrAssign for
            InlineAsmOptions {
            /// The bitwise or (`|`) of the bits in two flags values.
            #[inline]
            fn bitor_assign(&mut self, other: Self) { self.insert(other); }
        }
        impl ::bitflags::__private::core::ops::BitXor for InlineAsmOptions {
            type Output = Self;
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            fn bitxor(self, other: Self) -> Self {
                self.symmetric_difference(other)
            }
        }
        impl ::bitflags::__private::core::ops::BitXorAssign for
            InlineAsmOptions {
            /// The bitwise exclusive-or (`^`) of the bits in two flags values.
            #[inline]
            fn bitxor_assign(&mut self, other: Self) { self.toggle(other); }
        }
        impl ::bitflags::__private::core::ops::BitAnd for InlineAsmOptions {
            type Output = Self;
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            fn bitand(self, other: Self) -> Self { self.intersection(other) }
        }
        impl ::bitflags::__private::core::ops::BitAndAssign for
            InlineAsmOptions {
            /// The bitwise and (`&`) of the bits in two flags values.
            #[inline]
            fn bitand_assign(&mut self, other: Self) {
                *self =
                    Self::from_bits_retain(self.bits()).intersection(other);
            }
        }
        impl ::bitflags::__private::core::ops::Sub for InlineAsmOptions {
            type Output = Self;
            /// The intersection of a source flags value with the complement of a target flags value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            fn sub(self, other: Self) -> Self { self.difference(other) }
        }
        impl ::bitflags::__private::core::ops::SubAssign for InlineAsmOptions
            {
            /// The intersection of a source flags value with the complement of a target flags value (`&!`).
            ///
            /// This method is not equivalent to `self & !other` when `other` has unknown bits set.
            /// `difference` won't truncate `other`, but the `!` operator will.
            #[inline]
            fn sub_assign(&mut self, other: Self) { self.remove(other); }
        }
        impl ::bitflags::__private::core::ops::Not for InlineAsmOptions {
            type Output = Self;
            /// The bitwise negation (`!`) of the bits in a flags value, truncating the result.
            #[inline]
            fn not(self) -> Self { self.complement() }
        }
        impl ::bitflags::__private::core::iter::Extend<InlineAsmOptions> for
            InlineAsmOptions {
            /// The bitwise or (`|`) of the bits in each flags value.
            fn extend<T: ::bitflags::__private::core::iter::IntoIterator<Item
                = Self>>(&mut self, iterator: T) {
                for item in iterator { self.insert(item) }
            }
        }
        impl ::bitflags::__private::core::iter::FromIterator<InlineAsmOptions>
            for InlineAsmOptions {
            /// The bitwise or (`|`) of the bits in each flags value.
            fn from_iter<T: ::bitflags::__private::core::iter::IntoIterator<Item
                = Self>>(iterator: T) -> Self {
                use ::bitflags::__private::core::iter::Extend;
                let mut result = Self::empty();
                result.extend(iterator);
                result
            }
        }
        impl InlineAsmOptions {
            /// Yield a set of contained flags values.
            ///
            /// Each yielded flags value will correspond to a defined named flag. Any unknown bits
            /// will be yielded together as a final flags value.
            #[inline]
            pub const fn iter(&self)
                -> ::bitflags::iter::Iter<InlineAsmOptions> {
                ::bitflags::iter::Iter::__private_const_new(<InlineAsmOptions
                        as ::bitflags::Flags>::FLAGS,
                    InlineAsmOptions::from_bits_retain(self.bits()),
                    InlineAsmOptions::from_bits_retain(self.bits()))
            }
            /// Yield a set of contained named flags values.
            ///
            /// This method is like [`iter`](#method.iter), except only yields bits in contained named flags.
            /// Any unknown bits, or bits not corresponding to a contained flag will not be yielded.
            #[inline]
            pub const fn iter_names(&self)
                -> ::bitflags::iter::IterNames<InlineAsmOptions> {
                ::bitflags::iter::IterNames::__private_const_new(<InlineAsmOptions
                        as ::bitflags::Flags>::FLAGS,
                    InlineAsmOptions::from_bits_retain(self.bits()),
                    InlineAsmOptions::from_bits_retain(self.bits()))
            }
        }
        impl ::bitflags::__private::core::iter::IntoIterator for
            InlineAsmOptions {
            type Item = InlineAsmOptions;
            type IntoIter = ::bitflags::iter::Iter<InlineAsmOptions>;
            fn into_iter(self) -> Self::IntoIter { self.iter() }
        }
    };bitflags::bitflags! {
2709    impl InlineAsmOptions: u16 {
2710        const PURE            = 1 << 0;
2711        const NOMEM           = 1 << 1;
2712        const READONLY        = 1 << 2;
2713        const PRESERVES_FLAGS = 1 << 3;
2714        const NORETURN        = 1 << 4;
2715        const NOSTACK         = 1 << 5;
2716        const ATT_SYNTAX      = 1 << 6;
2717        const RAW             = 1 << 7;
2718        const MAY_UNWIND      = 1 << 8;
2719    }
2720}
2721
2722impl InlineAsmOptions {
2723    pub const COUNT: usize = Self::all().bits().count_ones() as usize;
2724
2725    pub const GLOBAL_OPTIONS: Self = Self::ATT_SYNTAX.union(Self::RAW);
2726    pub const NAKED_OPTIONS: Self = Self::ATT_SYNTAX.union(Self::RAW);
2727
2728    pub fn human_readable_names(&self) -> Vec<&'static str> {
2729        let mut options = ::alloc::vec::Vec::new()vec![];
2730
2731        if self.contains(InlineAsmOptions::PURE) {
2732            options.push("pure");
2733        }
2734        if self.contains(InlineAsmOptions::NOMEM) {
2735            options.push("nomem");
2736        }
2737        if self.contains(InlineAsmOptions::READONLY) {
2738            options.push("readonly");
2739        }
2740        if self.contains(InlineAsmOptions::PRESERVES_FLAGS) {
2741            options.push("preserves_flags");
2742        }
2743        if self.contains(InlineAsmOptions::NORETURN) {
2744            options.push("noreturn");
2745        }
2746        if self.contains(InlineAsmOptions::NOSTACK) {
2747            options.push("nostack");
2748        }
2749        if self.contains(InlineAsmOptions::ATT_SYNTAX) {
2750            options.push("att_syntax");
2751        }
2752        if self.contains(InlineAsmOptions::RAW) {
2753            options.push("raw");
2754        }
2755        if self.contains(InlineAsmOptions::MAY_UNWIND) {
2756            options.push("may_unwind");
2757        }
2758
2759        options
2760    }
2761}
2762
2763impl std::fmt::Debug for InlineAsmOptions {
2764    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
2765        bitflags::parser::to_writer(self, f)
2766    }
2767}
2768
2769#[derive(#[automatically_derived]
impl ::core::clone::Clone for InlineAsmTemplatePiece {
    #[inline]
    fn clone(&self) -> InlineAsmTemplatePiece {
        match self {
            InlineAsmTemplatePiece::String(__self_0) =>
                InlineAsmTemplatePiece::String(::core::clone::Clone::clone(__self_0)),
            InlineAsmTemplatePiece::Placeholder {
                operand_idx: __self_0, modifier: __self_1, span: __self_2 } =>
                InlineAsmTemplatePiece::Placeholder {
                    operand_idx: ::core::clone::Clone::clone(__self_0),
                    modifier: ::core::clone::Clone::clone(__self_1),
                    span: ::core::clone::Clone::clone(__self_2),
                },
        }
    }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for InlineAsmTemplatePiece { }
#[automatically_derived]
impl ::core::cmp::PartialEq for InlineAsmTemplatePiece {
    #[inline]
    fn eq(&self, other: &InlineAsmTemplatePiece) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (InlineAsmTemplatePiece::String(__self_0),
                    InlineAsmTemplatePiece::String(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (InlineAsmTemplatePiece::Placeholder {
                    operand_idx: __self_0, modifier: __self_1, span: __self_2 },
                    InlineAsmTemplatePiece::Placeholder {
                    operand_idx: __arg1_0, modifier: __arg1_1, span: __arg1_2 })
                    =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1 &&
                        __self_2 == __arg1_2,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for InlineAsmTemplatePiece {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        InlineAsmTemplatePiece::String(ref __binding_0) => {
                            0usize
                        }
                        InlineAsmTemplatePiece::Placeholder {
                            operand_idx: ref __binding_0,
                            modifier: ref __binding_1,
                            span: ref __binding_2 } => {
                            1usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    InlineAsmTemplatePiece::String(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    InlineAsmTemplatePiece::Placeholder {
                        operand_idx: ref __binding_0,
                        modifier: ref __binding_1,
                        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);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for InlineAsmTemplatePiece {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        InlineAsmTemplatePiece::String(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        InlineAsmTemplatePiece::Placeholder {
                            operand_idx: ::rustc_serialize::Decodable::decode(__decoder),
                            modifier: ::rustc_serialize::Decodable::decode(__decoder),
                            span: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `InlineAsmTemplatePiece`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for InlineAsmTemplatePiece {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            InlineAsmTemplatePiece::String(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "String",
                    &__self_0),
            InlineAsmTemplatePiece::Placeholder {
                operand_idx: __self_0, modifier: __self_1, span: __self_2 } =>
                ::core::fmt::Formatter::debug_struct_field3_finish(f,
                    "Placeholder", "operand_idx", __self_0, "modifier",
                    __self_1, "span", &__self_2),
        }
    }
}Debug, #[automatically_derived]
impl ::core::hash::Hash for InlineAsmTemplatePiece {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            InlineAsmTemplatePiece::String(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            InlineAsmTemplatePiece::Placeholder {
                operand_idx: __self_0, modifier: __self_1, span: __self_2 } =>
                {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state);
                ::core::hash::Hash::hash(__self_2, state)
            }
        }
    }
}Hash, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            InlineAsmTemplatePiece {
            #[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 {
                    InlineAsmTemplatePiece::String(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    InlineAsmTemplatePiece::Placeholder {
                        operand_idx: ref __binding_0,
                        modifier: ref __binding_1,
                        span: ref __binding_2 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            InlineAsmTemplatePiece where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    InlineAsmTemplatePiece::String(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    InlineAsmTemplatePiece::Placeholder {
                        operand_idx: ref __binding_0,
                        modifier: ref __binding_1,
                        span: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for
            InlineAsmTemplatePiece where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    InlineAsmTemplatePiece::String(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    InlineAsmTemplatePiece::Placeholder {
                        operand_idx: ref mut __binding_0,
                        modifier: ref mut __binding_1,
                        span: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2770pub enum InlineAsmTemplatePiece {
2771    String(Cow<'static, str>),
2772    Placeholder { operand_idx: usize, modifier: Option<char>, span: Span },
2773}
2774
2775impl fmt::Display for InlineAsmTemplatePiece {
2776    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2777        match self {
2778            Self::String(s) => {
2779                for c in s.chars() {
2780                    match c {
2781                        '{' => f.write_str("{{")?,
2782                        '}' => f.write_str("}}")?,
2783                        _ => c.fmt(f)?,
2784                    }
2785                }
2786                Ok(())
2787            }
2788            Self::Placeholder { operand_idx, modifier: Some(modifier), .. } => {
2789                f.write_fmt(format_args!("{{{0}:{1}}}", operand_idx, modifier))write!(f, "{{{operand_idx}:{modifier}}}")
2790            }
2791            Self::Placeholder { operand_idx, modifier: None, .. } => {
2792                f.write_fmt(format_args!("{{{0}}}", operand_idx))write!(f, "{{{operand_idx}}}")
2793            }
2794        }
2795    }
2796}
2797
2798impl InlineAsmTemplatePiece {
2799    /// Rebuilds the asm template string from its pieces.
2800    pub fn to_string(s: &[Self]) -> String {
2801        use fmt::Write;
2802        let mut out = String::new();
2803        for p in s.iter() {
2804            let _ = out.write_fmt(format_args!("{0}", p))write!(out, "{p}");
2805        }
2806        out
2807    }
2808}
2809
2810/// Inline assembly symbol operands get their own AST node that is somewhat
2811/// similar to `AnonConst`.
2812///
2813/// The main difference is that we specifically don't assign it `DefId` in
2814/// `DefCollector`. Instead this is deferred until AST lowering where we
2815/// lower it to an `AnonConst` (for functions) or a `Path` (for statics)
2816/// depending on what the path resolves to.
2817#[derive(#[automatically_derived]
impl ::core::clone::Clone for InlineAsmSym {
    #[inline]
    fn clone(&self) -> InlineAsmSym {
        InlineAsmSym {
            id: ::core::clone::Clone::clone(&self.id),
            qself: ::core::clone::Clone::clone(&self.qself),
            path: ::core::clone::Clone::clone(&self.path),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for InlineAsmSym {
            fn encode(&self, __encoder: &mut __E) {
                let InlineAsmSym {
                        id: ref __binding_0,
                        qself: ref __binding_1,
                        path: 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);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for InlineAsmSym {
            fn decode(__decoder: &mut __D) -> Self {
                InlineAsmSym {
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    qself: ::rustc_serialize::Decodable::decode(__decoder),
                    path: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for InlineAsmSym {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "InlineAsmSym",
            "id", &self.id, "qself", &self.qself, "path", &&self.path)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for InlineAsmSym
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    InlineAsmSym {
                        id: ref __binding_0,
                        qself: ref __binding_1,
                        path: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for InlineAsmSym where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    InlineAsmSym {
                        id: ref mut __binding_0,
                        qself: ref mut __binding_1,
                        path: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2818pub struct InlineAsmSym {
2819    pub id: NodeId,
2820    pub qself: Option<Box<QSelf>>,
2821    pub path: Path,
2822}
2823
2824/// Inline assembly operand.
2825///
2826/// E.g., `out("eax") result` as in `asm!("mov eax, 2", out("eax") result)`.
2827#[derive(#[automatically_derived]
impl ::core::clone::Clone for InlineAsmOperand {
    #[inline]
    fn clone(&self) -> InlineAsmOperand {
        match self {
            InlineAsmOperand::In { reg: __self_0, expr: __self_1 } =>
                InlineAsmOperand::In {
                    reg: ::core::clone::Clone::clone(__self_0),
                    expr: ::core::clone::Clone::clone(__self_1),
                },
            InlineAsmOperand::Out {
                reg: __self_0, late: __self_1, expr: __self_2 } =>
                InlineAsmOperand::Out {
                    reg: ::core::clone::Clone::clone(__self_0),
                    late: ::core::clone::Clone::clone(__self_1),
                    expr: ::core::clone::Clone::clone(__self_2),
                },
            InlineAsmOperand::InOut {
                reg: __self_0, late: __self_1, expr: __self_2 } =>
                InlineAsmOperand::InOut {
                    reg: ::core::clone::Clone::clone(__self_0),
                    late: ::core::clone::Clone::clone(__self_1),
                    expr: ::core::clone::Clone::clone(__self_2),
                },
            InlineAsmOperand::SplitInOut {
                reg: __self_0,
                late: __self_1,
                in_expr: __self_2,
                out_expr: __self_3 } =>
                InlineAsmOperand::SplitInOut {
                    reg: ::core::clone::Clone::clone(__self_0),
                    late: ::core::clone::Clone::clone(__self_1),
                    in_expr: ::core::clone::Clone::clone(__self_2),
                    out_expr: ::core::clone::Clone::clone(__self_3),
                },
            InlineAsmOperand::Const { anon_const: __self_0 } =>
                InlineAsmOperand::Const {
                    anon_const: ::core::clone::Clone::clone(__self_0),
                },
            InlineAsmOperand::Sym { sym: __self_0 } =>
                InlineAsmOperand::Sym {
                    sym: ::core::clone::Clone::clone(__self_0),
                },
            InlineAsmOperand::Label { block: __self_0 } =>
                InlineAsmOperand::Label {
                    block: ::core::clone::Clone::clone(__self_0),
                },
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for InlineAsmOperand {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        InlineAsmOperand::In {
                            reg: ref __binding_0, expr: ref __binding_1 } => {
                            0usize
                        }
                        InlineAsmOperand::Out {
                            reg: ref __binding_0,
                            late: ref __binding_1,
                            expr: ref __binding_2 } => {
                            1usize
                        }
                        InlineAsmOperand::InOut {
                            reg: ref __binding_0,
                            late: ref __binding_1,
                            expr: ref __binding_2 } => {
                            2usize
                        }
                        InlineAsmOperand::SplitInOut {
                            reg: ref __binding_0,
                            late: ref __binding_1,
                            in_expr: ref __binding_2,
                            out_expr: ref __binding_3 } => {
                            3usize
                        }
                        InlineAsmOperand::Const { anon_const: ref __binding_0 } => {
                            4usize
                        }
                        InlineAsmOperand::Sym { sym: ref __binding_0 } => { 5usize }
                        InlineAsmOperand::Label { block: ref __binding_0 } => {
                            6usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    InlineAsmOperand::In {
                        reg: ref __binding_0, expr: 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,
                        expr: 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,
                        expr: 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::SplitInOut {
                        reg: ref __binding_0,
                        late: ref __binding_1,
                        in_expr: ref __binding_2,
                        out_expr: 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 { anon_const: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    InlineAsmOperand::Sym { sym: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    InlineAsmOperand::Label { block: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for InlineAsmOperand {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        InlineAsmOperand::In {
                            reg: ::rustc_serialize::Decodable::decode(__decoder),
                            expr: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    1usize => {
                        InlineAsmOperand::Out {
                            reg: ::rustc_serialize::Decodable::decode(__decoder),
                            late: ::rustc_serialize::Decodable::decode(__decoder),
                            expr: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    2usize => {
                        InlineAsmOperand::InOut {
                            reg: ::rustc_serialize::Decodable::decode(__decoder),
                            late: ::rustc_serialize::Decodable::decode(__decoder),
                            expr: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    3usize => {
                        InlineAsmOperand::SplitInOut {
                            reg: ::rustc_serialize::Decodable::decode(__decoder),
                            late: ::rustc_serialize::Decodable::decode(__decoder),
                            in_expr: ::rustc_serialize::Decodable::decode(__decoder),
                            out_expr: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    4usize => {
                        InlineAsmOperand::Const {
                            anon_const: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    5usize => {
                        InlineAsmOperand::Sym {
                            sym: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    6usize => {
                        InlineAsmOperand::Label {
                            block: ::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));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for InlineAsmOperand {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            InlineAsmOperand::In { reg: __self_0, expr: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f, "In",
                    "reg", __self_0, "expr", &__self_1),
            InlineAsmOperand::Out {
                reg: __self_0, late: __self_1, expr: __self_2 } =>
                ::core::fmt::Formatter::debug_struct_field3_finish(f, "Out",
                    "reg", __self_0, "late", __self_1, "expr", &__self_2),
            InlineAsmOperand::InOut {
                reg: __self_0, late: __self_1, expr: __self_2 } =>
                ::core::fmt::Formatter::debug_struct_field3_finish(f, "InOut",
                    "reg", __self_0, "late", __self_1, "expr", &__self_2),
            InlineAsmOperand::SplitInOut {
                reg: __self_0,
                late: __self_1,
                in_expr: __self_2,
                out_expr: __self_3 } =>
                ::core::fmt::Formatter::debug_struct_field4_finish(f,
                    "SplitInOut", "reg", __self_0, "late", __self_1, "in_expr",
                    __self_2, "out_expr", &__self_3),
            InlineAsmOperand::Const { anon_const: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Const",
                    "anon_const", &__self_0),
            InlineAsmOperand::Sym { sym: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Sym",
                    "sym", &__self_0),
            InlineAsmOperand::Label { block: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Label",
                    "block", &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            InlineAsmOperand where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    InlineAsmOperand::In {
                        reg: ref __binding_0, expr: ref __binding_1 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    InlineAsmOperand::Out {
                        reg: ref __binding_0,
                        late: ref __binding_1,
                        expr: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    InlineAsmOperand::InOut {
                        reg: ref __binding_0,
                        late: ref __binding_1,
                        expr: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    InlineAsmOperand::SplitInOut {
                        reg: ref __binding_0,
                        late: ref __binding_1,
                        in_expr: ref __binding_2,
                        out_expr: ref __binding_3 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    InlineAsmOperand::Const { anon_const: ref __binding_0 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    InlineAsmOperand::Sym { sym: ref __binding_0 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    InlineAsmOperand::Label { block: ref __binding_0 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for InlineAsmOperand
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    InlineAsmOperand::In {
                        reg: ref mut __binding_0, expr: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                    InlineAsmOperand::Out {
                        reg: ref mut __binding_0,
                        late: ref mut __binding_1,
                        expr: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                    InlineAsmOperand::InOut {
                        reg: ref mut __binding_0,
                        late: ref mut __binding_1,
                        expr: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                    InlineAsmOperand::SplitInOut {
                        reg: ref mut __binding_0,
                        late: ref mut __binding_1,
                        in_expr: ref mut __binding_2,
                        out_expr: ref mut __binding_3 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                    }
                    InlineAsmOperand::Const { anon_const: ref mut __binding_0 }
                        => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    InlineAsmOperand::Sym { sym: ref mut __binding_0 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    InlineAsmOperand::Label { block: ref mut __binding_0 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2828pub enum InlineAsmOperand {
2829    In {
2830        reg: InlineAsmRegOrRegClass,
2831        expr: Box<Expr>,
2832    },
2833    Out {
2834        reg: InlineAsmRegOrRegClass,
2835        late: bool,
2836        expr: Option<Box<Expr>>,
2837    },
2838    InOut {
2839        reg: InlineAsmRegOrRegClass,
2840        late: bool,
2841        expr: Box<Expr>,
2842    },
2843    SplitInOut {
2844        reg: InlineAsmRegOrRegClass,
2845        late: bool,
2846        in_expr: Box<Expr>,
2847        out_expr: Option<Box<Expr>>,
2848    },
2849    Const {
2850        anon_const: AnonConst,
2851    },
2852    Sym {
2853        sym: InlineAsmSym,
2854    },
2855    Label {
2856        block: Box<Block>,
2857    },
2858}
2859
2860impl InlineAsmOperand {
2861    pub fn reg(&self) -> Option<&InlineAsmRegOrRegClass> {
2862        match self {
2863            Self::In { reg, .. }
2864            | Self::Out { reg, .. }
2865            | Self::InOut { reg, .. }
2866            | Self::SplitInOut { reg, .. } => Some(reg),
2867            Self::Const { .. } | Self::Sym { .. } | Self::Label { .. } => None,
2868        }
2869    }
2870}
2871
2872#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for AsmMacro { }
#[automatically_derived]
impl ::core::clone::Clone for AsmMacro {
    #[inline]
    fn clone(&self) -> AsmMacro { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for AsmMacro { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for AsmMacro {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        AsmMacro::Asm => { 0usize }
                        AsmMacro::GlobalAsm => { 1usize }
                        AsmMacro::NakedAsm => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for AsmMacro {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { AsmMacro::Asm }
                    1usize => { AsmMacro::GlobalAsm }
                    2usize => { AsmMacro::NakedAsm }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `AsmMacro`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for AsmMacro {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                AsmMacro::Asm => "Asm",
                AsmMacro::GlobalAsm => "GlobalAsm",
                AsmMacro::NakedAsm => "NakedAsm",
            })
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for AsmMacro {
            #[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 {
                    AsmMacro::Asm => {}
                    AsmMacro::GlobalAsm => {}
                    AsmMacro::NakedAsm => {}
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for AsmMacro
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    AsmMacro::Asm => {}
                    AsmMacro::GlobalAsm => {}
                    AsmMacro::NakedAsm => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for AsmMacro where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    AsmMacro::Asm => {}
                    AsmMacro::GlobalAsm => {}
                    AsmMacro::NakedAsm => {}
                }
            }
        }
    };Walkable, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for AsmMacro { }
#[automatically_derived]
impl ::core::cmp::PartialEq for AsmMacro {
    #[inline]
    fn eq(&self, other: &AsmMacro) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for AsmMacro {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq)]
2873pub enum AsmMacro {
2874    /// The `asm!` macro
2875    Asm,
2876    /// The `global_asm!` macro
2877    GlobalAsm,
2878    /// The `naked_asm!` macro
2879    NakedAsm,
2880}
2881
2882impl AsmMacro {
2883    pub const fn macro_name(self) -> &'static str {
2884        match self {
2885            AsmMacro::Asm => "asm",
2886            AsmMacro::GlobalAsm => "global_asm",
2887            AsmMacro::NakedAsm => "naked_asm",
2888        }
2889    }
2890
2891    pub const fn is_supported_option(self, option: InlineAsmOptions) -> bool {
2892        match self {
2893            AsmMacro::Asm => true,
2894            AsmMacro::GlobalAsm => InlineAsmOptions::GLOBAL_OPTIONS.contains(option),
2895            AsmMacro::NakedAsm => InlineAsmOptions::NAKED_OPTIONS.contains(option),
2896        }
2897    }
2898
2899    pub const fn diverges(self, options: InlineAsmOptions) -> bool {
2900        match self {
2901            AsmMacro::Asm => options.contains(InlineAsmOptions::NORETURN),
2902            AsmMacro::GlobalAsm => true,
2903            AsmMacro::NakedAsm => true,
2904        }
2905    }
2906}
2907
2908/// Inline assembly.
2909///
2910/// E.g., `asm!("NOP");`.
2911#[derive(#[automatically_derived]
impl ::core::clone::Clone for InlineAsm {
    #[inline]
    fn clone(&self) -> InlineAsm {
        InlineAsm {
            asm_macro: ::core::clone::Clone::clone(&self.asm_macro),
            template: ::core::clone::Clone::clone(&self.template),
            template_strs: ::core::clone::Clone::clone(&self.template_strs),
            operands: ::core::clone::Clone::clone(&self.operands),
            clobber_abis: ::core::clone::Clone::clone(&self.clobber_abis),
            options: ::core::clone::Clone::clone(&self.options),
            line_spans: ::core::clone::Clone::clone(&self.line_spans),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for InlineAsm {
            fn encode(&self, __encoder: &mut __E) {
                let InlineAsm {
                        asm_macro: ref __binding_0,
                        template: ref __binding_1,
                        template_strs: ref __binding_2,
                        operands: ref __binding_3,
                        clobber_abis: ref __binding_4,
                        options: ref __binding_5,
                        line_spans: ref __binding_6 } = *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);
                ::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);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for InlineAsm {
            fn decode(__decoder: &mut __D) -> Self {
                InlineAsm {
                    asm_macro: ::rustc_serialize::Decodable::decode(__decoder),
                    template: ::rustc_serialize::Decodable::decode(__decoder),
                    template_strs: ::rustc_serialize::Decodable::decode(__decoder),
                    operands: ::rustc_serialize::Decodable::decode(__decoder),
                    clobber_abis: ::rustc_serialize::Decodable::decode(__decoder),
                    options: ::rustc_serialize::Decodable::decode(__decoder),
                    line_spans: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for InlineAsm {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["asm_macro", "template", "template_strs", "operands",
                        "clobber_abis", "options", "line_spans"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.asm_macro, &self.template, &self.template_strs,
                        &self.operands, &self.clobber_abis, &self.options,
                        &&self.line_spans];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "InlineAsm",
            names, values)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for InlineAsm
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    InlineAsm {
                        asm_macro: ref __binding_0,
                        template: ref __binding_1,
                        template_strs: ref __binding_2,
                        operands: ref __binding_3,
                        clobber_abis: ref __binding_4,
                        options: ref __binding_5,
                        line_spans: ref __binding_6 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {}
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_6,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for InlineAsm where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    InlineAsm {
                        asm_macro: ref mut __binding_0,
                        template: ref mut __binding_1,
                        template_strs: ref mut __binding_2,
                        operands: ref mut __binding_3,
                        clobber_abis: ref mut __binding_4,
                        options: ref mut __binding_5,
                        line_spans: ref mut __binding_6 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                        {}
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_6,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2912pub struct InlineAsm {
2913    pub asm_macro: AsmMacro,
2914    pub template: Vec<InlineAsmTemplatePiece>,
2915    pub template_strs: Box<[(Symbol, Option<Symbol>, Span)]>,
2916    pub operands: Vec<(InlineAsmOperand, Span)>,
2917    pub clobber_abis: Vec<(Symbol, Span)>,
2918    #[visitable(ignore)]
2919    pub options: InlineAsmOptions,
2920    pub line_spans: Vec<Span>,
2921}
2922
2923/// A parameter in a function header.
2924///
2925/// E.g., `bar: usize` as in `fn foo(bar: usize)`.
2926#[derive(#[automatically_derived]
impl ::core::clone::Clone for Param {
    #[inline]
    fn clone(&self) -> Param {
        Param {
            attrs: ::core::clone::Clone::clone(&self.attrs),
            ty: ::core::clone::Clone::clone(&self.ty),
            pat: ::core::clone::Clone::clone(&self.pat),
            id: ::core::clone::Clone::clone(&self.id),
            span: ::core::clone::Clone::clone(&self.span),
            is_placeholder: ::core::clone::Clone::clone(&self.is_placeholder),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Param {
            fn encode(&self, __encoder: &mut __E) {
                let Param {
                        attrs: ref __binding_0,
                        ty: ref __binding_1,
                        pat: ref __binding_2,
                        id: ref __binding_3,
                        span: ref __binding_4,
                        is_placeholder: ref __binding_5 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_5,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Param {
            fn decode(__decoder: &mut __D) -> Self {
                Param {
                    attrs: ::rustc_serialize::Decodable::decode(__decoder),
                    ty: ::rustc_serialize::Decodable::decode(__decoder),
                    pat: ::rustc_serialize::Decodable::decode(__decoder),
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    is_placeholder: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Param {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["attrs", "ty", "pat", "id", "span", "is_placeholder"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.attrs, &self.ty, &self.pat, &self.id, &self.span,
                        &&self.is_placeholder];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "Param", names,
            values)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Param where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Param {
                        attrs: ref __binding_0,
                        ty: ref __binding_1,
                        pat: ref __binding_2,
                        id: ref __binding_3,
                        span: ref __binding_4,
                        is_placeholder: ref __binding_5 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_5,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Param where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Param {
                        attrs: ref mut __binding_0,
                        ty: ref mut __binding_1,
                        pat: ref mut __binding_2,
                        id: ref mut __binding_3,
                        span: ref mut __binding_4,
                        is_placeholder: ref mut __binding_5 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_5,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2927pub struct Param {
2928    pub attrs: AttrVec,
2929    pub ty: Box<Ty>,
2930    pub pat: Box<Pat>,
2931    pub id: NodeId,
2932    pub span: Span,
2933    pub is_placeholder: bool,
2934}
2935
2936/// Alternative representation for `Arg`s describing `self` parameter of methods.
2937///
2938/// E.g., `&mut self` as in `fn foo(&mut self)`.
2939#[derive(#[automatically_derived]
impl ::core::clone::Clone for SelfKind {
    #[inline]
    fn clone(&self) -> SelfKind {
        match self {
            SelfKind::Value(__self_0) =>
                SelfKind::Value(::core::clone::Clone::clone(__self_0)),
            SelfKind::Region(__self_0, __self_1) =>
                SelfKind::Region(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            SelfKind::Pinned(__self_0, __self_1) =>
                SelfKind::Pinned(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            SelfKind::Explicit(__self_0, __self_1) =>
                SelfKind::Explicit(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for SelfKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        SelfKind::Value(ref __binding_0) => { 0usize }
                        SelfKind::Region(ref __binding_0, ref __binding_1) => {
                            1usize
                        }
                        SelfKind::Pinned(ref __binding_0, ref __binding_1) => {
                            2usize
                        }
                        SelfKind::Explicit(ref __binding_0, ref __binding_1) => {
                            3usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    SelfKind::Value(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    SelfKind::Region(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    SelfKind::Pinned(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    SelfKind::Explicit(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for SelfKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        SelfKind::Value(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        SelfKind::Region(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        SelfKind::Pinned(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => {
                        SelfKind::Explicit(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `SelfKind`, expected 0..4, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for SelfKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            SelfKind::Value(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Value",
                    &__self_0),
            SelfKind::Region(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Region",
                    __self_0, &__self_1),
            SelfKind::Pinned(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Pinned",
                    __self_0, &__self_1),
            SelfKind::Explicit(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "Explicit", __self_0, &__self_1),
        }
    }
}Debug)]
2940pub enum SelfKind {
2941    /// `self`, `mut self`
2942    Value(Mutability),
2943    /// `&'lt self`, `&'lt mut self`
2944    Region(Option<Lifetime>, Mutability),
2945    /// `&'lt pin const self`, `&'lt pin mut self`
2946    Pinned(Option<Lifetime>, Mutability),
2947    /// `self: TYPE`, `mut self: TYPE`
2948    Explicit(Box<Ty>, Mutability),
2949}
2950
2951impl SelfKind {
2952    pub fn to_ref_suggestion(&self) -> String {
2953        match self {
2954            SelfKind::Region(None, mutbl) => mutbl.ref_prefix_str().to_string(),
2955            SelfKind::Region(Some(lt), mutbl) => ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("&{1} {0}", mutbl.prefix_str(), lt))
    })format!("&{lt} {}", mutbl.prefix_str()),
2956            SelfKind::Pinned(None, mutbl) => ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("&pin {0}", mutbl.ptr_str()))
    })format!("&pin {}", mutbl.ptr_str()),
2957            SelfKind::Pinned(Some(lt), mutbl) => ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("&{1} pin {0}", mutbl.ptr_str(),
                lt))
    })format!("&{lt} pin {}", mutbl.ptr_str()),
2958            SelfKind::Value(_) | SelfKind::Explicit(_, _) => {
2959                {
    ::core::panicking::panic_fmt(format_args!("internal error: entered unreachable code: {0}",
            format_args!("if we had an explicit self, we wouldn\'t be here")));
}unreachable!("if we had an explicit self, we wouldn't be here")
2960            }
2961        }
2962    }
2963}
2964
2965pub type ExplicitSelf = Spanned<SelfKind>;
2966
2967impl Param {
2968    /// Attempts to cast parameter to `ExplicitSelf`.
2969    pub fn to_self(&self) -> Option<ExplicitSelf> {
2970        if let PatKind::Ident(BindingMode(ByRef::No, mutbl), ident, _) = self.pat.kind {
2971            if ident.name == kw::SelfLower {
2972                return match self.ty.kind {
2973                    TyKind::ImplicitSelf => Some(respan(self.pat.span, SelfKind::Value(mutbl))),
2974                    TyKind::Ref(lt, MutTy { ref ty, mutbl }) if ty.kind.is_implicit_self() => {
2975                        Some(respan(self.pat.span, SelfKind::Region(lt, mutbl)))
2976                    }
2977                    TyKind::PinnedRef(lt, MutTy { ref ty, mutbl })
2978                        if ty.kind.is_implicit_self() =>
2979                    {
2980                        Some(respan(self.pat.span, SelfKind::Pinned(lt, mutbl)))
2981                    }
2982                    _ => Some(respan(
2983                        self.pat.span.to(self.ty.span),
2984                        SelfKind::Explicit(self.ty.clone(), mutbl),
2985                    )),
2986                };
2987            }
2988        }
2989        None
2990    }
2991
2992    /// Returns `true` if parameter is `self`.
2993    pub fn is_self(&self) -> bool {
2994        if let PatKind::Ident(_, ident, _) = self.pat.kind {
2995            ident.name == kw::SelfLower
2996        } else {
2997            false
2998        }
2999    }
3000
3001    /// Builds a `Param` object from `ExplicitSelf`.
3002    pub fn from_self(attrs: AttrVec, eself: ExplicitSelf, eself_ident: Ident) -> Param {
3003        let span = eself.span.to(eself_ident.span);
3004        let infer_ty =
3005            Box::new(Ty { id: DUMMY_NODE_ID, kind: TyKind::ImplicitSelf, span: eself_ident.span });
3006        let (mutbl, ty) = match eself.node {
3007            SelfKind::Explicit(ty, mutbl) => (mutbl, ty),
3008            SelfKind::Value(mutbl) => (mutbl, infer_ty),
3009            SelfKind::Region(lt, mutbl) => (
3010                Mutability::Not,
3011                Box::new(Ty {
3012                    id: DUMMY_NODE_ID,
3013                    kind: TyKind::Ref(lt, MutTy { ty: infer_ty, mutbl }),
3014                    span,
3015                }),
3016            ),
3017            SelfKind::Pinned(lt, mutbl) => (
3018                Mutability::Not,
3019                Box::new(Ty {
3020                    id: DUMMY_NODE_ID,
3021                    kind: TyKind::PinnedRef(lt, MutTy { ty: infer_ty, mutbl }),
3022                    span,
3023                }),
3024            ),
3025        };
3026        Param {
3027            attrs,
3028            pat: Box::new(Pat {
3029                id: DUMMY_NODE_ID,
3030                kind: PatKind::Ident(BindingMode(ByRef::No, mutbl), eself_ident, None),
3031                span,
3032            }),
3033            span,
3034            ty,
3035            id: DUMMY_NODE_ID,
3036            is_placeholder: false,
3037        }
3038    }
3039}
3040
3041/// A signature (not the body) of a function declaration.
3042///
3043/// E.g., `fn foo(bar: baz)`.
3044///
3045/// Please note that it's different from `FnHeader` structure
3046/// which contains metadata about function safety, asyncness, constness and ABI.
3047#[derive(#[automatically_derived]
impl ::core::clone::Clone for FnDecl {
    #[inline]
    fn clone(&self) -> FnDecl {
        FnDecl {
            inputs: ::core::clone::Clone::clone(&self.inputs),
            output: ::core::clone::Clone::clone(&self.output),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for FnDecl {
            fn encode(&self, __encoder: &mut __E) {
                let FnDecl { inputs: ref __binding_0, output: ref __binding_1
                        } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for FnDecl {
            fn decode(__decoder: &mut __D) -> Self {
                FnDecl {
                    inputs: ::rustc_serialize::Decodable::decode(__decoder),
                    output: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for FnDecl {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "FnDecl",
            "inputs", &self.inputs, "output", &&self.output)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for FnDecl where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    FnDecl { inputs: ref __binding_0, output: ref __binding_1 }
                        => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for FnDecl where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    FnDecl {
                        inputs: ref mut __binding_0, output: ref mut __binding_1 }
                        => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3048pub struct FnDecl {
3049    pub inputs: ThinVec<Param>,
3050    pub output: FnRetTy,
3051}
3052
3053impl FnDecl {
3054    pub fn has_self(&self) -> bool {
3055        self.inputs.get(0).is_some_and(Param::is_self)
3056    }
3057
3058    pub fn c_variadic(&self) -> bool {
3059        self.inputs.last().is_some_and(|arg| #[allow(non_exhaustive_omitted_patterns)] match arg.ty.kind {
    TyKind::CVarArgs => true,
    _ => false,
}matches!(arg.ty.kind, TyKind::CVarArgs))
3060    }
3061
3062    /// The marker index for "no splatted arguments".
3063    /// Higher values are also not supported, for performance reasons.
3064    ///
3065    /// Must have the same value as `FnSigKind::NO_SPLATTED_ARG_INDEX` and `FnDeclFlags::NO_SPLATTED_ARG_INDEX`.
3066    pub const NO_SPLATTED_ARG_INDEX: u8 = u8::MAX;
3067
3068    /// The maximum valid splatted argument index.
3069    pub const MAX_VALID_SPLATTED_ARG_INDEX: u8 = Self::NO_SPLATTED_ARG_INDEX - 1;
3070
3071    /// Returns a splatted argument index, if any are present.
3072    pub fn splatted(&self) -> Option<u8> {
3073        self.inputs.iter().enumerate().find_map(|(index, arg)| {
3074            if index >= usize::from(Self::NO_SPLATTED_ARG_INDEX) {
3075                // AST validation has already checked the splatted argument index is valid, so just
3076                // ignore invalid indexes here.
3077                None
3078            } else {
3079                arg.attrs
3080                    .iter()
3081                    .any(|attr| attr.has_name(sym::rustc_splat))
3082                    .then_some(u8::try_from(index).unwrap())
3083            }
3084        })
3085    }
3086}
3087
3088/// Is the trait definition an auto trait?
3089#[derive(#[automatically_derived]
impl ::core::marker::Copy for IsAuto { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for IsAuto { }
#[automatically_derived]
impl ::core::clone::Clone for IsAuto {
    #[inline]
    fn clone(&self) -> IsAuto { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for IsAuto { }
#[automatically_derived]
impl ::core::cmp::PartialEq for IsAuto {
    #[inline]
    fn eq(&self, other: &IsAuto) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for IsAuto {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        IsAuto::Yes => { 0usize }
                        IsAuto::No => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for IsAuto {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { IsAuto::Yes }
                    1usize => { IsAuto::No }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `IsAuto`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for IsAuto {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self { IsAuto::Yes => "Yes", IsAuto::No => "No", })
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for IsAuto {
            #[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 { IsAuto::Yes => {} IsAuto::No => {} }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for IsAuto where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self { IsAuto::Yes => {} IsAuto::No => {} }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for IsAuto where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self { IsAuto::Yes => {} IsAuto::No => {} }
            }
        }
    };Walkable)]
3090pub enum IsAuto {
3091    Yes,
3092    No,
3093}
3094
3095/// Safety of items.
3096#[derive(#[automatically_derived]
impl ::core::marker::Copy for Safety { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Safety { }
#[automatically_derived]
impl ::core::clone::Clone for Safety {
    #[inline]
    fn clone(&self) -> Safety {
        let _: ::core::clone::AssertParamIsClone<Span>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for Safety { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Safety {
    #[inline]
    fn eq(&self, other: &Safety) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (Safety::Unsafe(__self_0), Safety::Unsafe(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Safety::Safe(__self_0), Safety::Safe(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Safety {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Span>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for Safety {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            Safety::Unsafe(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            Safety::Safe(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            _ => {}
        }
    }
}Hash, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Safety {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        Safety::Unsafe(ref __binding_0) => { 0usize }
                        Safety::Safe(ref __binding_0) => { 1usize }
                        Safety::Default => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    Safety::Unsafe(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    Safety::Safe(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    Safety::Default => {}
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Safety {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        Safety::Unsafe(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        Safety::Safe(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => { Safety::Default }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Safety`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Safety {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Safety::Unsafe(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Unsafe",
                    &__self_0),
            Safety::Safe(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Safe",
                    &__self_0),
            Safety::Default =>
                ::core::fmt::Formatter::write_str(f, "Default"),
        }
    }
}Debug)]
3097#[derive(const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for Safety {
            #[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 {
                    Safety::Unsafe(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    Safety::Safe(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    Safety::Default => {}
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Safety where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Safety::Unsafe(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    Safety::Safe(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    Safety::Default => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Safety where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Safety::Unsafe(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    Safety::Safe(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    Safety::Default => {}
                }
            }
        }
    };Walkable)]
3098pub enum Safety {
3099    /// `unsafe` an item is explicitly marked as `unsafe`.
3100    Unsafe(Span),
3101    /// `safe` an item is explicitly marked as `safe`.
3102    Safe(Span),
3103    /// Default means no value was provided, it will take a default value given the context in
3104    /// which is used.
3105    Default,
3106}
3107
3108/// Describes the coroutine markers a function/closure has.
3109///
3110/// Coroutine markers are things that cause the function to generate a coroutine, such as `async`,
3111/// which makes the function return `impl Future`, or `gen`, which makes the function return `impl
3112/// Iterator`.
3113#[derive(#[automatically_derived]
impl ::core::marker::Copy for CoroutineMarker { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for CoroutineMarker { }
#[automatically_derived]
impl ::core::clone::Clone for CoroutineMarker {
    #[inline]
    fn clone(&self) -> CoroutineMarker {
        let _: ::core::clone::AssertParamIsClone<CoroutineKind>;
        let _: ::core::clone::AssertParamIsClone<Span>;
        let _: ::core::clone::AssertParamIsClone<NodeId>;
        *self
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for CoroutineMarker {
            fn encode(&self, __encoder: &mut __E) {
                let CoroutineMarker {
                        kind: ref __binding_0,
                        span: ref __binding_1,
                        closure_id: ref __binding_2,
                        return_impl_trait_id: ref __binding_3 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for CoroutineMarker {
            fn decode(__decoder: &mut __D) -> Self {
                CoroutineMarker {
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    closure_id: ::rustc_serialize::Decodable::decode(__decoder),
                    return_impl_trait_id: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for CoroutineMarker {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f,
            "CoroutineMarker", "kind", &self.kind, "span", &self.span,
            "closure_id", &self.closure_id, "return_impl_trait_id",
            &&self.return_impl_trait_id)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            CoroutineMarker where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    CoroutineMarker {
                        kind: ref __binding_0,
                        span: ref __binding_1,
                        closure_id: ref __binding_2,
                        return_impl_trait_id: ref __binding_3 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for CoroutineMarker where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    CoroutineMarker {
                        kind: ref mut __binding_0,
                        span: ref mut __binding_1,
                        closure_id: ref mut __binding_2,
                        return_impl_trait_id: ref mut __binding_3 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3114pub struct CoroutineMarker {
3115    pub kind: CoroutineKind,
3116    pub span: Span,
3117    pub closure_id: NodeId,
3118    /// The `NodeId` for the generated `impl Trait` item.
3119    pub return_impl_trait_id: NodeId,
3120}
3121
3122impl CoroutineMarker {
3123    pub fn new(kind: CoroutineKind, span: Span) -> Self {
3124        Self { kind, span, closure_id: DUMMY_NODE_ID, return_impl_trait_id: DUMMY_NODE_ID }
3125    }
3126}
3127
3128#[derive(#[automatically_derived]
impl ::core::marker::Copy for Const { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Const { }
#[automatically_derived]
impl ::core::clone::Clone for Const {
    #[inline]
    fn clone(&self) -> Const {
        let _: ::core::clone::AssertParamIsClone<Span>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for Const { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Const {
    #[inline]
    fn eq(&self, other: &Const) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (Const::Yes(__self_0), Const::Yes(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Const {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Span>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for Const {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            Const::Yes(__self_0) => ::core::hash::Hash::hash(__self_0, state),
            _ => {}
        }
    }
}Hash, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Const {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        Const::Yes(ref __binding_0) => { 0usize }
                        Const::No => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    Const::Yes(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    Const::No => {}
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Const {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        Const::Yes(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => { Const::No }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Const`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Const {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Const::Yes(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Yes",
                    &__self_0),
            Const::No => ::core::fmt::Formatter::write_str(f, "No"),
        }
    }
}Debug)]
3129#[derive(const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for Const {
            #[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 {
                    Const::Yes(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    Const::No => {}
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Const where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Const::Yes(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    Const::No => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Const where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Const::Yes(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    Const::No => {}
                }
            }
        }
    };Walkable)]
3130pub enum Const {
3131    Yes(Span),
3132    No,
3133}
3134
3135/// Item defaultness.
3136/// For details see the [RFC #2532](https://github.com/rust-lang/rfcs/pull/2532).
3137#[derive(#[automatically_derived]
impl ::core::marker::Copy for Defaultness { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Defaultness { }
#[automatically_derived]
impl ::core::clone::Clone for Defaultness {
    #[inline]
    fn clone(&self) -> Defaultness {
        let _: ::core::clone::AssertParamIsClone<Span>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for Defaultness { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Defaultness {
    #[inline]
    fn eq(&self, other: &Defaultness) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (Defaultness::Default(__self_0),
                    Defaultness::Default(__arg1_0)) => __self_0 == __arg1_0,
                (Defaultness::Final(__self_0), Defaultness::Final(__arg1_0))
                    => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Defaultness {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        Defaultness::Implicit => { 0usize }
                        Defaultness::Default(ref __binding_0) => { 1usize }
                        Defaultness::Final(ref __binding_0) => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    Defaultness::Implicit => {}
                    Defaultness::Default(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    Defaultness::Final(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Defaultness {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { Defaultness::Implicit }
                    1usize => {
                        Defaultness::Default(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        Defaultness::Final(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Defaultness`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Defaultness {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Defaultness::Implicit =>
                ::core::fmt::Formatter::write_str(f, "Implicit"),
            Defaultness::Default(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Default", &__self_0),
            Defaultness::Final(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Final",
                    &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for Defaultness
            {
            #[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 {
                    Defaultness::Implicit => {}
                    Defaultness::Default(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    Defaultness::Final(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Defaultness
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Defaultness::Implicit => {}
                    Defaultness::Default(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    Defaultness::Final(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Defaultness where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Defaultness::Implicit => {}
                    Defaultness::Default(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    Defaultness::Final(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3138pub enum Defaultness {
3139    /// Item is unmarked. Implicitly determined based off of position.
3140    /// For impls, this is `final`; for traits, this is `default`.
3141    ///
3142    /// If you're expanding an item in a built-in macro or parsing an item
3143    /// by hand, you probably want to use this.
3144    Implicit,
3145    /// `default`
3146    Default(Span),
3147    /// `final`; per RFC 3678, only trait items may be *explicitly* marked final.
3148    Final(Span),
3149}
3150
3151#[derive(#[automatically_derived]
impl ::core::marker::Copy for ImplPolarity { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for ImplPolarity { }
#[automatically_derived]
impl ::core::clone::Clone for ImplPolarity {
    #[inline]
    fn clone(&self) -> ImplPolarity {
        let _: ::core::clone::AssertParamIsClone<Span>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for ImplPolarity { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ImplPolarity {
    #[inline]
    fn eq(&self, other: &ImplPolarity) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (ImplPolarity::Negative(__self_0),
                    ImplPolarity::Negative(__arg1_0)) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ImplPolarity {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        ImplPolarity::Positive => { 0usize }
                        ImplPolarity::Negative(ref __binding_0) => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    ImplPolarity::Positive => {}
                    ImplPolarity::Negative(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ImplPolarity {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { ImplPolarity::Positive }
                    1usize => {
                        ImplPolarity::Negative(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `ImplPolarity`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for ImplPolarity
            {
            #[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 {
                    ImplPolarity::Positive => {}
                    ImplPolarity::Negative(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for ImplPolarity
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    ImplPolarity::Positive => {}
                    ImplPolarity::Negative(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for ImplPolarity where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    ImplPolarity::Positive => {}
                    ImplPolarity::Negative(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3152pub enum ImplPolarity {
3153    /// `impl Trait for Type`
3154    Positive,
3155    /// `impl !Trait for Type`
3156    Negative(Span),
3157}
3158
3159impl fmt::Debug for ImplPolarity {
3160    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3161        match *self {
3162            ImplPolarity::Positive => "positive".fmt(f),
3163            ImplPolarity::Negative(_) => "negative".fmt(f),
3164        }
3165    }
3166}
3167
3168/// The polarity of a trait bound.
3169#[derive(#[automatically_derived]
impl ::core::marker::Copy for BoundPolarity { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for BoundPolarity { }
#[automatically_derived]
impl ::core::clone::Clone for BoundPolarity {
    #[inline]
    fn clone(&self) -> BoundPolarity {
        let _: ::core::clone::AssertParamIsClone<Span>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for BoundPolarity { }
#[automatically_derived]
impl ::core::cmp::PartialEq for BoundPolarity {
    #[inline]
    fn eq(&self, other: &BoundPolarity) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (BoundPolarity::Negative(__self_0),
                    BoundPolarity::Negative(__arg1_0)) => __self_0 == __arg1_0,
                (BoundPolarity::Maybe(__self_0),
                    BoundPolarity::Maybe(__arg1_0)) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for BoundPolarity {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Span>;
    }
}Eq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for BoundPolarity {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        BoundPolarity::Positive => { 0usize }
                        BoundPolarity::Negative(ref __binding_0) => { 1usize }
                        BoundPolarity::Maybe(ref __binding_0) => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    BoundPolarity::Positive => {}
                    BoundPolarity::Negative(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    BoundPolarity::Maybe(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for BoundPolarity {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { BoundPolarity::Positive }
                    1usize => {
                        BoundPolarity::Negative(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        BoundPolarity::Maybe(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `BoundPolarity`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for BoundPolarity {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            BoundPolarity::Positive =>
                ::core::fmt::Formatter::write_str(f, "Positive"),
            BoundPolarity::Negative(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Negative", &__self_0),
            BoundPolarity::Maybe(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Maybe",
                    &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::hash::Hash for BoundPolarity {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            BoundPolarity::Negative(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            BoundPolarity::Maybe(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            _ => {}
        }
    }
}Hash)]
3170#[derive(const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            BoundPolarity {
            #[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 {
                    BoundPolarity::Positive => {}
                    BoundPolarity::Negative(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    BoundPolarity::Maybe(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            BoundPolarity where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    BoundPolarity::Positive => {}
                    BoundPolarity::Negative(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    BoundPolarity::Maybe(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for BoundPolarity where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    BoundPolarity::Positive => {}
                    BoundPolarity::Negative(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    BoundPolarity::Maybe(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3171pub enum BoundPolarity {
3172    /// `Type: Trait`
3173    Positive,
3174    /// `Type: !Trait`
3175    Negative(Span),
3176    /// `Type: ?Trait`
3177    Maybe(Span),
3178}
3179
3180impl BoundPolarity {
3181    pub fn as_str(self) -> &'static str {
3182        match self {
3183            Self::Positive => "",
3184            Self::Negative(_) => "!",
3185            Self::Maybe(_) => "?",
3186        }
3187    }
3188}
3189
3190/// The constness of a trait bound.
3191#[derive(#[automatically_derived]
impl ::core::marker::Copy for BoundConstness { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for BoundConstness { }
#[automatically_derived]
impl ::core::clone::Clone for BoundConstness {
    #[inline]
    fn clone(&self) -> BoundConstness {
        let _: ::core::clone::AssertParamIsClone<Span>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for BoundConstness { }
#[automatically_derived]
impl ::core::cmp::PartialEq for BoundConstness {
    #[inline]
    fn eq(&self, other: &BoundConstness) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (BoundConstness::Always(__self_0),
                    BoundConstness::Always(__arg1_0)) => __self_0 == __arg1_0,
                (BoundConstness::Maybe(__self_0),
                    BoundConstness::Maybe(__arg1_0)) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for BoundConstness {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Span>;
    }
}Eq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for BoundConstness {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        BoundConstness::Never => { 0usize }
                        BoundConstness::Always(ref __binding_0) => { 1usize }
                        BoundConstness::Maybe(ref __binding_0) => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    BoundConstness::Never => {}
                    BoundConstness::Always(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    BoundConstness::Maybe(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for BoundConstness {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { BoundConstness::Never }
                    1usize => {
                        BoundConstness::Always(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        BoundConstness::Maybe(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `BoundConstness`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for BoundConstness {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            BoundConstness::Never =>
                ::core::fmt::Formatter::write_str(f, "Never"),
            BoundConstness::Always(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Always",
                    &__self_0),
            BoundConstness::Maybe(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Maybe",
                    &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::hash::Hash for BoundConstness {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            BoundConstness::Always(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            BoundConstness::Maybe(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            _ => {}
        }
    }
}Hash)]
3192#[derive(const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            BoundConstness {
            #[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 {
                    BoundConstness::Never => {}
                    BoundConstness::Always(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    BoundConstness::Maybe(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            BoundConstness where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    BoundConstness::Never => {}
                    BoundConstness::Always(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    BoundConstness::Maybe(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for BoundConstness where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    BoundConstness::Never => {}
                    BoundConstness::Always(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    BoundConstness::Maybe(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3193pub enum BoundConstness {
3194    /// `Type: Trait`
3195    Never,
3196    /// `Type: const Trait`
3197    Always(Span),
3198    /// `Type: [const] Trait`
3199    Maybe(Span),
3200}
3201
3202impl BoundConstness {
3203    pub fn as_str(self) -> &'static str {
3204        match self {
3205            Self::Never => "",
3206            Self::Always(_) => "const",
3207            Self::Maybe(_) => "[const]",
3208        }
3209    }
3210}
3211
3212/// The asyncness of a trait bound.
3213#[derive(#[automatically_derived]
impl ::core::marker::Copy for BoundAsyncness { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for BoundAsyncness { }
#[automatically_derived]
impl ::core::clone::Clone for BoundAsyncness {
    #[inline]
    fn clone(&self) -> BoundAsyncness {
        let _: ::core::clone::AssertParamIsClone<Span>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for BoundAsyncness { }
#[automatically_derived]
impl ::core::cmp::PartialEq for BoundAsyncness {
    #[inline]
    fn eq(&self, other: &BoundAsyncness) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (BoundAsyncness::Async(__self_0),
                    BoundAsyncness::Async(__arg1_0)) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for BoundAsyncness {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Span>;
    }
}Eq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for BoundAsyncness {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        BoundAsyncness::Normal => { 0usize }
                        BoundAsyncness::Async(ref __binding_0) => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    BoundAsyncness::Normal => {}
                    BoundAsyncness::Async(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for BoundAsyncness {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { BoundAsyncness::Normal }
                    1usize => {
                        BoundAsyncness::Async(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `BoundAsyncness`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for BoundAsyncness {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            BoundAsyncness::Normal =>
                ::core::fmt::Formatter::write_str(f, "Normal"),
            BoundAsyncness::Async(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Async",
                    &__self_0),
        }
    }
}Debug)]
3214#[derive(const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            BoundAsyncness {
            #[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 {
                    BoundAsyncness::Normal => {}
                    BoundAsyncness::Async(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            BoundAsyncness where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    BoundAsyncness::Normal => {}
                    BoundAsyncness::Async(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for BoundAsyncness where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    BoundAsyncness::Normal => {}
                    BoundAsyncness::Async(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3215pub enum BoundAsyncness {
3216    /// `Type: Trait`
3217    Normal,
3218    /// `Type: async Trait`
3219    Async(Span),
3220}
3221
3222impl BoundAsyncness {
3223    pub fn as_str(self) -> &'static str {
3224        match self {
3225            Self::Normal => "",
3226            Self::Async(_) => "async",
3227        }
3228    }
3229}
3230
3231#[derive(#[automatically_derived]
impl ::core::clone::Clone for FnRetTy {
    #[inline]
    fn clone(&self) -> FnRetTy {
        match self {
            FnRetTy::Default(__self_0) =>
                FnRetTy::Default(::core::clone::Clone::clone(__self_0)),
            FnRetTy::Ty(__self_0) =>
                FnRetTy::Ty(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for FnRetTy {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        FnRetTy::Default(ref __binding_0) => { 0usize }
                        FnRetTy::Ty(ref __binding_0) => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    FnRetTy::Default(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    FnRetTy::Ty(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for FnRetTy {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        FnRetTy::Default(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        FnRetTy::Ty(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `FnRetTy`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for FnRetTy {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            FnRetTy::Default(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Default", &__self_0),
            FnRetTy::Ty(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Ty",
                    &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for FnRetTy
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    FnRetTy::Default(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    FnRetTy::Ty(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for FnRetTy where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    FnRetTy::Default(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    FnRetTy::Ty(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3232pub enum FnRetTy {
3233    /// Returns type is not specified.
3234    ///
3235    /// Functions default to `()` and closures default to inference.
3236    /// Span points to where return type would be inserted.
3237    Default(Span),
3238    /// Everything else.
3239    Ty(Box<Ty>),
3240}
3241
3242impl FnRetTy {
3243    pub fn span(&self) -> Span {
3244        match self {
3245            &FnRetTy::Default(span) => span,
3246            FnRetTy::Ty(ty) => ty.span,
3247        }
3248    }
3249}
3250
3251#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Inline { }
#[automatically_derived]
impl ::core::clone::Clone for Inline {
    #[inline]
    fn clone(&self) -> Inline {
        let _: ::core::clone::AssertParamIsClone<Result<(), ErrorGuaranteed>>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for Inline { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for Inline { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Inline {
    #[inline]
    fn eq(&self, other: &Inline) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (Inline::No { had_parse_error: __self_0 }, Inline::No {
                    had_parse_error: __arg1_0 }) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Inline {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        Inline::Yes => { 0usize }
                        Inline::No { had_parse_error: ref __binding_0 } => {
                            1usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    Inline::Yes => {}
                    Inline::No { had_parse_error: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Inline {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { Inline::Yes }
                    1usize => {
                        Inline::No {
                            had_parse_error: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Inline`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Inline {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Inline::Yes => ::core::fmt::Formatter::write_str(f, "Yes"),
            Inline::No { had_parse_error: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "No",
                    "had_parse_error", &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Inline where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Inline::Yes => {}
                    Inline::No { had_parse_error: ref __binding_0 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Inline where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Inline::Yes => {}
                    Inline::No { had_parse_error: ref mut __binding_0 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3252pub enum Inline {
3253    Yes,
3254    No { had_parse_error: Result<(), ErrorGuaranteed> },
3255}
3256
3257/// Module item kind.
3258#[derive(#[automatically_derived]
impl ::core::clone::Clone for ModKind {
    #[inline]
    fn clone(&self) -> ModKind {
        match self {
            ModKind::Loaded(__self_0, __self_1, __self_2) =>
                ModKind::Loaded(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ModKind::Unloaded => ModKind::Unloaded,
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ModKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        ModKind::Loaded(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            0usize
                        }
                        ModKind::Unloaded => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    ModKind::Loaded(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);
                    }
                    ModKind::Unloaded => {}
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ModKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        ModKind::Loaded(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => { ModKind::Unloaded }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `ModKind`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ModKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            ModKind::Loaded(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Loaded",
                    __self_0, __self_1, &__self_2),
            ModKind::Unloaded =>
                ::core::fmt::Formatter::write_str(f, "Unloaded"),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for ModKind
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    ModKind::Loaded(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    ModKind::Unloaded => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for ModKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    ModKind::Loaded(ref mut __binding_0, ref mut __binding_1,
                        ref mut __binding_2) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                    ModKind::Unloaded => {}
                }
            }
        }
    };Walkable)]
3259pub enum ModKind {
3260    /// Module with inlined definition `mod foo { ... }`,
3261    /// or with definition outlined to a separate file `mod foo;` and already loaded from it.
3262    /// The inner span is from the first token past `{` to the last token until `}`,
3263    /// or from the first to the last token in the loaded file.
3264    Loaded(ThinVec<Box<Item>>, Inline, ModSpans),
3265    /// Module with definition outlined to a separate file `mod foo;` but not yet loaded from it.
3266    Unloaded,
3267}
3268
3269#[derive(#[automatically_derived]
impl ::core::marker::Copy for ModSpans { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for ModSpans { }
#[automatically_derived]
impl ::core::clone::Clone for ModSpans {
    #[inline]
    fn clone(&self) -> ModSpans {
        let _: ::core::clone::AssertParamIsClone<Span>;
        *self
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ModSpans {
            fn encode(&self, __encoder: &mut __E) {
                let ModSpans {
                        inner_span: ref __binding_0,
                        inject_use_span: ref __binding_1 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ModSpans {
            fn decode(__decoder: &mut __D) -> Self {
                ModSpans {
                    inner_span: ::rustc_serialize::Decodable::decode(__decoder),
                    inject_use_span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ModSpans {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "ModSpans",
            "inner_span", &self.inner_span, "inject_use_span",
            &&self.inject_use_span)
    }
}Debug, #[automatically_derived]
impl ::core::default::Default for ModSpans {
    #[inline]
    fn default() -> ModSpans {
        ModSpans {
            inner_span: ::core::default::Default::default(),
            inject_use_span: ::core::default::Default::default(),
        }
    }
}Default, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for ModSpans
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    ModSpans {
                        inner_span: ref __binding_0,
                        inject_use_span: ref __binding_1 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for ModSpans where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    ModSpans {
                        inner_span: ref mut __binding_0,
                        inject_use_span: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3270pub struct ModSpans {
3271    /// `inner_span` covers the body of the module; for a file module, its the whole file.
3272    /// For an inline module, its the span inside the `{ ... }`, not including the curly braces.
3273    pub inner_span: Span,
3274    pub inject_use_span: Span,
3275}
3276
3277/// Foreign module declaration.
3278///
3279/// E.g., `extern { .. }` or `extern "C" { .. }`.
3280#[derive(#[automatically_derived]
impl ::core::clone::Clone for ForeignMod {
    #[inline]
    fn clone(&self) -> ForeignMod {
        ForeignMod {
            extern_span: ::core::clone::Clone::clone(&self.extern_span),
            safety: ::core::clone::Clone::clone(&self.safety),
            abi: ::core::clone::Clone::clone(&self.abi),
            items: ::core::clone::Clone::clone(&self.items),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ForeignMod {
            fn encode(&self, __encoder: &mut __E) {
                let ForeignMod {
                        extern_span: ref __binding_0,
                        safety: ref __binding_1,
                        abi: ref __binding_2,
                        items: ref __binding_3 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ForeignMod {
            fn decode(__decoder: &mut __D) -> Self {
                ForeignMod {
                    extern_span: ::rustc_serialize::Decodable::decode(__decoder),
                    safety: ::rustc_serialize::Decodable::decode(__decoder),
                    abi: ::rustc_serialize::Decodable::decode(__decoder),
                    items: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ForeignMod {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "ForeignMod",
            "extern_span", &self.extern_span, "safety", &self.safety, "abi",
            &self.abi, "items", &&self.items)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for ForeignMod
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    ForeignMod {
                        extern_span: ref __binding_0,
                        safety: ref __binding_1,
                        abi: ref __binding_2,
                        items: ref __binding_3 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for ForeignMod where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    ForeignMod {
                        extern_span: ref mut __binding_0,
                        safety: ref mut __binding_1,
                        abi: ref mut __binding_2,
                        items: ref mut __binding_3 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3281pub struct ForeignMod {
3282    /// Span of the `extern` keyword.
3283    pub extern_span: Span,
3284    /// `unsafe` keyword accepted syntactically for macro DSLs, but not
3285    /// semantically by Rust.
3286    pub safety: Safety,
3287    pub abi: Option<StrLit>,
3288    pub items: ThinVec<Box<ForeignItem>>,
3289}
3290
3291#[derive(#[automatically_derived]
impl ::core::clone::Clone for EnumDef {
    #[inline]
    fn clone(&self) -> EnumDef {
        EnumDef { variants: ::core::clone::Clone::clone(&self.variants) }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for EnumDef {
            fn encode(&self, __encoder: &mut __E) {
                let EnumDef { variants: ref __binding_0 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for EnumDef {
            fn decode(__decoder: &mut __D) -> Self {
                EnumDef {
                    variants: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for EnumDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field1_finish(f, "EnumDef",
            "variants", &&self.variants)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for EnumDef
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    EnumDef { variants: ref __binding_0 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for EnumDef where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    EnumDef { variants: ref mut __binding_0 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3292pub struct EnumDef {
3293    pub variants: ThinVec<Variant>,
3294}
3295
3296/// Enum variant.
3297#[derive(#[automatically_derived]
impl ::core::clone::Clone for Variant {
    #[inline]
    fn clone(&self) -> Variant {
        Variant {
            attrs: ::core::clone::Clone::clone(&self.attrs),
            id: ::core::clone::Clone::clone(&self.id),
            span: ::core::clone::Clone::clone(&self.span),
            vis: ::core::clone::Clone::clone(&self.vis),
            ident: ::core::clone::Clone::clone(&self.ident),
            data: ::core::clone::Clone::clone(&self.data),
            disr_expr: ::core::clone::Clone::clone(&self.disr_expr),
            is_placeholder: ::core::clone::Clone::clone(&self.is_placeholder),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Variant {
            fn encode(&self, __encoder: &mut __E) {
                let Variant {
                        attrs: ref __binding_0,
                        id: ref __binding_1,
                        span: ref __binding_2,
                        vis: ref __binding_3,
                        ident: ref __binding_4,
                        data: ref __binding_5,
                        disr_expr: ref __binding_6,
                        is_placeholder: ref __binding_7 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_5,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_6,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_7,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Variant {
            fn decode(__decoder: &mut __D) -> Self {
                Variant {
                    attrs: ::rustc_serialize::Decodable::decode(__decoder),
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    vis: ::rustc_serialize::Decodable::decode(__decoder),
                    ident: ::rustc_serialize::Decodable::decode(__decoder),
                    data: ::rustc_serialize::Decodable::decode(__decoder),
                    disr_expr: ::rustc_serialize::Decodable::decode(__decoder),
                    is_placeholder: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Variant {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["attrs", "id", "span", "vis", "ident", "data", "disr_expr",
                        "is_placeholder"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.attrs, &self.id, &self.span, &self.vis, &self.ident,
                        &self.data, &self.disr_expr, &&self.is_placeholder];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "Variant",
            names, values)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Variant
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Variant {
                        attrs: ref __binding_0,
                        id: ref __binding_1,
                        span: ref __binding_2,
                        vis: ref __binding_3,
                        ident: ref __binding_4,
                        data: ref __binding_5,
                        disr_expr: ref __binding_6,
                        is_placeholder: ref __binding_7 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_5,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_6,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_7,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Variant where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Variant {
                        attrs: ref mut __binding_0,
                        id: ref mut __binding_1,
                        span: ref mut __binding_2,
                        vis: ref mut __binding_3,
                        ident: ref mut __binding_4,
                        data: ref mut __binding_5,
                        disr_expr: ref mut __binding_6,
                        is_placeholder: ref mut __binding_7 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_5,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_6,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_7,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3298pub struct Variant {
3299    /// Attributes of the variant.
3300    pub attrs: AttrVec,
3301    /// Id of the variant (not the constructor, see `VariantData::ctor_id()`).
3302    pub id: NodeId,
3303    /// Span
3304    pub span: Span,
3305    /// The visibility of the variant. Syntactically accepted but not semantically.
3306    pub vis: Visibility,
3307    /// Name of the variant.
3308    pub ident: Ident,
3309
3310    /// Fields and constructor id of the variant.
3311    pub data: VariantData,
3312    /// Explicit discriminant, e.g., `Foo = 1`.
3313    pub disr_expr: Option<AnonConst>,
3314    /// Is a macro placeholder.
3315    pub is_placeholder: bool,
3316}
3317
3318/// Part of `use` item to the right of its prefix.
3319#[derive(#[automatically_derived]
impl ::core::clone::Clone for UseTreeKind {
    #[inline]
    fn clone(&self) -> UseTreeKind {
        match self {
            UseTreeKind::Simple(__self_0) =>
                UseTreeKind::Simple(::core::clone::Clone::clone(__self_0)),
            UseTreeKind::Nested { items: __self_0, span: __self_1 } =>
                UseTreeKind::Nested {
                    items: ::core::clone::Clone::clone(__self_0),
                    span: ::core::clone::Clone::clone(__self_1),
                },
            UseTreeKind::Glob(__self_0) =>
                UseTreeKind::Glob(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for UseTreeKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        UseTreeKind::Simple(ref __binding_0) => { 0usize }
                        UseTreeKind::Nested {
                            items: ref __binding_0, span: ref __binding_1 } => {
                            1usize
                        }
                        UseTreeKind::Glob(ref __binding_0) => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    UseTreeKind::Simple(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    UseTreeKind::Nested {
                        items: ref __binding_0, span: ref __binding_1 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    UseTreeKind::Glob(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for UseTreeKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        UseTreeKind::Simple(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        UseTreeKind::Nested {
                            items: ::rustc_serialize::Decodable::decode(__decoder),
                            span: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    2usize => {
                        UseTreeKind::Glob(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `UseTreeKind`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for UseTreeKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            UseTreeKind::Simple(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Simple",
                    &__self_0),
            UseTreeKind::Nested { items: __self_0, span: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "Nested", "items", __self_0, "span", &__self_1),
            UseTreeKind::Glob(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Glob",
                    &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for UseTreeKind
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    UseTreeKind::Simple(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    UseTreeKind::Nested {
                        items: ref __binding_0, span: ref __binding_1 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    UseTreeKind::Glob(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for UseTreeKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    UseTreeKind::Simple(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    UseTreeKind::Nested {
                        items: ref mut __binding_0, span: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                    UseTreeKind::Glob(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3320pub enum UseTreeKind {
3321    /// `use prefix` or `use prefix as rename`
3322    Simple(Option<Ident>),
3323    /// `use prefix::{...}`
3324    ///
3325    /// The span represents the braces of the nested group and all elements within:
3326    ///
3327    /// ```text
3328    /// use foo::{bar, baz};
3329    ///          ^^^^^^^^^^
3330    /// ```
3331    Nested { items: ThinVec<(UseTree, NodeId)>, span: Span },
3332    /// `use prefix::*`
3333    Glob(Span),
3334}
3335
3336/// A tree of paths sharing common prefixes.
3337/// Used in `use` items both at top-level and inside of braces in import groups.
3338#[derive(#[automatically_derived]
impl ::core::clone::Clone for UseTree {
    #[inline]
    fn clone(&self) -> UseTree {
        UseTree {
            prefix: ::core::clone::Clone::clone(&self.prefix),
            kind: ::core::clone::Clone::clone(&self.kind),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for UseTree {
            fn encode(&self, __encoder: &mut __E) {
                let UseTree { prefix: ref __binding_0, kind: ref __binding_1
                        } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for UseTree {
            fn decode(__decoder: &mut __D) -> Self {
                UseTree {
                    prefix: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for UseTree {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "UseTree",
            "prefix", &self.prefix, "kind", &&self.kind)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for UseTree
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    UseTree { prefix: ref __binding_0, kind: ref __binding_1 }
                        => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for UseTree where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    UseTree {
                        prefix: ref mut __binding_0, kind: ref mut __binding_1 } =>
                        {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3339pub struct UseTree {
3340    pub prefix: Path,
3341    pub kind: UseTreeKind,
3342}
3343
3344impl UseTree {
3345    /// If the `UseTree` is just an identifier, return that.
3346    /// Panics if it's a glob (`*`) or a nested use tree.
3347    pub fn ident(&self) -> Ident {
3348        match self.kind {
3349            UseTreeKind::Simple(Some(rename)) => rename,
3350            UseTreeKind::Simple(None) => {
3351                self.prefix.segments.last().expect("empty prefix in a simple import").ident
3352            }
3353            _ => {
    ::core::panicking::panic_fmt(format_args!("`UseTree::ident` can only be used on a simple import"));
}panic!("`UseTree::ident` can only be used on a simple import"),
3354        }
3355    }
3356
3357    /// Returns the full span from the start of the path to the
3358    /// closing `}` or nested spans, `*` of glob spans or the end of the
3359    /// identifier of simple spans.
3360    pub fn span(&self) -> Span {
3361        self.prefix.span.to(self.hi_span())
3362    }
3363
3364    /// Returns the trailing element's span. So for a nested
3365    /// span you get the entire `{}`-block, for a glob you
3366    /// get the span of the `*` itself, and for simple use trees
3367    /// you get the identifier to rename the import to or the full
3368    /// path if no rename is specified.
3369    pub fn hi_span(&self) -> Span {
3370        match self.kind {
3371            UseTreeKind::Simple(None) => self.prefix.span,
3372            UseTreeKind::Simple(Some(name)) => name.span,
3373            UseTreeKind::Nested { span, .. } => span,
3374            UseTreeKind::Glob(span) => span,
3375        }
3376    }
3377}
3378
3379/// Distinguishes between `Attribute`s that decorate items and Attributes that
3380/// are contained as statements within items. These two cases need to be
3381/// distinguished for pretty-printing.
3382#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for AttrStyle { }
#[automatically_derived]
impl ::core::clone::Clone for AttrStyle {
    #[inline]
    fn clone(&self) -> AttrStyle { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for AttrStyle { }
#[automatically_derived]
impl ::core::cmp::PartialEq for AttrStyle {
    #[inline]
    fn eq(&self, other: &AttrStyle) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for AttrStyle {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for AttrStyle {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state)
    }
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for AttrStyle {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                AttrStyle::Outer => "Outer",
                AttrStyle::Inner => "Inner",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::Copy for AttrStyle { }Copy)]
3383#[derive(const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for AttrStyle {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        AttrStyle::Outer => { 0usize }
                        AttrStyle::Inner => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for AttrStyle {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { AttrStyle::Outer }
                    1usize => { AttrStyle::Inner }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `AttrStyle`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for AttrStyle {
            #[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 { AttrStyle::Outer => {} AttrStyle::Inner => {} }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for AttrStyle
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self { AttrStyle::Outer => {} AttrStyle::Inner => {} }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for AttrStyle where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self { AttrStyle::Outer => {} AttrStyle::Inner => {} }
            }
        }
    };Walkable)]
3384pub enum AttrStyle {
3385    Outer,
3386    Inner,
3387}
3388
3389impl AttrStyle {
3390    pub fn line_doc_comment_prefix(self) -> &'static str {
3391        match self {
3392            AttrStyle::Outer => "///",
3393            AttrStyle::Inner => "//!",
3394        }
3395    }
3396}
3397
3398/// A list of attributes.
3399pub type AttrVec = ThinVec<Attribute>;
3400
3401/// A syntax-level representation of an attribute.
3402#[derive(#[automatically_derived]
impl ::core::clone::Clone for Attribute {
    #[inline]
    fn clone(&self) -> Attribute {
        Attribute {
            kind: ::core::clone::Clone::clone(&self.kind),
            id: ::core::clone::Clone::clone(&self.id),
            style: ::core::clone::Clone::clone(&self.style),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Attribute {
            fn encode(&self, __encoder: &mut __E) {
                let Attribute {
                        kind: ref __binding_0,
                        id: ref __binding_1,
                        style: ref __binding_2,
                        span: ref __binding_3 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Attribute {
            fn decode(__decoder: &mut __D) -> Self {
                Attribute {
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    style: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Attribute {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "Attribute",
            "kind", &self.kind, "id", &self.id, "style", &self.style, "span",
            &&self.span)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Attribute
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Attribute {
                        kind: ref __binding_0,
                        id: ref __binding_1,
                        style: ref __binding_2,
                        span: ref __binding_3 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Attribute where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Attribute {
                        kind: ref mut __binding_0,
                        id: ref mut __binding_1,
                        style: ref mut __binding_2,
                        span: ref mut __binding_3 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3403pub struct Attribute {
3404    pub kind: AttrKind,
3405    pub id: AttrId,
3406    /// Denotes if the attribute decorates the following construct (outer)
3407    /// or the construct this attribute is contained within (inner).
3408    pub style: AttrStyle,
3409
3410    /// The carets in the examples below show the spans for various cases.
3411    /// ```text
3412    /// #[foo]                  - A vanilla parsed attribute.
3413    /// ^^^^^^                  - Its span covers it all.
3414    ///
3415    /// /** abc */  /// xyz     - A parsed doc comment.
3416    /// ^^^^^^^^^^  ^^^^^^^     - Its span covers the text and comment marker(s).
3417    ///                         - The same span is also used if the doc comment is desugared (into
3418    ///                           a new normal `#[doc = r"..."]` attribute) by
3419    ///                           `desugar_doc_comments` before being passed to a macro (which
3420    ///                           is done so that `#[$m:meta]` will match).
3421    ///
3422    /// #[cfg_attr(pred, foo)]  - A parsed `cfg_attr` attribute.
3423    /// ^^^^^^^^^^^^^^^^^^^^^^  - Its span covers it all.
3424    ///                  ^^^    - Span of the new replacement attribute (equivalent to `#[foo]`)
3425    ///                           created by `cfg_attr` expansion (if `pred` is true).
3426    /// ^^^^^^^^^^^^^^^^^^^^^^  - Span of the synthetic `CfgAttrTrace` attribute created by
3427    ///                           `cfg_attr` expansion. (`CfgTrace` is derived from `#[cfg(..)]` and
3428    ///                           handled similarly.)
3429    /// ```
3430    /// Finally, for compiler-generated attributes the span is whatever the construction site
3431    /// chooses. Usually `DUMMY_SP` or some relevant span from the source code.
3432    pub span: Span,
3433}
3434
3435#[derive(#[automatically_derived]
impl ::core::clone::Clone for AttrKind {
    #[inline]
    fn clone(&self) -> AttrKind {
        match self {
            AttrKind::Normal(__self_0) =>
                AttrKind::Normal(::core::clone::Clone::clone(__self_0)),
            AttrKind::Synthetic(__self_0) =>
                AttrKind::Synthetic(::core::clone::Clone::clone(__self_0)),
            AttrKind::DocComment(__self_0, __self_1) =>
                AttrKind::DocComment(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for AttrKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        AttrKind::Normal(ref __binding_0) => { 0usize }
                        AttrKind::Synthetic(ref __binding_0) => { 1usize }
                        AttrKind::DocComment(ref __binding_0, ref __binding_1) => {
                            2usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    AttrKind::Normal(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AttrKind::Synthetic(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AttrKind::DocComment(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for AttrKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        AttrKind::Normal(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        AttrKind::Synthetic(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        AttrKind::DocComment(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `AttrKind`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for AttrKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            AttrKind::Normal(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Normal",
                    &__self_0),
            AttrKind::Synthetic(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Synthetic", &__self_0),
            AttrKind::DocComment(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "DocComment", __self_0, &__self_1),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for AttrKind
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    AttrKind::Normal(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    AttrKind::Synthetic(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    AttrKind::DocComment(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for AttrKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    AttrKind::Normal(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    AttrKind::Synthetic(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    AttrKind::DocComment(ref mut __binding_0,
                        ref mut __binding_1) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3436pub enum AttrKind {
3437    /// A normal attribute.
3438    Normal(Box<NormalAttr>),
3439
3440    /// A synthetic attribute inserted by the compiler.
3441    Synthetic(Box<SyntheticAttr>),
3442
3443    /// A doc comment (e.g. `/// ...`, `//! ...`, `/** ... */`, `/*! ... */`).
3444    /// Doc attributes (e.g. `#[doc="..."]`) are represented with the `Normal`
3445    /// variant (which is much less compact and thus more expensive).
3446    DocComment(CommentKind, Symbol),
3447}
3448
3449#[derive(#[automatically_derived]
impl ::core::clone::Clone for NormalAttr {
    #[inline]
    fn clone(&self) -> NormalAttr {
        NormalAttr {
            item: ::core::clone::Clone::clone(&self.item),
            tokens: ::core::clone::Clone::clone(&self.tokens),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for NormalAttr {
            fn encode(&self, __encoder: &mut __E) {
                let NormalAttr {
                        item: ref __binding_0, tokens: ref __binding_1 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for NormalAttr {
            fn decode(__decoder: &mut __D) -> Self {
                NormalAttr {
                    item: ::rustc_serialize::Decodable::decode(__decoder),
                    tokens: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for NormalAttr {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "NormalAttr",
            "item", &self.item, "tokens", &&self.tokens)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for NormalAttr
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    NormalAttr { item: ref __binding_0, tokens: ref __binding_1
                        } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for NormalAttr where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    NormalAttr {
                        item: ref mut __binding_0, tokens: ref mut __binding_1 } =>
                        {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3450pub struct NormalAttr {
3451    pub item: AttrItem,
3452    // Tokens for the full attribute, e.g. `#[foo]`, `#![bar]`. (Compare this with
3453    // `ParseNtResult::Meta`; `expand_cfg_attr_item` is where the two cases interact.)
3454    pub tokens: Option<LazyAttrTokenStream>,
3455}
3456
3457impl NormalAttr {
3458    pub fn from_ident(ident: Ident) -> Self {
3459        Self {
3460            item: AttrItem {
3461                unsafety: Safety::Default,
3462                path: Path::from_ident(ident),
3463                args: AttrArgs::Empty,
3464                span: ident.span,
3465            },
3466            tokens: None,
3467        }
3468    }
3469}
3470
3471#[derive(#[automatically_derived]
impl ::core::clone::Clone for AttrItem {
    #[inline]
    fn clone(&self) -> AttrItem {
        AttrItem {
            unsafety: ::core::clone::Clone::clone(&self.unsafety),
            path: ::core::clone::Clone::clone(&self.path),
            args: ::core::clone::Clone::clone(&self.args),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for AttrItem {
            fn encode(&self, __encoder: &mut __E) {
                let AttrItem {
                        unsafety: ref __binding_0,
                        path: ref __binding_1,
                        args: ref __binding_2,
                        span: ref __binding_3 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for AttrItem {
            fn decode(__decoder: &mut __D) -> Self {
                AttrItem {
                    unsafety: ::rustc_serialize::Decodable::decode(__decoder),
                    path: ::rustc_serialize::Decodable::decode(__decoder),
                    args: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for AttrItem {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "AttrItem",
            "unsafety", &self.unsafety, "path", &self.path, "args",
            &self.args, "span", &&self.span)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for AttrItem
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    AttrItem {
                        unsafety: ref __binding_0,
                        path: ref __binding_1,
                        args: ref __binding_2,
                        span: ref __binding_3 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for AttrItem where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    AttrItem {
                        unsafety: ref mut __binding_0,
                        path: ref mut __binding_1,
                        args: ref mut __binding_2,
                        span: ref mut __binding_3 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3472pub struct AttrItem {
3473    pub unsafety: Safety,
3474    pub path: Path,
3475    pub args: AttrArgs,
3476    /// The span of the entire attr item. For parse attrs this excludes `#[`/`]`. E.g.:
3477    /// ```ignore (illustrative)
3478    /// #[foo(bar)]
3479    ///   ^^^^^^^^
3480    /// #[unsafe(no_mangle)]
3481    ///   ^^^^^^^^^^^^^^^^^
3482    /// ```
3483    /// For internally constructed spans (`mk_attr_*`) the exact meaning may differ.
3484    pub span: Span,
3485}
3486
3487/// A synthetic attribute.
3488///
3489/// Synthetic attributes are inserted by the compiler. They cannot be written in source code, and
3490/// so cannot be pretty-printed by the AST pretty printer (because its output should be valid Rust
3491/// code). They receive special treatment because they must not affect observable language
3492/// behaviour: they are invisible to proc macros and are unable to re-enter the parser.
3493#[derive(#[automatically_derived]
impl ::core::clone::Clone for SyntheticAttr {
    #[inline]
    fn clone(&self) -> SyntheticAttr {
        match self {
            SyntheticAttr::CfgTrace(__self_0) =>
                SyntheticAttr::CfgTrace(::core::clone::Clone::clone(__self_0)),
            SyntheticAttr::CfgAttrTrace(__self_0) =>
                SyntheticAttr::CfgAttrTrace(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for SyntheticAttr {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        SyntheticAttr::CfgTrace(ref __binding_0) => { 0usize }
                        SyntheticAttr::CfgAttrTrace(ref __binding_0) => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    SyntheticAttr::CfgTrace(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    SyntheticAttr::CfgAttrTrace(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for SyntheticAttr {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        SyntheticAttr::CfgTrace(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        SyntheticAttr::CfgAttrTrace(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `SyntheticAttr`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for SyntheticAttr {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            SyntheticAttr::CfgTrace(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "CfgTrace", &__self_0),
            SyntheticAttr::CfgAttrTrace(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "CfgAttrTrace", &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            SyntheticAttr {
            #[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 {
                    SyntheticAttr::CfgTrace(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    SyntheticAttr::CfgAttrTrace(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
3494pub enum SyntheticAttr {
3495    /// This synthetic attribute is added by the compiler when a `cfg` attribute is expanded so that
3496    /// subsequent code can tell that conditional compilation occurred. A `#[cfg(pred)]` with a
3497    /// true predicate is replaced by a synthetic `CfgTrace` attribute that records the parsed
3498    /// predicate. A `#[cfg(pred)]` with a false predicate leaves no trace because there is no node
3499    /// left to annotate.
3500    ///
3501    /// The attribute is used for some diagnostics, by rustdoc (for detecting feature usage), and
3502    /// by some clippy lints.
3503    CfgTrace(CfgEntry),
3504
3505    /// This synthetic attribute is added by the compiler when a `cfg_attr` attribute is expanded so
3506    /// that subsequent code can tell that conditional compilation occurred. A `#[cfg_attr(pred,
3507    /// attrs)]` is replaced by a synthetic `CfgAttrTrace` attribute whether the predicate
3508    /// evaluated true or not (or even failed to parse). The `pred` and `attrs` are not recorded
3509    /// because they are not needed.
3510    ///
3511    /// The attribute is used by rustdoc to display `doc_cfg` information and by some clippy lints.
3512    CfgAttrTrace(CfgEntry),
3513}
3514
3515impl AttrItem {
3516    pub fn is_valid_for_outer_style(&self) -> bool {
3517        self.path == sym::cfg_attr
3518            || self.path == sym::cfg
3519            || self.path == sym::forbid
3520            || self.path == sym::warn
3521            || self.path == sym::allow
3522            || self.path == sym::deny
3523            || self.path == sym::expect
3524    }
3525}
3526
3527/// `TraitRef`s appear in impls.
3528///
3529/// Resolution maps each `TraitRef`'s `ref_id` to its defining trait; that's all
3530/// that the `ref_id` is for. The `impl_id` maps to the "self type" of this impl.
3531/// If this impl is an `ItemKind::Impl`, the `impl_id` is redundant (it could be the
3532/// same as the impl's `NodeId`).
3533#[derive(#[automatically_derived]
impl ::core::clone::Clone for TraitRef {
    #[inline]
    fn clone(&self) -> TraitRef {
        TraitRef {
            path: ::core::clone::Clone::clone(&self.path),
            ref_id: ::core::clone::Clone::clone(&self.ref_id),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for TraitRef {
            fn encode(&self, __encoder: &mut __E) {
                let TraitRef { path: ref __binding_0, ref_id: ref __binding_1
                        } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for TraitRef {
            fn decode(__decoder: &mut __D) -> Self {
                TraitRef {
                    path: ::rustc_serialize::Decodable::decode(__decoder),
                    ref_id: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for TraitRef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "TraitRef",
            "path", &self.path, "ref_id", &&self.ref_id)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for TraitRef
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    TraitRef { path: ref __binding_0, ref_id: ref __binding_1 }
                        => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for TraitRef where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    TraitRef {
                        path: ref mut __binding_0, ref_id: ref mut __binding_1 } =>
                        {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3534pub struct TraitRef {
3535    pub path: Path,
3536    pub ref_id: NodeId,
3537}
3538
3539/// Whether enclosing parentheses are present or not.
3540#[derive(#[automatically_derived]
impl ::core::clone::Clone for Parens {
    #[inline]
    fn clone(&self) -> Parens {
        match self { Parens::Yes => Parens::Yes, Parens::No => Parens::No, }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Parens {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        Parens::Yes => { 0usize }
                        Parens::No => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Parens {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { Parens::Yes }
                    1usize => { Parens::No }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Parens`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Parens {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self { Parens::Yes => "Yes", Parens::No => "No", })
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Parens where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self { Parens::Yes => {} Parens::No => {} }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Parens where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self { Parens::Yes => {} Parens::No => {} }
            }
        }
    };Walkable)]
3541pub enum Parens {
3542    Yes,
3543    No,
3544}
3545
3546#[derive(#[automatically_derived]
impl ::core::clone::Clone for PolyTraitRef {
    #[inline]
    fn clone(&self) -> PolyTraitRef {
        PolyTraitRef {
            bound_generic_params: ::core::clone::Clone::clone(&self.bound_generic_params),
            modifiers: ::core::clone::Clone::clone(&self.modifiers),
            trait_ref: ::core::clone::Clone::clone(&self.trait_ref),
            span: ::core::clone::Clone::clone(&self.span),
            parens: ::core::clone::Clone::clone(&self.parens),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for PolyTraitRef {
            fn encode(&self, __encoder: &mut __E) {
                let PolyTraitRef {
                        bound_generic_params: ref __binding_0,
                        modifiers: ref __binding_1,
                        trait_ref: ref __binding_2,
                        span: ref __binding_3,
                        parens: ref __binding_4 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for PolyTraitRef {
            fn decode(__decoder: &mut __D) -> Self {
                PolyTraitRef {
                    bound_generic_params: ::rustc_serialize::Decodable::decode(__decoder),
                    modifiers: ::rustc_serialize::Decodable::decode(__decoder),
                    trait_ref: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    parens: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for PolyTraitRef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f, "PolyTraitRef",
            "bound_generic_params", &self.bound_generic_params, "modifiers",
            &self.modifiers, "trait_ref", &self.trait_ref, "span", &self.span,
            "parens", &&self.parens)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for PolyTraitRef
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    PolyTraitRef {
                        bound_generic_params: ref __binding_0,
                        modifiers: ref __binding_1,
                        trait_ref: ref __binding_2,
                        span: ref __binding_3,
                        parens: ref __binding_4 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for PolyTraitRef where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    PolyTraitRef {
                        bound_generic_params: ref mut __binding_0,
                        modifiers: ref mut __binding_1,
                        trait_ref: ref mut __binding_2,
                        span: ref mut __binding_3,
                        parens: ref mut __binding_4 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3547pub struct PolyTraitRef {
3548    /// The `'a` in `for<'a> Foo<&'a T>`.
3549    pub bound_generic_params: ThinVec<GenericParam>,
3550
3551    // Optional constness, asyncness, or polarity.
3552    pub modifiers: TraitBoundModifiers,
3553
3554    /// The `Foo<&'a T>` in `<'a> Foo<&'a T>`.
3555    pub trait_ref: TraitRef,
3556
3557    pub span: Span,
3558
3559    /// When `Yes`, the first and last character of `span` are an opening
3560    /// and a closing paren respectively.
3561    pub parens: Parens,
3562}
3563
3564impl PolyTraitRef {
3565    pub fn new(
3566        generic_params: ThinVec<GenericParam>,
3567        path: Path,
3568        modifiers: TraitBoundModifiers,
3569        span: Span,
3570        parens: Parens,
3571    ) -> Self {
3572        PolyTraitRef {
3573            bound_generic_params: generic_params,
3574            modifiers,
3575            trait_ref: TraitRef { path, ref_id: DUMMY_NODE_ID },
3576            span,
3577            parens,
3578        }
3579    }
3580}
3581
3582#[derive(#[automatically_derived]
impl ::core::clone::Clone for Visibility {
    #[inline]
    fn clone(&self) -> Visibility {
        Visibility {
            kind: ::core::clone::Clone::clone(&self.kind),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Visibility {
            fn encode(&self, __encoder: &mut __E) {
                let Visibility { kind: ref __binding_0, span: ref __binding_1
                        } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Visibility {
            fn decode(__decoder: &mut __D) -> Self {
                Visibility {
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Visibility {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "Visibility",
            "kind", &self.kind, "span", &&self.span)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Visibility
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Visibility { kind: ref __binding_0, span: ref __binding_1 }
                        => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Visibility where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Visibility {
                        kind: ref mut __binding_0, span: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3583pub struct Visibility {
3584    pub kind: VisibilityKind,
3585    pub span: Span,
3586}
3587
3588#[derive(#[automatically_derived]
impl ::core::clone::Clone for VisibilityKind {
    #[inline]
    fn clone(&self) -> VisibilityKind {
        match self {
            VisibilityKind::Public => VisibilityKind::Public,
            VisibilityKind::Restricted {
                path: __self_0, id: __self_1, shorthand: __self_2 } =>
                VisibilityKind::Restricted {
                    path: ::core::clone::Clone::clone(__self_0),
                    id: ::core::clone::Clone::clone(__self_1),
                    shorthand: ::core::clone::Clone::clone(__self_2),
                },
            VisibilityKind::Inherited => VisibilityKind::Inherited,
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for VisibilityKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        VisibilityKind::Public => { 0usize }
                        VisibilityKind::Restricted {
                            path: ref __binding_0,
                            id: ref __binding_1,
                            shorthand: ref __binding_2 } => {
                            1usize
                        }
                        VisibilityKind::Inherited => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    VisibilityKind::Public => {}
                    VisibilityKind::Restricted {
                        path: ref __binding_0,
                        id: ref __binding_1,
                        shorthand: 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);
                    }
                    VisibilityKind::Inherited => {}
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for VisibilityKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { VisibilityKind::Public }
                    1usize => {
                        VisibilityKind::Restricted {
                            path: ::rustc_serialize::Decodable::decode(__decoder),
                            id: ::rustc_serialize::Decodable::decode(__decoder),
                            shorthand: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    2usize => { VisibilityKind::Inherited }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `VisibilityKind`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for VisibilityKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            VisibilityKind::Public =>
                ::core::fmt::Formatter::write_str(f, "Public"),
            VisibilityKind::Restricted {
                path: __self_0, id: __self_1, shorthand: __self_2 } =>
                ::core::fmt::Formatter::debug_struct_field3_finish(f,
                    "Restricted", "path", __self_0, "id", __self_1, "shorthand",
                    &__self_2),
            VisibilityKind::Inherited =>
                ::core::fmt::Formatter::write_str(f, "Inherited"),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            VisibilityKind where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    VisibilityKind::Public => {}
                    VisibilityKind::Restricted {
                        path: ref __binding_0,
                        id: ref __binding_1,
                        shorthand: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    VisibilityKind::Inherited => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for VisibilityKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    VisibilityKind::Public => {}
                    VisibilityKind::Restricted {
                        path: ref mut __binding_0,
                        id: ref mut __binding_1,
                        shorthand: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                    VisibilityKind::Inherited => {}
                }
            }
        }
    };Walkable)]
3589pub enum VisibilityKind {
3590    Public,
3591    Restricted { path: Box<Path>, id: NodeId, shorthand: bool },
3592    Inherited,
3593}
3594
3595impl VisibilityKind {
3596    pub fn is_pub(&self) -> bool {
3597        #[allow(non_exhaustive_omitted_patterns)] match self {
    VisibilityKind::Public => true,
    _ => false,
}matches!(self, VisibilityKind::Public)
3598    }
3599}
3600
3601#[derive(#[automatically_derived]
impl ::core::clone::Clone for ImplRestriction {
    #[inline]
    fn clone(&self) -> ImplRestriction {
        ImplRestriction {
            kind: ::core::clone::Clone::clone(&self.kind),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ImplRestriction {
            fn encode(&self, __encoder: &mut __E) {
                let ImplRestriction {
                        kind: ref __binding_0, span: ref __binding_1 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ImplRestriction {
            fn decode(__decoder: &mut __D) -> Self {
                ImplRestriction {
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ImplRestriction {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "ImplRestriction", "kind", &self.kind, "span", &&self.span)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            ImplRestriction where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    ImplRestriction {
                        kind: ref __binding_0, span: ref __binding_1 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for ImplRestriction where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    ImplRestriction {
                        kind: ref mut __binding_0, span: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3602pub struct ImplRestriction {
3603    pub kind: RestrictionKind,
3604    pub span: Span,
3605}
3606
3607#[derive(#[automatically_derived]
impl ::core::clone::Clone for MutRestriction {
    #[inline]
    fn clone(&self) -> MutRestriction {
        MutRestriction {
            kind: ::core::clone::Clone::clone(&self.kind),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for MutRestriction {
            fn encode(&self, __encoder: &mut __E) {
                let MutRestriction {
                        kind: ref __binding_0, span: ref __binding_1 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for MutRestriction {
            fn decode(__decoder: &mut __D) -> Self {
                MutRestriction {
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for MutRestriction {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "MutRestriction", "kind", &self.kind, "span", &&self.span)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            MutRestriction where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    MutRestriction {
                        kind: ref __binding_0, span: ref __binding_1 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for MutRestriction where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    MutRestriction {
                        kind: ref mut __binding_0, span: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3608pub struct MutRestriction {
3609    pub kind: RestrictionKind,
3610    /// Note: this span is currently thrown away
3611    /// for [RestrictionKind::Unrestricted] when constructing [FieldDef],
3612    /// to keep its size small. This is not a problem at the moment,
3613    /// because this span is unused, but we will need to refactor
3614    /// [FieldDef] and [FieldDefExtras] to restore it when we need it.
3615    pub span: Span,
3616}
3617
3618#[derive(#[automatically_derived]
impl ::core::clone::Clone for RestrictionKind {
    #[inline]
    fn clone(&self) -> RestrictionKind {
        match self {
            RestrictionKind::Unrestricted => RestrictionKind::Unrestricted,
            RestrictionKind::Restricted {
                path: __self_0, id: __self_1, shorthand: __self_2 } =>
                RestrictionKind::Restricted {
                    path: ::core::clone::Clone::clone(__self_0),
                    id: ::core::clone::Clone::clone(__self_1),
                    shorthand: ::core::clone::Clone::clone(__self_2),
                },
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for RestrictionKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        RestrictionKind::Unrestricted => { 0usize }
                        RestrictionKind::Restricted {
                            path: ref __binding_0,
                            id: ref __binding_1,
                            shorthand: ref __binding_2 } => {
                            1usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    RestrictionKind::Unrestricted => {}
                    RestrictionKind::Restricted {
                        path: ref __binding_0,
                        id: ref __binding_1,
                        shorthand: 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);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for RestrictionKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { RestrictionKind::Unrestricted }
                    1usize => {
                        RestrictionKind::Restricted {
                            path: ::rustc_serialize::Decodable::decode(__decoder),
                            id: ::rustc_serialize::Decodable::decode(__decoder),
                            shorthand: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `RestrictionKind`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for RestrictionKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            RestrictionKind::Unrestricted =>
                ::core::fmt::Formatter::write_str(f, "Unrestricted"),
            RestrictionKind::Restricted {
                path: __self_0, id: __self_1, shorthand: __self_2 } =>
                ::core::fmt::Formatter::debug_struct_field3_finish(f,
                    "Restricted", "path", __self_0, "id", __self_1, "shorthand",
                    &__self_2),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            RestrictionKind where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    RestrictionKind::Unrestricted => {}
                    RestrictionKind::Restricted {
                        path: ref __binding_0,
                        id: ref __binding_1,
                        shorthand: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for RestrictionKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    RestrictionKind::Unrestricted => {}
                    RestrictionKind::Restricted {
                        path: ref mut __binding_0,
                        id: ref mut __binding_1,
                        shorthand: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3619pub enum RestrictionKind {
3620    Unrestricted,
3621    Restricted { path: Box<Path>, id: NodeId, shorthand: bool },
3622}
3623
3624/// Field definition in a struct, variant or union.
3625///
3626/// E.g., `bar: usize` as in `struct Foo { bar: usize }`.
3627#[derive(#[automatically_derived]
impl ::core::clone::Clone for FieldDef {
    #[inline]
    fn clone(&self) -> FieldDef {
        FieldDef {
            attrs: ::core::clone::Clone::clone(&self.attrs),
            id: ::core::clone::Clone::clone(&self.id),
            span: ::core::clone::Clone::clone(&self.span),
            vis: ::core::clone::Clone::clone(&self.vis),
            extras: ::core::clone::Clone::clone(&self.extras),
            ident: ::core::clone::Clone::clone(&self.ident),
            ty: ::core::clone::Clone::clone(&self.ty),
            is_placeholder: ::core::clone::Clone::clone(&self.is_placeholder),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for FieldDef {
            fn encode(&self, __encoder: &mut __E) {
                let FieldDef {
                        attrs: ref __binding_0,
                        id: ref __binding_1,
                        span: ref __binding_2,
                        vis: ref __binding_3,
                        extras: ref __binding_4,
                        ident: ref __binding_5,
                        ty: ref __binding_6,
                        is_placeholder: ref __binding_7 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_5,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_6,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_7,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for FieldDef {
            fn decode(__decoder: &mut __D) -> Self {
                FieldDef {
                    attrs: ::rustc_serialize::Decodable::decode(__decoder),
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    vis: ::rustc_serialize::Decodable::decode(__decoder),
                    extras: ::rustc_serialize::Decodable::decode(__decoder),
                    ident: ::rustc_serialize::Decodable::decode(__decoder),
                    ty: ::rustc_serialize::Decodable::decode(__decoder),
                    is_placeholder: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for FieldDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["attrs", "id", "span", "vis", "extras", "ident", "ty",
                        "is_placeholder"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.attrs, &self.id, &self.span, &self.vis, &self.extras,
                        &self.ident, &self.ty, &&self.is_placeholder];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "FieldDef",
            names, values)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for FieldDef
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    FieldDef {
                        attrs: ref __binding_0,
                        id: ref __binding_1,
                        span: ref __binding_2,
                        vis: ref __binding_3,
                        extras: ref __binding_4,
                        ident: ref __binding_5,
                        ty: ref __binding_6,
                        is_placeholder: ref __binding_7 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_5,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_6,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_7,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for FieldDef where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    FieldDef {
                        attrs: ref mut __binding_0,
                        id: ref mut __binding_1,
                        span: ref mut __binding_2,
                        vis: ref mut __binding_3,
                        extras: ref mut __binding_4,
                        ident: ref mut __binding_5,
                        ty: ref mut __binding_6,
                        is_placeholder: ref mut __binding_7 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_5,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_6,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_7,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3628pub struct FieldDef {
3629    pub attrs: AttrVec,
3630    pub id: NodeId,
3631    pub span: Span,
3632    pub vis: Visibility,
3633    pub extras: Option<Box<FieldDefExtras>>,
3634    pub ident: Option<Ident>,
3635
3636    pub ty: Box<Ty>,
3637    pub is_placeholder: bool,
3638}
3639
3640/// Some properties from [FieldDef] are rarely used,
3641/// so we outline them to make FieldDef smaller.
3642/// At the time of writing, these are all related to unstable features.
3643#[derive(#[automatically_derived]
impl ::core::clone::Clone for FieldDefExtras {
    #[inline]
    fn clone(&self) -> FieldDefExtras {
        FieldDefExtras {
            safety: ::core::clone::Clone::clone(&self.safety),
            mut_restriction: ::core::clone::Clone::clone(&self.mut_restriction),
            default: ::core::clone::Clone::clone(&self.default),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for FieldDefExtras {
            fn encode(&self, __encoder: &mut __E) {
                let FieldDefExtras {
                        safety: ref __binding_0,
                        mut_restriction: ref __binding_1,
                        default: 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);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for FieldDefExtras {
            fn decode(__decoder: &mut __D) -> Self {
                FieldDefExtras {
                    safety: ::rustc_serialize::Decodable::decode(__decoder),
                    mut_restriction: ::rustc_serialize::Decodable::decode(__decoder),
                    default: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for FieldDefExtras {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f,
            "FieldDefExtras", "safety", &self.safety, "mut_restriction",
            &self.mut_restriction, "default", &&self.default)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            FieldDefExtras where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    FieldDefExtras {
                        safety: ref __binding_0,
                        mut_restriction: ref __binding_1,
                        default: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for FieldDefExtras where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    FieldDefExtras {
                        safety: ref mut __binding_0,
                        mut_restriction: ref mut __binding_1,
                        default: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3644pub struct FieldDefExtras {
3645    pub safety: Safety,
3646    pub mut_restriction: MutRestriction,
3647    pub default: Option<AnonConst>,
3648}
3649
3650impl FieldDef {
3651    pub fn mut_restriction(&self) -> &MutRestriction {
3652        static DEFAULT: MutRestriction =
3653            MutRestriction { kind: RestrictionKind::Unrestricted, span: DUMMY_SP };
3654
3655        self.extras.as_ref().map_or(&DEFAULT, |extras| &extras.mut_restriction)
3656    }
3657
3658    pub fn default_value(&self) -> Option<&AnonConst> {
3659        self.extras.as_ref().and_then(|e| e.default.as_ref())
3660    }
3661
3662    pub fn safety(&self) -> Safety {
3663        self.extras.as_ref().map_or(Safety::Default, |extras| extras.safety)
3664    }
3665}
3666/// Was parsing recovery performed?
3667#[derive(#[automatically_derived]
impl ::core::marker::Copy for Recovered { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Recovered { }
#[automatically_derived]
impl ::core::clone::Clone for Recovered {
    #[inline]
    fn clone(&self) -> Recovered {
        let _: ::core::clone::AssertParamIsClone<ErrorGuaranteed>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for Recovered {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Recovered::No => ::core::fmt::Formatter::write_str(f, "No"),
            Recovered::Yes(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Yes",
                    &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Recovered {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        Recovered::No => { 0usize }
                        Recovered::Yes(ref __binding_0) => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    Recovered::No => {}
                    Recovered::Yes(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Recovered {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { Recovered::No }
                    1usize => {
                        Recovered::Yes(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Recovered`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for Recovered {
            #[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 {
                    Recovered::No => {}
                    Recovered::Yes(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Recovered
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Recovered::No => {}
                    Recovered::Yes(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Recovered where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Recovered::No => {}
                    Recovered::Yes(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3668pub enum Recovered {
3669    No,
3670    Yes(ErrorGuaranteed),
3671}
3672
3673/// Fields and constructor ids of enum variants and structs.
3674#[derive(#[automatically_derived]
impl ::core::clone::Clone for VariantData {
    #[inline]
    fn clone(&self) -> VariantData {
        match self {
            VariantData::Struct { fields: __self_0, recovered: __self_1 } =>
                VariantData::Struct {
                    fields: ::core::clone::Clone::clone(__self_0),
                    recovered: ::core::clone::Clone::clone(__self_1),
                },
            VariantData::Tuple(__self_0, __self_1) =>
                VariantData::Tuple(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            VariantData::Unit(__self_0) =>
                VariantData::Unit(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for VariantData {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        VariantData::Struct {
                            fields: ref __binding_0, recovered: ref __binding_1 } => {
                            0usize
                        }
                        VariantData::Tuple(ref __binding_0, ref __binding_1) => {
                            1usize
                        }
                        VariantData::Unit(ref __binding_0) => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    VariantData::Struct {
                        fields: ref __binding_0, recovered: ref __binding_1 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    VariantData::Tuple(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    VariantData::Unit(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for VariantData {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        VariantData::Struct {
                            fields: ::rustc_serialize::Decodable::decode(__decoder),
                            recovered: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    1usize => {
                        VariantData::Tuple(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        VariantData::Unit(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `VariantData`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for VariantData {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            VariantData::Struct { fields: __self_0, recovered: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "Struct", "fields", __self_0, "recovered", &__self_1),
            VariantData::Tuple(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Tuple",
                    __self_0, &__self_1),
            VariantData::Unit(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Unit",
                    &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for VariantData
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    VariantData::Struct {
                        fields: ref __binding_0, recovered: ref __binding_1 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    VariantData::Tuple(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    VariantData::Unit(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for VariantData where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    VariantData::Struct {
                        fields: ref mut __binding_0, recovered: ref mut __binding_1
                        } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                    VariantData::Tuple(ref mut __binding_0, ref mut __binding_1)
                        => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                    VariantData::Unit(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3675pub enum VariantData {
3676    /// Struct variant.
3677    ///
3678    /// E.g., `Bar { .. }` as in `enum Foo { Bar { .. } }`.
3679    Struct { fields: ThinVec<FieldDef>, recovered: Recovered },
3680    /// Tuple variant.
3681    ///
3682    /// E.g., `Bar(..)` as in `enum Foo { Bar(..) }`.
3683    Tuple(ThinVec<FieldDef>, NodeId),
3684    /// Unit variant.
3685    ///
3686    /// E.g., `Bar = ..` as in `enum Foo { Bar = .. }`.
3687    Unit(NodeId),
3688}
3689
3690impl VariantData {
3691    /// Return the fields of this variant.
3692    pub fn fields(&self) -> &[FieldDef] {
3693        match self {
3694            VariantData::Struct { fields, .. } | VariantData::Tuple(fields, _) => fields,
3695            _ => &[],
3696        }
3697    }
3698
3699    /// Return the `NodeId` of this variant's constructor, if it has one.
3700    pub fn ctor_node_id(&self) -> Option<NodeId> {
3701        match *self {
3702            VariantData::Struct { .. } => None,
3703            VariantData::Tuple(_, id) | VariantData::Unit(id) => Some(id),
3704        }
3705    }
3706}
3707
3708/// An item definition.
3709#[derive(#[automatically_derived]
impl<K: ::core::clone::Clone> ::core::clone::Clone for Item<K> {
    #[inline]
    fn clone(&self) -> Item<K> {
        Item {
            attrs: ::core::clone::Clone::clone(&self.attrs),
            id: ::core::clone::Clone::clone(&self.id),
            span: ::core::clone::Clone::clone(&self.span),
            vis: ::core::clone::Clone::clone(&self.vis),
            kind: ::core::clone::Clone::clone(&self.kind),
            tokens: ::core::clone::Clone::clone(&self.tokens),
        }
    }
}Clone, const _: () =
    {
        impl<K, __E: ::rustc_span::SpanEncoder>
            ::rustc_serialize::Encodable<__E> for Item<K> where
            K: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                let Item {
                        attrs: ref __binding_0,
                        id: ref __binding_1,
                        span: ref __binding_2,
                        vis: ref __binding_3,
                        kind: ref __binding_4,
                        tokens: ref __binding_5 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_5,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<K, __D: ::rustc_span::SpanDecoder>
            ::rustc_serialize::Decodable<__D> for Item<K> where
            K: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                Item {
                    attrs: ::rustc_serialize::Decodable::decode(__decoder),
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    vis: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    tokens: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl<K: ::core::fmt::Debug> ::core::fmt::Debug for Item<K> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["attrs", "id", "span", "vis", "kind", "tokens"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.attrs, &self.id, &self.span, &self.vis, &self.kind,
                        &&self.tokens];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "Item", names,
            values)
    }
}Debug)]
3710pub struct Item<K = ItemKind> {
3711    pub attrs: AttrVec,
3712    pub id: NodeId,
3713    pub span: Span,
3714    pub vis: Visibility,
3715
3716    pub kind: K,
3717
3718    /// Original tokens this item was parsed from. This isn't necessarily
3719    /// available for all items, although over time more and more items should
3720    /// have this be `Some`. Right now this is primarily used for procedural
3721    /// macros, notably custom attributes.
3722    ///
3723    /// Note that the tokens here do not include the outer attributes, but will
3724    /// include inner attributes.
3725    pub tokens: Option<LazyAttrTokenStream>,
3726}
3727
3728impl Item {
3729    /// Return the span that encompasses the attributes.
3730    pub fn span_with_attributes(&self) -> Span {
3731        self.attrs.iter().fold(self.span, |acc, attr| acc.to(attr.span))
3732    }
3733
3734    pub fn opt_generics(&self) -> Option<&Generics> {
3735        self.kind.generics()
3736    }
3737}
3738
3739impl Item<AssocItemKind> {
3740    pub fn opt_generics(&self) -> Option<&Generics> {
3741        match &self.kind {
3742            AssocItemKind::Fn(fun) => Some(&fun.generics),
3743            AssocItemKind::Const(ct) => Some(&ct.generics),
3744            AssocItemKind::Type(ty) => Some(&ty.generics),
3745            AssocItemKind::Delegation(..)
3746            | AssocItemKind::MacCall(_)
3747            | AssocItemKind::DelegationMac(_) => None,
3748        }
3749    }
3750}
3751
3752/// `extern` qualifier on a function item or function type.
3753#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Extern { }
#[automatically_derived]
impl ::core::clone::Clone for Extern {
    #[inline]
    fn clone(&self) -> Extern {
        let _: ::core::clone::AssertParamIsClone<Span>;
        let _: ::core::clone::AssertParamIsClone<StrLit>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for Extern { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Extern {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        Extern::None => { 0usize }
                        Extern::Implicit(ref __binding_0) => { 1usize }
                        Extern::Explicit(ref __binding_0, ref __binding_1) => {
                            2usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    Extern::None => {}
                    Extern::Implicit(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    Extern::Explicit(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Extern {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { Extern::None }
                    1usize => {
                        Extern::Implicit(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        Extern::Explicit(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Extern`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Extern {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Extern::None => ::core::fmt::Formatter::write_str(f, "None"),
            Extern::Implicit(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Implicit", &__self_0),
            Extern::Explicit(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "Explicit", __self_0, &__self_1),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Extern where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Extern::None => {}
                    Extern::Implicit(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    Extern::Explicit(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Extern where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Extern::None => {}
                    Extern::Implicit(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    Extern::Explicit(ref mut __binding_0, ref mut __binding_1)
                        => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3754pub enum Extern {
3755    /// No explicit extern keyword was used.
3756    ///
3757    /// E.g. `fn foo() {}`.
3758    None,
3759    /// An explicit extern keyword was used, but with implicit ABI.
3760    ///
3761    /// E.g. `extern fn foo() {}`.
3762    ///
3763    /// This is just `extern "C"` (see `rustc_abi::ExternAbi::FALLBACK`).
3764    Implicit(Span),
3765    /// An explicit extern keyword was used with an explicit ABI.
3766    ///
3767    /// E.g. `extern "C" fn foo() {}`.
3768    Explicit(StrLit, Span),
3769}
3770
3771impl Extern {
3772    pub fn from_abi(abi: Option<StrLit>, span: Span) -> Extern {
3773        match abi {
3774            Some(name) => Extern::Explicit(name, span),
3775            None => Extern::Implicit(span),
3776        }
3777    }
3778
3779    pub fn span(self) -> Option<Span> {
3780        match self {
3781            Extern::None => None,
3782            Extern::Implicit(span) | Extern::Explicit(_, span) => Some(span),
3783        }
3784    }
3785}
3786
3787/// A function header.
3788///
3789/// All the information between the visibility and the name of the function is
3790/// included in this struct (e.g., `async unsafe fn` or `const extern "C" fn`).
3791#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for FnHeader { }
#[automatically_derived]
impl ::core::clone::Clone for FnHeader {
    #[inline]
    fn clone(&self) -> FnHeader {
        let _: ::core::clone::AssertParamIsClone<Const>;
        let _: ::core::clone::AssertParamIsClone<Option<CoroutineMarker>>;
        let _: ::core::clone::AssertParamIsClone<Safety>;
        let _: ::core::clone::AssertParamIsClone<Extern>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for FnHeader { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for FnHeader {
            fn encode(&self, __encoder: &mut __E) {
                let FnHeader {
                        constness: ref __binding_0,
                        coroutine_marker: ref __binding_1,
                        safety: ref __binding_2,
                        ext: ref __binding_3 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for FnHeader {
            fn decode(__decoder: &mut __D) -> Self {
                FnHeader {
                    constness: ::rustc_serialize::Decodable::decode(__decoder),
                    coroutine_marker: ::rustc_serialize::Decodable::decode(__decoder),
                    safety: ::rustc_serialize::Decodable::decode(__decoder),
                    ext: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for FnHeader {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "FnHeader",
            "constness", &self.constness, "coroutine_marker",
            &self.coroutine_marker, "safety", &self.safety, "ext", &&self.ext)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for FnHeader
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    FnHeader {
                        constness: ref __binding_0,
                        coroutine_marker: ref __binding_1,
                        safety: ref __binding_2,
                        ext: ref __binding_3 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for FnHeader where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    FnHeader {
                        constness: ref mut __binding_0,
                        coroutine_marker: ref mut __binding_1,
                        safety: ref mut __binding_2,
                        ext: ref mut __binding_3 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3792pub struct FnHeader {
3793    /// The `const` keyword, if any
3794    pub constness: Const,
3795    /// The `async`/`gen`/`gen asyn` marker, if there is one.
3796    pub coroutine_marker: Option<CoroutineMarker>,
3797    /// Whether this is `unsafe`, or has a default safety.
3798    pub safety: Safety,
3799    /// The `extern` keyword and corresponding ABI string, if any.
3800    pub ext: Extern,
3801}
3802
3803impl FnHeader {
3804    /// Does this function header have any qualifiers or is it empty?
3805    pub fn has_qualifiers(&self) -> bool {
3806        let Self { safety, coroutine_marker, constness, ext } = self;
3807        #[allow(non_exhaustive_omitted_patterns)] match safety {
    Safety::Unsafe(_) => true,
    _ => false,
}matches!(safety, Safety::Unsafe(_))
3808            || coroutine_marker.is_some()
3809            || #[allow(non_exhaustive_omitted_patterns)] match constness {
    Const::Yes(_) => true,
    _ => false,
}matches!(constness, Const::Yes(_))
3810            || !#[allow(non_exhaustive_omitted_patterns)] match ext {
    Extern::None => true,
    _ => false,
}matches!(ext, Extern::None)
3811    }
3812
3813    pub fn span(&self) -> Option<Span> {
3814        let mut spans = smallvec::SmallVec::<[Span; 4]>::new();
3815
3816        match self.ext {
3817            Extern::Implicit(span) | Extern::Explicit(_, span) => spans.push(span),
3818            Extern::None => {}
3819        }
3820
3821        match self.safety {
3822            Safety::Unsafe(span) | Safety::Safe(span) => spans.push(span),
3823            Safety::Default => {}
3824        };
3825
3826        if let Some(coroutine_marker) = self.coroutine_marker {
3827            spans.push(coroutine_marker.span);
3828        }
3829
3830        if let Const::Yes(span) = self.constness {
3831            spans.push(span)
3832        }
3833
3834        spans.into_iter().reduce(Span::to)
3835    }
3836}
3837
3838impl Default for FnHeader {
3839    fn default() -> FnHeader {
3840        FnHeader {
3841            safety: Safety::Default,
3842            coroutine_marker: None,
3843            constness: Const::No,
3844            ext: Extern::None,
3845        }
3846    }
3847}
3848
3849#[derive(#[automatically_derived]
impl ::core::clone::Clone for TraitAlias {
    #[inline]
    fn clone(&self) -> TraitAlias {
        TraitAlias {
            constness: ::core::clone::Clone::clone(&self.constness),
            ident: ::core::clone::Clone::clone(&self.ident),
            generics: ::core::clone::Clone::clone(&self.generics),
            bounds: ::core::clone::Clone::clone(&self.bounds),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for TraitAlias {
            fn encode(&self, __encoder: &mut __E) {
                let TraitAlias {
                        constness: ref __binding_0,
                        ident: ref __binding_1,
                        generics: ref __binding_2,
                        bounds: ref __binding_3 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for TraitAlias {
            fn decode(__decoder: &mut __D) -> Self {
                TraitAlias {
                    constness: ::rustc_serialize::Decodable::decode(__decoder),
                    ident: ::rustc_serialize::Decodable::decode(__decoder),
                    generics: ::rustc_serialize::Decodable::decode(__decoder),
                    bounds: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for TraitAlias {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "TraitAlias",
            "constness", &self.constness, "ident", &self.ident, "generics",
            &self.generics, "bounds", &&self.bounds)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for TraitAlias
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    TraitAlias {
                        constness: ref __binding_0,
                        ident: ref __binding_1,
                        generics: ref __binding_2,
                        bounds: ref __binding_3 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, (BoundKind::Bound))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for TraitAlias where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    TraitAlias {
                        constness: ref mut __binding_0,
                        ident: ref mut __binding_1,
                        generics: ref mut __binding_2,
                        bounds: ref mut __binding_3 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, (BoundKind::Bound))
                        }
                    }
                }
            }
        }
    };Walkable)]
3850pub struct TraitAlias {
3851    pub constness: Const,
3852    pub ident: Ident,
3853    pub generics: Generics,
3854    #[visitable(extra = BoundKind::Bound)]
3855    pub bounds: GenericBounds,
3856}
3857
3858#[derive(#[automatically_derived]
impl ::core::clone::Clone for Trait {
    #[inline]
    fn clone(&self) -> Trait {
        Trait {
            impl_restriction: ::core::clone::Clone::clone(&self.impl_restriction),
            constness: ::core::clone::Clone::clone(&self.constness),
            safety: ::core::clone::Clone::clone(&self.safety),
            is_auto: ::core::clone::Clone::clone(&self.is_auto),
            ident: ::core::clone::Clone::clone(&self.ident),
            generics: ::core::clone::Clone::clone(&self.generics),
            bounds: ::core::clone::Clone::clone(&self.bounds),
            items: ::core::clone::Clone::clone(&self.items),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Trait {
            fn encode(&self, __encoder: &mut __E) {
                let Trait {
                        impl_restriction: ref __binding_0,
                        constness: ref __binding_1,
                        safety: ref __binding_2,
                        is_auto: ref __binding_3,
                        ident: ref __binding_4,
                        generics: ref __binding_5,
                        bounds: ref __binding_6,
                        items: ref __binding_7 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_5,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_6,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_7,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Trait {
            fn decode(__decoder: &mut __D) -> Self {
                Trait {
                    impl_restriction: ::rustc_serialize::Decodable::decode(__decoder),
                    constness: ::rustc_serialize::Decodable::decode(__decoder),
                    safety: ::rustc_serialize::Decodable::decode(__decoder),
                    is_auto: ::rustc_serialize::Decodable::decode(__decoder),
                    ident: ::rustc_serialize::Decodable::decode(__decoder),
                    generics: ::rustc_serialize::Decodable::decode(__decoder),
                    bounds: ::rustc_serialize::Decodable::decode(__decoder),
                    items: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Trait {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["impl_restriction", "constness", "safety", "is_auto", "ident",
                        "generics", "bounds", "items"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.impl_restriction, &self.constness, &self.safety,
                        &self.is_auto, &self.ident, &self.generics, &self.bounds,
                        &&self.items];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "Trait", names,
            values)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Trait where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Trait {
                        impl_restriction: ref __binding_0,
                        constness: ref __binding_1,
                        safety: ref __binding_2,
                        is_auto: ref __binding_3,
                        ident: ref __binding_4,
                        generics: ref __binding_5,
                        bounds: ref __binding_6,
                        items: ref __binding_7 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_5,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_6,
                                        __visitor, (BoundKind::SuperTraits))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_7,
                                        __visitor, (AssocCtxt::Trait))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Trait where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Trait {
                        impl_restriction: ref mut __binding_0,
                        constness: ref mut __binding_1,
                        safety: ref mut __binding_2,
                        is_auto: ref mut __binding_3,
                        ident: ref mut __binding_4,
                        generics: ref mut __binding_5,
                        bounds: ref mut __binding_6,
                        items: ref mut __binding_7 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_5,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_6,
                                __visitor, (BoundKind::SuperTraits))
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_7,
                                __visitor, (AssocCtxt::Trait))
                        }
                    }
                }
            }
        }
    };Walkable)]
3859pub struct Trait {
3860    pub impl_restriction: ImplRestriction,
3861    pub constness: Const,
3862    pub safety: Safety,
3863    pub is_auto: IsAuto,
3864    pub ident: Ident,
3865    pub generics: Generics,
3866    #[visitable(extra = BoundKind::SuperTraits)]
3867    pub bounds: GenericBounds,
3868    #[visitable(extra = AssocCtxt::Trait)]
3869    pub items: ThinVec<Box<AssocItem>>,
3870}
3871
3872#[derive(#[automatically_derived]
impl ::core::clone::Clone for TyAlias {
    #[inline]
    fn clone(&self) -> TyAlias {
        TyAlias {
            defaultness: ::core::clone::Clone::clone(&self.defaultness),
            ident: ::core::clone::Clone::clone(&self.ident),
            generics: ::core::clone::Clone::clone(&self.generics),
            after_where_clause: ::core::clone::Clone::clone(&self.after_where_clause),
            bounds: ::core::clone::Clone::clone(&self.bounds),
            ty: ::core::clone::Clone::clone(&self.ty),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for TyAlias {
            fn encode(&self, __encoder: &mut __E) {
                let TyAlias {
                        defaultness: ref __binding_0,
                        ident: ref __binding_1,
                        generics: ref __binding_2,
                        after_where_clause: ref __binding_3,
                        bounds: ref __binding_4,
                        ty: ref __binding_5 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_5,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for TyAlias {
            fn decode(__decoder: &mut __D) -> Self {
                TyAlias {
                    defaultness: ::rustc_serialize::Decodable::decode(__decoder),
                    ident: ::rustc_serialize::Decodable::decode(__decoder),
                    generics: ::rustc_serialize::Decodable::decode(__decoder),
                    after_where_clause: ::rustc_serialize::Decodable::decode(__decoder),
                    bounds: ::rustc_serialize::Decodable::decode(__decoder),
                    ty: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for TyAlias {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["defaultness", "ident", "generics", "after_where_clause",
                        "bounds", "ty"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.defaultness, &self.ident, &self.generics,
                        &self.after_where_clause, &self.bounds, &&self.ty];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "TyAlias",
            names, values)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for TyAlias
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    TyAlias {
                        defaultness: ref __binding_0,
                        ident: ref __binding_1,
                        generics: ref __binding_2,
                        after_where_clause: ref __binding_3,
                        bounds: ref __binding_4,
                        ty: ref __binding_5 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, (BoundKind::Bound))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_5,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for TyAlias where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    TyAlias {
                        defaultness: ref mut __binding_0,
                        ident: ref mut __binding_1,
                        generics: ref mut __binding_2,
                        after_where_clause: ref mut __binding_3,
                        bounds: ref mut __binding_4,
                        ty: ref mut __binding_5 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, (BoundKind::Bound))
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_5,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3873pub struct TyAlias {
3874    pub defaultness: Defaultness,
3875    pub ident: Ident,
3876    pub generics: Generics,
3877    /// There are two locations for where clause on type aliases. This represents the second
3878    /// where clause, before the semicolon. The first where clause is stored inside `generics`.
3879    ///
3880    /// Take this example:
3881    /// ```ignore (only-for-syntax-highlight)
3882    /// trait Foo {
3883    ///   type Assoc<'a, 'b> where Self: 'a, Self: 'b;
3884    /// }
3885    /// impl Foo for () {
3886    ///   type Assoc<'a, 'b> where Self: 'a = () where Self: 'b;
3887    ///   //                 ^^^^^^^^^^^^^^ before where clause
3888    ///   //                                     ^^^^^^^^^^^^^^ after where clause
3889    /// }
3890    /// ```
3891    pub after_where_clause: WhereClause,
3892    #[visitable(extra = BoundKind::Bound)]
3893    pub bounds: GenericBounds,
3894    pub ty: Option<Box<Ty>>,
3895}
3896
3897#[derive(#[automatically_derived]
impl ::core::clone::Clone for Impl {
    #[inline]
    fn clone(&self) -> Impl {
        Impl {
            generics: ::core::clone::Clone::clone(&self.generics),
            constness: ::core::clone::Clone::clone(&self.constness),
            of_trait: ::core::clone::Clone::clone(&self.of_trait),
            self_ty: ::core::clone::Clone::clone(&self.self_ty),
            items: ::core::clone::Clone::clone(&self.items),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Impl {
            fn encode(&self, __encoder: &mut __E) {
                let Impl {
                        generics: ref __binding_0,
                        constness: ref __binding_1,
                        of_trait: ref __binding_2,
                        self_ty: ref __binding_3,
                        items: ref __binding_4 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Impl {
            fn decode(__decoder: &mut __D) -> Self {
                Impl {
                    generics: ::rustc_serialize::Decodable::decode(__decoder),
                    constness: ::rustc_serialize::Decodable::decode(__decoder),
                    of_trait: ::rustc_serialize::Decodable::decode(__decoder),
                    self_ty: ::rustc_serialize::Decodable::decode(__decoder),
                    items: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Impl {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f, "Impl",
            "generics", &self.generics, "constness", &self.constness,
            "of_trait", &self.of_trait, "self_ty", &self.self_ty, "items",
            &&self.items)
    }
}Debug)]
3898pub struct Impl {
3899    pub generics: Generics,
3900    pub constness: Const,
3901    pub of_trait: Option<Box<TraitImplHeader>>,
3902    pub self_ty: Box<Ty>,
3903    pub items: ThinVec<Box<AssocItem>>,
3904}
3905
3906#[derive(#[automatically_derived]
impl ::core::clone::Clone for TraitImplHeader {
    #[inline]
    fn clone(&self) -> TraitImplHeader {
        TraitImplHeader {
            defaultness: ::core::clone::Clone::clone(&self.defaultness),
            safety: ::core::clone::Clone::clone(&self.safety),
            polarity: ::core::clone::Clone::clone(&self.polarity),
            trait_ref: ::core::clone::Clone::clone(&self.trait_ref),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for TraitImplHeader {
            fn encode(&self, __encoder: &mut __E) {
                let TraitImplHeader {
                        defaultness: ref __binding_0,
                        safety: ref __binding_1,
                        polarity: ref __binding_2,
                        trait_ref: ref __binding_3 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for TraitImplHeader {
            fn decode(__decoder: &mut __D) -> Self {
                TraitImplHeader {
                    defaultness: ::rustc_serialize::Decodable::decode(__decoder),
                    safety: ::rustc_serialize::Decodable::decode(__decoder),
                    polarity: ::rustc_serialize::Decodable::decode(__decoder),
                    trait_ref: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for TraitImplHeader {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f,
            "TraitImplHeader", "defaultness", &self.defaultness, "safety",
            &self.safety, "polarity", &self.polarity, "trait_ref",
            &&self.trait_ref)
    }
}Debug)]
3907pub struct TraitImplHeader {
3908    pub defaultness: Defaultness,
3909    pub safety: Safety,
3910    pub polarity: ImplPolarity,
3911    pub trait_ref: TraitRef,
3912}
3913
3914#[derive(#[automatically_derived]
impl ::core::clone::Clone for FnContract {
    #[inline]
    fn clone(&self) -> FnContract {
        FnContract {
            declarations: ::core::clone::Clone::clone(&self.declarations),
            requires: ::core::clone::Clone::clone(&self.requires),
            ensures: ::core::clone::Clone::clone(&self.ensures),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for FnContract {
            fn encode(&self, __encoder: &mut __E) {
                let FnContract {
                        declarations: ref __binding_0,
                        requires: ref __binding_1,
                        ensures: 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);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for FnContract {
            fn decode(__decoder: &mut __D) -> Self {
                FnContract {
                    declarations: ::rustc_serialize::Decodable::decode(__decoder),
                    requires: ::rustc_serialize::Decodable::decode(__decoder),
                    ensures: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for FnContract {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "FnContract",
            "declarations", &self.declarations, "requires", &self.requires,
            "ensures", &&self.ensures)
    }
}Debug, #[automatically_derived]
impl ::core::default::Default for FnContract {
    #[inline]
    fn default() -> FnContract {
        FnContract {
            declarations: ::core::default::Default::default(),
            requires: ::core::default::Default::default(),
            ensures: ::core::default::Default::default(),
        }
    }
}Default, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for FnContract
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    FnContract {
                        declarations: ref __binding_0,
                        requires: ref __binding_1,
                        ensures: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for FnContract where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    FnContract {
                        declarations: ref mut __binding_0,
                        requires: ref mut __binding_1,
                        ensures: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3915pub struct FnContract {
3916    /// Declarations of variables accessible both in the `requires` and
3917    /// `ensures` clauses.
3918    pub declarations: ThinVec<Stmt>,
3919    pub requires: Option<Box<Expr>>,
3920    pub ensures: Option<Box<Expr>>,
3921}
3922
3923#[derive(#[automatically_derived]
impl ::core::clone::Clone for Fn {
    #[inline]
    fn clone(&self) -> Fn {
        Fn {
            defaultness: ::core::clone::Clone::clone(&self.defaultness),
            ident: ::core::clone::Clone::clone(&self.ident),
            generics: ::core::clone::Clone::clone(&self.generics),
            sig: ::core::clone::Clone::clone(&self.sig),
            contract: ::core::clone::Clone::clone(&self.contract),
            define_opaque: ::core::clone::Clone::clone(&self.define_opaque),
            body: ::core::clone::Clone::clone(&self.body),
            eii_impl: ::core::clone::Clone::clone(&self.eii_impl),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Fn {
            fn encode(&self, __encoder: &mut __E) {
                let Fn {
                        defaultness: ref __binding_0,
                        ident: ref __binding_1,
                        generics: ref __binding_2,
                        sig: ref __binding_3,
                        contract: ref __binding_4,
                        define_opaque: ref __binding_5,
                        body: ref __binding_6,
                        eii_impl: ref __binding_7 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_5,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_6,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_7,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Fn {
            fn decode(__decoder: &mut __D) -> Self {
                Fn {
                    defaultness: ::rustc_serialize::Decodable::decode(__decoder),
                    ident: ::rustc_serialize::Decodable::decode(__decoder),
                    generics: ::rustc_serialize::Decodable::decode(__decoder),
                    sig: ::rustc_serialize::Decodable::decode(__decoder),
                    contract: ::rustc_serialize::Decodable::decode(__decoder),
                    define_opaque: ::rustc_serialize::Decodable::decode(__decoder),
                    body: ::rustc_serialize::Decodable::decode(__decoder),
                    eii_impl: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Fn {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["defaultness", "ident", "generics", "sig", "contract",
                        "define_opaque", "body", "eii_impl"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.defaultness, &self.ident, &self.generics, &self.sig,
                        &self.contract, &self.define_opaque, &self.body,
                        &&self.eii_impl];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "Fn", names,
            values)
    }
}Debug)]
3924pub struct Fn {
3925    pub defaultness: Defaultness,
3926    pub ident: Ident,
3927    pub generics: Generics,
3928    pub sig: FnSig,
3929    pub contract: Option<Box<FnContract>>,
3930    pub define_opaque: Option<ThinVec<(NodeId, Path)>>,
3931    pub body: Option<Box<Block>>,
3932
3933    /// This function is an implementation of an externally implementable item (EII).
3934    /// This means, there was an EII declared somewhere and this function is the
3935    /// implementation that should be run when the declaration is called.
3936    pub eii_impl: Option<Box<EiiImpl>>,
3937}
3938
3939impl Fn {
3940    pub fn is_pin_drop_sugar(&self) -> bool {
3941        self.ident.name == sym::drop
3942            && self
3943                .sig
3944                .decl
3945                .inputs
3946                .first()
3947                .and_then(|param| param.to_self())
3948                .is_some_and(|eself| #[allow(non_exhaustive_omitted_patterns)] match eself.node {
    SelfKind::Pinned(None, Mutability::Mut) => true,
    _ => false,
}matches!(eself.node, SelfKind::Pinned(None, Mutability::Mut)))
3949    }
3950}
3951
3952#[derive(#[automatically_derived]
impl ::core::clone::Clone for EiiImpl {
    #[inline]
    fn clone(&self) -> EiiImpl {
        EiiImpl {
            node_id: ::core::clone::Clone::clone(&self.node_id),
            eii_macro_path: ::core::clone::Clone::clone(&self.eii_macro_path),
            known_eii_macro_resolution: ::core::clone::Clone::clone(&self.known_eii_macro_resolution),
            impl_safety: ::core::clone::Clone::clone(&self.impl_safety),
            span: ::core::clone::Clone::clone(&self.span),
            inner_span: ::core::clone::Clone::clone(&self.inner_span),
            is_default: ::core::clone::Clone::clone(&self.is_default),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for EiiImpl {
            fn encode(&self, __encoder: &mut __E) {
                let EiiImpl {
                        node_id: ref __binding_0,
                        eii_macro_path: ref __binding_1,
                        known_eii_macro_resolution: ref __binding_2,
                        impl_safety: ref __binding_3,
                        span: ref __binding_4,
                        inner_span: ref __binding_5,
                        is_default: ref __binding_6 } = *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);
                ::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);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for EiiImpl {
            fn decode(__decoder: &mut __D) -> Self {
                EiiImpl {
                    node_id: ::rustc_serialize::Decodable::decode(__decoder),
                    eii_macro_path: ::rustc_serialize::Decodable::decode(__decoder),
                    known_eii_macro_resolution: ::rustc_serialize::Decodable::decode(__decoder),
                    impl_safety: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    inner_span: ::rustc_serialize::Decodable::decode(__decoder),
                    is_default: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for EiiImpl {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["node_id", "eii_macro_path", "known_eii_macro_resolution",
                        "impl_safety", "span", "inner_span", "is_default"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.node_id, &self.eii_macro_path,
                        &self.known_eii_macro_resolution, &self.impl_safety,
                        &self.span, &self.inner_span, &&self.is_default];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "EiiImpl",
            names, values)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for EiiImpl
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    EiiImpl {
                        node_id: ref __binding_0,
                        eii_macro_path: ref __binding_1,
                        known_eii_macro_resolution: ref __binding_2,
                        impl_safety: ref __binding_3,
                        span: ref __binding_4,
                        inner_span: ref __binding_5,
                        is_default: ref __binding_6 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_5,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_6,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for EiiImpl where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    EiiImpl {
                        node_id: ref mut __binding_0,
                        eii_macro_path: ref mut __binding_1,
                        known_eii_macro_resolution: ref mut __binding_2,
                        impl_safety: ref mut __binding_3,
                        span: ref mut __binding_4,
                        inner_span: ref mut __binding_5,
                        is_default: ref mut __binding_6 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_5,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_6,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3953pub struct EiiImpl {
3954    pub node_id: NodeId,
3955    pub eii_macro_path: Path,
3956    /// This field is an implementation detail that prevents a lot of bugs.
3957    /// See <https://github.com/rust-lang/rust/issues/149981> for an example.
3958    ///
3959    /// The problem is, that if we generate a declaration *together* with its default,
3960    /// we generate both a declaration and an implementation. The generated implementation
3961    /// uses the same mechanism to register itself as a user-defined implementation would,
3962    /// despite being invisible to users. What does happen is a name resolution step.
3963    /// The invisible default implementation has to find the declaration.
3964    /// Both are generated at the same time, so we can skip that name resolution step.
3965    ///
3966    /// This field is that shortcut: we prefill the extern target to skip a name resolution step,
3967    /// making sure it never fails. It'd be awful UX if we fail name resolution in code invisible to the user.
3968    pub known_eii_macro_resolution: Option<Path>,
3969    pub impl_safety: Safety,
3970    pub span: Span,
3971    pub inner_span: Span,
3972    pub is_default: bool,
3973}
3974
3975#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for DelegationSource { }
#[automatically_derived]
impl ::core::clone::Clone for DelegationSource {
    #[inline]
    fn clone(&self) -> DelegationSource {
        let _: ::core::clone::AssertParamIsClone<LocalExpnId>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for DelegationSource { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for DelegationSource {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        DelegationSource::Single => { 0usize }
                        DelegationSource::List(ref __binding_0) => { 1usize }
                        DelegationSource::Glob => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    DelegationSource::Single => {}
                    DelegationSource::List(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    DelegationSource::Glob => {}
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for DelegationSource {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { DelegationSource::Single }
                    1usize => {
                        DelegationSource::List(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => { DelegationSource::Glob }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `DelegationSource`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for DelegationSource {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            DelegationSource::Single =>
                ::core::fmt::Formatter::write_str(f, "Single"),
            DelegationSource::List(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "List",
                    &__self_0),
            DelegationSource::Glob =>
                ::core::fmt::Formatter::write_str(f, "Glob"),
        }
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for DelegationSource { }
#[automatically_derived]
impl ::core::cmp::PartialEq for DelegationSource {
    #[inline]
    fn eq(&self, other: &DelegationSource) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (DelegationSource::List(__self_0),
                    DelegationSource::List(__arg1_0)) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for DelegationSource {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<LocalExpnId>;
    }
}Eq)]
3976pub enum DelegationSource {
3977    Single,
3978    List(LocalExpnId),
3979    Glob,
3980}
3981
3982#[derive(#[automatically_derived]
impl ::core::clone::Clone for Delegation {
    #[inline]
    fn clone(&self) -> Delegation {
        Delegation {
            id: ::core::clone::Clone::clone(&self.id),
            qself: ::core::clone::Clone::clone(&self.qself),
            path: ::core::clone::Clone::clone(&self.path),
            ident: ::core::clone::Clone::clone(&self.ident),
            rename: ::core::clone::Clone::clone(&self.rename),
            body: ::core::clone::Clone::clone(&self.body),
            source: ::core::clone::Clone::clone(&self.source),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Delegation {
            fn encode(&self, __encoder: &mut __E) {
                let Delegation {
                        id: ref __binding_0,
                        qself: ref __binding_1,
                        path: ref __binding_2,
                        ident: ref __binding_3,
                        rename: ref __binding_4,
                        body: ref __binding_5,
                        source: ref __binding_6 } = *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);
                ::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);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Delegation {
            fn decode(__decoder: &mut __D) -> Self {
                Delegation {
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    qself: ::rustc_serialize::Decodable::decode(__decoder),
                    path: ::rustc_serialize::Decodable::decode(__decoder),
                    ident: ::rustc_serialize::Decodable::decode(__decoder),
                    rename: ::rustc_serialize::Decodable::decode(__decoder),
                    body: ::rustc_serialize::Decodable::decode(__decoder),
                    source: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Delegation {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["id", "qself", "path", "ident", "rename", "body", "source"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.id, &self.qself, &self.path, &self.ident, &self.rename,
                        &self.body, &&self.source];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "Delegation",
            names, values)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Delegation
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Delegation {
                        id: ref __binding_0,
                        qself: ref __binding_1,
                        path: ref __binding_2,
                        ident: ref __binding_3,
                        rename: ref __binding_4,
                        body: ref __binding_5,
                        source: ref __binding_6 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_5,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {}
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Delegation where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Delegation {
                        id: ref mut __binding_0,
                        qself: ref mut __binding_1,
                        path: ref mut __binding_2,
                        ident: ref mut __binding_3,
                        rename: ref mut __binding_4,
                        body: ref mut __binding_5,
                        source: ref mut __binding_6 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_5,
                                __visitor, ())
                        }
                        {}
                    }
                }
            }
        }
    };Walkable)]
3983pub struct Delegation {
3984    /// Path resolution id.
3985    pub id: NodeId,
3986    pub qself: Option<Box<QSelf>>,
3987    pub path: Path,
3988    pub ident: Ident,
3989    pub rename: Option<Ident>,
3990    pub body: Option<Box<Block>>,
3991    /// The item was expanded from a glob delegation item.
3992    #[visitable(ignore)]
3993    pub source: DelegationSource,
3994}
3995
3996impl Delegation {
3997    pub fn last_segment_span(&self) -> Span {
3998        self.path.segments.last().unwrap().ident.span
3999    }
4000}
4001
4002#[derive(#[automatically_derived]
impl ::core::clone::Clone for DelegationSuffixes {
    #[inline]
    fn clone(&self) -> DelegationSuffixes {
        match self {
            DelegationSuffixes::List(__self_0) =>
                DelegationSuffixes::List(::core::clone::Clone::clone(__self_0)),
            DelegationSuffixes::Glob(__self_0) =>
                DelegationSuffixes::Glob(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for DelegationSuffixes {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        DelegationSuffixes::List(ref __binding_0) => { 0usize }
                        DelegationSuffixes::Glob(ref __binding_0) => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    DelegationSuffixes::List(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    DelegationSuffixes::Glob(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for DelegationSuffixes {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        DelegationSuffixes::List(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        DelegationSuffixes::Glob(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `DelegationSuffixes`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for DelegationSuffixes {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            DelegationSuffixes::List(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "List",
                    &__self_0),
            DelegationSuffixes::Glob(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Glob",
                    &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            DelegationSuffixes where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    DelegationSuffixes::List(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    DelegationSuffixes::Glob(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for DelegationSuffixes
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    DelegationSuffixes::List(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    DelegationSuffixes::Glob(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
4003pub enum DelegationSuffixes {
4004    List(ThinVec<(Ident, Option<Ident>)>),
4005    Glob(Span),
4006}
4007
4008#[derive(#[automatically_derived]
impl ::core::clone::Clone for DelegationMac {
    #[inline]
    fn clone(&self) -> DelegationMac {
        DelegationMac {
            qself: ::core::clone::Clone::clone(&self.qself),
            prefix: ::core::clone::Clone::clone(&self.prefix),
            suffixes: ::core::clone::Clone::clone(&self.suffixes),
            body: ::core::clone::Clone::clone(&self.body),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for DelegationMac {
            fn encode(&self, __encoder: &mut __E) {
                let DelegationMac {
                        qself: ref __binding_0,
                        prefix: ref __binding_1,
                        suffixes: ref __binding_2,
                        body: ref __binding_3 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for DelegationMac {
            fn decode(__decoder: &mut __D) -> Self {
                DelegationMac {
                    qself: ::rustc_serialize::Decodable::decode(__decoder),
                    prefix: ::rustc_serialize::Decodable::decode(__decoder),
                    suffixes: ::rustc_serialize::Decodable::decode(__decoder),
                    body: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for DelegationMac {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "DelegationMac",
            "qself", &self.qself, "prefix", &self.prefix, "suffixes",
            &self.suffixes, "body", &&self.body)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            DelegationMac where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    DelegationMac {
                        qself: ref __binding_0,
                        prefix: ref __binding_1,
                        suffixes: ref __binding_2,
                        body: ref __binding_3 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for DelegationMac where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    DelegationMac {
                        qself: ref mut __binding_0,
                        prefix: ref mut __binding_1,
                        suffixes: ref mut __binding_2,
                        body: ref mut __binding_3 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
4009pub struct DelegationMac {
4010    pub qself: Option<Box<QSelf>>,
4011    pub prefix: Path,
4012    pub suffixes: DelegationSuffixes,
4013    pub body: Option<Box<Block>>,
4014}
4015
4016#[derive(#[automatically_derived]
impl ::core::clone::Clone for StaticItem {
    #[inline]
    fn clone(&self) -> StaticItem {
        StaticItem {
            ident: ::core::clone::Clone::clone(&self.ident),
            ty: ::core::clone::Clone::clone(&self.ty),
            safety: ::core::clone::Clone::clone(&self.safety),
            mutability: ::core::clone::Clone::clone(&self.mutability),
            expr: ::core::clone::Clone::clone(&self.expr),
            define_opaque: ::core::clone::Clone::clone(&self.define_opaque),
            eii_impl: ::core::clone::Clone::clone(&self.eii_impl),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for StaticItem {
            fn encode(&self, __encoder: &mut __E) {
                let StaticItem {
                        ident: ref __binding_0,
                        ty: ref __binding_1,
                        safety: ref __binding_2,
                        mutability: ref __binding_3,
                        expr: ref __binding_4,
                        define_opaque: ref __binding_5,
                        eii_impl: ref __binding_6 } = *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);
                ::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);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for StaticItem {
            fn decode(__decoder: &mut __D) -> Self {
                StaticItem {
                    ident: ::rustc_serialize::Decodable::decode(__decoder),
                    ty: ::rustc_serialize::Decodable::decode(__decoder),
                    safety: ::rustc_serialize::Decodable::decode(__decoder),
                    mutability: ::rustc_serialize::Decodable::decode(__decoder),
                    expr: ::rustc_serialize::Decodable::decode(__decoder),
                    define_opaque: ::rustc_serialize::Decodable::decode(__decoder),
                    eii_impl: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for StaticItem {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["ident", "ty", "safety", "mutability", "expr", "define_opaque",
                        "eii_impl"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.ident, &self.ty, &self.safety, &self.mutability,
                        &self.expr, &self.define_opaque, &&self.eii_impl];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "StaticItem",
            names, values)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for StaticItem
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    StaticItem {
                        ident: ref __binding_0,
                        ty: ref __binding_1,
                        safety: ref __binding_2,
                        mutability: ref __binding_3,
                        expr: ref __binding_4,
                        define_opaque: ref __binding_5,
                        eii_impl: ref __binding_6 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_5,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_6,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for StaticItem where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    StaticItem {
                        ident: ref mut __binding_0,
                        ty: ref mut __binding_1,
                        safety: ref mut __binding_2,
                        mutability: ref mut __binding_3,
                        expr: ref mut __binding_4,
                        define_opaque: ref mut __binding_5,
                        eii_impl: ref mut __binding_6 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_5,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_6,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
4017pub struct StaticItem {
4018    pub ident: Ident,
4019    pub ty: Box<Ty>,
4020    pub safety: Safety,
4021    pub mutability: Mutability,
4022    pub expr: Option<Box<Expr>>,
4023    pub define_opaque: Option<ThinVec<(NodeId, Path)>>,
4024
4025    /// This static is an implementation of an externally implementable item (EII).
4026    /// This means, there was an EII declared somewhere and this static is the
4027    /// implementation that should be used for the declaration.
4028    pub eii_impl: Option<Box<EiiImpl>>,
4029}
4030
4031#[derive(#[automatically_derived]
impl ::core::clone::Clone for ConstItem {
    #[inline]
    fn clone(&self) -> ConstItem {
        ConstItem {
            defaultness: ::core::clone::Clone::clone(&self.defaultness),
            ident: ::core::clone::Clone::clone(&self.ident),
            generics: ::core::clone::Clone::clone(&self.generics),
            ty: ::core::clone::Clone::clone(&self.ty),
            body: ::core::clone::Clone::clone(&self.body),
            kind: ::core::clone::Clone::clone(&self.kind),
            define_opaque: ::core::clone::Clone::clone(&self.define_opaque),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ConstItem {
            fn encode(&self, __encoder: &mut __E) {
                let ConstItem {
                        defaultness: ref __binding_0,
                        ident: ref __binding_1,
                        generics: ref __binding_2,
                        ty: ref __binding_3,
                        body: ref __binding_4,
                        kind: ref __binding_5,
                        define_opaque: ref __binding_6 } = *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);
                ::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);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ConstItem {
            fn decode(__decoder: &mut __D) -> Self {
                ConstItem {
                    defaultness: ::rustc_serialize::Decodable::decode(__decoder),
                    ident: ::rustc_serialize::Decodable::decode(__decoder),
                    generics: ::rustc_serialize::Decodable::decode(__decoder),
                    ty: ::rustc_serialize::Decodable::decode(__decoder),
                    body: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    define_opaque: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ConstItem {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["defaultness", "ident", "generics", "ty", "body", "kind",
                        "define_opaque"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.defaultness, &self.ident, &self.generics, &self.ty,
                        &self.body, &self.kind, &&self.define_opaque];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "ConstItem",
            names, values)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for ConstItem
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    ConstItem {
                        defaultness: ref __binding_0,
                        ident: ref __binding_1,
                        generics: ref __binding_2,
                        ty: ref __binding_3,
                        body: ref __binding_4,
                        kind: ref __binding_5,
                        define_opaque: ref __binding_6 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {}
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_6,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for ConstItem where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    ConstItem {
                        defaultness: ref mut __binding_0,
                        ident: ref mut __binding_1,
                        generics: ref mut __binding_2,
                        ty: ref mut __binding_3,
                        body: ref mut __binding_4,
                        kind: ref mut __binding_5,
                        define_opaque: ref mut __binding_6 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                        {}
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_6,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
4032pub struct ConstItem {
4033    pub defaultness: Defaultness,
4034    pub ident: Ident,
4035    pub generics: Generics,
4036    pub ty: Box<Ty>,
4037    pub body: Option<Box<Expr>>,
4038    #[visitable(ignore)]
4039    pub kind: ConstItemKind,
4040    pub define_opaque: Option<ThinVec<(NodeId, Path)>>,
4041}
4042
4043#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for ConstItemKind { }
#[automatically_derived]
impl ::core::clone::Clone for ConstItemKind {
    #[inline]
    fn clone(&self) -> ConstItemKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for ConstItemKind { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ConstItemKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        ConstItemKind::Body => { 0usize }
                        ConstItemKind::TypeConst => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ConstItemKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { ConstItemKind::Body }
                    1usize => { ConstItemKind::TypeConst }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `ConstItemKind`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ConstItemKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                ConstItemKind::Body => "Body",
                ConstItemKind::TypeConst => "TypeConst",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for ConstItemKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ConstItemKind {
    #[inline]
    fn eq(&self, other: &ConstItemKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ConstItemKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq)]
4044pub enum ConstItemKind {
4045    Body,
4046    TypeConst,
4047}
4048
4049#[derive(#[automatically_derived]
impl ::core::clone::Clone for ConstBlockItem {
    #[inline]
    fn clone(&self) -> ConstBlockItem {
        ConstBlockItem {
            id: ::core::clone::Clone::clone(&self.id),
            span: ::core::clone::Clone::clone(&self.span),
            block: ::core::clone::Clone::clone(&self.block),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ConstBlockItem {
            fn encode(&self, __encoder: &mut __E) {
                let ConstBlockItem {
                        id: ref __binding_0,
                        span: ref __binding_1,
                        block: 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);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ConstBlockItem {
            fn decode(__decoder: &mut __D) -> Self {
                ConstBlockItem {
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    block: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ConstBlockItem {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f,
            "ConstBlockItem", "id", &self.id, "span", &self.span, "block",
            &&self.block)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            ConstBlockItem where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    ConstBlockItem {
                        id: ref __binding_0,
                        span: ref __binding_1,
                        block: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for ConstBlockItem where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    ConstBlockItem {
                        id: ref mut __binding_0,
                        span: ref mut __binding_1,
                        block: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
4050pub struct ConstBlockItem {
4051    pub id: NodeId,
4052    pub span: Span,
4053    pub block: Box<Block>,
4054}
4055
4056impl ConstBlockItem {
4057    pub const IDENT: Ident = Ident { name: kw::Underscore, span: DUMMY_SP };
4058}
4059
4060#[derive(#[automatically_derived]
impl ::core::clone::Clone for Guard {
    #[inline]
    fn clone(&self) -> Guard {
        Guard {
            cond: ::core::clone::Clone::clone(&self.cond),
            span_with_leading_if: ::core::clone::Clone::clone(&self.span_with_leading_if),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Guard {
            fn encode(&self, __encoder: &mut __E) {
                let Guard {
                        cond: ref __binding_0, span_with_leading_if: ref __binding_1
                        } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Guard {
            fn decode(__decoder: &mut __D) -> Self {
                Guard {
                    cond: ::rustc_serialize::Decodable::decode(__decoder),
                    span_with_leading_if: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Guard {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "Guard", "cond",
            &self.cond, "span_with_leading_if", &&self.span_with_leading_if)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Guard where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Guard {
                        cond: ref __binding_0, span_with_leading_if: ref __binding_1
                        } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Guard where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Guard {
                        cond: ref mut __binding_0,
                        span_with_leading_if: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
4061pub struct Guard {
4062    pub cond: Expr,
4063    pub span_with_leading_if: Span,
4064}
4065
4066impl Guard {
4067    pub fn span(&self) -> Span {
4068        self.cond.span
4069    }
4070}
4071
4072#[derive(#[automatically_derived]
impl ::core::clone::Clone for TestBinderConstraints {
    #[inline]
    fn clone(&self) -> TestBinderConstraints {
        TestBinderConstraints {
            generics: ::core::clone::Clone::clone(&self.generics),
            body: ::core::clone::Clone::clone(&self.body),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for TestBinderConstraints {
            fn encode(&self, __encoder: &mut __E) {
                let TestBinderConstraints {
                        generics: ref __binding_0, body: ref __binding_1 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for TestBinderConstraints {
            fn decode(__decoder: &mut __D) -> Self {
                TestBinderConstraints {
                    generics: ::rustc_serialize::Decodable::decode(__decoder),
                    body: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for TestBinderConstraints {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "TestBinderConstraints", "generics", &self.generics, "body",
            &&self.body)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            TestBinderConstraints where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    TestBinderConstraints {
                        generics: ref __binding_0, body: ref __binding_1 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for TestBinderConstraints
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    TestBinderConstraints {
                        generics: ref mut __binding_0, body: ref mut __binding_1 }
                        => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
4073pub struct TestBinderConstraints {
4074    pub generics: Generics,
4075    pub body: Box<TestBinderBody>,
4076}
4077
4078#[derive(#[automatically_derived]
impl ::core::clone::Clone for TestBinderBody {
    #[inline]
    fn clone(&self) -> TestBinderBody {
        TestBinderBody {
            foralls: ::core::clone::Clone::clone(&self.foralls),
            exists: ::core::clone::Clone::clone(&self.exists),
            constraints: ::core::clone::Clone::clone(&self.constraints),
            predicates: ::core::clone::Clone::clone(&self.predicates),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for TestBinderBody {
            fn encode(&self, __encoder: &mut __E) {
                let TestBinderBody {
                        foralls: ref __binding_0,
                        exists: ref __binding_1,
                        constraints: ref __binding_2,
                        predicates: ref __binding_3 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for TestBinderBody {
            fn decode(__decoder: &mut __D) -> Self {
                TestBinderBody {
                    foralls: ::rustc_serialize::Decodable::decode(__decoder),
                    exists: ::rustc_serialize::Decodable::decode(__decoder),
                    constraints: ::rustc_serialize::Decodable::decode(__decoder),
                    predicates: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for TestBinderBody {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f,
            "TestBinderBody", "foralls", &self.foralls, "exists",
            &self.exists, "constraints", &self.constraints, "predicates",
            &&self.predicates)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            TestBinderBody where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    TestBinderBody {
                        foralls: ref __binding_0,
                        exists: ref __binding_1,
                        constraints: ref __binding_2,
                        predicates: ref __binding_3 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for TestBinderBody where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    TestBinderBody {
                        foralls: ref mut __binding_0,
                        exists: ref mut __binding_1,
                        constraints: ref mut __binding_2,
                        predicates: ref mut __binding_3 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
4079pub struct TestBinderBody {
4080    pub foralls: ThinVec<TestBinderForall>,
4081    pub exists: ThinVec<TestBinderExists>,
4082    pub constraints: Vec<TestBinderConstraint>,
4083    /// These are not where clauses, but rather predicates within the body to be proven
4084    pub predicates: Vec<WhereClause>,
4085}
4086
4087#[derive(#[automatically_derived]
impl ::core::clone::Clone for TestBinderForall {
    #[inline]
    fn clone(&self) -> TestBinderForall {
        TestBinderForall {
            span: ::core::clone::Clone::clone(&self.span),
            node_id: ::core::clone::Clone::clone(&self.node_id),
            generics: ::core::clone::Clone::clone(&self.generics),
            body: ::core::clone::Clone::clone(&self.body),
            assert_on_exit: ::core::clone::Clone::clone(&self.assert_on_exit),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for TestBinderForall {
            fn encode(&self, __encoder: &mut __E) {
                let TestBinderForall {
                        span: ref __binding_0,
                        node_id: ref __binding_1,
                        generics: ref __binding_2,
                        body: ref __binding_3,
                        assert_on_exit: ref __binding_4 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for TestBinderForall {
            fn decode(__decoder: &mut __D) -> Self {
                TestBinderForall {
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    node_id: ::rustc_serialize::Decodable::decode(__decoder),
                    generics: ::rustc_serialize::Decodable::decode(__decoder),
                    body: ::rustc_serialize::Decodable::decode(__decoder),
                    assert_on_exit: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for TestBinderForall {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f,
            "TestBinderForall", "span", &self.span, "node_id", &self.node_id,
            "generics", &self.generics, "body", &self.body, "assert_on_exit",
            &&self.assert_on_exit)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            TestBinderForall where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    TestBinderForall {
                        span: ref __binding_0,
                        node_id: ref __binding_1,
                        generics: ref __binding_2,
                        body: ref __binding_3,
                        assert_on_exit: ref __binding_4 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for TestBinderForall
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    TestBinderForall {
                        span: ref mut __binding_0,
                        node_id: ref mut __binding_1,
                        generics: ref mut __binding_2,
                        body: ref mut __binding_3,
                        assert_on_exit: ref mut __binding_4 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
4088pub struct TestBinderForall {
4089    pub span: Span,
4090    pub node_id: NodeId,
4091    pub generics: Generics,
4092    pub body: TestBinderBody,
4093    pub assert_on_exit: Option<ThinVec<TestBinderConstraint>>,
4094}
4095
4096#[derive(#[automatically_derived]
impl ::core::clone::Clone for TestBinderExists {
    #[inline]
    fn clone(&self) -> TestBinderExists {
        TestBinderExists {
            span: ::core::clone::Clone::clone(&self.span),
            node_id: ::core::clone::Clone::clone(&self.node_id),
            params: ::core::clone::Clone::clone(&self.params),
            body: ::core::clone::Clone::clone(&self.body),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for TestBinderExists {
            fn encode(&self, __encoder: &mut __E) {
                let TestBinderExists {
                        span: ref __binding_0,
                        node_id: ref __binding_1,
                        params: ref __binding_2,
                        body: ref __binding_3 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for TestBinderExists {
            fn decode(__decoder: &mut __D) -> Self {
                TestBinderExists {
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    node_id: ::rustc_serialize::Decodable::decode(__decoder),
                    params: ::rustc_serialize::Decodable::decode(__decoder),
                    body: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for TestBinderExists {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f,
            "TestBinderExists", "span", &self.span, "node_id", &self.node_id,
            "params", &self.params, "body", &&self.body)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            TestBinderExists where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    TestBinderExists {
                        span: ref __binding_0,
                        node_id: ref __binding_1,
                        params: ref __binding_2,
                        body: ref __binding_3 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for TestBinderExists
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    TestBinderExists {
                        span: ref mut __binding_0,
                        node_id: ref mut __binding_1,
                        params: ref mut __binding_2,
                        body: ref mut __binding_3 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
4097pub struct TestBinderExists {
4098    pub span: Span,
4099    pub node_id: NodeId,
4100    pub params: ThinVec<GenericParam>,
4101    pub body: TestBinderBody,
4102}
4103
4104#[derive(#[automatically_derived]
impl ::core::clone::Clone for TestBinderConstraint {
    #[inline]
    fn clone(&self) -> TestBinderConstraint {
        match self {
            TestBinderConstraint::And { items: __self_0 } =>
                TestBinderConstraint::And {
                    items: ::core::clone::Clone::clone(__self_0),
                },
            TestBinderConstraint::Or { items: __self_0 } =>
                TestBinderConstraint::Or {
                    items: ::core::clone::Clone::clone(__self_0),
                },
            TestBinderConstraint::Lifetime { lhs: __self_0, rhs: __self_1 } =>
                TestBinderConstraint::Lifetime {
                    lhs: ::core::clone::Clone::clone(__self_0),
                    rhs: ::core::clone::Clone::clone(__self_1),
                },
            TestBinderConstraint::PlaceholderOutlives {
                lhs: __self_0, rhs: __self_1 } =>
                TestBinderConstraint::PlaceholderOutlives {
                    lhs: ::core::clone::Clone::clone(__self_0),
                    rhs: ::core::clone::Clone::clone(__self_1),
                },
            TestBinderConstraint::AliasOutlives {
                bound_type_constraint: __self_0 } =>
                TestBinderConstraint::AliasOutlives {
                    bound_type_constraint: ::core::clone::Clone::clone(__self_0),
                },
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for TestBinderConstraint {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        TestBinderConstraint::And { items: ref __binding_0 } => {
                            0usize
                        }
                        TestBinderConstraint::Or { items: ref __binding_0 } => {
                            1usize
                        }
                        TestBinderConstraint::Lifetime {
                            lhs: ref __binding_0, rhs: ref __binding_1 } => {
                            2usize
                        }
                        TestBinderConstraint::PlaceholderOutlives {
                            lhs: ref __binding_0, rhs: ref __binding_1 } => {
                            3usize
                        }
                        TestBinderConstraint::AliasOutlives {
                            bound_type_constraint: ref __binding_0 } => {
                            4usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    TestBinderConstraint::And { items: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TestBinderConstraint::Or { items: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TestBinderConstraint::Lifetime {
                        lhs: ref __binding_0, rhs: ref __binding_1 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TestBinderConstraint::PlaceholderOutlives {
                        lhs: ref __binding_0, rhs: ref __binding_1 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TestBinderConstraint::AliasOutlives {
                        bound_type_constraint: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for TestBinderConstraint {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        TestBinderConstraint::And {
                            items: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    1usize => {
                        TestBinderConstraint::Or {
                            items: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    2usize => {
                        TestBinderConstraint::Lifetime {
                            lhs: ::rustc_serialize::Decodable::decode(__decoder),
                            rhs: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    3usize => {
                        TestBinderConstraint::PlaceholderOutlives {
                            lhs: ::rustc_serialize::Decodable::decode(__decoder),
                            rhs: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    4usize => {
                        TestBinderConstraint::AliasOutlives {
                            bound_type_constraint: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `TestBinderConstraint`, expected 0..5, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for TestBinderConstraint {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            TestBinderConstraint::And { items: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "And",
                    "items", &__self_0),
            TestBinderConstraint::Or { items: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Or",
                    "items", &__self_0),
            TestBinderConstraint::Lifetime { lhs: __self_0, rhs: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "Lifetime", "lhs", __self_0, "rhs", &__self_1),
            TestBinderConstraint::PlaceholderOutlives {
                lhs: __self_0, rhs: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "PlaceholderOutlives", "lhs", __self_0, "rhs", &__self_1),
            TestBinderConstraint::AliasOutlives {
                bound_type_constraint: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "AliasOutlives", "bound_type_constraint", &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            TestBinderConstraint where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    TestBinderConstraint::And { items: ref __binding_0 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TestBinderConstraint::Or { items: ref __binding_0 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TestBinderConstraint::Lifetime {
                        lhs: ref __binding_0, rhs: ref __binding_1 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, (LifetimeCtxt::Bound))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, (LifetimeCtxt::Bound))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TestBinderConstraint::PlaceholderOutlives {
                        lhs: ref __binding_0, rhs: ref __binding_1 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, (LifetimeCtxt::Bound))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TestBinderConstraint::AliasOutlives {
                        bound_type_constraint: ref __binding_0 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for TestBinderConstraint
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    TestBinderConstraint::And { items: ref mut __binding_0 } =>
                        {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    TestBinderConstraint::Or { items: ref mut __binding_0 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    TestBinderConstraint::Lifetime {
                        lhs: ref mut __binding_0, rhs: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, (LifetimeCtxt::Bound))
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, (LifetimeCtxt::Bound))
                        }
                    }
                    TestBinderConstraint::PlaceholderOutlives {
                        lhs: ref mut __binding_0, rhs: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, (LifetimeCtxt::Bound))
                        }
                    }
                    TestBinderConstraint::AliasOutlives {
                        bound_type_constraint: ref mut __binding_0 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
4105pub enum TestBinderConstraint {
4106    And {
4107        items: ThinVec<TestBinderConstraint>,
4108    },
4109    Or {
4110        items: ThinVec<TestBinderConstraint>,
4111    },
4112    Lifetime {
4113        #[visitable(extra = LifetimeCtxt::Bound)]
4114        lhs: Lifetime,
4115        #[visitable(extra = LifetimeCtxt::Bound)]
4116        rhs: Lifetime,
4117    },
4118    PlaceholderOutlives {
4119        lhs: Box<Ty>,
4120        #[visitable(extra = LifetimeCtxt::Bound)]
4121        rhs: Lifetime,
4122    },
4123    AliasOutlives {
4124        bound_type_constraint: TestBinderBoundTypeConstraint,
4125    },
4126}
4127
4128#[derive(#[automatically_derived]
impl ::core::clone::Clone for TestBinderBoundTypeConstraint {
    #[inline]
    fn clone(&self) -> TestBinderBoundTypeConstraint {
        TestBinderBoundTypeConstraint {
            span: ::core::clone::Clone::clone(&self.span),
            node_id: ::core::clone::Clone::clone(&self.node_id),
            params: ::core::clone::Clone::clone(&self.params),
            lhs: ::core::clone::Clone::clone(&self.lhs),
            rhs: ::core::clone::Clone::clone(&self.rhs),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for TestBinderBoundTypeConstraint {
            fn encode(&self, __encoder: &mut __E) {
                let TestBinderBoundTypeConstraint {
                        span: ref __binding_0,
                        node_id: ref __binding_1,
                        params: ref __binding_2,
                        lhs: ref __binding_3,
                        rhs: ref __binding_4 } = *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);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for TestBinderBoundTypeConstraint {
            fn decode(__decoder: &mut __D) -> Self {
                TestBinderBoundTypeConstraint {
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    node_id: ::rustc_serialize::Decodable::decode(__decoder),
                    params: ::rustc_serialize::Decodable::decode(__decoder),
                    lhs: ::rustc_serialize::Decodable::decode(__decoder),
                    rhs: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for TestBinderBoundTypeConstraint {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f,
            "TestBinderBoundTypeConstraint", "span", &self.span, "node_id",
            &self.node_id, "params", &self.params, "lhs", &self.lhs, "rhs",
            &&self.rhs)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            TestBinderBoundTypeConstraint where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    TestBinderBoundTypeConstraint {
                        span: ref __binding_0,
                        node_id: ref __binding_1,
                        params: ref __binding_2,
                        lhs: ref __binding_3,
                        rhs: ref __binding_4 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, (LifetimeCtxt::Bound))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for
            TestBinderBoundTypeConstraint where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    TestBinderBoundTypeConstraint {
                        span: ref mut __binding_0,
                        node_id: ref mut __binding_1,
                        params: ref mut __binding_2,
                        lhs: ref mut __binding_3,
                        rhs: ref mut __binding_4 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, (LifetimeCtxt::Bound))
                        }
                    }
                }
            }
        }
    };Walkable)]
4129pub struct TestBinderBoundTypeConstraint {
4130    pub span: Span,
4131    pub node_id: NodeId,
4132    pub params: ThinVec<GenericParam>,
4133    pub lhs: Box<Ty>,
4134    #[visitable(extra = LifetimeCtxt::Bound)]
4135    pub rhs: Lifetime,
4136}
4137
4138// Adding a new variant? Please update `test_item` in `tests/ui/macros/stringify.rs`.
4139#[derive(#[automatically_derived]
impl ::core::clone::Clone for ItemKind {
    #[inline]
    fn clone(&self) -> ItemKind {
        match self {
            ItemKind::ExternCrate(__self_0, __self_1) =>
                ItemKind::ExternCrate(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ItemKind::Use(__self_0) =>
                ItemKind::Use(::core::clone::Clone::clone(__self_0)),
            ItemKind::Static(__self_0) =>
                ItemKind::Static(::core::clone::Clone::clone(__self_0)),
            ItemKind::Const(__self_0) =>
                ItemKind::Const(::core::clone::Clone::clone(__self_0)),
            ItemKind::ConstBlock(__self_0) =>
                ItemKind::ConstBlock(::core::clone::Clone::clone(__self_0)),
            ItemKind::Fn(__self_0) =>
                ItemKind::Fn(::core::clone::Clone::clone(__self_0)),
            ItemKind::Mod(__self_0, __self_1, __self_2) =>
                ItemKind::Mod(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ItemKind::ForeignMod(__self_0) =>
                ItemKind::ForeignMod(::core::clone::Clone::clone(__self_0)),
            ItemKind::GlobalAsm(__self_0) =>
                ItemKind::GlobalAsm(::core::clone::Clone::clone(__self_0)),
            ItemKind::TyAlias(__self_0) =>
                ItemKind::TyAlias(::core::clone::Clone::clone(__self_0)),
            ItemKind::Enum(__self_0, __self_1, __self_2) =>
                ItemKind::Enum(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ItemKind::Struct(__self_0, __self_1, __self_2) =>
                ItemKind::Struct(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ItemKind::Union(__self_0, __self_1, __self_2) =>
                ItemKind::Union(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ItemKind::Trait(__self_0) =>
                ItemKind::Trait(::core::clone::Clone::clone(__self_0)),
            ItemKind::TraitAlias(__self_0) =>
                ItemKind::TraitAlias(::core::clone::Clone::clone(__self_0)),
            ItemKind::Impl(__self_0) =>
                ItemKind::Impl(::core::clone::Clone::clone(__self_0)),
            ItemKind::MacCall(__self_0) =>
                ItemKind::MacCall(::core::clone::Clone::clone(__self_0)),
            ItemKind::MacroDef(__self_0, __self_1) =>
                ItemKind::MacroDef(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ItemKind::Delegation(__self_0) =>
                ItemKind::Delegation(::core::clone::Clone::clone(__self_0)),
            ItemKind::DelegationMac(__self_0) =>
                ItemKind::DelegationMac(::core::clone::Clone::clone(__self_0)),
            ItemKind::TestBinderConstraints(__self_0) =>
                ItemKind::TestBinderConstraints(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ItemKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        ItemKind::ExternCrate(ref __binding_0, ref __binding_1) => {
                            0usize
                        }
                        ItemKind::Use(ref __binding_0) => { 1usize }
                        ItemKind::Static(ref __binding_0) => { 2usize }
                        ItemKind::Const(ref __binding_0) => { 3usize }
                        ItemKind::ConstBlock(ref __binding_0) => { 4usize }
                        ItemKind::Fn(ref __binding_0) => { 5usize }
                        ItemKind::Mod(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            6usize
                        }
                        ItemKind::ForeignMod(ref __binding_0) => { 7usize }
                        ItemKind::GlobalAsm(ref __binding_0) => { 8usize }
                        ItemKind::TyAlias(ref __binding_0) => { 9usize }
                        ItemKind::Enum(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            10usize
                        }
                        ItemKind::Struct(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            11usize
                        }
                        ItemKind::Union(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            12usize
                        }
                        ItemKind::Trait(ref __binding_0) => { 13usize }
                        ItemKind::TraitAlias(ref __binding_0) => { 14usize }
                        ItemKind::Impl(ref __binding_0) => { 15usize }
                        ItemKind::MacCall(ref __binding_0) => { 16usize }
                        ItemKind::MacroDef(ref __binding_0, ref __binding_1) => {
                            17usize
                        }
                        ItemKind::Delegation(ref __binding_0) => { 18usize }
                        ItemKind::DelegationMac(ref __binding_0) => { 19usize }
                        ItemKind::TestBinderConstraints(ref __binding_0) => {
                            20usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    ItemKind::ExternCrate(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ItemKind::Use(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ItemKind::Static(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ItemKind::Const(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ItemKind::ConstBlock(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ItemKind::Fn(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ItemKind::Mod(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);
                    }
                    ItemKind::ForeignMod(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ItemKind::GlobalAsm(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ItemKind::TyAlias(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ItemKind::Enum(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);
                    }
                    ItemKind::Struct(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);
                    }
                    ItemKind::Union(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);
                    }
                    ItemKind::Trait(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ItemKind::TraitAlias(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ItemKind::Impl(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ItemKind::MacCall(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ItemKind::MacroDef(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ItemKind::Delegation(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ItemKind::DelegationMac(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ItemKind::TestBinderConstraints(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ItemKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        ItemKind::ExternCrate(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        ItemKind::Use(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        ItemKind::Static(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => {
                        ItemKind::Const(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    4usize => {
                        ItemKind::ConstBlock(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    5usize => {
                        ItemKind::Fn(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    6usize => {
                        ItemKind::Mod(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    7usize => {
                        ItemKind::ForeignMod(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    8usize => {
                        ItemKind::GlobalAsm(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    9usize => {
                        ItemKind::TyAlias(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    10usize => {
                        ItemKind::Enum(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    11usize => {
                        ItemKind::Struct(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    12usize => {
                        ItemKind::Union(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    13usize => {
                        ItemKind::Trait(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    14usize => {
                        ItemKind::TraitAlias(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    15usize => {
                        ItemKind::Impl(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    16usize => {
                        ItemKind::MacCall(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    17usize => {
                        ItemKind::MacroDef(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    18usize => {
                        ItemKind::Delegation(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    19usize => {
                        ItemKind::DelegationMac(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    20usize => {
                        ItemKind::TestBinderConstraints(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `ItemKind`, expected 0..21, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ItemKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            ItemKind::ExternCrate(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "ExternCrate", __self_0, &__self_1),
            ItemKind::Use(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Use",
                    &__self_0),
            ItemKind::Static(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Static",
                    &__self_0),
            ItemKind::Const(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Const",
                    &__self_0),
            ItemKind::ConstBlock(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ConstBlock", &__self_0),
            ItemKind::Fn(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Fn",
                    &__self_0),
            ItemKind::Mod(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Mod",
                    __self_0, __self_1, &__self_2),
            ItemKind::ForeignMod(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ForeignMod", &__self_0),
            ItemKind::GlobalAsm(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "GlobalAsm", &__self_0),
            ItemKind::TyAlias(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "TyAlias", &__self_0),
            ItemKind::Enum(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Enum",
                    __self_0, __self_1, &__self_2),
            ItemKind::Struct(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Struct",
                    __self_0, __self_1, &__self_2),
            ItemKind::Union(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Union",
                    __self_0, __self_1, &__self_2),
            ItemKind::Trait(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Trait",
                    &__self_0),
            ItemKind::TraitAlias(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "TraitAlias", &__self_0),
            ItemKind::Impl(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Impl",
                    &__self_0),
            ItemKind::MacCall(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "MacCall", &__self_0),
            ItemKind::MacroDef(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "MacroDef", __self_0, &__self_1),
            ItemKind::Delegation(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Delegation", &__self_0),
            ItemKind::DelegationMac(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "DelegationMac", &__self_0),
            ItemKind::TestBinderConstraints(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "TestBinderConstraints", &__self_0),
        }
    }
}Debug)]
4140pub enum ItemKind {
4141    /// An `extern crate` item, with the optional *original* crate name if the crate was renamed.
4142    ///
4143    /// E.g., `extern crate foo` or `extern crate foo_bar as foo`.
4144    ExternCrate(Option<Symbol>, Ident),
4145    /// A use declaration item (`use`).
4146    ///
4147    /// E.g., `use foo;`, `use foo::bar;` or `use foo::bar as FooBar;`.
4148    Use(UseTree),
4149    /// A static item (`static`).
4150    ///
4151    /// E.g., `static FOO: i32 = 42;` or `static FOO: &'static str = "bar";`.
4152    Static(Box<StaticItem>),
4153    /// A constant item (`const`).
4154    ///
4155    /// E.g., `const FOO: i32 = 42;`.
4156    Const(Box<ConstItem>),
4157    /// A module-level const block.
4158    /// Equivalent to `const _: () = const { ... };`.
4159    ///
4160    /// E.g., `const { assert!(true) }`.
4161    ConstBlock(ConstBlockItem),
4162    /// A function declaration (`fn`).
4163    ///
4164    /// E.g., `fn foo(bar: usize) -> usize { .. }`.
4165    Fn(Box<Fn>),
4166    /// A module declaration (`mod`).
4167    ///
4168    /// E.g., `mod foo;` or `mod foo { .. }`.
4169    /// `unsafe` keyword on modules is accepted syntactically for macro DSLs, but not
4170    /// semantically by Rust.
4171    Mod(Safety, Ident, ModKind),
4172    /// An external module (`extern`).
4173    ///
4174    /// E.g., `extern {}` or `extern "C" {}`.
4175    ForeignMod(ForeignMod),
4176    /// Module-level inline assembly (from `global_asm!()`).
4177    GlobalAsm(Box<InlineAsm>),
4178    /// A type alias (`type`).
4179    ///
4180    /// E.g., `type Foo = Bar<u8>;`.
4181    TyAlias(Box<TyAlias>),
4182    /// An enum definition (`enum`).
4183    ///
4184    /// E.g., `enum Foo<A, B> { C<A>, D<B> }`.
4185    Enum(Ident, Generics, EnumDef),
4186    /// A struct definition (`struct`).
4187    ///
4188    /// E.g., `struct Foo<A> { x: A }`.
4189    Struct(Ident, Generics, VariantData),
4190    /// A union definition (`union`).
4191    ///
4192    /// E.g., `union Foo<A, B> { x: A, y: B }`.
4193    Union(Ident, Generics, VariantData),
4194    /// A trait declaration (`trait`).
4195    ///
4196    /// E.g., `trait Foo { .. }`, `trait Foo<T> { .. }` or `auto trait Foo {}`.
4197    Trait(Box<Trait>),
4198    /// Trait alias.
4199    ///
4200    /// E.g., `trait Foo = Bar + Quux;`.
4201    TraitAlias(Box<TraitAlias>),
4202    /// An implementation.
4203    ///
4204    /// E.g., `impl<A> Foo<A> { .. }` or `impl<A> Trait for Foo<A> { .. }`.
4205    Impl(Impl),
4206    /// A macro invocation.
4207    ///
4208    /// E.g., `foo!(..)`.
4209    MacCall(Box<MacCall>),
4210    /// A macro definition.
4211    MacroDef(Ident, MacroDef),
4212    /// A single delegation item (`reuse`).
4213    ///
4214    /// E.g. `reuse <Type as Trait>::name { target_expr_template }`.
4215    Delegation(Box<Delegation>),
4216    /// A list or glob delegation item (`reuse prefix::{a, b, c}`, `reuse prefix::*`).
4217    /// Treated similarly to a macro call and expanded early.
4218    DelegationMac(Box<DelegationMac>),
4219    /// A `test_binder_constraints!()`. Perma-unstable, used only for rustc tests.
4220    TestBinderConstraints(Box<TestBinderConstraints>),
4221}
4222
4223impl ItemKind {
4224    pub fn ident(&self) -> Option<Ident> {
4225        match *self {
4226            ItemKind::ExternCrate(_, ident)
4227            | ItemKind::Static(StaticItem { ident, .. })
4228            | ItemKind::Const(ConstItem { ident, .. })
4229            | ItemKind::Fn(Fn { ident, .. })
4230            | ItemKind::Mod(_, ident, _)
4231            | ItemKind::TyAlias(TyAlias { ident, .. })
4232            | ItemKind::Enum(ident, ..)
4233            | ItemKind::Struct(ident, ..)
4234            | ItemKind::Union(ident, ..)
4235            | ItemKind::Trait(Trait { ident, .. })
4236            | ItemKind::TraitAlias(TraitAlias { ident, .. })
4237            | ItemKind::MacroDef(ident, _)
4238            | ItemKind::Delegation(Delegation { ident, .. }) => Some(ident),
4239
4240            ItemKind::ConstBlock(_) => Some(ConstBlockItem::IDENT),
4241
4242            ItemKind::Use(_)
4243            | ItemKind::ForeignMod(_)
4244            | ItemKind::GlobalAsm(_)
4245            | ItemKind::Impl(_)
4246            | ItemKind::MacCall(_)
4247            | ItemKind::DelegationMac(_)
4248            | ItemKind::TestBinderConstraints(_) => None,
4249        }
4250    }
4251
4252    /// "a" or "an"
4253    pub fn article(&self) -> &'static str {
4254        use ItemKind::*;
4255        match self {
4256            Use(..)
4257            | Static(..)
4258            | Const(..)
4259            | ConstBlock(..)
4260            | Fn(..)
4261            | Mod(..)
4262            | GlobalAsm(..)
4263            | TyAlias(..)
4264            | Struct(..)
4265            | Union(..)
4266            | Trait(..)
4267            | TraitAlias(..)
4268            | MacroDef(..)
4269            | Delegation(..)
4270            | DelegationMac(..)
4271            | TestBinderConstraints(..) => "a",
4272            ExternCrate(..) | ForeignMod(..) | MacCall(..) | Enum(..) | Impl { .. } => "an",
4273        }
4274    }
4275
4276    pub fn descr(&self) -> &'static str {
4277        match self {
4278            ItemKind::ExternCrate(..) => "extern crate",
4279            ItemKind::Use(..) => "`use` import",
4280            ItemKind::Static(..) => "static item",
4281            ItemKind::Const(..) => "constant item",
4282            ItemKind::ConstBlock(..) => "const block",
4283            ItemKind::Fn(..) => "function",
4284            ItemKind::Mod(..) => "module",
4285            ItemKind::ForeignMod(..) => "extern block",
4286            ItemKind::GlobalAsm(..) => "global asm item",
4287            ItemKind::TyAlias(..) => "type alias",
4288            ItemKind::Enum(..) => "enum",
4289            ItemKind::Struct(..) => "struct",
4290            ItemKind::Union(..) => "union",
4291            ItemKind::Trait(..) => "trait",
4292            ItemKind::TraitAlias(..) => "trait alias",
4293            ItemKind::MacCall(..) => "item macro invocation",
4294            ItemKind::MacroDef(..) => "macro definition",
4295            ItemKind::Impl { .. } => "implementation",
4296            ItemKind::Delegation(..) => "delegated function",
4297            ItemKind::DelegationMac(..) => "delegation",
4298            ItemKind::TestBinderConstraints(..) => "test_binder_constraints!",
4299        }
4300    }
4301
4302    pub fn generics(&self) -> Option<&Generics> {
4303        match self {
4304            Self::Fn(Fn { generics, .. })
4305            | Self::TyAlias(TyAlias { generics, .. })
4306            | Self::Const(ConstItem { generics, .. })
4307            | Self::Enum(_, generics, _)
4308            | Self::Struct(_, generics, _)
4309            | Self::Union(_, generics, _)
4310            | Self::Trait(Trait { generics, .. })
4311            | Self::TraitAlias(TraitAlias { generics, .. })
4312            | Self::Impl(Impl { generics, .. })
4313            | Self::TestBinderConstraints(TestBinderConstraints { generics, .. }) => Some(generics),
4314
4315            Self::ExternCrate(..)
4316            | Self::Use(..)
4317            | Self::Static(..)
4318            | Self::ConstBlock(..)
4319            | Self::Mod(..)
4320            | Self::ForeignMod(..)
4321            | Self::GlobalAsm(..)
4322            | Self::MacCall(..)
4323            | Self::MacroDef(..)
4324            | Self::Delegation(..)
4325            | Self::DelegationMac(..) => None,
4326        }
4327    }
4328}
4329
4330/// Represents associated items.
4331/// These include items in `impl` and `trait` definitions.
4332pub type AssocItem = Item<AssocItemKind>;
4333
4334/// Represents associated item kinds.
4335///
4336/// The term "provided" in the variants below refers to the item having a default
4337/// definition / body. Meanwhile, a "required" item lacks a definition / body.
4338/// In an implementation, all items must be provided.
4339/// The `Option`s below denote the bodies, where `Some(_)`
4340/// means "provided" and conversely `None` means "required".
4341#[derive(#[automatically_derived]
impl ::core::clone::Clone for AssocItemKind {
    #[inline]
    fn clone(&self) -> AssocItemKind {
        match self {
            AssocItemKind::Const(__self_0) =>
                AssocItemKind::Const(::core::clone::Clone::clone(__self_0)),
            AssocItemKind::Fn(__self_0) =>
                AssocItemKind::Fn(::core::clone::Clone::clone(__self_0)),
            AssocItemKind::Type(__self_0) =>
                AssocItemKind::Type(::core::clone::Clone::clone(__self_0)),
            AssocItemKind::MacCall(__self_0) =>
                AssocItemKind::MacCall(::core::clone::Clone::clone(__self_0)),
            AssocItemKind::Delegation(__self_0) =>
                AssocItemKind::Delegation(::core::clone::Clone::clone(__self_0)),
            AssocItemKind::DelegationMac(__self_0) =>
                AssocItemKind::DelegationMac(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for AssocItemKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        AssocItemKind::Const(ref __binding_0) => { 0usize }
                        AssocItemKind::Fn(ref __binding_0) => { 1usize }
                        AssocItemKind::Type(ref __binding_0) => { 2usize }
                        AssocItemKind::MacCall(ref __binding_0) => { 3usize }
                        AssocItemKind::Delegation(ref __binding_0) => { 4usize }
                        AssocItemKind::DelegationMac(ref __binding_0) => { 5usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    AssocItemKind::Const(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AssocItemKind::Fn(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AssocItemKind::Type(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AssocItemKind::MacCall(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AssocItemKind::Delegation(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AssocItemKind::DelegationMac(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for AssocItemKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        AssocItemKind::Const(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        AssocItemKind::Fn(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        AssocItemKind::Type(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => {
                        AssocItemKind::MacCall(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    4usize => {
                        AssocItemKind::Delegation(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    5usize => {
                        AssocItemKind::DelegationMac(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `AssocItemKind`, expected 0..6, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for AssocItemKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            AssocItemKind::Const(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Const",
                    &__self_0),
            AssocItemKind::Fn(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Fn",
                    &__self_0),
            AssocItemKind::Type(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Type",
                    &__self_0),
            AssocItemKind::MacCall(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "MacCall", &__self_0),
            AssocItemKind::Delegation(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Delegation", &__self_0),
            AssocItemKind::DelegationMac(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "DelegationMac", &__self_0),
        }
    }
}Debug)]
4342pub enum AssocItemKind {
4343    /// An associated constant, `const $ident: $ty $def?;` where `def ::= "=" $expr? ;`.
4344    /// If `def` is parsed, then the constant is provided, and otherwise required.
4345    Const(Box<ConstItem>),
4346    /// An associated function.
4347    Fn(Box<Fn>),
4348    /// An associated type.
4349    Type(Box<TyAlias>),
4350    /// A macro expanding to associated items.
4351    MacCall(Box<MacCall>),
4352    /// An associated delegation item.
4353    Delegation(Box<Delegation>),
4354    /// An associated list or glob delegation item.
4355    DelegationMac(Box<DelegationMac>),
4356}
4357
4358impl AssocItemKind {
4359    pub fn ident(&self) -> Option<Ident> {
4360        match *self {
4361            AssocItemKind::Const(ConstItem { ident, .. })
4362            | AssocItemKind::Fn(Fn { ident, .. })
4363            | AssocItemKind::Type(TyAlias { ident, .. })
4364            | AssocItemKind::Delegation(Delegation { ident, .. }) => Some(ident),
4365
4366            AssocItemKind::MacCall(_) | AssocItemKind::DelegationMac(_) => None,
4367        }
4368    }
4369
4370    pub fn defaultness(&self) -> Defaultness {
4371        match *self {
4372            Self::Const(ConstItem { defaultness, .. })
4373            | Self::Fn(Fn { defaultness, .. })
4374            | Self::Type(TyAlias { defaultness, .. }) => defaultness,
4375            Self::MacCall(..) | Self::Delegation(..) | Self::DelegationMac(..) => {
4376                Defaultness::Implicit
4377            }
4378        }
4379    }
4380}
4381
4382impl From<AssocItemKind> for ItemKind {
4383    fn from(assoc_item_kind: AssocItemKind) -> ItemKind {
4384        match assoc_item_kind {
4385            AssocItemKind::Const(item) => ItemKind::Const(item),
4386            AssocItemKind::Fn(fn_kind) => ItemKind::Fn(fn_kind),
4387            AssocItemKind::Type(ty_alias_kind) => ItemKind::TyAlias(ty_alias_kind),
4388            AssocItemKind::MacCall(a) => ItemKind::MacCall(a),
4389            AssocItemKind::Delegation(delegation) => ItemKind::Delegation(delegation),
4390            AssocItemKind::DelegationMac(delegation) => ItemKind::DelegationMac(delegation),
4391        }
4392    }
4393}
4394
4395impl TryFrom<ItemKind> for AssocItemKind {
4396    type Error = ItemKind;
4397
4398    fn try_from(item_kind: ItemKind) -> Result<AssocItemKind, ItemKind> {
4399        Ok(match item_kind {
4400            ItemKind::Const(item) => AssocItemKind::Const(item),
4401            ItemKind::Fn(fn_kind) => AssocItemKind::Fn(fn_kind),
4402            ItemKind::TyAlias(ty_kind) => AssocItemKind::Type(ty_kind),
4403            ItemKind::MacCall(a) => AssocItemKind::MacCall(a),
4404            ItemKind::Delegation(d) => AssocItemKind::Delegation(d),
4405            ItemKind::DelegationMac(d) => AssocItemKind::DelegationMac(d),
4406            _ => return Err(item_kind),
4407        })
4408    }
4409}
4410
4411/// An item in `extern` block.
4412#[derive(#[automatically_derived]
impl ::core::clone::Clone for ForeignItemKind {
    #[inline]
    fn clone(&self) -> ForeignItemKind {
        match self {
            ForeignItemKind::Static(__self_0) =>
                ForeignItemKind::Static(::core::clone::Clone::clone(__self_0)),
            ForeignItemKind::Fn(__self_0) =>
                ForeignItemKind::Fn(::core::clone::Clone::clone(__self_0)),
            ForeignItemKind::TyAlias(__self_0) =>
                ForeignItemKind::TyAlias(::core::clone::Clone::clone(__self_0)),
            ForeignItemKind::MacCall(__self_0) =>
                ForeignItemKind::MacCall(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ForeignItemKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        ForeignItemKind::Static(ref __binding_0) => { 0usize }
                        ForeignItemKind::Fn(ref __binding_0) => { 1usize }
                        ForeignItemKind::TyAlias(ref __binding_0) => { 2usize }
                        ForeignItemKind::MacCall(ref __binding_0) => { 3usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    ForeignItemKind::Static(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ForeignItemKind::Fn(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ForeignItemKind::TyAlias(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ForeignItemKind::MacCall(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ForeignItemKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        ForeignItemKind::Static(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        ForeignItemKind::Fn(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        ForeignItemKind::TyAlias(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => {
                        ForeignItemKind::MacCall(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `ForeignItemKind`, expected 0..4, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ForeignItemKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            ForeignItemKind::Static(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Static",
                    &__self_0),
            ForeignItemKind::Fn(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Fn",
                    &__self_0),
            ForeignItemKind::TyAlias(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "TyAlias", &__self_0),
            ForeignItemKind::MacCall(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "MacCall", &__self_0),
        }
    }
}Debug)]
4413pub enum ForeignItemKind {
4414    /// A foreign static item (`static FOO: u8`).
4415    Static(Box<StaticItem>),
4416    /// A foreign function.
4417    Fn(Box<Fn>),
4418    /// A foreign type.
4419    TyAlias(Box<TyAlias>),
4420    /// A macro expanding to foreign items.
4421    MacCall(Box<MacCall>),
4422}
4423
4424impl ForeignItemKind {
4425    pub fn ident(&self) -> Option<Ident> {
4426        match *self {
4427            ForeignItemKind::Static(StaticItem { ident, .. })
4428            | ForeignItemKind::Fn(Fn { ident, .. })
4429            | ForeignItemKind::TyAlias(TyAlias { ident, .. }) => Some(ident),
4430
4431            ForeignItemKind::MacCall(_) => None,
4432        }
4433    }
4434}
4435
4436impl From<ForeignItemKind> for ItemKind {
4437    fn from(foreign_item_kind: ForeignItemKind) -> ItemKind {
4438        match foreign_item_kind {
4439            ForeignItemKind::Static(static_foreign_item) => ItemKind::Static(static_foreign_item),
4440            ForeignItemKind::Fn(fn_kind) => ItemKind::Fn(fn_kind),
4441            ForeignItemKind::TyAlias(ty_alias_kind) => ItemKind::TyAlias(ty_alias_kind),
4442            ForeignItemKind::MacCall(a) => ItemKind::MacCall(a),
4443        }
4444    }
4445}
4446
4447impl TryFrom<ItemKind> for ForeignItemKind {
4448    type Error = ItemKind;
4449
4450    fn try_from(item_kind: ItemKind) -> Result<ForeignItemKind, ItemKind> {
4451        Ok(match item_kind {
4452            ItemKind::Static(static_item) => ForeignItemKind::Static(static_item),
4453            ItemKind::Fn(fn_kind) => ForeignItemKind::Fn(fn_kind),
4454            ItemKind::TyAlias(ty_alias_kind) => ForeignItemKind::TyAlias(ty_alias_kind),
4455            ItemKind::MacCall(a) => ForeignItemKind::MacCall(a),
4456            _ => return Err(item_kind),
4457        })
4458    }
4459}
4460
4461pub type ForeignItem = Item<ForeignItemKind>;
4462// Some nodes are used a lot. Make sure they don't unintentionally get bigger.
4463#[cfg(target_pointer_width = "64")]
4464mod size_asserts {
4465    use rustc_data_structures::static_assert_size;
4466
4467    use super::*;
4468    // tidy-alphabetical-start
4469    const _: [(); 72] = [(); ::std::mem::size_of::<AssocItem>()];static_assert_size!(AssocItem, 72);
4470    const _: [(); 16] = [(); ::std::mem::size_of::<AssocItemKind>()];static_assert_size!(AssocItemKind, 16);
4471    const _: [(); 16] = [(); ::std::mem::size_of::<AttrKind>()];static_assert_size!(AttrKind, 16);
4472    const _: [(); 32] = [(); ::std::mem::size_of::<Attribute>()];static_assert_size!(Attribute, 32);
4473    const _: [(); 24] = [(); ::std::mem::size_of::<Block>()];static_assert_size!(Block, 24);
4474    const _: [(); 64] = [(); ::std::mem::size_of::<Expr>()];static_assert_size!(Expr, 64);
4475    const _: [(); 32] = [(); ::std::mem::size_of::<ExprKind>()];static_assert_size!(ExprKind, 32);
4476    const _: [(); 80] = [(); ::std::mem::size_of::<FieldDef>()];static_assert_size!(FieldDef, 80);
4477    const _: [(); 192] = [(); ::std::mem::size_of::<Fn>()];static_assert_size!(Fn, 192);
4478    const _: [(); 24] = [(); ::std::mem::size_of::<FnDecl>()];static_assert_size!(FnDecl, 24);
4479    const _: [(); 76] = [(); ::std::mem::size_of::<FnHeader>()];static_assert_size!(FnHeader, 76);
4480    const _: [(); 96] = [(); ::std::mem::size_of::<FnSig>()];static_assert_size!(FnSig, 96);
4481    const _: [(); 72] = [(); ::std::mem::size_of::<ForeignItem>()];static_assert_size!(ForeignItem, 72);
4482    const _: [(); 16] = [(); ::std::mem::size_of::<ForeignItemKind>()];static_assert_size!(ForeignItemKind, 16);
4483    const _: [(); 24] = [(); ::std::mem::size_of::<GenericArg>()];static_assert_size!(GenericArg, 24);
4484    const _: [(); 40] = [(); ::std::mem::size_of::<GenericArgs>()];static_assert_size!(GenericArgs, 40);
4485    const _: [(); 80] = [(); ::std::mem::size_of::<GenericBound>()];static_assert_size!(GenericBound, 80);
4486    const _: [(); 80] = [(); ::std::mem::size_of::<GenericParam>()];static_assert_size!(GenericParam, 80);
4487    const _: [(); 40] = [(); ::std::mem::size_of::<Generics>()];static_assert_size!(Generics, 40);
4488    const _: [(); 80] = [(); ::std::mem::size_of::<Impl>()];static_assert_size!(Impl, 80);
4489    const _: [(); 144] = [(); ::std::mem::size_of::<Item>()];static_assert_size!(Item, 144);
4490    const _: [(); 88] = [(); ::std::mem::size_of::<ItemKind>()];static_assert_size!(ItemKind, 88);
4491    const _: [(); 16] = [(); ::std::mem::size_of::<Lifetime>()];static_assert_size!(Lifetime, 16);
4492    const _: [(); 24] = [(); ::std::mem::size_of::<LitKind>()];static_assert_size!(LitKind, 24);
4493    const _: [(); 96] = [(); ::std::mem::size_of::<Local>()];static_assert_size!(Local, 96);
4494    const _: [(); 80] = [(); ::std::mem::size_of::<MetaItem>()];static_assert_size!(MetaItem, 80);
4495    const _: [(); 40] = [(); ::std::mem::size_of::<MetaItemKind>()];static_assert_size!(MetaItemKind, 40);
4496    const _: [(); 40] = [(); ::std::mem::size_of::<MetaItemLit>()];static_assert_size!(MetaItemLit, 40);
4497    const _: [(); 80] = [(); ::std::mem::size_of::<NormalAttr>()];static_assert_size!(NormalAttr, 80);
4498    const _: [(); 40] = [(); ::std::mem::size_of::<Param>()];static_assert_size!(Param, 40);
4499    const _: [(); 64] = [(); ::std::mem::size_of::<Pat>()];static_assert_size!(Pat, 64);
4500    const _: [(); 48] = [(); ::std::mem::size_of::<PatKind>()];static_assert_size!(PatKind, 48);
4501    const _: [(); 16] = [(); ::std::mem::size_of::<Path>()];static_assert_size!(Path, 16);
4502    const _: [(); 24] = [(); ::std::mem::size_of::<PathSegment>()];static_assert_size!(PathSegment, 24);
4503    const _: [(); 24] = [(); ::std::mem::size_of::<QSelf>()];static_assert_size!(QSelf, 24);
4504    const _: [(); 32] = [(); ::std::mem::size_of::<Stmt>()];static_assert_size!(Stmt, 32);
4505    const _: [(); 16] = [(); ::std::mem::size_of::<StmtKind>()];static_assert_size!(StmtKind, 16);
4506    const _: [(); 64] = [(); ::std::mem::size_of::<TraitImplHeader>()];static_assert_size!(TraitImplHeader, 64);
4507    const _: [(); 56] = [(); ::std::mem::size_of::<Ty>()];static_assert_size!(Ty, 56);
4508    const _: [(); 40] = [(); ::std::mem::size_of::<TyKind>()];static_assert_size!(TyKind, 40);
4509    // tidy-alphabetical-end
4510}