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) -> Self {
        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: &Self) -> 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) -> Self {
        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: &Self) -> 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) -> Self {
        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            if segment.args.is_some() {
128                // This should never happen, because Path::stable_hash is only used for attributes,
129                // which never have generic args. Check that to make sure, though.
130                {
    ::core::panicking::panic_fmt(format_args!("Paths with generic args should not appear in incremental state"));
};panic!("Paths with generic args should not appear in incremental state");
131            }
132        }
133    }
134}
135
136impl Path {
137    /// Convert a span and an identifier to the corresponding
138    /// one-segment path.
139    pub fn from_ident(ident: Ident) -> Path {
140        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 }
141    }
142
143    pub fn is_global(&self) -> bool {
144        self.segments.first().is_some_and(|segment| segment.ident.name == kw::PathRoot)
145    }
146
147    /// Checks if this path is just a simple one-word `PATH` - i.e. the inverse of
148    /// [`Path::from_ident`]
149    pub fn is_single_argless_ident(&self) -> bool {
150        self.segments.len() == 1 && self.segments[0].args.is_none()
151    }
152
153    /// The inverse of [`Path::from_ident`] - if this path is just a simple one-word `PATH`
154    pub fn as_single_argless_ident(&self) -> Option<Ident> {
155        self.is_single_argless_ident().then(|| self.segments[0].ident)
156    }
157}
158
159/// Joins multiple symbols with "::" into a path, e.g. "a::b::c". If the first
160/// segment is `kw::PathRoot` it will be printed as empty, e.g. "::b::c".
161///
162/// The generics on the `path` argument mean it can accept many forms, such as:
163/// - `&[Symbol]`
164/// - `Vec<Symbol>`
165/// - `Vec<&Symbol>`
166/// - `impl Iterator<Item = Symbol>`
167/// - `impl Iterator<Item = &Symbol>`
168///
169/// Panics if `path` is empty or a segment after the first is `kw::PathRoot`.
170pub fn join_path_syms(path: impl IntoIterator<Item = impl Borrow<Symbol>>) -> String {
171    // This is a guess at the needed capacity that works well in practice. It is slightly faster
172    // than (a) starting with an empty string, or (b) computing the exact capacity required.
173    // `8` works well because it's about the right size and jemalloc's size classes are all
174    // multiples of 8.
175    let mut iter = path.into_iter();
176    let len_hint = iter.size_hint().1.unwrap_or(1);
177    let mut s = String::with_capacity(len_hint * 8);
178
179    let first_sym = *iter.next().unwrap().borrow();
180    if first_sym != kw::PathRoot {
181        s.push_str(first_sym.as_str());
182    }
183    for sym in iter {
184        let sym = *sym.borrow();
185        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);
186        s.push_str("::");
187        s.push_str(sym.as_str());
188    }
189    s
190}
191
192/// Like `join_path_syms`, but for `Ident`s. This function is necessary because
193/// `Ident::to_string` does more than just print the symbol in the `name` field.
194pub fn join_path_idents(path: impl IntoIterator<Item = impl Borrow<Ident>>) -> String {
195    let mut iter = path.into_iter();
196    let len_hint = iter.size_hint().1.unwrap_or(1);
197    let mut s = String::with_capacity(len_hint * 8);
198
199    let first_ident = *iter.next().unwrap().borrow();
200    if first_ident.name != kw::PathRoot {
201        s.push_str(&first_ident.to_string());
202    }
203    for ident in iter {
204        let ident = *ident.borrow();
205        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);
206        s.push_str("::");
207        s.push_str(&ident.to_string());
208    }
209    s
210}
211
212/// A segment of a path: an identifier, an optional lifetime, and a set of types.
213///
214/// E.g., `std`, `String` or `Box<T>`.
215#[derive(#[automatically_derived]
impl ::core::clone::Clone for PathSegment {
    #[inline]
    fn clone(&self) -> Self {
        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)]
216pub struct PathSegment {
217    /// The identifier portion of this path segment.
218    pub ident: Ident,
219
220    pub id: NodeId,
221
222    /// Type/lifetime parameters attached to this path. They come in
223    /// two flavors: `Path<A,B,C>` and `Path(A,B) -> C`.
224    /// `None` means that no parameter list is supplied (`Path`),
225    /// `Some` means that parameter list is supplied (`Path<X, Y>`)
226    /// but it can be empty (`Path<>`).
227    /// `Box` is used as a size optimization for the common case with no parameters.
228    pub args: Option<Box<GenericArgs>>,
229}
230
231// Succeeds if the path segment is arg-free and matches the given symbol.
232impl PartialEq<Symbol> for PathSegment {
233    #[inline]
234    fn eq(&self, name: &Symbol) -> bool {
235        self.args.is_none() && self.ident.name == *name
236    }
237}
238
239impl PathSegment {
240    pub fn from_ident(ident: Ident) -> Self {
241        PathSegment { ident, id: DUMMY_NODE_ID, args: None }
242    }
243
244    pub fn path_root(span: Span) -> Self {
245        PathSegment::from_ident(Ident::new(kw::PathRoot, span))
246    }
247
248    pub fn span(&self) -> Span {
249        match &self.args {
250            Some(args) => self.ident.span.to(args.span()),
251            None => self.ident.span,
252        }
253    }
254}
255
256/// The generic arguments and associated item constraints of a path segment.
257///
258/// E.g., `<A, B>` as in `Foo<A, B>` or `(A, B)` as in `Foo(A, B)`.
259#[derive(#[automatically_derived]
impl ::core::clone::Clone for GenericArgs {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::AngleBracketed(__self_0) =>
                GenericArgs::AngleBracketed(::core::clone::Clone::clone(__self_0)),
            Self::Parenthesized(__self_0) =>
                GenericArgs::Parenthesized(::core::clone::Clone::clone(__self_0)),
            Self::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 {
            Self::AngleBracketed(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "AngleBracketed", &__self_0),
            Self::Parenthesized(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Parenthesized", &__self_0),
            Self::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)]
260pub enum GenericArgs {
261    /// The `<'a, A, B, C>` in `foo::bar::baz::<'a, A, B, C>`.
262    AngleBracketed(AngleBracketedArgs),
263    /// The `(A, B)` and `C` in `Foo(A, B) -> C`, used for the `Fn` trait among others.
264    Parenthesized(ParenthesizedArgs),
265    /// `(..)` in return type notation.
266    ParenthesizedElided(Span),
267}
268
269impl GenericArgs {
270    pub fn is_angle_bracketed(&self) -> bool {
271        #[allow(non_exhaustive_omitted_patterns)] match self {
    AngleBracketed(..) => true,
    _ => false,
}matches!(self, AngleBracketed(..))
272    }
273
274    pub fn span(&self) -> Span {
275        match self {
276            AngleBracketed(data) => data.span,
277            Parenthesized(data) => data.span,
278            ParenthesizedElided(span) => *span,
279        }
280    }
281}
282
283/// Concrete argument in the sequence of generic args.
284#[derive(#[automatically_derived]
impl ::core::clone::Clone for GenericArg {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Lifetime(__self_0) =>
                GenericArg::Lifetime(::core::clone::Clone::clone(__self_0)),
            Self::Type(__self_0) =>
                GenericArg::Type(::core::clone::Clone::clone(__self_0)),
            Self::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 {
            Self::Lifetime(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Lifetime", &__self_0),
            Self::Type(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Type",
                    &__self_0),
            Self::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)]
285pub enum GenericArg {
286    /// `'a` in `Foo<'a>`.
287    Lifetime(#[visitable(extra = LifetimeCtxt::GenericArg)] Lifetime),
288    /// `Bar` in `Foo<Bar>`.
289    Type(Box<Ty>),
290    /// `1` in `Foo<1>`.
291    Const(AnonConst),
292}
293
294impl GenericArg {
295    pub fn span(&self) -> Span {
296        match self {
297            GenericArg::Lifetime(lt) => lt.ident.span,
298            GenericArg::Type(ty) => ty.span,
299            GenericArg::Const(ct) => ct.value.span,
300        }
301    }
302
303    pub fn is_maybe_parenthesised_infer(&self) -> bool {
304        match self {
305            GenericArg::Lifetime(lt) => lt.ident.name == kw::UnderscoreLifetime,
306            GenericArg::Type(ty) => ty.is_maybe_parenthesised_infer(),
307            GenericArg::Const(_) => false,
308        }
309    }
310}
311
312/// A path like `Foo<'a, T>`.
313#[derive(#[automatically_derived]
impl ::core::clone::Clone for AngleBracketedArgs {
    #[inline]
    fn clone(&self) -> Self {
        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() -> Self {
        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)]
314pub struct AngleBracketedArgs {
315    /// The overall span.
316    pub span: Span,
317    /// The comma separated parts in the `<...>`.
318    pub args: ThinVec<AngleBracketedArg>,
319}
320
321/// Either an argument for a generic parameter or a constraint on an associated item.
322#[derive(#[automatically_derived]
impl ::core::clone::Clone for AngleBracketedArg {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Arg(__self_0) =>
                AngleBracketedArg::Arg(::core::clone::Clone::clone(__self_0)),
            Self::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 {
            Self::Arg(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Arg",
                    &__self_0),
            Self::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)]
323pub enum AngleBracketedArg {
324    /// A generic argument for a generic parameter.
325    Arg(GenericArg),
326    /// A constraint on an associated item.
327    Constraint(AssocItemConstraint),
328}
329
330impl AngleBracketedArg {
331    pub fn span(&self) -> Span {
332        match self {
333            AngleBracketedArg::Arg(arg) => arg.span(),
334            AngleBracketedArg::Constraint(constraint) => constraint.span,
335        }
336    }
337}
338
339impl From<AngleBracketedArgs> for Box<GenericArgs> {
340    fn from(val: AngleBracketedArgs) -> Self {
341        Box::new(GenericArgs::AngleBracketed(val))
342    }
343}
344
345impl From<ParenthesizedArgs> for Box<GenericArgs> {
346    fn from(val: ParenthesizedArgs) -> Self {
347        Box::new(GenericArgs::Parenthesized(val))
348    }
349}
350
351/// A path like `Foo(A, B) -> C`.
352#[derive(#[automatically_derived]
impl ::core::clone::Clone for ParenthesizedArgs {
    #[inline]
    fn clone(&self) -> Self {
        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)]
353pub struct ParenthesizedArgs {
354    /// ```text
355    /// Foo(A, B) -> C
356    /// ^^^^^^^^^^^^^^
357    /// ```
358    pub span: Span,
359
360    /// `(A, B)`
361    pub inputs: ThinVec<Param>,
362
363    /// ```text
364    /// Foo(A, B) -> C
365    ///    ^^^^^^
366    /// ```
367    pub inputs_span: Span,
368
369    /// `C`
370    pub output: FnRetTy,
371}
372
373impl ParenthesizedArgs {
374    pub fn as_angle_bracketed_args(&self) -> AngleBracketedArgs {
375        let args = self
376            .inputs
377            .iter()
378            .cloned()
379            .map(|input| AngleBracketedArg::Arg(GenericArg::Type(input.ty)))
380            .collect();
381        AngleBracketedArgs { span: self.inputs_span, args }
382    }
383}
384
385pub use crate::node_id::{CRATE_NODE_ID, DUMMY_NODE_ID, NodeId};
386
387/// Modifiers on a trait bound like `[const]`, `?` and `!`.
388#[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) -> Self {
        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: &Self) -> 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)]
389pub struct TraitBoundModifiers {
390    pub constness: BoundConstness,
391    pub asyncness: BoundAsyncness,
392    pub polarity: BoundPolarity,
393}
394
395impl TraitBoundModifiers {
396    pub const NONE: Self = Self {
397        constness: BoundConstness::Never,
398        asyncness: BoundAsyncness::Normal,
399        polarity: BoundPolarity::Positive,
400    };
401}
402
403#[derive(#[automatically_derived]
impl ::core::clone::Clone for GenericBound {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Trait(__self_0) =>
                GenericBound::Trait(::core::clone::Clone::clone(__self_0)),
            Self::Outlives(__self_0) =>
                GenericBound::Outlives(::core::clone::Clone::clone(__self_0)),
            Self::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 {
            Self::Trait(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Trait",
                    &__self_0),
            Self::Outlives(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Outlives", &__self_0),
            Self::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)]
404pub enum GenericBound {
405    Trait(PolyTraitRef),
406    Outlives(#[visitable(extra = LifetimeCtxt::Bound)] Lifetime),
407    /// Precise capturing syntax: `impl Sized + use<'a>`
408    Use(ThinVec<PreciseCapturingArg>, Span),
409}
410
411impl GenericBound {
412    pub fn span(&self) -> Span {
413        match self {
414            GenericBound::Trait(t, ..) => t.span,
415            GenericBound::Outlives(l) => l.ident.span,
416            GenericBound::Use(_, span) => *span,
417        }
418    }
419}
420
421pub type GenericBounds = ThinVec<GenericBound>;
422
423/// Specifies the enforced ordering for generic parameters. In the future,
424/// if we wanted to relax this order, we could override `PartialEq` and
425/// `PartialOrd`, to allow the kinds to be unordered.
426#[derive(#[automatically_derived]
impl ::core::hash::Hash for ParamKindOrd {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
            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) -> Self { *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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ParamKindOrd { }Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for ParamKindOrd {
    #[inline]
    fn partial_cmp(&self, other: &Self)
        -> ::core::option::Option<::core::cmp::Ordering> {
        ::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
    }
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for ParamKindOrd {
    #[inline]
    fn cmp(&self, other: &Self) -> ::core::cmp::Ordering {
        ::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
            &::core::intrinsics::discriminant_value(other))
    }
}Ord)]
427pub enum ParamKindOrd {
428    Lifetime,
429    TypeOrConst,
430}
431
432impl fmt::Display for ParamKindOrd {
433    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
434        match self {
435            ParamKindOrd::Lifetime => "lifetime".fmt(f),
436            ParamKindOrd::TypeOrConst => "type and const".fmt(f),
437        }
438    }
439}
440
441#[derive(#[automatically_derived]
impl ::core::clone::Clone for GenericParamKind {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Lifetime => GenericParamKind::Lifetime,
            Self::Type { default: __self_0 } =>
                GenericParamKind::Type {
                    default: ::core::clone::Clone::clone(__self_0),
                },
            Self::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 {
            Self::Lifetime =>
                ::core::fmt::Formatter::write_str(f, "Lifetime"),
            Self::Type { default: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Type",
                    "default", &__self_0),
            Self::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)]
442pub enum GenericParamKind {
443    /// A lifetime definition (e.g., `'a: 'b + 'c + 'd`).
444    Lifetime,
445    Type {
446        default: Option<Box<Ty>>,
447    },
448    Const {
449        ty: Box<Ty>,
450        /// Span of the whole parameter definition, including default.
451        span: Span,
452        /// Optional default value for the const generic param.
453        default: Option<AnonConst>,
454    },
455}
456
457#[derive(#[automatically_derived]
impl ::core::clone::Clone for GenericParam {
    #[inline]
    fn clone(&self) -> Self {
        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)]
458pub struct GenericParam {
459    pub id: NodeId,
460    pub ident: Ident,
461    pub attrs: AttrVec,
462    #[visitable(extra = BoundKind::Bound)]
463    pub bounds: GenericBounds,
464    pub is_placeholder: bool,
465    pub kind: GenericParamKind,
466    pub colon_span: Option<Span>,
467}
468
469impl GenericParam {
470    pub fn span(&self) -> Span {
471        match &self.kind {
472            GenericParamKind::Lifetime | GenericParamKind::Type { default: None } => {
473                self.ident.span
474            }
475            GenericParamKind::Type { default: Some(ty) } => self.ident.span.to(ty.span),
476            GenericParamKind::Const { span, .. } => *span,
477        }
478    }
479}
480
481/// Represents lifetime, type and const parameters attached to a declaration of
482/// a function, enum, trait, etc.
483#[derive(#[automatically_derived]
impl ::core::clone::Clone for Generics {
    #[inline]
    fn clone(&self) -> Self {
        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() -> Self {
        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)]
484pub struct Generics {
485    pub params: ThinVec<GenericParam>,
486    pub where_clause: WhereClause,
487    pub span: Span,
488}
489
490/// A where-clause in a definition.
491#[derive(#[automatically_derived]
impl ::core::clone::Clone for WhereClause {
    #[inline]
    fn clone(&self) -> Self {
        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() -> Self {
        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)]
492pub struct WhereClause {
493    /// `true` if we ate a `where` token.
494    ///
495    /// This can happen if we parsed no predicates, e.g., `struct Foo where {}`.
496    /// This allows us to pretty-print accurately and provide correct suggestion diagnostics.
497    pub has_where_token: bool,
498    pub predicates: ThinVec<WherePredicate>,
499    pub span: Span,
500}
501
502impl WhereClause {
503    pub fn is_empty(&self) -> bool {
504        !self.has_where_token && self.predicates.is_empty()
505    }
506}
507
508/// A single predicate in a where-clause.
509#[derive(#[automatically_derived]
impl ::core::clone::Clone for WherePredicate {
    #[inline]
    fn clone(&self) -> Self {
        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)]
510pub struct WherePredicate {
511    pub attrs: AttrVec,
512    pub kind: WherePredicateKind,
513    pub id: NodeId,
514    pub span: Span,
515    pub is_placeholder: bool,
516}
517
518/// Predicate kind in where-clause.
519#[derive(#[automatically_derived]
impl ::core::clone::Clone for WherePredicateKind {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::BoundPredicate(__self_0) =>
                WherePredicateKind::BoundPredicate(::core::clone::Clone::clone(__self_0)),
            Self::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 {
            Self::BoundPredicate(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "BoundPredicate", &__self_0),
            Self::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)]
520pub enum WherePredicateKind {
521    /// A type bound (e.g., `for<'c> Foo: Send + Clone + 'c`).
522    BoundPredicate(WhereBoundPredicate),
523    /// A lifetime predicate (e.g., `'a: 'b + 'c`).
524    RegionPredicate(WhereRegionPredicate),
525}
526
527/// A type bound.
528///
529/// E.g., `for<'c> Foo: Send + Clone + 'c`.
530#[derive(#[automatically_derived]
impl ::core::clone::Clone for WhereBoundPredicate {
    #[inline]
    fn clone(&self) -> Self {
        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)]
531pub struct WhereBoundPredicate {
532    /// Any generics from a `for` binding.
533    pub bound_generic_params: ThinVec<GenericParam>,
534    /// The type being bounded.
535    pub bounded_ty: Box<Ty>,
536    /// Trait and lifetime bounds (`Clone + Send + 'static`).
537    #[visitable(extra = BoundKind::Bound)]
538    pub bounds: GenericBounds,
539}
540
541/// A lifetime predicate.
542///
543/// E.g., `'a: 'b + 'c`.
544#[derive(#[automatically_derived]
impl ::core::clone::Clone for WhereRegionPredicate {
    #[inline]
    fn clone(&self) -> Self {
        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)]
545pub struct WhereRegionPredicate {
546    #[visitable(extra = LifetimeCtxt::Bound)]
547    pub lifetime: Lifetime,
548    #[visitable(extra = BoundKind::Bound)]
549    pub bounds: GenericBounds,
550}
551
552/// An equality predicate (unsupported).
553///
554/// E.g., `T = int`.
555#[derive(#[automatically_derived]
impl ::core::clone::Clone for WhereEqPredicate {
    #[inline]
    fn clone(&self) -> Self {
        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)]
556pub struct WhereEqPredicate {
557    pub lhs_ty: Box<Ty>,
558    pub rhs_ty: Box<Ty>,
559}
560
561#[derive(#[automatically_derived]
impl ::core::clone::Clone for Crate {
    #[inline]
    fn clone(&self) -> Self {
        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)]
562pub struct Crate {
563    /// Must be equal to `CRATE_NODE_ID` after the crate root is expanded, but may hold
564    /// expansion placeholders or an unassigned value (`DUMMY_NODE_ID`) before that.
565    pub id: NodeId,
566    pub attrs: AttrVec,
567    pub items: ThinVec<Box<Item>>,
568    pub spans: ModSpans,
569    pub is_placeholder: bool,
570}
571
572/// A semantic representation of a meta item.
573///
574/// A meta item is a slightly restricted form of an attribute -- it can only contain
575/// expressions in certain leaf positions, rather than arbitrary token streams -- that is used
576/// for most built-in attributes.
577///
578/// E.g., `#[test]`, `#[derive(..)]`, `#[rustfmt::skip]` or `#[feature = "foo"]`.
579#[derive(#[automatically_derived]
impl ::core::clone::Clone for MetaItem {
    #[inline]
    fn clone(&self) -> Self {
        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)]
580pub struct MetaItem {
581    pub unsafety: Safety,
582    pub path: Path,
583    pub kind: MetaItemKind,
584    pub span: Span,
585}
586
587/// The meta item kind, containing the data after the initial path.
588#[derive(#[automatically_derived]
impl ::core::clone::Clone for MetaItemKind {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Word => MetaItemKind::Word,
            Self::List(__self_0) =>
                MetaItemKind::List(::core::clone::Clone::clone(__self_0)),
            Self::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 {
            Self::Word => ::core::fmt::Formatter::write_str(f, "Word"),
            Self::List(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "List",
                    &__self_0),
            Self::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)]
589pub enum MetaItemKind {
590    /// Word meta item.
591    ///
592    /// E.g., `#[test]`, which lacks any arguments after `test`.
593    Word,
594
595    /// List meta item.
596    ///
597    /// E.g., `#[derive(..)]`, where the field represents the `..`.
598    List(ThinVec<MetaItemInner>),
599
600    /// Name value meta item.
601    ///
602    /// E.g., `#[feature = "foo"]`, where the field represents the `"foo"`.
603    NameValue(MetaItemLit),
604}
605
606/// Values inside meta item lists.
607///
608/// E.g., each of `Clone`, `Copy` in `#[derive(Clone, Copy)]`.
609#[derive(#[automatically_derived]
impl ::core::clone::Clone for MetaItemInner {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::MetaItem(__self_0) =>
                MetaItemInner::MetaItem(::core::clone::Clone::clone(__self_0)),
            Self::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 {
            Self::MetaItem(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "MetaItem", &__self_0),
            Self::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)]
610pub enum MetaItemInner {
611    /// A full MetaItem, for recursive meta items.
612    MetaItem(MetaItem),
613
614    /// A literal.
615    ///
616    /// E.g., `"foo"`, `64`, `true`.
617    Lit(MetaItemLit),
618}
619
620/// A block (`{ .. }`).
621///
622/// E.g., `{ .. }` as in `fn foo() { .. }`.
623#[derive(#[automatically_derived]
impl ::core::clone::Clone for Block {
    #[inline]
    fn clone(&self) -> Self {
        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)]
624pub struct Block {
625    /// The statements in the block.
626    pub stmts: ThinVec<Stmt>,
627    pub id: NodeId,
628    /// Distinguishes between `unsafe { ... }` and `{ ... }`.
629    pub rules: BlockCheckMode,
630    pub span: Span,
631}
632
633/// A match pattern.
634///
635/// Patterns appear in match statements and some other contexts, such as `let` and `if let`.
636#[derive(#[automatically_derived]
impl ::core::clone::Clone for Pat {
    #[inline]
    fn clone(&self) -> Self {
        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)]
637pub struct Pat {
638    pub id: NodeId,
639    pub kind: PatKind,
640    pub span: Span,
641}
642
643impl Pat {
644    /// Attempt reparsing the pattern as a type.
645    /// This is intended for use by diagnostics.
646    pub fn to_ty(&self) -> Option<Box<Ty>> {
647        let kind = match &self.kind {
648            PatKind::Missing => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
649            // In a type expression `_` is an inference variable.
650            PatKind::Wild => TyKind::Infer,
651            // An IDENT pattern with no binding mode would be valid as path to a type. E.g. `u32`.
652            PatKind::Ident(BindingMode::NONE, ident, None) => {
653                TyKind::Path(None, Path::from_ident(*ident))
654            }
655            PatKind::Path(qself, path) => TyKind::Path(qself.clone(), path.clone()),
656            PatKind::MacCall(mac) => TyKind::MacCall(mac.clone()),
657            // `&mut? P` can be reinterpreted as `&mut? T` where `T` is `P` reparsed as a type.
658            PatKind::Ref(pat, pinned, mutbl) => pat.to_ty().map(|ty| match pinned {
659                Pinnedness::Not => TyKind::Ref(None, ty, *mutbl),
660                Pinnedness::Pinned => TyKind::PinnedRef(None, ty, *mutbl),
661            })?,
662            // A slice/array pattern `[P]` can be reparsed as `[T]`, an unsized array,
663            // when `P` can be reparsed as a type `T`.
664            PatKind::Slice(pats) if let [pat] = pats.as_slice() => {
665                pat.to_ty().map(TyKind::Slice)?
666            }
667            // A tuple pattern `(P0, .., Pn)` can be reparsed as `(T0, .., Tn)`
668            // assuming `T0` to `Tn` are all syntactically valid as types.
669            PatKind::Tuple(pats) => {
670                let tys = pats.iter().map(|pat| pat.to_ty()).collect::<Option<ThinVec<_>>>()?;
671                TyKind::Tup(tys)
672            }
673            _ => return None,
674        };
675
676        Some(Box::new(Ty { kind, id: self.id, span: self.span }))
677    }
678
679    /// Walk top-down and call `it` in each place where a pattern occurs
680    /// starting with the root pattern `walk` is called on. If `it` returns
681    /// false then we will descend no further but siblings will be processed.
682    pub fn walk<'ast>(&'ast self, it: &mut impl FnMut(&'ast Pat) -> bool) {
683        if !it(self) {
684            return;
685        }
686
687        match &self.kind {
688            // Walk into the pattern associated with `Ident` (if any).
689            PatKind::Ident(_, _, Some(p)) => p.walk(it),
690
691            // Walk into each field of struct.
692            PatKind::Struct(_, _, fields, _) => fields.iter().for_each(|field| field.pat.walk(it)),
693
694            // Sequence of patterns.
695            PatKind::TupleStruct(_, _, s)
696            | PatKind::Tuple(s)
697            | PatKind::Slice(s)
698            | PatKind::Or(s) => s.iter().for_each(|p| p.walk(it)),
699
700            // Trivial wrappers over inner patterns.
701            PatKind::Deref(s)
702            | PatKind::Ref(s, _, _)
703            | PatKind::Paren(s)
704            | PatKind::Guard(s, _) => s.walk(it),
705
706            // These patterns do not contain subpatterns, skip.
707            PatKind::Missing
708            | PatKind::Wild
709            | PatKind::Rest
710            | PatKind::Never
711            | PatKind::Expr(_)
712            | PatKind::Range(..)
713            | PatKind::Ident(..)
714            | PatKind::Path(..)
715            | PatKind::MacCall(_)
716            | PatKind::Err(_) => {}
717        }
718    }
719
720    /// Strip off all reference patterns (`&`, `&mut`) and return the inner pattern.
721    pub fn peel_refs(&self) -> &Pat {
722        let mut current = self;
723        while let PatKind::Ref(inner, _, _) = &current.kind {
724            current = inner;
725        }
726        current
727    }
728
729    /// Is this a `..` pattern?
730    pub fn is_rest(&self) -> bool {
731        #[allow(non_exhaustive_omitted_patterns)] match self.kind {
    PatKind::Rest => true,
    _ => false,
}matches!(self.kind, PatKind::Rest)
732    }
733
734    /// Whether this could be a never pattern, taking into account that a macro invocation can
735    /// return a never pattern. Used to inform errors during parsing.
736    pub fn could_be_never_pattern(&self) -> bool {
737        let mut could_be_never_pattern = false;
738        self.walk(&mut |pat| match &pat.kind {
739            PatKind::Never | PatKind::MacCall(_) => {
740                could_be_never_pattern = true;
741                false
742            }
743            PatKind::Or(s) => {
744                could_be_never_pattern = s.iter().all(|p| p.could_be_never_pattern());
745                false
746            }
747            _ => true,
748        });
749        could_be_never_pattern
750    }
751
752    /// Whether this contains a `!` pattern. This in particular means that a feature gate error will
753    /// be raised if the feature is off. Used to avoid gating the feature twice.
754    pub fn contains_never_pattern(&self) -> bool {
755        let mut contains_never_pattern = false;
756        self.walk(&mut |pat| {
757            if #[allow(non_exhaustive_omitted_patterns)] match pat.kind {
    PatKind::Never => true,
    _ => false,
}matches!(pat.kind, PatKind::Never) {
758                contains_never_pattern = true;
759            }
760            true
761        });
762        contains_never_pattern
763    }
764
765    /// Return a name suitable for diagnostics.
766    pub fn descr(&self) -> Option<String> {
767        match &self.kind {
768            PatKind::Missing => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
769            PatKind::Wild => Some("_".to_string()),
770            PatKind::Ident(BindingMode::NONE, ident, None) => Some(::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("{0}", ident))
    })format!("{ident}")),
771            PatKind::Ref(pat, pinned, mutbl) => {
772                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)))
773            }
774            _ => None,
775        }
776    }
777}
778
779impl From<Box<Pat>> for Pat {
780    fn from(value: Box<Pat>) -> Self {
781        *value
782    }
783}
784
785/// A single field in a struct pattern.
786///
787/// Patterns like the fields of `Foo { x, ref y, ref mut z }`
788/// are treated the same as `x: x, y: ref y, z: ref mut z`,
789/// except when `is_shorthand` is true.
790#[derive(#[automatically_derived]
impl ::core::clone::Clone for PatField {
    #[inline]
    fn clone(&self) -> Self {
        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)]
791pub struct PatField {
792    /// The identifier for the field.
793    pub ident: Ident,
794    /// The pattern the field is destructured to.
795    pub pat: Box<Pat>,
796    pub is_shorthand: bool,
797    pub attrs: AttrVec,
798    pub id: NodeId,
799    pub span: Span,
800    pub is_placeholder: bool,
801}
802
803#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for ByRef { }
#[automatically_derived]
impl ::core::clone::Clone for ByRef {
    #[inline]
    fn clone(&self) -> Self {
        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 {
            Self::Yes(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Yes",
                    __self_0, &__self_1),
            Self::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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Yes(__self_0, __self_1), Self::Yes(__arg1_0, __arg1_1))
                    => __self_0 == __arg1_0 && __self_1 == __arg1_1,
                _ => true,
            }
    }
}PartialEq)]
804#[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)]
805pub enum ByRef {
806    Yes(Pinnedness, Mutability),
807    No,
808}
809
810impl ByRef {
811    #[must_use]
812    pub fn cap_ref_mutability(mut self, mutbl: Mutability) -> Self {
813        if let ByRef::Yes(_, old_mutbl) = &mut self {
814            *old_mutbl = cmp::min(*old_mutbl, mutbl);
815        }
816        self
817    }
818}
819
820/// The mode of a binding (`mut`, `ref mut`, etc).
821///
822/// Used for both the explicit binding annotations given in the HIR for a binding
823/// and the final binding mode that we infer after type inference/match ergonomics.
824/// `.0` is the by-reference mode (`ref`, `ref mut`, or by value),
825/// `.1` is the mutability of the binding.
826#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for BindingMode { }
#[automatically_derived]
impl ::core::clone::Clone for BindingMode {
    #[inline]
    fn clone(&self) -> Self {
        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: &Self) -> bool {
        self.0 == other.0 && self.1 == other.1
    }
}PartialEq)]
827#[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)]
828pub struct BindingMode(pub ByRef, pub Mutability);
829
830impl BindingMode {
831    pub const NONE: Self = Self(ByRef::No, Mutability::Not);
832    pub const REF: Self = Self(ByRef::Yes(Pinnedness::Not, Mutability::Not), Mutability::Not);
833    pub const REF_PIN: Self =
834        Self(ByRef::Yes(Pinnedness::Pinned, Mutability::Not), Mutability::Not);
835    pub const MUT: Self = Self(ByRef::No, Mutability::Mut);
836    pub const REF_MUT: Self = Self(ByRef::Yes(Pinnedness::Not, Mutability::Mut), Mutability::Not);
837    pub const REF_PIN_MUT: Self =
838        Self(ByRef::Yes(Pinnedness::Pinned, Mutability::Mut), Mutability::Not);
839    pub const MUT_REF: Self = Self(ByRef::Yes(Pinnedness::Not, Mutability::Not), Mutability::Mut);
840    pub const MUT_REF_PIN: Self =
841        Self(ByRef::Yes(Pinnedness::Pinned, Mutability::Not), Mutability::Mut);
842    pub const MUT_REF_MUT: Self =
843        Self(ByRef::Yes(Pinnedness::Not, Mutability::Mut), Mutability::Mut);
844    pub const MUT_REF_PIN_MUT: Self =
845        Self(ByRef::Yes(Pinnedness::Pinned, Mutability::Mut), Mutability::Mut);
846
847    pub fn prefix_str(self) -> &'static str {
848        match self {
849            Self::NONE => "",
850            Self::REF => "ref ",
851            Self::REF_PIN => "ref pin const ",
852            Self::MUT => "mut ",
853            Self::REF_MUT => "ref mut ",
854            Self::REF_PIN_MUT => "ref pin mut ",
855            Self::MUT_REF => "mut ref ",
856            Self::MUT_REF_PIN => "mut ref pin ",
857            Self::MUT_REF_MUT => "mut ref mut ",
858            Self::MUT_REF_PIN_MUT => "mut ref pin mut ",
859        }
860    }
861}
862
863#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for RangeEnd { }
#[automatically_derived]
impl ::core::clone::Clone for RangeEnd {
    #[inline]
    fn clone(&self) -> Self {
        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 {
            Self::Included(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Included", &__self_0),
            Self::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)]
864pub enum RangeEnd {
865    /// `..=` or `...`
866    Included(RangeSyntax),
867    /// `..`
868    Excluded,
869}
870
871#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for RangeSyntax { }
#[automatically_derived]
impl ::core::clone::Clone for RangeSyntax {
    #[inline]
    fn clone(&self) -> Self { *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)]
872pub enum RangeSyntax {
873    /// `...`
874    DotDotDot,
875    /// `..=`
876    DotDotEq,
877}
878
879/// All the different flavors of pattern that Rust recognizes.
880//
881// Adding a new variant? Please update `test_pat` in `tests/ui/macros/stringify.rs`.
882#[derive(#[automatically_derived]
impl ::core::clone::Clone for PatKind {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Missing => PatKind::Missing,
            Self::Wild => PatKind::Wild,
            Self::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)),
            Self::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)),
            Self::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)),
            Self::Or(__self_0) =>
                PatKind::Or(::core::clone::Clone::clone(__self_0)),
            Self::Path(__self_0, __self_1) =>
                PatKind::Path(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::Tuple(__self_0) =>
                PatKind::Tuple(::core::clone::Clone::clone(__self_0)),
            Self::Deref(__self_0) =>
                PatKind::Deref(::core::clone::Clone::clone(__self_0)),
            Self::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)),
            Self::Expr(__self_0) =>
                PatKind::Expr(::core::clone::Clone::clone(__self_0)),
            Self::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)),
            Self::Slice(__self_0) =>
                PatKind::Slice(::core::clone::Clone::clone(__self_0)),
            Self::Rest => PatKind::Rest,
            Self::Never => PatKind::Never,
            Self::Guard(__self_0, __self_1) =>
                PatKind::Guard(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::Paren(__self_0) =>
                PatKind::Paren(::core::clone::Clone::clone(__self_0)),
            Self::MacCall(__self_0) =>
                PatKind::MacCall(::core::clone::Clone::clone(__self_0)),
            Self::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 {
            Self::Missing => ::core::fmt::Formatter::write_str(f, "Missing"),
            Self::Wild => ::core::fmt::Formatter::write_str(f, "Wild"),
            Self::Ident(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Ident",
                    __self_0, __self_1, &__self_2),
            Self::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),
            Self::TupleStruct(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f,
                    "TupleStruct", __self_0, __self_1, &__self_2),
            Self::Or(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Or",
                    &__self_0),
            Self::Path(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Path",
                    __self_0, &__self_1),
            Self::Tuple(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Tuple",
                    &__self_0),
            Self::Deref(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Deref",
                    &__self_0),
            Self::Ref(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Ref",
                    __self_0, __self_1, &__self_2),
            Self::Expr(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Expr",
                    &__self_0),
            Self::Range(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Range",
                    __self_0, __self_1, &__self_2),
            Self::Slice(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Slice",
                    &__self_0),
            Self::Rest => ::core::fmt::Formatter::write_str(f, "Rest"),
            Self::Never => ::core::fmt::Formatter::write_str(f, "Never"),
            Self::Guard(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Guard",
                    __self_0, &__self_1),
            Self::Paren(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Paren",
                    &__self_0),
            Self::MacCall(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "MacCall", &__self_0),
            Self::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)]
883pub enum PatKind {
884    /// A missing pattern, e.g. for an anonymous param in a bare fn like `fn f(u32)`.
885    Missing,
886
887    /// Represents a wildcard pattern (`_`).
888    Wild,
889
890    /// A `PatKind::Ident` may either be a new bound variable (`ref mut binding @ OPT_SUBPATTERN`),
891    /// or a unit struct/variant pattern, or a const pattern (in the last two cases the third
892    /// field must be `None`). Disambiguation cannot be done with parser alone, so it happens
893    /// during name resolution.
894    Ident(BindingMode, Ident, Option<Box<Pat>>),
895
896    /// A struct or struct variant pattern (e.g., `Variant {x, y, ..}`).
897    Struct(Option<Box<QSelf>>, Path, ThinVec<PatField>, PatFieldsRest),
898
899    /// A tuple struct/variant pattern (`Variant(x, y, .., z)`).
900    TupleStruct(Option<Box<QSelf>>, Path, ThinVec<Pat>),
901
902    /// An or-pattern `A | B | C`.
903    /// Invariant: `pats.len() >= 2`.
904    Or(ThinVec<Pat>),
905
906    /// A possibly qualified path pattern.
907    /// Unqualified path patterns `A::B::C` can legally refer to variants, structs, constants
908    /// or associated constants. Qualified path patterns `<A>::B::C`/`<A as Trait>::B::C` can
909    /// only legally refer to associated constants.
910    Path(Option<Box<QSelf>>, Path),
911
912    /// A tuple pattern (`(a, b)`).
913    Tuple(ThinVec<Pat>),
914
915    /// A `deref` pattern (currently `deref!()` macro-based syntax).
916    Deref(Box<Pat>),
917
918    /// A reference pattern (e.g., `&mut (a, b)`).
919    Ref(Box<Pat>, Pinnedness, Mutability),
920
921    /// A literal, const block or path.
922    Expr(Box<Expr>),
923
924    /// A range pattern (e.g., `1...2`, `1..2`, `1..`, `..2`, `1..=2`, `..=2`).
925    Range(Option<Box<Expr>>, Option<Box<Expr>>, Spanned<RangeEnd>),
926
927    /// A slice pattern `[a, b, c]`.
928    Slice(ThinVec<Pat>),
929
930    /// A rest pattern `..`.
931    ///
932    /// Syntactically it is valid anywhere.
933    ///
934    /// Semantically however, it only has meaning immediately inside:
935    /// - a slice pattern: `[a, .., b]`,
936    /// - a binding pattern immediately inside a slice pattern: `[a, r @ ..]`,
937    /// - a tuple pattern: `(a, .., b)`,
938    /// - a tuple struct/variant pattern: `$path(a, .., b)`.
939    ///
940    /// In all of these cases, an additional restriction applies,
941    /// only one rest pattern may occur in the pattern sequences.
942    Rest,
943
944    // A never pattern `!`.
945    Never,
946
947    /// A guard pattern (e.g., `x if guard(x)`).
948    Guard(Box<Pat>, Box<Guard>),
949
950    /// Parentheses in patterns used for grouping (i.e., `(PAT)`).
951    Paren(Box<Pat>),
952
953    /// A macro pattern; pre-expansion.
954    MacCall(Box<MacCall>),
955
956    /// Placeholder for a pattern that wasn't syntactically well formed in some way.
957    Err(ErrorGuaranteed),
958}
959
960/// Whether the `..` is present in a struct fields pattern.
961#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for PatFieldsRest { }
#[automatically_derived]
impl ::core::clone::Clone for PatFieldsRest {
    #[inline]
    fn clone(&self) -> Self {
        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 {
            Self::Rest(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Rest",
                    &__self_0),
            Self::Recovered(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Recovered", &__self_0),
            Self::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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Rest(__self_0), Self::Rest(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::Recovered(__self_0), Self::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)]
962pub enum PatFieldsRest {
963    /// `module::StructName { field, ..}`
964    Rest(Span),
965    /// `module::StructName { field, syntax error }`
966    Recovered(ErrorGuaranteed),
967    /// `module::StructName { field }`
968    None,
969}
970
971/// The kind of borrow in an `AddrOf` expression,
972/// e.g., `&place` or `&raw const place`.
973#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for BorrowKind { }
#[automatically_derived]
impl ::core::clone::Clone for BorrowKind {
    #[inline]
    fn clone(&self) -> Self { *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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for BorrowKind { }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)]
974#[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)]
975pub enum BorrowKind {
976    /// A normal borrow, `&$expr` or `&mut $expr`.
977    /// The resulting type is either `&'a T` or `&'a mut T`
978    /// where `T = typeof($expr)` and `'a` is some lifetime.
979    Ref,
980    /// A raw borrow, `&raw const $expr` or `&raw mut $expr`.
981    /// The resulting type is either `*const T` or `*mut T`
982    /// where `T = typeof($expr)`.
983    Raw,
984    /// A pinned borrow, `&pin const $expr` or `&pin mut $expr`.
985    /// The resulting type is either `Pin<&'a T>` or `Pin<&'a mut T>`
986    /// where `T = typeof($expr)` and `'a` is some lifetime.
987    Pin,
988}
989
990#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for BinOpKind { }
#[automatically_derived]
impl ::core::clone::Clone for BinOpKind {
    #[inline]
    fn clone(&self) -> Self { *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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}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)]
991pub enum BinOpKind {
992    /// The `+` operator (addition)
993    Add,
994    /// The `-` operator (subtraction)
995    Sub,
996    /// The `*` operator (multiplication)
997    Mul,
998    /// The `/` operator (division)
999    Div,
1000    /// The `%` operator (modulus)
1001    Rem,
1002    /// The `&&` operator (logical and)
1003    And,
1004    /// The `||` operator (logical or)
1005    Or,
1006    /// The `^` operator (bitwise xor)
1007    BitXor,
1008    /// The `&` operator (bitwise and)
1009    BitAnd,
1010    /// The `|` operator (bitwise or)
1011    BitOr,
1012    /// The `<<` operator (shift left)
1013    Shl,
1014    /// The `>>` operator (shift right)
1015    Shr,
1016    /// The `==` operator (equality)
1017    Eq,
1018    /// The `<` operator (less than)
1019    Lt,
1020    /// The `<=` operator (less than or equal to)
1021    Le,
1022    /// The `!=` operator (not equal to)
1023    Ne,
1024    /// The `>=` operator (greater than or equal to)
1025    Ge,
1026    /// The `>` operator (greater than)
1027    Gt,
1028}
1029
1030impl BinOpKind {
1031    pub fn as_str(&self) -> &'static str {
1032        use BinOpKind::*;
1033        match self {
1034            Add => "+",
1035            Sub => "-",
1036            Mul => "*",
1037            Div => "/",
1038            Rem => "%",
1039            And => "&&",
1040            Or => "||",
1041            BitXor => "^",
1042            BitAnd => "&",
1043            BitOr => "|",
1044            Shl => "<<",
1045            Shr => ">>",
1046            Eq => "==",
1047            Lt => "<",
1048            Le => "<=",
1049            Ne => "!=",
1050            Ge => ">=",
1051            Gt => ">",
1052        }
1053    }
1054
1055    pub fn is_lazy(&self) -> bool {
1056        #[allow(non_exhaustive_omitted_patterns)] match self {
    BinOpKind::And | BinOpKind::Or => true,
    _ => false,
}matches!(self, BinOpKind::And | BinOpKind::Or)
1057    }
1058
1059    pub fn precedence(&self) -> ExprPrecedence {
1060        use BinOpKind::*;
1061        match *self {
1062            Mul | Div | Rem => ExprPrecedence::Product,
1063            Add | Sub => ExprPrecedence::Sum,
1064            Shl | Shr => ExprPrecedence::Shift,
1065            BitAnd => ExprPrecedence::BitAnd,
1066            BitXor => ExprPrecedence::BitXor,
1067            BitOr => ExprPrecedence::BitOr,
1068            Lt | Gt | Le | Ge | Eq | Ne => ExprPrecedence::Compare,
1069            And => ExprPrecedence::LAnd,
1070            Or => ExprPrecedence::LOr,
1071        }
1072    }
1073
1074    pub fn fixity(&self) -> Fixity {
1075        use BinOpKind::*;
1076        match self {
1077            Eq | Ne | Lt | Le | Gt | Ge => Fixity::None,
1078            Add | Sub | Mul | Div | Rem | And | Or | BitXor | BitAnd | BitOr | Shl | Shr => {
1079                Fixity::Left
1080            }
1081        }
1082    }
1083
1084    pub fn is_comparison(self) -> bool {
1085        use BinOpKind::*;
1086        match self {
1087            Eq | Ne | Lt | Le | Gt | Ge => true,
1088            Add | Sub | Mul | Div | Rem | And | Or | BitXor | BitAnd | BitOr | Shl | Shr => false,
1089        }
1090    }
1091
1092    /// Returns `true` if the binary operator takes its arguments by value.
1093    pub fn is_by_value(self) -> bool {
1094        !self.is_comparison()
1095    }
1096}
1097
1098pub type BinOp = Spanned<BinOpKind>;
1099
1100// Sometimes `BinOpKind` and `AssignOpKind` need the same treatment. The
1101// operations covered by `AssignOpKind` are a subset of those covered by
1102// `BinOpKind`, so it makes sense to convert `AssignOpKind` to `BinOpKind`.
1103impl From<AssignOpKind> for BinOpKind {
1104    fn from(op: AssignOpKind) -> BinOpKind {
1105        match op {
1106            AssignOpKind::AddAssign => BinOpKind::Add,
1107            AssignOpKind::SubAssign => BinOpKind::Sub,
1108            AssignOpKind::MulAssign => BinOpKind::Mul,
1109            AssignOpKind::DivAssign => BinOpKind::Div,
1110            AssignOpKind::RemAssign => BinOpKind::Rem,
1111            AssignOpKind::BitXorAssign => BinOpKind::BitXor,
1112            AssignOpKind::BitAndAssign => BinOpKind::BitAnd,
1113            AssignOpKind::BitOrAssign => BinOpKind::BitOr,
1114            AssignOpKind::ShlAssign => BinOpKind::Shl,
1115            AssignOpKind::ShrAssign => BinOpKind::Shr,
1116        }
1117    }
1118}
1119
1120#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for AssignOpKind { }
#[automatically_derived]
impl ::core::clone::Clone for AssignOpKind {
    #[inline]
    fn clone(&self) -> Self { *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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}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)]
1121pub enum AssignOpKind {
1122    /// The `+=` operator (addition)
1123    AddAssign,
1124    /// The `-=` operator (subtraction)
1125    SubAssign,
1126    /// The `*=` operator (multiplication)
1127    MulAssign,
1128    /// The `/=` operator (division)
1129    DivAssign,
1130    /// The `%=` operator (modulus)
1131    RemAssign,
1132    /// The `^=` operator (bitwise xor)
1133    BitXorAssign,
1134    /// The `&=` operator (bitwise and)
1135    BitAndAssign,
1136    /// The `|=` operator (bitwise or)
1137    BitOrAssign,
1138    /// The `<<=` operator (shift left)
1139    ShlAssign,
1140    /// The `>>=` operator (shift right)
1141    ShrAssign,
1142}
1143
1144impl AssignOpKind {
1145    pub fn as_str(&self) -> &'static str {
1146        use AssignOpKind::*;
1147        match self {
1148            AddAssign => "+=",
1149            SubAssign => "-=",
1150            MulAssign => "*=",
1151            DivAssign => "/=",
1152            RemAssign => "%=",
1153            BitXorAssign => "^=",
1154            BitAndAssign => "&=",
1155            BitOrAssign => "|=",
1156            ShlAssign => "<<=",
1157            ShrAssign => ">>=",
1158        }
1159    }
1160
1161    /// AssignOps are always by value.
1162    pub fn is_by_value(self) -> bool {
1163        true
1164    }
1165}
1166
1167pub type AssignOp = Spanned<AssignOpKind>;
1168
1169/// Unary operator.
1170///
1171/// Note that `&data` is not an operator, it's an `AddrOf` expression.
1172#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for UnOp { }
#[automatically_derived]
impl ::core::clone::Clone for UnOp {
    #[inline]
    fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}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)]
1173pub enum UnOp {
1174    /// The `*` operator for dereferencing
1175    Deref,
1176    /// The `!` operator for logical inversion
1177    Not,
1178    /// The `-` operator for negation
1179    Neg,
1180}
1181
1182impl UnOp {
1183    pub fn as_str(&self) -> &'static str {
1184        match self {
1185            UnOp::Deref => "*",
1186            UnOp::Not => "!",
1187            UnOp::Neg => "-",
1188        }
1189    }
1190
1191    /// Returns `true` if the unary operator takes its argument by value.
1192    pub fn is_by_value(self) -> bool {
1193        #[allow(non_exhaustive_omitted_patterns)] match self {
    Self::Neg | Self::Not => true,
    _ => false,
}matches!(self, Self::Neg | Self::Not)
1194    }
1195}
1196
1197/// A statement.
1198///
1199/// No `attrs` or `tokens` fields because each `StmtKind` variant
1200/// contains an AST node with those fields. (Except for `StmtKind::Empty`,
1201/// which never has attrs or tokens)
1202#[derive(#[automatically_derived]
impl ::core::clone::Clone for Stmt {
    #[inline]
    fn clone(&self) -> Self {
        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)]
1203pub struct Stmt {
1204    pub id: NodeId,
1205    pub kind: StmtKind,
1206    pub span: Span,
1207}
1208
1209impl Stmt {
1210    pub fn has_trailing_semicolon(&self) -> bool {
1211        match &self.kind {
1212            StmtKind::Semi(_) => true,
1213            StmtKind::MacCall(mac) => #[allow(non_exhaustive_omitted_patterns)] match mac.style {
    MacStmtStyle::Semicolon => true,
    _ => false,
}matches!(mac.style, MacStmtStyle::Semicolon),
1214            _ => false,
1215        }
1216    }
1217
1218    /// Converts a parsed `Stmt` to a `Stmt` with
1219    /// a trailing semicolon.
1220    ///
1221    /// This only modifies the parsed AST struct, not the attached
1222    /// `LazyAttrTokenStream`. The parser is responsible for calling
1223    /// `ToAttrTokenStream::add_trailing_semi` when there is actually
1224    /// a semicolon in the tokenstream.
1225    pub fn add_trailing_semicolon(mut self) -> Self {
1226        self.kind = match self.kind {
1227            StmtKind::Expr(expr) => StmtKind::Semi(expr),
1228            StmtKind::MacCall(mut mac) => {
1229                mac.style = MacStmtStyle::Semicolon;
1230                StmtKind::MacCall(mac)
1231            }
1232            kind => kind,
1233        };
1234
1235        self
1236    }
1237
1238    pub fn is_item(&self) -> bool {
1239        #[allow(non_exhaustive_omitted_patterns)] match self.kind {
    StmtKind::Item(_) => true,
    _ => false,
}matches!(self.kind, StmtKind::Item(_))
1240    }
1241
1242    pub fn is_expr(&self) -> bool {
1243        #[allow(non_exhaustive_omitted_patterns)] match self.kind {
    StmtKind::Expr(_) => true,
    _ => false,
}matches!(self.kind, StmtKind::Expr(_))
1244    }
1245}
1246
1247// Adding a new variant? Please update `test_stmt` in `tests/ui/macros/stringify.rs`.
1248#[derive(#[automatically_derived]
impl ::core::clone::Clone for StmtKind {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Let(__self_0) =>
                StmtKind::Let(::core::clone::Clone::clone(__self_0)),
            Self::Item(__self_0) =>
                StmtKind::Item(::core::clone::Clone::clone(__self_0)),
            Self::Expr(__self_0) =>
                StmtKind::Expr(::core::clone::Clone::clone(__self_0)),
            Self::Semi(__self_0) =>
                StmtKind::Semi(::core::clone::Clone::clone(__self_0)),
            Self::Empty => StmtKind::Empty,
            Self::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 {
            Self::Let(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Let",
                    &__self_0),
            Self::Item(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Item",
                    &__self_0),
            Self::Expr(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Expr",
                    &__self_0),
            Self::Semi(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Semi",
                    &__self_0),
            Self::Empty => ::core::fmt::Formatter::write_str(f, "Empty"),
            Self::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)]
1249pub enum StmtKind {
1250    /// A local (let) binding.
1251    Let(Box<Local>),
1252    /// An item definition.
1253    Item(Box<Item>),
1254    /// Expr without trailing semi-colon.
1255    Expr(Box<Expr>),
1256    /// Expr with a trailing semi-colon.
1257    Semi(Box<Expr>),
1258    /// Just a trailing semi-colon.
1259    Empty,
1260    /// Macro.
1261    MacCall(Box<MacCallStmt>),
1262}
1263
1264impl StmtKind {
1265    pub fn descr(&self) -> &'static str {
1266        match self {
1267            StmtKind::Let(_) => "local",
1268            StmtKind::Item(_) => "item",
1269            StmtKind::Expr(_) => "expression",
1270            StmtKind::Semi(_) => "statement",
1271            StmtKind::Empty => "semicolon",
1272            StmtKind::MacCall(_) => "macro call",
1273        }
1274    }
1275}
1276
1277#[derive(#[automatically_derived]
impl ::core::clone::Clone for MacCallStmt {
    #[inline]
    fn clone(&self) -> Self {
        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)]
1278pub struct MacCallStmt {
1279    pub mac: Box<MacCall>,
1280    pub style: MacStmtStyle,
1281    pub attrs: AttrVec,
1282    pub tokens: Option<LazyAttrTokenStream>,
1283}
1284
1285#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for MacStmtStyle { }
#[automatically_derived]
impl ::core::clone::Clone for MacStmtStyle {
    #[inline]
    fn clone(&self) -> Self { *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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}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)]
1286pub enum MacStmtStyle {
1287    /// The macro statement had a trailing semicolon (e.g., `foo! { ... };`
1288    /// `foo!(...);`, `foo![...];`).
1289    Semicolon,
1290    /// The macro statement had braces (e.g., `foo! { ... }`).
1291    Braces,
1292    /// The macro statement had parentheses or brackets and no semicolon (e.g.,
1293    /// `foo!(...)`). All of these will end up being converted into macro
1294    /// expressions.
1295    NoBraces,
1296}
1297
1298/// Local represents a `let` statement, e.g., `let <pat>:<ty> = <expr>;`.
1299#[derive(#[automatically_derived]
impl ::core::clone::Clone for Local {
    #[inline]
    fn clone(&self) -> Self {
        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)]
1300pub struct Local {
1301    pub id: NodeId,
1302    pub super_: Option<Span>,
1303    pub pat: Box<Pat>,
1304    pub ty: Option<Box<Ty>>,
1305    pub kind: LocalKind,
1306    pub span: Span,
1307    pub colon_sp: Option<Span>,
1308    pub attrs: AttrVec,
1309    pub tokens: Option<LazyAttrTokenStream>,
1310}
1311
1312#[derive(#[automatically_derived]
impl ::core::clone::Clone for LocalKind {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Decl => LocalKind::Decl,
            Self::Init(__self_0) =>
                LocalKind::Init(::core::clone::Clone::clone(__self_0)),
            Self::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 {
            Self::Decl => ::core::fmt::Formatter::write_str(f, "Decl"),
            Self::Init(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Init",
                    &__self_0),
            Self::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)]
1313pub enum LocalKind {
1314    /// Local declaration.
1315    /// Example: `let x;`
1316    Decl,
1317    /// Local declaration with an initializer.
1318    /// Example: `let x = y;`
1319    Init(Box<Expr>),
1320    /// Local declaration with an initializer and an `else` clause.
1321    /// Example: `let Some(x) = y else { return };`
1322    InitElse(Box<Expr>, Box<Block>),
1323}
1324
1325impl LocalKind {
1326    pub fn init(&self) -> Option<&Expr> {
1327        match self {
1328            Self::Decl => None,
1329            Self::Init(i) | Self::InitElse(i, _) => Some(i),
1330        }
1331    }
1332
1333    pub fn init_else_opt(&self) -> Option<(&Expr, Option<&Block>)> {
1334        match self {
1335            Self::Decl => None,
1336            Self::Init(init) => Some((init, None)),
1337            Self::InitElse(init, els) => Some((init, Some(els))),
1338        }
1339    }
1340}
1341
1342/// An arm of a 'match'.
1343///
1344/// E.g., `0..=10 => { println!("match!") }` as in
1345///
1346/// ```
1347/// match 123 {
1348///     0..=10 => { println!("match!") },
1349///     _ => { println!("no match!") },
1350/// }
1351/// ```
1352#[derive(#[automatically_derived]
impl ::core::clone::Clone for Arm {
    #[inline]
    fn clone(&self) -> Self {
        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)]
1353pub struct Arm {
1354    pub attrs: AttrVec,
1355    /// Match arm pattern, e.g. `10` in `match foo { 10 => {}, _ => {} }`.
1356    pub pat: Box<Pat>,
1357    /// Match arm guard, e.g. `n > 10` in `match foo { n if n > 10 => {}, _ => {} }`.
1358    pub guard: Option<Box<Guard>>,
1359    /// Match arm body. Omitted if the pattern is a never pattern.
1360    pub body: Option<Box<Expr>>,
1361    pub span: Span,
1362    pub id: NodeId,
1363    pub is_placeholder: bool,
1364}
1365
1366/// A single field in a struct expression, e.g. `x: value` and `y` in `Foo { x: value, y }`.
1367#[derive(#[automatically_derived]
impl ::core::clone::Clone for ExprField {
    #[inline]
    fn clone(&self) -> Self {
        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)]
1368pub struct ExprField {
1369    pub attrs: AttrVec,
1370    pub id: NodeId,
1371    pub span: Span,
1372    pub ident: Ident,
1373    pub expr: Box<Expr>,
1374    pub is_shorthand: bool,
1375    pub is_placeholder: bool,
1376}
1377
1378#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for BlockCheckMode { }
#[automatically_derived]
impl ::core::clone::Clone for BlockCheckMode {
    #[inline]
    fn clone(&self) -> Self {
        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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Unsafe(__self_0), Self::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 {
            Self::Default => ::core::fmt::Formatter::write_str(f, "Default"),
            Self::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)]
1379pub enum BlockCheckMode {
1380    Default,
1381    Unsafe(UnsafeSource),
1382}
1383
1384#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for UnsafeSource { }
#[automatically_derived]
impl ::core::clone::Clone for UnsafeSource {
    #[inline]
    fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for UnsafeSource { }
#[automatically_derived]
impl ::core::cmp::PartialEq for UnsafeSource {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}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)]
1385pub enum UnsafeSource {
1386    CompilerGenerated,
1387    UserProvided,
1388}
1389
1390/// An anonymous constant.
1391///
1392/// A constant (expression) that's not an item or associated item,
1393/// but needs its own `DefId` for type-checking, const-eval, etc.
1394/// These are usually found nested inside types (e.g., array lengths)
1395/// or expressions (e.g., repeat counts), and also used to define
1396/// explicit discriminant values for enum variants.
1397#[derive(#[automatically_derived]
impl ::core::clone::Clone for AnonConst {
    #[inline]
    fn clone(&self) -> Self {
        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)]
1398pub struct AnonConst {
1399    pub id: NodeId,
1400    pub value: Box<Expr>,
1401}
1402
1403/// An expression.
1404#[derive(#[automatically_derived]
impl ::core::clone::Clone for Expr {
    #[inline]
    fn clone(&self) -> Self {
        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)]
1405pub struct Expr {
1406    pub id: NodeId,
1407    pub kind: ExprKind,
1408    pub span: Span,
1409    pub attrs: AttrVec,
1410    pub tokens: Option<LazyAttrTokenStream>,
1411}
1412
1413impl Expr {
1414    /// Check if this expression is potentially a trivial const arg, i.e., one that can _potentially_
1415    /// be represented without an anon const in the HIR.
1416    ///
1417    /// This will unwrap at most one block level (curly braces). After that, if the expression
1418    /// is a path, it mostly dispatches to [`Path::is_single_argless_ident`].
1419    ///
1420    /// This function will only allow paths with no qself, before dispatching to the `Path`
1421    /// function of the same name.
1422    ///
1423    /// Does not ensure that the path resolves to a const param/item, the caller should check this.
1424    /// This also does not consider macros, so it's only correct after macro-expansion.
1425    pub fn is_potential_trivial_const_arg(&self) -> bool {
1426        let this = self.maybe_unwrap_block();
1427        if let ExprKind::Path(None, path) = &this.kind
1428            && path.is_single_argless_ident()
1429        {
1430            true
1431        } else {
1432            false
1433        }
1434    }
1435
1436    /// Returns an expression with (when possible) *one* outer brace removed
1437    pub fn maybe_unwrap_block(&self) -> &Expr {
1438        if let ExprKind::Block(block, None) = &self.kind
1439            && let [stmt] = block.stmts.as_slice()
1440            && let StmtKind::Expr(expr) = &stmt.kind
1441        {
1442            expr
1443        } else {
1444            self
1445        }
1446    }
1447
1448    /// Determines whether this expression is a macro call optionally wrapped in braces . If
1449    /// `already_stripped_block` is set then we do not attempt to peel off a layer of braces.
1450    ///
1451    /// Returns the [`NodeId`] of the macro call and whether a layer of braces has been peeled
1452    /// either before, or part of, this function.
1453    pub fn optionally_braced_mac_call(
1454        &self,
1455        already_stripped_block: bool,
1456    ) -> Option<(bool, NodeId)> {
1457        match &self.kind {
1458            ExprKind::Block(block, None)
1459                if let [stmt] = &*block.stmts
1460                    && !already_stripped_block =>
1461            {
1462                match &stmt.kind {
1463                    StmtKind::MacCall(_) => Some((true, stmt.id)),
1464                    StmtKind::Expr(expr) if let ExprKind::MacCall(_) = &expr.kind => {
1465                        Some((true, expr.id))
1466                    }
1467                    _ => None,
1468                }
1469            }
1470            ExprKind::MacCall(_) => Some((already_stripped_block, self.id)),
1471            _ => None,
1472        }
1473    }
1474
1475    pub fn to_bound(&self) -> Option<GenericBound> {
1476        match &self.kind {
1477            ExprKind::Path(None, path) => Some(GenericBound::Trait(PolyTraitRef::new(
1478                ThinVec::new(),
1479                path.clone(),
1480                TraitBoundModifiers::NONE,
1481                self.span,
1482                Parens::No,
1483            ))),
1484            _ => None,
1485        }
1486    }
1487
1488    pub fn peel_parens(&self) -> &Expr {
1489        let mut expr = self;
1490        while let ExprKind::Paren(inner) = &expr.kind {
1491            expr = inner;
1492        }
1493        expr
1494    }
1495
1496    pub fn peel_parens_and_refs(&self) -> &Expr {
1497        let mut expr = self;
1498        while let ExprKind::Paren(inner) | ExprKind::AddrOf(BorrowKind::Ref, _, inner) = &expr.kind
1499        {
1500            expr = inner;
1501        }
1502        expr
1503    }
1504
1505    /// Attempts to reparse as `Ty` (for diagnostic purposes).
1506    pub fn to_ty(&self) -> Option<Box<Ty>> {
1507        let kind = match &self.kind {
1508            // Trivial conversions.
1509            ExprKind::Path(qself, path) => TyKind::Path(qself.clone(), path.clone()),
1510            ExprKind::MacCall(mac) => TyKind::MacCall(mac.clone()),
1511
1512            ExprKind::Paren(expr) => expr.to_ty().map(TyKind::Paren)?,
1513
1514            ExprKind::AddrOf(BorrowKind::Ref, mutbl, expr) => {
1515                expr.to_ty().map(|ty| TyKind::Ref(None, ty, *mutbl))?
1516            }
1517
1518            ExprKind::Repeat(expr, expr_len) => {
1519                expr.to_ty().map(|ty| TyKind::Array(ty, expr_len.clone()))?
1520            }
1521
1522            ExprKind::Array(exprs) if let [expr] = exprs.as_slice() => {
1523                expr.to_ty().map(TyKind::Slice)?
1524            }
1525
1526            ExprKind::Tup(exprs) => {
1527                let tys = exprs.iter().map(|expr| expr.to_ty()).collect::<Option<ThinVec<_>>>()?;
1528                TyKind::Tup(tys)
1529            }
1530
1531            // If binary operator is `Add` and both `lhs` and `rhs` are trait bounds,
1532            // then type of result is trait object.
1533            // Otherwise we don't assume the result type.
1534            ExprKind::Binary(binop, lhs, rhs) if binop.node == BinOpKind::Add => {
1535                let (Some(lhs), Some(rhs)) = (lhs.to_bound(), rhs.to_bound()) else {
1536                    return None;
1537                };
1538                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)
1539            }
1540
1541            ExprKind::Underscore => TyKind::Infer,
1542
1543            // This expression doesn't look like a type syntactically.
1544            _ => return None,
1545        };
1546
1547        Some(Box::new(Ty { kind, id: self.id, span: self.span }))
1548    }
1549
1550    pub fn precedence(&self) -> ExprPrecedence {
1551        fn prefix_attrs_precedence(attrs: &AttrVec) -> ExprPrecedence {
1552            for attr in attrs {
1553                if let AttrStyle::Outer = attr.style {
1554                    return ExprPrecedence::Prefix;
1555                }
1556            }
1557            ExprPrecedence::Unambiguous
1558        }
1559
1560        match &self.kind {
1561            ExprKind::Closure(closure) => match closure.fn_decl.output {
1562                FnRetTy::Default(_) => ExprPrecedence::Jump,
1563                FnRetTy::Ty(_) => prefix_attrs_precedence(&self.attrs),
1564            },
1565
1566            ExprKind::Break(_ /*label*/, value)
1567            | ExprKind::Ret(value)
1568            | ExprKind::Yield(YieldKind::Prefix(value))
1569            | ExprKind::Yeet(value) => match value {
1570                Some(_) => ExprPrecedence::Jump,
1571                None => prefix_attrs_precedence(&self.attrs),
1572            },
1573
1574            ExprKind::Become(_) => ExprPrecedence::Jump,
1575
1576            // `Range` claims to have higher precedence than `Assign`, but `x .. x = x` fails to
1577            // parse, instead of parsing as `(x .. x) = x`. Giving `Range` a lower precedence
1578            // ensures that `pprust` will add parentheses in the right places to get the desired
1579            // parse.
1580            ExprKind::Range(..) => ExprPrecedence::Range,
1581
1582            // Binop-like expr kinds, handled by `AssocOp`.
1583            ExprKind::Binary(op, ..) => op.node.precedence(),
1584            ExprKind::Cast(..) => ExprPrecedence::Cast,
1585
1586            ExprKind::Assign(..) | ExprKind::AssignOp(..) => ExprPrecedence::Assign,
1587
1588            // Unary, prefix
1589            ExprKind::AddrOf(..) => ExprPrecedence::Prefix,
1590
1591            // Here `let pats = expr` has `let pats =` as a "unary" prefix of `expr`.
1592            // However, this is not exactly right. When `let _ = a` is the LHS of a binop we
1593            // need parens sometimes. E.g. we can print `(let _ = a) && b` as `let _ = a && b`
1594            // but we need to print `(let _ = a) < b` as-is with parens.
1595            ExprKind::Let(..) | ExprKind::Move(..) | ExprKind::Unary(..) => ExprPrecedence::Prefix,
1596
1597            // Need parens if and only if there are prefix attributes.
1598            ExprKind::Array(_)
1599            | ExprKind::Await(..)
1600            | ExprKind::Use(..)
1601            | ExprKind::Block(..)
1602            | ExprKind::Call(..)
1603            | ExprKind::ConstBlock(_)
1604            | ExprKind::Continue(..)
1605            | ExprKind::Field(..)
1606            | ExprKind::ForLoop { .. }
1607            | ExprKind::FormatArgs(..)
1608            | ExprKind::Gen(..)
1609            | ExprKind::If(..)
1610            | ExprKind::IncludedBytes(..)
1611            | ExprKind::Index(..)
1612            | ExprKind::InlineAsm(..)
1613            | ExprKind::Lit(_)
1614            | ExprKind::Loop(..)
1615            | ExprKind::MacCall(..)
1616            | ExprKind::Match(..)
1617            | ExprKind::MethodCall(..)
1618            | ExprKind::OffsetOf(..)
1619            | ExprKind::Paren(..)
1620            | ExprKind::Path(..)
1621            | ExprKind::Repeat(..)
1622            | ExprKind::Struct(..)
1623            | ExprKind::Try(..)
1624            | ExprKind::TryBlock(..)
1625            | ExprKind::Tup(_)
1626            | ExprKind::Type(..)
1627            | ExprKind::Underscore
1628            | ExprKind::UnsafeBinderCast(..)
1629            | ExprKind::While(..)
1630            | ExprKind::Yield(YieldKind::Postfix(..))
1631            | ExprKind::GcaMacro(..)
1632            | ExprKind::Err(_)
1633            | ExprKind::Dummy => prefix_attrs_precedence(&self.attrs),
1634        }
1635    }
1636
1637    /// To a first-order approximation, is this a pattern?
1638    pub fn is_approximately_pattern(&self) -> bool {
1639        #[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!(
1640            &self.peel_parens().kind,
1641            ExprKind::Array(_)
1642                | ExprKind::Call(_, _)
1643                | ExprKind::Tup(_)
1644                | ExprKind::Lit(_)
1645                | ExprKind::Range(_, _, _)
1646                | ExprKind::Underscore
1647                | ExprKind::Path(_, _)
1648                | ExprKind::Struct(_)
1649        )
1650    }
1651
1652    /// Creates a dummy `Expr`.
1653    ///
1654    /// Should only be used when it will be replaced afterwards or as a return value when an error was encountered.
1655    pub fn dummy() -> Expr {
1656        Expr {
1657            id: DUMMY_NODE_ID,
1658            kind: ExprKind::Dummy,
1659            span: DUMMY_SP,
1660            attrs: ThinVec::new(),
1661            tokens: None,
1662        }
1663    }
1664}
1665
1666impl From<Box<Expr>> for Expr {
1667    fn from(value: Box<Expr>) -> Self {
1668        *value
1669    }
1670}
1671
1672#[derive(#[automatically_derived]
impl ::core::clone::Clone for ForLoop {
    #[inline]
    fn clone(&self) -> Self {
        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)]
1673pub struct ForLoop {
1674    pub pat: Box<Pat>,
1675    pub iter: Box<Expr>,
1676    pub body: Box<Block>,
1677    pub label: Option<Label>,
1678    pub kind: ForLoopKind,
1679}
1680
1681#[derive(#[automatically_derived]
impl ::core::clone::Clone for Closure {
    #[inline]
    fn clone(&self) -> Self {
        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)]
1682pub struct Closure {
1683    pub binder: ClosureBinder,
1684    pub capture_clause: CaptureBy,
1685    pub constness: Const,
1686    pub coroutine_marker: Option<CoroutineMarker>,
1687    pub movability: Movability,
1688    pub fn_decl: Box<FnDecl>,
1689    pub body: Box<Expr>,
1690    /// The span of the declaration block: 'move |...| -> ...'
1691    pub fn_decl_span: Span,
1692    /// The span of the argument block `|...|`
1693    pub fn_arg_span: Span,
1694}
1695
1696/// Limit types of a range (inclusive or exclusive).
1697#[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) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for RangeLimits { }
#[automatically_derived]
impl ::core::cmp::PartialEq for RangeLimits {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}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)]
1698pub enum RangeLimits {
1699    /// Inclusive at the beginning, exclusive at the end.
1700    HalfOpen,
1701    /// Inclusive at the beginning and end.
1702    Closed,
1703}
1704
1705impl RangeLimits {
1706    pub fn as_str(&self) -> &'static str {
1707        match self {
1708            RangeLimits::HalfOpen => "..",
1709            RangeLimits::Closed => "..=",
1710        }
1711    }
1712}
1713
1714/// A method call (e.g. `x.foo::<Bar, Baz>(a, b, c)`).
1715#[derive(#[automatically_derived]
impl ::core::clone::Clone for MethodCall {
    #[inline]
    fn clone(&self) -> Self {
        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)]
1716pub struct MethodCall {
1717    /// The method name and its generic arguments, e.g. `foo::<Bar, Baz>`.
1718    pub seg: PathSegment,
1719    /// The receiver, e.g. `x`.
1720    pub receiver: Box<Expr>,
1721    /// The arguments, e.g. `a, b, c`.
1722    pub args: ThinVec<Box<Expr>>,
1723    /// The span of the function, without the dot and receiver e.g. `foo::<Bar,
1724    /// Baz>(a, b, c)`.
1725    pub span: Span,
1726}
1727
1728#[derive(#[automatically_derived]
impl ::core::clone::Clone for StructRest {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Base(__self_0) =>
                StructRest::Base(::core::clone::Clone::clone(__self_0)),
            Self::Rest(__self_0) =>
                StructRest::Rest(::core::clone::Clone::clone(__self_0)),
            Self::None => StructRest::None,
            Self::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 {
            Self::Base(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Base",
                    &__self_0),
            Self::Rest(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Rest",
                    &__self_0),
            Self::None => ::core::fmt::Formatter::write_str(f, "None"),
            Self::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)]
1729pub enum StructRest {
1730    /// `..x`.
1731    Base(Box<Expr>),
1732    /// `..`.
1733    Rest(Span),
1734    /// No trailing `..` or expression.
1735    None,
1736    /// No trailing `..` or expression, and also, a parse error occurred inside the struct braces.
1737    ///
1738    /// This struct should be treated similarly to as if it had an `..` in it,
1739    /// in particular rather than reporting missing fields, because the parse error
1740    /// makes which fields the struct was intended to have not fully known.
1741    NoneWithError(ErrorGuaranteed),
1742}
1743
1744#[derive(#[automatically_derived]
impl ::core::clone::Clone for StructExpr {
    #[inline]
    fn clone(&self) -> Self {
        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)]
1745pub struct StructExpr {
1746    pub qself: Option<Box<QSelf>>,
1747    pub path: Path,
1748    pub fields: ThinVec<ExprField>,
1749    pub rest: StructRest,
1750}
1751
1752// Adding a new variant? Please update `test_expr` in `tests/ui/macros/stringify.rs`.
1753#[derive(#[automatically_derived]
impl ::core::clone::Clone for ExprKind {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Array(__self_0) =>
                ExprKind::Array(::core::clone::Clone::clone(__self_0)),
            Self::ConstBlock(__self_0) =>
                ExprKind::ConstBlock(::core::clone::Clone::clone(__self_0)),
            Self::Call(__self_0, __self_1) =>
                ExprKind::Call(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::MethodCall(__self_0) =>
                ExprKind::MethodCall(::core::clone::Clone::clone(__self_0)),
            Self::Tup(__self_0) =>
                ExprKind::Tup(::core::clone::Clone::clone(__self_0)),
            Self::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)),
            Self::Unary(__self_0, __self_1) =>
                ExprKind::Unary(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::Move(__self_0, __self_1) =>
                ExprKind::Move(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::Lit(__self_0) =>
                ExprKind::Lit(::core::clone::Clone::clone(__self_0)),
            Self::Cast(__self_0, __self_1) =>
                ExprKind::Cast(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::Type(__self_0, __self_1) =>
                ExprKind::Type(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::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)),
            Self::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)),
            Self::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)),
            Self::ForLoop(__self_0) =>
                ExprKind::ForLoop(::core::clone::Clone::clone(__self_0)),
            Self::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)),
            Self::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)),
            Self::Closure(__self_0) =>
                ExprKind::Closure(::core::clone::Clone::clone(__self_0)),
            Self::Block(__self_0, __self_1) =>
                ExprKind::Block(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::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)),
            Self::Await(__self_0, __self_1) =>
                ExprKind::Await(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::Use(__self_0, __self_1) =>
                ExprKind::Use(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::TryBlock(__self_0, __self_1) =>
                ExprKind::TryBlock(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::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)),
            Self::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)),
            Self::Field(__self_0, __self_1) =>
                ExprKind::Field(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::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)),
            Self::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)),
            Self::Underscore => ExprKind::Underscore,
            Self::Path(__self_0, __self_1) =>
                ExprKind::Path(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::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)),
            Self::Break(__self_0, __self_1) =>
                ExprKind::Break(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::Continue(__self_0) =>
                ExprKind::Continue(::core::clone::Clone::clone(__self_0)),
            Self::Ret(__self_0) =>
                ExprKind::Ret(::core::clone::Clone::clone(__self_0)),
            Self::InlineAsm(__self_0) =>
                ExprKind::InlineAsm(::core::clone::Clone::clone(__self_0)),
            Self::OffsetOf(__self_0, __self_1) =>
                ExprKind::OffsetOf(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::MacCall(__self_0) =>
                ExprKind::MacCall(::core::clone::Clone::clone(__self_0)),
            Self::Struct(__self_0) =>
                ExprKind::Struct(::core::clone::Clone::clone(__self_0)),
            Self::Repeat(__self_0, __self_1) =>
                ExprKind::Repeat(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::Paren(__self_0) =>
                ExprKind::Paren(::core::clone::Clone::clone(__self_0)),
            Self::Try(__self_0) =>
                ExprKind::Try(::core::clone::Clone::clone(__self_0)),
            Self::Yield(__self_0) =>
                ExprKind::Yield(::core::clone::Clone::clone(__self_0)),
            Self::Yeet(__self_0) =>
                ExprKind::Yeet(::core::clone::Clone::clone(__self_0)),
            Self::Become(__self_0) =>
                ExprKind::Become(::core::clone::Clone::clone(__self_0)),
            Self::IncludedBytes(__self_0) =>
                ExprKind::IncludedBytes(::core::clone::Clone::clone(__self_0)),
            Self::FormatArgs(__self_0) =>
                ExprKind::FormatArgs(::core::clone::Clone::clone(__self_0)),
            Self::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)),
            Self::GcaMacro(__self_0) =>
                ExprKind::GcaMacro(::core::clone::Clone::clone(__self_0)),
            Self::Err(__self_0) =>
                ExprKind::Err(::core::clone::Clone::clone(__self_0)),
            Self::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::GcaMacro(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::GcaMacro(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::GcaMacro(::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 {
            Self::Array(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Array",
                    &__self_0),
            Self::ConstBlock(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ConstBlock", &__self_0),
            Self::Call(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Call",
                    __self_0, &__self_1),
            Self::MethodCall(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "MethodCall", &__self_0),
            Self::Tup(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Tup",
                    &__self_0),
            Self::Binary(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Binary",
                    __self_0, __self_1, &__self_2),
            Self::Unary(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Unary",
                    __self_0, &__self_1),
            Self::Move(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Move",
                    __self_0, &__self_1),
            Self::Lit(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Lit",
                    &__self_0),
            Self::Cast(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Cast",
                    __self_0, &__self_1),
            Self::Type(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Type",
                    __self_0, &__self_1),
            Self::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),
            Self::If(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "If",
                    __self_0, __self_1, &__self_2),
            Self::While(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "While",
                    __self_0, __self_1, &__self_2),
            Self::ForLoop(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ForLoop", &__self_0),
            Self::Loop(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Loop",
                    __self_0, __self_1, &__self_2),
            Self::Match(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Match",
                    __self_0, __self_1, &__self_2),
            Self::Closure(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Closure", &__self_0),
            Self::Block(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Block",
                    __self_0, &__self_1),
            Self::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),
            Self::Await(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Await",
                    __self_0, &__self_1),
            Self::Use(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Use",
                    __self_0, &__self_1),
            Self::TryBlock(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "TryBlock", __self_0, &__self_1),
            Self::Assign(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Assign",
                    __self_0, __self_1, &__self_2),
            Self::AssignOp(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f,
                    "AssignOp", __self_0, __self_1, &__self_2),
            Self::Field(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Field",
                    __self_0, &__self_1),
            Self::Index(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Index",
                    __self_0, __self_1, &__self_2),
            Self::Range(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Range",
                    __self_0, __self_1, &__self_2),
            Self::Underscore =>
                ::core::fmt::Formatter::write_str(f, "Underscore"),
            Self::Path(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Path",
                    __self_0, &__self_1),
            Self::AddrOf(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "AddrOf",
                    __self_0, __self_1, &__self_2),
            Self::Break(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Break",
                    __self_0, &__self_1),
            Self::Continue(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Continue", &__self_0),
            Self::Ret(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Ret",
                    &__self_0),
            Self::InlineAsm(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "InlineAsm", &__self_0),
            Self::OffsetOf(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "OffsetOf", __self_0, &__self_1),
            Self::MacCall(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "MacCall", &__self_0),
            Self::Struct(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Struct",
                    &__self_0),
            Self::Repeat(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Repeat",
                    __self_0, &__self_1),
            Self::Paren(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Paren",
                    &__self_0),
            Self::Try(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Try",
                    &__self_0),
            Self::Yield(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Yield",
                    &__self_0),
            Self::Yeet(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Yeet",
                    &__self_0),
            Self::Become(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Become",
                    &__self_0),
            Self::IncludedBytes(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "IncludedBytes", &__self_0),
            Self::FormatArgs(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "FormatArgs", &__self_0),
            Self::UnsafeBinderCast(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f,
                    "UnsafeBinderCast", __self_0, __self_1, &__self_2),
            Self::GcaMacro(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "GcaMacro", &__self_0),
            Self::Err(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Err",
                    &__self_0),
            Self::Dummy => ::core::fmt::Formatter::write_str(f, "Dummy"),
        }
    }
}Debug)]
1754pub enum ExprKind {
1755    /// An array (e.g, `[a, b, c, d]`).
1756    Array(ThinVec<Box<Expr>>),
1757    /// Allow anonymous constants from an inline `const` block.
1758    ConstBlock(AnonConst),
1759    /// A function call.
1760    ///
1761    /// The first field resolves to the function itself,
1762    /// and the second field is the list of arguments.
1763    /// This also represents calling the constructor of
1764    /// tuple-like ADTs such as tuple structs and enum variants.
1765    Call(Box<Expr>, ThinVec<Box<Expr>>),
1766    /// A method call (e.g., `x.foo::<Bar, Baz>(a, b, c)`).
1767    MethodCall(Box<MethodCall>),
1768    /// A tuple (e.g., `(a, b, c, d)`).
1769    Tup(ThinVec<Box<Expr>>),
1770    /// A binary operation (e.g., `a + b`, `a * b`).
1771    Binary(BinOp, Box<Expr>, Box<Expr>),
1772    /// A unary operation (e.g., `!x`, `*x`).
1773    Unary(UnOp, Box<Expr>),
1774    /// A `move(expr)` expression.
1775    Move(Box<Expr>, Span),
1776    /// A literal (e.g., `1`, `"foo"`).
1777    Lit(token::Lit),
1778    /// A cast (e.g., `foo as f64`).
1779    Cast(Box<Expr>, Box<Ty>),
1780    /// A type ascription (e.g., `builtin # type_ascribe(42, usize)`).
1781    ///
1782    /// Usually not written directly in user code but
1783    /// indirectly via the macro `type_ascribe!(...)`.
1784    Type(Box<Expr>, Box<Ty>),
1785    /// A `let pat = expr` expression that is only semantically allowed in the condition
1786    /// of `if` / `while` expressions. (e.g., `if let 0 = x { .. }`).
1787    ///
1788    /// `Span` represents the whole `let pat = expr` statement.
1789    Let(Box<Pat>, Box<Expr>, Span, Recovered),
1790    /// An `if` block, with an optional `else` block.
1791    ///
1792    /// `if expr { block } else { expr }`
1793    ///
1794    /// If present, the "else" expr is always `ExprKind::Block` (for `else`) or
1795    /// `ExprKind::If` (for `else if`).
1796    If(Box<Expr>, Box<Block>, Option<Box<Expr>>),
1797    /// A while loop, with an optional label.
1798    ///
1799    /// `'label: while expr { block }`
1800    While(Box<Expr>, Box<Block>, Option<Label>),
1801    /// A `for` loop, with an optional label.
1802    ///
1803    /// `'label: for await? pat in iter { block }`
1804    ///
1805    /// This is desugared to a combination of `loop` and `match` expressions.
1806    ForLoop(Box<ForLoop>),
1807    /// Conditionless loop (can be exited with `break`, `continue`, or `return`).
1808    ///
1809    /// `'label: loop { block }`
1810    Loop(Box<Block>, Option<Label>, Span),
1811    /// A `match` block.
1812    Match(Box<Expr>, ThinVec<Arm>, MatchKind),
1813    /// A closure (e.g., `move |a, b, c| a + b + c`).
1814    Closure(Box<Closure>),
1815    /// A block (`'label: { ... }`).
1816    Block(Box<Block>, Option<Label>),
1817    /// An `async` block (`async move { ... }`),
1818    /// or a `gen` block (`gen move { ... }`).
1819    ///
1820    /// The span is the "decl", which is the header before the body `{ }`
1821    /// including the `async`/`gen` keywords and possibly `move`.
1822    Gen(CaptureBy, Box<Block>, CoroutineKind, Span),
1823    /// An await expression (`my_future.await`). Span is of await keyword.
1824    Await(Box<Expr>, Span),
1825    /// A use expression (`x.use`). Span is of use keyword.
1826    Use(Box<Expr>, Span),
1827
1828    /// A try block (`try { ... }`), if the type is `None`, or
1829    /// A try block (`try bikeshed Ty { ... }`) if the type is `Some`.
1830    ///
1831    /// Note that `try bikeshed` is a *deliberately ridiculous* placeholder
1832    /// syntax to avoid deciding what keyword or symbol should go there.
1833    /// It's that way for experimentation only; an RFC to decide the final
1834    /// semantics and syntax would be needed to put it on stabilization-track.
1835    TryBlock(Box<Block>, Option<Box<Ty>>),
1836
1837    /// An assignment (`a = foo()`).
1838    /// The `Span` argument is the span of the `=` token.
1839    Assign(Box<Expr>, Box<Expr>, Span),
1840    /// An assignment with an operator.
1841    ///
1842    /// E.g., `a += 1`.
1843    AssignOp(AssignOp, Box<Expr>, Box<Expr>),
1844    /// Access of a named (e.g., `obj.foo`) or unnamed (e.g., `obj.0`) struct field.
1845    Field(Box<Expr>, Ident),
1846    /// An indexing operation (e.g., `foo[2]`).
1847    /// The span represents the span of the `[2]`, including brackets.
1848    Index(Box<Expr>, Box<Expr>, Span),
1849    /// A range (e.g., `1..2`, `1..`, `..2`, `1..=2`, `..=2`; and `..` in destructuring assignment).
1850    Range(Option<Box<Expr>>, Option<Box<Expr>>, RangeLimits),
1851    /// An underscore, used in destructuring assignment to ignore a value.
1852    Underscore,
1853
1854    /// Variable reference, possibly containing `::` and/or type
1855    /// parameters (e.g., `foo::bar::<baz>`).
1856    ///
1857    /// Optionally "qualified" (e.g., `<Vec<T> as SomeTrait>::SomeType`).
1858    Path(Option<Box<QSelf>>, Path),
1859
1860    /// A referencing operation (`&a`, `&mut a`, `&raw const a` or `&raw mut a`).
1861    AddrOf(BorrowKind, Mutability, Box<Expr>),
1862    /// A `break`, with an optional label to break, and an optional expression.
1863    Break(Option<Label>, Option<Box<Expr>>),
1864    /// A `continue`, with an optional label.
1865    Continue(Option<Label>),
1866    /// A `return`, with an optional value to be returned.
1867    Ret(Option<Box<Expr>>),
1868
1869    /// Output of the `asm!()` macro.
1870    InlineAsm(Box<InlineAsm>),
1871
1872    /// An `offset_of` expression (e.g., `builtin # offset_of(Struct, field)`).
1873    ///
1874    /// Usually not written directly in user code but
1875    /// indirectly via the macro `core::mem::offset_of!(...)`.
1876    OffsetOf(Box<Ty>, ThinVec<Ident>),
1877
1878    /// A macro invocation; pre-expansion.
1879    MacCall(Box<MacCall>),
1880
1881    /// A struct literal expression.
1882    ///
1883    /// E.g., `Foo {x: 1, y: 2}`, or `Foo {x: 1, .. rest}`.
1884    Struct(Box<StructExpr>),
1885
1886    /// An array literal constructed from one repeated element.
1887    ///
1888    /// E.g., `[1; 5]`. The expression is the element to be
1889    /// repeated; the constant is the number of times to repeat it.
1890    Repeat(Box<Expr>, AnonConst),
1891
1892    /// No-op: used solely so we can pretty-print faithfully.
1893    Paren(Box<Expr>),
1894
1895    /// A try expression (`expr?`).
1896    Try(Box<Expr>),
1897
1898    /// A `yield`, with an optional value to be yielded.
1899    Yield(YieldKind),
1900
1901    /// A `do yeet` (aka `throw`/`fail`/`bail`/`raise`/whatever),
1902    /// with an optional value to be returned.
1903    Yeet(Option<Box<Expr>>),
1904
1905    /// A tail call return, with the value to be returned.
1906    ///
1907    /// While `.0` must be a function call, we check this later, after parsing.
1908    Become(Box<Expr>),
1909
1910    /// Bytes included via `include_bytes!`
1911    ///
1912    /// Added for optimization purposes to avoid the need to escape
1913    /// large binary blobs - should always behave like [`ExprKind::Lit`]
1914    /// with a `ByteStr` literal.
1915    ///
1916    /// The value is stored as a `ByteSymbol`. It's unfortunate that we need to
1917    /// intern (hash) the bytes because they're likely to be large and unique.
1918    /// But it's necessary because this will eventually be lowered to
1919    /// `LitKind::ByteStr`, which needs a `ByteSymbol` to impl `Copy` and avoid
1920    /// arena allocation.
1921    IncludedBytes(ByteSymbol),
1922
1923    /// A `format_args!()` expression.
1924    FormatArgs(Box<FormatArgs>),
1925
1926    UnsafeBinderCast(UnsafeBinderCastKind, Box<Expr>, Option<Box<Ty>>),
1927
1928    /// An mGCA `gca!()` expression.
1929    GcaMacro(Box<Expr>),
1930
1931    /// Placeholder for an expression that wasn't syntactically well formed in some way.
1932    Err(ErrorGuaranteed),
1933
1934    /// Acts as a null expression. Lowering it will always emit a bug.
1935    Dummy,
1936}
1937
1938/// Used to differentiate between `for` loops and `for await` loops.
1939#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for ForLoopKind { }
#[automatically_derived]
impl ::core::clone::Clone for ForLoopKind {
    #[inline]
    fn clone(&self) -> Self { *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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ForLoopKind { }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)]
1940pub enum ForLoopKind {
1941    For,
1942    ForAwait,
1943}
1944
1945#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for CoroutineKind { }
#[automatically_derived]
impl ::core::clone::Clone for CoroutineKind {
    #[inline]
    fn clone(&self) -> Self { *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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for CoroutineKind { }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)]
1946pub enum CoroutineKind {
1947    Async,
1948    Gen,
1949    AsyncGen,
1950}
1951
1952impl fmt::Display for CoroutineKind {
1953    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1954        self.as_str().fmt(f)
1955    }
1956}
1957
1958impl CoroutineKind {
1959    /// Matches `Gen` and `AsyncGen`.
1960    pub fn is_gen(&self) -> bool {
1961        match self {
1962            CoroutineKind::Async => false,
1963            CoroutineKind::Gen | CoroutineKind::AsyncGen => true,
1964        }
1965    }
1966
1967    pub fn as_str(&self) -> &'static str {
1968        match self {
1969            CoroutineKind::Async => "async",
1970            CoroutineKind::Gen => "gen",
1971            CoroutineKind::AsyncGen => "async gen",
1972        }
1973    }
1974}
1975
1976/// Whether we're unwrapping or wrapping an unsafe binder
1977#[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) -> Self { *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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for UnsafeBinderCastKind { }Eq, #[automatically_derived]
impl ::core::hash::Hash for UnsafeBinderCastKind {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
            state)
    }
}Hash)]
1978#[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)]
1979pub enum UnsafeBinderCastKind {
1980    // e.g. `&i32` -> `unsafe<'a> &'a i32`
1981    Wrap,
1982    // e.g. `unsafe<'a> &'a i32` -> `&i32`
1983    Unwrap,
1984}
1985
1986/// The explicit `Self` type in a "qualified path".
1987///
1988/// The actual path, including the trait and the associated item, is stored
1989/// separately. `position` represents the index of the associated
1990/// item qualified with this `Self` type.
1991///
1992/// ```ignore (only-for-syntax-highlight)
1993/// <Vec<T> as a::b::Trait>::AssociatedItem
1994///  ^~~~~     ~~~~~~~~~~~~~~^
1995///  ty        position = 3
1996///
1997/// <Vec<T>>::AssociatedItem
1998///  ^~~~~    ^
1999///  ty       position = 0
2000/// ```
2001#[derive(#[automatically_derived]
impl ::core::clone::Clone for QSelf {
    #[inline]
    fn clone(&self) -> Self {
        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)]
2002pub struct QSelf {
2003    pub ty: Box<Ty>,
2004
2005    /// The span of `a::b::Trait` in a path like `<Vec<T> as
2006    /// a::b::Trait>::AssociatedItem`; in the case where `position ==
2007    /// 0`, this is an empty span.
2008    pub path_span: Span,
2009    pub position: usize,
2010}
2011
2012/// A capture clause used in closures and `async` blocks.
2013#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for CaptureBy { }
#[automatically_derived]
impl ::core::clone::Clone for CaptureBy {
    #[inline]
    fn clone(&self) -> Self {
        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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Value { move_kw: __self_0 }, Self::Value {
                    move_kw: __arg1_0 }) => __self_0 == __arg1_0,
                (Self::Use { use_kw: __self_0 }, Self::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 {
            Self::Value { move_kw: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Value",
                    "move_kw", &__self_0),
            Self::Ref => ::core::fmt::Formatter::write_str(f, "Ref"),
            Self::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)]
2014pub enum CaptureBy {
2015    /// `move |x| y + x`.
2016    Value {
2017        /// The span of the `move` keyword.
2018        move_kw: Span,
2019    },
2020    /// `move` or `use` keywords were not specified.
2021    Ref,
2022    /// `use |x| y + x`.
2023    ///
2024    /// Note that if you have a regular closure like `|| x.use`, this will *not* result
2025    /// in a `Use` capture. Instead, the `ExprUseVisitor` will look at the type
2026    /// of `x` and treat `x.use` as either a copy/clone/move as appropriate.
2027    Use {
2028        /// The span of the `use` keyword.
2029        use_kw: Span,
2030    },
2031}
2032
2033/// Closure lifetime binder, `for<'a, 'b>` in `for<'a, 'b> |_: &'a (), _: &'b ()|`.
2034#[derive(#[automatically_derived]
impl ::core::clone::Clone for ClosureBinder {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::NotPresent => ClosureBinder::NotPresent,
            Self::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 {
            Self::NotPresent =>
                ::core::fmt::Formatter::write_str(f, "NotPresent"),
            Self::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)]
2035pub enum ClosureBinder {
2036    /// The binder is not present, all closure lifetimes are inferred.
2037    NotPresent,
2038    /// The binder is present.
2039    For {
2040        /// Span of the whole `for<>` clause
2041        ///
2042        /// ```text
2043        /// for<'a, 'b> |_: &'a (), _: &'b ()| { ... }
2044        /// ^^^^^^^^^^^ -- this
2045        /// ```
2046        span: Span,
2047
2048        /// Lifetimes in the `for<>` closure
2049        ///
2050        /// ```text
2051        /// for<'a, 'b> |_: &'a (), _: &'b ()| { ... }
2052        ///     ^^^^^^ -- this
2053        /// ```
2054        generic_params: ThinVec<GenericParam>,
2055    },
2056}
2057
2058/// Represents a macro invocation. The `path` indicates which macro
2059/// is being invoked, and the `args` are arguments passed to it.
2060#[derive(#[automatically_derived]
impl ::core::clone::Clone for MacCall {
    #[inline]
    fn clone(&self) -> Self {
        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)]
2061pub struct MacCall {
2062    pub path: Path,
2063    pub args: Box<DelimArgs>,
2064}
2065
2066impl MacCall {
2067    pub fn span(&self) -> Span {
2068        self.path.span.to(self.args.dspan.entire())
2069    }
2070}
2071
2072/// Arguments passed to an attribute macro.
2073#[derive(#[automatically_derived]
impl ::core::clone::Clone for AttrArgs {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Empty => AttrArgs::Empty,
            Self::Delimited(__self_0) =>
                AttrArgs::Delimited(::core::clone::Clone::clone(__self_0)),
            Self::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 {
            Self::Empty => ::core::fmt::Formatter::write_str(f, "Empty"),
            Self::Delimited(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Delimited", &__self_0),
            Self::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)]
2074pub enum AttrArgs {
2075    /// No arguments: `#[attr]`.
2076    Empty,
2077    /// Delimited arguments: `#[attr()/[]/{}]`.
2078    Delimited(DelimArgs),
2079    /// Arguments of a key-value attribute: `#[attr = "value"]`.
2080    Eq {
2081        /// Span of the `=` token.
2082        eq_span: Span,
2083        expr: Box<Expr>,
2084    },
2085}
2086
2087impl AttrArgs {
2088    pub fn span(&self) -> Option<Span> {
2089        match self {
2090            AttrArgs::Empty => None,
2091            AttrArgs::Delimited(args) => Some(args.dspan.entire()),
2092            AttrArgs::Eq { eq_span, expr } => Some(eq_span.to(expr.span)),
2093        }
2094    }
2095
2096    /// Tokens inside the delimiters or after `=`.
2097    /// Proc macros see these tokens, for example.
2098    pub fn inner_tokens(&self) -> TokenStream {
2099        match self {
2100            AttrArgs::Empty => TokenStream::default(),
2101            AttrArgs::Delimited(args) => args.tokens.clone(),
2102            AttrArgs::Eq { expr, .. } => TokenStream::from_ast(expr),
2103        }
2104    }
2105}
2106
2107/// Delimited arguments, as used in `#[attr()/[]/{}]` or `mac!()/[]/{}`.
2108#[derive(#[automatically_derived]
impl ::core::clone::Clone for DelimArgs {
    #[inline]
    fn clone(&self) -> Self {
        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)]
2109pub struct DelimArgs {
2110    pub dspan: DelimSpan,
2111    pub delim: Delimiter, // Note: `Delimiter::Invisible` never occurs
2112    pub tokens: TokenStream,
2113}
2114
2115impl DelimArgs {
2116    /// Whether a macro with these arguments needs a semicolon
2117    /// when used as a standalone item or statement.
2118    pub fn need_semicolon(&self) -> bool {
2119        !#[allow(non_exhaustive_omitted_patterns)] match self {
    DelimArgs { delim: Delimiter::Brace, .. } => true,
    _ => false,
}matches!(self, DelimArgs { delim: Delimiter::Brace, .. })
2120    }
2121}
2122
2123/// Represents a macro definition.
2124#[derive(#[automatically_derived]
impl ::core::clone::Clone for MacroDef {
    #[inline]
    fn clone(&self) -> Self {
        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)]
2125pub struct MacroDef {
2126    pub body: Box<DelimArgs>,
2127    /// `true` if macro was defined with `macro_rules`.
2128    pub macro_rules: bool,
2129
2130    /// Corresponds to `#[eii_declaration(...)]`.
2131    /// `#[eii_declaration(...)]` is a built-in attribute macro, not a built-in attribute,
2132    /// because we require some name resolution to occur in the parameters of this attribute.
2133    /// Name resolution isn't possible in attributes otherwise, so we encode it in the AST.
2134    /// During ast lowering, we turn it back into an attribute again
2135    pub eii_declaration: Option<EiiDecl>,
2136}
2137
2138#[derive(#[automatically_derived]
impl ::core::clone::Clone for EiiDecl {
    #[inline]
    fn clone(&self) -> Self {
        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)]
2139pub struct EiiDecl {
2140    /// path to the extern item we're targeting
2141    pub foreign_item: Path,
2142    pub impl_unsafe: bool,
2143}
2144
2145#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for StrStyle { }
#[automatically_derived]
impl ::core::clone::Clone for StrStyle {
    #[inline]
    fn clone(&self) -> Self {
        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 {
            Self::Cooked => ::core::fmt::Formatter::write_str(f, "Cooked"),
            Self::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) {
        ::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
            state);
        match self {
            Self::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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Raw(__self_0), Self::Raw(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq)]
2146#[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)]
2147pub enum StrStyle {
2148    /// A regular string, like `"foo"`.
2149    Cooked,
2150    /// A raw string, like `r##"foo"##`.
2151    ///
2152    /// The value is the number of `#` symbols used.
2153    Raw(u8),
2154}
2155
2156/// The kind of match expression
2157#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for MatchKind { }
#[automatically_derived]
impl ::core::clone::Clone for MatchKind {
    #[inline]
    fn clone(&self) -> Self { *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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}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)]
2158pub enum MatchKind {
2159    /// match expr { ... }
2160    Prefix,
2161    /// expr.match { ... }
2162    Postfix,
2163}
2164
2165/// The kind of yield expression
2166#[derive(#[automatically_derived]
impl ::core::clone::Clone for YieldKind {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Prefix(__self_0) =>
                YieldKind::Prefix(::core::clone::Clone::clone(__self_0)),
            Self::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 {
            Self::Prefix(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Prefix",
                    &__self_0),
            Self::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)]
2167pub enum YieldKind {
2168    /// yield expr { ... }
2169    Prefix(Option<Box<Expr>>),
2170    /// expr.yield { ... }
2171    Postfix(Box<Expr>),
2172}
2173
2174impl YieldKind {
2175    /// Returns the expression inside the yield expression, if any.
2176    ///
2177    /// For postfix yields, this is guaranteed to be `Some`.
2178    pub const fn expr(&self) -> Option<&Box<Expr>> {
2179        match self {
2180            YieldKind::Prefix(expr) => expr.as_ref(),
2181            YieldKind::Postfix(expr) => Some(expr),
2182        }
2183    }
2184
2185    /// Returns a mutable reference to the expression being yielded, if any.
2186    pub const fn expr_mut(&mut self) -> Option<&mut Box<Expr>> {
2187        match self {
2188            YieldKind::Prefix(expr) => expr.as_mut(),
2189            YieldKind::Postfix(expr) => Some(expr),
2190        }
2191    }
2192
2193    /// Returns true if both yields are prefix or both are postfix.
2194    pub const fn same_kind(&self, other: &Self) -> bool {
2195        match (self, other) {
2196            (YieldKind::Prefix(_), YieldKind::Prefix(_)) => true,
2197            (YieldKind::Postfix(_), YieldKind::Postfix(_)) => true,
2198            _ => false,
2199        }
2200    }
2201}
2202
2203/// A literal in a meta item.
2204#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for MetaItemLit { }
#[automatically_derived]
impl ::core::clone::Clone for MetaItemLit {
    #[inline]
    fn clone(&self) -> Self {
        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)]
2205pub struct MetaItemLit {
2206    /// The original literal as written in the source code.
2207    pub symbol: Symbol,
2208    /// The original suffix as written in the source code.
2209    pub suffix: Option<Symbol>,
2210    /// The "semantic" representation of the literal lowered from the original tokens.
2211    /// Strings are unescaped, hexadecimal forms are eliminated, etc.
2212    pub kind: LitKind,
2213    pub span: Span,
2214}
2215
2216/// Similar to `MetaItemLit`, but restricted to string literals.
2217#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for StrLit { }
#[automatically_derived]
impl ::core::clone::Clone for StrLit {
    #[inline]
    fn clone(&self) -> Self {
        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)]
2218pub struct StrLit {
2219    /// The original literal as written in source code.
2220    pub symbol: Symbol,
2221    /// The original suffix as written in source code.
2222    pub suffix: Option<Symbol>,
2223    /// The semantic (unescaped) representation of the literal.
2224    pub symbol_unescaped: Symbol,
2225    pub style: StrStyle,
2226    pub span: Span,
2227}
2228
2229impl StrLit {
2230    pub fn as_token_lit(&self) -> token::Lit {
2231        let token_kind = match self.style {
2232            StrStyle::Cooked => token::Str,
2233            StrStyle::Raw(n) => token::StrRaw(n),
2234        };
2235        token::Lit::new(token_kind, self.symbol, self.suffix)
2236    }
2237}
2238
2239/// Type of the integer literal based on provided suffix.
2240#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for LitIntType { }
#[automatically_derived]
impl ::core::clone::Clone for LitIntType {
    #[inline]
    fn clone(&self) -> Self {
        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 {
            Self::Signed(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Signed",
                    &__self_0),
            Self::Unsigned(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Unsigned", &__self_0),
            Self::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) {
        ::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
            state);
        match self {
            Self::Signed(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            Self::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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Signed(__self_0), Self::Signed(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::Unsigned(__self_0), Self::Unsigned(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq)]
2241#[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)]
2242pub enum LitIntType {
2243    /// e.g. `42_i32`.
2244    Signed(IntTy),
2245    /// e.g. `42_u32`.
2246    Unsigned(UintTy),
2247    /// e.g. `42`.
2248    Unsuffixed,
2249}
2250
2251/// Type of the float literal based on provided suffix.
2252#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for LitFloatType { }
#[automatically_derived]
impl ::core::clone::Clone for LitFloatType {
    #[inline]
    fn clone(&self) -> Self {
        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 {
            Self::Suffixed(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Suffixed", &__self_0),
            Self::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) {
        ::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
            state);
        match self {
            Self::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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Suffixed(__self_0), Self::Suffixed(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq)]
2253#[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)]
2254pub enum LitFloatType {
2255    /// A float literal with a suffix (`1f32` or `1E10f32`).
2256    Suffixed(FloatTy),
2257    /// A float literal without a suffix (`1.0 or 1.0E10`).
2258    Unsuffixed,
2259}
2260
2261/// This type is used within both `ast::MetaItemLit` and `hir::Lit`.
2262///
2263/// Note that the entire literal (including the suffix) is considered when
2264/// deciding the `LitKind`. This means that float literals like `1f32` are
2265/// classified by this type as `Float`. This is different to `token::LitKind`
2266/// which does *not* consider the suffix.
2267#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for LitKind { }
#[automatically_derived]
impl ::core::clone::Clone for LitKind {
    #[inline]
    fn clone(&self) -> Self {
        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 {
            Self::Str(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Str",
                    __self_0, &__self_1),
            Self::ByteStr(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "ByteStr", __self_0, &__self_1),
            Self::CStr(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "CStr",
                    __self_0, &__self_1),
            Self::Byte(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Byte",
                    &__self_0),
            Self::Char(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Char",
                    &__self_0),
            Self::Int(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Int",
                    __self_0, &__self_1),
            Self::Float(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Float",
                    __self_0, &__self_1),
            Self::Bool(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Bool",
                    &__self_0),
            Self::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) {
        ::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
            state);
        match self {
            Self::Str(__self_0, __self_1) => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            Self::ByteStr(__self_0, __self_1) => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            Self::CStr(__self_0, __self_1) => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            Self::Byte(__self_0) => ::core::hash::Hash::hash(__self_0, state),
            Self::Char(__self_0) => ::core::hash::Hash::hash(__self_0, state),
            Self::Int(__self_0, __self_1) => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            Self::Float(__self_0, __self_1) => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            Self::Bool(__self_0) => ::core::hash::Hash::hash(__self_0, state),
            Self::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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Str(__self_0, __self_1), Self::Str(__arg1_0, __arg1_1))
                    => __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (Self::ByteStr(__self_0, __self_1),
                    Self::ByteStr(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (Self::CStr(__self_0, __self_1),
                    Self::CStr(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (Self::Byte(__self_0), Self::Byte(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::Char(__self_0), Self::Char(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::Int(__self_0, __self_1), Self::Int(__arg1_0, __arg1_1))
                    => __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (Self::Float(__self_0, __self_1),
                    Self::Float(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (Self::Bool(__self_0), Self::Bool(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::Err(__self_0), Self::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)]
2268pub enum LitKind {
2269    /// A string literal (`"foo"`). The symbol is unescaped, and so may differ
2270    /// from the original token's symbol.
2271    Str(Symbol, StrStyle),
2272    /// A byte string (`b"foo"`). The symbol is unescaped, and so may differ
2273    /// from the original token's symbol.
2274    ByteStr(ByteSymbol, StrStyle),
2275    /// A C String (`c"foo"`). Guaranteed to only have `\0` at the end. The
2276    /// symbol is unescaped, and so may differ from the original token's
2277    /// symbol.
2278    CStr(ByteSymbol, StrStyle),
2279    /// A byte char (`b'f'`).
2280    Byte(u8),
2281    /// A character literal (`'a'`).
2282    Char(char),
2283    /// An integer literal (`1`).
2284    Int(Pu128, LitIntType),
2285    /// A float literal (`1.0`, `1f64` or `1E10f64`). The pre-suffix part is
2286    /// stored as a symbol rather than `f64` so that `LitKind` can impl `Eq`
2287    /// and `Hash`.
2288    Float(Symbol, LitFloatType),
2289    /// A boolean literal (`true`, `false`).
2290    Bool(bool),
2291    /// Placeholder for a literal that wasn't well-formed in some way.
2292    Err(ErrorGuaranteed),
2293}
2294
2295impl LitKind {
2296    pub fn str(&self) -> Option<Symbol> {
2297        match *self {
2298            LitKind::Str(s, _) => Some(s),
2299            _ => None,
2300        }
2301    }
2302
2303    /// Returns `true` if this literal is a string.
2304    pub fn is_str(&self) -> bool {
2305        #[allow(non_exhaustive_omitted_patterns)] match self {
    LitKind::Str(..) => true,
    _ => false,
}matches!(self, LitKind::Str(..))
2306    }
2307
2308    /// Returns `true` if this literal is byte literal string.
2309    pub fn is_bytestr(&self) -> bool {
2310        #[allow(non_exhaustive_omitted_patterns)] match self {
    LitKind::ByteStr(..) => true,
    _ => false,
}matches!(self, LitKind::ByteStr(..))
2311    }
2312
2313    /// Returns `true` if this is a numeric literal.
2314    pub fn is_numeric(&self) -> bool {
2315        #[allow(non_exhaustive_omitted_patterns)] match self {
    LitKind::Int(..) | LitKind::Float(..) => true,
    _ => false,
}matches!(self, LitKind::Int(..) | LitKind::Float(..))
2316    }
2317
2318    /// Returns `true` if this literal has no suffix.
2319    /// Note: this will return true for literals with prefixes such as raw strings and byte strings.
2320    pub fn is_unsuffixed(&self) -> bool {
2321        !self.is_suffixed()
2322    }
2323
2324    /// Returns `true` if this literal has a suffix.
2325    pub fn is_suffixed(&self) -> bool {
2326        match *self {
2327            // suffixed variants
2328            LitKind::Int(_, LitIntType::Signed(..) | LitIntType::Unsigned(..))
2329            | LitKind::Float(_, LitFloatType::Suffixed(..)) => true,
2330            // unsuffixed variants
2331            LitKind::Str(..)
2332            | LitKind::ByteStr(..)
2333            | LitKind::CStr(..)
2334            | LitKind::Byte(..)
2335            | LitKind::Char(..)
2336            | LitKind::Int(_, LitIntType::Unsuffixed)
2337            | LitKind::Float(_, LitFloatType::Unsuffixed)
2338            | LitKind::Bool(..)
2339            | LitKind::Err(_) => false,
2340        }
2341    }
2342}
2343
2344/// Represents a function's signature in a trait declaration,
2345/// trait implementation, or free function.
2346#[derive(#[automatically_derived]
impl ::core::clone::Clone for FnSig {
    #[inline]
    fn clone(&self) -> Self {
        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)]
2347pub struct FnSig {
2348    pub header: FnHeader,
2349    pub decl: Box<FnDecl>,
2350    pub span: Span,
2351}
2352
2353impl FnSig {
2354    /// Return a span encompassing the header, or where to insert it if empty.
2355    pub fn header_span(&self) -> Span {
2356        self.header.span().unwrap_or(self.span.shrink_to_lo())
2357    }
2358
2359    /// The span of the header's safety, or where to insert it if empty.
2360    pub fn safety_span(&self) -> Span {
2361        match self.header.safety {
2362            Safety::Unsafe(span) | Safety::Safe(span) => span,
2363            Safety::Default => {
2364                // Insert after the `coroutine_marker` if available.
2365                if let Some(extern_span) = self.header.ext.span() {
2366                    return extern_span.shrink_to_lo();
2367                }
2368
2369                // Insert right at the front of the signature.
2370                self.header_span().shrink_to_hi()
2371            }
2372        }
2373    }
2374
2375    /// The span of the header's extern, or where to insert it if empty.
2376    pub fn extern_span(&self) -> Span {
2377        self.header.ext.span().unwrap_or(self.safety_span().shrink_to_hi())
2378    }
2379
2380    pub fn as_borrowed(&self) -> BorrowedFnSig<'_> {
2381        BorrowedFnSig { header: self.header, decl: &self.decl, span: self.span }
2382    }
2383}
2384
2385/// A borrowed version of `FnSig`, used to share logic between function declarations and function
2386/// pointer types.
2387#[derive(#[automatically_derived]
impl<'a> ::core::clone::Clone for BorrowedFnSig<'a> {
    #[inline]
    fn clone(&self) -> Self {
        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)]
2388pub struct BorrowedFnSig<'a> {
2389    pub header: FnHeader,
2390    pub decl: &'a FnDecl,
2391    pub span: Span,
2392}
2393
2394/// A constraint on an associated item.
2395///
2396/// ### Examples
2397///
2398/// * the `A = Ty` and `B = Ty` in `Trait<A = Ty, B = Ty>`
2399/// * the `G<Ty> = Ty` in `Trait<G<Ty> = Ty>`
2400/// * the `A: Bound` in `Trait<A: Bound>`
2401/// * the `RetTy` in `Trait(ArgTy, ArgTy) -> RetTy`
2402/// * the `C = { Ct }` in `Trait<C = { Ct }>` (feature `gca_min_const_items`)
2403/// * the `f(..): Bound` in `Trait<f(..): Bound>` (feature `return_type_notation`)
2404#[derive(#[automatically_derived]
impl ::core::clone::Clone for AssocItemConstraint {
    #[inline]
    fn clone(&self) -> Self {
        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)]
2405pub struct AssocItemConstraint {
2406    pub id: NodeId,
2407    pub ident: Ident,
2408    pub gen_args: Option<GenericArgs>,
2409    pub kind: AssocItemConstraintKind,
2410    pub span: Span,
2411}
2412
2413#[derive(#[automatically_derived]
impl ::core::clone::Clone for Term {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Ty(__self_0) =>
                Term::Ty(::core::clone::Clone::clone(__self_0)),
            Self::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 {
            Self::Ty(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Ty",
                    &__self_0),
            Self::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)]
2414pub enum Term {
2415    Ty(Box<Ty>),
2416    Const(AnonConst),
2417}
2418
2419impl From<Box<Ty>> for Term {
2420    fn from(v: Box<Ty>) -> Self {
2421        Term::Ty(v)
2422    }
2423}
2424
2425impl From<AnonConst> for Term {
2426    fn from(v: AnonConst) -> Self {
2427        Term::Const(v)
2428    }
2429}
2430
2431/// The kind of [associated item constraint][AssocItemConstraint].
2432#[derive(#[automatically_derived]
impl ::core::clone::Clone for AssocItemConstraintKind {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Equality { term: __self_0 } =>
                AssocItemConstraintKind::Equality {
                    term: ::core::clone::Clone::clone(__self_0),
                },
            Self::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 {
            Self::Equality { term: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "Equality", "term", &__self_0),
            Self::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)]
2433pub enum AssocItemConstraintKind {
2434    /// An equality constraint for an associated item (e.g., `AssocTy = Ty` in `Trait<AssocTy = Ty>`).
2435    ///
2436    /// Also known as an *associated item binding* (we *bind* an associated item to a term).
2437    ///
2438    /// Furthermore, associated type equality constraints can also be referred to as *associated type
2439    /// bindings*. Similarly with associated const equality constraints and *associated const bindings*.
2440    Equality { term: Term },
2441    /// A bound on an associated type (e.g., `AssocTy: Bound` in `Trait<AssocTy: Bound>`).
2442    Bound {
2443        #[visitable(extra = BoundKind::Bound)]
2444        bounds: GenericBounds,
2445    },
2446}
2447
2448#[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)]
2449pub struct Ty {
2450    pub id: NodeId,
2451    pub kind: TyKind,
2452    pub span: Span,
2453}
2454
2455impl Clone for Ty {
2456    fn clone(&self) -> Self {
2457        Self { id: self.id, kind: self.kind.clone(), span: self.span }
2458    }
2459}
2460
2461impl From<Box<Ty>> for Ty {
2462    fn from(value: Box<Ty>) -> Self {
2463        *value
2464    }
2465}
2466
2467impl Ty {
2468    pub fn peel_refs(&self) -> &Self {
2469        let mut final_ty = self;
2470        while let TyKind::Ref(_, ty, _) | TyKind::Ptr(ty, ..) = &final_ty.kind {
2471            final_ty = ty;
2472        }
2473        final_ty
2474    }
2475
2476    pub fn is_maybe_parenthesised_infer(&self) -> bool {
2477        match &self.kind {
2478            TyKind::Infer => true,
2479            TyKind::Paren(inner) => inner.is_maybe_parenthesised_infer(),
2480            _ => false,
2481        }
2482    }
2483}
2484
2485#[derive(#[automatically_derived]
impl ::core::clone::Clone for FnPtrTy {
    #[inline]
    fn clone(&self) -> Self {
        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)]
2486pub struct FnPtrTy {
2487    pub safety: Safety,
2488    pub ext: Extern,
2489    pub generic_params: ThinVec<GenericParam>,
2490    pub decl: Box<FnDecl>,
2491    /// Span of the `[unsafe] [extern] fn(...) -> ...` part, i.e. everything
2492    /// after the generic params (if there are any, e.g. `for<'a>`).
2493    pub decl_span: Span,
2494}
2495
2496impl FnPtrTy {
2497    pub fn header(&self) -> FnHeader {
2498        FnHeader {
2499            constness: Const::No,
2500            coroutine_marker: None,
2501            safety: self.safety,
2502            ext: self.ext,
2503        }
2504    }
2505
2506    pub fn as_borrowed_fn_sig<'a>(&'a self) -> BorrowedFnSig<'a> {
2507        BorrowedFnSig { header: self.header(), decl: &self.decl, span: self.decl_span }
2508    }
2509}
2510
2511#[derive(#[automatically_derived]
impl ::core::clone::Clone for UnsafeBinderTy {
    #[inline]
    fn clone(&self) -> Self {
        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)]
2512pub struct UnsafeBinderTy {
2513    pub generic_params: ThinVec<GenericParam>,
2514    pub inner_ty: Box<Ty>,
2515}
2516
2517/// The various kinds of type recognized by the compiler.
2518//
2519// Adding a new variant? Please update `test_ty` in `tests/ui/macros/stringify.rs`.
2520#[derive(#[automatically_derived]
impl ::core::clone::Clone for TyKind {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Slice(__self_0) =>
                TyKind::Slice(::core::clone::Clone::clone(__self_0)),
            Self::Array(__self_0, __self_1) =>
                TyKind::Array(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::Ptr(__self_0, __self_1) =>
                TyKind::Ptr(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::Ref(__self_0, __self_1, __self_2) =>
                TyKind::Ref(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            Self::PinnedRef(__self_0, __self_1, __self_2) =>
                TyKind::PinnedRef(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            Self::FnPtr(__self_0) =>
                TyKind::FnPtr(::core::clone::Clone::clone(__self_0)),
            Self::UnsafeBinder(__self_0) =>
                TyKind::UnsafeBinder(::core::clone::Clone::clone(__self_0)),
            Self::Never => TyKind::Never,
            Self::Tup(__self_0) =>
                TyKind::Tup(::core::clone::Clone::clone(__self_0)),
            Self::Path(__self_0, __self_1) =>
                TyKind::Path(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::TraitObject(__self_0, __self_1) =>
                TyKind::TraitObject(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::ImplTrait(__self_0, __self_1) =>
                TyKind::ImplTrait(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::Paren(__self_0) =>
                TyKind::Paren(::core::clone::Clone::clone(__self_0)),
            Self::Infer => TyKind::Infer,
            Self::ImplicitSelf => TyKind::ImplicitSelf,
            Self::MacCall(__self_0) =>
                TyKind::MacCall(::core::clone::Clone::clone(__self_0)),
            Self::CVarArgs => TyKind::CVarArgs,
            Self::Pat(__self_0, __self_1) =>
                TyKind::Pat(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::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)),
            Self::View(__self_0, __self_1) =>
                TyKind::View(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::GcaMacro(__self_0) =>
                TyKind::GcaMacro(::core::clone::Clone::clone(__self_0)),
            Self::Dummy => TyKind::Dummy,
            Self::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, ref __binding_1) => { 2usize }
                        TyKind::Ref(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            3usize
                        }
                        TyKind::PinnedRef(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            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::GcaMacro(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, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::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);
                    }
                    TyKind::PinnedRef(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::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::GcaMacro(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),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => {
                        TyKind::Ref(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    4usize => {
                        TyKind::PinnedRef(::rustc_serialize::Decodable::decode(__decoder),
                            ::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::GcaMacro(::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 {
            Self::Slice(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Slice",
                    &__self_0),
            Self::Array(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Array",
                    __self_0, &__self_1),
            Self::Ptr(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Ptr",
                    __self_0, &__self_1),
            Self::Ref(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Ref",
                    __self_0, __self_1, &__self_2),
            Self::PinnedRef(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f,
                    "PinnedRef", __self_0, __self_1, &__self_2),
            Self::FnPtr(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "FnPtr",
                    &__self_0),
            Self::UnsafeBinder(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "UnsafeBinder", &__self_0),
            Self::Never => ::core::fmt::Formatter::write_str(f, "Never"),
            Self::Tup(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Tup",
                    &__self_0),
            Self::Path(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Path",
                    __self_0, &__self_1),
            Self::TraitObject(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "TraitObject", __self_0, &__self_1),
            Self::ImplTrait(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "ImplTrait", __self_0, &__self_1),
            Self::Paren(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Paren",
                    &__self_0),
            Self::Infer => ::core::fmt::Formatter::write_str(f, "Infer"),
            Self::ImplicitSelf =>
                ::core::fmt::Formatter::write_str(f, "ImplicitSelf"),
            Self::MacCall(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "MacCall", &__self_0),
            Self::CVarArgs =>
                ::core::fmt::Formatter::write_str(f, "CVarArgs"),
            Self::Pat(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Pat",
                    __self_0, &__self_1),
            Self::FieldOf(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f,
                    "FieldOf", __self_0, __self_1, &__self_2),
            Self::View(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "View",
                    __self_0, &__self_1),
            Self::GcaMacro(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "GcaMacro", &__self_0),
            Self::Dummy => ::core::fmt::Formatter::write_str(f, "Dummy"),
            Self::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, 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::Ref(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        {
                            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);
                                }
                            }
                        }
                        {
                            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::PinnedRef(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        {
                            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);
                                }
                            }
                        }
                        {
                            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::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::GcaMacro(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, ref mut __binding_1) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                    TyKind::Ref(ref mut __binding_0, ref mut __binding_1,
                        ref mut __binding_2) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, LifetimeCtxt::Ref)
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                    TyKind::PinnedRef(ref mut __binding_0, ref mut __binding_1,
                        ref mut __binding_2) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, LifetimeCtxt::Ref)
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __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::GcaMacro(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)]
2521pub enum TyKind {
2522    /// A variable-length slice (`[T]`).
2523    Slice(Box<Ty>),
2524    /// A fixed length array (`[T; n]`).
2525    Array(Box<Ty>, AnonConst),
2526    /// A raw pointer (`*const T` or `*mut T`).
2527    Ptr(Box<Ty>, Mutability),
2528    /// A reference (`&'a T` or `&'a mut T`).
2529    Ref(#[visitable(extra = LifetimeCtxt::Ref)] Option<Lifetime>, Box<Ty>, Mutability),
2530    /// A pinned reference (`&'a pin const T` or `&'a pin mut T`).
2531    ///
2532    /// Desugars into `Pin<&'a T>` or `Pin<&'a mut T>`.
2533    PinnedRef(#[visitable(extra = LifetimeCtxt::Ref)] Option<Lifetime>, Box<Ty>, Mutability),
2534    /// A function pointer type (e.g., `fn(usize) -> bool`).
2535    FnPtr(Box<FnPtrTy>),
2536    /// An unsafe existential lifetime binder (e.g., `unsafe<'a> &'a ()`).
2537    UnsafeBinder(Box<UnsafeBinderTy>),
2538    /// The never type (`!`).
2539    Never,
2540    /// A tuple (`(A, B, C, D,...)`).
2541    Tup(ThinVec<Box<Ty>>),
2542    /// A path (`module::module::...::Type`), optionally
2543    /// "qualified", e.g., `<Vec<T> as SomeTrait>::SomeType`.
2544    ///
2545    /// Type parameters are stored in the `Path` itself.
2546    Path(Option<Box<QSelf>>, Path),
2547    /// A trait object type `Bound1 + Bound2 + Bound3`
2548    /// where `Bound` is a trait or a lifetime.
2549    TraitObject(#[visitable(extra = BoundKind::TraitObject)] GenericBounds, TraitObjectSyntax),
2550    /// An `impl Bound1 + Bound2 + Bound3` type
2551    /// where `Bound` is a trait or a lifetime.
2552    ///
2553    /// The `NodeId` exists to prevent lowering from having to
2554    /// generate `NodeId`s on the fly, which would complicate
2555    /// the generation of opaque `type Foo = impl Trait` items significantly.
2556    ImplTrait(NodeId, #[visitable(extra = BoundKind::Impl)] GenericBounds),
2557    /// No-op; kept solely so that we can pretty-print faithfully.
2558    Paren(Box<Ty>),
2559    /// This means the type should be inferred instead of it having been
2560    /// specified. This can appear anywhere in a type.
2561    Infer,
2562    /// Inferred type of a `self` or `&self` argument in a method.
2563    ImplicitSelf,
2564    /// A macro in the type position.
2565    MacCall(Box<MacCall>),
2566    /// Placeholder for a `va_list`.
2567    CVarArgs,
2568    /// Pattern types like `pattern_type!(u32 is 1..=)`, which is the same as `NonZero<u32>`,
2569    /// just as part of the type system.
2570    Pat(Box<Ty>, Box<TyPat>),
2571    /// A `field_of` expression (e.g., `builtin # field_of(Struct, field)`).
2572    ///
2573    /// Usually not written directly in user code but indirectly via the macro
2574    /// `core::field::field_of!(...)`.
2575    FieldOf(Box<Ty>, Option<Ident>, Ident),
2576    /// A view of a type. `T.{ field_1, field_2 }`.
2577    View(Box<Ty>, #[visitable(ignore)] ThinVec<Ident>),
2578    /// An mGCA `gca!()` expression.
2579    GcaMacro(Box<Expr>),
2580    /// Sometimes we need a dummy value when no error has occurred.
2581    Dummy,
2582    /// Placeholder for a kind that has failed to be defined.
2583    Err(ErrorGuaranteed),
2584}
2585
2586impl TyKind {
2587    pub fn is_implicit_self(&self) -> bool {
2588        #[allow(non_exhaustive_omitted_patterns)] match self {
    TyKind::ImplicitSelf => true,
    _ => false,
}matches!(self, TyKind::ImplicitSelf)
2589    }
2590
2591    pub fn is_unit(&self) -> bool {
2592        #[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())
2593    }
2594
2595    pub fn is_simple_path(&self) -> Option<Symbol> {
2596        if let TyKind::Path(None, Path { segments, .. }) = &self
2597            && let [segment] = &segments[..]
2598            && segment.args.is_none()
2599        {
2600            Some(segment.ident.name)
2601        } else {
2602            None
2603        }
2604    }
2605
2606    /// Returns `true` if this type is considered a scalar primitive (e.g.,
2607    /// `i32`, `u8`, `bool`, etc).
2608    ///
2609    /// This check is based on **symbol equality** and does **not** remove any
2610    /// path prefixes or references. If a type alias or shadowing is present
2611    /// (e.g., `type i32 = CustomType;`), this method will still return `true`
2612    /// for `i32`, even though it may not refer to the primitive type.
2613    pub fn maybe_scalar(&self) -> bool {
2614        let Some(ty_sym) = self.is_simple_path() else {
2615            // unit type
2616            return self.is_unit();
2617        };
2618        #[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!(
2619            ty_sym,
2620            sym::i8
2621                | sym::i16
2622                | sym::i32
2623                | sym::i64
2624                | sym::i128
2625                | sym::u8
2626                | sym::u16
2627                | sym::u32
2628                | sym::u64
2629                | sym::u128
2630                | sym::f16
2631                | sym::f32
2632                | sym::f64
2633                | sym::f128
2634                | sym::char
2635                | sym::bool
2636        )
2637    }
2638}
2639
2640/// A pattern type pattern.
2641#[derive(#[automatically_derived]
impl ::core::clone::Clone for TyPat {
    #[inline]
    fn clone(&self) -> Self {
        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)]
2642pub struct TyPat {
2643    pub id: NodeId,
2644    pub kind: TyPatKind,
2645    pub span: Span,
2646}
2647
2648/// All the different flavors of pattern that Rust recognizes.
2649//
2650// Adding a new variant? Please update `test_pat` in `tests/ui/macros/stringify.rs`.
2651#[derive(#[automatically_derived]
impl ::core::clone::Clone for TyPatKind {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::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)),
            Self::NotNull => TyPatKind::NotNull,
            Self::Or(__self_0) =>
                TyPatKind::Or(::core::clone::Clone::clone(__self_0)),
            Self::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 {
            Self::Range(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Range",
                    __self_0, __self_1, &__self_2),
            Self::NotNull => ::core::fmt::Formatter::write_str(f, "NotNull"),
            Self::Or(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Or",
                    &__self_0),
            Self::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)]
2652pub enum TyPatKind {
2653    /// A range pattern (e.g., `1...2`, `1..2`, `1..`, `..2`, `1..=2`, `..=2`).
2654    Range(Option<Box<AnonConst>>, Option<Box<AnonConst>>, Spanned<RangeEnd>),
2655
2656    /// A `!null` pattern for raw pointers.
2657    NotNull,
2658
2659    Or(ThinVec<TyPat>),
2660
2661    /// Placeholder for a pattern that wasn't syntactically well formed in some way.
2662    Err(ErrorGuaranteed),
2663}
2664
2665/// Syntax used to declare a trait object.
2666#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for TraitObjectSyntax { }
#[automatically_derived]
impl ::core::clone::Clone for TraitObjectSyntax {
    #[inline]
    fn clone(&self) -> Self { *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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}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)]
2667#[repr(u8)]
2668pub enum TraitObjectSyntax {
2669    // SAFETY: When adding new variants make sure to update the `Tag` impl.
2670    Dyn = 0,
2671    None = 1,
2672}
2673
2674/// SAFETY: `TraitObjectSyntax` only has 3 data-less variants which means
2675/// it can be represented with a `u2`. We use `repr(u8)` to guarantee the
2676/// discriminants of the variants are no greater than `3`.
2677unsafe impl Tag for TraitObjectSyntax {
2678    const BITS: u32 = 2;
2679
2680    fn into_usize(self) -> usize {
2681        self as u8 as usize
2682    }
2683
2684    unsafe fn from_usize(tag: usize) -> Self {
2685        match tag {
2686            0 => TraitObjectSyntax::Dyn,
2687            1 => TraitObjectSyntax::None,
2688            _ => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
2689        }
2690    }
2691}
2692
2693#[derive(#[automatically_derived]
impl ::core::clone::Clone for PreciseCapturingArg {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Lifetime(__self_0) =>
                PreciseCapturingArg::Lifetime(::core::clone::Clone::clone(__self_0)),
            Self::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 {
            Self::Lifetime(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Lifetime", &__self_0),
            Self::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)]
2694pub enum PreciseCapturingArg {
2695    /// Lifetime parameter.
2696    Lifetime(#[visitable(extra = LifetimeCtxt::GenericArg)] Lifetime),
2697    /// Type or const parameter.
2698    Arg(Path, NodeId),
2699}
2700
2701/// Inline assembly operand explicit register or register class.
2702///
2703/// E.g., `"eax"` as in `asm!("mov eax, 2", out("eax") result)`.
2704#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for InlineAsmRegOrRegClass { }
#[automatically_derived]
impl ::core::clone::Clone for InlineAsmRegOrRegClass {
    #[inline]
    fn clone(&self) -> Self {
        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 {
            Self::Reg(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Reg",
                    &__self_0),
            Self::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)]
2705pub enum InlineAsmRegOrRegClass {
2706    Reg(Symbol),
2707    RegClass(Symbol),
2708}
2709
2710#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for InlineAsmOptions { }
#[automatically_derived]
impl ::core::clone::Clone for InlineAsmOptions {
    #[inline]
    fn clone(&self) -> Self {
        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: &Self) -> 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)]
2711pub struct InlineAsmOptions(u16);
2712impl 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! {
2713    impl InlineAsmOptions: u16 {
2714        const PURE            = 1 << 0;
2715        const NOMEM           = 1 << 1;
2716        const READONLY        = 1 << 2;
2717        const PRESERVES_FLAGS = 1 << 3;
2718        const NORETURN        = 1 << 4;
2719        const NOSTACK         = 1 << 5;
2720        const ATT_SYNTAX      = 1 << 6;
2721        const RAW             = 1 << 7;
2722        const MAY_UNWIND      = 1 << 8;
2723    }
2724}
2725
2726impl InlineAsmOptions {
2727    pub const COUNT: usize = Self::all().bits().count_ones() as usize;
2728
2729    pub const GLOBAL_OPTIONS: Self = Self::ATT_SYNTAX.union(Self::RAW);
2730    pub const NAKED_OPTIONS: Self = Self::ATT_SYNTAX.union(Self::RAW);
2731
2732    pub fn human_readable_names(&self) -> Vec<&'static str> {
2733        let mut options = ::alloc::vec::Vec::new()vec![];
2734
2735        if self.contains(InlineAsmOptions::PURE) {
2736            options.push("pure");
2737        }
2738        if self.contains(InlineAsmOptions::NOMEM) {
2739            options.push("nomem");
2740        }
2741        if self.contains(InlineAsmOptions::READONLY) {
2742            options.push("readonly");
2743        }
2744        if self.contains(InlineAsmOptions::PRESERVES_FLAGS) {
2745            options.push("preserves_flags");
2746        }
2747        if self.contains(InlineAsmOptions::NORETURN) {
2748            options.push("noreturn");
2749        }
2750        if self.contains(InlineAsmOptions::NOSTACK) {
2751            options.push("nostack");
2752        }
2753        if self.contains(InlineAsmOptions::ATT_SYNTAX) {
2754            options.push("att_syntax");
2755        }
2756        if self.contains(InlineAsmOptions::RAW) {
2757            options.push("raw");
2758        }
2759        if self.contains(InlineAsmOptions::MAY_UNWIND) {
2760            options.push("may_unwind");
2761        }
2762
2763        options
2764    }
2765}
2766
2767impl std::fmt::Debug for InlineAsmOptions {
2768    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
2769        bitflags::parser::to_writer(self, f)
2770    }
2771}
2772
2773#[derive(#[automatically_derived]
impl ::core::clone::Clone for InlineAsmTemplatePiece {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::String(__self_0) =>
                InlineAsmTemplatePiece::String(::core::clone::Clone::clone(__self_0)),
            Self::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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::String(__self_0), Self::String(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::Placeholder {
                    operand_idx: __self_0, modifier: __self_1, span: __self_2 },
                    Self::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 {
            Self::String(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "String",
                    &__self_0),
            Self::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) {
        ::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
            state);
        match self {
            Self::String(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            Self::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)]
2774pub enum InlineAsmTemplatePiece {
2775    String(Cow<'static, str>),
2776    Placeholder { operand_idx: usize, modifier: Option<char>, span: Span },
2777}
2778
2779impl fmt::Display for InlineAsmTemplatePiece {
2780    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2781        match self {
2782            Self::String(s) => {
2783                for c in s.chars() {
2784                    match c {
2785                        '{' => f.write_str("{{")?,
2786                        '}' => f.write_str("}}")?,
2787                        _ => c.fmt(f)?,
2788                    }
2789                }
2790                Ok(())
2791            }
2792            Self::Placeholder { operand_idx, modifier: Some(modifier), .. } => {
2793                f.write_fmt(format_args!("{{{0}:{1}}}", operand_idx, modifier))write!(f, "{{{operand_idx}:{modifier}}}")
2794            }
2795            Self::Placeholder { operand_idx, modifier: None, .. } => {
2796                f.write_fmt(format_args!("{{{0}}}", operand_idx))write!(f, "{{{operand_idx}}}")
2797            }
2798        }
2799    }
2800}
2801
2802impl InlineAsmTemplatePiece {
2803    /// Rebuilds the asm template string from its pieces.
2804    pub fn to_string(s: &[Self]) -> String {
2805        use fmt::Write;
2806        let mut out = String::new();
2807        for p in s.iter() {
2808            let _ = out.write_fmt(format_args!("{0}", p))write!(out, "{p}");
2809        }
2810        out
2811    }
2812}
2813
2814/// Inline assembly symbol operands get their own AST node that is somewhat
2815/// similar to `AnonConst`.
2816///
2817/// The main difference is that we specifically don't assign it `DefId` in
2818/// `DefCollector`. Instead this is deferred until AST lowering where we
2819/// lower it to an `AnonConst` (for functions) or a `Path` (for statics)
2820/// depending on what the path resolves to.
2821#[derive(#[automatically_derived]
impl ::core::clone::Clone for InlineAsmSym {
    #[inline]
    fn clone(&self) -> Self {
        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)]
2822pub struct InlineAsmSym {
2823    pub id: NodeId,
2824    pub qself: Option<Box<QSelf>>,
2825    pub path: Path,
2826}
2827
2828/// Inline assembly operand.
2829///
2830/// E.g., `out("eax") result` as in `asm!("mov eax, 2", out("eax") result)`.
2831#[derive(#[automatically_derived]
impl ::core::clone::Clone for InlineAsmOperand {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::In { reg: __self_0, expr: __self_1 } =>
                InlineAsmOperand::In {
                    reg: ::core::clone::Clone::clone(__self_0),
                    expr: ::core::clone::Clone::clone(__self_1),
                },
            Self::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),
                },
            Self::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),
                },
            Self::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),
                },
            Self::Const { anon_const: __self_0 } =>
                InlineAsmOperand::Const {
                    anon_const: ::core::clone::Clone::clone(__self_0),
                },
            Self::Sym { sym: __self_0 } =>
                InlineAsmOperand::Sym {
                    sym: ::core::clone::Clone::clone(__self_0),
                },
            Self::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 {
            Self::In { reg: __self_0, expr: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f, "In",
                    "reg", __self_0, "expr", &__self_1),
            Self::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),
            Self::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),
            Self::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),
            Self::Const { anon_const: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Const",
                    "anon_const", &__self_0),
            Self::Sym { sym: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Sym",
                    "sym", &__self_0),
            Self::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)]
2832pub enum InlineAsmOperand {
2833    In {
2834        reg: InlineAsmRegOrRegClass,
2835        expr: Box<Expr>,
2836    },
2837    Out {
2838        reg: InlineAsmRegOrRegClass,
2839        late: bool,
2840        expr: Option<Box<Expr>>,
2841    },
2842    InOut {
2843        reg: InlineAsmRegOrRegClass,
2844        late: bool,
2845        expr: Box<Expr>,
2846    },
2847    SplitInOut {
2848        reg: InlineAsmRegOrRegClass,
2849        late: bool,
2850        in_expr: Box<Expr>,
2851        out_expr: Option<Box<Expr>>,
2852    },
2853    Const {
2854        anon_const: AnonConst,
2855    },
2856    Sym {
2857        sym: InlineAsmSym,
2858    },
2859    Label {
2860        block: Box<Block>,
2861    },
2862}
2863
2864impl InlineAsmOperand {
2865    pub fn reg(&self) -> Option<&InlineAsmRegOrRegClass> {
2866        match self {
2867            Self::In { reg, .. }
2868            | Self::Out { reg, .. }
2869            | Self::InOut { reg, .. }
2870            | Self::SplitInOut { reg, .. } => Some(reg),
2871            Self::Const { .. } | Self::Sym { .. } | Self::Label { .. } => None,
2872        }
2873    }
2874}
2875
2876#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for AsmMacro { }
#[automatically_derived]
impl ::core::clone::Clone for AsmMacro {
    #[inline]
    fn clone(&self) -> Self { *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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for AsmMacro { }Eq)]
2877pub enum AsmMacro {
2878    /// The `asm!` macro
2879    Asm,
2880    /// The `global_asm!` macro
2881    GlobalAsm,
2882    /// The `naked_asm!` macro
2883    NakedAsm,
2884}
2885
2886impl AsmMacro {
2887    pub const fn macro_name(self) -> &'static str {
2888        match self {
2889            AsmMacro::Asm => "asm",
2890            AsmMacro::GlobalAsm => "global_asm",
2891            AsmMacro::NakedAsm => "naked_asm",
2892        }
2893    }
2894
2895    pub const fn is_supported_option(self, option: InlineAsmOptions) -> bool {
2896        match self {
2897            AsmMacro::Asm => true,
2898            AsmMacro::GlobalAsm => InlineAsmOptions::GLOBAL_OPTIONS.contains(option),
2899            AsmMacro::NakedAsm => InlineAsmOptions::NAKED_OPTIONS.contains(option),
2900        }
2901    }
2902
2903    pub const fn diverges(self, options: InlineAsmOptions) -> bool {
2904        match self {
2905            AsmMacro::Asm => options.contains(InlineAsmOptions::NORETURN),
2906            AsmMacro::GlobalAsm => true,
2907            AsmMacro::NakedAsm => true,
2908        }
2909    }
2910}
2911
2912/// Inline assembly.
2913///
2914/// E.g., `asm!("NOP");`.
2915#[derive(#[automatically_derived]
impl ::core::clone::Clone for InlineAsm {
    #[inline]
    fn clone(&self) -> Self {
        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)]
2916pub struct InlineAsm {
2917    pub asm_macro: AsmMacro,
2918    pub template: Vec<InlineAsmTemplatePiece>,
2919    pub template_strs: Box<[(Symbol, Option<Symbol>, Span)]>,
2920    pub operands: Vec<(InlineAsmOperand, Span)>,
2921    pub clobber_abis: Vec<(Symbol, Span)>,
2922    #[visitable(ignore)]
2923    pub options: InlineAsmOptions,
2924    pub line_spans: Vec<Span>,
2925}
2926
2927/// A parameter in a function header.
2928///
2929/// E.g., `bar: usize` as in `fn foo(bar: usize)`.
2930#[derive(#[automatically_derived]
impl ::core::clone::Clone for Param {
    #[inline]
    fn clone(&self) -> Self {
        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),
            has_const_keyword: ::core::clone::Clone::clone(&self.has_const_keyword),
        }
    }
}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,
                        has_const_keyword: 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 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),
                    has_const_keyword: ::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",
                        "has_const_keyword"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.attrs, &self.ty, &self.pat, &self.id, &self.span,
                        &self.is_placeholder, &&self.has_const_keyword];
        ::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,
                        has_const_keyword: 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 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,
                        has_const_keyword: 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)]
2931pub struct Param {
2932    pub attrs: AttrVec,
2933    pub ty: Box<Ty>,
2934    pub pat: Box<Pat>,
2935    pub id: NodeId,
2936    pub span: Span,
2937    pub is_placeholder: bool,
2938    /// Records whether `const` was written before the parameter.
2939    /// This only tracks syntax, not whether it's a valid const generic param.
2940    pub has_const_keyword: bool,
2941}
2942
2943/// Alternative representation for `Arg`s describing `self` parameter of methods.
2944///
2945/// E.g., `&mut self` as in `fn foo(&mut self)`.
2946#[derive(#[automatically_derived]
impl ::core::clone::Clone for SelfKind {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Value(__self_0) =>
                SelfKind::Value(::core::clone::Clone::clone(__self_0)),
            Self::Region(__self_0, __self_1) =>
                SelfKind::Region(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::Pinned(__self_0, __self_1) =>
                SelfKind::Pinned(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::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 {
            Self::Value(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Value",
                    &__self_0),
            Self::Region(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Region",
                    __self_0, &__self_1),
            Self::Pinned(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Pinned",
                    __self_0, &__self_1),
            Self::Explicit(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "Explicit", __self_0, &__self_1),
        }
    }
}Debug)]
2947pub enum SelfKind {
2948    /// `self`, `mut self`
2949    Value(Mutability),
2950    /// `&'lt self`, `&'lt mut self`
2951    Region(Option<Lifetime>, Mutability),
2952    /// `&'lt pin const self`, `&'lt pin mut self`
2953    Pinned(Option<Lifetime>, Mutability),
2954    /// `self: TYPE`, `mut self: TYPE`
2955    Explicit(Box<Ty>, Mutability),
2956}
2957
2958impl SelfKind {
2959    pub fn to_ref_suggestion(&self) -> String {
2960        match self {
2961            SelfKind::Region(None, mutbl) => mutbl.ref_prefix_str().to_string(),
2962            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()),
2963            SelfKind::Pinned(None, mutbl) => ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("&pin {0}", mutbl.ptr_str()))
    })format!("&pin {}", mutbl.ptr_str()),
2964            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()),
2965            SelfKind::Value(_) | SelfKind::Explicit(_, _) => {
2966                {
    ::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")
2967            }
2968        }
2969    }
2970}
2971
2972pub type ExplicitSelf = Spanned<SelfKind>;
2973
2974impl Param {
2975    /// Attempts to cast parameter to `ExplicitSelf`.
2976    pub fn to_self(&self) -> Option<ExplicitSelf> {
2977        if let PatKind::Ident(BindingMode(ByRef::No, mutbl), ident, _) = self.pat.kind {
2978            if ident.name == kw::SelfLower {
2979                return match self.ty.kind {
2980                    TyKind::ImplicitSelf => Some(respan(self.pat.span, SelfKind::Value(mutbl))),
2981                    TyKind::Ref(lt, ref ty, mutbl) if ty.kind.is_implicit_self() => {
2982                        Some(respan(self.pat.span, SelfKind::Region(lt, mutbl)))
2983                    }
2984                    TyKind::PinnedRef(lt, ref ty, mutbl) if ty.kind.is_implicit_self() => {
2985                        Some(respan(self.pat.span, SelfKind::Pinned(lt, mutbl)))
2986                    }
2987                    _ => Some(respan(
2988                        self.pat.span.to(self.ty.span),
2989                        SelfKind::Explicit(self.ty.clone(), mutbl),
2990                    )),
2991                };
2992            }
2993        }
2994        None
2995    }
2996
2997    /// Returns `true` if parameter is `self`.
2998    pub fn is_self(&self) -> bool {
2999        if let PatKind::Ident(_, ident, _) = self.pat.kind {
3000            ident.name == kw::SelfLower
3001        } else {
3002            false
3003        }
3004    }
3005
3006    /// Builds a `Param` object from `ExplicitSelf`.
3007    pub fn from_self(attrs: AttrVec, eself: ExplicitSelf, eself_ident: Ident) -> Param {
3008        let span = eself.span.to(eself_ident.span);
3009        let infer_ty =
3010            Box::new(Ty { id: DUMMY_NODE_ID, kind: TyKind::ImplicitSelf, span: eself_ident.span });
3011        let (mutbl, ty) = match eself.node {
3012            SelfKind::Explicit(ty, mutbl) => (mutbl, ty),
3013            SelfKind::Value(mutbl) => (mutbl, infer_ty),
3014            SelfKind::Region(lt, mutbl) => (
3015                Mutability::Not,
3016                Box::new(Ty { id: DUMMY_NODE_ID, kind: TyKind::Ref(lt, infer_ty, mutbl), span }),
3017            ),
3018            SelfKind::Pinned(lt, mutbl) => (
3019                Mutability::Not,
3020                Box::new(Ty {
3021                    id: DUMMY_NODE_ID,
3022                    kind: TyKind::PinnedRef(lt, infer_ty, mutbl),
3023                    span,
3024                }),
3025            ),
3026        };
3027        Param {
3028            attrs,
3029            pat: Box::new(Pat {
3030                id: DUMMY_NODE_ID,
3031                kind: PatKind::Ident(BindingMode(ByRef::No, mutbl), eself_ident, None),
3032                span,
3033            }),
3034            span,
3035            ty,
3036            id: DUMMY_NODE_ID,
3037            is_placeholder: false,
3038            has_const_keyword: false,
3039        }
3040    }
3041
3042    /// Returns the ident if this param is a valid arg position const param.
3043    /// Unlike has_const_keyword, this also checks the pats
3044    pub fn const_param_ident(&self) -> Option<Ident> {
3045        if !self.has_const_keyword {
3046            return None;
3047        }
3048
3049        match self.pat.kind {
3050            PatKind::Ident(BindingMode::NONE, ident, None) => Some(ident),
3051            _ => None,
3052        }
3053    }
3054
3055    /// Checks if this is an arg position const param.
3056    /// Use this instead of has_const_keyword, which only checks for the keyword.
3057    pub fn is_const_param(&self) -> bool {
3058        self.const_param_ident().is_some()
3059    }
3060}
3061
3062/// A signature (not the body) of a function declaration.
3063///
3064/// E.g., `fn foo(bar: baz)`.
3065///
3066/// Please note that it's different from `FnHeader` structure
3067/// which contains metadata about function safety, asyncness, constness and ABI.
3068#[derive(#[automatically_derived]
impl ::core::clone::Clone for FnDecl {
    #[inline]
    fn clone(&self) -> Self {
        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)]
3069pub struct FnDecl {
3070    pub inputs: ThinVec<Param>,
3071    pub output: FnRetTy,
3072}
3073
3074impl FnDecl {
3075    pub fn has_self(&self) -> bool {
3076        self.inputs.get(0).is_some_and(Param::is_self)
3077    }
3078
3079    pub fn c_variadic(&self) -> bool {
3080        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))
3081    }
3082
3083    /// The marker index for "no splatted arguments".
3084    /// Higher values are also not supported, for performance reasons.
3085    ///
3086    /// Must have the same value as `FnSigKind::NO_SPLATTED_ARG_INDEX` and `FnDeclFlags::NO_SPLATTED_ARG_INDEX`.
3087    pub const NO_SPLATTED_ARG_INDEX: u8 = u8::MAX;
3088
3089    /// The maximum valid splatted argument index.
3090    pub const MAX_VALID_SPLATTED_ARG_INDEX: u8 = Self::NO_SPLATTED_ARG_INDEX - 1;
3091
3092    /// Returns a splatted argument index, if any are present.
3093    pub fn splatted(&self) -> Option<u8> {
3094        self.inputs.iter().enumerate().find_map(|(index, arg)| {
3095            if index >= usize::from(Self::NO_SPLATTED_ARG_INDEX) {
3096                // AST validation has already checked the splatted argument index is valid, so just
3097                // ignore invalid indexes here.
3098                None
3099            } else {
3100                arg.attrs
3101                    .iter()
3102                    .any(|attr| attr.has_name(sym::rustc_splat))
3103                    .then_some(u8::try_from(index).unwrap())
3104            }
3105        })
3106    }
3107}
3108
3109/// Is the trait definition an auto trait?
3110#[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) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for IsAuto { }
#[automatically_derived]
impl ::core::cmp::PartialEq for IsAuto {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}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)]
3111pub enum IsAuto {
3112    Yes,
3113    No,
3114}
3115
3116/// Safety of items.
3117#[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) -> Self {
        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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Unsafe(__self_0), Self::Unsafe(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::Safe(__self_0), Self::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) {
        ::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
            state);
        match self {
            Self::Unsafe(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            Self::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 {
            Self::Unsafe(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Unsafe",
                    &__self_0),
            Self::Safe(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Safe",
                    &__self_0),
            Self::Default => ::core::fmt::Formatter::write_str(f, "Default"),
        }
    }
}Debug)]
3118#[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)]
3119pub enum Safety {
3120    /// `unsafe` an item is explicitly marked as `unsafe`.
3121    Unsafe(Span),
3122    /// `safe` an item is explicitly marked as `safe`.
3123    Safe(Span),
3124    /// Default means no value was provided, it will take a default value given the context in
3125    /// which is used.
3126    Default,
3127}
3128
3129/// Describes the coroutine markers a function/closure has.
3130///
3131/// Coroutine markers are things that cause the function to generate a coroutine, such as `async`,
3132/// which makes the function return `impl Future`, or `gen`, which makes the function return `impl
3133/// Iterator`.
3134#[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) -> Self {
        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)]
3135pub struct CoroutineMarker {
3136    pub kind: CoroutineKind,
3137    pub span: Span,
3138    pub closure_id: NodeId,
3139    /// The `NodeId` for the generated `impl Trait` item.
3140    pub return_impl_trait_id: NodeId,
3141}
3142
3143impl CoroutineMarker {
3144    pub fn new(kind: CoroutineKind, span: Span) -> Self {
3145        Self { kind, span, closure_id: DUMMY_NODE_ID, return_impl_trait_id: DUMMY_NODE_ID }
3146    }
3147}
3148
3149#[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) -> Self {
        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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Yes(__self_0), Self::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) {
        ::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
            state);
        match self {
            Self::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 {
            Self::Yes(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Yes",
                    &__self_0),
            Self::No => ::core::fmt::Formatter::write_str(f, "No"),
        }
    }
}Debug)]
3150#[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)]
3151pub enum Const {
3152    Yes(Span),
3153    No,
3154}
3155
3156/// Item defaultness.
3157/// For details see the [RFC #2532](https://github.com/rust-lang/rfcs/pull/2532).
3158#[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) -> Self {
        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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Default(__self_0), Self::Default(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::Final(__self_0), Self::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 {
            Self::Implicit =>
                ::core::fmt::Formatter::write_str(f, "Implicit"),
            Self::Default(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Default", &__self_0),
            Self::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)]
3159pub enum Defaultness {
3160    /// Item is unmarked. Implicitly determined based off of position.
3161    /// For impls, this is `final`; for traits, this is `default`.
3162    ///
3163    /// If you're expanding an item in a built-in macro or parsing an item
3164    /// by hand, you probably want to use this.
3165    Implicit,
3166    /// `default`
3167    Default(Span),
3168    /// `final`; per RFC 3678, only trait items may be *explicitly* marked final.
3169    Final(Span),
3170}
3171
3172#[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) -> Self {
        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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Negative(__self_0), Self::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)]
3173pub enum ImplPolarity {
3174    /// `impl Trait for Type`
3175    Positive,
3176    /// `impl !Trait for Type`
3177    Negative(Span),
3178}
3179
3180impl fmt::Debug for ImplPolarity {
3181    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3182        match *self {
3183            ImplPolarity::Positive => "positive".fmt(f),
3184            ImplPolarity::Negative(_) => "negative".fmt(f),
3185        }
3186    }
3187}
3188
3189/// The polarity of a trait bound.
3190#[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) -> Self {
        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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Negative(__self_0), Self::Negative(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::Maybe(__self_0), Self::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 {
            Self::Positive =>
                ::core::fmt::Formatter::write_str(f, "Positive"),
            Self::Negative(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Negative", &__self_0),
            Self::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) {
        ::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
            state);
        match self {
            Self::Negative(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            Self::Maybe(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            _ => {}
        }
    }
}Hash)]
3191#[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)]
3192pub enum BoundPolarity {
3193    /// `Type: Trait`
3194    Positive,
3195    /// `Type: !Trait`
3196    Negative(Span),
3197    /// `Type: ?Trait`
3198    Maybe(Span),
3199}
3200
3201impl BoundPolarity {
3202    pub fn as_str(self) -> &'static str {
3203        match self {
3204            Self::Positive => "",
3205            Self::Negative(_) => "!",
3206            Self::Maybe(_) => "?",
3207        }
3208    }
3209}
3210
3211/// The constness of a trait bound.
3212#[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) -> Self {
        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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Always(__self_0), Self::Always(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::Maybe(__self_0), Self::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 {
            Self::Never => ::core::fmt::Formatter::write_str(f, "Never"),
            Self::Always(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Always",
                    &__self_0),
            Self::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) {
        ::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
            state);
        match self {
            Self::Always(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            Self::Maybe(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            _ => {}
        }
    }
}Hash)]
3213#[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)]
3214pub enum BoundConstness {
3215    /// `Type: Trait`
3216    Never,
3217    /// `Type: const Trait`
3218    Always(Span),
3219    /// `Type: [const] Trait`
3220    Maybe(Span),
3221}
3222
3223impl BoundConstness {
3224    pub fn as_str(self) -> &'static str {
3225        match self {
3226            Self::Never => "",
3227            Self::Always(_) => "const",
3228            Self::Maybe(_) => "[const]",
3229        }
3230    }
3231}
3232
3233/// The asyncness of a trait bound.
3234#[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) -> Self {
        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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Async(__self_0), Self::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 {
            Self::Normal => ::core::fmt::Formatter::write_str(f, "Normal"),
            Self::Async(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Async",
                    &__self_0),
        }
    }
}Debug)]
3235#[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)]
3236pub enum BoundAsyncness {
3237    /// `Type: Trait`
3238    Normal,
3239    /// `Type: async Trait`
3240    Async(Span),
3241}
3242
3243impl BoundAsyncness {
3244    pub fn as_str(self) -> &'static str {
3245        match self {
3246            Self::Normal => "",
3247            Self::Async(_) => "async",
3248        }
3249    }
3250}
3251
3252#[derive(#[automatically_derived]
impl ::core::clone::Clone for FnRetTy {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Default(__self_0) =>
                FnRetTy::Default(::core::clone::Clone::clone(__self_0)),
            Self::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 {
            Self::Default(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Default", &__self_0),
            Self::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)]
3253pub enum FnRetTy {
3254    /// Returns type is not specified.
3255    ///
3256    /// Functions default to `()` and closures default to inference.
3257    /// Span points to where return type would be inserted.
3258    Default(Span),
3259    /// Everything else.
3260    Ty(Box<Ty>),
3261}
3262
3263impl FnRetTy {
3264    pub fn span(&self) -> Span {
3265        match self {
3266            &FnRetTy::Default(span) => span,
3267            FnRetTy::Ty(ty) => ty.span,
3268        }
3269    }
3270}
3271
3272#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Inline { }
#[automatically_derived]
impl ::core::clone::Clone for Inline {
    #[inline]
    fn clone(&self) -> Self {
        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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::No { had_parse_error: __self_0 }, Self::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 {
            Self::Yes => ::core::fmt::Formatter::write_str(f, "Yes"),
            Self::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)]
3273pub enum Inline {
3274    Yes,
3275    No { had_parse_error: Result<(), ErrorGuaranteed> },
3276}
3277
3278/// Module item kind.
3279#[derive(#[automatically_derived]
impl ::core::clone::Clone for ModKind {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::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)),
            Self::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 {
            Self::Loaded(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Loaded",
                    __self_0, __self_1, &__self_2),
            Self::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)]
3280pub enum ModKind {
3281    /// Module with inlined definition `mod foo { ... }`,
3282    /// or with definition outlined to a separate file `mod foo;` and already loaded from it.
3283    /// The inner span is from the first token past `{` to the last token until `}`,
3284    /// or from the first to the last token in the loaded file.
3285    Loaded(ThinVec<Box<Item>>, Inline, ModSpans),
3286    /// Module with definition outlined to a separate file `mod foo;` but not yet loaded from it.
3287    Unloaded,
3288}
3289
3290#[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) -> Self {
        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() -> Self {
        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)]
3291pub struct ModSpans {
3292    /// `inner_span` covers the body of the module; for a file module, its the whole file.
3293    /// For an inline module, its the span inside the `{ ... }`, not including the curly braces.
3294    pub inner_span: Span,
3295    pub inject_use_span: Span,
3296}
3297
3298/// Foreign module declaration.
3299///
3300/// E.g., `extern { .. }` or `extern "C" { .. }`.
3301#[derive(#[automatically_derived]
impl ::core::clone::Clone for ForeignMod {
    #[inline]
    fn clone(&self) -> Self {
        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)]
3302pub struct ForeignMod {
3303    /// Span of the `extern` keyword.
3304    pub extern_span: Span,
3305    /// `unsafe` keyword accepted syntactically for macro DSLs, but not
3306    /// semantically by Rust.
3307    pub safety: Safety,
3308    pub abi: Option<StrLit>,
3309    pub items: ThinVec<Box<ForeignItem>>,
3310}
3311
3312#[derive(#[automatically_derived]
impl ::core::clone::Clone for EnumDef {
    #[inline]
    fn clone(&self) -> Self {
        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)]
3313pub struct EnumDef {
3314    pub variants: ThinVec<Variant>,
3315}
3316
3317/// Enum variant.
3318#[derive(#[automatically_derived]
impl ::core::clone::Clone for Variant {
    #[inline]
    fn clone(&self) -> Self {
        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)]
3319pub struct Variant {
3320    /// Attributes of the variant.
3321    pub attrs: AttrVec,
3322    /// Id of the variant (not the constructor, see `VariantData::ctor_id()`).
3323    pub id: NodeId,
3324    /// Span
3325    pub span: Span,
3326    /// The visibility of the variant. Syntactically accepted but not semantically.
3327    pub vis: Visibility,
3328    /// Name of the variant.
3329    pub ident: Ident,
3330
3331    /// Fields and constructor id of the variant.
3332    pub data: VariantData,
3333    /// Explicit discriminant, e.g., `Foo = 1`.
3334    pub disr_expr: Option<AnonConst>,
3335    /// Is a macro placeholder.
3336    pub is_placeholder: bool,
3337}
3338
3339/// Part of `use` item to the right of its prefix.
3340#[derive(#[automatically_derived]
impl ::core::clone::Clone for UseTreeKind {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Simple(__self_0) =>
                UseTreeKind::Simple(::core::clone::Clone::clone(__self_0)),
            Self::Nested { items: __self_0, span: __self_1 } =>
                UseTreeKind::Nested {
                    items: ::core::clone::Clone::clone(__self_0),
                    span: ::core::clone::Clone::clone(__self_1),
                },
            Self::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 {
            Self::Simple(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Simple",
                    &__self_0),
            Self::Nested { items: __self_0, span: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "Nested", "items", __self_0, "span", &__self_1),
            Self::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)]
3341pub enum UseTreeKind {
3342    /// `use prefix` or `use prefix as rename`
3343    Simple(Option<Ident>),
3344    /// `use prefix::{...}`
3345    ///
3346    /// The span represents the braces of the nested group and all elements within:
3347    ///
3348    /// ```text
3349    /// use foo::{bar, baz};
3350    ///          ^^^^^^^^^^
3351    /// ```
3352    Nested { items: ThinVec<UseTreeAndId>, span: Span },
3353    /// `use prefix::*`
3354    Glob(Span),
3355}
3356
3357/// A tree of paths sharing common prefixes.
3358#[derive(#[automatically_derived]
impl ::core::clone::Clone for UseTree {
    #[inline]
    fn clone(&self) -> Self {
        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)]
3359pub struct UseTree {
3360    pub prefix: Path,
3361    pub kind: UseTreeKind,
3362}
3363
3364impl UseTree {
3365    /// If the `UseTree` is just an identifier, return that.
3366    /// Panics if it's a glob (`*`) or a nested use tree.
3367    pub fn ident(&self) -> Ident {
3368        match self.kind {
3369            UseTreeKind::Simple(Some(rename)) => rename,
3370            UseTreeKind::Simple(None) => {
3371                self.prefix.segments.last().expect("empty prefix in a simple import").ident
3372            }
3373            _ => {
    ::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"),
3374        }
3375    }
3376
3377    /// Returns the full span from the start of the path to the
3378    /// closing `}` or nested spans, `*` of glob spans or the end of the
3379    /// identifier of simple spans.
3380    pub fn span(&self) -> Span {
3381        self.prefix.span.to(self.hi_span())
3382    }
3383
3384    /// Returns the trailing element's span. So for a nested
3385    /// span you get the entire `{}`-block, for a glob you
3386    /// get the span of the `*` itself, and for simple use trees
3387    /// you get the identifier to rename the import to or the full
3388    /// path if no rename is specified.
3389    pub fn hi_span(&self) -> Span {
3390        match self.kind {
3391            UseTreeKind::Simple(None) => self.prefix.span,
3392            UseTreeKind::Simple(Some(name)) => name.span,
3393            UseTreeKind::Nested { span, .. } => span,
3394            UseTreeKind::Glob(span) => span,
3395        }
3396    }
3397}
3398
3399/// Used in nested `use` trees.
3400#[derive(#[automatically_derived]
impl ::core::clone::Clone for UseTreeAndId {
    #[inline]
    fn clone(&self) -> Self {
        UseTreeAndId {
            inner: ::core::clone::Clone::clone(&self.inner),
            id: ::core::clone::Clone::clone(&self.id),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for UseTreeAndId {
            fn encode(&self, __encoder: &mut __E) {
                let UseTreeAndId { inner: ref __binding_0, 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 UseTreeAndId {
            fn decode(__decoder: &mut __D) -> Self {
                UseTreeAndId {
                    inner: ::rustc_serialize::Decodable::decode(__decoder),
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for UseTreeAndId {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "UseTreeAndId",
            "inner", &self.inner, "id", &&self.id)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for UseTreeAndId
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    UseTreeAndId { inner: ref __binding_0, 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 UseTreeAndId where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    UseTreeAndId {
                        inner: ref mut __binding_0, id: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3401pub struct UseTreeAndId {
3402    pub inner: UseTree,
3403    pub id: NodeId,
3404}
3405
3406/// Distinguishes between `Attribute`s that decorate items and Attributes that
3407/// are contained as statements within items. These two cases need to be
3408/// distinguished for pretty-printing.
3409#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for AttrStyle { }
#[automatically_derived]
impl ::core::clone::Clone for AttrStyle {
    #[inline]
    fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for AttrStyle { }
#[automatically_derived]
impl ::core::cmp::PartialEq for AttrStyle {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
            ::core::intrinsics::discriminant_value(other)
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for AttrStyle { }Eq, #[automatically_derived]
impl ::core::hash::Hash for AttrStyle {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
            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)]
3410#[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)]
3411pub enum AttrStyle {
3412    Outer,
3413    Inner,
3414}
3415
3416impl AttrStyle {
3417    pub fn line_doc_comment_prefix(self) -> &'static str {
3418        match self {
3419            AttrStyle::Outer => "///",
3420            AttrStyle::Inner => "//!",
3421        }
3422    }
3423}
3424
3425/// A list of attributes.
3426pub type AttrVec = ThinVec<Attribute>;
3427
3428/// A syntax-level representation of an attribute.
3429#[derive(#[automatically_derived]
impl ::core::clone::Clone for Attribute {
    #[inline]
    fn clone(&self) -> Self {
        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)]
3430pub struct Attribute {
3431    pub kind: AttrKind,
3432    pub id: AttrId,
3433    /// Denotes if the attribute decorates the following construct (outer)
3434    /// or the construct this attribute is contained within (inner).
3435    pub style: AttrStyle,
3436
3437    /// The carets in the examples below show the spans for various cases.
3438    /// ```text
3439    /// #[foo]                  - A vanilla parsed attribute.
3440    /// ^^^^^^                  - Its span covers it all.
3441    ///
3442    /// /** abc */  /// xyz     - A parsed doc comment.
3443    /// ^^^^^^^^^^  ^^^^^^^     - Its span covers the text and comment marker(s).
3444    ///                         - The same span is also used if the doc comment is desugared (into
3445    ///                           a new normal `#[doc = r"..."]` attribute) by
3446    ///                           `desugar_doc_comments` before being passed to a macro (which
3447    ///                           is done so that `#[$m:meta]` will match).
3448    ///
3449    /// #[cfg_attr(pred, foo)]  - A parsed `cfg_attr` attribute.
3450    /// ^^^^^^^^^^^^^^^^^^^^^^  - Its span covers it all.
3451    ///                  ^^^    - Span of the new replacement attribute (equivalent to `#[foo]`)
3452    ///                           created by `cfg_attr` expansion (if `pred` is true).
3453    /// ^^^^^^^^^^^^^^^^^^^^^^  - Span of the synthetic `CfgAttrTrace` attribute created by
3454    ///                           `cfg_attr` expansion. (`CfgTrace` is derived from `#[cfg(..)]` and
3455    ///                           handled similarly.)
3456    /// ```
3457    /// Finally, for compiler-generated attributes the span is whatever the construction site
3458    /// chooses. Usually `DUMMY_SP` or some relevant span from the source code.
3459    pub span: Span,
3460}
3461
3462#[derive(#[automatically_derived]
impl ::core::clone::Clone for AttrKind {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Normal(__self_0) =>
                AttrKind::Normal(::core::clone::Clone::clone(__self_0)),
            Self::Synthetic(__self_0) =>
                AttrKind::Synthetic(::core::clone::Clone::clone(__self_0)),
            Self::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 {
            Self::Normal(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Normal",
                    &__self_0),
            Self::Synthetic(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Synthetic", &__self_0),
            Self::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)]
3463pub enum AttrKind {
3464    /// A normal attribute.
3465    Normal(Box<NormalAttr>),
3466
3467    /// A synthetic attribute inserted by the compiler.
3468    Synthetic(Box<SyntheticAttr>),
3469
3470    /// A doc comment (e.g. `/// ...`, `//! ...`, `/** ... */`, `/*! ... */`).
3471    /// Doc attributes (e.g. `#[doc="..."]`) are represented with the `Normal`
3472    /// variant (which is much less compact and thus more expensive).
3473    DocComment(CommentKind, Symbol),
3474}
3475
3476#[derive(#[automatically_derived]
impl ::core::clone::Clone for NormalAttr {
    #[inline]
    fn clone(&self) -> Self {
        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)]
3477pub struct NormalAttr {
3478    pub item: AttrItem,
3479    // Tokens for the full attribute, e.g. `#[foo]`, `#![bar]`. (Compare this with
3480    // `ParseNtResult::Meta`; `expand_cfg_attr_item` is where the two cases interact.)
3481    pub tokens: Option<LazyAttrTokenStream>,
3482}
3483
3484impl NormalAttr {
3485    pub fn from_ident(ident: Ident) -> Self {
3486        Self {
3487            item: AttrItem {
3488                unsafety: Safety::Default,
3489                path: Path::from_ident(ident),
3490                args: AttrArgs::Empty,
3491                span: ident.span,
3492            },
3493            tokens: None,
3494        }
3495    }
3496}
3497
3498#[derive(#[automatically_derived]
impl ::core::clone::Clone for AttrItem {
    #[inline]
    fn clone(&self) -> Self {
        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)]
3499pub struct AttrItem {
3500    pub unsafety: Safety,
3501    pub path: Path,
3502    pub args: AttrArgs,
3503    /// The span of the entire attr item. For parse attrs this excludes `#[`/`]`. E.g.:
3504    /// ```ignore (illustrative)
3505    /// #[foo(bar)]
3506    ///   ^^^^^^^^
3507    /// #[unsafe(no_mangle)]
3508    ///   ^^^^^^^^^^^^^^^^^
3509    /// ```
3510    /// For internally constructed spans (`mk_attr_*`) the exact meaning may differ.
3511    pub span: Span,
3512}
3513
3514/// A synthetic attribute.
3515///
3516/// Synthetic attributes are inserted by the compiler. They cannot be written in source code, and
3517/// so cannot be pretty-printed by the AST pretty printer (because its output should be valid Rust
3518/// code). They receive special treatment because they must not affect observable language
3519/// behaviour: they are invisible to proc macros and are unable to re-enter the parser.
3520#[derive(#[automatically_derived]
impl ::core::clone::Clone for SyntheticAttr {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::CfgTrace(__self_0) =>
                SyntheticAttr::CfgTrace(::core::clone::Clone::clone(__self_0)),
            Self::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 {
            Self::CfgTrace(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "CfgTrace", &__self_0),
            Self::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)]
3521pub enum SyntheticAttr {
3522    /// This synthetic attribute is added by the compiler when a `cfg` attribute is expanded so that
3523    /// subsequent code can tell that conditional compilation occurred. A `#[cfg(pred)]` with a
3524    /// true predicate is replaced by a synthetic `CfgTrace` attribute that records the parsed
3525    /// predicate. A `#[cfg(pred)]` with a false predicate leaves no trace because there is no node
3526    /// left to annotate.
3527    ///
3528    /// The attribute is used for some diagnostics, by rustdoc (for detecting feature usage), and
3529    /// by some clippy lints.
3530    CfgTrace(CfgEntry),
3531
3532    /// This synthetic attribute is added by the compiler when a `cfg_attr` attribute is expanded so
3533    /// that subsequent code can tell that conditional compilation occurred. A `#[cfg_attr(pred,
3534    /// attrs)]` is replaced by a synthetic `CfgAttrTrace` attribute whether the predicate
3535    /// evaluated true or not (or even failed to parse). The `pred` and `attrs` are not recorded
3536    /// because they are not needed.
3537    ///
3538    /// The attribute is used by rustdoc to display `doc_cfg` information and by some clippy lints.
3539    CfgAttrTrace(CfgEntry),
3540}
3541
3542impl AttrItem {
3543    pub fn is_valid_for_outer_style(&self) -> bool {
3544        self.path == sym::cfg_attr
3545            || self.path == sym::cfg
3546            || self.path == sym::forbid
3547            || self.path == sym::warn
3548            || self.path == sym::allow
3549            || self.path == sym::deny
3550            || self.path == sym::expect
3551    }
3552}
3553
3554/// `TraitRef`s appear in impls.
3555///
3556/// Resolution maps each `TraitRef`'s `ref_id` to its defining trait; that's all
3557/// that the `ref_id` is for. The `impl_id` maps to the "self type" of this impl.
3558/// If this impl is an `ItemKind::Impl`, the `impl_id` is redundant (it could be the
3559/// same as the impl's `NodeId`).
3560#[derive(#[automatically_derived]
impl ::core::clone::Clone for TraitRef {
    #[inline]
    fn clone(&self) -> Self {
        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)]
3561pub struct TraitRef {
3562    pub path: Path,
3563    pub ref_id: NodeId,
3564}
3565
3566/// Whether enclosing parentheses are present or not.
3567#[derive(#[automatically_derived]
impl ::core::clone::Clone for Parens {
    #[inline]
    fn clone(&self) -> Self {
        match self { Self::Yes => Parens::Yes, Self::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)]
3568pub enum Parens {
3569    Yes,
3570    No,
3571}
3572
3573#[derive(#[automatically_derived]
impl ::core::clone::Clone for PolyTraitRef {
    #[inline]
    fn clone(&self) -> Self {
        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)]
3574pub struct PolyTraitRef {
3575    /// The `'a` in `for<'a> Foo<&'a T>`.
3576    pub bound_generic_params: ThinVec<GenericParam>,
3577
3578    // Optional constness, asyncness, or polarity.
3579    pub modifiers: TraitBoundModifiers,
3580
3581    /// The `Foo<&'a T>` in `<'a> Foo<&'a T>`.
3582    pub trait_ref: TraitRef,
3583
3584    pub span: Span,
3585
3586    /// When `Yes`, the first and last character of `span` are an opening
3587    /// and a closing paren respectively.
3588    pub parens: Parens,
3589}
3590
3591impl PolyTraitRef {
3592    pub fn new(
3593        generic_params: ThinVec<GenericParam>,
3594        path: Path,
3595        modifiers: TraitBoundModifiers,
3596        span: Span,
3597        parens: Parens,
3598    ) -> Self {
3599        PolyTraitRef {
3600            bound_generic_params: generic_params,
3601            modifiers,
3602            trait_ref: TraitRef { path, ref_id: DUMMY_NODE_ID },
3603            span,
3604            parens,
3605        }
3606    }
3607}
3608
3609#[derive(#[automatically_derived]
impl ::core::clone::Clone for Visibility {
    #[inline]
    fn clone(&self) -> Self {
        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)]
3610pub struct Visibility {
3611    pub kind: VisibilityKind,
3612    pub span: Span,
3613}
3614
3615#[derive(#[automatically_derived]
impl ::core::clone::Clone for VisibilityKind {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Public => VisibilityKind::Public,
            Self::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),
                },
            Self::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 {
            Self::Public => ::core::fmt::Formatter::write_str(f, "Public"),
            Self::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),
            Self::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)]
3616pub enum VisibilityKind {
3617    Public,
3618    Restricted { path: Box<Path>, id: NodeId, shorthand: bool },
3619    Inherited,
3620}
3621
3622impl VisibilityKind {
3623    pub fn is_pub(&self) -> bool {
3624        #[allow(non_exhaustive_omitted_patterns)] match self {
    VisibilityKind::Public => true,
    _ => false,
}matches!(self, VisibilityKind::Public)
3625    }
3626}
3627
3628#[derive(#[automatically_derived]
impl ::core::clone::Clone for ImplRestriction {
    #[inline]
    fn clone(&self) -> Self {
        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)]
3629pub struct ImplRestriction {
3630    pub kind: RestrictionKind,
3631    pub span: Span,
3632}
3633
3634#[derive(#[automatically_derived]
impl ::core::clone::Clone for MutRestriction {
    #[inline]
    fn clone(&self) -> Self {
        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)]
3635pub struct MutRestriction {
3636    pub kind: RestrictionKind,
3637    /// Note: this span is currently thrown away
3638    /// for [RestrictionKind::Unrestricted] when constructing [FieldDef],
3639    /// to keep its size small. This is not a problem at the moment,
3640    /// because this span is unused, but we will need to refactor
3641    /// [FieldDef] and [FieldDefExtras] to restore it when we need it.
3642    pub span: Span,
3643}
3644
3645#[derive(#[automatically_derived]
impl ::core::clone::Clone for RestrictionKind {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Unrestricted => RestrictionKind::Unrestricted,
            Self::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 {
            Self::Unrestricted =>
                ::core::fmt::Formatter::write_str(f, "Unrestricted"),
            Self::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)]
3646pub enum RestrictionKind {
3647    Unrestricted,
3648    Restricted { path: Box<Path>, id: NodeId, shorthand: bool },
3649}
3650
3651/// Field definition in a struct, variant or union.
3652///
3653/// E.g., `bar: usize` as in `struct Foo { bar: usize }`.
3654#[derive(#[automatically_derived]
impl ::core::clone::Clone for FieldDef {
    #[inline]
    fn clone(&self) -> Self {
        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)]
3655pub struct FieldDef {
3656    pub attrs: AttrVec,
3657    pub id: NodeId,
3658    pub span: Span,
3659    pub vis: Visibility,
3660    pub extras: Option<Box<FieldDefExtras>>,
3661    pub ident: Option<Ident>,
3662
3663    pub ty: Box<Ty>,
3664    pub is_placeholder: bool,
3665}
3666
3667/// Some properties from [FieldDef] are rarely used,
3668/// so we outline them to make FieldDef smaller.
3669/// At the time of writing, these are all related to unstable features.
3670#[derive(#[automatically_derived]
impl ::core::clone::Clone for FieldDefExtras {
    #[inline]
    fn clone(&self) -> Self {
        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)]
3671pub struct FieldDefExtras {
3672    pub safety: Safety,
3673    pub mut_restriction: MutRestriction,
3674    pub default: Option<AnonConst>,
3675}
3676
3677impl FieldDef {
3678    pub fn mut_restriction(&self) -> &MutRestriction {
3679        static DEFAULT: MutRestriction =
3680            MutRestriction { kind: RestrictionKind::Unrestricted, span: DUMMY_SP };
3681
3682        self.extras.as_ref().map_or(&DEFAULT, |extras| &extras.mut_restriction)
3683    }
3684
3685    pub fn default_value(&self) -> Option<&AnonConst> {
3686        self.extras.as_ref().and_then(|e| e.default.as_ref())
3687    }
3688
3689    pub fn safety(&self) -> Safety {
3690        self.extras.as_ref().map_or(Safety::Default, |extras| extras.safety)
3691    }
3692}
3693/// Was parsing recovery performed?
3694#[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) -> Self {
        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 {
            Self::No => ::core::fmt::Formatter::write_str(f, "No"),
            Self::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)]
3695pub enum Recovered {
3696    No,
3697    Yes(ErrorGuaranteed),
3698}
3699
3700/// Fields and constructor ids of enum variants and structs.
3701#[derive(#[automatically_derived]
impl ::core::clone::Clone for VariantData {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Struct { fields: __self_0, recovered: __self_1 } =>
                VariantData::Struct {
                    fields: ::core::clone::Clone::clone(__self_0),
                    recovered: ::core::clone::Clone::clone(__self_1),
                },
            Self::Tuple(__self_0, __self_1) =>
                VariantData::Tuple(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::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 {
            Self::Struct { fields: __self_0, recovered: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "Struct", "fields", __self_0, "recovered", &__self_1),
            Self::Tuple(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Tuple",
                    __self_0, &__self_1),
            Self::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)]
3702pub enum VariantData {
3703    /// Struct variant.
3704    ///
3705    /// E.g., `Bar { .. }` as in `enum Foo { Bar { .. } }`.
3706    Struct { fields: ThinVec<FieldDef>, recovered: Recovered },
3707    /// Tuple variant.
3708    ///
3709    /// E.g., `Bar(..)` as in `enum Foo { Bar(..) }`.
3710    Tuple(ThinVec<FieldDef>, NodeId),
3711    /// Unit variant.
3712    ///
3713    /// E.g., `Bar = ..` as in `enum Foo { Bar = .. }`.
3714    Unit(NodeId),
3715}
3716
3717impl VariantData {
3718    /// Return the fields of this variant.
3719    pub fn fields(&self) -> &[FieldDef] {
3720        match self {
3721            VariantData::Struct { fields, .. } | VariantData::Tuple(fields, _) => fields,
3722            _ => &[],
3723        }
3724    }
3725
3726    /// Return the `NodeId` of this variant's constructor, if it has one.
3727    pub fn ctor_node_id(&self) -> Option<NodeId> {
3728        match *self {
3729            VariantData::Struct { .. } => None,
3730            VariantData::Tuple(_, id) | VariantData::Unit(id) => Some(id),
3731        }
3732    }
3733}
3734
3735/// An item definition.
3736#[derive(#[automatically_derived]
impl<K: ::core::clone::Clone> ::core::clone::Clone for Item<K> {
    #[inline]
    fn clone(&self) -> Self {
        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)]
3737pub struct Item<K = ItemKind> {
3738    pub attrs: AttrVec,
3739    pub id: NodeId,
3740    pub span: Span,
3741    pub vis: Visibility,
3742
3743    pub kind: K,
3744
3745    /// Original tokens this item was parsed from. This isn't necessarily
3746    /// available for all items, although over time more and more items should
3747    /// have this be `Some`. Right now this is primarily used for procedural
3748    /// macros, notably custom attributes.
3749    ///
3750    /// Note that the tokens here do not include the outer attributes, but will
3751    /// include inner attributes.
3752    pub tokens: Option<LazyAttrTokenStream>,
3753}
3754
3755impl Item {
3756    /// Return the span that encompasses the attributes.
3757    pub fn span_with_attributes(&self) -> Span {
3758        self.attrs.iter().fold(self.span, |acc, attr| acc.to(attr.span))
3759    }
3760
3761    pub fn opt_generics(&self) -> Option<&Generics> {
3762        self.kind.generics()
3763    }
3764}
3765
3766impl Item<AssocItemKind> {
3767    pub fn opt_generics(&self) -> Option<&Generics> {
3768        match &self.kind {
3769            AssocItemKind::Fn(fun) => Some(&fun.generics),
3770            AssocItemKind::Const(ct) => Some(&ct.generics),
3771            AssocItemKind::Type(ty) => Some(&ty.generics),
3772            AssocItemKind::Delegation(..)
3773            | AssocItemKind::MacCall(_)
3774            | AssocItemKind::DelegationMac(_) => None,
3775        }
3776    }
3777}
3778
3779/// `extern` qualifier on a function item or function type.
3780#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Extern { }
#[automatically_derived]
impl ::core::clone::Clone for Extern {
    #[inline]
    fn clone(&self) -> Self {
        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 {
            Self::None => ::core::fmt::Formatter::write_str(f, "None"),
            Self::Implicit(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Implicit", &__self_0),
            Self::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)]
3781pub enum Extern {
3782    /// No explicit extern keyword was used.
3783    ///
3784    /// E.g. `fn foo() {}`.
3785    None,
3786    /// An explicit extern keyword was used, but with implicit ABI.
3787    ///
3788    /// E.g. `extern fn foo() {}`.
3789    ///
3790    /// This is just `extern "C"` (see `rustc_abi::ExternAbi::FALLBACK`).
3791    Implicit(Span),
3792    /// An explicit extern keyword was used with an explicit ABI.
3793    ///
3794    /// E.g. `extern "C" fn foo() {}`.
3795    Explicit(StrLit, Span),
3796}
3797
3798impl Extern {
3799    pub fn from_abi(abi: Option<StrLit>, span: Span) -> Extern {
3800        match abi {
3801            Some(name) => Extern::Explicit(name, span),
3802            None => Extern::Implicit(span),
3803        }
3804    }
3805
3806    pub fn span(self) -> Option<Span> {
3807        match self {
3808            Extern::None => None,
3809            Extern::Implicit(span) | Extern::Explicit(_, span) => Some(span),
3810        }
3811    }
3812}
3813
3814/// A function header.
3815///
3816/// All the information between the visibility and the name of the function is
3817/// included in this struct (e.g., `async unsafe fn` or `const extern "C" fn`).
3818#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for FnHeader { }
#[automatically_derived]
impl ::core::clone::Clone for FnHeader {
    #[inline]
    fn clone(&self) -> Self {
        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)]
3819pub struct FnHeader {
3820    /// The `const` keyword, if any
3821    pub constness: Const,
3822    /// The `async`/`gen`/`gen asyn` marker, if there is one.
3823    pub coroutine_marker: Option<CoroutineMarker>,
3824    /// Whether this is `unsafe`, or has a default safety.
3825    pub safety: Safety,
3826    /// The `extern` keyword and corresponding ABI string, if any.
3827    pub ext: Extern,
3828}
3829
3830impl FnHeader {
3831    /// Does this function header have any qualifiers or is it empty?
3832    pub fn has_qualifiers(&self) -> bool {
3833        let Self { safety, coroutine_marker, constness, ext } = self;
3834        #[allow(non_exhaustive_omitted_patterns)] match safety {
    Safety::Unsafe(_) => true,
    _ => false,
}matches!(safety, Safety::Unsafe(_))
3835            || coroutine_marker.is_some()
3836            || #[allow(non_exhaustive_omitted_patterns)] match constness {
    Const::Yes(_) => true,
    _ => false,
}matches!(constness, Const::Yes(_))
3837            || !#[allow(non_exhaustive_omitted_patterns)] match ext {
    Extern::None => true,
    _ => false,
}matches!(ext, Extern::None)
3838    }
3839
3840    pub fn span(&self) -> Option<Span> {
3841        let mut spans = smallvec::SmallVec::<[Span; 4]>::new();
3842
3843        match self.ext {
3844            Extern::Implicit(span) | Extern::Explicit(_, span) => spans.push(span),
3845            Extern::None => {}
3846        }
3847
3848        match self.safety {
3849            Safety::Unsafe(span) | Safety::Safe(span) => spans.push(span),
3850            Safety::Default => {}
3851        };
3852
3853        if let Some(coroutine_marker) = self.coroutine_marker {
3854            spans.push(coroutine_marker.span);
3855        }
3856
3857        if let Const::Yes(span) = self.constness {
3858            spans.push(span)
3859        }
3860
3861        spans.into_iter().reduce(Span::to)
3862    }
3863}
3864
3865impl Default for FnHeader {
3866    fn default() -> FnHeader {
3867        FnHeader {
3868            safety: Safety::Default,
3869            coroutine_marker: None,
3870            constness: Const::No,
3871            ext: Extern::None,
3872        }
3873    }
3874}
3875
3876#[derive(#[automatically_derived]
impl ::core::clone::Clone for TraitAlias {
    #[inline]
    fn clone(&self) -> Self {
        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)]
3877pub struct TraitAlias {
3878    pub constness: Const,
3879    pub ident: Ident,
3880    pub generics: Generics,
3881    #[visitable(extra = BoundKind::Bound)]
3882    pub bounds: GenericBounds,
3883}
3884
3885#[derive(#[automatically_derived]
impl ::core::clone::Clone for Trait {
    #[inline]
    fn clone(&self) -> Self {
        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)]
3886pub struct Trait {
3887    pub impl_restriction: ImplRestriction,
3888    pub constness: Const,
3889    pub safety: Safety,
3890    pub is_auto: IsAuto,
3891    pub ident: Ident,
3892    pub generics: Generics,
3893    #[visitable(extra = BoundKind::SuperTraits)]
3894    pub bounds: GenericBounds,
3895    #[visitable(extra = AssocCtxt::Trait)]
3896    pub items: ThinVec<Box<AssocItem>>,
3897}
3898
3899#[derive(#[automatically_derived]
impl ::core::clone::Clone for TyAlias {
    #[inline]
    fn clone(&self) -> Self {
        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)]
3900pub struct TyAlias {
3901    pub defaultness: Defaultness,
3902    pub ident: Ident,
3903    pub generics: Generics,
3904    /// There are two locations for where clause on type aliases. This represents the second
3905    /// where clause, before the semicolon. The first where clause is stored inside `generics`.
3906    ///
3907    /// Take this example:
3908    /// ```ignore (only-for-syntax-highlight)
3909    /// trait Foo {
3910    ///   type Assoc<'a, 'b> where Self: 'a, Self: 'b;
3911    /// }
3912    /// impl Foo for () {
3913    ///   type Assoc<'a, 'b> where Self: 'a = () where Self: 'b;
3914    ///   //                 ^^^^^^^^^^^^^^ before where clause
3915    ///   //                                     ^^^^^^^^^^^^^^ after where clause
3916    /// }
3917    /// ```
3918    pub after_where_clause: WhereClause,
3919    #[visitable(extra = BoundKind::Bound)]
3920    pub bounds: GenericBounds,
3921    pub ty: Option<Box<Ty>>,
3922}
3923
3924#[derive(#[automatically_derived]
impl ::core::clone::Clone for Impl {
    #[inline]
    fn clone(&self) -> Self {
        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)]
3925pub struct Impl {
3926    pub generics: Generics,
3927    pub constness: Const,
3928    pub of_trait: Option<Box<TraitImplHeader>>,
3929    pub self_ty: Box<Ty>,
3930    pub items: ThinVec<Box<AssocItem>>,
3931}
3932
3933#[derive(#[automatically_derived]
impl ::core::clone::Clone for TraitImplHeader {
    #[inline]
    fn clone(&self) -> Self {
        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)]
3934pub struct TraitImplHeader {
3935    pub defaultness: Defaultness,
3936    pub safety: Safety,
3937    pub polarity: ImplPolarity,
3938    pub trait_ref: TraitRef,
3939}
3940
3941#[derive(#[automatically_derived]
impl ::core::clone::Clone for FnContract {
    #[inline]
    fn clone(&self) -> Self {
        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() -> Self {
        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)]
3942pub struct FnContract {
3943    /// Declarations of variables accessible both in the `requires` and
3944    /// `ensures` clauses.
3945    pub declarations: ThinVec<Stmt>,
3946    pub requires: Option<Box<Expr>>,
3947    pub ensures: Option<Box<Expr>>,
3948}
3949
3950#[derive(#[automatically_derived]
impl ::core::clone::Clone for Fn {
    #[inline]
    fn clone(&self) -> Self {
        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)]
3951pub struct Fn {
3952    pub defaultness: Defaultness,
3953    pub ident: Ident,
3954    pub generics: Generics,
3955    pub sig: FnSig,
3956    pub contract: Option<Box<FnContract>>,
3957    pub define_opaque: Option<ThinVec<(NodeId, Path)>>,
3958    pub body: Option<Box<Block>>,
3959
3960    /// This function is an implementation of an externally implementable item (EII).
3961    /// This means, there was an EII declared somewhere and this function is the
3962    /// implementation that should be run when the declaration is called.
3963    pub eii_impl: Option<Box<EiiImpl>>,
3964}
3965
3966impl Fn {
3967    pub fn is_pin_drop_sugar(&self) -> bool {
3968        self.ident.name == sym::drop
3969            && self
3970                .sig
3971                .decl
3972                .inputs
3973                .first()
3974                .and_then(|param| param.to_self())
3975                .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)))
3976    }
3977}
3978
3979#[derive(#[automatically_derived]
impl ::core::clone::Clone for EiiImpl {
    #[inline]
    fn clone(&self) -> Self {
        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)]
3980pub struct EiiImpl {
3981    pub node_id: NodeId,
3982    pub eii_macro_path: Path,
3983    /// This field is an implementation detail that prevents a lot of bugs.
3984    /// See <https://github.com/rust-lang/rust/issues/149981> for an example.
3985    ///
3986    /// The problem is, that if we generate a declaration *together* with its default,
3987    /// we generate both a declaration and an implementation. The generated implementation
3988    /// uses the same mechanism to register itself as a user-defined implementation would,
3989    /// despite being invisible to users. What does happen is a name resolution step.
3990    /// The invisible default implementation has to find the declaration.
3991    /// Both are generated at the same time, so we can skip that name resolution step.
3992    ///
3993    /// This field is that shortcut: we prefill the extern target to skip a name resolution step,
3994    /// making sure it never fails. It'd be awful UX if we fail name resolution in code invisible to the user.
3995    pub known_eii_macro_resolution: Option<Path>,
3996    pub impl_safety: Safety,
3997    pub span: Span,
3998    pub inner_span: Span,
3999    pub is_default: bool,
4000}
4001
4002#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for DelegationSource { }
#[automatically_derived]
impl ::core::clone::Clone for DelegationSource {
    #[inline]
    fn clone(&self) -> Self {
        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 {
            Self::Single => ::core::fmt::Formatter::write_str(f, "Single"),
            Self::List(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "List",
                    &__self_0),
            Self::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: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::List(__self_0), Self::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)]
4003pub enum DelegationSource {
4004    Single,
4005    List(LocalExpnId),
4006    Glob,
4007}
4008
4009#[derive(#[automatically_derived]
impl ::core::clone::Clone for Delegation {
    #[inline]
    fn clone(&self) -> Self {
        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)]
4010pub struct Delegation {
4011    /// Path resolution id.
4012    pub id: NodeId,
4013    pub qself: Option<Box<QSelf>>,
4014    pub path: Path,
4015    pub ident: Ident,
4016    pub rename: Option<Ident>,
4017    pub body: Option<Box<Block>>,
4018    /// The item was expanded from a glob delegation item.
4019    #[visitable(ignore)]
4020    pub source: DelegationSource,
4021}
4022
4023impl Delegation {
4024    pub fn last_segment_span(&self) -> Span {
4025        self.path.segments.last().unwrap().ident.span
4026    }
4027}
4028
4029#[derive(#[automatically_derived]
impl ::core::clone::Clone for DelegationSuffixes {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::List(__self_0) =>
                DelegationSuffixes::List(::core::clone::Clone::clone(__self_0)),
            Self::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 {
            Self::List(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "List",
                    &__self_0),
            Self::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)]
4030pub enum DelegationSuffixes {
4031    List(ThinVec<(Ident, Option<Ident>)>),
4032    Glob(Span),
4033}
4034
4035#[derive(#[automatically_derived]
impl ::core::clone::Clone for DelegationMac {
    #[inline]
    fn clone(&self) -> Self {
        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)]
4036pub struct DelegationMac {
4037    pub qself: Option<Box<QSelf>>,
4038    pub prefix: Path,
4039    pub suffixes: DelegationSuffixes,
4040    pub body: Option<Box<Block>>,
4041}
4042
4043#[derive(#[automatically_derived]
impl ::core::clone::Clone for StaticItem {
    #[inline]
    fn clone(&self) -> Self {
        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)]
4044pub struct StaticItem {
4045    pub ident: Ident,
4046    pub ty: Box<Ty>,
4047    pub safety: Safety,
4048    pub mutability: Mutability,
4049    pub expr: Option<Box<Expr>>,
4050    pub define_opaque: Option<ThinVec<(NodeId, Path)>>,
4051
4052    /// This static is an implementation of an externally implementable item (EII).
4053    /// This means, there was an EII declared somewhere and this static is the
4054    /// implementation that should be used for the declaration.
4055    pub eii_impl: Option<Box<EiiImpl>>,
4056}
4057
4058#[derive(#[automatically_derived]
impl ::core::clone::Clone for ConstItem {
    #[inline]
    fn clone(&self) -> Self {
        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),
            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,
                        define_opaque: 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 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),
                    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",
                        "define_opaque"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.defaultness, &self.ident, &self.generics, &self.ty,
                        &self.body, &&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,
                        define_opaque: 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 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,
                        define_opaque: 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)]
4059pub struct ConstItem {
4060    pub defaultness: Defaultness,
4061    pub ident: Ident,
4062    pub generics: Generics,
4063    pub ty: Box<Ty>,
4064    pub body: Option<Box<Expr>>,
4065    pub define_opaque: Option<ThinVec<(NodeId, Path)>>,
4066}
4067
4068#[derive(#[automatically_derived]
impl ::core::clone::Clone for ConstBlockItem {
    #[inline]
    fn clone(&self) -> Self {
        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)]
4069pub struct ConstBlockItem {
4070    pub id: NodeId,
4071    pub span: Span,
4072    pub block: Box<Block>,
4073}
4074
4075impl ConstBlockItem {
4076    pub const IDENT: Ident = Ident { name: kw::Underscore, span: DUMMY_SP };
4077}
4078
4079#[derive(#[automatically_derived]
impl ::core::clone::Clone for Guard {
    #[inline]
    fn clone(&self) -> Self {
        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)]
4080pub struct Guard {
4081    pub cond: Expr,
4082    pub span_with_leading_if: Span,
4083}
4084
4085impl Guard {
4086    pub fn span(&self) -> Span {
4087        self.cond.span
4088    }
4089}
4090
4091#[derive(#[automatically_derived]
impl ::core::clone::Clone for TestBinderConstraints {
    #[inline]
    fn clone(&self) -> Self {
        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)]
4092pub struct TestBinderConstraints {
4093    pub generics: Generics,
4094    pub body: Box<TestBinderBody>,
4095}
4096
4097#[derive(#[automatically_derived]
impl ::core::clone::Clone for TestBinderBody {
    #[inline]
    fn clone(&self) -> Self {
        TestBinderBody {
            span: ::core::clone::Clone::clone(&self.span),
            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 {
                        span: ref __binding_0,
                        foralls: ref __binding_1,
                        exists: ref __binding_2,
                        constraints: ref __binding_3,
                        predicates: 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 TestBinderBody {
            fn decode(__decoder: &mut __D) -> Self {
                TestBinderBody {
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    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_field5_finish(f,
            "TestBinderBody", "span", &self.span, "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 {
                        span: ref __binding_0,
                        foralls: ref __binding_1,
                        exists: ref __binding_2,
                        constraints: ref __binding_3,
                        predicates: 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 TestBinderBody where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    TestBinderBody {
                        span: ref mut __binding_0,
                        foralls: ref mut __binding_1,
                        exists: ref mut __binding_2,
                        constraints: ref mut __binding_3,
                        predicates: 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)]
4098pub struct TestBinderBody {
4099    pub span: Span,
4100    pub foralls: ThinVec<TestBinderForall>,
4101    pub exists: ThinVec<TestBinderExists>,
4102    pub constraints: Vec<TestBinderConstraint>,
4103    /// These are not where clauses, but rather predicates within the body to be proven
4104    pub predicates: Vec<WherePredicate>,
4105}
4106
4107#[derive(#[automatically_derived]
impl ::core::clone::Clone for TestBinderForall {
    #[inline]
    fn clone(&self) -> Self {
        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)]
4108pub struct TestBinderForall {
4109    pub span: Span,
4110    pub node_id: NodeId,
4111    pub generics: Generics,
4112    pub body: TestBinderBody,
4113    pub assert_on_exit: Option<ThinVec<TestBinderConstraint>>,
4114}
4115
4116#[derive(#[automatically_derived]
impl ::core::clone::Clone for TestBinderExists {
    #[inline]
    fn clone(&self) -> Self {
        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)]
4117pub struct TestBinderExists {
4118    pub span: Span,
4119    pub node_id: NodeId,
4120    pub params: ThinVec<GenericParam>,
4121    pub body: TestBinderBody,
4122}
4123
4124#[derive(#[automatically_derived]
impl ::core::clone::Clone for TestBinderConstraint {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::And { items: __self_0 } =>
                TestBinderConstraint::And {
                    items: ::core::clone::Clone::clone(__self_0),
                },
            Self::Or { items: __self_0 } =>
                TestBinderConstraint::Or {
                    items: ::core::clone::Clone::clone(__self_0),
                },
            Self::Ambiguity { span: __self_0 } =>
                TestBinderConstraint::Ambiguity {
                    span: ::core::clone::Clone::clone(__self_0),
                },
            Self::Lifetime { lhs: __self_0, rhs: __self_1 } =>
                TestBinderConstraint::Lifetime {
                    lhs: ::core::clone::Clone::clone(__self_0),
                    rhs: ::core::clone::Clone::clone(__self_1),
                },
            Self::PlaceholderOutlives { lhs: __self_0, rhs: __self_1 } =>
                TestBinderConstraint::PlaceholderOutlives {
                    lhs: ::core::clone::Clone::clone(__self_0),
                    rhs: ::core::clone::Clone::clone(__self_1),
                },
            Self::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::Ambiguity { span: ref __binding_0 } =>
                            {
                            2usize
                        }
                        TestBinderConstraint::Lifetime {
                            lhs: ref __binding_0, rhs: ref __binding_1 } => {
                            3usize
                        }
                        TestBinderConstraint::PlaceholderOutlives {
                            lhs: ref __binding_0, rhs: ref __binding_1 } => {
                            4usize
                        }
                        TestBinderConstraint::AliasOutlives {
                            bound_type_constraint: ref __binding_0 } => {
                            5usize
                        }
                    };
                ::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::Ambiguity { span: 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::Ambiguity {
                            span: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    3usize => {
                        TestBinderConstraint::Lifetime {
                            lhs: ::rustc_serialize::Decodable::decode(__decoder),
                            rhs: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    4usize => {
                        TestBinderConstraint::PlaceholderOutlives {
                            lhs: ::rustc_serialize::Decodable::decode(__decoder),
                            rhs: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    5usize => {
                        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..6, 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 {
            Self::And { items: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "And",
                    "items", &__self_0),
            Self::Or { items: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Or",
                    "items", &__self_0),
            Self::Ambiguity { span: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "Ambiguity", "span", &__self_0),
            Self::Lifetime { lhs: __self_0, rhs: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "Lifetime", "lhs", __self_0, "rhs", &__self_1),
            Self::PlaceholderOutlives { lhs: __self_0, rhs: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "PlaceholderOutlives", "lhs", __self_0, "rhs", &__self_1),
            Self::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::Ambiguity { span: 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::Ambiguity { span: 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)]
4125pub enum TestBinderConstraint {
4126    And {
4127        items: ThinVec<TestBinderConstraint>,
4128    },
4129    Or {
4130        items: ThinVec<TestBinderConstraint>,
4131    },
4132    Ambiguity {
4133        span: Span,
4134    },
4135    Lifetime {
4136        #[visitable(extra = LifetimeCtxt::Bound)]
4137        lhs: Lifetime,
4138        #[visitable(extra = LifetimeCtxt::Bound)]
4139        rhs: Lifetime,
4140    },
4141    PlaceholderOutlives {
4142        lhs: Box<Ty>,
4143        #[visitable(extra = LifetimeCtxt::Bound)]
4144        rhs: Lifetime,
4145    },
4146    AliasOutlives {
4147        bound_type_constraint: TestBinderBoundTypeConstraint,
4148    },
4149}
4150
4151#[derive(#[automatically_derived]
impl ::core::clone::Clone for TestBinderBoundTypeConstraint {
    #[inline]
    fn clone(&self) -> Self {
        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)]
4152pub struct TestBinderBoundTypeConstraint {
4153    pub span: Span,
4154    pub node_id: NodeId,
4155    pub params: ThinVec<GenericParam>,
4156    pub lhs: Box<Ty>,
4157    #[visitable(extra = LifetimeCtxt::Bound)]
4158    pub rhs: Lifetime,
4159}
4160
4161// Adding a new variant? Please update `test_item` in `tests/ui/macros/stringify.rs`.
4162#[derive(#[automatically_derived]
impl ::core::clone::Clone for ItemKind {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::ExternCrate(__self_0, __self_1) =>
                ItemKind::ExternCrate(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::Use(__self_0) =>
                ItemKind::Use(::core::clone::Clone::clone(__self_0)),
            Self::Static(__self_0) =>
                ItemKind::Static(::core::clone::Clone::clone(__self_0)),
            Self::Const(__self_0) =>
                ItemKind::Const(::core::clone::Clone::clone(__self_0)),
            Self::ConstBlock(__self_0) =>
                ItemKind::ConstBlock(::core::clone::Clone::clone(__self_0)),
            Self::Fn(__self_0) =>
                ItemKind::Fn(::core::clone::Clone::clone(__self_0)),
            Self::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)),
            Self::ForeignMod(__self_0) =>
                ItemKind::ForeignMod(::core::clone::Clone::clone(__self_0)),
            Self::GlobalAsm(__self_0) =>
                ItemKind::GlobalAsm(::core::clone::Clone::clone(__self_0)),
            Self::TyAlias(__self_0) =>
                ItemKind::TyAlias(::core::clone::Clone::clone(__self_0)),
            Self::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)),
            Self::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)),
            Self::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)),
            Self::Trait(__self_0) =>
                ItemKind::Trait(::core::clone::Clone::clone(__self_0)),
            Self::TraitAlias(__self_0) =>
                ItemKind::TraitAlias(::core::clone::Clone::clone(__self_0)),
            Self::Impl(__self_0) =>
                ItemKind::Impl(::core::clone::Clone::clone(__self_0)),
            Self::MacCall(__self_0) =>
                ItemKind::MacCall(::core::clone::Clone::clone(__self_0)),
            Self::MacroDef(__self_0, __self_1) =>
                ItemKind::MacroDef(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            Self::Delegation(__self_0) =>
                ItemKind::Delegation(::core::clone::Clone::clone(__self_0)),
            Self::DelegationMac(__self_0) =>
                ItemKind::DelegationMac(::core::clone::Clone::clone(__self_0)),
            Self::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 {
            Self::ExternCrate(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "ExternCrate", __self_0, &__self_1),
            Self::Use(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Use",
                    &__self_0),
            Self::Static(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Static",
                    &__self_0),
            Self::Const(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Const",
                    &__self_0),
            Self::ConstBlock(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ConstBlock", &__self_0),
            Self::Fn(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Fn",
                    &__self_0),
            Self::Mod(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Mod",
                    __self_0, __self_1, &__self_2),
            Self::ForeignMod(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ForeignMod", &__self_0),
            Self::GlobalAsm(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "GlobalAsm", &__self_0),
            Self::TyAlias(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "TyAlias", &__self_0),
            Self::Enum(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Enum",
                    __self_0, __self_1, &__self_2),
            Self::Struct(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Struct",
                    __self_0, __self_1, &__self_2),
            Self::Union(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Union",
                    __self_0, __self_1, &__self_2),
            Self::Trait(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Trait",
                    &__self_0),
            Self::TraitAlias(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "TraitAlias", &__self_0),
            Self::Impl(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Impl",
                    &__self_0),
            Self::MacCall(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "MacCall", &__self_0),
            Self::MacroDef(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "MacroDef", __self_0, &__self_1),
            Self::Delegation(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Delegation", &__self_0),
            Self::DelegationMac(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "DelegationMac", &__self_0),
            Self::TestBinderConstraints(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "TestBinderConstraints", &__self_0),
        }
    }
}Debug)]
4163pub enum ItemKind {
4164    /// An `extern crate` item, with the optional *original* crate name if the crate was renamed.
4165    ///
4166    /// E.g., `extern crate foo` or `extern crate foo_bar as foo`.
4167    ExternCrate(Option<Symbol>, Ident),
4168    /// A use declaration item (`use`).
4169    ///
4170    /// E.g., `use foo;`, `use foo::bar;` or `use foo::bar as FooBar;`.
4171    Use(UseTree),
4172    /// A static item (`static`).
4173    ///
4174    /// E.g., `static FOO: i32 = 42;` or `static FOO: &'static str = "bar";`.
4175    Static(Box<StaticItem>),
4176    /// A constant item (`const`).
4177    ///
4178    /// E.g., `const FOO: i32 = 42;`.
4179    Const(Box<ConstItem>),
4180    /// A module-level const block.
4181    /// Equivalent to `const _: () = const { ... };`.
4182    ///
4183    /// E.g., `const { assert!(true) }`.
4184    ConstBlock(ConstBlockItem),
4185    /// A function declaration (`fn`).
4186    ///
4187    /// E.g., `fn foo(bar: usize) -> usize { .. }`.
4188    Fn(Box<Fn>),
4189    /// A module declaration (`mod`).
4190    ///
4191    /// E.g., `mod foo;` or `mod foo { .. }`.
4192    /// `unsafe` keyword on modules is accepted syntactically for macro DSLs, but not
4193    /// semantically by Rust.
4194    Mod(Safety, Ident, ModKind),
4195    /// An external module (`extern`).
4196    ///
4197    /// E.g., `extern {}` or `extern "C" {}`.
4198    ForeignMod(ForeignMod),
4199    /// Module-level inline assembly (from `global_asm!()`).
4200    GlobalAsm(Box<InlineAsm>),
4201    /// A type alias (`type`).
4202    ///
4203    /// E.g., `type Foo = Bar<u8>;`.
4204    TyAlias(Box<TyAlias>),
4205    /// An enum definition (`enum`).
4206    ///
4207    /// E.g., `enum Foo<A, B> { C<A>, D<B> }`.
4208    Enum(Ident, Generics, EnumDef),
4209    /// A struct definition (`struct`).
4210    ///
4211    /// E.g., `struct Foo<A> { x: A }`.
4212    Struct(Ident, Generics, VariantData),
4213    /// A union definition (`union`).
4214    ///
4215    /// E.g., `union Foo<A, B> { x: A, y: B }`.
4216    Union(Ident, Generics, VariantData),
4217    /// A trait declaration (`trait`).
4218    ///
4219    /// E.g., `trait Foo { .. }`, `trait Foo<T> { .. }` or `auto trait Foo {}`.
4220    Trait(Box<Trait>),
4221    /// Trait alias.
4222    ///
4223    /// E.g., `trait Foo = Bar + Quux;`.
4224    TraitAlias(Box<TraitAlias>),
4225    /// An implementation.
4226    ///
4227    /// E.g., `impl<A> Foo<A> { .. }` or `impl<A> Trait for Foo<A> { .. }`.
4228    Impl(Impl),
4229    /// A macro invocation.
4230    ///
4231    /// E.g., `foo!(..)`.
4232    MacCall(Box<MacCall>),
4233    /// A macro definition.
4234    MacroDef(Ident, MacroDef),
4235    /// A single delegation item (`reuse`).
4236    ///
4237    /// E.g. `reuse <Type as Trait>::name { target_expr_template }`.
4238    Delegation(Box<Delegation>),
4239    /// A list or glob delegation item (`reuse prefix::{a, b, c}`, `reuse prefix::*`).
4240    /// Treated similarly to a macro call and expanded early.
4241    DelegationMac(Box<DelegationMac>),
4242    /// A `test_binder_constraints!()`. Perma-unstable, used only for rustc tests.
4243    TestBinderConstraints(Box<TestBinderConstraints>),
4244}
4245
4246impl ItemKind {
4247    pub fn ident(&self) -> Option<Ident> {
4248        match *self {
4249            ItemKind::ExternCrate(_, ident)
4250            | ItemKind::Static(StaticItem { ident, .. })
4251            | ItemKind::Const(ConstItem { ident, .. })
4252            | ItemKind::Fn(Fn { ident, .. })
4253            | ItemKind::Mod(_, ident, _)
4254            | ItemKind::TyAlias(TyAlias { ident, .. })
4255            | ItemKind::Enum(ident, ..)
4256            | ItemKind::Struct(ident, ..)
4257            | ItemKind::Union(ident, ..)
4258            | ItemKind::Trait(Trait { ident, .. })
4259            | ItemKind::TraitAlias(TraitAlias { ident, .. })
4260            | ItemKind::MacroDef(ident, _)
4261            | ItemKind::Delegation(Delegation { ident, .. }) => Some(ident),
4262
4263            ItemKind::ConstBlock(_) => Some(ConstBlockItem::IDENT),
4264
4265            ItemKind::Use(_)
4266            | ItemKind::ForeignMod(_)
4267            | ItemKind::GlobalAsm(_)
4268            | ItemKind::Impl(_)
4269            | ItemKind::MacCall(_)
4270            | ItemKind::DelegationMac(_)
4271            | ItemKind::TestBinderConstraints(_) => None,
4272        }
4273    }
4274
4275    /// "a" or "an"
4276    pub fn article(&self) -> &'static str {
4277        use ItemKind::*;
4278        match self {
4279            Use(..)
4280            | Static(..)
4281            | Const(..)
4282            | ConstBlock(..)
4283            | Fn(..)
4284            | Mod(..)
4285            | GlobalAsm(..)
4286            | TyAlias(..)
4287            | Struct(..)
4288            | Union(..)
4289            | Trait(..)
4290            | TraitAlias(..)
4291            | MacroDef(..)
4292            | Delegation(..)
4293            | DelegationMac(..)
4294            | TestBinderConstraints(..) => "a",
4295            ExternCrate(..) | ForeignMod(..) | MacCall(..) | Enum(..) | Impl { .. } => "an",
4296        }
4297    }
4298
4299    pub fn descr(&self) -> &'static str {
4300        match self {
4301            ItemKind::ExternCrate(..) => "extern crate",
4302            ItemKind::Use(..) => "`use` import",
4303            ItemKind::Static(..) => "static item",
4304            ItemKind::Const(..) => "constant item",
4305            ItemKind::ConstBlock(..) => "const block",
4306            ItemKind::Fn(..) => "function",
4307            ItemKind::Mod(..) => "module",
4308            ItemKind::ForeignMod(..) => "extern block",
4309            ItemKind::GlobalAsm(..) => "global asm item",
4310            ItemKind::TyAlias(..) => "type alias",
4311            ItemKind::Enum(..) => "enum",
4312            ItemKind::Struct(..) => "struct",
4313            ItemKind::Union(..) => "union",
4314            ItemKind::Trait(..) => "trait",
4315            ItemKind::TraitAlias(..) => "trait alias",
4316            ItemKind::MacCall(..) => "item macro invocation",
4317            ItemKind::MacroDef(..) => "macro definition",
4318            ItemKind::Impl { .. } => "implementation",
4319            ItemKind::Delegation(..) => "delegated function",
4320            ItemKind::DelegationMac(..) => "delegation",
4321            ItemKind::TestBinderConstraints(..) => "test_binder_constraints!",
4322        }
4323    }
4324
4325    pub fn generics(&self) -> Option<&Generics> {
4326        match self {
4327            Self::Fn(Fn { generics, .. })
4328            | Self::TyAlias(TyAlias { generics, .. })
4329            | Self::Const(ConstItem { generics, .. })
4330            | Self::Enum(_, generics, _)
4331            | Self::Struct(_, generics, _)
4332            | Self::Union(_, generics, _)
4333            | Self::Trait(Trait { generics, .. })
4334            | Self::TraitAlias(TraitAlias { generics, .. })
4335            | Self::Impl(Impl { generics, .. })
4336            | Self::TestBinderConstraints(TestBinderConstraints { generics, .. }) => Some(generics),
4337
4338            Self::ExternCrate(..)
4339            | Self::Use(..)
4340            | Self::Static(..)
4341            | Self::ConstBlock(..)
4342            | Self::Mod(..)
4343            | Self::ForeignMod(..)
4344            | Self::GlobalAsm(..)
4345            | Self::MacCall(..)
4346            | Self::MacroDef(..)
4347            | Self::Delegation(..)
4348            | Self::DelegationMac(..) => None,
4349        }
4350    }
4351}
4352
4353/// Represents associated items.
4354/// These include items in `impl` and `trait` definitions.
4355pub type AssocItem = Item<AssocItemKind>;
4356
4357/// Represents associated item kinds.
4358///
4359/// The term "provided" in the variants below refers to the item having a default
4360/// definition / body. Meanwhile, a "required" item lacks a definition / body.
4361/// In an implementation, all items must be provided.
4362/// The `Option`s below denote the bodies, where `Some(_)`
4363/// means "provided" and conversely `None` means "required".
4364#[derive(#[automatically_derived]
impl ::core::clone::Clone for AssocItemKind {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Const(__self_0) =>
                AssocItemKind::Const(::core::clone::Clone::clone(__self_0)),
            Self::Fn(__self_0) =>
                AssocItemKind::Fn(::core::clone::Clone::clone(__self_0)),
            Self::Type(__self_0) =>
                AssocItemKind::Type(::core::clone::Clone::clone(__self_0)),
            Self::MacCall(__self_0) =>
                AssocItemKind::MacCall(::core::clone::Clone::clone(__self_0)),
            Self::Delegation(__self_0) =>
                AssocItemKind::Delegation(::core::clone::Clone::clone(__self_0)),
            Self::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 {
            Self::Const(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Const",
                    &__self_0),
            Self::Fn(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Fn",
                    &__self_0),
            Self::Type(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Type",
                    &__self_0),
            Self::MacCall(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "MacCall", &__self_0),
            Self::Delegation(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Delegation", &__self_0),
            Self::DelegationMac(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "DelegationMac", &__self_0),
        }
    }
}Debug)]
4365pub enum AssocItemKind {
4366    /// An associated constant, `const $ident: $ty $def?;` where `def ::= "=" $expr? ;`.
4367    /// If `def` is parsed, then the constant is provided, and otherwise required.
4368    Const(Box<ConstItem>),
4369    /// An associated function.
4370    Fn(Box<Fn>),
4371    /// An associated type.
4372    Type(Box<TyAlias>),
4373    /// A macro expanding to associated items.
4374    MacCall(Box<MacCall>),
4375    /// An associated delegation item.
4376    Delegation(Box<Delegation>),
4377    /// An associated list or glob delegation item.
4378    DelegationMac(Box<DelegationMac>),
4379}
4380
4381impl AssocItemKind {
4382    pub fn ident(&self) -> Option<Ident> {
4383        match *self {
4384            AssocItemKind::Const(ConstItem { ident, .. })
4385            | AssocItemKind::Fn(Fn { ident, .. })
4386            | AssocItemKind::Type(TyAlias { ident, .. })
4387            | AssocItemKind::Delegation(Delegation { ident, .. }) => Some(ident),
4388
4389            AssocItemKind::MacCall(_) | AssocItemKind::DelegationMac(_) => None,
4390        }
4391    }
4392
4393    pub fn defaultness(&self) -> Defaultness {
4394        match *self {
4395            Self::Const(ConstItem { defaultness, .. })
4396            | Self::Fn(Fn { defaultness, .. })
4397            | Self::Type(TyAlias { defaultness, .. }) => defaultness,
4398            Self::MacCall(..) | Self::Delegation(..) | Self::DelegationMac(..) => {
4399                Defaultness::Implicit
4400            }
4401        }
4402    }
4403}
4404
4405impl From<AssocItemKind> for ItemKind {
4406    fn from(assoc_item_kind: AssocItemKind) -> ItemKind {
4407        match assoc_item_kind {
4408            AssocItemKind::Const(item) => ItemKind::Const(item),
4409            AssocItemKind::Fn(fn_kind) => ItemKind::Fn(fn_kind),
4410            AssocItemKind::Type(ty_alias_kind) => ItemKind::TyAlias(ty_alias_kind),
4411            AssocItemKind::MacCall(a) => ItemKind::MacCall(a),
4412            AssocItemKind::Delegation(delegation) => ItemKind::Delegation(delegation),
4413            AssocItemKind::DelegationMac(delegation) => ItemKind::DelegationMac(delegation),
4414        }
4415    }
4416}
4417
4418impl TryFrom<ItemKind> for AssocItemKind {
4419    type Error = ItemKind;
4420
4421    fn try_from(item_kind: ItemKind) -> Result<AssocItemKind, ItemKind> {
4422        Ok(match item_kind {
4423            ItemKind::Const(item) => AssocItemKind::Const(item),
4424            ItemKind::Fn(fn_kind) => AssocItemKind::Fn(fn_kind),
4425            ItemKind::TyAlias(ty_kind) => AssocItemKind::Type(ty_kind),
4426            ItemKind::MacCall(a) => AssocItemKind::MacCall(a),
4427            ItemKind::Delegation(d) => AssocItemKind::Delegation(d),
4428            ItemKind::DelegationMac(d) => AssocItemKind::DelegationMac(d),
4429            _ => return Err(item_kind),
4430        })
4431    }
4432}
4433
4434/// An item in `extern` block.
4435#[derive(#[automatically_derived]
impl ::core::clone::Clone for ForeignItemKind {
    #[inline]
    fn clone(&self) -> Self {
        match self {
            Self::Static(__self_0) =>
                ForeignItemKind::Static(::core::clone::Clone::clone(__self_0)),
            Self::Fn(__self_0) =>
                ForeignItemKind::Fn(::core::clone::Clone::clone(__self_0)),
            Self::TyAlias(__self_0) =>
                ForeignItemKind::TyAlias(::core::clone::Clone::clone(__self_0)),
            Self::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 {
            Self::Static(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Static",
                    &__self_0),
            Self::Fn(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Fn",
                    &__self_0),
            Self::TyAlias(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "TyAlias", &__self_0),
            Self::MacCall(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "MacCall", &__self_0),
        }
    }
}Debug)]
4436pub enum ForeignItemKind {
4437    /// A foreign static item (`static FOO: u8`).
4438    Static(Box<StaticItem>),
4439    /// A foreign function.
4440    Fn(Box<Fn>),
4441    /// A foreign type.
4442    TyAlias(Box<TyAlias>),
4443    /// A macro expanding to foreign items.
4444    MacCall(Box<MacCall>),
4445}
4446
4447impl ForeignItemKind {
4448    pub fn ident(&self) -> Option<Ident> {
4449        match *self {
4450            ForeignItemKind::Static(StaticItem { ident, .. })
4451            | ForeignItemKind::Fn(Fn { ident, .. })
4452            | ForeignItemKind::TyAlias(TyAlias { ident, .. }) => Some(ident),
4453
4454            ForeignItemKind::MacCall(_) => None,
4455        }
4456    }
4457}
4458
4459impl From<ForeignItemKind> for ItemKind {
4460    fn from(foreign_item_kind: ForeignItemKind) -> ItemKind {
4461        match foreign_item_kind {
4462            ForeignItemKind::Static(static_foreign_item) => ItemKind::Static(static_foreign_item),
4463            ForeignItemKind::Fn(fn_kind) => ItemKind::Fn(fn_kind),
4464            ForeignItemKind::TyAlias(ty_alias_kind) => ItemKind::TyAlias(ty_alias_kind),
4465            ForeignItemKind::MacCall(a) => ItemKind::MacCall(a),
4466        }
4467    }
4468}
4469
4470impl TryFrom<ItemKind> for ForeignItemKind {
4471    type Error = ItemKind;
4472
4473    fn try_from(item_kind: ItemKind) -> Result<ForeignItemKind, ItemKind> {
4474        Ok(match item_kind {
4475            ItemKind::Static(static_item) => ForeignItemKind::Static(static_item),
4476            ItemKind::Fn(fn_kind) => ForeignItemKind::Fn(fn_kind),
4477            ItemKind::TyAlias(ty_alias_kind) => ForeignItemKind::TyAlias(ty_alias_kind),
4478            ItemKind::MacCall(a) => ForeignItemKind::MacCall(a),
4479            _ => return Err(item_kind),
4480        })
4481    }
4482}
4483
4484pub type ForeignItem = Item<ForeignItemKind>;
4485// Some nodes are used a lot. Make sure they don't unintentionally get bigger.
4486#[cfg(target_pointer_width = "64")]
4487mod size_asserts {
4488    use rustc_data_structures::static_assert_size;
4489
4490    use super::*;
4491    // tidy-alphabetical-start
4492    const _: [(); 72] = [(); ::std::mem::size_of::<AssocItem>()];static_assert_size!(AssocItem, 72);
4493    const _: [(); 16] = [(); ::std::mem::size_of::<AssocItemKind>()];static_assert_size!(AssocItemKind, 16);
4494    const _: [(); 16] = [(); ::std::mem::size_of::<AttrKind>()];static_assert_size!(AttrKind, 16);
4495    const _: [(); 32] = [(); ::std::mem::size_of::<Attribute>()];static_assert_size!(Attribute, 32);
4496    const _: [(); 24] = [(); ::std::mem::size_of::<Block>()];static_assert_size!(Block, 24);
4497    const _: [(); 64] = [(); ::std::mem::size_of::<Expr>()];static_assert_size!(Expr, 64);
4498    const _: [(); 32] = [(); ::std::mem::size_of::<ExprKind>()];static_assert_size!(ExprKind, 32);
4499    const _: [(); 80] = [(); ::std::mem::size_of::<FieldDef>()];static_assert_size!(FieldDef, 80);
4500    const _: [(); 192] = [(); ::std::mem::size_of::<Fn>()];static_assert_size!(Fn, 192);
4501    const _: [(); 24] = [(); ::std::mem::size_of::<FnDecl>()];static_assert_size!(FnDecl, 24);
4502    const _: [(); 76] = [(); ::std::mem::size_of::<FnHeader>()];static_assert_size!(FnHeader, 76);
4503    const _: [(); 96] = [(); ::std::mem::size_of::<FnSig>()];static_assert_size!(FnSig, 96);
4504    const _: [(); 72] = [(); ::std::mem::size_of::<ForeignItem>()];static_assert_size!(ForeignItem, 72);
4505    const _: [(); 16] = [(); ::std::mem::size_of::<ForeignItemKind>()];static_assert_size!(ForeignItemKind, 16);
4506    const _: [(); 24] = [(); ::std::mem::size_of::<GenericArg>()];static_assert_size!(GenericArg, 24);
4507    const _: [(); 40] = [(); ::std::mem::size_of::<GenericArgs>()];static_assert_size!(GenericArgs, 40);
4508    const _: [(); 80] = [(); ::std::mem::size_of::<GenericBound>()];static_assert_size!(GenericBound, 80);
4509    const _: [(); 80] = [(); ::std::mem::size_of::<GenericParam>()];static_assert_size!(GenericParam, 80);
4510    const _: [(); 40] = [(); ::std::mem::size_of::<Generics>()];static_assert_size!(Generics, 40);
4511    const _: [(); 80] = [(); ::std::mem::size_of::<Impl>()];static_assert_size!(Impl, 80);
4512    const _: [(); 144] = [(); ::std::mem::size_of::<Item>()];static_assert_size!(Item, 144);
4513    const _: [(); 88] = [(); ::std::mem::size_of::<ItemKind>()];static_assert_size!(ItemKind, 88);
4514    const _: [(); 16] = [(); ::std::mem::size_of::<Lifetime>()];static_assert_size!(Lifetime, 16);
4515    const _: [(); 24] = [(); ::std::mem::size_of::<LitKind>()];static_assert_size!(LitKind, 24);
4516    const _: [(); 96] = [(); ::std::mem::size_of::<Local>()];static_assert_size!(Local, 96);
4517    const _: [(); 80] = [(); ::std::mem::size_of::<MetaItem>()];static_assert_size!(MetaItem, 80);
4518    const _: [(); 40] = [(); ::std::mem::size_of::<MetaItemKind>()];static_assert_size!(MetaItemKind, 40);
4519    const _: [(); 40] = [(); ::std::mem::size_of::<MetaItemLit>()];static_assert_size!(MetaItemLit, 40);
4520    const _: [(); 80] = [(); ::std::mem::size_of::<NormalAttr>()];static_assert_size!(NormalAttr, 80);
4521    const _: [(); 40] = [(); ::std::mem::size_of::<Param>()];static_assert_size!(Param, 40);
4522    const _: [(); 64] = [(); ::std::mem::size_of::<Pat>()];static_assert_size!(Pat, 64);
4523    const _: [(); 48] = [(); ::std::mem::size_of::<PatKind>()];static_assert_size!(PatKind, 48);
4524    const _: [(); 16] = [(); ::std::mem::size_of::<Path>()];static_assert_size!(Path, 16);
4525    const _: [(); 24] = [(); ::std::mem::size_of::<PathSegment>()];static_assert_size!(PathSegment, 24);
4526    const _: [(); 24] = [(); ::std::mem::size_of::<QSelf>()];static_assert_size!(QSelf, 24);
4527    const _: [(); 32] = [(); ::std::mem::size_of::<Stmt>()];static_assert_size!(Stmt, 32);
4528    const _: [(); 16] = [(); ::std::mem::size_of::<StmtKind>()];static_assert_size!(StmtKind, 16);
4529    const _: [(); 64] = [(); ::std::mem::size_of::<TraitImplHeader>()];static_assert_size!(TraitImplHeader, 64);
4530    const _: [(); 56] = [(); ::std::mem::size_of::<Ty>()];static_assert_size!(Ty, 56);
4531    const _: [(); 40] = [(); ::std::mem::size_of::<TyKind>()];static_assert_size!(TyKind, 40);
4532    // tidy-alphabetical-end
4533}