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::def_id::LocalDefId;
33use rustc_span::{
34    ByteSymbol, DUMMY_SP, ErrorGuaranteed, Ident, LocalExpnId, Span, Spanned, Symbol, kw, respan,
35    sym,
36};
37use thin_vec::{ThinVec, thin_vec};
38
39use crate::attr::data_structures::CfgEntry;
40pub use crate::format::*;
41use crate::token::{self, CommentKind, Delimiter};
42use crate::tokenstream::{DelimSpan, LazyAttrTokenStream, TokenStream};
43use crate::util::parser::{ExprPrecedence, Fixity};
44use crate::visit::{AssocCtxt, BoundKind, LifetimeCtxt};
45
46/// A "Label" is an identifier of some point in sources,
47/// e.g. in the following code:
48///
49/// ```rust
50/// 'outer: loop {
51///     break 'outer;
52/// }
53/// ```
54///
55/// `'outer` is a label.
56#[derive(#[automatically_derived]
impl ::core::clone::Clone for Label {
    #[inline]
    fn clone(&self) -> Label {
        let _: ::core::clone::AssertParamIsClone<Ident>;
        *self
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Label {
            fn encode(&self, __encoder: &mut __E) {
                let Label { ident: ref __binding_0 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Label {
            fn decode(__decoder: &mut __D) -> Self {
                Label {
                    ident: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::marker::Copy for Label { }Copy, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for Label {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    Label { ident: ref __binding_0 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, #[automatically_derived]
impl ::core::cmp::Eq for Label {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Ident>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for Label {
    #[inline]
    fn eq(&self, other: &Label) -> bool { self.ident == other.ident }
}PartialEq, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Label where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Label { ident: ref __binding_0 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Label where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Label { ident: ref mut __binding_0 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
57pub struct Label {
58    pub ident: Ident,
59}
60
61impl fmt::Debug for Label {
62    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
63        f.write_fmt(format_args!("label({0:?})", self.ident))write!(f, "label({:?})", self.ident)
64    }
65}
66
67/// A "Lifetime" is an annotation of the scope in which variable
68/// can be used, e.g. `'a` in `&'a i32`.
69#[derive(#[automatically_derived]
impl ::core::clone::Clone for Lifetime {
    #[inline]
    fn clone(&self) -> Lifetime {
        let _: ::core::clone::AssertParamIsClone<NodeId>;
        let _: ::core::clone::AssertParamIsClone<Ident>;
        *self
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Lifetime {
            fn encode(&self, __encoder: &mut __E) {
                let Lifetime { id: ref __binding_0, ident: ref __binding_1 } =
                    *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Lifetime {
            fn decode(__decoder: &mut __D) -> Self {
                Lifetime {
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    ident: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::marker::Copy for Lifetime { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for Lifetime {
    #[inline]
    fn eq(&self, other: &Lifetime) -> bool {
        self.id == other.id && self.ident == other.ident
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Lifetime {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<NodeId>;
        let _: ::core::cmp::AssertParamIsEq<Ident>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for Lifetime {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.id, state);
        ::core::hash::Hash::hash(&self.ident, state)
    }
}Hash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Lifetime
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Lifetime { id: ref __binding_0, ident: ref __binding_1 } =>
                        {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Lifetime where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Lifetime {
                        id: ref mut __binding_0, ident: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
70pub struct Lifetime {
71    pub id: NodeId,
72    pub ident: Ident,
73}
74
75impl fmt::Debug for Lifetime {
76    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
77        f.write_fmt(format_args!("lifetime({0}: {1})", self.id, self))write!(f, "lifetime({}: {})", self.id, self)
78    }
79}
80
81impl fmt::Display for Lifetime {
82    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
83        f.write_fmt(format_args!("{0}", self.ident.name))write!(f, "{}", self.ident.name)
84    }
85}
86
87/// A "Path" is essentially Rust's notion of a name.
88///
89/// It's represented as a sequence of identifiers,
90/// along with a bunch of supporting information.
91///
92/// E.g., `std::cmp::PartialEq`.
93#[derive(#[automatically_derived]
impl ::core::clone::Clone for Path {
    #[inline]
    fn clone(&self) -> Path {
        Path {
            span: ::core::clone::Clone::clone(&self.span),
            segments: ::core::clone::Clone::clone(&self.segments),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Path {
            fn encode(&self, __encoder: &mut __E) {
                let Path { span: ref __binding_0, segments: ref __binding_1
                        } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Path {
            fn decode(__decoder: &mut __D) -> Self {
                Path {
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    segments: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Path {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "Path", "span",
            &self.span, "segments", &&self.segments)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Path where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Path { span: ref __binding_0, segments: ref __binding_1 } =>
                        {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Path where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Path {
                        span: ref mut __binding_0, segments: ref mut __binding_1 }
                        => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
94pub struct Path {
95    pub span: Span,
96    /// The segments in the path: the things separated by `::`.
97    /// Global paths begin with `kw::PathRoot`.
98    pub segments: ThinVec<PathSegment>,
99}
100
101// Succeeds if the path has a single segment that is arg-free and matches the given symbol.
102impl PartialEq<Symbol> for Path {
103    #[inline]
104    fn eq(&self, name: &Symbol) -> bool {
105        if let [segment] = self.segments.as_ref()
106            && segment == name
107        {
108            true
109        } else {
110            false
111        }
112    }
113}
114
115// Succeeds if the path has segments that are arg-free and match the given symbols.
116impl PartialEq<&[Symbol]> for Path {
117    #[inline]
118    fn eq(&self, names: &&[Symbol]) -> bool {
119        self.segments.iter().eq(*names)
120    }
121}
122
123impl StableHash for Path {
124    fn stable_hash<Hcx: StableHashCtxt>(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
125        self.segments.len().stable_hash(hcx, hasher);
126        for segment in &self.segments {
127            segment.ident.stable_hash(hcx, hasher);
128        }
129    }
130}
131
132impl Path {
133    /// Convert a span and an identifier to the corresponding
134    /// one-segment path.
135    pub fn from_ident(ident: Ident) -> Path {
136        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 }
137    }
138
139    pub fn is_global(&self) -> bool {
140        self.segments.first().is_some_and(|segment| segment.ident.name == kw::PathRoot)
141    }
142
143    /// Checks if this path is just a simple one-word `PATH` - i.e. the inverse of
144    /// [`Path::from_ident`]
145    pub fn is_single_argless_ident(&self) -> bool {
146        self.segments.len() == 1 && self.segments[0].args.is_none()
147    }
148
149    /// The inverse of [`Path::from_ident`] - if this path is just a simple one-word `PATH`
150    pub fn as_single_argless_ident(&self) -> Option<Ident> {
151        self.is_single_argless_ident().then(|| self.segments[0].ident)
152    }
153}
154
155/// Joins multiple symbols with "::" into a path, e.g. "a::b::c". If the first
156/// segment is `kw::PathRoot` it will be printed as empty, e.g. "::b::c".
157///
158/// The generics on the `path` argument mean it can accept many forms, such as:
159/// - `&[Symbol]`
160/// - `Vec<Symbol>`
161/// - `Vec<&Symbol>`
162/// - `impl Iterator<Item = Symbol>`
163/// - `impl Iterator<Item = &Symbol>`
164///
165/// Panics if `path` is empty or a segment after the first is `kw::PathRoot`.
166pub fn join_path_syms(path: impl IntoIterator<Item = impl Borrow<Symbol>>) -> String {
167    // This is a guess at the needed capacity that works well in practice. It is slightly faster
168    // than (a) starting with an empty string, or (b) computing the exact capacity required.
169    // `8` works well because it's about the right size and jemalloc's size classes are all
170    // multiples of 8.
171    let mut iter = path.into_iter();
172    let len_hint = iter.size_hint().1.unwrap_or(1);
173    let mut s = String::with_capacity(len_hint * 8);
174
175    let first_sym = *iter.next().unwrap().borrow();
176    if first_sym != kw::PathRoot {
177        s.push_str(first_sym.as_str());
178    }
179    for sym in iter {
180        let sym = *sym.borrow();
181        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);
182        s.push_str("::");
183        s.push_str(sym.as_str());
184    }
185    s
186}
187
188/// Like `join_path_syms`, but for `Ident`s. This function is necessary because
189/// `Ident::to_string` does more than just print the symbol in the `name` field.
190pub fn join_path_idents(path: impl IntoIterator<Item = impl Borrow<Ident>>) -> String {
191    let mut iter = path.into_iter();
192    let len_hint = iter.size_hint().1.unwrap_or(1);
193    let mut s = String::with_capacity(len_hint * 8);
194
195    let first_ident = *iter.next().unwrap().borrow();
196    if first_ident.name != kw::PathRoot {
197        s.push_str(&first_ident.to_string());
198    }
199    for ident in iter {
200        let ident = *ident.borrow();
201        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);
202        s.push_str("::");
203        s.push_str(&ident.to_string());
204    }
205    s
206}
207
208/// A segment of a path: an identifier, an optional lifetime, and a set of types.
209///
210/// E.g., `std`, `String` or `Box<T>`.
211#[derive(#[automatically_derived]
impl ::core::clone::Clone for PathSegment {
    #[inline]
    fn clone(&self) -> PathSegment {
        PathSegment {
            ident: ::core::clone::Clone::clone(&self.ident),
            id: ::core::clone::Clone::clone(&self.id),
            args: ::core::clone::Clone::clone(&self.args),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for PathSegment {
            fn encode(&self, __encoder: &mut __E) {
                let PathSegment {
                        ident: ref __binding_0,
                        id: ref __binding_1,
                        args: ref __binding_2 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for PathSegment {
            fn decode(__decoder: &mut __D) -> Self {
                PathSegment {
                    ident: ::rustc_serialize::Decodable::decode(__decoder),
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    args: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for PathSegment {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "PathSegment",
            "ident", &self.ident, "id", &self.id, "args", &&self.args)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for PathSegment
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    PathSegment {
                        ident: ref __binding_0,
                        id: ref __binding_1,
                        args: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for PathSegment where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    PathSegment {
                        ident: ref mut __binding_0,
                        id: ref mut __binding_1,
                        args: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
212pub struct PathSegment {
213    /// The identifier portion of this path segment.
214    pub ident: Ident,
215
216    pub id: NodeId,
217
218    /// Type/lifetime parameters attached to this path. They come in
219    /// two flavors: `Path<A,B,C>` and `Path(A,B) -> C`.
220    /// `None` means that no parameter list is supplied (`Path`),
221    /// `Some` means that parameter list is supplied (`Path<X, Y>`)
222    /// but it can be empty (`Path<>`).
223    /// `Box` is used as a size optimization for the common case with no parameters.
224    pub args: Option<Box<GenericArgs>>,
225}
226
227// Succeeds if the path segment is arg-free and matches the given symbol.
228impl PartialEq<Symbol> for PathSegment {
229    #[inline]
230    fn eq(&self, name: &Symbol) -> bool {
231        self.args.is_none() && self.ident.name == *name
232    }
233}
234
235impl PathSegment {
236    pub fn from_ident(ident: Ident) -> Self {
237        PathSegment { ident, id: DUMMY_NODE_ID, args: None }
238    }
239
240    pub fn path_root(span: Span) -> Self {
241        PathSegment::from_ident(Ident::new(kw::PathRoot, span))
242    }
243
244    pub fn span(&self) -> Span {
245        match &self.args {
246            Some(args) => self.ident.span.to(args.span()),
247            None => self.ident.span,
248        }
249    }
250}
251
252/// The generic arguments and associated item constraints of a path segment.
253///
254/// E.g., `<A, B>` as in `Foo<A, B>` or `(A, B)` as in `Foo(A, B)`.
255#[derive(#[automatically_derived]
impl ::core::clone::Clone for GenericArgs {
    #[inline]
    fn clone(&self) -> GenericArgs {
        match self {
            GenericArgs::AngleBracketed(__self_0) =>
                GenericArgs::AngleBracketed(::core::clone::Clone::clone(__self_0)),
            GenericArgs::Parenthesized(__self_0) =>
                GenericArgs::Parenthesized(::core::clone::Clone::clone(__self_0)),
            GenericArgs::ParenthesizedElided(__self_0) =>
                GenericArgs::ParenthesizedElided(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for GenericArgs {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        GenericArgs::AngleBracketed(ref __binding_0) => { 0usize }
                        GenericArgs::Parenthesized(ref __binding_0) => { 1usize }
                        GenericArgs::ParenthesizedElided(ref __binding_0) => {
                            2usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    GenericArgs::AngleBracketed(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    GenericArgs::Parenthesized(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    GenericArgs::ParenthesizedElided(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for GenericArgs {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        GenericArgs::AngleBracketed(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        GenericArgs::Parenthesized(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        GenericArgs::ParenthesizedElided(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `GenericArgs`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for GenericArgs {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            GenericArgs::AngleBracketed(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "AngleBracketed", &__self_0),
            GenericArgs::Parenthesized(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Parenthesized", &__self_0),
            GenericArgs::ParenthesizedElided(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ParenthesizedElided", &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for GenericArgs
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    GenericArgs::AngleBracketed(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    GenericArgs::Parenthesized(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    GenericArgs::ParenthesizedElided(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for GenericArgs where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    GenericArgs::AngleBracketed(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    GenericArgs::Parenthesized(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    GenericArgs::ParenthesizedElided(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
256pub enum GenericArgs {
257    /// The `<'a, A, B, C>` in `foo::bar::baz::<'a, A, B, C>`.
258    AngleBracketed(AngleBracketedArgs),
259    /// The `(A, B)` and `C` in `Foo(A, B) -> C`.
260    Parenthesized(ParenthesizedArgs),
261    /// `(..)` in return type notation.
262    ParenthesizedElided(Span),
263}
264
265impl GenericArgs {
266    pub fn is_angle_bracketed(&self) -> bool {
267        #[allow(non_exhaustive_omitted_patterns)] match self {
    AngleBracketed(..) => true,
    _ => false,
}matches!(self, AngleBracketed(..))
268    }
269
270    pub fn span(&self) -> Span {
271        match self {
272            AngleBracketed(data) => data.span,
273            Parenthesized(data) => data.span,
274            ParenthesizedElided(span) => *span,
275        }
276    }
277}
278
279/// Concrete argument in the sequence of generic args.
280#[derive(#[automatically_derived]
impl ::core::clone::Clone for GenericArg {
    #[inline]
    fn clone(&self) -> GenericArg {
        match self {
            GenericArg::Lifetime(__self_0) =>
                GenericArg::Lifetime(::core::clone::Clone::clone(__self_0)),
            GenericArg::Type(__self_0) =>
                GenericArg::Type(::core::clone::Clone::clone(__self_0)),
            GenericArg::Const(__self_0) =>
                GenericArg::Const(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for GenericArg {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        GenericArg::Lifetime(ref __binding_0) => { 0usize }
                        GenericArg::Type(ref __binding_0) => { 1usize }
                        GenericArg::Const(ref __binding_0) => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    GenericArg::Lifetime(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    GenericArg::Type(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    GenericArg::Const(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for GenericArg {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        GenericArg::Lifetime(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        GenericArg::Type(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        GenericArg::Const(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `GenericArg`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for GenericArg {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            GenericArg::Lifetime(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Lifetime", &__self_0),
            GenericArg::Type(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Type",
                    &__self_0),
            GenericArg::Const(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Const",
                    &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for GenericArg
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    GenericArg::Lifetime(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, (LifetimeCtxt::GenericArg))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    GenericArg::Type(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    GenericArg::Const(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for GenericArg where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    GenericArg::Lifetime(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, (LifetimeCtxt::GenericArg))
                        }
                    }
                    GenericArg::Type(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    GenericArg::Const(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
281pub enum GenericArg {
282    /// `'a` in `Foo<'a>`.
283    Lifetime(#[visitable(extra = LifetimeCtxt::GenericArg)] Lifetime),
284    /// `Bar` in `Foo<Bar>`.
285    Type(Box<Ty>),
286    /// `1` in `Foo<1>`.
287    Const(AnonConst),
288}
289
290impl GenericArg {
291    pub fn span(&self) -> Span {
292        match self {
293            GenericArg::Lifetime(lt) => lt.ident.span,
294            GenericArg::Type(ty) => ty.span,
295            GenericArg::Const(ct) => ct.value.span,
296        }
297    }
298}
299
300/// A path like `Foo<'a, T>`.
301#[derive(#[automatically_derived]
impl ::core::clone::Clone for AngleBracketedArgs {
    #[inline]
    fn clone(&self) -> AngleBracketedArgs {
        AngleBracketedArgs {
            span: ::core::clone::Clone::clone(&self.span),
            args: ::core::clone::Clone::clone(&self.args),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for AngleBracketedArgs {
            fn encode(&self, __encoder: &mut __E) {
                let AngleBracketedArgs {
                        span: ref __binding_0, args: ref __binding_1 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for AngleBracketedArgs {
            fn decode(__decoder: &mut __D) -> Self {
                AngleBracketedArgs {
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    args: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for AngleBracketedArgs {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "AngleBracketedArgs", "span", &self.span, "args", &&self.args)
    }
}Debug, #[automatically_derived]
impl ::core::default::Default for AngleBracketedArgs {
    #[inline]
    fn default() -> AngleBracketedArgs {
        AngleBracketedArgs {
            span: ::core::default::Default::default(),
            args: ::core::default::Default::default(),
        }
    }
}Default, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            AngleBracketedArgs where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    AngleBracketedArgs {
                        span: ref __binding_0, args: ref __binding_1 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for AngleBracketedArgs
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    AngleBracketedArgs {
                        span: ref mut __binding_0, args: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
302pub struct AngleBracketedArgs {
303    /// The overall span.
304    pub span: Span,
305    /// The comma separated parts in the `<...>`.
306    pub args: ThinVec<AngleBracketedArg>,
307}
308
309/// Either an argument for a generic parameter or a constraint on an associated item.
310#[derive(#[automatically_derived]
impl ::core::clone::Clone for AngleBracketedArg {
    #[inline]
    fn clone(&self) -> AngleBracketedArg {
        match self {
            AngleBracketedArg::Arg(__self_0) =>
                AngleBracketedArg::Arg(::core::clone::Clone::clone(__self_0)),
            AngleBracketedArg::Constraint(__self_0) =>
                AngleBracketedArg::Constraint(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for AngleBracketedArg {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        AngleBracketedArg::Arg(ref __binding_0) => { 0usize }
                        AngleBracketedArg::Constraint(ref __binding_0) => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    AngleBracketedArg::Arg(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AngleBracketedArg::Constraint(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for AngleBracketedArg {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        AngleBracketedArg::Arg(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        AngleBracketedArg::Constraint(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `AngleBracketedArg`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for AngleBracketedArg {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            AngleBracketedArg::Arg(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Arg",
                    &__self_0),
            AngleBracketedArg::Constraint(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Constraint", &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            AngleBracketedArg where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    AngleBracketedArg::Arg(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    AngleBracketedArg::Constraint(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for AngleBracketedArg
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    AngleBracketedArg::Arg(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    AngleBracketedArg::Constraint(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
311pub enum AngleBracketedArg {
312    /// A generic argument for a generic parameter.
313    Arg(GenericArg),
314    /// A constraint on an associated item.
315    Constraint(AssocItemConstraint),
316}
317
318impl AngleBracketedArg {
319    pub fn span(&self) -> Span {
320        match self {
321            AngleBracketedArg::Arg(arg) => arg.span(),
322            AngleBracketedArg::Constraint(constraint) => constraint.span,
323        }
324    }
325}
326
327impl From<AngleBracketedArgs> for Box<GenericArgs> {
328    fn from(val: AngleBracketedArgs) -> Self {
329        Box::new(GenericArgs::AngleBracketed(val))
330    }
331}
332
333impl From<ParenthesizedArgs> for Box<GenericArgs> {
334    fn from(val: ParenthesizedArgs) -> Self {
335        Box::new(GenericArgs::Parenthesized(val))
336    }
337}
338
339/// A path like `Foo(A, B) -> C`.
340#[derive(#[automatically_derived]
impl ::core::clone::Clone for ParenthesizedArgs {
    #[inline]
    fn clone(&self) -> ParenthesizedArgs {
        ParenthesizedArgs {
            span: ::core::clone::Clone::clone(&self.span),
            inputs: ::core::clone::Clone::clone(&self.inputs),
            inputs_span: ::core::clone::Clone::clone(&self.inputs_span),
            output: ::core::clone::Clone::clone(&self.output),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ParenthesizedArgs {
            fn encode(&self, __encoder: &mut __E) {
                let ParenthesizedArgs {
                        span: ref __binding_0,
                        inputs: ref __binding_1,
                        inputs_span: ref __binding_2,
                        output: ref __binding_3 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ParenthesizedArgs {
            fn decode(__decoder: &mut __D) -> Self {
                ParenthesizedArgs {
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    inputs: ::rustc_serialize::Decodable::decode(__decoder),
                    inputs_span: ::rustc_serialize::Decodable::decode(__decoder),
                    output: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ParenthesizedArgs {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f,
            "ParenthesizedArgs", "span", &self.span, "inputs", &self.inputs,
            "inputs_span", &self.inputs_span, "output", &&self.output)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            ParenthesizedArgs where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    ParenthesizedArgs {
                        span: ref __binding_0,
                        inputs: ref __binding_1,
                        inputs_span: ref __binding_2,
                        output: ref __binding_3 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for ParenthesizedArgs
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    ParenthesizedArgs {
                        span: ref mut __binding_0,
                        inputs: ref mut __binding_1,
                        inputs_span: ref mut __binding_2,
                        output: ref mut __binding_3 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
341pub struct ParenthesizedArgs {
342    /// ```text
343    /// Foo(A, B) -> C
344    /// ^^^^^^^^^^^^^^
345    /// ```
346    pub span: Span,
347
348    /// `(A, B)`
349    pub inputs: ThinVec<Param>,
350
351    /// ```text
352    /// Foo(A, B) -> C
353    ///    ^^^^^^
354    /// ```
355    pub inputs_span: Span,
356
357    /// `C`
358    pub output: FnRetTy,
359}
360
361impl ParenthesizedArgs {
362    pub fn as_angle_bracketed_args(&self) -> AngleBracketedArgs {
363        let args = self
364            .inputs
365            .iter()
366            .cloned()
367            .map(|input| AngleBracketedArg::Arg(GenericArg::Type(input.ty)))
368            .collect();
369        AngleBracketedArgs { span: self.inputs_span, args }
370    }
371}
372
373pub use crate::node_id::{CRATE_NODE_ID, DUMMY_NODE_ID, NodeId};
374
375/// Modifiers on a trait bound like `[const]`, `?` and `!`.
376#[derive(#[automatically_derived]
impl ::core::marker::Copy for TraitBoundModifiers { }Copy, #[automatically_derived]
impl ::core::clone::Clone for TraitBoundModifiers {
    #[inline]
    fn clone(&self) -> TraitBoundModifiers {
        let _: ::core::clone::AssertParamIsClone<BoundConstness>;
        let _: ::core::clone::AssertParamIsClone<BoundAsyncness>;
        let _: ::core::clone::AssertParamIsClone<BoundPolarity>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for TraitBoundModifiers {
    #[inline]
    fn eq(&self, other: &TraitBoundModifiers) -> bool {
        self.constness == other.constness && self.asyncness == other.asyncness
            && self.polarity == other.polarity
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for TraitBoundModifiers {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<BoundConstness>;
        let _: ::core::cmp::AssertParamIsEq<BoundAsyncness>;
        let _: ::core::cmp::AssertParamIsEq<BoundPolarity>;
    }
}Eq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for TraitBoundModifiers {
            fn encode(&self, __encoder: &mut __E) {
                let TraitBoundModifiers {
                        constness: ref __binding_0,
                        asyncness: ref __binding_1,
                        polarity: ref __binding_2 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for TraitBoundModifiers {
            fn decode(__decoder: &mut __D) -> Self {
                TraitBoundModifiers {
                    constness: ::rustc_serialize::Decodable::decode(__decoder),
                    asyncness: ::rustc_serialize::Decodable::decode(__decoder),
                    polarity: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for TraitBoundModifiers {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f,
            "TraitBoundModifiers", "constness", &self.constness, "asyncness",
            &self.asyncness, "polarity", &&self.polarity)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            TraitBoundModifiers where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    TraitBoundModifiers {
                        constness: ref __binding_0,
                        asyncness: ref __binding_1,
                        polarity: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for TraitBoundModifiers
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    TraitBoundModifiers {
                        constness: ref mut __binding_0,
                        asyncness: ref mut __binding_1,
                        polarity: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
377pub struct TraitBoundModifiers {
378    pub constness: BoundConstness,
379    pub asyncness: BoundAsyncness,
380    pub polarity: BoundPolarity,
381}
382
383impl TraitBoundModifiers {
384    pub const NONE: Self = Self {
385        constness: BoundConstness::Never,
386        asyncness: BoundAsyncness::Normal,
387        polarity: BoundPolarity::Positive,
388    };
389}
390
391#[derive(#[automatically_derived]
impl ::core::clone::Clone for GenericBound {
    #[inline]
    fn clone(&self) -> GenericBound {
        match self {
            GenericBound::Trait(__self_0) =>
                GenericBound::Trait(::core::clone::Clone::clone(__self_0)),
            GenericBound::Outlives(__self_0) =>
                GenericBound::Outlives(::core::clone::Clone::clone(__self_0)),
            GenericBound::Use(__self_0, __self_1) =>
                GenericBound::Use(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for GenericBound {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        GenericBound::Trait(ref __binding_0) => { 0usize }
                        GenericBound::Outlives(ref __binding_0) => { 1usize }
                        GenericBound::Use(ref __binding_0, ref __binding_1) => {
                            2usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    GenericBound::Trait(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    GenericBound::Outlives(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    GenericBound::Use(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for GenericBound {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        GenericBound::Trait(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        GenericBound::Outlives(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        GenericBound::Use(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `GenericBound`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for GenericBound {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            GenericBound::Trait(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Trait",
                    &__self_0),
            GenericBound::Outlives(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Outlives", &__self_0),
            GenericBound::Use(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Use",
                    __self_0, &__self_1),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for GenericBound
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    GenericBound::Trait(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    GenericBound::Outlives(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, (LifetimeCtxt::Bound))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    GenericBound::Use(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for GenericBound where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    GenericBound::Trait(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    GenericBound::Outlives(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, (LifetimeCtxt::Bound))
                        }
                    }
                    GenericBound::Use(ref mut __binding_0, ref mut __binding_1)
                        => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
392pub enum GenericBound {
393    Trait(PolyTraitRef),
394    Outlives(#[visitable(extra = LifetimeCtxt::Bound)] Lifetime),
395    /// Precise capturing syntax: `impl Sized + use<'a>`
396    Use(ThinVec<PreciseCapturingArg>, Span),
397}
398
399impl GenericBound {
400    pub fn span(&self) -> Span {
401        match self {
402            GenericBound::Trait(t, ..) => t.span,
403            GenericBound::Outlives(l) => l.ident.span,
404            GenericBound::Use(_, span) => *span,
405        }
406    }
407}
408
409pub type GenericBounds = ThinVec<GenericBound>;
410
411/// Specifies the enforced ordering for generic parameters. In the future,
412/// if we wanted to relax this order, we could override `PartialEq` and
413/// `PartialOrd`, to allow the kinds to be unordered.
414#[derive(#[automatically_derived]
impl ::core::hash::Hash for ParamKindOrd {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state)
    }
}Hash, #[automatically_derived]
impl ::core::clone::Clone for ParamKindOrd {
    #[inline]
    fn clone(&self) -> ParamKindOrd { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for ParamKindOrd { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for ParamKindOrd {
    #[inline]
    fn eq(&self, other: &ParamKindOrd) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ParamKindOrd {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for ParamKindOrd {
    #[inline]
    fn partial_cmp(&self, other: &ParamKindOrd)
        -> ::core::option::Option<::core::cmp::Ordering> {
        ::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
    }
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for ParamKindOrd {
    #[inline]
    fn cmp(&self, other: &ParamKindOrd) -> ::core::cmp::Ordering {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        ::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
    }
}Ord)]
415pub enum ParamKindOrd {
416    Lifetime,
417    TypeOrConst,
418}
419
420impl fmt::Display for ParamKindOrd {
421    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
422        match self {
423            ParamKindOrd::Lifetime => "lifetime".fmt(f),
424            ParamKindOrd::TypeOrConst => "type and const".fmt(f),
425        }
426    }
427}
428
429#[derive(#[automatically_derived]
impl ::core::clone::Clone for GenericParamKind {
    #[inline]
    fn clone(&self) -> GenericParamKind {
        match self {
            GenericParamKind::Lifetime => GenericParamKind::Lifetime,
            GenericParamKind::Type { default: __self_0 } =>
                GenericParamKind::Type {
                    default: ::core::clone::Clone::clone(__self_0),
                },
            GenericParamKind::Const {
                ty: __self_0, span: __self_1, default: __self_2 } =>
                GenericParamKind::Const {
                    ty: ::core::clone::Clone::clone(__self_0),
                    span: ::core::clone::Clone::clone(__self_1),
                    default: ::core::clone::Clone::clone(__self_2),
                },
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for GenericParamKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        GenericParamKind::Lifetime => { 0usize }
                        GenericParamKind::Type { default: ref __binding_0 } => {
                            1usize
                        }
                        GenericParamKind::Const {
                            ty: ref __binding_0,
                            span: ref __binding_1,
                            default: ref __binding_2 } => {
                            2usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    GenericParamKind::Lifetime => {}
                    GenericParamKind::Type { default: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    GenericParamKind::Const {
                        ty: ref __binding_0,
                        span: ref __binding_1,
                        default: ref __binding_2 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for GenericParamKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { GenericParamKind::Lifetime }
                    1usize => {
                        GenericParamKind::Type {
                            default: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    2usize => {
                        GenericParamKind::Const {
                            ty: ::rustc_serialize::Decodable::decode(__decoder),
                            span: ::rustc_serialize::Decodable::decode(__decoder),
                            default: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `GenericParamKind`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for GenericParamKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            GenericParamKind::Lifetime =>
                ::core::fmt::Formatter::write_str(f, "Lifetime"),
            GenericParamKind::Type { default: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Type",
                    "default", &__self_0),
            GenericParamKind::Const {
                ty: __self_0, span: __self_1, default: __self_2 } =>
                ::core::fmt::Formatter::debug_struct_field3_finish(f, "Const",
                    "ty", __self_0, "span", __self_1, "default", &__self_2),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            GenericParamKind where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    GenericParamKind::Lifetime => {}
                    GenericParamKind::Type { default: ref __binding_0 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    GenericParamKind::Const {
                        ty: ref __binding_0,
                        span: ref __binding_1,
                        default: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for GenericParamKind
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    GenericParamKind::Lifetime => {}
                    GenericParamKind::Type { default: ref mut __binding_0 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    GenericParamKind::Const {
                        ty: ref mut __binding_0,
                        span: ref mut __binding_1,
                        default: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
430pub enum GenericParamKind {
431    /// A lifetime definition (e.g., `'a: 'b + 'c + 'd`).
432    Lifetime,
433    Type {
434        default: Option<Box<Ty>>,
435    },
436    Const {
437        ty: Box<Ty>,
438        /// Span of the whole parameter definition, including default.
439        span: Span,
440        /// Optional default value for the const generic param.
441        default: Option<AnonConst>,
442    },
443}
444
445#[derive(#[automatically_derived]
impl ::core::clone::Clone for GenericParam {
    #[inline]
    fn clone(&self) -> GenericParam {
        GenericParam {
            id: ::core::clone::Clone::clone(&self.id),
            ident: ::core::clone::Clone::clone(&self.ident),
            attrs: ::core::clone::Clone::clone(&self.attrs),
            bounds: ::core::clone::Clone::clone(&self.bounds),
            is_placeholder: ::core::clone::Clone::clone(&self.is_placeholder),
            kind: ::core::clone::Clone::clone(&self.kind),
            colon_span: ::core::clone::Clone::clone(&self.colon_span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for GenericParam {
            fn encode(&self, __encoder: &mut __E) {
                let GenericParam {
                        id: ref __binding_0,
                        ident: ref __binding_1,
                        attrs: ref __binding_2,
                        bounds: ref __binding_3,
                        is_placeholder: ref __binding_4,
                        kind: ref __binding_5,
                        colon_span: ref __binding_6 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_5,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_6,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for GenericParam {
            fn decode(__decoder: &mut __D) -> Self {
                GenericParam {
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    ident: ::rustc_serialize::Decodable::decode(__decoder),
                    attrs: ::rustc_serialize::Decodable::decode(__decoder),
                    bounds: ::rustc_serialize::Decodable::decode(__decoder),
                    is_placeholder: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    colon_span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for GenericParam {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["id", "ident", "attrs", "bounds", "is_placeholder", "kind",
                        "colon_span"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.id, &self.ident, &self.attrs, &self.bounds,
                        &self.is_placeholder, &self.kind, &&self.colon_span];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "GenericParam",
            names, values)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for GenericParam
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    GenericParam {
                        id: ref __binding_0,
                        ident: ref __binding_1,
                        attrs: ref __binding_2,
                        bounds: ref __binding_3,
                        is_placeholder: ref __binding_4,
                        kind: ref __binding_5,
                        colon_span: ref __binding_6 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, (BoundKind::Bound))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_5,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_6,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for GenericParam where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    GenericParam {
                        id: ref mut __binding_0,
                        ident: ref mut __binding_1,
                        attrs: ref mut __binding_2,
                        bounds: ref mut __binding_3,
                        is_placeholder: ref mut __binding_4,
                        kind: ref mut __binding_5,
                        colon_span: ref mut __binding_6 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, (BoundKind::Bound))
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_5,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_6,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
446pub struct GenericParam {
447    pub id: NodeId,
448    pub ident: Ident,
449    pub attrs: AttrVec,
450    #[visitable(extra = BoundKind::Bound)]
451    pub bounds: GenericBounds,
452    pub is_placeholder: bool,
453    pub kind: GenericParamKind,
454    pub colon_span: Option<Span>,
455}
456
457impl GenericParam {
458    pub fn span(&self) -> Span {
459        match &self.kind {
460            GenericParamKind::Lifetime | GenericParamKind::Type { default: None } => {
461                self.ident.span
462            }
463            GenericParamKind::Type { default: Some(ty) } => self.ident.span.to(ty.span),
464            GenericParamKind::Const { span, .. } => *span,
465        }
466    }
467}
468
469/// Represents lifetime, type and const parameters attached to a declaration of
470/// a function, enum, trait, etc.
471#[derive(#[automatically_derived]
impl ::core::clone::Clone for Generics {
    #[inline]
    fn clone(&self) -> Generics {
        Generics {
            params: ::core::clone::Clone::clone(&self.params),
            where_clause: ::core::clone::Clone::clone(&self.where_clause),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Generics {
            fn encode(&self, __encoder: &mut __E) {
                let Generics {
                        params: ref __binding_0,
                        where_clause: ref __binding_1,
                        span: ref __binding_2 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Generics {
            fn decode(__decoder: &mut __D) -> Self {
                Generics {
                    params: ::rustc_serialize::Decodable::decode(__decoder),
                    where_clause: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Generics {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "Generics",
            "params", &self.params, "where_clause", &self.where_clause,
            "span", &&self.span)
    }
}Debug, #[automatically_derived]
impl ::core::default::Default for Generics {
    #[inline]
    fn default() -> Generics {
        Generics {
            params: ::core::default::Default::default(),
            where_clause: ::core::default::Default::default(),
            span: ::core::default::Default::default(),
        }
    }
}Default, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Generics
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Generics {
                        params: ref __binding_0,
                        where_clause: ref __binding_1,
                        span: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Generics where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Generics {
                        params: ref mut __binding_0,
                        where_clause: ref mut __binding_1,
                        span: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
472pub struct Generics {
473    pub params: ThinVec<GenericParam>,
474    pub where_clause: WhereClause,
475    pub span: Span,
476}
477
478/// A where-clause in a definition.
479#[derive(#[automatically_derived]
impl ::core::clone::Clone for WhereClause {
    #[inline]
    fn clone(&self) -> WhereClause {
        WhereClause {
            has_where_token: ::core::clone::Clone::clone(&self.has_where_token),
            predicates: ::core::clone::Clone::clone(&self.predicates),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for WhereClause {
            fn encode(&self, __encoder: &mut __E) {
                let WhereClause {
                        has_where_token: ref __binding_0,
                        predicates: ref __binding_1,
                        span: ref __binding_2 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for WhereClause {
            fn decode(__decoder: &mut __D) -> Self {
                WhereClause {
                    has_where_token: ::rustc_serialize::Decodable::decode(__decoder),
                    predicates: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for WhereClause {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "WhereClause",
            "has_where_token", &self.has_where_token, "predicates",
            &self.predicates, "span", &&self.span)
    }
}Debug, #[automatically_derived]
impl ::core::default::Default for WhereClause {
    #[inline]
    fn default() -> WhereClause {
        WhereClause {
            has_where_token: ::core::default::Default::default(),
            predicates: ::core::default::Default::default(),
            span: ::core::default::Default::default(),
        }
    }
}Default, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for WhereClause
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    WhereClause {
                        has_where_token: ref __binding_0,
                        predicates: ref __binding_1,
                        span: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for WhereClause where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    WhereClause {
                        has_where_token: ref mut __binding_0,
                        predicates: ref mut __binding_1,
                        span: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
480pub struct WhereClause {
481    /// `true` if we ate a `where` token.
482    ///
483    /// This can happen if we parsed no predicates, e.g., `struct Foo where {}`.
484    /// This allows us to pretty-print accurately and provide correct suggestion diagnostics.
485    pub has_where_token: bool,
486    pub predicates: ThinVec<WherePredicate>,
487    pub span: Span,
488}
489
490impl WhereClause {
491    pub fn is_empty(&self) -> bool {
492        !self.has_where_token && self.predicates.is_empty()
493    }
494}
495
496/// A single predicate in a where-clause.
497#[derive(#[automatically_derived]
impl ::core::clone::Clone for WherePredicate {
    #[inline]
    fn clone(&self) -> WherePredicate {
        WherePredicate {
            attrs: ::core::clone::Clone::clone(&self.attrs),
            kind: ::core::clone::Clone::clone(&self.kind),
            id: ::core::clone::Clone::clone(&self.id),
            span: ::core::clone::Clone::clone(&self.span),
            is_placeholder: ::core::clone::Clone::clone(&self.is_placeholder),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for WherePredicate {
            fn encode(&self, __encoder: &mut __E) {
                let WherePredicate {
                        attrs: ref __binding_0,
                        kind: ref __binding_1,
                        id: ref __binding_2,
                        span: ref __binding_3,
                        is_placeholder: ref __binding_4 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for WherePredicate {
            fn decode(__decoder: &mut __D) -> Self {
                WherePredicate {
                    attrs: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    is_placeholder: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for WherePredicate {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f,
            "WherePredicate", "attrs", &self.attrs, "kind", &self.kind, "id",
            &self.id, "span", &self.span, "is_placeholder",
            &&self.is_placeholder)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            WherePredicate where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    WherePredicate {
                        attrs: ref __binding_0,
                        kind: ref __binding_1,
                        id: ref __binding_2,
                        span: ref __binding_3,
                        is_placeholder: ref __binding_4 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for WherePredicate where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    WherePredicate {
                        attrs: ref mut __binding_0,
                        kind: ref mut __binding_1,
                        id: ref mut __binding_2,
                        span: ref mut __binding_3,
                        is_placeholder: ref mut __binding_4 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
498pub struct WherePredicate {
499    pub attrs: AttrVec,
500    pub kind: WherePredicateKind,
501    pub id: NodeId,
502    pub span: Span,
503    pub is_placeholder: bool,
504}
505
506/// Predicate kind in where-clause.
507#[derive(#[automatically_derived]
impl ::core::clone::Clone for WherePredicateKind {
    #[inline]
    fn clone(&self) -> WherePredicateKind {
        match self {
            WherePredicateKind::BoundPredicate(__self_0) =>
                WherePredicateKind::BoundPredicate(::core::clone::Clone::clone(__self_0)),
            WherePredicateKind::RegionPredicate(__self_0) =>
                WherePredicateKind::RegionPredicate(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for WherePredicateKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        WherePredicateKind::BoundPredicate(ref __binding_0) => {
                            0usize
                        }
                        WherePredicateKind::RegionPredicate(ref __binding_0) => {
                            1usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    WherePredicateKind::BoundPredicate(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    WherePredicateKind::RegionPredicate(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for WherePredicateKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        WherePredicateKind::BoundPredicate(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        WherePredicateKind::RegionPredicate(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `WherePredicateKind`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for WherePredicateKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            WherePredicateKind::BoundPredicate(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "BoundPredicate", &__self_0),
            WherePredicateKind::RegionPredicate(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "RegionPredicate", &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            WherePredicateKind where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    WherePredicateKind::BoundPredicate(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    WherePredicateKind::RegionPredicate(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for WherePredicateKind
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    WherePredicateKind::BoundPredicate(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    WherePredicateKind::RegionPredicate(ref mut __binding_0) =>
                        {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
508pub enum WherePredicateKind {
509    /// A type bound (e.g., `for<'c> Foo: Send + Clone + 'c`).
510    BoundPredicate(WhereBoundPredicate),
511    /// A lifetime predicate (e.g., `'a: 'b + 'c`).
512    RegionPredicate(WhereRegionPredicate),
513}
514
515/// A type bound.
516///
517/// E.g., `for<'c> Foo: Send + Clone + 'c`.
518#[derive(#[automatically_derived]
impl ::core::clone::Clone for WhereBoundPredicate {
    #[inline]
    fn clone(&self) -> WhereBoundPredicate {
        WhereBoundPredicate {
            bound_generic_params: ::core::clone::Clone::clone(&self.bound_generic_params),
            bounded_ty: ::core::clone::Clone::clone(&self.bounded_ty),
            bounds: ::core::clone::Clone::clone(&self.bounds),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for WhereBoundPredicate {
            fn encode(&self, __encoder: &mut __E) {
                let WhereBoundPredicate {
                        bound_generic_params: ref __binding_0,
                        bounded_ty: ref __binding_1,
                        bounds: ref __binding_2 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for WhereBoundPredicate {
            fn decode(__decoder: &mut __D) -> Self {
                WhereBoundPredicate {
                    bound_generic_params: ::rustc_serialize::Decodable::decode(__decoder),
                    bounded_ty: ::rustc_serialize::Decodable::decode(__decoder),
                    bounds: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for WhereBoundPredicate {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f,
            "WhereBoundPredicate", "bound_generic_params",
            &self.bound_generic_params, "bounded_ty", &self.bounded_ty,
            "bounds", &&self.bounds)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            WhereBoundPredicate where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    WhereBoundPredicate {
                        bound_generic_params: ref __binding_0,
                        bounded_ty: ref __binding_1,
                        bounds: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, (BoundKind::Bound))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for WhereBoundPredicate
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    WhereBoundPredicate {
                        bound_generic_params: ref mut __binding_0,
                        bounded_ty: ref mut __binding_1,
                        bounds: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, (BoundKind::Bound))
                        }
                    }
                }
            }
        }
    };Walkable)]
519pub struct WhereBoundPredicate {
520    /// Any generics from a `for` binding.
521    pub bound_generic_params: ThinVec<GenericParam>,
522    /// The type being bounded.
523    pub bounded_ty: Box<Ty>,
524    /// Trait and lifetime bounds (`Clone + Send + 'static`).
525    #[visitable(extra = BoundKind::Bound)]
526    pub bounds: GenericBounds,
527}
528
529/// A lifetime predicate.
530///
531/// E.g., `'a: 'b + 'c`.
532#[derive(#[automatically_derived]
impl ::core::clone::Clone for WhereRegionPredicate {
    #[inline]
    fn clone(&self) -> WhereRegionPredicate {
        WhereRegionPredicate {
            lifetime: ::core::clone::Clone::clone(&self.lifetime),
            bounds: ::core::clone::Clone::clone(&self.bounds),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for WhereRegionPredicate {
            fn encode(&self, __encoder: &mut __E) {
                let WhereRegionPredicate {
                        lifetime: ref __binding_0, bounds: ref __binding_1 } =
                    *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for WhereRegionPredicate {
            fn decode(__decoder: &mut __D) -> Self {
                WhereRegionPredicate {
                    lifetime: ::rustc_serialize::Decodable::decode(__decoder),
                    bounds: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for WhereRegionPredicate {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "WhereRegionPredicate", "lifetime", &self.lifetime, "bounds",
            &&self.bounds)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            WhereRegionPredicate where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    WhereRegionPredicate {
                        lifetime: ref __binding_0, bounds: ref __binding_1 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, (LifetimeCtxt::Bound))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, (BoundKind::Bound))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for WhereRegionPredicate
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    WhereRegionPredicate {
                        lifetime: ref mut __binding_0, bounds: ref mut __binding_1 }
                        => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, (LifetimeCtxt::Bound))
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, (BoundKind::Bound))
                        }
                    }
                }
            }
        }
    };Walkable)]
533pub struct WhereRegionPredicate {
534    #[visitable(extra = LifetimeCtxt::Bound)]
535    pub lifetime: Lifetime,
536    #[visitable(extra = BoundKind::Bound)]
537    pub bounds: GenericBounds,
538}
539
540/// An equality predicate (unsupported).
541///
542/// E.g., `T = int`.
543#[derive(#[automatically_derived]
impl ::core::clone::Clone for WhereEqPredicate {
    #[inline]
    fn clone(&self) -> WhereEqPredicate {
        WhereEqPredicate {
            lhs_ty: ::core::clone::Clone::clone(&self.lhs_ty),
            rhs_ty: ::core::clone::Clone::clone(&self.rhs_ty),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for WhereEqPredicate {
            fn encode(&self, __encoder: &mut __E) {
                let WhereEqPredicate {
                        lhs_ty: ref __binding_0, rhs_ty: ref __binding_1 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for WhereEqPredicate {
            fn decode(__decoder: &mut __D) -> Self {
                WhereEqPredicate {
                    lhs_ty: ::rustc_serialize::Decodable::decode(__decoder),
                    rhs_ty: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for WhereEqPredicate {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "WhereEqPredicate", "lhs_ty", &self.lhs_ty, "rhs_ty",
            &&self.rhs_ty)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            WhereEqPredicate where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    WhereEqPredicate {
                        lhs_ty: ref __binding_0, rhs_ty: ref __binding_1 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for WhereEqPredicate
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    WhereEqPredicate {
                        lhs_ty: ref mut __binding_0, rhs_ty: ref mut __binding_1 }
                        => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
544pub struct WhereEqPredicate {
545    pub lhs_ty: Box<Ty>,
546    pub rhs_ty: Box<Ty>,
547}
548
549#[derive(#[automatically_derived]
impl ::core::clone::Clone for Crate {
    #[inline]
    fn clone(&self) -> Crate {
        Crate {
            id: ::core::clone::Clone::clone(&self.id),
            attrs: ::core::clone::Clone::clone(&self.attrs),
            items: ::core::clone::Clone::clone(&self.items),
            spans: ::core::clone::Clone::clone(&self.spans),
            is_placeholder: ::core::clone::Clone::clone(&self.is_placeholder),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Crate {
            fn encode(&self, __encoder: &mut __E) {
                let Crate {
                        id: ref __binding_0,
                        attrs: ref __binding_1,
                        items: ref __binding_2,
                        spans: ref __binding_3,
                        is_placeholder: ref __binding_4 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Crate {
            fn decode(__decoder: &mut __D) -> Self {
                Crate {
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    attrs: ::rustc_serialize::Decodable::decode(__decoder),
                    items: ::rustc_serialize::Decodable::decode(__decoder),
                    spans: ::rustc_serialize::Decodable::decode(__decoder),
                    is_placeholder: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Crate {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f, "Crate", "id",
            &self.id, "attrs", &self.attrs, "items", &self.items, "spans",
            &self.spans, "is_placeholder", &&self.is_placeholder)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Crate where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Crate {
                        id: ref __binding_0,
                        attrs: ref __binding_1,
                        items: ref __binding_2,
                        spans: ref __binding_3,
                        is_placeholder: ref __binding_4 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Crate where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Crate {
                        id: ref mut __binding_0,
                        attrs: ref mut __binding_1,
                        items: ref mut __binding_2,
                        spans: ref mut __binding_3,
                        is_placeholder: ref mut __binding_4 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
550pub struct Crate {
551    /// Must be equal to `CRATE_NODE_ID` after the crate root is expanded, but may hold
552    /// expansion placeholders or an unassigned value (`DUMMY_NODE_ID`) before that.
553    pub id: NodeId,
554    pub attrs: AttrVec,
555    pub items: ThinVec<Box<Item>>,
556    pub spans: ModSpans,
557    pub is_placeholder: bool,
558}
559
560/// A semantic representation of a meta item.
561///
562/// A meta item is a slightly restricted form of an attribute -- it can only contain
563/// expressions in certain leaf positions, rather than arbitrary token streams -- that is used
564/// for most built-in attributes.
565///
566/// E.g., `#[test]`, `#[derive(..)]`, `#[rustfmt::skip]` or `#[feature = "foo"]`.
567#[derive(#[automatically_derived]
impl ::core::clone::Clone for MetaItem {
    #[inline]
    fn clone(&self) -> MetaItem {
        MetaItem {
            unsafety: ::core::clone::Clone::clone(&self.unsafety),
            path: ::core::clone::Clone::clone(&self.path),
            kind: ::core::clone::Clone::clone(&self.kind),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for MetaItem {
            fn encode(&self, __encoder: &mut __E) {
                let MetaItem {
                        unsafety: ref __binding_0,
                        path: ref __binding_1,
                        kind: ref __binding_2,
                        span: ref __binding_3 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for MetaItem {
            fn decode(__decoder: &mut __D) -> Self {
                MetaItem {
                    unsafety: ::rustc_serialize::Decodable::decode(__decoder),
                    path: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for MetaItem {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "MetaItem",
            "unsafety", &self.unsafety, "path", &self.path, "kind",
            &self.kind, "span", &&self.span)
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for MetaItem {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    MetaItem {
                        unsafety: ref __binding_0,
                        path: ref __binding_1,
                        kind: ref __binding_2,
                        span: ref __binding_3 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                        { __binding_3.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
568pub struct MetaItem {
569    pub unsafety: Safety,
570    pub path: Path,
571    pub kind: MetaItemKind,
572    pub span: Span,
573}
574
575/// The meta item kind, containing the data after the initial path.
576#[derive(#[automatically_derived]
impl ::core::clone::Clone for MetaItemKind {
    #[inline]
    fn clone(&self) -> MetaItemKind {
        match self {
            MetaItemKind::Word => MetaItemKind::Word,
            MetaItemKind::List(__self_0) =>
                MetaItemKind::List(::core::clone::Clone::clone(__self_0)),
            MetaItemKind::NameValue(__self_0) =>
                MetaItemKind::NameValue(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for MetaItemKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        MetaItemKind::Word => { 0usize }
                        MetaItemKind::List(ref __binding_0) => { 1usize }
                        MetaItemKind::NameValue(ref __binding_0) => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    MetaItemKind::Word => {}
                    MetaItemKind::List(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    MetaItemKind::NameValue(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for MetaItemKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { MetaItemKind::Word }
                    1usize => {
                        MetaItemKind::List(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        MetaItemKind::NameValue(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `MetaItemKind`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for MetaItemKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            MetaItemKind::Word =>
                ::core::fmt::Formatter::write_str(f, "Word"),
            MetaItemKind::List(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "List",
                    &__self_0),
            MetaItemKind::NameValue(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "NameValue", &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for MetaItemKind
            {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    MetaItemKind::Word => {}
                    MetaItemKind::List(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    MetaItemKind::NameValue(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
577pub enum MetaItemKind {
578    /// Word meta item.
579    ///
580    /// E.g., `#[test]`, which lacks any arguments after `test`.
581    Word,
582
583    /// List meta item.
584    ///
585    /// E.g., `#[derive(..)]`, where the field represents the `..`.
586    List(ThinVec<MetaItemInner>),
587
588    /// Name value meta item.
589    ///
590    /// E.g., `#[feature = "foo"]`, where the field represents the `"foo"`.
591    NameValue(MetaItemLit),
592}
593
594/// Values inside meta item lists.
595///
596/// E.g., each of `Clone`, `Copy` in `#[derive(Clone, Copy)]`.
597#[derive(#[automatically_derived]
impl ::core::clone::Clone for MetaItemInner {
    #[inline]
    fn clone(&self) -> MetaItemInner {
        match self {
            MetaItemInner::MetaItem(__self_0) =>
                MetaItemInner::MetaItem(::core::clone::Clone::clone(__self_0)),
            MetaItemInner::Lit(__self_0) =>
                MetaItemInner::Lit(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for MetaItemInner {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        MetaItemInner::MetaItem(ref __binding_0) => { 0usize }
                        MetaItemInner::Lit(ref __binding_0) => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    MetaItemInner::MetaItem(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    MetaItemInner::Lit(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for MetaItemInner {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        MetaItemInner::MetaItem(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        MetaItemInner::Lit(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `MetaItemInner`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for MetaItemInner {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            MetaItemInner::MetaItem(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "MetaItem", &__self_0),
            MetaItemInner::Lit(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Lit",
                    &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            MetaItemInner {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    MetaItemInner::MetaItem(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    MetaItemInner::Lit(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
598pub enum MetaItemInner {
599    /// A full MetaItem, for recursive meta items.
600    MetaItem(MetaItem),
601
602    /// A literal.
603    ///
604    /// E.g., `"foo"`, `64`, `true`.
605    Lit(MetaItemLit),
606}
607
608/// A block (`{ .. }`).
609///
610/// E.g., `{ .. }` as in `fn foo() { .. }`.
611#[derive(#[automatically_derived]
impl ::core::clone::Clone for Block {
    #[inline]
    fn clone(&self) -> Block {
        Block {
            stmts: ::core::clone::Clone::clone(&self.stmts),
            id: ::core::clone::Clone::clone(&self.id),
            rules: ::core::clone::Clone::clone(&self.rules),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Block {
            fn encode(&self, __encoder: &mut __E) {
                let Block {
                        stmts: ref __binding_0,
                        id: ref __binding_1,
                        rules: ref __binding_2,
                        span: ref __binding_3 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Block {
            fn decode(__decoder: &mut __D) -> Self {
                Block {
                    stmts: ::rustc_serialize::Decodable::decode(__decoder),
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    rules: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Block {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "Block",
            "stmts", &self.stmts, "id", &self.id, "rules", &self.rules,
            "span", &&self.span)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Block where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Block {
                        stmts: ref __binding_0,
                        id: ref __binding_1,
                        rules: ref __binding_2,
                        span: ref __binding_3 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Block where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Block {
                        stmts: ref mut __binding_0,
                        id: ref mut __binding_1,
                        rules: ref mut __binding_2,
                        span: ref mut __binding_3 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
612pub struct Block {
613    /// The statements in the block.
614    pub stmts: ThinVec<Stmt>,
615    pub id: NodeId,
616    /// Distinguishes between `unsafe { ... }` and `{ ... }`.
617    pub rules: BlockCheckMode,
618    pub span: Span,
619}
620
621/// A match pattern.
622///
623/// Patterns appear in match statements and some other contexts, such as `let` and `if let`.
624#[derive(#[automatically_derived]
impl ::core::clone::Clone for Pat {
    #[inline]
    fn clone(&self) -> Pat {
        Pat {
            id: ::core::clone::Clone::clone(&self.id),
            kind: ::core::clone::Clone::clone(&self.kind),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Pat {
            fn encode(&self, __encoder: &mut __E) {
                let Pat {
                        id: ref __binding_0,
                        kind: ref __binding_1,
                        span: ref __binding_2 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Pat {
            fn decode(__decoder: &mut __D) -> Self {
                Pat {
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Pat {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "Pat", "id",
            &self.id, "kind", &self.kind, "span", &&self.span)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Pat where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Pat {
                        id: ref __binding_0,
                        kind: ref __binding_1,
                        span: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Pat where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Pat {
                        id: ref mut __binding_0,
                        kind: ref mut __binding_1,
                        span: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
625pub struct Pat {
626    pub id: NodeId,
627    pub kind: PatKind,
628    pub span: Span,
629}
630
631impl Pat {
632    /// Attempt reparsing the pattern as a type.
633    /// This is intended for use by diagnostics.
634    pub fn to_ty(&self) -> Option<Box<Ty>> {
635        let kind = match &self.kind {
636            PatKind::Missing => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
637            // In a type expression `_` is an inference variable.
638            PatKind::Wild => TyKind::Infer,
639            // An IDENT pattern with no binding mode would be valid as path to a type. E.g. `u32`.
640            PatKind::Ident(BindingMode::NONE, ident, None) => {
641                TyKind::Path(None, Path::from_ident(*ident))
642            }
643            PatKind::Path(qself, path) => TyKind::Path(qself.clone(), path.clone()),
644            PatKind::MacCall(mac) => TyKind::MacCall(mac.clone()),
645            // `&mut? P` can be reinterpreted as `&mut? T` where `T` is `P` reparsed as a type.
646            PatKind::Ref(pat, pinned, mutbl) => pat.to_ty().map(|ty| match pinned {
647                Pinnedness::Not => TyKind::Ref(None, MutTy { ty, mutbl: *mutbl }),
648                Pinnedness::Pinned => TyKind::PinnedRef(None, MutTy { ty, mutbl: *mutbl }),
649            })?,
650            // A slice/array pattern `[P]` can be reparsed as `[T]`, an unsized array,
651            // when `P` can be reparsed as a type `T`.
652            PatKind::Slice(pats) if let [pat] = pats.as_slice() => {
653                pat.to_ty().map(TyKind::Slice)?
654            }
655            // A tuple pattern `(P0, .., Pn)` can be reparsed as `(T0, .., Tn)`
656            // assuming `T0` to `Tn` are all syntactically valid as types.
657            PatKind::Tuple(pats) => {
658                let tys = pats.iter().map(|pat| pat.to_ty()).collect::<Option<ThinVec<_>>>()?;
659                TyKind::Tup(tys)
660            }
661            _ => return None,
662        };
663
664        Some(Box::new(Ty { kind, id: self.id, span: self.span }))
665    }
666
667    /// Walk top-down and call `it` in each place where a pattern occurs
668    /// starting with the root pattern `walk` is called on. If `it` returns
669    /// false then we will descend no further but siblings will be processed.
670    pub fn walk<'ast>(&'ast self, it: &mut impl FnMut(&'ast Pat) -> bool) {
671        if !it(self) {
672            return;
673        }
674
675        match &self.kind {
676            // Walk into the pattern associated with `Ident` (if any).
677            PatKind::Ident(_, _, Some(p)) => p.walk(it),
678
679            // Walk into each field of struct.
680            PatKind::Struct(_, _, fields, _) => fields.iter().for_each(|field| field.pat.walk(it)),
681
682            // Sequence of patterns.
683            PatKind::TupleStruct(_, _, s)
684            | PatKind::Tuple(s)
685            | PatKind::Slice(s)
686            | PatKind::Or(s) => s.iter().for_each(|p| p.walk(it)),
687
688            // Trivial wrappers over inner patterns.
689            PatKind::Deref(s)
690            | PatKind::Ref(s, _, _)
691            | PatKind::Paren(s)
692            | PatKind::Guard(s, _) => s.walk(it),
693
694            // These patterns do not contain subpatterns, skip.
695            PatKind::Missing
696            | PatKind::Wild
697            | PatKind::Rest
698            | PatKind::Never
699            | PatKind::Expr(_)
700            | PatKind::Range(..)
701            | PatKind::Ident(..)
702            | PatKind::Path(..)
703            | PatKind::MacCall(_)
704            | PatKind::Err(_) => {}
705        }
706    }
707
708    /// Strip off all reference patterns (`&`, `&mut`) and return the inner pattern.
709    pub fn peel_refs(&self) -> &Pat {
710        let mut current = self;
711        while let PatKind::Ref(inner, _, _) = &current.kind {
712            current = inner;
713        }
714        current
715    }
716
717    /// Is this a `..` pattern?
718    pub fn is_rest(&self) -> bool {
719        #[allow(non_exhaustive_omitted_patterns)] match self.kind {
    PatKind::Rest => true,
    _ => false,
}matches!(self.kind, PatKind::Rest)
720    }
721
722    /// Whether this could be a never pattern, taking into account that a macro invocation can
723    /// return a never pattern. Used to inform errors during parsing.
724    pub fn could_be_never_pattern(&self) -> bool {
725        let mut could_be_never_pattern = false;
726        self.walk(&mut |pat| match &pat.kind {
727            PatKind::Never | PatKind::MacCall(_) => {
728                could_be_never_pattern = true;
729                false
730            }
731            PatKind::Or(s) => {
732                could_be_never_pattern = s.iter().all(|p| p.could_be_never_pattern());
733                false
734            }
735            _ => true,
736        });
737        could_be_never_pattern
738    }
739
740    /// Whether this contains a `!` pattern. This in particular means that a feature gate error will
741    /// be raised if the feature is off. Used to avoid gating the feature twice.
742    pub fn contains_never_pattern(&self) -> bool {
743        let mut contains_never_pattern = false;
744        self.walk(&mut |pat| {
745            if #[allow(non_exhaustive_omitted_patterns)] match pat.kind {
    PatKind::Never => true,
    _ => false,
}matches!(pat.kind, PatKind::Never) {
746                contains_never_pattern = true;
747            }
748            true
749        });
750        contains_never_pattern
751    }
752
753    /// Return a name suitable for diagnostics.
754    pub fn descr(&self) -> Option<String> {
755        match &self.kind {
756            PatKind::Missing => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
757            PatKind::Wild => Some("_".to_string()),
758            PatKind::Ident(BindingMode::NONE, ident, None) => Some(::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("{0}", ident))
    })format!("{ident}")),
759            PatKind::Ref(pat, pinned, mutbl) => {
760                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)))
761            }
762            _ => None,
763        }
764    }
765}
766
767impl From<Box<Pat>> for Pat {
768    fn from(value: Box<Pat>) -> Self {
769        *value
770    }
771}
772
773/// A single field in a struct pattern.
774///
775/// Patterns like the fields of `Foo { x, ref y, ref mut z }`
776/// are treated the same as `x: x, y: ref y, z: ref mut z`,
777/// except when `is_shorthand` is true.
778#[derive(#[automatically_derived]
impl ::core::clone::Clone for PatField {
    #[inline]
    fn clone(&self) -> PatField {
        PatField {
            ident: ::core::clone::Clone::clone(&self.ident),
            pat: ::core::clone::Clone::clone(&self.pat),
            is_shorthand: ::core::clone::Clone::clone(&self.is_shorthand),
            attrs: ::core::clone::Clone::clone(&self.attrs),
            id: ::core::clone::Clone::clone(&self.id),
            span: ::core::clone::Clone::clone(&self.span),
            is_placeholder: ::core::clone::Clone::clone(&self.is_placeholder),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for PatField {
            fn encode(&self, __encoder: &mut __E) {
                let PatField {
                        ident: ref __binding_0,
                        pat: ref __binding_1,
                        is_shorthand: ref __binding_2,
                        attrs: ref __binding_3,
                        id: ref __binding_4,
                        span: ref __binding_5,
                        is_placeholder: ref __binding_6 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_5,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_6,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for PatField {
            fn decode(__decoder: &mut __D) -> Self {
                PatField {
                    ident: ::rustc_serialize::Decodable::decode(__decoder),
                    pat: ::rustc_serialize::Decodable::decode(__decoder),
                    is_shorthand: ::rustc_serialize::Decodable::decode(__decoder),
                    attrs: ::rustc_serialize::Decodable::decode(__decoder),
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    is_placeholder: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for PatField {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["ident", "pat", "is_shorthand", "attrs", "id", "span",
                        "is_placeholder"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.ident, &self.pat, &self.is_shorthand, &self.attrs,
                        &self.id, &self.span, &&self.is_placeholder];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "PatField",
            names, values)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for PatField
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    PatField {
                        ident: ref __binding_0,
                        pat: ref __binding_1,
                        is_shorthand: ref __binding_2,
                        attrs: ref __binding_3,
                        id: ref __binding_4,
                        span: ref __binding_5,
                        is_placeholder: ref __binding_6 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_5,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_6,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for PatField where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    PatField {
                        ident: ref mut __binding_0,
                        pat: ref mut __binding_1,
                        is_shorthand: ref mut __binding_2,
                        attrs: ref mut __binding_3,
                        id: ref mut __binding_4,
                        span: ref mut __binding_5,
                        is_placeholder: ref mut __binding_6 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_5,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_6,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
779pub struct PatField {
780    /// The identifier for the field.
781    pub ident: Ident,
782    /// The pattern the field is destructured to.
783    pub pat: Box<Pat>,
784    pub is_shorthand: bool,
785    pub attrs: AttrVec,
786    pub id: NodeId,
787    pub span: Span,
788    pub is_placeholder: bool,
789}
790
791#[derive(#[automatically_derived]
impl ::core::clone::Clone for ByRef {
    #[inline]
    fn clone(&self) -> ByRef {
        let _: ::core::clone::AssertParamIsClone<Pinnedness>;
        let _: ::core::clone::AssertParamIsClone<Mutability>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for ByRef { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for ByRef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            ByRef::Yes(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Yes",
                    __self_0, &__self_1),
            ByRef::No => ::core::fmt::Formatter::write_str(f, "No"),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for ByRef {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Pinnedness>;
        let _: ::core::cmp::AssertParamIsEq<Mutability>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for ByRef {
    #[inline]
    fn eq(&self, other: &ByRef) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (ByRef::Yes(__self_0, __self_1),
                    ByRef::Yes(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                _ => true,
            }
    }
}PartialEq)]
792#[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)]
793pub enum ByRef {
794    Yes(Pinnedness, Mutability),
795    No,
796}
797
798impl ByRef {
799    #[must_use]
800    pub fn cap_ref_mutability(mut self, mutbl: Mutability) -> Self {
801        if let ByRef::Yes(_, old_mutbl) = &mut self {
802            *old_mutbl = cmp::min(*old_mutbl, mutbl);
803        }
804        self
805    }
806}
807
808/// The mode of a binding (`mut`, `ref mut`, etc).
809///
810/// Used for both the explicit binding annotations given in the HIR for a binding
811/// and the final binding mode that we infer after type inference/match ergonomics.
812/// `.0` is the by-reference mode (`ref`, `ref mut`, or by value),
813/// `.1` is the mutability of the binding.
814#[derive(#[automatically_derived]
impl ::core::clone::Clone for BindingMode {
    #[inline]
    fn clone(&self) -> BindingMode {
        let _: ::core::clone::AssertParamIsClone<ByRef>;
        let _: ::core::clone::AssertParamIsClone<Mutability>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for BindingMode { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for BindingMode {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_tuple_field2_finish(f, "BindingMode",
            &self.0, &&self.1)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for BindingMode {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<ByRef>;
        let _: ::core::cmp::AssertParamIsEq<Mutability>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for BindingMode {
    #[inline]
    fn eq(&self, other: &BindingMode) -> bool {
        self.0 == other.0 && self.1 == other.1
    }
}PartialEq)]
815#[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)]
816pub struct BindingMode(pub ByRef, pub Mutability);
817
818impl BindingMode {
819    pub const NONE: Self = Self(ByRef::No, Mutability::Not);
820    pub const REF: Self = Self(ByRef::Yes(Pinnedness::Not, Mutability::Not), Mutability::Not);
821    pub const REF_PIN: Self =
822        Self(ByRef::Yes(Pinnedness::Pinned, Mutability::Not), Mutability::Not);
823    pub const MUT: Self = Self(ByRef::No, Mutability::Mut);
824    pub const REF_MUT: Self = Self(ByRef::Yes(Pinnedness::Not, Mutability::Mut), Mutability::Not);
825    pub const REF_PIN_MUT: Self =
826        Self(ByRef::Yes(Pinnedness::Pinned, Mutability::Mut), Mutability::Not);
827    pub const MUT_REF: Self = Self(ByRef::Yes(Pinnedness::Not, Mutability::Not), Mutability::Mut);
828    pub const MUT_REF_PIN: Self =
829        Self(ByRef::Yes(Pinnedness::Pinned, Mutability::Not), Mutability::Mut);
830    pub const MUT_REF_MUT: Self =
831        Self(ByRef::Yes(Pinnedness::Not, Mutability::Mut), Mutability::Mut);
832    pub const MUT_REF_PIN_MUT: Self =
833        Self(ByRef::Yes(Pinnedness::Pinned, Mutability::Mut), Mutability::Mut);
834
835    pub fn prefix_str(self) -> &'static str {
836        match self {
837            Self::NONE => "",
838            Self::REF => "ref ",
839            Self::REF_PIN => "ref pin const ",
840            Self::MUT => "mut ",
841            Self::REF_MUT => "ref mut ",
842            Self::REF_PIN_MUT => "ref pin mut ",
843            Self::MUT_REF => "mut ref ",
844            Self::MUT_REF_PIN => "mut ref pin ",
845            Self::MUT_REF_MUT => "mut ref mut ",
846            Self::MUT_REF_PIN_MUT => "mut ref pin mut ",
847        }
848    }
849}
850
851#[derive(#[automatically_derived]
impl ::core::clone::Clone for RangeEnd {
    #[inline]
    fn clone(&self) -> RangeEnd {
        let _: ::core::clone::AssertParamIsClone<RangeSyntax>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for RangeEnd { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for RangeEnd {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        RangeEnd::Included(ref __binding_0) => { 0usize }
                        RangeEnd::Excluded => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    RangeEnd::Included(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    RangeEnd::Excluded => {}
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for RangeEnd {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        RangeEnd::Included(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => { RangeEnd::Excluded }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `RangeEnd`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for RangeEnd {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            RangeEnd::Included(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Included", &__self_0),
            RangeEnd::Excluded =>
                ::core::fmt::Formatter::write_str(f, "Excluded"),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for RangeEnd
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    RangeEnd::Included(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    RangeEnd::Excluded => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for RangeEnd where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    RangeEnd::Included(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    RangeEnd::Excluded => {}
                }
            }
        }
    };Walkable)]
852pub enum RangeEnd {
853    /// `..=` or `...`
854    Included(RangeSyntax),
855    /// `..`
856    Excluded,
857}
858
859#[derive(#[automatically_derived]
impl ::core::clone::Clone for RangeSyntax {
    #[inline]
    fn clone(&self) -> RangeSyntax { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for RangeSyntax { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for RangeSyntax {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        RangeSyntax::DotDotDot => { 0usize }
                        RangeSyntax::DotDotEq => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for RangeSyntax {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { RangeSyntax::DotDotDot }
                    1usize => { RangeSyntax::DotDotEq }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `RangeSyntax`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for RangeSyntax {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                RangeSyntax::DotDotDot => "DotDotDot",
                RangeSyntax::DotDotEq => "DotDotEq",
            })
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for RangeSyntax
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    RangeSyntax::DotDotDot => {}
                    RangeSyntax::DotDotEq => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for RangeSyntax where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    RangeSyntax::DotDotDot => {}
                    RangeSyntax::DotDotEq => {}
                }
            }
        }
    };Walkable)]
860pub enum RangeSyntax {
861    /// `...`
862    DotDotDot,
863    /// `..=`
864    DotDotEq,
865}
866
867/// All the different flavors of pattern that Rust recognizes.
868//
869// Adding a new variant? Please update `test_pat` in `tests/ui/macros/stringify.rs`.
870#[derive(#[automatically_derived]
impl ::core::clone::Clone for PatKind {
    #[inline]
    fn clone(&self) -> PatKind {
        match self {
            PatKind::Missing => PatKind::Missing,
            PatKind::Wild => PatKind::Wild,
            PatKind::Ident(__self_0, __self_1, __self_2) =>
                PatKind::Ident(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            PatKind::Struct(__self_0, __self_1, __self_2, __self_3) =>
                PatKind::Struct(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2),
                    ::core::clone::Clone::clone(__self_3)),
            PatKind::TupleStruct(__self_0, __self_1, __self_2) =>
                PatKind::TupleStruct(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            PatKind::Or(__self_0) =>
                PatKind::Or(::core::clone::Clone::clone(__self_0)),
            PatKind::Path(__self_0, __self_1) =>
                PatKind::Path(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            PatKind::Tuple(__self_0) =>
                PatKind::Tuple(::core::clone::Clone::clone(__self_0)),
            PatKind::Deref(__self_0) =>
                PatKind::Deref(::core::clone::Clone::clone(__self_0)),
            PatKind::Ref(__self_0, __self_1, __self_2) =>
                PatKind::Ref(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            PatKind::Expr(__self_0) =>
                PatKind::Expr(::core::clone::Clone::clone(__self_0)),
            PatKind::Range(__self_0, __self_1, __self_2) =>
                PatKind::Range(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            PatKind::Slice(__self_0) =>
                PatKind::Slice(::core::clone::Clone::clone(__self_0)),
            PatKind::Rest => PatKind::Rest,
            PatKind::Never => PatKind::Never,
            PatKind::Guard(__self_0, __self_1) =>
                PatKind::Guard(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            PatKind::Paren(__self_0) =>
                PatKind::Paren(::core::clone::Clone::clone(__self_0)),
            PatKind::MacCall(__self_0) =>
                PatKind::MacCall(::core::clone::Clone::clone(__self_0)),
            PatKind::Err(__self_0) =>
                PatKind::Err(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for PatKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        PatKind::Missing => { 0usize }
                        PatKind::Wild => { 1usize }
                        PatKind::Ident(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            2usize
                        }
                        PatKind::Struct(ref __binding_0, ref __binding_1,
                            ref __binding_2, ref __binding_3) => {
                            3usize
                        }
                        PatKind::TupleStruct(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            4usize
                        }
                        PatKind::Or(ref __binding_0) => { 5usize }
                        PatKind::Path(ref __binding_0, ref __binding_1) => {
                            6usize
                        }
                        PatKind::Tuple(ref __binding_0) => { 7usize }
                        PatKind::Deref(ref __binding_0) => { 8usize }
                        PatKind::Ref(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            9usize
                        }
                        PatKind::Expr(ref __binding_0) => { 10usize }
                        PatKind::Range(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            11usize
                        }
                        PatKind::Slice(ref __binding_0) => { 12usize }
                        PatKind::Rest => { 13usize }
                        PatKind::Never => { 14usize }
                        PatKind::Guard(ref __binding_0, ref __binding_1) => {
                            15usize
                        }
                        PatKind::Paren(ref __binding_0) => { 16usize }
                        PatKind::MacCall(ref __binding_0) => { 17usize }
                        PatKind::Err(ref __binding_0) => { 18usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    PatKind::Missing => {}
                    PatKind::Wild => {}
                    PatKind::Ident(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    PatKind::Struct(ref __binding_0, ref __binding_1,
                        ref __binding_2, ref __binding_3) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                            __encoder);
                    }
                    PatKind::TupleStruct(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    PatKind::Or(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    PatKind::Path(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    PatKind::Tuple(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    PatKind::Deref(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    PatKind::Ref(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    PatKind::Expr(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    PatKind::Range(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    PatKind::Slice(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    PatKind::Rest => {}
                    PatKind::Never => {}
                    PatKind::Guard(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    PatKind::Paren(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    PatKind::MacCall(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    PatKind::Err(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for PatKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { PatKind::Missing }
                    1usize => { PatKind::Wild }
                    2usize => {
                        PatKind::Ident(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => {
                        PatKind::Struct(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    4usize => {
                        PatKind::TupleStruct(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    5usize => {
                        PatKind::Or(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    6usize => {
                        PatKind::Path(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    7usize => {
                        PatKind::Tuple(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    8usize => {
                        PatKind::Deref(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    9usize => {
                        PatKind::Ref(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    10usize => {
                        PatKind::Expr(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    11usize => {
                        PatKind::Range(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    12usize => {
                        PatKind::Slice(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    13usize => { PatKind::Rest }
                    14usize => { PatKind::Never }
                    15usize => {
                        PatKind::Guard(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    16usize => {
                        PatKind::Paren(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    17usize => {
                        PatKind::MacCall(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    18usize => {
                        PatKind::Err(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `PatKind`, expected 0..19, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for PatKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            PatKind::Missing =>
                ::core::fmt::Formatter::write_str(f, "Missing"),
            PatKind::Wild => ::core::fmt::Formatter::write_str(f, "Wild"),
            PatKind::Ident(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Ident",
                    __self_0, __self_1, &__self_2),
            PatKind::Struct(__self_0, __self_1, __self_2, __self_3) =>
                ::core::fmt::Formatter::debug_tuple_field4_finish(f, "Struct",
                    __self_0, __self_1, __self_2, &__self_3),
            PatKind::TupleStruct(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f,
                    "TupleStruct", __self_0, __self_1, &__self_2),
            PatKind::Or(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Or",
                    &__self_0),
            PatKind::Path(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Path",
                    __self_0, &__self_1),
            PatKind::Tuple(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Tuple",
                    &__self_0),
            PatKind::Deref(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Deref",
                    &__self_0),
            PatKind::Ref(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Ref",
                    __self_0, __self_1, &__self_2),
            PatKind::Expr(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Expr",
                    &__self_0),
            PatKind::Range(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Range",
                    __self_0, __self_1, &__self_2),
            PatKind::Slice(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Slice",
                    &__self_0),
            PatKind::Rest => ::core::fmt::Formatter::write_str(f, "Rest"),
            PatKind::Never => ::core::fmt::Formatter::write_str(f, "Never"),
            PatKind::Guard(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Guard",
                    __self_0, &__self_1),
            PatKind::Paren(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Paren",
                    &__self_0),
            PatKind::MacCall(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "MacCall", &__self_0),
            PatKind::Err(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Err",
                    &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for PatKind
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    PatKind::Missing => {}
                    PatKind::Wild => {}
                    PatKind::Ident(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::Struct(ref __binding_0, ref __binding_1,
                        ref __binding_2, ref __binding_3) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::TupleStruct(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::Or(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::Path(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::Tuple(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::Deref(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::Ref(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::Expr(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::Range(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::Slice(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::Rest => {}
                    PatKind::Never => {}
                    PatKind::Guard(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::Paren(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::MacCall(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatKind::Err(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for PatKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    PatKind::Missing => {}
                    PatKind::Wild => {}
                    PatKind::Ident(ref mut __binding_0, ref mut __binding_1,
                        ref mut __binding_2) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                    PatKind::Struct(ref mut __binding_0, ref mut __binding_1,
                        ref mut __binding_2, ref mut __binding_3) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                    }
                    PatKind::TupleStruct(ref mut __binding_0,
                        ref mut __binding_1, ref mut __binding_2) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                    PatKind::Or(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    PatKind::Path(ref mut __binding_0, ref mut __binding_1) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                    PatKind::Tuple(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    PatKind::Deref(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    PatKind::Ref(ref mut __binding_0, ref mut __binding_1,
                        ref mut __binding_2) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                    PatKind::Expr(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    PatKind::Range(ref mut __binding_0, ref mut __binding_1,
                        ref mut __binding_2) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                    PatKind::Slice(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    PatKind::Rest => {}
                    PatKind::Never => {}
                    PatKind::Guard(ref mut __binding_0, ref mut __binding_1) =>
                        {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                    PatKind::Paren(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    PatKind::MacCall(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    PatKind::Err(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
871pub enum PatKind {
872    /// A missing pattern, e.g. for an anonymous param in a bare fn like `fn f(u32)`.
873    Missing,
874
875    /// Represents a wildcard pattern (`_`).
876    Wild,
877
878    /// A `PatKind::Ident` may either be a new bound variable (`ref mut binding @ OPT_SUBPATTERN`),
879    /// or a unit struct/variant pattern, or a const pattern (in the last two cases the third
880    /// field must be `None`). Disambiguation cannot be done with parser alone, so it happens
881    /// during name resolution.
882    Ident(BindingMode, Ident, Option<Box<Pat>>),
883
884    /// A struct or struct variant pattern (e.g., `Variant {x, y, ..}`).
885    Struct(Option<Box<QSelf>>, Path, ThinVec<PatField>, PatFieldsRest),
886
887    /// A tuple struct/variant pattern (`Variant(x, y, .., z)`).
888    TupleStruct(Option<Box<QSelf>>, Path, ThinVec<Pat>),
889
890    /// An or-pattern `A | B | C`.
891    /// Invariant: `pats.len() >= 2`.
892    Or(ThinVec<Pat>),
893
894    /// A possibly qualified path pattern.
895    /// Unqualified path patterns `A::B::C` can legally refer to variants, structs, constants
896    /// or associated constants. Qualified path patterns `<A>::B::C`/`<A as Trait>::B::C` can
897    /// only legally refer to associated constants.
898    Path(Option<Box<QSelf>>, Path),
899
900    /// A tuple pattern (`(a, b)`).
901    Tuple(ThinVec<Pat>),
902
903    /// A `deref` pattern (currently `deref!()` macro-based syntax).
904    Deref(Box<Pat>),
905
906    /// A reference pattern (e.g., `&mut (a, b)`).
907    Ref(Box<Pat>, Pinnedness, Mutability),
908
909    /// A literal, const block or path.
910    Expr(Box<Expr>),
911
912    /// A range pattern (e.g., `1...2`, `1..2`, `1..`, `..2`, `1..=2`, `..=2`).
913    Range(Option<Box<Expr>>, Option<Box<Expr>>, Spanned<RangeEnd>),
914
915    /// A slice pattern `[a, b, c]`.
916    Slice(ThinVec<Pat>),
917
918    /// A rest pattern `..`.
919    ///
920    /// Syntactically it is valid anywhere.
921    ///
922    /// Semantically however, it only has meaning immediately inside:
923    /// - a slice pattern: `[a, .., b]`,
924    /// - a binding pattern immediately inside a slice pattern: `[a, r @ ..]`,
925    /// - a tuple pattern: `(a, .., b)`,
926    /// - a tuple struct/variant pattern: `$path(a, .., b)`.
927    ///
928    /// In all of these cases, an additional restriction applies,
929    /// only one rest pattern may occur in the pattern sequences.
930    Rest,
931
932    // A never pattern `!`.
933    Never,
934
935    /// A guard pattern (e.g., `x if guard(x)`).
936    Guard(Box<Pat>, Box<Guard>),
937
938    /// Parentheses in patterns used for grouping (i.e., `(PAT)`).
939    Paren(Box<Pat>),
940
941    /// A macro pattern; pre-expansion.
942    MacCall(Box<MacCall>),
943
944    /// Placeholder for a pattern that wasn't syntactically well formed in some way.
945    Err(ErrorGuaranteed),
946}
947
948/// Whether the `..` is present in a struct fields pattern.
949#[derive(#[automatically_derived]
impl ::core::clone::Clone for PatFieldsRest {
    #[inline]
    fn clone(&self) -> PatFieldsRest {
        let _: ::core::clone::AssertParamIsClone<Span>;
        let _: ::core::clone::AssertParamIsClone<ErrorGuaranteed>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for PatFieldsRest { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for PatFieldsRest {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        PatFieldsRest::Rest(ref __binding_0) => { 0usize }
                        PatFieldsRest::Recovered(ref __binding_0) => { 1usize }
                        PatFieldsRest::None => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    PatFieldsRest::Rest(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    PatFieldsRest::Recovered(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    PatFieldsRest::None => {}
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for PatFieldsRest {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        PatFieldsRest::Rest(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        PatFieldsRest::Recovered(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => { PatFieldsRest::None }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `PatFieldsRest`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for PatFieldsRest {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            PatFieldsRest::Rest(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Rest",
                    &__self_0),
            PatFieldsRest::Recovered(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Recovered", &__self_0),
            PatFieldsRest::None =>
                ::core::fmt::Formatter::write_str(f, "None"),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for PatFieldsRest {
    #[inline]
    fn eq(&self, other: &PatFieldsRest) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (PatFieldsRest::Rest(__self_0), PatFieldsRest::Rest(__arg1_0))
                    => __self_0 == __arg1_0,
                (PatFieldsRest::Recovered(__self_0),
                    PatFieldsRest::Recovered(__arg1_0)) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            PatFieldsRest where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    PatFieldsRest::Rest(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatFieldsRest::Recovered(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PatFieldsRest::None => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for PatFieldsRest where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    PatFieldsRest::Rest(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    PatFieldsRest::Recovered(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    PatFieldsRest::None => {}
                }
            }
        }
    };Walkable)]
950pub enum PatFieldsRest {
951    /// `module::StructName { field, ..}`
952    Rest(Span),
953    /// `module::StructName { field, syntax error }`
954    Recovered(ErrorGuaranteed),
955    /// `module::StructName { field }`
956    None,
957}
958
959/// The kind of borrow in an `AddrOf` expression,
960/// e.g., `&place` or `&raw const place`.
961#[derive(#[automatically_derived]
impl ::core::clone::Clone for BorrowKind {
    #[inline]
    fn clone(&self) -> BorrowKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for BorrowKind { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for BorrowKind {
    #[inline]
    fn eq(&self, other: &BorrowKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for BorrowKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for BorrowKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                BorrowKind::Ref => "Ref",
                BorrowKind::Raw => "Raw",
                BorrowKind::Pin => "Pin",
            })
    }
}Debug)]
962#[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)]
963pub enum BorrowKind {
964    /// A normal borrow, `&$expr` or `&mut $expr`.
965    /// The resulting type is either `&'a T` or `&'a mut T`
966    /// where `T = typeof($expr)` and `'a` is some lifetime.
967    Ref,
968    /// A raw borrow, `&raw const $expr` or `&raw mut $expr`.
969    /// The resulting type is either `*const T` or `*mut T`
970    /// where `T = typeof($expr)`.
971    Raw,
972    /// A pinned borrow, `&pin const $expr` or `&pin mut $expr`.
973    /// The resulting type is either `Pin<&'a T>` or `Pin<&'a mut T>`
974    /// where `T = typeof($expr)` and `'a` is some lifetime.
975    Pin,
976}
977
978#[derive(#[automatically_derived]
impl ::core::clone::Clone for BinOpKind {
    #[inline]
    fn clone(&self) -> BinOpKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for BinOpKind { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for BinOpKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        static __NAMES: &str =
            "AddSubMulDivRemAndOrBitXorBitAndBitOrShlShrEqLtLeNeGeGt";
        static __OFFSET: [usize; 19] =
            [0usize, 3usize, 6usize, 9usize, 12usize, 15usize, 18usize,
                    20usize, 26usize, 32usize, 37usize, 40usize, 43usize,
                    45usize, 47usize, 49usize, 51usize, 53usize, 55usize];
        let __d = ::core::intrinsics::discriminant_value(self) as usize;
        ::core::fmt::Formatter::debug_c_like_enum_write_str(f, __NAMES,
            &__OFFSET, __d)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for BinOpKind {
    #[inline]
    fn eq(&self, other: &BinOpKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for BinOpKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        BinOpKind::Add => { 0usize }
                        BinOpKind::Sub => { 1usize }
                        BinOpKind::Mul => { 2usize }
                        BinOpKind::Div => { 3usize }
                        BinOpKind::Rem => { 4usize }
                        BinOpKind::And => { 5usize }
                        BinOpKind::Or => { 6usize }
                        BinOpKind::BitXor => { 7usize }
                        BinOpKind::BitAnd => { 8usize }
                        BinOpKind::BitOr => { 9usize }
                        BinOpKind::Shl => { 10usize }
                        BinOpKind::Shr => { 11usize }
                        BinOpKind::Eq => { 12usize }
                        BinOpKind::Lt => { 13usize }
                        BinOpKind::Le => { 14usize }
                        BinOpKind::Ne => { 15usize }
                        BinOpKind::Ge => { 16usize }
                        BinOpKind::Gt => { 17usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for BinOpKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { BinOpKind::Add }
                    1usize => { BinOpKind::Sub }
                    2usize => { BinOpKind::Mul }
                    3usize => { BinOpKind::Div }
                    4usize => { BinOpKind::Rem }
                    5usize => { BinOpKind::And }
                    6usize => { BinOpKind::Or }
                    7usize => { BinOpKind::BitXor }
                    8usize => { BinOpKind::BitAnd }
                    9usize => { BinOpKind::BitOr }
                    10usize => { BinOpKind::Shl }
                    11usize => { BinOpKind::Shr }
                    12usize => { BinOpKind::Eq }
                    13usize => { BinOpKind::Lt }
                    14usize => { BinOpKind::Le }
                    15usize => { BinOpKind::Ne }
                    16usize => { BinOpKind::Ge }
                    17usize => { BinOpKind::Gt }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `BinOpKind`, expected 0..18, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for BinOpKind {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    BinOpKind::Add => {}
                    BinOpKind::Sub => {}
                    BinOpKind::Mul => {}
                    BinOpKind::Div => {}
                    BinOpKind::Rem => {}
                    BinOpKind::And => {}
                    BinOpKind::Or => {}
                    BinOpKind::BitXor => {}
                    BinOpKind::BitAnd => {}
                    BinOpKind::BitOr => {}
                    BinOpKind::Shl => {}
                    BinOpKind::Shr => {}
                    BinOpKind::Eq => {}
                    BinOpKind::Lt => {}
                    BinOpKind::Le => {}
                    BinOpKind::Ne => {}
                    BinOpKind::Ge => {}
                    BinOpKind::Gt => {}
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for BinOpKind
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    BinOpKind::Add => {}
                    BinOpKind::Sub => {}
                    BinOpKind::Mul => {}
                    BinOpKind::Div => {}
                    BinOpKind::Rem => {}
                    BinOpKind::And => {}
                    BinOpKind::Or => {}
                    BinOpKind::BitXor => {}
                    BinOpKind::BitAnd => {}
                    BinOpKind::BitOr => {}
                    BinOpKind::Shl => {}
                    BinOpKind::Shr => {}
                    BinOpKind::Eq => {}
                    BinOpKind::Lt => {}
                    BinOpKind::Le => {}
                    BinOpKind::Ne => {}
                    BinOpKind::Ge => {}
                    BinOpKind::Gt => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for BinOpKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    BinOpKind::Add => {}
                    BinOpKind::Sub => {}
                    BinOpKind::Mul => {}
                    BinOpKind::Div => {}
                    BinOpKind::Rem => {}
                    BinOpKind::And => {}
                    BinOpKind::Or => {}
                    BinOpKind::BitXor => {}
                    BinOpKind::BitAnd => {}
                    BinOpKind::BitOr => {}
                    BinOpKind::Shl => {}
                    BinOpKind::Shr => {}
                    BinOpKind::Eq => {}
                    BinOpKind::Lt => {}
                    BinOpKind::Le => {}
                    BinOpKind::Ne => {}
                    BinOpKind::Ge => {}
                    BinOpKind::Gt => {}
                }
            }
        }
    };Walkable)]
979pub enum BinOpKind {
980    /// The `+` operator (addition)
981    Add,
982    /// The `-` operator (subtraction)
983    Sub,
984    /// The `*` operator (multiplication)
985    Mul,
986    /// The `/` operator (division)
987    Div,
988    /// The `%` operator (modulus)
989    Rem,
990    /// The `&&` operator (logical and)
991    And,
992    /// The `||` operator (logical or)
993    Or,
994    /// The `^` operator (bitwise xor)
995    BitXor,
996    /// The `&` operator (bitwise and)
997    BitAnd,
998    /// The `|` operator (bitwise or)
999    BitOr,
1000    /// The `<<` operator (shift left)
1001    Shl,
1002    /// The `>>` operator (shift right)
1003    Shr,
1004    /// The `==` operator (equality)
1005    Eq,
1006    /// The `<` operator (less than)
1007    Lt,
1008    /// The `<=` operator (less than or equal to)
1009    Le,
1010    /// The `!=` operator (not equal to)
1011    Ne,
1012    /// The `>=` operator (greater than or equal to)
1013    Ge,
1014    /// The `>` operator (greater than)
1015    Gt,
1016}
1017
1018impl BinOpKind {
1019    pub fn as_str(&self) -> &'static str {
1020        use BinOpKind::*;
1021        match self {
1022            Add => "+",
1023            Sub => "-",
1024            Mul => "*",
1025            Div => "/",
1026            Rem => "%",
1027            And => "&&",
1028            Or => "||",
1029            BitXor => "^",
1030            BitAnd => "&",
1031            BitOr => "|",
1032            Shl => "<<",
1033            Shr => ">>",
1034            Eq => "==",
1035            Lt => "<",
1036            Le => "<=",
1037            Ne => "!=",
1038            Ge => ">=",
1039            Gt => ">",
1040        }
1041    }
1042
1043    pub fn is_lazy(&self) -> bool {
1044        #[allow(non_exhaustive_omitted_patterns)] match self {
    BinOpKind::And | BinOpKind::Or => true,
    _ => false,
}matches!(self, BinOpKind::And | BinOpKind::Or)
1045    }
1046
1047    pub fn precedence(&self) -> ExprPrecedence {
1048        use BinOpKind::*;
1049        match *self {
1050            Mul | Div | Rem => ExprPrecedence::Product,
1051            Add | Sub => ExprPrecedence::Sum,
1052            Shl | Shr => ExprPrecedence::Shift,
1053            BitAnd => ExprPrecedence::BitAnd,
1054            BitXor => ExprPrecedence::BitXor,
1055            BitOr => ExprPrecedence::BitOr,
1056            Lt | Gt | Le | Ge | Eq | Ne => ExprPrecedence::Compare,
1057            And => ExprPrecedence::LAnd,
1058            Or => ExprPrecedence::LOr,
1059        }
1060    }
1061
1062    pub fn fixity(&self) -> Fixity {
1063        use BinOpKind::*;
1064        match self {
1065            Eq | Ne | Lt | Le | Gt | Ge => Fixity::None,
1066            Add | Sub | Mul | Div | Rem | And | Or | BitXor | BitAnd | BitOr | Shl | Shr => {
1067                Fixity::Left
1068            }
1069        }
1070    }
1071
1072    pub fn is_comparison(self) -> bool {
1073        use BinOpKind::*;
1074        match self {
1075            Eq | Ne | Lt | Le | Gt | Ge => true,
1076            Add | Sub | Mul | Div | Rem | And | Or | BitXor | BitAnd | BitOr | Shl | Shr => false,
1077        }
1078    }
1079
1080    /// Returns `true` if the binary operator takes its arguments by value.
1081    pub fn is_by_value(self) -> bool {
1082        !self.is_comparison()
1083    }
1084}
1085
1086pub type BinOp = Spanned<BinOpKind>;
1087
1088// Sometimes `BinOpKind` and `AssignOpKind` need the same treatment. The
1089// operations covered by `AssignOpKind` are a subset of those covered by
1090// `BinOpKind`, so it makes sense to convert `AssignOpKind` to `BinOpKind`.
1091impl From<AssignOpKind> for BinOpKind {
1092    fn from(op: AssignOpKind) -> BinOpKind {
1093        match op {
1094            AssignOpKind::AddAssign => BinOpKind::Add,
1095            AssignOpKind::SubAssign => BinOpKind::Sub,
1096            AssignOpKind::MulAssign => BinOpKind::Mul,
1097            AssignOpKind::DivAssign => BinOpKind::Div,
1098            AssignOpKind::RemAssign => BinOpKind::Rem,
1099            AssignOpKind::BitXorAssign => BinOpKind::BitXor,
1100            AssignOpKind::BitAndAssign => BinOpKind::BitAnd,
1101            AssignOpKind::BitOrAssign => BinOpKind::BitOr,
1102            AssignOpKind::ShlAssign => BinOpKind::Shl,
1103            AssignOpKind::ShrAssign => BinOpKind::Shr,
1104        }
1105    }
1106}
1107
1108#[derive(#[automatically_derived]
impl ::core::clone::Clone for AssignOpKind {
    #[inline]
    fn clone(&self) -> AssignOpKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for AssignOpKind { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for AssignOpKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        static __NAMES: &str =
            "AddAssignSubAssignMulAssignDivAssignRemAssignBitXorAssignBitAndAssignBitOrAssignShlAssignShrAssign";
        static __OFFSET: [usize; 11] =
            [0usize, 9usize, 18usize, 27usize, 36usize, 45usize, 57usize,
                    69usize, 80usize, 89usize, 98usize];
        let __d = ::core::intrinsics::discriminant_value(self) as usize;
        ::core::fmt::Formatter::debug_c_like_enum_write_str(f, __NAMES,
            &__OFFSET, __d)
    }
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for AssignOpKind {
    #[inline]
    fn eq(&self, other: &AssignOpKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for AssignOpKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        AssignOpKind::AddAssign => { 0usize }
                        AssignOpKind::SubAssign => { 1usize }
                        AssignOpKind::MulAssign => { 2usize }
                        AssignOpKind::DivAssign => { 3usize }
                        AssignOpKind::RemAssign => { 4usize }
                        AssignOpKind::BitXorAssign => { 5usize }
                        AssignOpKind::BitAndAssign => { 6usize }
                        AssignOpKind::BitOrAssign => { 7usize }
                        AssignOpKind::ShlAssign => { 8usize }
                        AssignOpKind::ShrAssign => { 9usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for AssignOpKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { AssignOpKind::AddAssign }
                    1usize => { AssignOpKind::SubAssign }
                    2usize => { AssignOpKind::MulAssign }
                    3usize => { AssignOpKind::DivAssign }
                    4usize => { AssignOpKind::RemAssign }
                    5usize => { AssignOpKind::BitXorAssign }
                    6usize => { AssignOpKind::BitAndAssign }
                    7usize => { AssignOpKind::BitOrAssign }
                    8usize => { AssignOpKind::ShlAssign }
                    9usize => { AssignOpKind::ShrAssign }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `AssignOpKind`, expected 0..10, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for AssignOpKind
            {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    AssignOpKind::AddAssign => {}
                    AssignOpKind::SubAssign => {}
                    AssignOpKind::MulAssign => {}
                    AssignOpKind::DivAssign => {}
                    AssignOpKind::RemAssign => {}
                    AssignOpKind::BitXorAssign => {}
                    AssignOpKind::BitAndAssign => {}
                    AssignOpKind::BitOrAssign => {}
                    AssignOpKind::ShlAssign => {}
                    AssignOpKind::ShrAssign => {}
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for AssignOpKind
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    AssignOpKind::AddAssign => {}
                    AssignOpKind::SubAssign => {}
                    AssignOpKind::MulAssign => {}
                    AssignOpKind::DivAssign => {}
                    AssignOpKind::RemAssign => {}
                    AssignOpKind::BitXorAssign => {}
                    AssignOpKind::BitAndAssign => {}
                    AssignOpKind::BitOrAssign => {}
                    AssignOpKind::ShlAssign => {}
                    AssignOpKind::ShrAssign => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for AssignOpKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    AssignOpKind::AddAssign => {}
                    AssignOpKind::SubAssign => {}
                    AssignOpKind::MulAssign => {}
                    AssignOpKind::DivAssign => {}
                    AssignOpKind::RemAssign => {}
                    AssignOpKind::BitXorAssign => {}
                    AssignOpKind::BitAndAssign => {}
                    AssignOpKind::BitOrAssign => {}
                    AssignOpKind::ShlAssign => {}
                    AssignOpKind::ShrAssign => {}
                }
            }
        }
    };Walkable)]
1109pub enum AssignOpKind {
1110    /// The `+=` operator (addition)
1111    AddAssign,
1112    /// The `-=` operator (subtraction)
1113    SubAssign,
1114    /// The `*=` operator (multiplication)
1115    MulAssign,
1116    /// The `/=` operator (division)
1117    DivAssign,
1118    /// The `%=` operator (modulus)
1119    RemAssign,
1120    /// The `^=` operator (bitwise xor)
1121    BitXorAssign,
1122    /// The `&=` operator (bitwise and)
1123    BitAndAssign,
1124    /// The `|=` operator (bitwise or)
1125    BitOrAssign,
1126    /// The `<<=` operator (shift left)
1127    ShlAssign,
1128    /// The `>>=` operator (shift right)
1129    ShrAssign,
1130}
1131
1132impl AssignOpKind {
1133    pub fn as_str(&self) -> &'static str {
1134        use AssignOpKind::*;
1135        match self {
1136            AddAssign => "+=",
1137            SubAssign => "-=",
1138            MulAssign => "*=",
1139            DivAssign => "/=",
1140            RemAssign => "%=",
1141            BitXorAssign => "^=",
1142            BitAndAssign => "&=",
1143            BitOrAssign => "|=",
1144            ShlAssign => "<<=",
1145            ShrAssign => ">>=",
1146        }
1147    }
1148
1149    /// AssignOps are always by value.
1150    pub fn is_by_value(self) -> bool {
1151        true
1152    }
1153}
1154
1155pub type AssignOp = Spanned<AssignOpKind>;
1156
1157/// Unary operator.
1158///
1159/// Note that `&data` is not an operator, it's an `AddrOf` expression.
1160#[derive(#[automatically_derived]
impl ::core::clone::Clone for UnOp {
    #[inline]
    fn clone(&self) -> UnOp { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for UnOp { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for UnOp {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                UnOp::Deref => "Deref",
                UnOp::Not => "Not",
                UnOp::Neg => "Neg",
            })
    }
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for UnOp {
    #[inline]
    fn eq(&self, other: &UnOp) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for UnOp {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        UnOp::Deref => { 0usize }
                        UnOp::Not => { 1usize }
                        UnOp::Neg => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for UnOp {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { UnOp::Deref }
                    1usize => { UnOp::Not }
                    2usize => { UnOp::Neg }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `UnOp`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for UnOp {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    UnOp::Deref => {}
                    UnOp::Not => {}
                    UnOp::Neg => {}
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for UnOp where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    UnOp::Deref => {}
                    UnOp::Not => {}
                    UnOp::Neg => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for UnOp where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    UnOp::Deref => {}
                    UnOp::Not => {}
                    UnOp::Neg => {}
                }
            }
        }
    };Walkable)]
1161pub enum UnOp {
1162    /// The `*` operator for dereferencing
1163    Deref,
1164    /// The `!` operator for logical inversion
1165    Not,
1166    /// The `-` operator for negation
1167    Neg,
1168}
1169
1170impl UnOp {
1171    pub fn as_str(&self) -> &'static str {
1172        match self {
1173            UnOp::Deref => "*",
1174            UnOp::Not => "!",
1175            UnOp::Neg => "-",
1176        }
1177    }
1178
1179    /// Returns `true` if the unary operator takes its argument by value.
1180    pub fn is_by_value(self) -> bool {
1181        #[allow(non_exhaustive_omitted_patterns)] match self {
    Self::Neg | Self::Not => true,
    _ => false,
}matches!(self, Self::Neg | Self::Not)
1182    }
1183}
1184
1185/// A statement.
1186///
1187/// No `attrs` or `tokens` fields because each `StmtKind` variant
1188/// contains an AST node with those fields. (Except for `StmtKind::Empty`,
1189/// which never has attrs or tokens)
1190#[derive(#[automatically_derived]
impl ::core::clone::Clone for Stmt {
    #[inline]
    fn clone(&self) -> Stmt {
        Stmt {
            id: ::core::clone::Clone::clone(&self.id),
            kind: ::core::clone::Clone::clone(&self.kind),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Stmt {
            fn encode(&self, __encoder: &mut __E) {
                let Stmt {
                        id: ref __binding_0,
                        kind: ref __binding_1,
                        span: ref __binding_2 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Stmt {
            fn decode(__decoder: &mut __D) -> Self {
                Stmt {
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Stmt {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "Stmt", "id",
            &self.id, "kind", &self.kind, "span", &&self.span)
    }
}Debug)]
1191pub struct Stmt {
1192    pub id: NodeId,
1193    pub kind: StmtKind,
1194    pub span: Span,
1195}
1196
1197impl Stmt {
1198    pub fn has_trailing_semicolon(&self) -> bool {
1199        match &self.kind {
1200            StmtKind::Semi(_) => true,
1201            StmtKind::MacCall(mac) => #[allow(non_exhaustive_omitted_patterns)] match mac.style {
    MacStmtStyle::Semicolon => true,
    _ => false,
}matches!(mac.style, MacStmtStyle::Semicolon),
1202            _ => false,
1203        }
1204    }
1205
1206    /// Converts a parsed `Stmt` to a `Stmt` with
1207    /// a trailing semicolon.
1208    ///
1209    /// This only modifies the parsed AST struct, not the attached
1210    /// `LazyAttrTokenStream`. The parser is responsible for calling
1211    /// `ToAttrTokenStream::add_trailing_semi` when there is actually
1212    /// a semicolon in the tokenstream.
1213    pub fn add_trailing_semicolon(mut self) -> Self {
1214        self.kind = match self.kind {
1215            StmtKind::Expr(expr) => StmtKind::Semi(expr),
1216            StmtKind::MacCall(mut mac) => {
1217                mac.style = MacStmtStyle::Semicolon;
1218                StmtKind::MacCall(mac)
1219            }
1220            kind => kind,
1221        };
1222
1223        self
1224    }
1225
1226    pub fn is_item(&self) -> bool {
1227        #[allow(non_exhaustive_omitted_patterns)] match self.kind {
    StmtKind::Item(_) => true,
    _ => false,
}matches!(self.kind, StmtKind::Item(_))
1228    }
1229
1230    pub fn is_expr(&self) -> bool {
1231        #[allow(non_exhaustive_omitted_patterns)] match self.kind {
    StmtKind::Expr(_) => true,
    _ => false,
}matches!(self.kind, StmtKind::Expr(_))
1232    }
1233}
1234
1235// Adding a new variant? Please update `test_stmt` in `tests/ui/macros/stringify.rs`.
1236#[derive(#[automatically_derived]
impl ::core::clone::Clone for StmtKind {
    #[inline]
    fn clone(&self) -> StmtKind {
        match self {
            StmtKind::Let(__self_0) =>
                StmtKind::Let(::core::clone::Clone::clone(__self_0)),
            StmtKind::Item(__self_0) =>
                StmtKind::Item(::core::clone::Clone::clone(__self_0)),
            StmtKind::Expr(__self_0) =>
                StmtKind::Expr(::core::clone::Clone::clone(__self_0)),
            StmtKind::Semi(__self_0) =>
                StmtKind::Semi(::core::clone::Clone::clone(__self_0)),
            StmtKind::Empty => StmtKind::Empty,
            StmtKind::MacCall(__self_0) =>
                StmtKind::MacCall(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for StmtKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        StmtKind::Let(ref __binding_0) => { 0usize }
                        StmtKind::Item(ref __binding_0) => { 1usize }
                        StmtKind::Expr(ref __binding_0) => { 2usize }
                        StmtKind::Semi(ref __binding_0) => { 3usize }
                        StmtKind::Empty => { 4usize }
                        StmtKind::MacCall(ref __binding_0) => { 5usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    StmtKind::Let(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    StmtKind::Item(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    StmtKind::Expr(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    StmtKind::Semi(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    StmtKind::Empty => {}
                    StmtKind::MacCall(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for StmtKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        StmtKind::Let(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        StmtKind::Item(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        StmtKind::Expr(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => {
                        StmtKind::Semi(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    4usize => { StmtKind::Empty }
                    5usize => {
                        StmtKind::MacCall(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `StmtKind`, expected 0..6, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for StmtKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            StmtKind::Let(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Let",
                    &__self_0),
            StmtKind::Item(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Item",
                    &__self_0),
            StmtKind::Expr(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Expr",
                    &__self_0),
            StmtKind::Semi(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Semi",
                    &__self_0),
            StmtKind::Empty => ::core::fmt::Formatter::write_str(f, "Empty"),
            StmtKind::MacCall(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "MacCall", &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for StmtKind
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    StmtKind::Let(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    StmtKind::Item(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    StmtKind::Expr(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    StmtKind::Semi(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    StmtKind::Empty => {}
                    StmtKind::MacCall(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for StmtKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    StmtKind::Let(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    StmtKind::Item(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    StmtKind::Expr(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    StmtKind::Semi(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    StmtKind::Empty => {}
                    StmtKind::MacCall(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
1237pub enum StmtKind {
1238    /// A local (let) binding.
1239    Let(Box<Local>),
1240    /// An item definition.
1241    Item(Box<Item>),
1242    /// Expr without trailing semi-colon.
1243    Expr(Box<Expr>),
1244    /// Expr with a trailing semi-colon.
1245    Semi(Box<Expr>),
1246    /// Just a trailing semi-colon.
1247    Empty,
1248    /// Macro.
1249    MacCall(Box<MacCallStmt>),
1250}
1251
1252impl StmtKind {
1253    pub fn descr(&self) -> &'static str {
1254        match self {
1255            StmtKind::Let(_) => "local",
1256            StmtKind::Item(_) => "item",
1257            StmtKind::Expr(_) => "expression",
1258            StmtKind::Semi(_) => "statement",
1259            StmtKind::Empty => "semicolon",
1260            StmtKind::MacCall(_) => "macro call",
1261        }
1262    }
1263}
1264
1265#[derive(#[automatically_derived]
impl ::core::clone::Clone for MacCallStmt {
    #[inline]
    fn clone(&self) -> MacCallStmt {
        MacCallStmt {
            mac: ::core::clone::Clone::clone(&self.mac),
            style: ::core::clone::Clone::clone(&self.style),
            attrs: ::core::clone::Clone::clone(&self.attrs),
            tokens: ::core::clone::Clone::clone(&self.tokens),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for MacCallStmt {
            fn encode(&self, __encoder: &mut __E) {
                let MacCallStmt {
                        mac: ref __binding_0,
                        style: ref __binding_1,
                        attrs: ref __binding_2,
                        tokens: ref __binding_3 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for MacCallStmt {
            fn decode(__decoder: &mut __D) -> Self {
                MacCallStmt {
                    mac: ::rustc_serialize::Decodable::decode(__decoder),
                    style: ::rustc_serialize::Decodable::decode(__decoder),
                    attrs: ::rustc_serialize::Decodable::decode(__decoder),
                    tokens: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for MacCallStmt {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "MacCallStmt",
            "mac", &self.mac, "style", &self.style, "attrs", &self.attrs,
            "tokens", &&self.tokens)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for MacCallStmt
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    MacCallStmt {
                        mac: ref __binding_0,
                        style: ref __binding_1,
                        attrs: ref __binding_2,
                        tokens: ref __binding_3 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for MacCallStmt where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    MacCallStmt {
                        mac: ref mut __binding_0,
                        style: ref mut __binding_1,
                        attrs: ref mut __binding_2,
                        tokens: ref mut __binding_3 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
1266pub struct MacCallStmt {
1267    pub mac: Box<MacCall>,
1268    pub style: MacStmtStyle,
1269    pub attrs: AttrVec,
1270    pub tokens: Option<LazyAttrTokenStream>,
1271}
1272
1273#[derive(#[automatically_derived]
impl ::core::clone::Clone for MacStmtStyle {
    #[inline]
    fn clone(&self) -> MacStmtStyle { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for MacStmtStyle { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for MacStmtStyle {
    #[inline]
    fn eq(&self, other: &MacStmtStyle) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for MacStmtStyle {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        MacStmtStyle::Semicolon => { 0usize }
                        MacStmtStyle::Braces => { 1usize }
                        MacStmtStyle::NoBraces => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for MacStmtStyle {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { MacStmtStyle::Semicolon }
                    1usize => { MacStmtStyle::Braces }
                    2usize => { MacStmtStyle::NoBraces }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `MacStmtStyle`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for MacStmtStyle {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                MacStmtStyle::Semicolon => "Semicolon",
                MacStmtStyle::Braces => "Braces",
                MacStmtStyle::NoBraces => "NoBraces",
            })
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for MacStmtStyle
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    MacStmtStyle::Semicolon => {}
                    MacStmtStyle::Braces => {}
                    MacStmtStyle::NoBraces => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for MacStmtStyle where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    MacStmtStyle::Semicolon => {}
                    MacStmtStyle::Braces => {}
                    MacStmtStyle::NoBraces => {}
                }
            }
        }
    };Walkable)]
1274pub enum MacStmtStyle {
1275    /// The macro statement had a trailing semicolon (e.g., `foo! { ... };`
1276    /// `foo!(...);`, `foo![...];`).
1277    Semicolon,
1278    /// The macro statement had braces (e.g., `foo! { ... }`).
1279    Braces,
1280    /// The macro statement had parentheses or brackets and no semicolon (e.g.,
1281    /// `foo!(...)`). All of these will end up being converted into macro
1282    /// expressions.
1283    NoBraces,
1284}
1285
1286/// Local represents a `let` statement, e.g., `let <pat>:<ty> = <expr>;`.
1287#[derive(#[automatically_derived]
impl ::core::clone::Clone for Local {
    #[inline]
    fn clone(&self) -> Local {
        Local {
            id: ::core::clone::Clone::clone(&self.id),
            super_: ::core::clone::Clone::clone(&self.super_),
            pat: ::core::clone::Clone::clone(&self.pat),
            ty: ::core::clone::Clone::clone(&self.ty),
            kind: ::core::clone::Clone::clone(&self.kind),
            span: ::core::clone::Clone::clone(&self.span),
            colon_sp: ::core::clone::Clone::clone(&self.colon_sp),
            attrs: ::core::clone::Clone::clone(&self.attrs),
            tokens: ::core::clone::Clone::clone(&self.tokens),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Local {
            fn encode(&self, __encoder: &mut __E) {
                let Local {
                        id: ref __binding_0,
                        super_: ref __binding_1,
                        pat: ref __binding_2,
                        ty: ref __binding_3,
                        kind: ref __binding_4,
                        span: ref __binding_5,
                        colon_sp: ref __binding_6,
                        attrs: ref __binding_7,
                        tokens: ref __binding_8 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_5,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_6,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_7,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_8,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Local {
            fn decode(__decoder: &mut __D) -> Self {
                Local {
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    super_: ::rustc_serialize::Decodable::decode(__decoder),
                    pat: ::rustc_serialize::Decodable::decode(__decoder),
                    ty: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    colon_sp: ::rustc_serialize::Decodable::decode(__decoder),
                    attrs: ::rustc_serialize::Decodable::decode(__decoder),
                    tokens: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Local {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["id", "super_", "pat", "ty", "kind", "span", "colon_sp",
                        "attrs", "tokens"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.id, &self.super_, &self.pat, &self.ty, &self.kind,
                        &self.span, &self.colon_sp, &self.attrs, &&self.tokens];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "Local", names,
            values)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Local where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Local {
                        id: ref __binding_0,
                        super_: ref __binding_1,
                        pat: ref __binding_2,
                        ty: ref __binding_3,
                        kind: ref __binding_4,
                        span: ref __binding_5,
                        colon_sp: ref __binding_6,
                        attrs: ref __binding_7,
                        tokens: ref __binding_8 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_5,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_6,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_7,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_8,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Local where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Local {
                        id: ref mut __binding_0,
                        super_: ref mut __binding_1,
                        pat: ref mut __binding_2,
                        ty: ref mut __binding_3,
                        kind: ref mut __binding_4,
                        span: ref mut __binding_5,
                        colon_sp: ref mut __binding_6,
                        attrs: ref mut __binding_7,
                        tokens: ref mut __binding_8 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_5,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_6,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_7,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_8,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
1288pub struct Local {
1289    pub id: NodeId,
1290    pub super_: Option<Span>,
1291    pub pat: Box<Pat>,
1292    pub ty: Option<Box<Ty>>,
1293    pub kind: LocalKind,
1294    pub span: Span,
1295    pub colon_sp: Option<Span>,
1296    pub attrs: AttrVec,
1297    pub tokens: Option<LazyAttrTokenStream>,
1298}
1299
1300#[derive(#[automatically_derived]
impl ::core::clone::Clone for LocalKind {
    #[inline]
    fn clone(&self) -> LocalKind {
        match self {
            LocalKind::Decl => LocalKind::Decl,
            LocalKind::Init(__self_0) =>
                LocalKind::Init(::core::clone::Clone::clone(__self_0)),
            LocalKind::InitElse(__self_0, __self_1) =>
                LocalKind::InitElse(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for LocalKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        LocalKind::Decl => { 0usize }
                        LocalKind::Init(ref __binding_0) => { 1usize }
                        LocalKind::InitElse(ref __binding_0, ref __binding_1) => {
                            2usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    LocalKind::Decl => {}
                    LocalKind::Init(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    LocalKind::InitElse(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for LocalKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { LocalKind::Decl }
                    1usize => {
                        LocalKind::Init(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        LocalKind::InitElse(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `LocalKind`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for LocalKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            LocalKind::Decl => ::core::fmt::Formatter::write_str(f, "Decl"),
            LocalKind::Init(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Init",
                    &__self_0),
            LocalKind::InitElse(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "InitElse", __self_0, &__self_1),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for LocalKind
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    LocalKind::Decl => {}
                    LocalKind::Init(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    LocalKind::InitElse(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for LocalKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    LocalKind::Decl => {}
                    LocalKind::Init(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    LocalKind::InitElse(ref mut __binding_0,
                        ref mut __binding_1) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
1301pub enum LocalKind {
1302    /// Local declaration.
1303    /// Example: `let x;`
1304    Decl,
1305    /// Local declaration with an initializer.
1306    /// Example: `let x = y;`
1307    Init(Box<Expr>),
1308    /// Local declaration with an initializer and an `else` clause.
1309    /// Example: `let Some(x) = y else { return };`
1310    InitElse(Box<Expr>, Box<Block>),
1311}
1312
1313impl LocalKind {
1314    pub fn init(&self) -> Option<&Expr> {
1315        match self {
1316            Self::Decl => None,
1317            Self::Init(i) | Self::InitElse(i, _) => Some(i),
1318        }
1319    }
1320
1321    pub fn init_else_opt(&self) -> Option<(&Expr, Option<&Block>)> {
1322        match self {
1323            Self::Decl => None,
1324            Self::Init(init) => Some((init, None)),
1325            Self::InitElse(init, els) => Some((init, Some(els))),
1326        }
1327    }
1328}
1329
1330/// An arm of a 'match'.
1331///
1332/// E.g., `0..=10 => { println!("match!") }` as in
1333///
1334/// ```
1335/// match 123 {
1336///     0..=10 => { println!("match!") },
1337///     _ => { println!("no match!") },
1338/// }
1339/// ```
1340#[derive(#[automatically_derived]
impl ::core::clone::Clone for Arm {
    #[inline]
    fn clone(&self) -> Arm {
        Arm {
            attrs: ::core::clone::Clone::clone(&self.attrs),
            pat: ::core::clone::Clone::clone(&self.pat),
            guard: ::core::clone::Clone::clone(&self.guard),
            body: ::core::clone::Clone::clone(&self.body),
            span: ::core::clone::Clone::clone(&self.span),
            id: ::core::clone::Clone::clone(&self.id),
            is_placeholder: ::core::clone::Clone::clone(&self.is_placeholder),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Arm {
            fn encode(&self, __encoder: &mut __E) {
                let Arm {
                        attrs: ref __binding_0,
                        pat: ref __binding_1,
                        guard: ref __binding_2,
                        body: ref __binding_3,
                        span: ref __binding_4,
                        id: ref __binding_5,
                        is_placeholder: ref __binding_6 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_5,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_6,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Arm {
            fn decode(__decoder: &mut __D) -> Self {
                Arm {
                    attrs: ::rustc_serialize::Decodable::decode(__decoder),
                    pat: ::rustc_serialize::Decodable::decode(__decoder),
                    guard: ::rustc_serialize::Decodable::decode(__decoder),
                    body: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    is_placeholder: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Arm {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["attrs", "pat", "guard", "body", "span", "id",
                        "is_placeholder"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.attrs, &self.pat, &self.guard, &self.body, &self.span,
                        &self.id, &&self.is_placeholder];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "Arm", names,
            values)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Arm where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Arm {
                        attrs: ref __binding_0,
                        pat: ref __binding_1,
                        guard: ref __binding_2,
                        body: ref __binding_3,
                        span: ref __binding_4,
                        id: ref __binding_5,
                        is_placeholder: ref __binding_6 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_5,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_6,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Arm where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Arm {
                        attrs: ref mut __binding_0,
                        pat: ref mut __binding_1,
                        guard: ref mut __binding_2,
                        body: ref mut __binding_3,
                        span: ref mut __binding_4,
                        id: ref mut __binding_5,
                        is_placeholder: ref mut __binding_6 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_5,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_6,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
1341pub struct Arm {
1342    pub attrs: AttrVec,
1343    /// Match arm pattern, e.g. `10` in `match foo { 10 => {}, _ => {} }`.
1344    pub pat: Box<Pat>,
1345    /// Match arm guard, e.g. `n > 10` in `match foo { n if n > 10 => {}, _ => {} }`.
1346    pub guard: Option<Box<Guard>>,
1347    /// Match arm body. Omitted if the pattern is a never pattern.
1348    pub body: Option<Box<Expr>>,
1349    pub span: Span,
1350    pub id: NodeId,
1351    pub is_placeholder: bool,
1352}
1353
1354/// A single field in a struct expression, e.g. `x: value` and `y` in `Foo { x: value, y }`.
1355#[derive(#[automatically_derived]
impl ::core::clone::Clone for ExprField {
    #[inline]
    fn clone(&self) -> ExprField {
        ExprField {
            attrs: ::core::clone::Clone::clone(&self.attrs),
            id: ::core::clone::Clone::clone(&self.id),
            span: ::core::clone::Clone::clone(&self.span),
            ident: ::core::clone::Clone::clone(&self.ident),
            expr: ::core::clone::Clone::clone(&self.expr),
            is_shorthand: ::core::clone::Clone::clone(&self.is_shorthand),
            is_placeholder: ::core::clone::Clone::clone(&self.is_placeholder),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ExprField {
            fn encode(&self, __encoder: &mut __E) {
                let ExprField {
                        attrs: ref __binding_0,
                        id: ref __binding_1,
                        span: ref __binding_2,
                        ident: ref __binding_3,
                        expr: ref __binding_4,
                        is_shorthand: ref __binding_5,
                        is_placeholder: ref __binding_6 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_5,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_6,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ExprField {
            fn decode(__decoder: &mut __D) -> Self {
                ExprField {
                    attrs: ::rustc_serialize::Decodable::decode(__decoder),
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    ident: ::rustc_serialize::Decodable::decode(__decoder),
                    expr: ::rustc_serialize::Decodable::decode(__decoder),
                    is_shorthand: ::rustc_serialize::Decodable::decode(__decoder),
                    is_placeholder: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ExprField {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["attrs", "id", "span", "ident", "expr", "is_shorthand",
                        "is_placeholder"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.attrs, &self.id, &self.span, &self.ident, &self.expr,
                        &self.is_shorthand, &&self.is_placeholder];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "ExprField",
            names, values)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for ExprField
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    ExprField {
                        attrs: ref __binding_0,
                        id: ref __binding_1,
                        span: ref __binding_2,
                        ident: ref __binding_3,
                        expr: ref __binding_4,
                        is_shorthand: ref __binding_5,
                        is_placeholder: ref __binding_6 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_5,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_6,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for ExprField where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    ExprField {
                        attrs: ref mut __binding_0,
                        id: ref mut __binding_1,
                        span: ref mut __binding_2,
                        ident: ref mut __binding_3,
                        expr: ref mut __binding_4,
                        is_shorthand: ref mut __binding_5,
                        is_placeholder: ref mut __binding_6 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_5,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_6,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
1356pub struct ExprField {
1357    pub attrs: AttrVec,
1358    pub id: NodeId,
1359    pub span: Span,
1360    pub ident: Ident,
1361    pub expr: Box<Expr>,
1362    pub is_shorthand: bool,
1363    pub is_placeholder: bool,
1364}
1365
1366#[derive(#[automatically_derived]
impl ::core::clone::Clone for BlockCheckMode {
    #[inline]
    fn clone(&self) -> BlockCheckMode {
        let _: ::core::clone::AssertParamIsClone<UnsafeSource>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for BlockCheckMode {
    #[inline]
    fn eq(&self, other: &BlockCheckMode) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (BlockCheckMode::Unsafe(__self_0),
                    BlockCheckMode::Unsafe(__arg1_0)) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for BlockCheckMode {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        BlockCheckMode::Default => { 0usize }
                        BlockCheckMode::Unsafe(ref __binding_0) => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    BlockCheckMode::Default => {}
                    BlockCheckMode::Unsafe(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for BlockCheckMode {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { BlockCheckMode::Default }
                    1usize => {
                        BlockCheckMode::Unsafe(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `BlockCheckMode`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for BlockCheckMode {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            BlockCheckMode::Default =>
                ::core::fmt::Formatter::write_str(f, "Default"),
            BlockCheckMode::Unsafe(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Unsafe",
                    &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::marker::Copy for BlockCheckMode { }Copy, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            BlockCheckMode where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    BlockCheckMode::Default => {}
                    BlockCheckMode::Unsafe(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for BlockCheckMode where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    BlockCheckMode::Default => {}
                    BlockCheckMode::Unsafe(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
1367pub enum BlockCheckMode {
1368    Default,
1369    Unsafe(UnsafeSource),
1370}
1371
1372#[derive(#[automatically_derived]
impl ::core::clone::Clone for UnsafeSource {
    #[inline]
    fn clone(&self) -> UnsafeSource { *self }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for UnsafeSource {
    #[inline]
    fn eq(&self, other: &UnsafeSource) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for UnsafeSource {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        UnsafeSource::CompilerGenerated => { 0usize }
                        UnsafeSource::UserProvided => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for UnsafeSource {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { UnsafeSource::CompilerGenerated }
                    1usize => { UnsafeSource::UserProvided }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `UnsafeSource`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for UnsafeSource {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                UnsafeSource::CompilerGenerated => "CompilerGenerated",
                UnsafeSource::UserProvided => "UserProvided",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::Copy for UnsafeSource { }Copy, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for UnsafeSource
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    UnsafeSource::CompilerGenerated => {}
                    UnsafeSource::UserProvided => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for UnsafeSource where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    UnsafeSource::CompilerGenerated => {}
                    UnsafeSource::UserProvided => {}
                }
            }
        }
    };Walkable)]
1373pub enum UnsafeSource {
1374    CompilerGenerated,
1375    UserProvided,
1376}
1377
1378/// An anonymous constant.
1379///
1380/// A constant (expression) that's not an item or associated item,
1381/// but needs its own `DefId` for type-checking, const-eval, etc.
1382/// These are usually found nested inside types (e.g., array lengths)
1383/// or expressions (e.g., repeat counts), and also used to define
1384/// explicit discriminant values for enum variants.
1385#[derive(#[automatically_derived]
impl ::core::clone::Clone for AnonConst {
    #[inline]
    fn clone(&self) -> AnonConst {
        AnonConst {
            id: ::core::clone::Clone::clone(&self.id),
            value: ::core::clone::Clone::clone(&self.value),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for AnonConst {
            fn encode(&self, __encoder: &mut __E) {
                let AnonConst { id: ref __binding_0, value: ref __binding_1
                        } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for AnonConst {
            fn decode(__decoder: &mut __D) -> Self {
                AnonConst {
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    value: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for AnonConst {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "AnonConst",
            "id", &self.id, "value", &&self.value)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for AnonConst
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    AnonConst { id: ref __binding_0, value: ref __binding_1 } =>
                        {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for AnonConst where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    AnonConst {
                        id: ref mut __binding_0, value: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
1386pub struct AnonConst {
1387    pub id: NodeId,
1388    pub value: Box<Expr>,
1389}
1390
1391/// An expression.
1392#[derive(#[automatically_derived]
impl ::core::clone::Clone for Expr {
    #[inline]
    fn clone(&self) -> Expr {
        Expr {
            id: ::core::clone::Clone::clone(&self.id),
            kind: ::core::clone::Clone::clone(&self.kind),
            span: ::core::clone::Clone::clone(&self.span),
            attrs: ::core::clone::Clone::clone(&self.attrs),
            tokens: ::core::clone::Clone::clone(&self.tokens),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Expr {
            fn encode(&self, __encoder: &mut __E) {
                let Expr {
                        id: ref __binding_0,
                        kind: ref __binding_1,
                        span: ref __binding_2,
                        attrs: ref __binding_3,
                        tokens: ref __binding_4 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Expr {
            fn decode(__decoder: &mut __D) -> Self {
                Expr {
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    attrs: ::rustc_serialize::Decodable::decode(__decoder),
                    tokens: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Expr {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f, "Expr", "id",
            &self.id, "kind", &self.kind, "span", &self.span, "attrs",
            &self.attrs, "tokens", &&self.tokens)
    }
}Debug)]
1393pub struct Expr {
1394    pub id: NodeId,
1395    pub kind: ExprKind,
1396    pub span: Span,
1397    pub attrs: AttrVec,
1398    pub tokens: Option<LazyAttrTokenStream>,
1399}
1400
1401impl Expr {
1402    /// Check if this expression is potentially a trivial const arg, i.e., one that can _potentially_
1403    /// be represented without an anon const in the HIR.
1404    ///
1405    /// This will unwrap at most one block level (curly braces). After that, if the expression
1406    /// is a path, it mostly dispatches to [`Path::is_single_argless_ident`].
1407    ///
1408    /// This function will only allow paths with no qself, before dispatching to the `Path`
1409    /// function of the same name.
1410    ///
1411    /// Does not ensure that the path resolves to a const param/item, the caller should check this.
1412    /// This also does not consider macros, so it's only correct after macro-expansion.
1413    pub fn is_potential_trivial_const_arg(&self) -> bool {
1414        let this = self.maybe_unwrap_block();
1415        if let ExprKind::Path(None, path) = &this.kind
1416            && path.is_single_argless_ident()
1417        {
1418            true
1419        } else {
1420            false
1421        }
1422    }
1423
1424    /// Returns an expression with (when possible) *one* outer brace removed
1425    pub fn maybe_unwrap_block(&self) -> &Expr {
1426        if let ExprKind::Block(block, None) = &self.kind
1427            && let [stmt] = block.stmts.as_slice()
1428            && let StmtKind::Expr(expr) = &stmt.kind
1429        {
1430            expr
1431        } else {
1432            self
1433        }
1434    }
1435
1436    /// Determines whether this expression is a macro call optionally wrapped in braces . If
1437    /// `already_stripped_block` is set then we do not attempt to peel off a layer of braces.
1438    ///
1439    /// Returns the [`NodeId`] of the macro call and whether a layer of braces has been peeled
1440    /// either before, or part of, this function.
1441    pub fn optionally_braced_mac_call(
1442        &self,
1443        already_stripped_block: bool,
1444    ) -> Option<(bool, NodeId)> {
1445        match &self.kind {
1446            ExprKind::Block(block, None)
1447                if let [stmt] = &*block.stmts
1448                    && !already_stripped_block =>
1449            {
1450                match &stmt.kind {
1451                    StmtKind::MacCall(_) => Some((true, stmt.id)),
1452                    StmtKind::Expr(expr) if let ExprKind::MacCall(_) = &expr.kind => {
1453                        Some((true, expr.id))
1454                    }
1455                    _ => None,
1456                }
1457            }
1458            ExprKind::MacCall(_) => Some((already_stripped_block, self.id)),
1459            _ => None,
1460        }
1461    }
1462
1463    pub fn to_bound(&self) -> Option<GenericBound> {
1464        match &self.kind {
1465            ExprKind::Path(None, path) => Some(GenericBound::Trait(PolyTraitRef::new(
1466                ThinVec::new(),
1467                path.clone(),
1468                TraitBoundModifiers::NONE,
1469                self.span,
1470                Parens::No,
1471            ))),
1472            _ => None,
1473        }
1474    }
1475
1476    pub fn peel_parens(&self) -> &Expr {
1477        let mut expr = self;
1478        while let ExprKind::Paren(inner) = &expr.kind {
1479            expr = inner;
1480        }
1481        expr
1482    }
1483
1484    pub fn peel_parens_and_refs(&self) -> &Expr {
1485        let mut expr = self;
1486        while let ExprKind::Paren(inner) | ExprKind::AddrOf(BorrowKind::Ref, _, inner) = &expr.kind
1487        {
1488            expr = inner;
1489        }
1490        expr
1491    }
1492
1493    /// Attempts to reparse as `Ty` (for diagnostic purposes).
1494    pub fn to_ty(&self) -> Option<Box<Ty>> {
1495        let kind = match &self.kind {
1496            // Trivial conversions.
1497            ExprKind::Path(qself, path) => TyKind::Path(qself.clone(), path.clone()),
1498            ExprKind::MacCall(mac) => TyKind::MacCall(mac.clone()),
1499
1500            ExprKind::Paren(expr) => expr.to_ty().map(TyKind::Paren)?,
1501
1502            ExprKind::AddrOf(BorrowKind::Ref, mutbl, expr) => {
1503                expr.to_ty().map(|ty| TyKind::Ref(None, MutTy { ty, mutbl: *mutbl }))?
1504            }
1505
1506            ExprKind::Repeat(expr, expr_len) => {
1507                expr.to_ty().map(|ty| TyKind::Array(ty, expr_len.clone()))?
1508            }
1509
1510            ExprKind::Array(exprs) if let [expr] = exprs.as_slice() => {
1511                expr.to_ty().map(TyKind::Slice)?
1512            }
1513
1514            ExprKind::Tup(exprs) => {
1515                let tys = exprs.iter().map(|expr| expr.to_ty()).collect::<Option<ThinVec<_>>>()?;
1516                TyKind::Tup(tys)
1517            }
1518
1519            // If binary operator is `Add` and both `lhs` and `rhs` are trait bounds,
1520            // then type of result is trait object.
1521            // Otherwise we don't assume the result type.
1522            ExprKind::Binary(binop, lhs, rhs) if binop.node == BinOpKind::Add => {
1523                let (Some(lhs), Some(rhs)) = (lhs.to_bound(), rhs.to_bound()) else {
1524                    return None;
1525                };
1526                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)
1527            }
1528
1529            ExprKind::Underscore => TyKind::Infer,
1530
1531            // This expression doesn't look like a type syntactically.
1532            _ => return None,
1533        };
1534
1535        Some(Box::new(Ty { kind, id: self.id, span: self.span }))
1536    }
1537
1538    pub fn precedence(&self) -> ExprPrecedence {
1539        fn prefix_attrs_precedence(attrs: &AttrVec) -> ExprPrecedence {
1540            for attr in attrs {
1541                if let AttrStyle::Outer = attr.style {
1542                    return ExprPrecedence::Prefix;
1543                }
1544            }
1545            ExprPrecedence::Unambiguous
1546        }
1547
1548        match &self.kind {
1549            ExprKind::Closure(closure) => match closure.fn_decl.output {
1550                FnRetTy::Default(_) => ExprPrecedence::Jump,
1551                FnRetTy::Ty(_) => prefix_attrs_precedence(&self.attrs),
1552            },
1553
1554            ExprKind::Break(_ /*label*/, value)
1555            | ExprKind::Ret(value)
1556            | ExprKind::Yield(YieldKind::Prefix(value))
1557            | ExprKind::Yeet(value) => match value {
1558                Some(_) => ExprPrecedence::Jump,
1559                None => prefix_attrs_precedence(&self.attrs),
1560            },
1561
1562            ExprKind::Become(_) => ExprPrecedence::Jump,
1563
1564            // `Range` claims to have higher precedence than `Assign`, but `x .. x = x` fails to
1565            // parse, instead of parsing as `(x .. x) = x`. Giving `Range` a lower precedence
1566            // ensures that `pprust` will add parentheses in the right places to get the desired
1567            // parse.
1568            ExprKind::Range(..) => ExprPrecedence::Range,
1569
1570            // Binop-like expr kinds, handled by `AssocOp`.
1571            ExprKind::Binary(op, ..) => op.node.precedence(),
1572            ExprKind::Cast(..) => ExprPrecedence::Cast,
1573
1574            ExprKind::Assign(..) | ExprKind::AssignOp(..) => ExprPrecedence::Assign,
1575
1576            // Unary, prefix
1577            ExprKind::AddrOf(..) => ExprPrecedence::Prefix,
1578
1579            // Here `let pats = expr` has `let pats =` as a "unary" prefix of `expr`.
1580            // However, this is not exactly right. When `let _ = a` is the LHS of a binop we
1581            // need parens sometimes. E.g. we can print `(let _ = a) && b` as `let _ = a && b`
1582            // but we need to print `(let _ = a) < b` as-is with parens.
1583            ExprKind::Let(..) | ExprKind::Move(..) | ExprKind::Unary(..) => ExprPrecedence::Prefix,
1584
1585            // Need parens if and only if there are prefix attributes.
1586            ExprKind::Array(_)
1587            | ExprKind::Await(..)
1588            | ExprKind::Use(..)
1589            | ExprKind::Block(..)
1590            | ExprKind::Call(..)
1591            | ExprKind::ConstBlock(_)
1592            | ExprKind::Continue(..)
1593            | ExprKind::Field(..)
1594            | ExprKind::ForLoop { .. }
1595            | ExprKind::FormatArgs(..)
1596            | ExprKind::Gen(..)
1597            | ExprKind::If(..)
1598            | ExprKind::IncludedBytes(..)
1599            | ExprKind::Index(..)
1600            | ExprKind::InlineAsm(..)
1601            | ExprKind::Lit(_)
1602            | ExprKind::Loop(..)
1603            | ExprKind::MacCall(..)
1604            | ExprKind::Match(..)
1605            | ExprKind::MethodCall(..)
1606            | ExprKind::OffsetOf(..)
1607            | ExprKind::Paren(..)
1608            | ExprKind::Path(..)
1609            | ExprKind::Repeat(..)
1610            | ExprKind::Struct(..)
1611            | ExprKind::Try(..)
1612            | ExprKind::TryBlock(..)
1613            | ExprKind::Tup(_)
1614            | ExprKind::Type(..)
1615            | ExprKind::Underscore
1616            | ExprKind::UnsafeBinderCast(..)
1617            | ExprKind::While(..)
1618            | ExprKind::Yield(YieldKind::Postfix(..))
1619            | ExprKind::DirectConstArg(..)
1620            | ExprKind::Err(_)
1621            | ExprKind::Dummy => prefix_attrs_precedence(&self.attrs),
1622        }
1623    }
1624
1625    /// To a first-order approximation, is this a pattern?
1626    pub fn is_approximately_pattern(&self) -> bool {
1627        #[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!(
1628            &self.peel_parens().kind,
1629            ExprKind::Array(_)
1630                | ExprKind::Call(_, _)
1631                | ExprKind::Tup(_)
1632                | ExprKind::Lit(_)
1633                | ExprKind::Range(_, _, _)
1634                | ExprKind::Underscore
1635                | ExprKind::Path(_, _)
1636                | ExprKind::Struct(_)
1637        )
1638    }
1639
1640    /// Creates a dummy `Expr`.
1641    ///
1642    /// Should only be used when it will be replaced afterwards or as a return value when an error was encountered.
1643    pub fn dummy() -> Expr {
1644        Expr {
1645            id: DUMMY_NODE_ID,
1646            kind: ExprKind::Dummy,
1647            span: DUMMY_SP,
1648            attrs: ThinVec::new(),
1649            tokens: None,
1650        }
1651    }
1652}
1653
1654impl From<Box<Expr>> for Expr {
1655    fn from(value: Box<Expr>) -> Self {
1656        *value
1657    }
1658}
1659
1660#[derive(#[automatically_derived]
impl ::core::clone::Clone for ForLoop {
    #[inline]
    fn clone(&self) -> ForLoop {
        ForLoop {
            pat: ::core::clone::Clone::clone(&self.pat),
            iter: ::core::clone::Clone::clone(&self.iter),
            body: ::core::clone::Clone::clone(&self.body),
            label: ::core::clone::Clone::clone(&self.label),
            kind: ::core::clone::Clone::clone(&self.kind),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ForLoop {
            fn encode(&self, __encoder: &mut __E) {
                let ForLoop {
                        pat: ref __binding_0,
                        iter: ref __binding_1,
                        body: ref __binding_2,
                        label: ref __binding_3,
                        kind: ref __binding_4 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ForLoop {
            fn decode(__decoder: &mut __D) -> Self {
                ForLoop {
                    pat: ::rustc_serialize::Decodable::decode(__decoder),
                    iter: ::rustc_serialize::Decodable::decode(__decoder),
                    body: ::rustc_serialize::Decodable::decode(__decoder),
                    label: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ForLoop {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f, "ForLoop",
            "pat", &self.pat, "iter", &self.iter, "body", &self.body, "label",
            &self.label, "kind", &&self.kind)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for ForLoop
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    ForLoop {
                        pat: ref __binding_0,
                        iter: ref __binding_1,
                        body: ref __binding_2,
                        label: ref __binding_3,
                        kind: ref __binding_4 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for ForLoop where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    ForLoop {
                        pat: ref mut __binding_0,
                        iter: ref mut __binding_1,
                        body: ref mut __binding_2,
                        label: ref mut __binding_3,
                        kind: ref mut __binding_4 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
1661pub struct ForLoop {
1662    pub pat: Box<Pat>,
1663    pub iter: Box<Expr>,
1664    pub body: Box<Block>,
1665    pub label: Option<Label>,
1666    pub kind: ForLoopKind,
1667}
1668
1669#[derive(#[automatically_derived]
impl ::core::clone::Clone for Closure {
    #[inline]
    fn clone(&self) -> Closure {
        Closure {
            binder: ::core::clone::Clone::clone(&self.binder),
            capture_clause: ::core::clone::Clone::clone(&self.capture_clause),
            constness: ::core::clone::Clone::clone(&self.constness),
            coroutine_marker: ::core::clone::Clone::clone(&self.coroutine_marker),
            movability: ::core::clone::Clone::clone(&self.movability),
            fn_decl: ::core::clone::Clone::clone(&self.fn_decl),
            body: ::core::clone::Clone::clone(&self.body),
            fn_decl_span: ::core::clone::Clone::clone(&self.fn_decl_span),
            fn_arg_span: ::core::clone::Clone::clone(&self.fn_arg_span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Closure {
            fn encode(&self, __encoder: &mut __E) {
                let Closure {
                        binder: ref __binding_0,
                        capture_clause: ref __binding_1,
                        constness: ref __binding_2,
                        coroutine_marker: ref __binding_3,
                        movability: ref __binding_4,
                        fn_decl: ref __binding_5,
                        body: ref __binding_6,
                        fn_decl_span: ref __binding_7,
                        fn_arg_span: ref __binding_8 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_5,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_6,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_7,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_8,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Closure {
            fn decode(__decoder: &mut __D) -> Self {
                Closure {
                    binder: ::rustc_serialize::Decodable::decode(__decoder),
                    capture_clause: ::rustc_serialize::Decodable::decode(__decoder),
                    constness: ::rustc_serialize::Decodable::decode(__decoder),
                    coroutine_marker: ::rustc_serialize::Decodable::decode(__decoder),
                    movability: ::rustc_serialize::Decodable::decode(__decoder),
                    fn_decl: ::rustc_serialize::Decodable::decode(__decoder),
                    body: ::rustc_serialize::Decodable::decode(__decoder),
                    fn_decl_span: ::rustc_serialize::Decodable::decode(__decoder),
                    fn_arg_span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Closure {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["binder", "capture_clause", "constness", "coroutine_marker",
                        "movability", "fn_decl", "body", "fn_decl_span",
                        "fn_arg_span"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.binder, &self.capture_clause, &self.constness,
                        &self.coroutine_marker, &self.movability, &self.fn_decl,
                        &self.body, &self.fn_decl_span, &&self.fn_arg_span];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "Closure",
            names, values)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Closure
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Closure {
                        binder: ref __binding_0,
                        capture_clause: ref __binding_1,
                        constness: ref __binding_2,
                        coroutine_marker: ref __binding_3,
                        movability: ref __binding_4,
                        fn_decl: ref __binding_5,
                        body: ref __binding_6,
                        fn_decl_span: ref __binding_7,
                        fn_arg_span: ref __binding_8 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_5,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_6,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_7,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_8,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Closure where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Closure {
                        binder: ref mut __binding_0,
                        capture_clause: ref mut __binding_1,
                        constness: ref mut __binding_2,
                        coroutine_marker: ref mut __binding_3,
                        movability: ref mut __binding_4,
                        fn_decl: ref mut __binding_5,
                        body: ref mut __binding_6,
                        fn_decl_span: ref mut __binding_7,
                        fn_arg_span: ref mut __binding_8 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_5,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_6,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_7,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_8,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
1670pub struct Closure {
1671    pub binder: ClosureBinder,
1672    pub capture_clause: CaptureBy,
1673    pub constness: Const,
1674    pub coroutine_marker: Option<CoroutineMarker>,
1675    pub movability: Movability,
1676    pub fn_decl: Box<FnDecl>,
1677    pub body: Box<Expr>,
1678    /// The span of the declaration block: 'move |...| -> ...'
1679    pub fn_decl_span: Span,
1680    /// The span of the argument block `|...|`
1681    pub fn_arg_span: Span,
1682}
1683
1684/// Limit types of a range (inclusive or exclusive).
1685#[derive(#[automatically_derived]
impl ::core::marker::Copy for RangeLimits { }Copy, #[automatically_derived]
impl ::core::clone::Clone for RangeLimits {
    #[inline]
    fn clone(&self) -> RangeLimits { *self }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for RangeLimits {
    #[inline]
    fn eq(&self, other: &RangeLimits) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for RangeLimits {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        RangeLimits::HalfOpen => { 0usize }
                        RangeLimits::Closed => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for RangeLimits {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { RangeLimits::HalfOpen }
                    1usize => { RangeLimits::Closed }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `RangeLimits`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for RangeLimits {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                RangeLimits::HalfOpen => "HalfOpen",
                RangeLimits::Closed => "Closed",
            })
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for RangeLimits
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    RangeLimits::HalfOpen => {}
                    RangeLimits::Closed => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for RangeLimits where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    RangeLimits::HalfOpen => {}
                    RangeLimits::Closed => {}
                }
            }
        }
    };Walkable)]
1686pub enum RangeLimits {
1687    /// Inclusive at the beginning, exclusive at the end.
1688    HalfOpen,
1689    /// Inclusive at the beginning and end.
1690    Closed,
1691}
1692
1693impl RangeLimits {
1694    pub fn as_str(&self) -> &'static str {
1695        match self {
1696            RangeLimits::HalfOpen => "..",
1697            RangeLimits::Closed => "..=",
1698        }
1699    }
1700}
1701
1702/// A method call (e.g. `x.foo::<Bar, Baz>(a, b, c)`).
1703#[derive(#[automatically_derived]
impl ::core::clone::Clone for MethodCall {
    #[inline]
    fn clone(&self) -> MethodCall {
        MethodCall {
            seg: ::core::clone::Clone::clone(&self.seg),
            receiver: ::core::clone::Clone::clone(&self.receiver),
            args: ::core::clone::Clone::clone(&self.args),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for MethodCall {
            fn encode(&self, __encoder: &mut __E) {
                let MethodCall {
                        seg: ref __binding_0,
                        receiver: ref __binding_1,
                        args: ref __binding_2,
                        span: ref __binding_3 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for MethodCall {
            fn decode(__decoder: &mut __D) -> Self {
                MethodCall {
                    seg: ::rustc_serialize::Decodable::decode(__decoder),
                    receiver: ::rustc_serialize::Decodable::decode(__decoder),
                    args: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for MethodCall {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "MethodCall",
            "seg", &self.seg, "receiver", &self.receiver, "args", &self.args,
            "span", &&self.span)
    }
}Debug)]
1704pub struct MethodCall {
1705    /// The method name and its generic arguments, e.g. `foo::<Bar, Baz>`.
1706    pub seg: PathSegment,
1707    /// The receiver, e.g. `x`.
1708    pub receiver: Box<Expr>,
1709    /// The arguments, e.g. `a, b, c`.
1710    pub args: ThinVec<Box<Expr>>,
1711    /// The span of the function, without the dot and receiver e.g. `foo::<Bar,
1712    /// Baz>(a, b, c)`.
1713    pub span: Span,
1714}
1715
1716#[derive(#[automatically_derived]
impl ::core::clone::Clone for StructRest {
    #[inline]
    fn clone(&self) -> StructRest {
        match self {
            StructRest::Base(__self_0) =>
                StructRest::Base(::core::clone::Clone::clone(__self_0)),
            StructRest::Rest(__self_0) =>
                StructRest::Rest(::core::clone::Clone::clone(__self_0)),
            StructRest::None => StructRest::None,
            StructRest::NoneWithError(__self_0) =>
                StructRest::NoneWithError(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for StructRest {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        StructRest::Base(ref __binding_0) => { 0usize }
                        StructRest::Rest(ref __binding_0) => { 1usize }
                        StructRest::None => { 2usize }
                        StructRest::NoneWithError(ref __binding_0) => { 3usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    StructRest::Base(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    StructRest::Rest(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    StructRest::None => {}
                    StructRest::NoneWithError(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for StructRest {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        StructRest::Base(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        StructRest::Rest(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => { StructRest::None }
                    3usize => {
                        StructRest::NoneWithError(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `StructRest`, expected 0..4, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for StructRest {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            StructRest::Base(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Base",
                    &__self_0),
            StructRest::Rest(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Rest",
                    &__self_0),
            StructRest::None => ::core::fmt::Formatter::write_str(f, "None"),
            StructRest::NoneWithError(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "NoneWithError", &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for StructRest
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    StructRest::Base(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    StructRest::Rest(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    StructRest::None => {}
                    StructRest::NoneWithError(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for StructRest where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    StructRest::Base(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    StructRest::Rest(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    StructRest::None => {}
                    StructRest::NoneWithError(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
1717pub enum StructRest {
1718    /// `..x`.
1719    Base(Box<Expr>),
1720    /// `..`.
1721    Rest(Span),
1722    /// No trailing `..` or expression.
1723    None,
1724    /// No trailing `..` or expression, and also, a parse error occurred inside the struct braces.
1725    ///
1726    /// This struct should be treated similarly to as if it had an `..` in it,
1727    /// in particular rather than reporting missing fields, because the parse error
1728    /// makes which fields the struct was intended to have not fully known.
1729    NoneWithError(ErrorGuaranteed),
1730}
1731
1732#[derive(#[automatically_derived]
impl ::core::clone::Clone for StructExpr {
    #[inline]
    fn clone(&self) -> StructExpr {
        StructExpr {
            qself: ::core::clone::Clone::clone(&self.qself),
            path: ::core::clone::Clone::clone(&self.path),
            fields: ::core::clone::Clone::clone(&self.fields),
            rest: ::core::clone::Clone::clone(&self.rest),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for StructExpr {
            fn encode(&self, __encoder: &mut __E) {
                let StructExpr {
                        qself: ref __binding_0,
                        path: ref __binding_1,
                        fields: ref __binding_2,
                        rest: ref __binding_3 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for StructExpr {
            fn decode(__decoder: &mut __D) -> Self {
                StructExpr {
                    qself: ::rustc_serialize::Decodable::decode(__decoder),
                    path: ::rustc_serialize::Decodable::decode(__decoder),
                    fields: ::rustc_serialize::Decodable::decode(__decoder),
                    rest: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for StructExpr {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "StructExpr",
            "qself", &self.qself, "path", &self.path, "fields", &self.fields,
            "rest", &&self.rest)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for StructExpr
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    StructExpr {
                        qself: ref __binding_0,
                        path: ref __binding_1,
                        fields: ref __binding_2,
                        rest: ref __binding_3 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for StructExpr where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    StructExpr {
                        qself: ref mut __binding_0,
                        path: ref mut __binding_1,
                        fields: ref mut __binding_2,
                        rest: ref mut __binding_3 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
1733pub struct StructExpr {
1734    pub qself: Option<Box<QSelf>>,
1735    pub path: Path,
1736    pub fields: ThinVec<ExprField>,
1737    pub rest: StructRest,
1738}
1739
1740// Adding a new variant? Please update `test_expr` in `tests/ui/macros/stringify.rs`.
1741#[derive(#[automatically_derived]
impl ::core::clone::Clone for ExprKind {
    #[inline]
    fn clone(&self) -> ExprKind {
        match self {
            ExprKind::Array(__self_0) =>
                ExprKind::Array(::core::clone::Clone::clone(__self_0)),
            ExprKind::ConstBlock(__self_0) =>
                ExprKind::ConstBlock(::core::clone::Clone::clone(__self_0)),
            ExprKind::Call(__self_0, __self_1) =>
                ExprKind::Call(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::MethodCall(__self_0) =>
                ExprKind::MethodCall(::core::clone::Clone::clone(__self_0)),
            ExprKind::Tup(__self_0) =>
                ExprKind::Tup(::core::clone::Clone::clone(__self_0)),
            ExprKind::Binary(__self_0, __self_1, __self_2) =>
                ExprKind::Binary(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ExprKind::Unary(__self_0, __self_1) =>
                ExprKind::Unary(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::Move(__self_0, __self_1) =>
                ExprKind::Move(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::Lit(__self_0) =>
                ExprKind::Lit(::core::clone::Clone::clone(__self_0)),
            ExprKind::Cast(__self_0, __self_1) =>
                ExprKind::Cast(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::Type(__self_0, __self_1) =>
                ExprKind::Type(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::Let(__self_0, __self_1, __self_2, __self_3) =>
                ExprKind::Let(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2),
                    ::core::clone::Clone::clone(__self_3)),
            ExprKind::If(__self_0, __self_1, __self_2) =>
                ExprKind::If(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ExprKind::While(__self_0, __self_1, __self_2) =>
                ExprKind::While(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ExprKind::ForLoop(__self_0) =>
                ExprKind::ForLoop(::core::clone::Clone::clone(__self_0)),
            ExprKind::Loop(__self_0, __self_1, __self_2) =>
                ExprKind::Loop(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ExprKind::Match(__self_0, __self_1, __self_2) =>
                ExprKind::Match(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ExprKind::Closure(__self_0) =>
                ExprKind::Closure(::core::clone::Clone::clone(__self_0)),
            ExprKind::Block(__self_0, __self_1) =>
                ExprKind::Block(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::Gen(__self_0, __self_1, __self_2, __self_3) =>
                ExprKind::Gen(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2),
                    ::core::clone::Clone::clone(__self_3)),
            ExprKind::Await(__self_0, __self_1) =>
                ExprKind::Await(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::Use(__self_0, __self_1) =>
                ExprKind::Use(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::TryBlock(__self_0, __self_1) =>
                ExprKind::TryBlock(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::Assign(__self_0, __self_1, __self_2) =>
                ExprKind::Assign(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ExprKind::AssignOp(__self_0, __self_1, __self_2) =>
                ExprKind::AssignOp(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ExprKind::Field(__self_0, __self_1) =>
                ExprKind::Field(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::Index(__self_0, __self_1, __self_2) =>
                ExprKind::Index(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ExprKind::Range(__self_0, __self_1, __self_2) =>
                ExprKind::Range(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ExprKind::Underscore => ExprKind::Underscore,
            ExprKind::Path(__self_0, __self_1) =>
                ExprKind::Path(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::AddrOf(__self_0, __self_1, __self_2) =>
                ExprKind::AddrOf(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ExprKind::Break(__self_0, __self_1) =>
                ExprKind::Break(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::Continue(__self_0) =>
                ExprKind::Continue(::core::clone::Clone::clone(__self_0)),
            ExprKind::Ret(__self_0) =>
                ExprKind::Ret(::core::clone::Clone::clone(__self_0)),
            ExprKind::InlineAsm(__self_0) =>
                ExprKind::InlineAsm(::core::clone::Clone::clone(__self_0)),
            ExprKind::OffsetOf(__self_0, __self_1) =>
                ExprKind::OffsetOf(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::MacCall(__self_0) =>
                ExprKind::MacCall(::core::clone::Clone::clone(__self_0)),
            ExprKind::Struct(__self_0) =>
                ExprKind::Struct(::core::clone::Clone::clone(__self_0)),
            ExprKind::Repeat(__self_0, __self_1) =>
                ExprKind::Repeat(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            ExprKind::Paren(__self_0) =>
                ExprKind::Paren(::core::clone::Clone::clone(__self_0)),
            ExprKind::Try(__self_0) =>
                ExprKind::Try(::core::clone::Clone::clone(__self_0)),
            ExprKind::Yield(__self_0) =>
                ExprKind::Yield(::core::clone::Clone::clone(__self_0)),
            ExprKind::Yeet(__self_0) =>
                ExprKind::Yeet(::core::clone::Clone::clone(__self_0)),
            ExprKind::Become(__self_0) =>
                ExprKind::Become(::core::clone::Clone::clone(__self_0)),
            ExprKind::IncludedBytes(__self_0) =>
                ExprKind::IncludedBytes(::core::clone::Clone::clone(__self_0)),
            ExprKind::FormatArgs(__self_0) =>
                ExprKind::FormatArgs(::core::clone::Clone::clone(__self_0)),
            ExprKind::UnsafeBinderCast(__self_0, __self_1, __self_2) =>
                ExprKind::UnsafeBinderCast(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ExprKind::DirectConstArg(__self_0) =>
                ExprKind::DirectConstArg(::core::clone::Clone::clone(__self_0)),
            ExprKind::Err(__self_0) =>
                ExprKind::Err(::core::clone::Clone::clone(__self_0)),
            ExprKind::Dummy => ExprKind::Dummy,
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ExprKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        ExprKind::Array(ref __binding_0) => { 0usize }
                        ExprKind::ConstBlock(ref __binding_0) => { 1usize }
                        ExprKind::Call(ref __binding_0, ref __binding_1) => {
                            2usize
                        }
                        ExprKind::MethodCall(ref __binding_0) => { 3usize }
                        ExprKind::Tup(ref __binding_0) => { 4usize }
                        ExprKind::Binary(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            5usize
                        }
                        ExprKind::Unary(ref __binding_0, ref __binding_1) => {
                            6usize
                        }
                        ExprKind::Move(ref __binding_0, ref __binding_1) => {
                            7usize
                        }
                        ExprKind::Lit(ref __binding_0) => { 8usize }
                        ExprKind::Cast(ref __binding_0, ref __binding_1) => {
                            9usize
                        }
                        ExprKind::Type(ref __binding_0, ref __binding_1) => {
                            10usize
                        }
                        ExprKind::Let(ref __binding_0, ref __binding_1,
                            ref __binding_2, ref __binding_3) => {
                            11usize
                        }
                        ExprKind::If(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            12usize
                        }
                        ExprKind::While(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            13usize
                        }
                        ExprKind::ForLoop(ref __binding_0) => { 14usize }
                        ExprKind::Loop(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            15usize
                        }
                        ExprKind::Match(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            16usize
                        }
                        ExprKind::Closure(ref __binding_0) => { 17usize }
                        ExprKind::Block(ref __binding_0, ref __binding_1) => {
                            18usize
                        }
                        ExprKind::Gen(ref __binding_0, ref __binding_1,
                            ref __binding_2, ref __binding_3) => {
                            19usize
                        }
                        ExprKind::Await(ref __binding_0, ref __binding_1) => {
                            20usize
                        }
                        ExprKind::Use(ref __binding_0, ref __binding_1) => {
                            21usize
                        }
                        ExprKind::TryBlock(ref __binding_0, ref __binding_1) => {
                            22usize
                        }
                        ExprKind::Assign(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            23usize
                        }
                        ExprKind::AssignOp(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            24usize
                        }
                        ExprKind::Field(ref __binding_0, ref __binding_1) => {
                            25usize
                        }
                        ExprKind::Index(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            26usize
                        }
                        ExprKind::Range(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            27usize
                        }
                        ExprKind::Underscore => { 28usize }
                        ExprKind::Path(ref __binding_0, ref __binding_1) => {
                            29usize
                        }
                        ExprKind::AddrOf(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            30usize
                        }
                        ExprKind::Break(ref __binding_0, ref __binding_1) => {
                            31usize
                        }
                        ExprKind::Continue(ref __binding_0) => { 32usize }
                        ExprKind::Ret(ref __binding_0) => { 33usize }
                        ExprKind::InlineAsm(ref __binding_0) => { 34usize }
                        ExprKind::OffsetOf(ref __binding_0, ref __binding_1) => {
                            35usize
                        }
                        ExprKind::MacCall(ref __binding_0) => { 36usize }
                        ExprKind::Struct(ref __binding_0) => { 37usize }
                        ExprKind::Repeat(ref __binding_0, ref __binding_1) => {
                            38usize
                        }
                        ExprKind::Paren(ref __binding_0) => { 39usize }
                        ExprKind::Try(ref __binding_0) => { 40usize }
                        ExprKind::Yield(ref __binding_0) => { 41usize }
                        ExprKind::Yeet(ref __binding_0) => { 42usize }
                        ExprKind::Become(ref __binding_0) => { 43usize }
                        ExprKind::IncludedBytes(ref __binding_0) => { 44usize }
                        ExprKind::FormatArgs(ref __binding_0) => { 45usize }
                        ExprKind::UnsafeBinderCast(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            46usize
                        }
                        ExprKind::DirectConstArg(ref __binding_0) => { 47usize }
                        ExprKind::Err(ref __binding_0) => { 48usize }
                        ExprKind::Dummy => { 49usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    ExprKind::Array(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::ConstBlock(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Call(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::MethodCall(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Tup(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Binary(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    ExprKind::Unary(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::Move(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::Lit(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Cast(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::Type(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::Let(ref __binding_0, ref __binding_1,
                        ref __binding_2, ref __binding_3) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                            __encoder);
                    }
                    ExprKind::If(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    ExprKind::While(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    ExprKind::ForLoop(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Loop(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    ExprKind::Match(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    ExprKind::Closure(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Block(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::Gen(ref __binding_0, ref __binding_1,
                        ref __binding_2, ref __binding_3) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                            __encoder);
                    }
                    ExprKind::Await(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::Use(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::TryBlock(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::Assign(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    ExprKind::AssignOp(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    ExprKind::Field(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::Index(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    ExprKind::Range(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    ExprKind::Underscore => {}
                    ExprKind::Path(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::AddrOf(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    ExprKind::Break(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::Continue(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Ret(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::InlineAsm(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::OffsetOf(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::MacCall(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Struct(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Repeat(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    ExprKind::Paren(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Try(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Yield(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Yeet(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Become(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::IncludedBytes(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::FormatArgs(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::UnsafeBinderCast(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    ExprKind::DirectConstArg(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Err(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    ExprKind::Dummy => {}
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ExprKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        ExprKind::Array(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        ExprKind::ConstBlock(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        ExprKind::Call(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => {
                        ExprKind::MethodCall(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    4usize => {
                        ExprKind::Tup(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    5usize => {
                        ExprKind::Binary(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    6usize => {
                        ExprKind::Unary(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    7usize => {
                        ExprKind::Move(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    8usize => {
                        ExprKind::Lit(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    9usize => {
                        ExprKind::Cast(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    10usize => {
                        ExprKind::Type(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    11usize => {
                        ExprKind::Let(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    12usize => {
                        ExprKind::If(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    13usize => {
                        ExprKind::While(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    14usize => {
                        ExprKind::ForLoop(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    15usize => {
                        ExprKind::Loop(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    16usize => {
                        ExprKind::Match(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    17usize => {
                        ExprKind::Closure(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    18usize => {
                        ExprKind::Block(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    19usize => {
                        ExprKind::Gen(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    20usize => {
                        ExprKind::Await(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    21usize => {
                        ExprKind::Use(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    22usize => {
                        ExprKind::TryBlock(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    23usize => {
                        ExprKind::Assign(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    24usize => {
                        ExprKind::AssignOp(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    25usize => {
                        ExprKind::Field(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    26usize => {
                        ExprKind::Index(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    27usize => {
                        ExprKind::Range(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    28usize => { ExprKind::Underscore }
                    29usize => {
                        ExprKind::Path(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    30usize => {
                        ExprKind::AddrOf(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    31usize => {
                        ExprKind::Break(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    32usize => {
                        ExprKind::Continue(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    33usize => {
                        ExprKind::Ret(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    34usize => {
                        ExprKind::InlineAsm(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    35usize => {
                        ExprKind::OffsetOf(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    36usize => {
                        ExprKind::MacCall(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    37usize => {
                        ExprKind::Struct(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    38usize => {
                        ExprKind::Repeat(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    39usize => {
                        ExprKind::Paren(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    40usize => {
                        ExprKind::Try(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    41usize => {
                        ExprKind::Yield(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    42usize => {
                        ExprKind::Yeet(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    43usize => {
                        ExprKind::Become(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    44usize => {
                        ExprKind::IncludedBytes(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    45usize => {
                        ExprKind::FormatArgs(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    46usize => {
                        ExprKind::UnsafeBinderCast(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    47usize => {
                        ExprKind::DirectConstArg(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    48usize => {
                        ExprKind::Err(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    49usize => { ExprKind::Dummy }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `ExprKind`, expected 0..50, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ExprKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            ExprKind::Array(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Array",
                    &__self_0),
            ExprKind::ConstBlock(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ConstBlock", &__self_0),
            ExprKind::Call(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Call",
                    __self_0, &__self_1),
            ExprKind::MethodCall(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "MethodCall", &__self_0),
            ExprKind::Tup(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Tup",
                    &__self_0),
            ExprKind::Binary(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Binary",
                    __self_0, __self_1, &__self_2),
            ExprKind::Unary(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Unary",
                    __self_0, &__self_1),
            ExprKind::Move(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Move",
                    __self_0, &__self_1),
            ExprKind::Lit(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Lit",
                    &__self_0),
            ExprKind::Cast(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Cast",
                    __self_0, &__self_1),
            ExprKind::Type(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Type",
                    __self_0, &__self_1),
            ExprKind::Let(__self_0, __self_1, __self_2, __self_3) =>
                ::core::fmt::Formatter::debug_tuple_field4_finish(f, "Let",
                    __self_0, __self_1, __self_2, &__self_3),
            ExprKind::If(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "If",
                    __self_0, __self_1, &__self_2),
            ExprKind::While(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "While",
                    __self_0, __self_1, &__self_2),
            ExprKind::ForLoop(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ForLoop", &__self_0),
            ExprKind::Loop(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Loop",
                    __self_0, __self_1, &__self_2),
            ExprKind::Match(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Match",
                    __self_0, __self_1, &__self_2),
            ExprKind::Closure(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Closure", &__self_0),
            ExprKind::Block(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Block",
                    __self_0, &__self_1),
            ExprKind::Gen(__self_0, __self_1, __self_2, __self_3) =>
                ::core::fmt::Formatter::debug_tuple_field4_finish(f, "Gen",
                    __self_0, __self_1, __self_2, &__self_3),
            ExprKind::Await(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Await",
                    __self_0, &__self_1),
            ExprKind::Use(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Use",
                    __self_0, &__self_1),
            ExprKind::TryBlock(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "TryBlock", __self_0, &__self_1),
            ExprKind::Assign(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Assign",
                    __self_0, __self_1, &__self_2),
            ExprKind::AssignOp(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f,
                    "AssignOp", __self_0, __self_1, &__self_2),
            ExprKind::Field(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Field",
                    __self_0, &__self_1),
            ExprKind::Index(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Index",
                    __self_0, __self_1, &__self_2),
            ExprKind::Range(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Range",
                    __self_0, __self_1, &__self_2),
            ExprKind::Underscore =>
                ::core::fmt::Formatter::write_str(f, "Underscore"),
            ExprKind::Path(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Path",
                    __self_0, &__self_1),
            ExprKind::AddrOf(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "AddrOf",
                    __self_0, __self_1, &__self_2),
            ExprKind::Break(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Break",
                    __self_0, &__self_1),
            ExprKind::Continue(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Continue", &__self_0),
            ExprKind::Ret(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Ret",
                    &__self_0),
            ExprKind::InlineAsm(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "InlineAsm", &__self_0),
            ExprKind::OffsetOf(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "OffsetOf", __self_0, &__self_1),
            ExprKind::MacCall(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "MacCall", &__self_0),
            ExprKind::Struct(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Struct",
                    &__self_0),
            ExprKind::Repeat(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Repeat",
                    __self_0, &__self_1),
            ExprKind::Paren(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Paren",
                    &__self_0),
            ExprKind::Try(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Try",
                    &__self_0),
            ExprKind::Yield(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Yield",
                    &__self_0),
            ExprKind::Yeet(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Yeet",
                    &__self_0),
            ExprKind::Become(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Become",
                    &__self_0),
            ExprKind::IncludedBytes(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "IncludedBytes", &__self_0),
            ExprKind::FormatArgs(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "FormatArgs", &__self_0),
            ExprKind::UnsafeBinderCast(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f,
                    "UnsafeBinderCast", __self_0, __self_1, &__self_2),
            ExprKind::DirectConstArg(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "DirectConstArg", &__self_0),
            ExprKind::Err(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Err",
                    &__self_0),
            ExprKind::Dummy => ::core::fmt::Formatter::write_str(f, "Dummy"),
        }
    }
}Debug)]
1742pub enum ExprKind {
1743    /// An array (e.g, `[a, b, c, d]`).
1744    Array(ThinVec<Box<Expr>>),
1745    /// Allow anonymous constants from an inline `const` block.
1746    ConstBlock(AnonConst),
1747    /// A function call.
1748    ///
1749    /// The first field resolves to the function itself,
1750    /// and the second field is the list of arguments.
1751    /// This also represents calling the constructor of
1752    /// tuple-like ADTs such as tuple structs and enum variants.
1753    Call(Box<Expr>, ThinVec<Box<Expr>>),
1754    /// A method call (e.g., `x.foo::<Bar, Baz>(a, b, c)`).
1755    MethodCall(Box<MethodCall>),
1756    /// A tuple (e.g., `(a, b, c, d)`).
1757    Tup(ThinVec<Box<Expr>>),
1758    /// A binary operation (e.g., `a + b`, `a * b`).
1759    Binary(BinOp, Box<Expr>, Box<Expr>),
1760    /// A unary operation (e.g., `!x`, `*x`).
1761    Unary(UnOp, Box<Expr>),
1762    /// A `move(expr)` expression.
1763    Move(Box<Expr>, Span),
1764    /// A literal (e.g., `1`, `"foo"`).
1765    Lit(token::Lit),
1766    /// A cast (e.g., `foo as f64`).
1767    Cast(Box<Expr>, Box<Ty>),
1768    /// A type ascription (e.g., `builtin # type_ascribe(42, usize)`).
1769    ///
1770    /// Usually not written directly in user code but
1771    /// indirectly via the macro `type_ascribe!(...)`.
1772    Type(Box<Expr>, Box<Ty>),
1773    /// A `let pat = expr` expression that is only semantically allowed in the condition
1774    /// of `if` / `while` expressions. (e.g., `if let 0 = x { .. }`).
1775    ///
1776    /// `Span` represents the whole `let pat = expr` statement.
1777    Let(Box<Pat>, Box<Expr>, Span, Recovered),
1778    /// An `if` block, with an optional `else` block.
1779    ///
1780    /// `if expr { block } else { expr }`
1781    ///
1782    /// If present, the "else" expr is always `ExprKind::Block` (for `else`) or
1783    /// `ExprKind::If` (for `else if`).
1784    If(Box<Expr>, Box<Block>, Option<Box<Expr>>),
1785    /// A while loop, with an optional label.
1786    ///
1787    /// `'label: while expr { block }`
1788    While(Box<Expr>, Box<Block>, Option<Label>),
1789    /// A `for` loop, with an optional label.
1790    ///
1791    /// `'label: for await? pat in iter { block }`
1792    ///
1793    /// This is desugared to a combination of `loop` and `match` expressions.
1794    ForLoop(Box<ForLoop>),
1795    /// Conditionless loop (can be exited with `break`, `continue`, or `return`).
1796    ///
1797    /// `'label: loop { block }`
1798    Loop(Box<Block>, Option<Label>, Span),
1799    /// A `match` block.
1800    Match(Box<Expr>, ThinVec<Arm>, MatchKind),
1801    /// A closure (e.g., `move |a, b, c| a + b + c`).
1802    Closure(Box<Closure>),
1803    /// A block (`'label: { ... }`).
1804    Block(Box<Block>, Option<Label>),
1805    /// An `async` block (`async move { ... }`),
1806    /// or a `gen` block (`gen move { ... }`).
1807    ///
1808    /// The span is the "decl", which is the header before the body `{ }`
1809    /// including the `async`/`gen` keywords and possibly `move`.
1810    Gen(CaptureBy, Box<Block>, CoroutineKind, Span),
1811    /// An await expression (`my_future.await`). Span is of await keyword.
1812    Await(Box<Expr>, Span),
1813    /// A use expression (`x.use`). Span is of use keyword.
1814    Use(Box<Expr>, Span),
1815
1816    /// A try block (`try { ... }`), if the type is `None`, or
1817    /// A try block (`try bikeshed Ty { ... }`) if the type is `Some`.
1818    ///
1819    /// Note that `try bikeshed` is a *deliberately ridiculous* placeholder
1820    /// syntax to avoid deciding what keyword or symbol should go there.
1821    /// It's that way for experimentation only; an RFC to decide the final
1822    /// semantics and syntax would be needed to put it on stabilization-track.
1823    TryBlock(Box<Block>, Option<Box<Ty>>),
1824
1825    /// An assignment (`a = foo()`).
1826    /// The `Span` argument is the span of the `=` token.
1827    Assign(Box<Expr>, Box<Expr>, Span),
1828    /// An assignment with an operator.
1829    ///
1830    /// E.g., `a += 1`.
1831    AssignOp(AssignOp, Box<Expr>, Box<Expr>),
1832    /// Access of a named (e.g., `obj.foo`) or unnamed (e.g., `obj.0`) struct field.
1833    Field(Box<Expr>, Ident),
1834    /// An indexing operation (e.g., `foo[2]`).
1835    /// The span represents the span of the `[2]`, including brackets.
1836    Index(Box<Expr>, Box<Expr>, Span),
1837    /// A range (e.g., `1..2`, `1..`, `..2`, `1..=2`, `..=2`; and `..` in destructuring assignment).
1838    Range(Option<Box<Expr>>, Option<Box<Expr>>, RangeLimits),
1839    /// An underscore, used in destructuring assignment to ignore a value.
1840    Underscore,
1841
1842    /// Variable reference, possibly containing `::` and/or type
1843    /// parameters (e.g., `foo::bar::<baz>`).
1844    ///
1845    /// Optionally "qualified" (e.g., `<Vec<T> as SomeTrait>::SomeType`).
1846    Path(Option<Box<QSelf>>, Path),
1847
1848    /// A referencing operation (`&a`, `&mut a`, `&raw const a` or `&raw mut a`).
1849    AddrOf(BorrowKind, Mutability, Box<Expr>),
1850    /// A `break`, with an optional label to break, and an optional expression.
1851    Break(Option<Label>, Option<Box<Expr>>),
1852    /// A `continue`, with an optional label.
1853    Continue(Option<Label>),
1854    /// A `return`, with an optional value to be returned.
1855    Ret(Option<Box<Expr>>),
1856
1857    /// Output of the `asm!()` macro.
1858    InlineAsm(Box<InlineAsm>),
1859
1860    /// An `offset_of` expression (e.g., `builtin # offset_of(Struct, field)`).
1861    ///
1862    /// Usually not written directly in user code but
1863    /// indirectly via the macro `core::mem::offset_of!(...)`.
1864    OffsetOf(Box<Ty>, ThinVec<Ident>),
1865
1866    /// A macro invocation; pre-expansion.
1867    MacCall(Box<MacCall>),
1868
1869    /// A struct literal expression.
1870    ///
1871    /// E.g., `Foo {x: 1, y: 2}`, or `Foo {x: 1, .. rest}`.
1872    Struct(Box<StructExpr>),
1873
1874    /// An array literal constructed from one repeated element.
1875    ///
1876    /// E.g., `[1; 5]`. The expression is the element to be
1877    /// repeated; the constant is the number of times to repeat it.
1878    Repeat(Box<Expr>, AnonConst),
1879
1880    /// No-op: used solely so we can pretty-print faithfully.
1881    Paren(Box<Expr>),
1882
1883    /// A try expression (`expr?`).
1884    Try(Box<Expr>),
1885
1886    /// A `yield`, with an optional value to be yielded.
1887    Yield(YieldKind),
1888
1889    /// A `do yeet` (aka `throw`/`fail`/`bail`/`raise`/whatever),
1890    /// with an optional value to be returned.
1891    Yeet(Option<Box<Expr>>),
1892
1893    /// A tail call return, with the value to be returned.
1894    ///
1895    /// While `.0` must be a function call, we check this later, after parsing.
1896    Become(Box<Expr>),
1897
1898    /// Bytes included via `include_bytes!`
1899    ///
1900    /// Added for optimization purposes to avoid the need to escape
1901    /// large binary blobs - should always behave like [`ExprKind::Lit`]
1902    /// with a `ByteStr` literal.
1903    ///
1904    /// The value is stored as a `ByteSymbol`. It's unfortunate that we need to
1905    /// intern (hash) the bytes because they're likely to be large and unique.
1906    /// But it's necessary because this will eventually be lowered to
1907    /// `LitKind::ByteStr`, which needs a `ByteSymbol` to impl `Copy` and avoid
1908    /// arena allocation.
1909    IncludedBytes(ByteSymbol),
1910
1911    /// A `format_args!()` expression.
1912    FormatArgs(Box<FormatArgs>),
1913
1914    UnsafeBinderCast(UnsafeBinderCastKind, Box<Expr>, Option<Box<Ty>>),
1915
1916    /// An mGCA `direct_const_arg!()` expression.
1917    DirectConstArg(Box<Expr>),
1918
1919    /// Placeholder for an expression that wasn't syntactically well formed in some way.
1920    Err(ErrorGuaranteed),
1921
1922    /// Acts as a null expression. Lowering it will always emit a bug.
1923    Dummy,
1924}
1925
1926/// Used to differentiate between `for` loops and `for await` loops.
1927#[derive(#[automatically_derived]
impl ::core::clone::Clone for ForLoopKind {
    #[inline]
    fn clone(&self) -> ForLoopKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for ForLoopKind { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ForLoopKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        ForLoopKind::For => { 0usize }
                        ForLoopKind::ForAwait => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ForLoopKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { ForLoopKind::For }
                    1usize => { ForLoopKind::ForAwait }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `ForLoopKind`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ForLoopKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                ForLoopKind::For => "For",
                ForLoopKind::ForAwait => "ForAwait",
            })
    }
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for ForLoopKind {
    #[inline]
    fn eq(&self, other: &ForLoopKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ForLoopKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for ForLoopKind
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    ForLoopKind::For => {}
                    ForLoopKind::ForAwait => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for ForLoopKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    ForLoopKind::For => {}
                    ForLoopKind::ForAwait => {}
                }
            }
        }
    };Walkable)]
1928pub enum ForLoopKind {
1929    For,
1930    ForAwait,
1931}
1932
1933#[derive(#[automatically_derived]
impl ::core::clone::Clone for CoroutineKind {
    #[inline]
    fn clone(&self) -> CoroutineKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for CoroutineKind { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for CoroutineKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        CoroutineKind::Async => { 0usize }
                        CoroutineKind::Gen => { 1usize }
                        CoroutineKind::AsyncGen => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for CoroutineKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { CoroutineKind::Async }
                    1usize => { CoroutineKind::Gen }
                    2usize => { CoroutineKind::AsyncGen }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `CoroutineKind`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for CoroutineKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                CoroutineKind::Async => "Async",
                CoroutineKind::Gen => "Gen",
                CoroutineKind::AsyncGen => "AsyncGen",
            })
    }
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for CoroutineKind {
    #[inline]
    fn eq(&self, other: &CoroutineKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for CoroutineKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            CoroutineKind where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    CoroutineKind::Async => {}
                    CoroutineKind::Gen => {}
                    CoroutineKind::AsyncGen => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for CoroutineKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    CoroutineKind::Async => {}
                    CoroutineKind::Gen => {}
                    CoroutineKind::AsyncGen => {}
                }
            }
        }
    };Walkable)]
1934pub enum CoroutineKind {
1935    Async,
1936    Gen,
1937    AsyncGen,
1938}
1939
1940impl fmt::Display for CoroutineKind {
1941    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1942        self.as_str().fmt(f)
1943    }
1944}
1945
1946impl CoroutineKind {
1947    /// Matches `Gen` and `AsyncGen`.
1948    pub fn is_gen(&self) -> bool {
1949        match self {
1950            CoroutineKind::Async => false,
1951            CoroutineKind::Gen | CoroutineKind::AsyncGen => true,
1952        }
1953    }
1954
1955    pub fn as_str(&self) -> &'static str {
1956        match self {
1957            CoroutineKind::Async => "async",
1958            CoroutineKind::Gen => "gen",
1959            CoroutineKind::AsyncGen => "async gen",
1960        }
1961    }
1962}
1963
1964/// Whether we're unwrapping or wrapping an unsafe binder
1965#[derive(#[automatically_derived]
impl ::core::marker::Copy for UnsafeBinderCastKind { }Copy, #[automatically_derived]
impl ::core::clone::Clone for UnsafeBinderCastKind {
    #[inline]
    fn clone(&self) -> UnsafeBinderCastKind { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for UnsafeBinderCastKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                UnsafeBinderCastKind::Wrap => "Wrap",
                UnsafeBinderCastKind::Unwrap => "Unwrap",
            })
    }
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for UnsafeBinderCastKind {
    #[inline]
    fn eq(&self, other: &UnsafeBinderCastKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for UnsafeBinderCastKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for UnsafeBinderCastKind {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state)
    }
}Hash)]
1966#[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)]
1967pub enum UnsafeBinderCastKind {
1968    // e.g. `&i32` -> `unsafe<'a> &'a i32`
1969    Wrap,
1970    // e.g. `unsafe<'a> &'a i32` -> `&i32`
1971    Unwrap,
1972}
1973
1974/// The explicit `Self` type in a "qualified path".
1975///
1976/// The actual path, including the trait and the associated item, is stored
1977/// separately. `position` represents the index of the associated
1978/// item qualified with this `Self` type.
1979///
1980/// ```ignore (only-for-syntax-highlight)
1981/// <Vec<T> as a::b::Trait>::AssociatedItem
1982///  ^~~~~     ~~~~~~~~~~~~~~^
1983///  ty        position = 3
1984///
1985/// <Vec<T>>::AssociatedItem
1986///  ^~~~~    ^
1987///  ty       position = 0
1988/// ```
1989#[derive(#[automatically_derived]
impl ::core::clone::Clone for QSelf {
    #[inline]
    fn clone(&self) -> QSelf {
        QSelf {
            ty: ::core::clone::Clone::clone(&self.ty),
            path_span: ::core::clone::Clone::clone(&self.path_span),
            position: ::core::clone::Clone::clone(&self.position),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for QSelf {
            fn encode(&self, __encoder: &mut __E) {
                let QSelf {
                        ty: ref __binding_0,
                        path_span: ref __binding_1,
                        position: ref __binding_2 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for QSelf {
            fn decode(__decoder: &mut __D) -> Self {
                QSelf {
                    ty: ::rustc_serialize::Decodable::decode(__decoder),
                    path_span: ::rustc_serialize::Decodable::decode(__decoder),
                    position: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for QSelf {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "QSelf", "ty",
            &self.ty, "path_span", &self.path_span, "position",
            &&self.position)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for QSelf where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    QSelf {
                        ty: ref __binding_0,
                        path_span: ref __binding_1,
                        position: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for QSelf where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    QSelf {
                        ty: ref mut __binding_0,
                        path_span: ref mut __binding_1,
                        position: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
1990pub struct QSelf {
1991    pub ty: Box<Ty>,
1992
1993    /// The span of `a::b::Trait` in a path like `<Vec<T> as
1994    /// a::b::Trait>::AssociatedItem`; in the case where `position ==
1995    /// 0`, this is an empty span.
1996    pub path_span: Span,
1997    pub position: usize,
1998}
1999
2000/// A capture clause used in closures and `async` blocks.
2001#[derive(#[automatically_derived]
impl ::core::clone::Clone for CaptureBy {
    #[inline]
    fn clone(&self) -> CaptureBy {
        let _: ::core::clone::AssertParamIsClone<Span>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for CaptureBy { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for CaptureBy {
    #[inline]
    fn eq(&self, other: &CaptureBy) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (CaptureBy::Value { move_kw: __self_0 }, CaptureBy::Value {
                    move_kw: __arg1_0 }) => __self_0 == __arg1_0,
                (CaptureBy::Use { use_kw: __self_0 }, CaptureBy::Use {
                    use_kw: __arg1_0 }) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for CaptureBy {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        CaptureBy::Value { move_kw: ref __binding_0 } => { 0usize }
                        CaptureBy::Ref => { 1usize }
                        CaptureBy::Use { use_kw: ref __binding_0 } => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    CaptureBy::Value { move_kw: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    CaptureBy::Ref => {}
                    CaptureBy::Use { use_kw: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for CaptureBy {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        CaptureBy::Value {
                            move_kw: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    1usize => { CaptureBy::Ref }
                    2usize => {
                        CaptureBy::Use {
                            use_kw: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `CaptureBy`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for CaptureBy {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            CaptureBy::Value { move_kw: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Value",
                    "move_kw", &__self_0),
            CaptureBy::Ref => ::core::fmt::Formatter::write_str(f, "Ref"),
            CaptureBy::Use { use_kw: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Use",
                    "use_kw", &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for CaptureBy {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    CaptureBy::Value { move_kw: ref __binding_0 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    CaptureBy::Ref => {}
                    CaptureBy::Use { use_kw: ref __binding_0 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for CaptureBy
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    CaptureBy::Value { move_kw: ref __binding_0 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    CaptureBy::Ref => {}
                    CaptureBy::Use { use_kw: ref __binding_0 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for CaptureBy where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    CaptureBy::Value { move_kw: ref mut __binding_0 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    CaptureBy::Ref => {}
                    CaptureBy::Use { use_kw: ref mut __binding_0 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2002pub enum CaptureBy {
2003    /// `move |x| y + x`.
2004    Value {
2005        /// The span of the `move` keyword.
2006        move_kw: Span,
2007    },
2008    /// `move` or `use` keywords were not specified.
2009    Ref,
2010    /// `use |x| y + x`.
2011    ///
2012    /// Note that if you have a regular closure like `|| x.use`, this will *not* result
2013    /// in a `Use` capture. Instead, the `ExprUseVisitor` will look at the type
2014    /// of `x` and treat `x.use` as either a copy/clone/move as appropriate.
2015    Use {
2016        /// The span of the `use` keyword.
2017        use_kw: Span,
2018    },
2019}
2020
2021/// Closure lifetime binder, `for<'a, 'b>` in `for<'a, 'b> |_: &'a (), _: &'b ()|`.
2022#[derive(#[automatically_derived]
impl ::core::clone::Clone for ClosureBinder {
    #[inline]
    fn clone(&self) -> ClosureBinder {
        match self {
            ClosureBinder::NotPresent => ClosureBinder::NotPresent,
            ClosureBinder::For { span: __self_0, generic_params: __self_1 } =>
                ClosureBinder::For {
                    span: ::core::clone::Clone::clone(__self_0),
                    generic_params: ::core::clone::Clone::clone(__self_1),
                },
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ClosureBinder {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        ClosureBinder::NotPresent => { 0usize }
                        ClosureBinder::For {
                            span: ref __binding_0, generic_params: ref __binding_1 } =>
                            {
                            1usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    ClosureBinder::NotPresent => {}
                    ClosureBinder::For {
                        span: ref __binding_0, generic_params: ref __binding_1 } =>
                        {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ClosureBinder {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { ClosureBinder::NotPresent }
                    1usize => {
                        ClosureBinder::For {
                            span: ::rustc_serialize::Decodable::decode(__decoder),
                            generic_params: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `ClosureBinder`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ClosureBinder {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            ClosureBinder::NotPresent =>
                ::core::fmt::Formatter::write_str(f, "NotPresent"),
            ClosureBinder::For { span: __self_0, generic_params: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f, "For",
                    "span", __self_0, "generic_params", &__self_1),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            ClosureBinder where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    ClosureBinder::NotPresent => {}
                    ClosureBinder::For {
                        span: ref __binding_0, generic_params: ref __binding_1 } =>
                        {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for ClosureBinder where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    ClosureBinder::NotPresent => {}
                    ClosureBinder::For {
                        span: ref mut __binding_0,
                        generic_params: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2023pub enum ClosureBinder {
2024    /// The binder is not present, all closure lifetimes are inferred.
2025    NotPresent,
2026    /// The binder is present.
2027    For {
2028        /// Span of the whole `for<>` clause
2029        ///
2030        /// ```text
2031        /// for<'a, 'b> |_: &'a (), _: &'b ()| { ... }
2032        /// ^^^^^^^^^^^ -- this
2033        /// ```
2034        span: Span,
2035
2036        /// Lifetimes in the `for<>` closure
2037        ///
2038        /// ```text
2039        /// for<'a, 'b> |_: &'a (), _: &'b ()| { ... }
2040        ///     ^^^^^^ -- this
2041        /// ```
2042        generic_params: ThinVec<GenericParam>,
2043    },
2044}
2045
2046/// Represents a macro invocation. The `path` indicates which macro
2047/// is being invoked, and the `args` are arguments passed to it.
2048#[derive(#[automatically_derived]
impl ::core::clone::Clone for MacCall {
    #[inline]
    fn clone(&self) -> MacCall {
        MacCall {
            path: ::core::clone::Clone::clone(&self.path),
            args: ::core::clone::Clone::clone(&self.args),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for MacCall {
            fn encode(&self, __encoder: &mut __E) {
                let MacCall { path: ref __binding_0, args: ref __binding_1 } =
                    *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for MacCall {
            fn decode(__decoder: &mut __D) -> Self {
                MacCall {
                    path: ::rustc_serialize::Decodable::decode(__decoder),
                    args: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for MacCall {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "MacCall",
            "path", &self.path, "args", &&self.args)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for MacCall
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    MacCall { path: ref __binding_0, args: ref __binding_1 } =>
                        {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for MacCall where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    MacCall {
                        path: ref mut __binding_0, args: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2049pub struct MacCall {
2050    pub path: Path,
2051    pub args: Box<DelimArgs>,
2052}
2053
2054impl MacCall {
2055    pub fn span(&self) -> Span {
2056        self.path.span.to(self.args.dspan.entire())
2057    }
2058}
2059
2060/// Arguments passed to an attribute macro.
2061#[derive(#[automatically_derived]
impl ::core::clone::Clone for AttrArgs {
    #[inline]
    fn clone(&self) -> AttrArgs {
        match self {
            AttrArgs::Empty => AttrArgs::Empty,
            AttrArgs::Delimited(__self_0) =>
                AttrArgs::Delimited(::core::clone::Clone::clone(__self_0)),
            AttrArgs::Eq { eq_span: __self_0, expr: __self_1 } =>
                AttrArgs::Eq {
                    eq_span: ::core::clone::Clone::clone(__self_0),
                    expr: ::core::clone::Clone::clone(__self_1),
                },
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for AttrArgs {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        AttrArgs::Empty => { 0usize }
                        AttrArgs::Delimited(ref __binding_0) => { 1usize }
                        AttrArgs::Eq {
                            eq_span: ref __binding_0, expr: ref __binding_1 } => {
                            2usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    AttrArgs::Empty => {}
                    AttrArgs::Delimited(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AttrArgs::Eq {
                        eq_span: ref __binding_0, expr: ref __binding_1 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for AttrArgs {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { AttrArgs::Empty }
                    1usize => {
                        AttrArgs::Delimited(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        AttrArgs::Eq {
                            eq_span: ::rustc_serialize::Decodable::decode(__decoder),
                            expr: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `AttrArgs`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for AttrArgs {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            AttrArgs::Empty => ::core::fmt::Formatter::write_str(f, "Empty"),
            AttrArgs::Delimited(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Delimited", &__self_0),
            AttrArgs::Eq { eq_span: __self_0, expr: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f, "Eq",
                    "eq_span", __self_0, "expr", &__self_1),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for AttrArgs
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    AttrArgs::Empty => {}
                    AttrArgs::Delimited(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    AttrArgs::Eq {
                        eq_span: ref __binding_0, expr: ref __binding_1 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for AttrArgs where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    AttrArgs::Empty => {}
                    AttrArgs::Delimited(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    AttrArgs::Eq {
                        eq_span: ref mut __binding_0, expr: ref mut __binding_1 } =>
                        {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2062pub enum AttrArgs {
2063    /// No arguments: `#[attr]`.
2064    Empty,
2065    /// Delimited arguments: `#[attr()/[]/{}]`.
2066    Delimited(DelimArgs),
2067    /// Arguments of a key-value attribute: `#[attr = "value"]`.
2068    Eq {
2069        /// Span of the `=` token.
2070        eq_span: Span,
2071        expr: Box<Expr>,
2072    },
2073}
2074
2075impl AttrArgs {
2076    pub fn span(&self) -> Option<Span> {
2077        match self {
2078            AttrArgs::Empty => None,
2079            AttrArgs::Delimited(args) => Some(args.dspan.entire()),
2080            AttrArgs::Eq { eq_span, expr } => Some(eq_span.to(expr.span)),
2081        }
2082    }
2083
2084    /// Tokens inside the delimiters or after `=`.
2085    /// Proc macros see these tokens, for example.
2086    pub fn inner_tokens(&self) -> TokenStream {
2087        match self {
2088            AttrArgs::Empty => TokenStream::default(),
2089            AttrArgs::Delimited(args) => args.tokens.clone(),
2090            AttrArgs::Eq { expr, .. } => TokenStream::from_ast(expr),
2091        }
2092    }
2093}
2094
2095/// Delimited arguments, as used in `#[attr()/[]/{}]` or `mac!()/[]/{}`.
2096#[derive(#[automatically_derived]
impl ::core::clone::Clone for DelimArgs {
    #[inline]
    fn clone(&self) -> DelimArgs {
        DelimArgs {
            dspan: ::core::clone::Clone::clone(&self.dspan),
            delim: ::core::clone::Clone::clone(&self.delim),
            tokens: ::core::clone::Clone::clone(&self.tokens),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for DelimArgs {
            fn encode(&self, __encoder: &mut __E) {
                let DelimArgs {
                        dspan: ref __binding_0,
                        delim: ref __binding_1,
                        tokens: ref __binding_2 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for DelimArgs {
            fn decode(__decoder: &mut __D) -> Self {
                DelimArgs {
                    dspan: ::rustc_serialize::Decodable::decode(__decoder),
                    delim: ::rustc_serialize::Decodable::decode(__decoder),
                    tokens: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for DelimArgs {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "DelimArgs",
            "dspan", &self.dspan, "delim", &self.delim, "tokens",
            &&self.tokens)
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for DelimArgs {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    DelimArgs {
                        dspan: ref __binding_0,
                        delim: ref __binding_1,
                        tokens: ref __binding_2 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for DelimArgs
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    DelimArgs {
                        dspan: ref __binding_0,
                        delim: ref __binding_1,
                        tokens: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for DelimArgs where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    DelimArgs {
                        dspan: ref mut __binding_0,
                        delim: ref mut __binding_1,
                        tokens: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2097pub struct DelimArgs {
2098    pub dspan: DelimSpan,
2099    pub delim: Delimiter, // Note: `Delimiter::Invisible` never occurs
2100    pub tokens: TokenStream,
2101}
2102
2103impl DelimArgs {
2104    /// Whether a macro with these arguments needs a semicolon
2105    /// when used as a standalone item or statement.
2106    pub fn need_semicolon(&self) -> bool {
2107        !#[allow(non_exhaustive_omitted_patterns)] match self {
    DelimArgs { delim: Delimiter::Brace, .. } => true,
    _ => false,
}matches!(self, DelimArgs { delim: Delimiter::Brace, .. })
2108    }
2109}
2110
2111/// Represents a macro definition.
2112#[derive(#[automatically_derived]
impl ::core::clone::Clone for MacroDef {
    #[inline]
    fn clone(&self) -> MacroDef {
        MacroDef {
            body: ::core::clone::Clone::clone(&self.body),
            macro_rules: ::core::clone::Clone::clone(&self.macro_rules),
            eii_declaration: ::core::clone::Clone::clone(&self.eii_declaration),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for MacroDef {
            fn encode(&self, __encoder: &mut __E) {
                let MacroDef {
                        body: ref __binding_0,
                        macro_rules: ref __binding_1,
                        eii_declaration: ref __binding_2 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for MacroDef {
            fn decode(__decoder: &mut __D) -> Self {
                MacroDef {
                    body: ::rustc_serialize::Decodable::decode(__decoder),
                    macro_rules: ::rustc_serialize::Decodable::decode(__decoder),
                    eii_declaration: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for MacroDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "MacroDef",
            "body", &self.body, "macro_rules", &self.macro_rules,
            "eii_declaration", &&self.eii_declaration)
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for MacroDef {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    MacroDef {
                        body: ref __binding_0,
                        macro_rules: ref __binding_1,
                        eii_declaration: ref __binding_2 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for MacroDef
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    MacroDef {
                        body: ref __binding_0,
                        macro_rules: ref __binding_1,
                        eii_declaration: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for MacroDef where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    MacroDef {
                        body: ref mut __binding_0,
                        macro_rules: ref mut __binding_1,
                        eii_declaration: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2113pub struct MacroDef {
2114    pub body: Box<DelimArgs>,
2115    /// `true` if macro was defined with `macro_rules`.
2116    pub macro_rules: bool,
2117
2118    /// Corresponds to `#[eii_declaration(...)]`.
2119    /// `#[eii_declaration(...)]` is a built-in attribute macro, not a built-in attribute,
2120    /// because we require some name resolution to occur in the parameters of this attribute.
2121    /// Name resolution isn't possible in attributes otherwise, so we encode it in the AST.
2122    /// During ast lowering, we turn it back into an attribute again
2123    pub eii_declaration: Option<EiiDecl>,
2124}
2125
2126#[derive(#[automatically_derived]
impl ::core::clone::Clone for EiiDecl {
    #[inline]
    fn clone(&self) -> EiiDecl {
        EiiDecl {
            foreign_item: ::core::clone::Clone::clone(&self.foreign_item),
            impl_unsafe: ::core::clone::Clone::clone(&self.impl_unsafe),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for EiiDecl {
            fn encode(&self, __encoder: &mut __E) {
                let EiiDecl {
                        foreign_item: ref __binding_0, impl_unsafe: ref __binding_1
                        } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for EiiDecl {
            fn decode(__decoder: &mut __D) -> Self {
                EiiDecl {
                    foreign_item: ::rustc_serialize::Decodable::decode(__decoder),
                    impl_unsafe: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for EiiDecl {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "EiiDecl",
            "foreign_item", &self.foreign_item, "impl_unsafe",
            &&self.impl_unsafe)
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for EiiDecl {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    EiiDecl {
                        foreign_item: ref __binding_0, impl_unsafe: ref __binding_1
                        } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for EiiDecl
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    EiiDecl {
                        foreign_item: ref __binding_0, impl_unsafe: ref __binding_1
                        } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for EiiDecl where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    EiiDecl {
                        foreign_item: ref mut __binding_0,
                        impl_unsafe: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2127pub struct EiiDecl {
2128    /// path to the extern item we're targeting
2129    pub foreign_item: Path,
2130    pub impl_unsafe: bool,
2131}
2132
2133#[derive(#[automatically_derived]
impl ::core::clone::Clone for StrStyle {
    #[inline]
    fn clone(&self) -> StrStyle {
        let _: ::core::clone::AssertParamIsClone<u8>;
        *self
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for StrStyle {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        StrStyle::Cooked => { 0usize }
                        StrStyle::Raw(ref __binding_0) => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    StrStyle::Cooked => {}
                    StrStyle::Raw(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for StrStyle {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { StrStyle::Cooked }
                    1usize => {
                        StrStyle::Raw(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `StrStyle`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for StrStyle {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            StrStyle::Cooked =>
                ::core::fmt::Formatter::write_str(f, "Cooked"),
            StrStyle::Raw(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Raw",
                    &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::marker::Copy for StrStyle { }Copy, #[automatically_derived]
impl ::core::hash::Hash for StrStyle {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            StrStyle::Raw(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            _ => {}
        }
    }
}Hash, #[automatically_derived]
impl ::core::cmp::Eq for StrStyle {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<u8>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for StrStyle {
    #[inline]
    fn eq(&self, other: &StrStyle) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (StrStyle::Raw(__self_0), StrStyle::Raw(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq)]
2134#[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)]
2135pub enum StrStyle {
2136    /// A regular string, like `"foo"`.
2137    Cooked,
2138    /// A raw string, like `r##"foo"##`.
2139    ///
2140    /// The value is the number of `#` symbols used.
2141    Raw(u8),
2142}
2143
2144/// The kind of match expression
2145#[derive(#[automatically_derived]
impl ::core::clone::Clone for MatchKind {
    #[inline]
    fn clone(&self) -> MatchKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for MatchKind { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for MatchKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        MatchKind::Prefix => { 0usize }
                        MatchKind::Postfix => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for MatchKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { MatchKind::Prefix }
                    1usize => { MatchKind::Postfix }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `MatchKind`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for MatchKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                MatchKind::Prefix => "Prefix",
                MatchKind::Postfix => "Postfix",
            })
    }
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for MatchKind {
    #[inline]
    fn eq(&self, other: &MatchKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for MatchKind
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    MatchKind::Prefix => {}
                    MatchKind::Postfix => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for MatchKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    MatchKind::Prefix => {}
                    MatchKind::Postfix => {}
                }
            }
        }
    };Walkable)]
2146pub enum MatchKind {
2147    /// match expr { ... }
2148    Prefix,
2149    /// expr.match { ... }
2150    Postfix,
2151}
2152
2153/// The kind of yield expression
2154#[derive(#[automatically_derived]
impl ::core::clone::Clone for YieldKind {
    #[inline]
    fn clone(&self) -> YieldKind {
        match self {
            YieldKind::Prefix(__self_0) =>
                YieldKind::Prefix(::core::clone::Clone::clone(__self_0)),
            YieldKind::Postfix(__self_0) =>
                YieldKind::Postfix(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for YieldKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        YieldKind::Prefix(ref __binding_0) => { 0usize }
                        YieldKind::Postfix(ref __binding_0) => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    YieldKind::Prefix(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    YieldKind::Postfix(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for YieldKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        YieldKind::Prefix(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        YieldKind::Postfix(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `YieldKind`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for YieldKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            YieldKind::Prefix(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Prefix",
                    &__self_0),
            YieldKind::Postfix(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Postfix", &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for YieldKind
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    YieldKind::Prefix(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    YieldKind::Postfix(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for YieldKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    YieldKind::Prefix(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    YieldKind::Postfix(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2155pub enum YieldKind {
2156    /// yield expr { ... }
2157    Prefix(Option<Box<Expr>>),
2158    /// expr.yield { ... }
2159    Postfix(Box<Expr>),
2160}
2161
2162impl YieldKind {
2163    /// Returns the expression inside the yield expression, if any.
2164    ///
2165    /// For postfix yields, this is guaranteed to be `Some`.
2166    pub const fn expr(&self) -> Option<&Box<Expr>> {
2167        match self {
2168            YieldKind::Prefix(expr) => expr.as_ref(),
2169            YieldKind::Postfix(expr) => Some(expr),
2170        }
2171    }
2172
2173    /// Returns a mutable reference to the expression being yielded, if any.
2174    pub const fn expr_mut(&mut self) -> Option<&mut Box<Expr>> {
2175        match self {
2176            YieldKind::Prefix(expr) => expr.as_mut(),
2177            YieldKind::Postfix(expr) => Some(expr),
2178        }
2179    }
2180
2181    /// Returns true if both yields are prefix or both are postfix.
2182    pub const fn same_kind(&self, other: &Self) -> bool {
2183        match (self, other) {
2184            (YieldKind::Prefix(_), YieldKind::Prefix(_)) => true,
2185            (YieldKind::Postfix(_), YieldKind::Postfix(_)) => true,
2186            _ => false,
2187        }
2188    }
2189}
2190
2191/// A literal in a meta item.
2192#[derive(#[automatically_derived]
impl ::core::clone::Clone for MetaItemLit {
    #[inline]
    fn clone(&self) -> MetaItemLit {
        let _: ::core::clone::AssertParamIsClone<Symbol>;
        let _: ::core::clone::AssertParamIsClone<Option<Symbol>>;
        let _: ::core::clone::AssertParamIsClone<LitKind>;
        let _: ::core::clone::AssertParamIsClone<Span>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for MetaItemLit { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for MetaItemLit {
            fn encode(&self, __encoder: &mut __E) {
                let MetaItemLit {
                        symbol: ref __binding_0,
                        suffix: ref __binding_1,
                        kind: ref __binding_2,
                        span: ref __binding_3 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for MetaItemLit {
            fn decode(__decoder: &mut __D) -> Self {
                MetaItemLit {
                    symbol: ::rustc_serialize::Decodable::decode(__decoder),
                    suffix: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for MetaItemLit {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "MetaItemLit",
            "symbol", &self.symbol, "suffix", &self.suffix, "kind",
            &self.kind, "span", &&self.span)
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for MetaItemLit
            {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    MetaItemLit {
                        symbol: ref __binding_0,
                        suffix: ref __binding_1,
                        kind: ref __binding_2,
                        span: ref __binding_3 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                        { __binding_3.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
2193pub struct MetaItemLit {
2194    /// The original literal as written in the source code.
2195    pub symbol: Symbol,
2196    /// The original suffix as written in the source code.
2197    pub suffix: Option<Symbol>,
2198    /// The "semantic" representation of the literal lowered from the original tokens.
2199    /// Strings are unescaped, hexadecimal forms are eliminated, etc.
2200    pub kind: LitKind,
2201    pub span: Span,
2202}
2203
2204/// Similar to `MetaItemLit`, but restricted to string literals.
2205#[derive(#[automatically_derived]
impl ::core::clone::Clone for StrLit {
    #[inline]
    fn clone(&self) -> StrLit {
        let _: ::core::clone::AssertParamIsClone<Symbol>;
        let _: ::core::clone::AssertParamIsClone<Option<Symbol>>;
        let _: ::core::clone::AssertParamIsClone<StrStyle>;
        let _: ::core::clone::AssertParamIsClone<Span>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for StrLit { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for StrLit {
            fn encode(&self, __encoder: &mut __E) {
                let StrLit {
                        symbol: ref __binding_0,
                        suffix: ref __binding_1,
                        symbol_unescaped: ref __binding_2,
                        style: ref __binding_3,
                        span: ref __binding_4 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for StrLit {
            fn decode(__decoder: &mut __D) -> Self {
                StrLit {
                    symbol: ::rustc_serialize::Decodable::decode(__decoder),
                    suffix: ::rustc_serialize::Decodable::decode(__decoder),
                    symbol_unescaped: ::rustc_serialize::Decodable::decode(__decoder),
                    style: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for StrLit {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f, "StrLit",
            "symbol", &self.symbol, "suffix", &self.suffix,
            "symbol_unescaped", &self.symbol_unescaped, "style", &self.style,
            "span", &&self.span)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for StrLit where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    StrLit {
                        symbol: ref __binding_0,
                        suffix: ref __binding_1,
                        symbol_unescaped: ref __binding_2,
                        style: ref __binding_3,
                        span: ref __binding_4 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for StrLit where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    StrLit {
                        symbol: ref mut __binding_0,
                        suffix: ref mut __binding_1,
                        symbol_unescaped: ref mut __binding_2,
                        style: ref mut __binding_3,
                        span: ref mut __binding_4 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2206pub struct StrLit {
2207    /// The original literal as written in source code.
2208    pub symbol: Symbol,
2209    /// The original suffix as written in source code.
2210    pub suffix: Option<Symbol>,
2211    /// The semantic (unescaped) representation of the literal.
2212    pub symbol_unescaped: Symbol,
2213    pub style: StrStyle,
2214    pub span: Span,
2215}
2216
2217impl StrLit {
2218    pub fn as_token_lit(&self) -> token::Lit {
2219        let token_kind = match self.style {
2220            StrStyle::Cooked => token::Str,
2221            StrStyle::Raw(n) => token::StrRaw(n),
2222        };
2223        token::Lit::new(token_kind, self.symbol, self.suffix)
2224    }
2225}
2226
2227/// Type of the integer literal based on provided suffix.
2228#[derive(#[automatically_derived]
impl ::core::clone::Clone for LitIntType {
    #[inline]
    fn clone(&self) -> LitIntType {
        let _: ::core::clone::AssertParamIsClone<IntTy>;
        let _: ::core::clone::AssertParamIsClone<UintTy>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for LitIntType { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for LitIntType {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        LitIntType::Signed(ref __binding_0) => { 0usize }
                        LitIntType::Unsigned(ref __binding_0) => { 1usize }
                        LitIntType::Unsuffixed => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    LitIntType::Signed(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    LitIntType::Unsigned(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    LitIntType::Unsuffixed => {}
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for LitIntType {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        LitIntType::Signed(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        LitIntType::Unsigned(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => { LitIntType::Unsuffixed }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `LitIntType`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for LitIntType {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            LitIntType::Signed(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Signed",
                    &__self_0),
            LitIntType::Unsigned(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Unsigned", &__self_0),
            LitIntType::Unsuffixed =>
                ::core::fmt::Formatter::write_str(f, "Unsuffixed"),
        }
    }
}Debug, #[automatically_derived]
impl ::core::hash::Hash for LitIntType {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            LitIntType::Signed(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            LitIntType::Unsigned(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            _ => {}
        }
    }
}Hash, #[automatically_derived]
impl ::core::cmp::Eq for LitIntType {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<IntTy>;
        let _: ::core::cmp::AssertParamIsEq<UintTy>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for LitIntType {
    #[inline]
    fn eq(&self, other: &LitIntType) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (LitIntType::Signed(__self_0), LitIntType::Signed(__arg1_0))
                    => __self_0 == __arg1_0,
                (LitIntType::Unsigned(__self_0),
                    LitIntType::Unsigned(__arg1_0)) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq)]
2229#[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)]
2230pub enum LitIntType {
2231    /// e.g. `42_i32`.
2232    Signed(IntTy),
2233    /// e.g. `42_u32`.
2234    Unsigned(UintTy),
2235    /// e.g. `42`.
2236    Unsuffixed,
2237}
2238
2239/// Type of the float literal based on provided suffix.
2240#[derive(#[automatically_derived]
impl ::core::clone::Clone for LitFloatType {
    #[inline]
    fn clone(&self) -> LitFloatType {
        let _: ::core::clone::AssertParamIsClone<FloatTy>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for LitFloatType { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for LitFloatType {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        LitFloatType::Suffixed(ref __binding_0) => { 0usize }
                        LitFloatType::Unsuffixed => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    LitFloatType::Suffixed(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    LitFloatType::Unsuffixed => {}
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for LitFloatType {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        LitFloatType::Suffixed(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => { LitFloatType::Unsuffixed }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `LitFloatType`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for LitFloatType {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            LitFloatType::Suffixed(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Suffixed", &__self_0),
            LitFloatType::Unsuffixed =>
                ::core::fmt::Formatter::write_str(f, "Unsuffixed"),
        }
    }
}Debug, #[automatically_derived]
impl ::core::hash::Hash for LitFloatType {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            LitFloatType::Suffixed(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            _ => {}
        }
    }
}Hash, #[automatically_derived]
impl ::core::cmp::Eq for LitFloatType {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<FloatTy>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for LitFloatType {
    #[inline]
    fn eq(&self, other: &LitFloatType) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (LitFloatType::Suffixed(__self_0),
                    LitFloatType::Suffixed(__arg1_0)) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq)]
2241#[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)]
2242pub enum LitFloatType {
2243    /// A float literal with a suffix (`1f32` or `1E10f32`).
2244    Suffixed(FloatTy),
2245    /// A float literal without a suffix (`1.0 or 1.0E10`).
2246    Unsuffixed,
2247}
2248
2249/// This type is used within both `ast::MetaItemLit` and `hir::Lit`.
2250///
2251/// Note that the entire literal (including the suffix) is considered when
2252/// deciding the `LitKind`. This means that float literals like `1f32` are
2253/// classified by this type as `Float`. This is different to `token::LitKind`
2254/// which does *not* consider the suffix.
2255#[derive(#[automatically_derived]
impl ::core::clone::Clone for LitKind {
    #[inline]
    fn clone(&self) -> LitKind {
        let _: ::core::clone::AssertParamIsClone<Symbol>;
        let _: ::core::clone::AssertParamIsClone<StrStyle>;
        let _: ::core::clone::AssertParamIsClone<ByteSymbol>;
        let _: ::core::clone::AssertParamIsClone<u8>;
        let _: ::core::clone::AssertParamIsClone<char>;
        let _: ::core::clone::AssertParamIsClone<Pu128>;
        let _: ::core::clone::AssertParamIsClone<LitIntType>;
        let _: ::core::clone::AssertParamIsClone<LitFloatType>;
        let _: ::core::clone::AssertParamIsClone<bool>;
        let _: ::core::clone::AssertParamIsClone<ErrorGuaranteed>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for LitKind { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for LitKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        LitKind::Str(ref __binding_0, ref __binding_1) => { 0usize }
                        LitKind::ByteStr(ref __binding_0, ref __binding_1) => {
                            1usize
                        }
                        LitKind::CStr(ref __binding_0, ref __binding_1) => {
                            2usize
                        }
                        LitKind::Byte(ref __binding_0) => { 3usize }
                        LitKind::Char(ref __binding_0) => { 4usize }
                        LitKind::Int(ref __binding_0, ref __binding_1) => { 5usize }
                        LitKind::Float(ref __binding_0, ref __binding_1) => {
                            6usize
                        }
                        LitKind::Bool(ref __binding_0) => { 7usize }
                        LitKind::Err(ref __binding_0) => { 8usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    LitKind::Str(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    LitKind::ByteStr(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    LitKind::CStr(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    LitKind::Byte(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    LitKind::Char(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    LitKind::Int(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    LitKind::Float(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    LitKind::Bool(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    LitKind::Err(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for LitKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        LitKind::Str(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        LitKind::ByteStr(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        LitKind::CStr(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => {
                        LitKind::Byte(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    4usize => {
                        LitKind::Char(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    5usize => {
                        LitKind::Int(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    6usize => {
                        LitKind::Float(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    7usize => {
                        LitKind::Bool(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    8usize => {
                        LitKind::Err(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `LitKind`, expected 0..9, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for LitKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            LitKind::Str(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Str",
                    __self_0, &__self_1),
            LitKind::ByteStr(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "ByteStr", __self_0, &__self_1),
            LitKind::CStr(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "CStr",
                    __self_0, &__self_1),
            LitKind::Byte(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Byte",
                    &__self_0),
            LitKind::Char(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Char",
                    &__self_0),
            LitKind::Int(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Int",
                    __self_0, &__self_1),
            LitKind::Float(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Float",
                    __self_0, &__self_1),
            LitKind::Bool(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Bool",
                    &__self_0),
            LitKind::Err(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Err",
                    &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::hash::Hash for LitKind {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            LitKind::Str(__self_0, __self_1) => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            LitKind::ByteStr(__self_0, __self_1) => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            LitKind::CStr(__self_0, __self_1) => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            LitKind::Byte(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            LitKind::Char(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            LitKind::Int(__self_0, __self_1) => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            LitKind::Float(__self_0, __self_1) => {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state)
            }
            LitKind::Bool(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            LitKind::Err(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
        }
    }
}Hash, #[automatically_derived]
impl ::core::cmp::Eq for LitKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Symbol>;
        let _: ::core::cmp::AssertParamIsEq<StrStyle>;
        let _: ::core::cmp::AssertParamIsEq<ByteSymbol>;
        let _: ::core::cmp::AssertParamIsEq<u8>;
        let _: ::core::cmp::AssertParamIsEq<char>;
        let _: ::core::cmp::AssertParamIsEq<Pu128>;
        let _: ::core::cmp::AssertParamIsEq<LitIntType>;
        let _: ::core::cmp::AssertParamIsEq<LitFloatType>;
        let _: ::core::cmp::AssertParamIsEq<bool>;
        let _: ::core::cmp::AssertParamIsEq<ErrorGuaranteed>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for LitKind {
    #[inline]
    fn eq(&self, other: &LitKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (LitKind::Str(__self_0, __self_1),
                    LitKind::Str(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (LitKind::ByteStr(__self_0, __self_1),
                    LitKind::ByteStr(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (LitKind::CStr(__self_0, __self_1),
                    LitKind::CStr(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (LitKind::Byte(__self_0), LitKind::Byte(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (LitKind::Char(__self_0), LitKind::Char(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (LitKind::Int(__self_0, __self_1),
                    LitKind::Int(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (LitKind::Float(__self_0, __self_1),
                    LitKind::Float(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (LitKind::Bool(__self_0), LitKind::Bool(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (LitKind::Err(__self_0), LitKind::Err(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for LitKind {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    LitKind::Str(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    LitKind::ByteStr(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    LitKind::CStr(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    LitKind::Byte(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    LitKind::Char(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    LitKind::Int(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    LitKind::Float(ref __binding_0, ref __binding_1) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                    LitKind::Bool(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    LitKind::Err(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
2256pub enum LitKind {
2257    /// A string literal (`"foo"`). The symbol is unescaped, and so may differ
2258    /// from the original token's symbol.
2259    Str(Symbol, StrStyle),
2260    /// A byte string (`b"foo"`). The symbol is unescaped, and so may differ
2261    /// from the original token's symbol.
2262    ByteStr(ByteSymbol, StrStyle),
2263    /// A C String (`c"foo"`). Guaranteed to only have `\0` at the end. The
2264    /// symbol is unescaped, and so may differ from the original token's
2265    /// symbol.
2266    CStr(ByteSymbol, StrStyle),
2267    /// A byte char (`b'f'`).
2268    Byte(u8),
2269    /// A character literal (`'a'`).
2270    Char(char),
2271    /// An integer literal (`1`).
2272    Int(Pu128, LitIntType),
2273    /// A float literal (`1.0`, `1f64` or `1E10f64`). The pre-suffix part is
2274    /// stored as a symbol rather than `f64` so that `LitKind` can impl `Eq`
2275    /// and `Hash`.
2276    Float(Symbol, LitFloatType),
2277    /// A boolean literal (`true`, `false`).
2278    Bool(bool),
2279    /// Placeholder for a literal that wasn't well-formed in some way.
2280    Err(ErrorGuaranteed),
2281}
2282
2283impl LitKind {
2284    pub fn str(&self) -> Option<Symbol> {
2285        match *self {
2286            LitKind::Str(s, _) => Some(s),
2287            _ => None,
2288        }
2289    }
2290
2291    /// Returns `true` if this literal is a string.
2292    pub fn is_str(&self) -> bool {
2293        #[allow(non_exhaustive_omitted_patterns)] match self {
    LitKind::Str(..) => true,
    _ => false,
}matches!(self, LitKind::Str(..))
2294    }
2295
2296    /// Returns `true` if this literal is byte literal string.
2297    pub fn is_bytestr(&self) -> bool {
2298        #[allow(non_exhaustive_omitted_patterns)] match self {
    LitKind::ByteStr(..) => true,
    _ => false,
}matches!(self, LitKind::ByteStr(..))
2299    }
2300
2301    /// Returns `true` if this is a numeric literal.
2302    pub fn is_numeric(&self) -> bool {
2303        #[allow(non_exhaustive_omitted_patterns)] match self {
    LitKind::Int(..) | LitKind::Float(..) => true,
    _ => false,
}matches!(self, LitKind::Int(..) | LitKind::Float(..))
2304    }
2305
2306    /// Returns `true` if this literal has no suffix.
2307    /// Note: this will return true for literals with prefixes such as raw strings and byte strings.
2308    pub fn is_unsuffixed(&self) -> bool {
2309        !self.is_suffixed()
2310    }
2311
2312    /// Returns `true` if this literal has a suffix.
2313    pub fn is_suffixed(&self) -> bool {
2314        match *self {
2315            // suffixed variants
2316            LitKind::Int(_, LitIntType::Signed(..) | LitIntType::Unsigned(..))
2317            | LitKind::Float(_, LitFloatType::Suffixed(..)) => true,
2318            // unsuffixed variants
2319            LitKind::Str(..)
2320            | LitKind::ByteStr(..)
2321            | LitKind::CStr(..)
2322            | LitKind::Byte(..)
2323            | LitKind::Char(..)
2324            | LitKind::Int(_, LitIntType::Unsuffixed)
2325            | LitKind::Float(_, LitFloatType::Unsuffixed)
2326            | LitKind::Bool(..)
2327            | LitKind::Err(_) => false,
2328        }
2329    }
2330}
2331
2332// N.B., If you change this, you'll probably want to change the corresponding
2333// type structure in `middle/ty.rs` as well.
2334#[derive(#[automatically_derived]
impl ::core::clone::Clone for MutTy {
    #[inline]
    fn clone(&self) -> MutTy {
        MutTy {
            ty: ::core::clone::Clone::clone(&self.ty),
            mutbl: ::core::clone::Clone::clone(&self.mutbl),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for MutTy {
            fn encode(&self, __encoder: &mut __E) {
                let MutTy { ty: ref __binding_0, mutbl: ref __binding_1 } =
                    *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for MutTy {
            fn decode(__decoder: &mut __D) -> Self {
                MutTy {
                    ty: ::rustc_serialize::Decodable::decode(__decoder),
                    mutbl: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for MutTy {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "MutTy", "ty",
            &self.ty, "mutbl", &&self.mutbl)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for MutTy where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    MutTy { ty: ref __binding_0, mutbl: ref __binding_1 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for MutTy where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    MutTy { ty: ref mut __binding_0, mutbl: ref mut __binding_1
                        } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2335pub struct MutTy {
2336    pub ty: Box<Ty>,
2337    pub mutbl: Mutability,
2338}
2339
2340/// Represents a function's signature in a trait declaration,
2341/// trait implementation, or free function.
2342#[derive(#[automatically_derived]
impl ::core::clone::Clone for FnSig {
    #[inline]
    fn clone(&self) -> FnSig {
        FnSig {
            header: ::core::clone::Clone::clone(&self.header),
            decl: ::core::clone::Clone::clone(&self.decl),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for FnSig {
            fn encode(&self, __encoder: &mut __E) {
                let FnSig {
                        header: ref __binding_0,
                        decl: ref __binding_1,
                        span: ref __binding_2 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for FnSig {
            fn decode(__decoder: &mut __D) -> Self {
                FnSig {
                    header: ::rustc_serialize::Decodable::decode(__decoder),
                    decl: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for FnSig {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "FnSig",
            "header", &self.header, "decl", &self.decl, "span", &&self.span)
    }
}Debug)]
2343pub struct FnSig {
2344    pub header: FnHeader,
2345    pub decl: Box<FnDecl>,
2346    pub span: Span,
2347}
2348
2349impl FnSig {
2350    /// Return a span encompassing the header, or where to insert it if empty.
2351    pub fn header_span(&self) -> Span {
2352        self.header.span().unwrap_or(self.span.shrink_to_lo())
2353    }
2354
2355    /// The span of the header's safety, or where to insert it if empty.
2356    pub fn safety_span(&self) -> Span {
2357        match self.header.safety {
2358            Safety::Unsafe(span) | Safety::Safe(span) => span,
2359            Safety::Default => {
2360                // Insert after the `coroutine_marker` if available.
2361                if let Some(extern_span) = self.header.ext.span() {
2362                    return extern_span.shrink_to_lo();
2363                }
2364
2365                // Insert right at the front of the signature.
2366                self.header_span().shrink_to_hi()
2367            }
2368        }
2369    }
2370
2371    /// The span of the header's extern, or where to insert it if empty.
2372    pub fn extern_span(&self) -> Span {
2373        self.header.ext.span().unwrap_or(self.safety_span().shrink_to_hi())
2374    }
2375
2376    pub fn as_borrowed(&self) -> BorrowedFnSig<'_> {
2377        BorrowedFnSig { header: self.header, decl: &self.decl, span: self.span }
2378    }
2379}
2380
2381/// A borrowed version of `FnSig`, used to share logic between function declarations and function
2382/// pointer types.
2383#[derive(#[automatically_derived]
impl<'a> ::core::clone::Clone for BorrowedFnSig<'a> {
    #[inline]
    fn clone(&self) -> BorrowedFnSig<'a> {
        BorrowedFnSig {
            header: ::core::clone::Clone::clone(&self.header),
            decl: ::core::clone::Clone::clone(&self.decl),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, #[automatically_derived]
impl<'a> ::core::fmt::Debug for BorrowedFnSig<'a> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "BorrowedFnSig",
            "header", &self.header, "decl", &self.decl, "span", &&self.span)
    }
}Debug)]
2384pub struct BorrowedFnSig<'a> {
2385    pub header: FnHeader,
2386    pub decl: &'a FnDecl,
2387    pub span: Span,
2388}
2389
2390/// A constraint on an associated item.
2391///
2392/// ### Examples
2393///
2394/// * the `A = Ty` and `B = Ty` in `Trait<A = Ty, B = Ty>`
2395/// * the `G<Ty> = Ty` in `Trait<G<Ty> = Ty>`
2396/// * the `A: Bound` in `Trait<A: Bound>`
2397/// * the `RetTy` in `Trait(ArgTy, ArgTy) -> RetTy`
2398/// * the `C = { Ct }` in `Trait<C = { Ct }>` (feature `min_generic_const_args`)
2399/// * the `f(..): Bound` in `Trait<f(..): Bound>` (feature `return_type_notation`)
2400#[derive(#[automatically_derived]
impl ::core::clone::Clone for AssocItemConstraint {
    #[inline]
    fn clone(&self) -> AssocItemConstraint {
        AssocItemConstraint {
            id: ::core::clone::Clone::clone(&self.id),
            ident: ::core::clone::Clone::clone(&self.ident),
            gen_args: ::core::clone::Clone::clone(&self.gen_args),
            kind: ::core::clone::Clone::clone(&self.kind),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for AssocItemConstraint {
            fn encode(&self, __encoder: &mut __E) {
                let AssocItemConstraint {
                        id: ref __binding_0,
                        ident: ref __binding_1,
                        gen_args: ref __binding_2,
                        kind: ref __binding_3,
                        span: ref __binding_4 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for AssocItemConstraint {
            fn decode(__decoder: &mut __D) -> Self {
                AssocItemConstraint {
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    ident: ::rustc_serialize::Decodable::decode(__decoder),
                    gen_args: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for AssocItemConstraint {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f,
            "AssocItemConstraint", "id", &self.id, "ident", &self.ident,
            "gen_args", &self.gen_args, "kind", &self.kind, "span",
            &&self.span)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            AssocItemConstraint where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    AssocItemConstraint {
                        id: ref __binding_0,
                        ident: ref __binding_1,
                        gen_args: ref __binding_2,
                        kind: ref __binding_3,
                        span: ref __binding_4 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for AssocItemConstraint
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    AssocItemConstraint {
                        id: ref mut __binding_0,
                        ident: ref mut __binding_1,
                        gen_args: ref mut __binding_2,
                        kind: ref mut __binding_3,
                        span: ref mut __binding_4 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2401pub struct AssocItemConstraint {
2402    pub id: NodeId,
2403    pub ident: Ident,
2404    pub gen_args: Option<GenericArgs>,
2405    pub kind: AssocItemConstraintKind,
2406    pub span: Span,
2407}
2408
2409#[derive(#[automatically_derived]
impl ::core::clone::Clone for Term {
    #[inline]
    fn clone(&self) -> Term {
        match self {
            Term::Ty(__self_0) =>
                Term::Ty(::core::clone::Clone::clone(__self_0)),
            Term::Const(__self_0) =>
                Term::Const(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Term {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        Term::Ty(ref __binding_0) => { 0usize }
                        Term::Const(ref __binding_0) => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    Term::Ty(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    Term::Const(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Term {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        Term::Ty(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        Term::Const(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Term`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Term {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Term::Ty(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Ty",
                    &__self_0),
            Term::Const(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Const",
                    &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Term where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Term::Ty(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    Term::Const(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Term where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Term::Ty(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    Term::Const(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2410pub enum Term {
2411    Ty(Box<Ty>),
2412    Const(AnonConst),
2413}
2414
2415impl From<Box<Ty>> for Term {
2416    fn from(v: Box<Ty>) -> Self {
2417        Term::Ty(v)
2418    }
2419}
2420
2421impl From<AnonConst> for Term {
2422    fn from(v: AnonConst) -> Self {
2423        Term::Const(v)
2424    }
2425}
2426
2427/// The kind of [associated item constraint][AssocItemConstraint].
2428#[derive(#[automatically_derived]
impl ::core::clone::Clone for AssocItemConstraintKind {
    #[inline]
    fn clone(&self) -> AssocItemConstraintKind {
        match self {
            AssocItemConstraintKind::Equality { term: __self_0 } =>
                AssocItemConstraintKind::Equality {
                    term: ::core::clone::Clone::clone(__self_0),
                },
            AssocItemConstraintKind::Bound { bounds: __self_0 } =>
                AssocItemConstraintKind::Bound {
                    bounds: ::core::clone::Clone::clone(__self_0),
                },
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for AssocItemConstraintKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        AssocItemConstraintKind::Equality { term: ref __binding_0 }
                            => {
                            0usize
                        }
                        AssocItemConstraintKind::Bound { bounds: ref __binding_0 }
                            => {
                            1usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    AssocItemConstraintKind::Equality { term: ref __binding_0 }
                        => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AssocItemConstraintKind::Bound { bounds: ref __binding_0 }
                        => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for AssocItemConstraintKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        AssocItemConstraintKind::Equality {
                            term: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    1usize => {
                        AssocItemConstraintKind::Bound {
                            bounds: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `AssocItemConstraintKind`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for AssocItemConstraintKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            AssocItemConstraintKind::Equality { term: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "Equality", "term", &__self_0),
            AssocItemConstraintKind::Bound { bounds: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Bound",
                    "bounds", &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            AssocItemConstraintKind where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    AssocItemConstraintKind::Equality { term: ref __binding_0 }
                        => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    AssocItemConstraintKind::Bound { bounds: ref __binding_0 }
                        => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, (BoundKind::Bound))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for
            AssocItemConstraintKind where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    AssocItemConstraintKind::Equality {
                        term: ref mut __binding_0 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    AssocItemConstraintKind::Bound { bounds: ref mut __binding_0
                        } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, (BoundKind::Bound))
                        }
                    }
                }
            }
        }
    };Walkable)]
2429pub enum AssocItemConstraintKind {
2430    /// An equality constraint for an associated item (e.g., `AssocTy = Ty` in `Trait<AssocTy = Ty>`).
2431    ///
2432    /// Also known as an *associated item binding* (we *bind* an associated item to a term).
2433    ///
2434    /// Furthermore, associated type equality constraints can also be referred to as *associated type
2435    /// bindings*. Similarly with associated const equality constraints and *associated const bindings*.
2436    Equality { term: Term },
2437    /// A bound on an associated type (e.g., `AssocTy: Bound` in `Trait<AssocTy: Bound>`).
2438    Bound {
2439        #[visitable(extra = BoundKind::Bound)]
2440        bounds: GenericBounds,
2441    },
2442}
2443
2444#[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)]
2445pub struct Ty {
2446    pub id: NodeId,
2447    pub kind: TyKind,
2448    pub span: Span,
2449}
2450
2451impl Clone for Ty {
2452    fn clone(&self) -> Self {
2453        Self { id: self.id, kind: self.kind.clone(), span: self.span }
2454    }
2455}
2456
2457impl From<Box<Ty>> for Ty {
2458    fn from(value: Box<Ty>) -> Self {
2459        *value
2460    }
2461}
2462
2463impl Ty {
2464    pub fn peel_refs(&self) -> &Self {
2465        let mut final_ty = self;
2466        while let TyKind::Ref(_, MutTy { ty, .. }) | TyKind::Ptr(MutTy { ty, .. }) = &final_ty.kind
2467        {
2468            final_ty = ty;
2469        }
2470        final_ty
2471    }
2472
2473    pub fn is_maybe_parenthesised_infer(&self) -> bool {
2474        match &self.kind {
2475            TyKind::Infer => true,
2476            TyKind::Paren(inner) => inner.is_maybe_parenthesised_infer(),
2477            _ => false,
2478        }
2479    }
2480}
2481
2482#[derive(#[automatically_derived]
impl ::core::clone::Clone for FnPtrTy {
    #[inline]
    fn clone(&self) -> FnPtrTy {
        FnPtrTy {
            safety: ::core::clone::Clone::clone(&self.safety),
            ext: ::core::clone::Clone::clone(&self.ext),
            generic_params: ::core::clone::Clone::clone(&self.generic_params),
            decl: ::core::clone::Clone::clone(&self.decl),
            decl_span: ::core::clone::Clone::clone(&self.decl_span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for FnPtrTy {
            fn encode(&self, __encoder: &mut __E) {
                let FnPtrTy {
                        safety: ref __binding_0,
                        ext: ref __binding_1,
                        generic_params: ref __binding_2,
                        decl: ref __binding_3,
                        decl_span: ref __binding_4 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for FnPtrTy {
            fn decode(__decoder: &mut __D) -> Self {
                FnPtrTy {
                    safety: ::rustc_serialize::Decodable::decode(__decoder),
                    ext: ::rustc_serialize::Decodable::decode(__decoder),
                    generic_params: ::rustc_serialize::Decodable::decode(__decoder),
                    decl: ::rustc_serialize::Decodable::decode(__decoder),
                    decl_span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for FnPtrTy {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f, "FnPtrTy",
            "safety", &self.safety, "ext", &self.ext, "generic_params",
            &self.generic_params, "decl", &self.decl, "decl_span",
            &&self.decl_span)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for FnPtrTy
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    FnPtrTy {
                        safety: ref __binding_0,
                        ext: ref __binding_1,
                        generic_params: ref __binding_2,
                        decl: ref __binding_3,
                        decl_span: ref __binding_4 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for FnPtrTy where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    FnPtrTy {
                        safety: ref mut __binding_0,
                        ext: ref mut __binding_1,
                        generic_params: ref mut __binding_2,
                        decl: ref mut __binding_3,
                        decl_span: ref mut __binding_4 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2483pub struct FnPtrTy {
2484    pub safety: Safety,
2485    pub ext: Extern,
2486    pub generic_params: ThinVec<GenericParam>,
2487    pub decl: Box<FnDecl>,
2488    /// Span of the `[unsafe] [extern] fn(...) -> ...` part, i.e. everything
2489    /// after the generic params (if there are any, e.g. `for<'a>`).
2490    pub decl_span: Span,
2491}
2492
2493impl FnPtrTy {
2494    pub fn header(&self) -> FnHeader {
2495        FnHeader {
2496            constness: Const::No,
2497            coroutine_marker: None,
2498            safety: self.safety,
2499            ext: self.ext,
2500        }
2501    }
2502
2503    pub fn as_borrowed_fn_sig<'a>(&'a self) -> BorrowedFnSig<'a> {
2504        BorrowedFnSig { header: self.header(), decl: &self.decl, span: self.decl_span }
2505    }
2506}
2507
2508#[derive(#[automatically_derived]
impl ::core::clone::Clone for UnsafeBinderTy {
    #[inline]
    fn clone(&self) -> UnsafeBinderTy {
        UnsafeBinderTy {
            generic_params: ::core::clone::Clone::clone(&self.generic_params),
            inner_ty: ::core::clone::Clone::clone(&self.inner_ty),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for UnsafeBinderTy {
            fn encode(&self, __encoder: &mut __E) {
                let UnsafeBinderTy {
                        generic_params: ref __binding_0, inner_ty: ref __binding_1
                        } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for UnsafeBinderTy {
            fn decode(__decoder: &mut __D) -> Self {
                UnsafeBinderTy {
                    generic_params: ::rustc_serialize::Decodable::decode(__decoder),
                    inner_ty: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for UnsafeBinderTy {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "UnsafeBinderTy", "generic_params", &self.generic_params,
            "inner_ty", &&self.inner_ty)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            UnsafeBinderTy where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    UnsafeBinderTy {
                        generic_params: ref __binding_0, inner_ty: ref __binding_1 }
                        => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for UnsafeBinderTy where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    UnsafeBinderTy {
                        generic_params: ref mut __binding_0,
                        inner_ty: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2509pub struct UnsafeBinderTy {
2510    pub generic_params: ThinVec<GenericParam>,
2511    pub inner_ty: Box<Ty>,
2512}
2513
2514/// The various kinds of type recognized by the compiler.
2515//
2516// Adding a new variant? Please update `test_ty` in `tests/ui/macros/stringify.rs`.
2517#[derive(#[automatically_derived]
impl ::core::clone::Clone for TyKind {
    #[inline]
    fn clone(&self) -> TyKind {
        match self {
            TyKind::Slice(__self_0) =>
                TyKind::Slice(::core::clone::Clone::clone(__self_0)),
            TyKind::Array(__self_0, __self_1) =>
                TyKind::Array(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            TyKind::Ptr(__self_0) =>
                TyKind::Ptr(::core::clone::Clone::clone(__self_0)),
            TyKind::Ref(__self_0, __self_1) =>
                TyKind::Ref(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            TyKind::PinnedRef(__self_0, __self_1) =>
                TyKind::PinnedRef(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            TyKind::FnPtr(__self_0) =>
                TyKind::FnPtr(::core::clone::Clone::clone(__self_0)),
            TyKind::UnsafeBinder(__self_0) =>
                TyKind::UnsafeBinder(::core::clone::Clone::clone(__self_0)),
            TyKind::Never => TyKind::Never,
            TyKind::Tup(__self_0) =>
                TyKind::Tup(::core::clone::Clone::clone(__self_0)),
            TyKind::Path(__self_0, __self_1) =>
                TyKind::Path(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            TyKind::TraitObject(__self_0, __self_1) =>
                TyKind::TraitObject(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            TyKind::ImplTrait(__self_0, __self_1) =>
                TyKind::ImplTrait(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            TyKind::Paren(__self_0) =>
                TyKind::Paren(::core::clone::Clone::clone(__self_0)),
            TyKind::Infer => TyKind::Infer,
            TyKind::ImplicitSelf => TyKind::ImplicitSelf,
            TyKind::MacCall(__self_0) =>
                TyKind::MacCall(::core::clone::Clone::clone(__self_0)),
            TyKind::CVarArgs => TyKind::CVarArgs,
            TyKind::Pat(__self_0, __self_1) =>
                TyKind::Pat(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            TyKind::FieldOf(__self_0, __self_1, __self_2) =>
                TyKind::FieldOf(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            TyKind::View(__self_0, __self_1) =>
                TyKind::View(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            TyKind::DirectConstArg(__self_0) =>
                TyKind::DirectConstArg(::core::clone::Clone::clone(__self_0)),
            TyKind::Dummy => TyKind::Dummy,
            TyKind::Err(__self_0) =>
                TyKind::Err(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for TyKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        TyKind::Slice(ref __binding_0) => { 0usize }
                        TyKind::Array(ref __binding_0, ref __binding_1) => {
                            1usize
                        }
                        TyKind::Ptr(ref __binding_0) => { 2usize }
                        TyKind::Ref(ref __binding_0, ref __binding_1) => { 3usize }
                        TyKind::PinnedRef(ref __binding_0, ref __binding_1) => {
                            4usize
                        }
                        TyKind::FnPtr(ref __binding_0) => { 5usize }
                        TyKind::UnsafeBinder(ref __binding_0) => { 6usize }
                        TyKind::Never => { 7usize }
                        TyKind::Tup(ref __binding_0) => { 8usize }
                        TyKind::Path(ref __binding_0, ref __binding_1) => { 9usize }
                        TyKind::TraitObject(ref __binding_0, ref __binding_1) => {
                            10usize
                        }
                        TyKind::ImplTrait(ref __binding_0, ref __binding_1) => {
                            11usize
                        }
                        TyKind::Paren(ref __binding_0) => { 12usize }
                        TyKind::Infer => { 13usize }
                        TyKind::ImplicitSelf => { 14usize }
                        TyKind::MacCall(ref __binding_0) => { 15usize }
                        TyKind::CVarArgs => { 16usize }
                        TyKind::Pat(ref __binding_0, ref __binding_1) => { 17usize }
                        TyKind::FieldOf(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            18usize
                        }
                        TyKind::View(ref __binding_0, ref __binding_1) => {
                            19usize
                        }
                        TyKind::DirectConstArg(ref __binding_0) => { 20usize }
                        TyKind::Dummy => { 21usize }
                        TyKind::Err(ref __binding_0) => { 22usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    TyKind::Slice(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyKind::Array(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::Ptr(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyKind::Ref(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::PinnedRef(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::FnPtr(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyKind::UnsafeBinder(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyKind::Never => {}
                    TyKind::Tup(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyKind::Path(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::TraitObject(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::ImplTrait(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::Paren(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyKind::Infer => {}
                    TyKind::ImplicitSelf => {}
                    TyKind::MacCall(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyKind::CVarArgs => {}
                    TyKind::Pat(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::FieldOf(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    TyKind::View(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    TyKind::DirectConstArg(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyKind::Dummy => {}
                    TyKind::Err(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for TyKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        TyKind::Slice(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        TyKind::Array(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        TyKind::Ptr(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => {
                        TyKind::Ref(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    4usize => {
                        TyKind::PinnedRef(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    5usize => {
                        TyKind::FnPtr(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    6usize => {
                        TyKind::UnsafeBinder(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    7usize => { TyKind::Never }
                    8usize => {
                        TyKind::Tup(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    9usize => {
                        TyKind::Path(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    10usize => {
                        TyKind::TraitObject(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    11usize => {
                        TyKind::ImplTrait(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    12usize => {
                        TyKind::Paren(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    13usize => { TyKind::Infer }
                    14usize => { TyKind::ImplicitSelf }
                    15usize => {
                        TyKind::MacCall(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    16usize => { TyKind::CVarArgs }
                    17usize => {
                        TyKind::Pat(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    18usize => {
                        TyKind::FieldOf(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    19usize => {
                        TyKind::View(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    20usize => {
                        TyKind::DirectConstArg(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    21usize => { TyKind::Dummy }
                    22usize => {
                        TyKind::Err(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `TyKind`, expected 0..23, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for TyKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            TyKind::Slice(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Slice",
                    &__self_0),
            TyKind::Array(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Array",
                    __self_0, &__self_1),
            TyKind::Ptr(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Ptr",
                    &__self_0),
            TyKind::Ref(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Ref",
                    __self_0, &__self_1),
            TyKind::PinnedRef(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "PinnedRef", __self_0, &__self_1),
            TyKind::FnPtr(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "FnPtr",
                    &__self_0),
            TyKind::UnsafeBinder(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "UnsafeBinder", &__self_0),
            TyKind::Never => ::core::fmt::Formatter::write_str(f, "Never"),
            TyKind::Tup(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Tup",
                    &__self_0),
            TyKind::Path(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Path",
                    __self_0, &__self_1),
            TyKind::TraitObject(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "TraitObject", __self_0, &__self_1),
            TyKind::ImplTrait(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "ImplTrait", __self_0, &__self_1),
            TyKind::Paren(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Paren",
                    &__self_0),
            TyKind::Infer => ::core::fmt::Formatter::write_str(f, "Infer"),
            TyKind::ImplicitSelf =>
                ::core::fmt::Formatter::write_str(f, "ImplicitSelf"),
            TyKind::MacCall(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "MacCall", &__self_0),
            TyKind::CVarArgs =>
                ::core::fmt::Formatter::write_str(f, "CVarArgs"),
            TyKind::Pat(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Pat",
                    __self_0, &__self_1),
            TyKind::FieldOf(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f,
                    "FieldOf", __self_0, __self_1, &__self_2),
            TyKind::View(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "View",
                    __self_0, &__self_1),
            TyKind::DirectConstArg(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "DirectConstArg", &__self_0),
            TyKind::Dummy => ::core::fmt::Formatter::write_str(f, "Dummy"),
            TyKind::Err(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Err",
                    &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for TyKind where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    TyKind::Slice(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::Array(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::Ptr(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::Ref(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, (LifetimeCtxt::Ref))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::PinnedRef(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, (LifetimeCtxt::Ref))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::FnPtr(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::UnsafeBinder(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::Never => {}
                    TyKind::Tup(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::Path(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::TraitObject(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, (BoundKind::TraitObject))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::ImplTrait(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, (BoundKind::Impl))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::Paren(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::Infer => {}
                    TyKind::ImplicitSelf => {}
                    TyKind::MacCall(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::CVarArgs => {}
                    TyKind::Pat(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::FieldOf(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::View(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {}
                    }
                    TyKind::DirectConstArg(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyKind::Dummy => {}
                    TyKind::Err(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for TyKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    TyKind::Slice(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    TyKind::Array(ref mut __binding_0, ref mut __binding_1) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                    TyKind::Ptr(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    TyKind::Ref(ref mut __binding_0, ref mut __binding_1) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, (LifetimeCtxt::Ref))
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                    TyKind::PinnedRef(ref mut __binding_0, ref mut __binding_1)
                        => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, (LifetimeCtxt::Ref))
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                    TyKind::FnPtr(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    TyKind::UnsafeBinder(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    TyKind::Never => {}
                    TyKind::Tup(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    TyKind::Path(ref mut __binding_0, ref mut __binding_1) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                    TyKind::TraitObject(ref mut __binding_0,
                        ref mut __binding_1) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, (BoundKind::TraitObject))
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                    TyKind::ImplTrait(ref mut __binding_0, ref mut __binding_1)
                        => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, (BoundKind::Impl))
                        }
                    }
                    TyKind::Paren(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    TyKind::Infer => {}
                    TyKind::ImplicitSelf => {}
                    TyKind::MacCall(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    TyKind::CVarArgs => {}
                    TyKind::Pat(ref mut __binding_0, ref mut __binding_1) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                    TyKind::FieldOf(ref mut __binding_0, ref mut __binding_1,
                        ref mut __binding_2) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                    TyKind::View(ref mut __binding_0, ref mut __binding_1) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {}
                    }
                    TyKind::DirectConstArg(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    TyKind::Dummy => {}
                    TyKind::Err(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2518pub enum TyKind {
2519    /// A variable-length slice (`[T]`).
2520    Slice(Box<Ty>),
2521    /// A fixed length array (`[T; n]`).
2522    Array(Box<Ty>, AnonConst),
2523    /// A raw pointer (`*const T` or `*mut T`).
2524    Ptr(MutTy),
2525    /// A reference (`&'a T` or `&'a mut T`).
2526    Ref(#[visitable(extra = LifetimeCtxt::Ref)] Option<Lifetime>, MutTy),
2527    /// A pinned reference (`&'a pin const T` or `&'a pin mut T`).
2528    ///
2529    /// Desugars into `Pin<&'a T>` or `Pin<&'a mut T>`.
2530    PinnedRef(#[visitable(extra = LifetimeCtxt::Ref)] Option<Lifetime>, MutTy),
2531    /// A function pointer type (e.g., `fn(usize) -> bool`).
2532    FnPtr(Box<FnPtrTy>),
2533    /// An unsafe existential lifetime binder (e.g., `unsafe<'a> &'a ()`).
2534    UnsafeBinder(Box<UnsafeBinderTy>),
2535    /// The never type (`!`).
2536    Never,
2537    /// A tuple (`(A, B, C, D,...)`).
2538    Tup(ThinVec<Box<Ty>>),
2539    /// A path (`module::module::...::Type`), optionally
2540    /// "qualified", e.g., `<Vec<T> as SomeTrait>::SomeType`.
2541    ///
2542    /// Type parameters are stored in the `Path` itself.
2543    Path(Option<Box<QSelf>>, Path),
2544    /// A trait object type `Bound1 + Bound2 + Bound3`
2545    /// where `Bound` is a trait or a lifetime.
2546    TraitObject(#[visitable(extra = BoundKind::TraitObject)] GenericBounds, TraitObjectSyntax),
2547    /// An `impl Bound1 + Bound2 + Bound3` type
2548    /// where `Bound` is a trait or a lifetime.
2549    ///
2550    /// The `NodeId` exists to prevent lowering from having to
2551    /// generate `NodeId`s on the fly, which would complicate
2552    /// the generation of opaque `type Foo = impl Trait` items significantly.
2553    ImplTrait(NodeId, #[visitable(extra = BoundKind::Impl)] GenericBounds),
2554    /// No-op; kept solely so that we can pretty-print faithfully.
2555    Paren(Box<Ty>),
2556    /// This means the type should be inferred instead of it having been
2557    /// specified. This can appear anywhere in a type.
2558    Infer,
2559    /// Inferred type of a `self` or `&self` argument in a method.
2560    ImplicitSelf,
2561    /// A macro in the type position.
2562    MacCall(Box<MacCall>),
2563    /// Placeholder for a `va_list`.
2564    CVarArgs,
2565    /// Pattern types like `pattern_type!(u32 is 1..=)`, which is the same as `NonZero<u32>`,
2566    /// just as part of the type system.
2567    Pat(Box<Ty>, Box<TyPat>),
2568    /// A `field_of` expression (e.g., `builtin # field_of(Struct, field)`).
2569    ///
2570    /// Usually not written directly in user code but indirectly via the macro
2571    /// `core::field::field_of!(...)`.
2572    FieldOf(Box<Ty>, Option<Ident>, Ident),
2573    /// A view of a type. `T.{ field_1, field_2 }`.
2574    View(Box<Ty>, #[visitable(ignore)] ThinVec<Ident>),
2575    /// An mGCA `direct_const_arg!()` expression.
2576    DirectConstArg(Box<Expr>),
2577    /// Sometimes we need a dummy value when no error has occurred.
2578    Dummy,
2579    /// Placeholder for a kind that has failed to be defined.
2580    Err(ErrorGuaranteed),
2581}
2582
2583impl TyKind {
2584    pub fn is_implicit_self(&self) -> bool {
2585        #[allow(non_exhaustive_omitted_patterns)] match self {
    TyKind::ImplicitSelf => true,
    _ => false,
}matches!(self, TyKind::ImplicitSelf)
2586    }
2587
2588    pub fn is_unit(&self) -> bool {
2589        #[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())
2590    }
2591
2592    pub fn is_simple_path(&self) -> Option<Symbol> {
2593        if let TyKind::Path(None, Path { segments, .. }) = &self
2594            && let [segment] = &segments[..]
2595            && segment.args.is_none()
2596        {
2597            Some(segment.ident.name)
2598        } else {
2599            None
2600        }
2601    }
2602
2603    /// Returns `true` if this type is considered a scalar primitive (e.g.,
2604    /// `i32`, `u8`, `bool`, etc).
2605    ///
2606    /// This check is based on **symbol equality** and does **not** remove any
2607    /// path prefixes or references. If a type alias or shadowing is present
2608    /// (e.g., `type i32 = CustomType;`), this method will still return `true`
2609    /// for `i32`, even though it may not refer to the primitive type.
2610    pub fn maybe_scalar(&self) -> bool {
2611        let Some(ty_sym) = self.is_simple_path() else {
2612            // unit type
2613            return self.is_unit();
2614        };
2615        #[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!(
2616            ty_sym,
2617            sym::i8
2618                | sym::i16
2619                | sym::i32
2620                | sym::i64
2621                | sym::i128
2622                | sym::u8
2623                | sym::u16
2624                | sym::u32
2625                | sym::u64
2626                | sym::u128
2627                | sym::f16
2628                | sym::f32
2629                | sym::f64
2630                | sym::f128
2631                | sym::char
2632                | sym::bool
2633        )
2634    }
2635}
2636
2637/// A pattern type pattern.
2638#[derive(#[automatically_derived]
impl ::core::clone::Clone for TyPat {
    #[inline]
    fn clone(&self) -> TyPat {
        TyPat {
            id: ::core::clone::Clone::clone(&self.id),
            kind: ::core::clone::Clone::clone(&self.kind),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for TyPat {
            fn encode(&self, __encoder: &mut __E) {
                let TyPat {
                        id: ref __binding_0,
                        kind: ref __binding_1,
                        span: ref __binding_2 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for TyPat {
            fn decode(__decoder: &mut __D) -> Self {
                TyPat {
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for TyPat {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "TyPat", "id",
            &self.id, "kind", &self.kind, "span", &&self.span)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for TyPat where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    TyPat {
                        id: ref __binding_0,
                        kind: ref __binding_1,
                        span: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for TyPat where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    TyPat {
                        id: ref mut __binding_0,
                        kind: ref mut __binding_1,
                        span: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2639pub struct TyPat {
2640    pub id: NodeId,
2641    pub kind: TyPatKind,
2642    pub span: Span,
2643}
2644
2645/// All the different flavors of pattern that Rust recognizes.
2646//
2647// Adding a new variant? Please update `test_pat` in `tests/ui/macros/stringify.rs`.
2648#[derive(#[automatically_derived]
impl ::core::clone::Clone for TyPatKind {
    #[inline]
    fn clone(&self) -> TyPatKind {
        match self {
            TyPatKind::Range(__self_0, __self_1, __self_2) =>
                TyPatKind::Range(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            TyPatKind::NotNull => TyPatKind::NotNull,
            TyPatKind::Or(__self_0) =>
                TyPatKind::Or(::core::clone::Clone::clone(__self_0)),
            TyPatKind::Err(__self_0) =>
                TyPatKind::Err(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for TyPatKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        TyPatKind::Range(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            0usize
                        }
                        TyPatKind::NotNull => { 1usize }
                        TyPatKind::Or(ref __binding_0) => { 2usize }
                        TyPatKind::Err(ref __binding_0) => { 3usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    TyPatKind::Range(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    TyPatKind::NotNull => {}
                    TyPatKind::Or(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    TyPatKind::Err(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for TyPatKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        TyPatKind::Range(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => { TyPatKind::NotNull }
                    2usize => {
                        TyPatKind::Or(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => {
                        TyPatKind::Err(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `TyPatKind`, expected 0..4, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for TyPatKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            TyPatKind::Range(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Range",
                    __self_0, __self_1, &__self_2),
            TyPatKind::NotNull =>
                ::core::fmt::Formatter::write_str(f, "NotNull"),
            TyPatKind::Or(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Or",
                    &__self_0),
            TyPatKind::Err(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Err",
                    &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for TyPatKind
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    TyPatKind::Range(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyPatKind::NotNull => {}
                    TyPatKind::Or(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    TyPatKind::Err(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for TyPatKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    TyPatKind::Range(ref mut __binding_0, ref mut __binding_1,
                        ref mut __binding_2) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                    TyPatKind::NotNull => {}
                    TyPatKind::Or(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    TyPatKind::Err(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2649pub enum TyPatKind {
2650    /// A range pattern (e.g., `1...2`, `1..2`, `1..`, `..2`, `1..=2`, `..=2`).
2651    Range(Option<Box<AnonConst>>, Option<Box<AnonConst>>, Spanned<RangeEnd>),
2652
2653    /// A `!null` pattern for raw pointers.
2654    NotNull,
2655
2656    Or(ThinVec<TyPat>),
2657
2658    /// Placeholder for a pattern that wasn't syntactically well formed in some way.
2659    Err(ErrorGuaranteed),
2660}
2661
2662/// Syntax used to declare a trait object.
2663#[derive(#[automatically_derived]
impl ::core::clone::Clone for TraitObjectSyntax {
    #[inline]
    fn clone(&self) -> TraitObjectSyntax { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for TraitObjectSyntax { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for TraitObjectSyntax {
    #[inline]
    fn eq(&self, other: &TraitObjectSyntax) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for TraitObjectSyntax {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        TraitObjectSyntax::Dyn => { 0usize }
                        TraitObjectSyntax::None => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for TraitObjectSyntax {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { TraitObjectSyntax::Dyn }
                    1usize => { TraitObjectSyntax::None }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `TraitObjectSyntax`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for TraitObjectSyntax {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                TraitObjectSyntax::Dyn => "Dyn",
                TraitObjectSyntax::None => "None",
            })
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            TraitObjectSyntax {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    TraitObjectSyntax::Dyn => {}
                    TraitObjectSyntax::None => {}
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            TraitObjectSyntax where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    TraitObjectSyntax::Dyn => {}
                    TraitObjectSyntax::None => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for TraitObjectSyntax
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    TraitObjectSyntax::Dyn => {}
                    TraitObjectSyntax::None => {}
                }
            }
        }
    };Walkable)]
2664#[repr(u8)]
2665pub enum TraitObjectSyntax {
2666    // SAFETY: When adding new variants make sure to update the `Tag` impl.
2667    Dyn = 0,
2668    None = 1,
2669}
2670
2671/// SAFETY: `TraitObjectSyntax` only has 3 data-less variants which means
2672/// it can be represented with a `u2`. We use `repr(u8)` to guarantee the
2673/// discriminants of the variants are no greater than `3`.
2674unsafe impl Tag for TraitObjectSyntax {
2675    const BITS: u32 = 2;
2676
2677    fn into_usize(self) -> usize {
2678        self as u8 as usize
2679    }
2680
2681    unsafe fn from_usize(tag: usize) -> Self {
2682        match tag {
2683            0 => TraitObjectSyntax::Dyn,
2684            1 => TraitObjectSyntax::None,
2685            _ => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
2686        }
2687    }
2688}
2689
2690#[derive(#[automatically_derived]
impl ::core::clone::Clone for PreciseCapturingArg {
    #[inline]
    fn clone(&self) -> PreciseCapturingArg {
        match self {
            PreciseCapturingArg::Lifetime(__self_0) =>
                PreciseCapturingArg::Lifetime(::core::clone::Clone::clone(__self_0)),
            PreciseCapturingArg::Arg(__self_0, __self_1) =>
                PreciseCapturingArg::Arg(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for PreciseCapturingArg {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        PreciseCapturingArg::Lifetime(ref __binding_0) => { 0usize }
                        PreciseCapturingArg::Arg(ref __binding_0, ref __binding_1)
                            => {
                            1usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    PreciseCapturingArg::Lifetime(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    PreciseCapturingArg::Arg(ref __binding_0, ref __binding_1)
                        => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for PreciseCapturingArg {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        PreciseCapturingArg::Lifetime(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        PreciseCapturingArg::Arg(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `PreciseCapturingArg`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for PreciseCapturingArg {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            PreciseCapturingArg::Lifetime(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Lifetime", &__self_0),
            PreciseCapturingArg::Arg(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Arg",
                    __self_0, &__self_1),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            PreciseCapturingArg where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    PreciseCapturingArg::Lifetime(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, (LifetimeCtxt::GenericArg))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    PreciseCapturingArg::Arg(ref __binding_0, ref __binding_1)
                        => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for PreciseCapturingArg
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    PreciseCapturingArg::Lifetime(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, (LifetimeCtxt::GenericArg))
                        }
                    }
                    PreciseCapturingArg::Arg(ref mut __binding_0,
                        ref mut __binding_1) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2691pub enum PreciseCapturingArg {
2692    /// Lifetime parameter.
2693    Lifetime(#[visitable(extra = LifetimeCtxt::GenericArg)] Lifetime),
2694    /// Type or const parameter.
2695    Arg(Path, NodeId),
2696}
2697
2698/// Inline assembly operand explicit register or register class.
2699///
2700/// E.g., `"eax"` as in `asm!("mov eax, 2", out("eax") result)`.
2701#[derive(#[automatically_derived]
impl ::core::clone::Clone for InlineAsmRegOrRegClass {
    #[inline]
    fn clone(&self) -> InlineAsmRegOrRegClass {
        let _: ::core::clone::AssertParamIsClone<Symbol>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for InlineAsmRegOrRegClass { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for InlineAsmRegOrRegClass {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        InlineAsmRegOrRegClass::Reg(ref __binding_0) => { 0usize }
                        InlineAsmRegOrRegClass::RegClass(ref __binding_0) => {
                            1usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    InlineAsmRegOrRegClass::Reg(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    InlineAsmRegOrRegClass::RegClass(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for InlineAsmRegOrRegClass {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        InlineAsmRegOrRegClass::Reg(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        InlineAsmRegOrRegClass::RegClass(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `InlineAsmRegOrRegClass`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for InlineAsmRegOrRegClass {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            InlineAsmRegOrRegClass::Reg(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Reg",
                    &__self_0),
            InlineAsmRegOrRegClass::RegClass(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "RegClass", &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            InlineAsmRegOrRegClass where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    InlineAsmRegOrRegClass::Reg(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    InlineAsmRegOrRegClass::RegClass(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for
            InlineAsmRegOrRegClass where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    InlineAsmRegOrRegClass::Reg(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    InlineAsmRegOrRegClass::RegClass(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2702pub enum InlineAsmRegOrRegClass {
2703    Reg(Symbol),
2704    RegClass(Symbol),
2705}
2706
2707#[derive(#[automatically_derived]
impl ::core::clone::Clone for InlineAsmOptions {
    #[inline]
    fn clone(&self) -> InlineAsmOptions {
        let _: ::core::clone::AssertParamIsClone<u16>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for InlineAsmOptions { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for InlineAsmOptions {
    #[inline]
    fn eq(&self, other: &InlineAsmOptions) -> bool { self.0 == other.0 }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for InlineAsmOptions {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<u16>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for InlineAsmOptions {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}Hash, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for InlineAsmOptions {
            fn encode(&self, __encoder: &mut __E) {
                let InlineAsmOptions(ref __binding_0) = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for InlineAsmOptions {
            fn decode(__decoder: &mut __D) -> Self {
                InlineAsmOptions(::rustc_serialize::Decodable::decode(__decoder))
            }
        }
    };Decodable, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            InlineAsmOptions {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                match *self {
                    InlineAsmOptions(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
2708pub struct InlineAsmOptions(u16);
2709impl 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! {
2710    impl InlineAsmOptions: u16 {
2711        const PURE            = 1 << 0;
2712        const NOMEM           = 1 << 1;
2713        const READONLY        = 1 << 2;
2714        const PRESERVES_FLAGS = 1 << 3;
2715        const NORETURN        = 1 << 4;
2716        const NOSTACK         = 1 << 5;
2717        const ATT_SYNTAX      = 1 << 6;
2718        const RAW             = 1 << 7;
2719        const MAY_UNWIND      = 1 << 8;
2720    }
2721}
2722
2723impl InlineAsmOptions {
2724    pub const COUNT: usize = Self::all().bits().count_ones() as usize;
2725
2726    pub const GLOBAL_OPTIONS: Self = Self::ATT_SYNTAX.union(Self::RAW);
2727    pub const NAKED_OPTIONS: Self = Self::ATT_SYNTAX.union(Self::RAW);
2728
2729    pub fn human_readable_names(&self) -> Vec<&'static str> {
2730        let mut options = ::alloc::vec::Vec::new()vec![];
2731
2732        if self.contains(InlineAsmOptions::PURE) {
2733            options.push("pure");
2734        }
2735        if self.contains(InlineAsmOptions::NOMEM) {
2736            options.push("nomem");
2737        }
2738        if self.contains(InlineAsmOptions::READONLY) {
2739            options.push("readonly");
2740        }
2741        if self.contains(InlineAsmOptions::PRESERVES_FLAGS) {
2742            options.push("preserves_flags");
2743        }
2744        if self.contains(InlineAsmOptions::NORETURN) {
2745            options.push("noreturn");
2746        }
2747        if self.contains(InlineAsmOptions::NOSTACK) {
2748            options.push("nostack");
2749        }
2750        if self.contains(InlineAsmOptions::ATT_SYNTAX) {
2751            options.push("att_syntax");
2752        }
2753        if self.contains(InlineAsmOptions::RAW) {
2754            options.push("raw");
2755        }
2756        if self.contains(InlineAsmOptions::MAY_UNWIND) {
2757            options.push("may_unwind");
2758        }
2759
2760        options
2761    }
2762}
2763
2764impl std::fmt::Debug for InlineAsmOptions {
2765    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
2766        bitflags::parser::to_writer(self, f)
2767    }
2768}
2769
2770#[derive(#[automatically_derived]
impl ::core::clone::Clone for InlineAsmTemplatePiece {
    #[inline]
    fn clone(&self) -> InlineAsmTemplatePiece {
        match self {
            InlineAsmTemplatePiece::String(__self_0) =>
                InlineAsmTemplatePiece::String(::core::clone::Clone::clone(__self_0)),
            InlineAsmTemplatePiece::Placeholder {
                operand_idx: __self_0, modifier: __self_1, span: __self_2 } =>
                InlineAsmTemplatePiece::Placeholder {
                    operand_idx: ::core::clone::Clone::clone(__self_0),
                    modifier: ::core::clone::Clone::clone(__self_1),
                    span: ::core::clone::Clone::clone(__self_2),
                },
        }
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for InlineAsmTemplatePiece {
    #[inline]
    fn eq(&self, other: &InlineAsmTemplatePiece) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (InlineAsmTemplatePiece::String(__self_0),
                    InlineAsmTemplatePiece::String(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (InlineAsmTemplatePiece::Placeholder {
                    operand_idx: __self_0, modifier: __self_1, span: __self_2 },
                    InlineAsmTemplatePiece::Placeholder {
                    operand_idx: __arg1_0, modifier: __arg1_1, span: __arg1_2 })
                    =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1 &&
                        __self_2 == __arg1_2,
                _ => unsafe { ::core::intrinsics::unreachable() }
            }
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for InlineAsmTemplatePiece {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        InlineAsmTemplatePiece::String(ref __binding_0) => {
                            0usize
                        }
                        InlineAsmTemplatePiece::Placeholder {
                            operand_idx: ref __binding_0,
                            modifier: ref __binding_1,
                            span: ref __binding_2 } => {
                            1usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    InlineAsmTemplatePiece::String(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    InlineAsmTemplatePiece::Placeholder {
                        operand_idx: ref __binding_0,
                        modifier: ref __binding_1,
                        span: ref __binding_2 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for InlineAsmTemplatePiece {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        InlineAsmTemplatePiece::String(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        InlineAsmTemplatePiece::Placeholder {
                            operand_idx: ::rustc_serialize::Decodable::decode(__decoder),
                            modifier: ::rustc_serialize::Decodable::decode(__decoder),
                            span: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `InlineAsmTemplatePiece`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for InlineAsmTemplatePiece {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            InlineAsmTemplatePiece::String(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "String",
                    &__self_0),
            InlineAsmTemplatePiece::Placeholder {
                operand_idx: __self_0, modifier: __self_1, span: __self_2 } =>
                ::core::fmt::Formatter::debug_struct_field3_finish(f,
                    "Placeholder", "operand_idx", __self_0, "modifier",
                    __self_1, "span", &__self_2),
        }
    }
}Debug, #[automatically_derived]
impl ::core::hash::Hash for InlineAsmTemplatePiece {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            InlineAsmTemplatePiece::String(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            InlineAsmTemplatePiece::Placeholder {
                operand_idx: __self_0, modifier: __self_1, span: __self_2 } =>
                {
                ::core::hash::Hash::hash(__self_0, state);
                ::core::hash::Hash::hash(__self_1, state);
                ::core::hash::Hash::hash(__self_2, state)
            }
        }
    }
}Hash, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            InlineAsmTemplatePiece {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    InlineAsmTemplatePiece::String(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    InlineAsmTemplatePiece::Placeholder {
                        operand_idx: ref __binding_0,
                        modifier: ref __binding_1,
                        span: ref __binding_2 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                        { __binding_2.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            InlineAsmTemplatePiece where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    InlineAsmTemplatePiece::String(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    InlineAsmTemplatePiece::Placeholder {
                        operand_idx: ref __binding_0,
                        modifier: ref __binding_1,
                        span: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for
            InlineAsmTemplatePiece where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    InlineAsmTemplatePiece::String(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    InlineAsmTemplatePiece::Placeholder {
                        operand_idx: ref mut __binding_0,
                        modifier: ref mut __binding_1,
                        span: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2771pub enum InlineAsmTemplatePiece {
2772    String(Cow<'static, str>),
2773    Placeholder { operand_idx: usize, modifier: Option<char>, span: Span },
2774}
2775
2776impl fmt::Display for InlineAsmTemplatePiece {
2777    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2778        match self {
2779            Self::String(s) => {
2780                for c in s.chars() {
2781                    match c {
2782                        '{' => f.write_str("{{")?,
2783                        '}' => f.write_str("}}")?,
2784                        _ => c.fmt(f)?,
2785                    }
2786                }
2787                Ok(())
2788            }
2789            Self::Placeholder { operand_idx, modifier: Some(modifier), .. } => {
2790                f.write_fmt(format_args!("{{{0}:{1}}}", operand_idx, modifier))write!(f, "{{{operand_idx}:{modifier}}}")
2791            }
2792            Self::Placeholder { operand_idx, modifier: None, .. } => {
2793                f.write_fmt(format_args!("{{{0}}}", operand_idx))write!(f, "{{{operand_idx}}}")
2794            }
2795        }
2796    }
2797}
2798
2799impl InlineAsmTemplatePiece {
2800    /// Rebuilds the asm template string from its pieces.
2801    pub fn to_string(s: &[Self]) -> String {
2802        use fmt::Write;
2803        let mut out = String::new();
2804        for p in s.iter() {
2805            let _ = out.write_fmt(format_args!("{0}", p))write!(out, "{p}");
2806        }
2807        out
2808    }
2809}
2810
2811/// Inline assembly symbol operands get their own AST node that is somewhat
2812/// similar to `AnonConst`.
2813///
2814/// The main difference is that we specifically don't assign it `DefId` in
2815/// `DefCollector`. Instead this is deferred until AST lowering where we
2816/// lower it to an `AnonConst` (for functions) or a `Path` (for statics)
2817/// depending on what the path resolves to.
2818#[derive(#[automatically_derived]
impl ::core::clone::Clone for InlineAsmSym {
    #[inline]
    fn clone(&self) -> InlineAsmSym {
        InlineAsmSym {
            id: ::core::clone::Clone::clone(&self.id),
            qself: ::core::clone::Clone::clone(&self.qself),
            path: ::core::clone::Clone::clone(&self.path),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for InlineAsmSym {
            fn encode(&self, __encoder: &mut __E) {
                let InlineAsmSym {
                        id: ref __binding_0,
                        qself: ref __binding_1,
                        path: ref __binding_2 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for InlineAsmSym {
            fn decode(__decoder: &mut __D) -> Self {
                InlineAsmSym {
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    qself: ::rustc_serialize::Decodable::decode(__decoder),
                    path: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for InlineAsmSym {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f, "InlineAsmSym",
            "id", &self.id, "qself", &self.qself, "path", &&self.path)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for InlineAsmSym
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    InlineAsmSym {
                        id: ref __binding_0,
                        qself: ref __binding_1,
                        path: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for InlineAsmSym where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    InlineAsmSym {
                        id: ref mut __binding_0,
                        qself: ref mut __binding_1,
                        path: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2819pub struct InlineAsmSym {
2820    pub id: NodeId,
2821    pub qself: Option<Box<QSelf>>,
2822    pub path: Path,
2823}
2824
2825/// Inline assembly operand.
2826///
2827/// E.g., `out("eax") result` as in `asm!("mov eax, 2", out("eax") result)`.
2828#[derive(#[automatically_derived]
impl ::core::clone::Clone for InlineAsmOperand {
    #[inline]
    fn clone(&self) -> InlineAsmOperand {
        match self {
            InlineAsmOperand::In { reg: __self_0, expr: __self_1 } =>
                InlineAsmOperand::In {
                    reg: ::core::clone::Clone::clone(__self_0),
                    expr: ::core::clone::Clone::clone(__self_1),
                },
            InlineAsmOperand::Out {
                reg: __self_0, late: __self_1, expr: __self_2 } =>
                InlineAsmOperand::Out {
                    reg: ::core::clone::Clone::clone(__self_0),
                    late: ::core::clone::Clone::clone(__self_1),
                    expr: ::core::clone::Clone::clone(__self_2),
                },
            InlineAsmOperand::InOut {
                reg: __self_0, late: __self_1, expr: __self_2 } =>
                InlineAsmOperand::InOut {
                    reg: ::core::clone::Clone::clone(__self_0),
                    late: ::core::clone::Clone::clone(__self_1),
                    expr: ::core::clone::Clone::clone(__self_2),
                },
            InlineAsmOperand::SplitInOut {
                reg: __self_0,
                late: __self_1,
                in_expr: __self_2,
                out_expr: __self_3 } =>
                InlineAsmOperand::SplitInOut {
                    reg: ::core::clone::Clone::clone(__self_0),
                    late: ::core::clone::Clone::clone(__self_1),
                    in_expr: ::core::clone::Clone::clone(__self_2),
                    out_expr: ::core::clone::Clone::clone(__self_3),
                },
            InlineAsmOperand::Const { anon_const: __self_0 } =>
                InlineAsmOperand::Const {
                    anon_const: ::core::clone::Clone::clone(__self_0),
                },
            InlineAsmOperand::Sym { sym: __self_0 } =>
                InlineAsmOperand::Sym {
                    sym: ::core::clone::Clone::clone(__self_0),
                },
            InlineAsmOperand::Label { block: __self_0 } =>
                InlineAsmOperand::Label {
                    block: ::core::clone::Clone::clone(__self_0),
                },
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for InlineAsmOperand {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        InlineAsmOperand::In {
                            reg: ref __binding_0, expr: ref __binding_1 } => {
                            0usize
                        }
                        InlineAsmOperand::Out {
                            reg: ref __binding_0,
                            late: ref __binding_1,
                            expr: ref __binding_2 } => {
                            1usize
                        }
                        InlineAsmOperand::InOut {
                            reg: ref __binding_0,
                            late: ref __binding_1,
                            expr: ref __binding_2 } => {
                            2usize
                        }
                        InlineAsmOperand::SplitInOut {
                            reg: ref __binding_0,
                            late: ref __binding_1,
                            in_expr: ref __binding_2,
                            out_expr: ref __binding_3 } => {
                            3usize
                        }
                        InlineAsmOperand::Const { anon_const: ref __binding_0 } => {
                            4usize
                        }
                        InlineAsmOperand::Sym { sym: ref __binding_0 } => { 5usize }
                        InlineAsmOperand::Label { block: ref __binding_0 } => {
                            6usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    InlineAsmOperand::In {
                        reg: ref __binding_0, expr: ref __binding_1 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    InlineAsmOperand::Out {
                        reg: ref __binding_0,
                        late: ref __binding_1,
                        expr: ref __binding_2 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    InlineAsmOperand::InOut {
                        reg: ref __binding_0,
                        late: ref __binding_1,
                        expr: ref __binding_2 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    InlineAsmOperand::SplitInOut {
                        reg: ref __binding_0,
                        late: ref __binding_1,
                        in_expr: ref __binding_2,
                        out_expr: ref __binding_3 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                            __encoder);
                    }
                    InlineAsmOperand::Const { anon_const: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    InlineAsmOperand::Sym { sym: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    InlineAsmOperand::Label { block: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for InlineAsmOperand {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        InlineAsmOperand::In {
                            reg: ::rustc_serialize::Decodable::decode(__decoder),
                            expr: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    1usize => {
                        InlineAsmOperand::Out {
                            reg: ::rustc_serialize::Decodable::decode(__decoder),
                            late: ::rustc_serialize::Decodable::decode(__decoder),
                            expr: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    2usize => {
                        InlineAsmOperand::InOut {
                            reg: ::rustc_serialize::Decodable::decode(__decoder),
                            late: ::rustc_serialize::Decodable::decode(__decoder),
                            expr: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    3usize => {
                        InlineAsmOperand::SplitInOut {
                            reg: ::rustc_serialize::Decodable::decode(__decoder),
                            late: ::rustc_serialize::Decodable::decode(__decoder),
                            in_expr: ::rustc_serialize::Decodable::decode(__decoder),
                            out_expr: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    4usize => {
                        InlineAsmOperand::Const {
                            anon_const: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    5usize => {
                        InlineAsmOperand::Sym {
                            sym: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    6usize => {
                        InlineAsmOperand::Label {
                            block: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `InlineAsmOperand`, expected 0..7, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for InlineAsmOperand {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            InlineAsmOperand::In { reg: __self_0, expr: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f, "In",
                    "reg", __self_0, "expr", &__self_1),
            InlineAsmOperand::Out {
                reg: __self_0, late: __self_1, expr: __self_2 } =>
                ::core::fmt::Formatter::debug_struct_field3_finish(f, "Out",
                    "reg", __self_0, "late", __self_1, "expr", &__self_2),
            InlineAsmOperand::InOut {
                reg: __self_0, late: __self_1, expr: __self_2 } =>
                ::core::fmt::Formatter::debug_struct_field3_finish(f, "InOut",
                    "reg", __self_0, "late", __self_1, "expr", &__self_2),
            InlineAsmOperand::SplitInOut {
                reg: __self_0,
                late: __self_1,
                in_expr: __self_2,
                out_expr: __self_3 } =>
                ::core::fmt::Formatter::debug_struct_field4_finish(f,
                    "SplitInOut", "reg", __self_0, "late", __self_1, "in_expr",
                    __self_2, "out_expr", &__self_3),
            InlineAsmOperand::Const { anon_const: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Const",
                    "anon_const", &__self_0),
            InlineAsmOperand::Sym { sym: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Sym",
                    "sym", &__self_0),
            InlineAsmOperand::Label { block: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Label",
                    "block", &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            InlineAsmOperand where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    InlineAsmOperand::In {
                        reg: ref __binding_0, expr: ref __binding_1 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    InlineAsmOperand::Out {
                        reg: ref __binding_0,
                        late: ref __binding_1,
                        expr: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    InlineAsmOperand::InOut {
                        reg: ref __binding_0,
                        late: ref __binding_1,
                        expr: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    InlineAsmOperand::SplitInOut {
                        reg: ref __binding_0,
                        late: ref __binding_1,
                        in_expr: ref __binding_2,
                        out_expr: ref __binding_3 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    InlineAsmOperand::Const { anon_const: ref __binding_0 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    InlineAsmOperand::Sym { sym: ref __binding_0 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    InlineAsmOperand::Label { block: ref __binding_0 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for InlineAsmOperand
            where __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    InlineAsmOperand::In {
                        reg: ref mut __binding_0, expr: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                    InlineAsmOperand::Out {
                        reg: ref mut __binding_0,
                        late: ref mut __binding_1,
                        expr: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                    InlineAsmOperand::InOut {
                        reg: ref mut __binding_0,
                        late: ref mut __binding_1,
                        expr: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                    InlineAsmOperand::SplitInOut {
                        reg: ref mut __binding_0,
                        late: ref mut __binding_1,
                        in_expr: ref mut __binding_2,
                        out_expr: ref mut __binding_3 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                    }
                    InlineAsmOperand::Const { anon_const: ref mut __binding_0 }
                        => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    InlineAsmOperand::Sym { sym: ref mut __binding_0 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    InlineAsmOperand::Label { block: ref mut __binding_0 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2829pub enum InlineAsmOperand {
2830    In {
2831        reg: InlineAsmRegOrRegClass,
2832        expr: Box<Expr>,
2833    },
2834    Out {
2835        reg: InlineAsmRegOrRegClass,
2836        late: bool,
2837        expr: Option<Box<Expr>>,
2838    },
2839    InOut {
2840        reg: InlineAsmRegOrRegClass,
2841        late: bool,
2842        expr: Box<Expr>,
2843    },
2844    SplitInOut {
2845        reg: InlineAsmRegOrRegClass,
2846        late: bool,
2847        in_expr: Box<Expr>,
2848        out_expr: Option<Box<Expr>>,
2849    },
2850    Const {
2851        anon_const: AnonConst,
2852    },
2853    Sym {
2854        sym: InlineAsmSym,
2855    },
2856    Label {
2857        block: Box<Block>,
2858    },
2859}
2860
2861impl InlineAsmOperand {
2862    pub fn reg(&self) -> Option<&InlineAsmRegOrRegClass> {
2863        match self {
2864            Self::In { reg, .. }
2865            | Self::Out { reg, .. }
2866            | Self::InOut { reg, .. }
2867            | Self::SplitInOut { reg, .. } => Some(reg),
2868            Self::Const { .. } | Self::Sym { .. } | Self::Label { .. } => None,
2869        }
2870    }
2871}
2872
2873#[derive(#[automatically_derived]
impl ::core::clone::Clone for AsmMacro {
    #[inline]
    fn clone(&self) -> AsmMacro { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for AsmMacro { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for AsmMacro {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        AsmMacro::Asm => { 0usize }
                        AsmMacro::GlobalAsm => { 1usize }
                        AsmMacro::NakedAsm => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for AsmMacro {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { AsmMacro::Asm }
                    1usize => { AsmMacro::GlobalAsm }
                    2usize => { AsmMacro::NakedAsm }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `AsmMacro`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for AsmMacro {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                AsmMacro::Asm => "Asm",
                AsmMacro::GlobalAsm => "GlobalAsm",
                AsmMacro::NakedAsm => "NakedAsm",
            })
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for AsmMacro {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    AsmMacro::Asm => {}
                    AsmMacro::GlobalAsm => {}
                    AsmMacro::NakedAsm => {}
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for AsmMacro
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    AsmMacro::Asm => {}
                    AsmMacro::GlobalAsm => {}
                    AsmMacro::NakedAsm => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for AsmMacro where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    AsmMacro::Asm => {}
                    AsmMacro::GlobalAsm => {}
                    AsmMacro::NakedAsm => {}
                }
            }
        }
    };Walkable, #[automatically_derived]
impl ::core::cmp::PartialEq for AsmMacro {
    #[inline]
    fn eq(&self, other: &AsmMacro) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for AsmMacro {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq)]
2874pub enum AsmMacro {
2875    /// The `asm!` macro
2876    Asm,
2877    /// The `global_asm!` macro
2878    GlobalAsm,
2879    /// The `naked_asm!` macro
2880    NakedAsm,
2881}
2882
2883impl AsmMacro {
2884    pub const fn macro_name(self) -> &'static str {
2885        match self {
2886            AsmMacro::Asm => "asm",
2887            AsmMacro::GlobalAsm => "global_asm",
2888            AsmMacro::NakedAsm => "naked_asm",
2889        }
2890    }
2891
2892    pub const fn is_supported_option(self, option: InlineAsmOptions) -> bool {
2893        match self {
2894            AsmMacro::Asm => true,
2895            AsmMacro::GlobalAsm => InlineAsmOptions::GLOBAL_OPTIONS.contains(option),
2896            AsmMacro::NakedAsm => InlineAsmOptions::NAKED_OPTIONS.contains(option),
2897        }
2898    }
2899
2900    pub const fn diverges(self, options: InlineAsmOptions) -> bool {
2901        match self {
2902            AsmMacro::Asm => options.contains(InlineAsmOptions::NORETURN),
2903            AsmMacro::GlobalAsm => true,
2904            AsmMacro::NakedAsm => true,
2905        }
2906    }
2907}
2908
2909/// Inline assembly.
2910///
2911/// E.g., `asm!("NOP");`.
2912#[derive(#[automatically_derived]
impl ::core::clone::Clone for InlineAsm {
    #[inline]
    fn clone(&self) -> InlineAsm {
        InlineAsm {
            asm_macro: ::core::clone::Clone::clone(&self.asm_macro),
            template: ::core::clone::Clone::clone(&self.template),
            template_strs: ::core::clone::Clone::clone(&self.template_strs),
            operands: ::core::clone::Clone::clone(&self.operands),
            clobber_abis: ::core::clone::Clone::clone(&self.clobber_abis),
            options: ::core::clone::Clone::clone(&self.options),
            line_spans: ::core::clone::Clone::clone(&self.line_spans),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for InlineAsm {
            fn encode(&self, __encoder: &mut __E) {
                let InlineAsm {
                        asm_macro: ref __binding_0,
                        template: ref __binding_1,
                        template_strs: ref __binding_2,
                        operands: ref __binding_3,
                        clobber_abis: ref __binding_4,
                        options: ref __binding_5,
                        line_spans: ref __binding_6 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_5,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_6,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for InlineAsm {
            fn decode(__decoder: &mut __D) -> Self {
                InlineAsm {
                    asm_macro: ::rustc_serialize::Decodable::decode(__decoder),
                    template: ::rustc_serialize::Decodable::decode(__decoder),
                    template_strs: ::rustc_serialize::Decodable::decode(__decoder),
                    operands: ::rustc_serialize::Decodable::decode(__decoder),
                    clobber_abis: ::rustc_serialize::Decodable::decode(__decoder),
                    options: ::rustc_serialize::Decodable::decode(__decoder),
                    line_spans: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for InlineAsm {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["asm_macro", "template", "template_strs", "operands",
                        "clobber_abis", "options", "line_spans"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.asm_macro, &self.template, &self.template_strs,
                        &self.operands, &self.clobber_abis, &self.options,
                        &&self.line_spans];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "InlineAsm",
            names, values)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for InlineAsm
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    InlineAsm {
                        asm_macro: ref __binding_0,
                        template: ref __binding_1,
                        template_strs: ref __binding_2,
                        operands: ref __binding_3,
                        clobber_abis: ref __binding_4,
                        options: ref __binding_5,
                        line_spans: ref __binding_6 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {}
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_6,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for InlineAsm where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    InlineAsm {
                        asm_macro: ref mut __binding_0,
                        template: ref mut __binding_1,
                        template_strs: ref mut __binding_2,
                        operands: ref mut __binding_3,
                        clobber_abis: ref mut __binding_4,
                        options: ref mut __binding_5,
                        line_spans: ref mut __binding_6 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                        {}
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_6,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2913pub struct InlineAsm {
2914    pub asm_macro: AsmMacro,
2915    pub template: Vec<InlineAsmTemplatePiece>,
2916    pub template_strs: Box<[(Symbol, Option<Symbol>, Span)]>,
2917    pub operands: Vec<(InlineAsmOperand, Span)>,
2918    pub clobber_abis: Vec<(Symbol, Span)>,
2919    #[visitable(ignore)]
2920    pub options: InlineAsmOptions,
2921    pub line_spans: Vec<Span>,
2922}
2923
2924/// A parameter in a function header.
2925///
2926/// E.g., `bar: usize` as in `fn foo(bar: usize)`.
2927#[derive(#[automatically_derived]
impl ::core::clone::Clone for Param {
    #[inline]
    fn clone(&self) -> Param {
        Param {
            attrs: ::core::clone::Clone::clone(&self.attrs),
            ty: ::core::clone::Clone::clone(&self.ty),
            pat: ::core::clone::Clone::clone(&self.pat),
            id: ::core::clone::Clone::clone(&self.id),
            span: ::core::clone::Clone::clone(&self.span),
            is_placeholder: ::core::clone::Clone::clone(&self.is_placeholder),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Param {
            fn encode(&self, __encoder: &mut __E) {
                let Param {
                        attrs: ref __binding_0,
                        ty: ref __binding_1,
                        pat: ref __binding_2,
                        id: ref __binding_3,
                        span: ref __binding_4,
                        is_placeholder: ref __binding_5 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_5,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Param {
            fn decode(__decoder: &mut __D) -> Self {
                Param {
                    attrs: ::rustc_serialize::Decodable::decode(__decoder),
                    ty: ::rustc_serialize::Decodable::decode(__decoder),
                    pat: ::rustc_serialize::Decodable::decode(__decoder),
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    is_placeholder: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Param {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["attrs", "ty", "pat", "id", "span", "is_placeholder"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.attrs, &self.ty, &self.pat, &self.id, &self.span,
                        &&self.is_placeholder];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "Param", names,
            values)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Param where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Param {
                        attrs: ref __binding_0,
                        ty: ref __binding_1,
                        pat: ref __binding_2,
                        id: ref __binding_3,
                        span: ref __binding_4,
                        is_placeholder: ref __binding_5 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_5,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Param where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Param {
                        attrs: ref mut __binding_0,
                        ty: ref mut __binding_1,
                        pat: ref mut __binding_2,
                        id: ref mut __binding_3,
                        span: ref mut __binding_4,
                        is_placeholder: ref mut __binding_5 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_5,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
2928pub struct Param {
2929    pub attrs: AttrVec,
2930    pub ty: Box<Ty>,
2931    pub pat: Box<Pat>,
2932    pub id: NodeId,
2933    pub span: Span,
2934    pub is_placeholder: bool,
2935}
2936
2937/// Alternative representation for `Arg`s describing `self` parameter of methods.
2938///
2939/// E.g., `&mut self` as in `fn foo(&mut self)`.
2940#[derive(#[automatically_derived]
impl ::core::clone::Clone for SelfKind {
    #[inline]
    fn clone(&self) -> SelfKind {
        match self {
            SelfKind::Value(__self_0) =>
                SelfKind::Value(::core::clone::Clone::clone(__self_0)),
            SelfKind::Region(__self_0, __self_1) =>
                SelfKind::Region(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            SelfKind::Pinned(__self_0, __self_1) =>
                SelfKind::Pinned(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            SelfKind::Explicit(__self_0, __self_1) =>
                SelfKind::Explicit(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for SelfKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        SelfKind::Value(ref __binding_0) => { 0usize }
                        SelfKind::Region(ref __binding_0, ref __binding_1) => {
                            1usize
                        }
                        SelfKind::Pinned(ref __binding_0, ref __binding_1) => {
                            2usize
                        }
                        SelfKind::Explicit(ref __binding_0, ref __binding_1) => {
                            3usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    SelfKind::Value(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    SelfKind::Region(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    SelfKind::Pinned(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    SelfKind::Explicit(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for SelfKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        SelfKind::Value(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        SelfKind::Region(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        SelfKind::Pinned(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    3usize => {
                        SelfKind::Explicit(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `SelfKind`, expected 0..4, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for SelfKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            SelfKind::Value(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Value",
                    &__self_0),
            SelfKind::Region(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Region",
                    __self_0, &__self_1),
            SelfKind::Pinned(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Pinned",
                    __self_0, &__self_1),
            SelfKind::Explicit(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "Explicit", __self_0, &__self_1),
        }
    }
}Debug)]
2941pub enum SelfKind {
2942    /// `self`, `mut self`
2943    Value(Mutability),
2944    /// `&'lt self`, `&'lt mut self`
2945    Region(Option<Lifetime>, Mutability),
2946    /// `&'lt pin const self`, `&'lt pin mut self`
2947    Pinned(Option<Lifetime>, Mutability),
2948    /// `self: TYPE`, `mut self: TYPE`
2949    Explicit(Box<Ty>, Mutability),
2950}
2951
2952impl SelfKind {
2953    pub fn to_ref_suggestion(&self) -> String {
2954        match self {
2955            SelfKind::Region(None, mutbl) => mutbl.ref_prefix_str().to_string(),
2956            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()),
2957            SelfKind::Pinned(None, mutbl) => ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("&pin {0}", mutbl.ptr_str()))
    })format!("&pin {}", mutbl.ptr_str()),
2958            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()),
2959            SelfKind::Value(_) | SelfKind::Explicit(_, _) => {
2960                {
    ::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")
2961            }
2962        }
2963    }
2964}
2965
2966pub type ExplicitSelf = Spanned<SelfKind>;
2967
2968impl Param {
2969    /// Attempts to cast parameter to `ExplicitSelf`.
2970    pub fn to_self(&self) -> Option<ExplicitSelf> {
2971        if let PatKind::Ident(BindingMode(ByRef::No, mutbl), ident, _) = self.pat.kind {
2972            if ident.name == kw::SelfLower {
2973                return match self.ty.kind {
2974                    TyKind::ImplicitSelf => Some(respan(self.pat.span, SelfKind::Value(mutbl))),
2975                    TyKind::Ref(lt, MutTy { ref ty, mutbl }) if ty.kind.is_implicit_self() => {
2976                        Some(respan(self.pat.span, SelfKind::Region(lt, mutbl)))
2977                    }
2978                    TyKind::PinnedRef(lt, MutTy { ref ty, mutbl })
2979                        if ty.kind.is_implicit_self() =>
2980                    {
2981                        Some(respan(self.pat.span, SelfKind::Pinned(lt, mutbl)))
2982                    }
2983                    _ => Some(respan(
2984                        self.pat.span.to(self.ty.span),
2985                        SelfKind::Explicit(self.ty.clone(), mutbl),
2986                    )),
2987                };
2988            }
2989        }
2990        None
2991    }
2992
2993    /// Returns `true` if parameter is `self`.
2994    pub fn is_self(&self) -> bool {
2995        if let PatKind::Ident(_, ident, _) = self.pat.kind {
2996            ident.name == kw::SelfLower
2997        } else {
2998            false
2999        }
3000    }
3001
3002    /// Builds a `Param` object from `ExplicitSelf`.
3003    pub fn from_self(attrs: AttrVec, eself: ExplicitSelf, eself_ident: Ident) -> Param {
3004        let span = eself.span.to(eself_ident.span);
3005        let infer_ty =
3006            Box::new(Ty { id: DUMMY_NODE_ID, kind: TyKind::ImplicitSelf, span: eself_ident.span });
3007        let (mutbl, ty) = match eself.node {
3008            SelfKind::Explicit(ty, mutbl) => (mutbl, ty),
3009            SelfKind::Value(mutbl) => (mutbl, infer_ty),
3010            SelfKind::Region(lt, mutbl) => (
3011                Mutability::Not,
3012                Box::new(Ty {
3013                    id: DUMMY_NODE_ID,
3014                    kind: TyKind::Ref(lt, MutTy { ty: infer_ty, mutbl }),
3015                    span,
3016                }),
3017            ),
3018            SelfKind::Pinned(lt, mutbl) => (
3019                Mutability::Not,
3020                Box::new(Ty {
3021                    id: DUMMY_NODE_ID,
3022                    kind: TyKind::PinnedRef(lt, MutTy { ty: 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        }
3039    }
3040}
3041
3042/// A signature (not the body) of a function declaration.
3043///
3044/// E.g., `fn foo(bar: baz)`.
3045///
3046/// Please note that it's different from `FnHeader` structure
3047/// which contains metadata about function safety, asyncness, constness and ABI.
3048#[derive(#[automatically_derived]
impl ::core::clone::Clone for FnDecl {
    #[inline]
    fn clone(&self) -> FnDecl {
        FnDecl {
            inputs: ::core::clone::Clone::clone(&self.inputs),
            output: ::core::clone::Clone::clone(&self.output),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for FnDecl {
            fn encode(&self, __encoder: &mut __E) {
                let FnDecl { inputs: ref __binding_0, output: ref __binding_1
                        } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for FnDecl {
            fn decode(__decoder: &mut __D) -> Self {
                FnDecl {
                    inputs: ::rustc_serialize::Decodable::decode(__decoder),
                    output: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for FnDecl {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "FnDecl",
            "inputs", &self.inputs, "output", &&self.output)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for FnDecl where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    FnDecl { inputs: ref __binding_0, output: ref __binding_1 }
                        => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for FnDecl where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    FnDecl {
                        inputs: ref mut __binding_0, output: ref mut __binding_1 }
                        => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3049pub struct FnDecl {
3050    pub inputs: ThinVec<Param>,
3051    pub output: FnRetTy,
3052}
3053
3054impl FnDecl {
3055    pub fn has_self(&self) -> bool {
3056        self.inputs.get(0).is_some_and(Param::is_self)
3057    }
3058
3059    pub fn c_variadic(&self) -> bool {
3060        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))
3061    }
3062
3063    /// The marker index for "no splatted arguments".
3064    /// Higher values are also not supported, for performance reasons.
3065    ///
3066    /// Must have the same value as `FnSigKind::NO_SPLATTED_ARG_INDEX` and `FnDeclFlags::NO_SPLATTED_ARG_INDEX`.
3067    pub const NO_SPLATTED_ARG_INDEX: u8 = u8::MAX;
3068
3069    /// The maximum valid splatted argument index.
3070    pub const MAX_VALID_SPLATTED_ARG_INDEX: u8 = Self::NO_SPLATTED_ARG_INDEX - 1;
3071
3072    /// Returns a splatted argument index, if any are present.
3073    pub fn splatted(&self) -> Option<u8> {
3074        self.inputs.iter().enumerate().find_map(|(index, arg)| {
3075            if index >= usize::from(Self::NO_SPLATTED_ARG_INDEX) {
3076                // AST validation has already checked the splatted argument index is valid, so just
3077                // ignore invalid indexes here.
3078                None
3079            } else {
3080                arg.attrs
3081                    .iter()
3082                    .any(|attr| attr.has_name(sym::rustc_splat))
3083                    .then_some(u8::try_from(index).unwrap())
3084            }
3085        })
3086    }
3087}
3088
3089/// Is the trait definition an auto trait?
3090#[derive(#[automatically_derived]
impl ::core::marker::Copy for IsAuto { }Copy, #[automatically_derived]
impl ::core::clone::Clone for IsAuto {
    #[inline]
    fn clone(&self) -> IsAuto { *self }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for IsAuto {
    #[inline]
    fn eq(&self, other: &IsAuto) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for IsAuto {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        IsAuto::Yes => { 0usize }
                        IsAuto::No => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for IsAuto {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { IsAuto::Yes }
                    1usize => { IsAuto::No }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `IsAuto`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for IsAuto {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self { IsAuto::Yes => "Yes", IsAuto::No => "No", })
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for IsAuto {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self { IsAuto::Yes => {} IsAuto::No => {} }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for IsAuto where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self { IsAuto::Yes => {} IsAuto::No => {} }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for IsAuto where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self { IsAuto::Yes => {} IsAuto::No => {} }
            }
        }
    };Walkable)]
3091pub enum IsAuto {
3092    Yes,
3093    No,
3094}
3095
3096/// Safety of items.
3097#[derive(#[automatically_derived]
impl ::core::marker::Copy for Safety { }Copy, #[automatically_derived]
impl ::core::clone::Clone for Safety {
    #[inline]
    fn clone(&self) -> Safety {
        let _: ::core::clone::AssertParamIsClone<Span>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for Safety {
    #[inline]
    fn eq(&self, other: &Safety) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (Safety::Unsafe(__self_0), Safety::Unsafe(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Safety::Safe(__self_0), Safety::Safe(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Safety {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Span>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for Safety {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            Safety::Unsafe(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            Safety::Safe(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            _ => {}
        }
    }
}Hash, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Safety {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        Safety::Unsafe(ref __binding_0) => { 0usize }
                        Safety::Safe(ref __binding_0) => { 1usize }
                        Safety::Default => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    Safety::Unsafe(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    Safety::Safe(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    Safety::Default => {}
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Safety {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        Safety::Unsafe(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        Safety::Safe(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => { Safety::Default }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Safety`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Safety {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Safety::Unsafe(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Unsafe",
                    &__self_0),
            Safety::Safe(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Safe",
                    &__self_0),
            Safety::Default =>
                ::core::fmt::Formatter::write_str(f, "Default"),
        }
    }
}Debug)]
3098#[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)]
3099pub enum Safety {
3100    /// `unsafe` an item is explicitly marked as `unsafe`.
3101    Unsafe(Span),
3102    /// `safe` an item is explicitly marked as `safe`.
3103    Safe(Span),
3104    /// Default means no value was provided, it will take a default value given the context in
3105    /// which is used.
3106    Default,
3107}
3108
3109/// Describes the coroutine markers a function/closure has.
3110///
3111/// Coroutine markers are things that cause the function to generate a coroutine, such as `async`,
3112/// which makes the function return `impl Future`, or `gen`, which makes the function return `impl
3113/// Iterator`.
3114#[derive(#[automatically_derived]
impl ::core::marker::Copy for CoroutineMarker { }Copy, #[automatically_derived]
impl ::core::clone::Clone for CoroutineMarker {
    #[inline]
    fn clone(&self) -> CoroutineMarker {
        let _: ::core::clone::AssertParamIsClone<CoroutineKind>;
        let _: ::core::clone::AssertParamIsClone<Span>;
        let _: ::core::clone::AssertParamIsClone<NodeId>;
        *self
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for CoroutineMarker {
            fn encode(&self, __encoder: &mut __E) {
                let CoroutineMarker {
                        kind: ref __binding_0,
                        span: ref __binding_1,
                        closure_id: ref __binding_2,
                        return_impl_trait_id: ref __binding_3 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for CoroutineMarker {
            fn decode(__decoder: &mut __D) -> Self {
                CoroutineMarker {
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    closure_id: ::rustc_serialize::Decodable::decode(__decoder),
                    return_impl_trait_id: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for CoroutineMarker {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f,
            "CoroutineMarker", "kind", &self.kind, "span", &self.span,
            "closure_id", &self.closure_id, "return_impl_trait_id",
            &&self.return_impl_trait_id)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            CoroutineMarker where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    CoroutineMarker {
                        kind: ref __binding_0,
                        span: ref __binding_1,
                        closure_id: ref __binding_2,
                        return_impl_trait_id: ref __binding_3 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for CoroutineMarker where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    CoroutineMarker {
                        kind: ref mut __binding_0,
                        span: ref mut __binding_1,
                        closure_id: ref mut __binding_2,
                        return_impl_trait_id: ref mut __binding_3 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3115pub struct CoroutineMarker {
3116    pub kind: CoroutineKind,
3117    pub span: Span,
3118    pub closure_id: NodeId,
3119    /// The `NodeId` for the generated `impl Trait` item.
3120    pub return_impl_trait_id: NodeId,
3121}
3122
3123impl CoroutineMarker {
3124    pub fn new(kind: CoroutineKind, span: Span) -> Self {
3125        Self { kind, span, closure_id: DUMMY_NODE_ID, return_impl_trait_id: DUMMY_NODE_ID }
3126    }
3127}
3128
3129#[derive(#[automatically_derived]
impl ::core::marker::Copy for Const { }Copy, #[automatically_derived]
impl ::core::clone::Clone for Const {
    #[inline]
    fn clone(&self) -> Const {
        let _: ::core::clone::AssertParamIsClone<Span>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for Const {
    #[inline]
    fn eq(&self, other: &Const) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (Const::Yes(__self_0), Const::Yes(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Const {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Span>;
    }
}Eq, #[automatically_derived]
impl ::core::hash::Hash for Const {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            Const::Yes(__self_0) => ::core::hash::Hash::hash(__self_0, state),
            _ => {}
        }
    }
}Hash, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Const {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        Const::Yes(ref __binding_0) => { 0usize }
                        Const::No => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    Const::Yes(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    Const::No => {}
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Const {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        Const::Yes(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => { Const::No }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Const`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Const {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Const::Yes(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Yes",
                    &__self_0),
            Const::No => ::core::fmt::Formatter::write_str(f, "No"),
        }
    }
}Debug)]
3130#[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)]
3131pub enum Const {
3132    Yes(Span),
3133    No,
3134}
3135
3136/// Item defaultness.
3137/// For details see the [RFC #2532](https://github.com/rust-lang/rfcs/pull/2532).
3138#[derive(#[automatically_derived]
impl ::core::marker::Copy for Defaultness { }Copy, #[automatically_derived]
impl ::core::clone::Clone for Defaultness {
    #[inline]
    fn clone(&self) -> Defaultness {
        let _: ::core::clone::AssertParamIsClone<Span>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for Defaultness {
    #[inline]
    fn eq(&self, other: &Defaultness) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (Defaultness::Default(__self_0),
                    Defaultness::Default(__arg1_0)) => __self_0 == __arg1_0,
                (Defaultness::Final(__self_0), Defaultness::Final(__arg1_0))
                    => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Defaultness {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        Defaultness::Implicit => { 0usize }
                        Defaultness::Default(ref __binding_0) => { 1usize }
                        Defaultness::Final(ref __binding_0) => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    Defaultness::Implicit => {}
                    Defaultness::Default(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    Defaultness::Final(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Defaultness {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { Defaultness::Implicit }
                    1usize => {
                        Defaultness::Default(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        Defaultness::Final(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Defaultness`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Defaultness {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Defaultness::Implicit =>
                ::core::fmt::Formatter::write_str(f, "Implicit"),
            Defaultness::Default(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Default", &__self_0),
            Defaultness::Final(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Final",
                    &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for Defaultness
            {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    Defaultness::Implicit => {}
                    Defaultness::Default(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    Defaultness::Final(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Defaultness
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Defaultness::Implicit => {}
                    Defaultness::Default(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    Defaultness::Final(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Defaultness where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Defaultness::Implicit => {}
                    Defaultness::Default(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    Defaultness::Final(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3139pub enum Defaultness {
3140    /// Item is unmarked. Implicitly determined based off of position.
3141    /// For impls, this is `final`; for traits, this is `default`.
3142    ///
3143    /// If you're expanding an item in a built-in macro or parsing an item
3144    /// by hand, you probably want to use this.
3145    Implicit,
3146    /// `default`
3147    Default(Span),
3148    /// `final`; per RFC 3678, only trait items may be *explicitly* marked final.
3149    Final(Span),
3150}
3151
3152#[derive(#[automatically_derived]
impl ::core::marker::Copy for ImplPolarity { }Copy, #[automatically_derived]
impl ::core::clone::Clone for ImplPolarity {
    #[inline]
    fn clone(&self) -> ImplPolarity {
        let _: ::core::clone::AssertParamIsClone<Span>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for ImplPolarity {
    #[inline]
    fn eq(&self, other: &ImplPolarity) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (ImplPolarity::Negative(__self_0),
                    ImplPolarity::Negative(__arg1_0)) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ImplPolarity {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        ImplPolarity::Positive => { 0usize }
                        ImplPolarity::Negative(ref __binding_0) => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    ImplPolarity::Positive => {}
                    ImplPolarity::Negative(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ImplPolarity {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { ImplPolarity::Positive }
                    1usize => {
                        ImplPolarity::Negative(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `ImplPolarity`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for ImplPolarity
            {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    ImplPolarity::Positive => {}
                    ImplPolarity::Negative(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for ImplPolarity
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    ImplPolarity::Positive => {}
                    ImplPolarity::Negative(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for ImplPolarity where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    ImplPolarity::Positive => {}
                    ImplPolarity::Negative(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3153pub enum ImplPolarity {
3154    /// `impl Trait for Type`
3155    Positive,
3156    /// `impl !Trait for Type`
3157    Negative(Span),
3158}
3159
3160impl fmt::Debug for ImplPolarity {
3161    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3162        match *self {
3163            ImplPolarity::Positive => "positive".fmt(f),
3164            ImplPolarity::Negative(_) => "negative".fmt(f),
3165        }
3166    }
3167}
3168
3169/// The polarity of a trait bound.
3170#[derive(#[automatically_derived]
impl ::core::marker::Copy for BoundPolarity { }Copy, #[automatically_derived]
impl ::core::clone::Clone for BoundPolarity {
    #[inline]
    fn clone(&self) -> BoundPolarity {
        let _: ::core::clone::AssertParamIsClone<Span>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for BoundPolarity {
    #[inline]
    fn eq(&self, other: &BoundPolarity) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (BoundPolarity::Negative(__self_0),
                    BoundPolarity::Negative(__arg1_0)) => __self_0 == __arg1_0,
                (BoundPolarity::Maybe(__self_0),
                    BoundPolarity::Maybe(__arg1_0)) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for BoundPolarity {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Span>;
    }
}Eq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for BoundPolarity {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        BoundPolarity::Positive => { 0usize }
                        BoundPolarity::Negative(ref __binding_0) => { 1usize }
                        BoundPolarity::Maybe(ref __binding_0) => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    BoundPolarity::Positive => {}
                    BoundPolarity::Negative(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    BoundPolarity::Maybe(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for BoundPolarity {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { BoundPolarity::Positive }
                    1usize => {
                        BoundPolarity::Negative(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        BoundPolarity::Maybe(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `BoundPolarity`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for BoundPolarity {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            BoundPolarity::Positive =>
                ::core::fmt::Formatter::write_str(f, "Positive"),
            BoundPolarity::Negative(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Negative", &__self_0),
            BoundPolarity::Maybe(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Maybe",
                    &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::hash::Hash for BoundPolarity {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            BoundPolarity::Negative(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            BoundPolarity::Maybe(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            _ => {}
        }
    }
}Hash)]
3171#[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)]
3172pub enum BoundPolarity {
3173    /// `Type: Trait`
3174    Positive,
3175    /// `Type: !Trait`
3176    Negative(Span),
3177    /// `Type: ?Trait`
3178    Maybe(Span),
3179}
3180
3181impl BoundPolarity {
3182    pub fn as_str(self) -> &'static str {
3183        match self {
3184            Self::Positive => "",
3185            Self::Negative(_) => "!",
3186            Self::Maybe(_) => "?",
3187        }
3188    }
3189}
3190
3191/// The constness of a trait bound.
3192#[derive(#[automatically_derived]
impl ::core::marker::Copy for BoundConstness { }Copy, #[automatically_derived]
impl ::core::clone::Clone for BoundConstness {
    #[inline]
    fn clone(&self) -> BoundConstness {
        let _: ::core::clone::AssertParamIsClone<Span>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for BoundConstness {
    #[inline]
    fn eq(&self, other: &BoundConstness) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (BoundConstness::Always(__self_0),
                    BoundConstness::Always(__arg1_0)) => __self_0 == __arg1_0,
                (BoundConstness::Maybe(__self_0),
                    BoundConstness::Maybe(__arg1_0)) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for BoundConstness {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Span>;
    }
}Eq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for BoundConstness {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        BoundConstness::Never => { 0usize }
                        BoundConstness::Always(ref __binding_0) => { 1usize }
                        BoundConstness::Maybe(ref __binding_0) => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    BoundConstness::Never => {}
                    BoundConstness::Always(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    BoundConstness::Maybe(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for BoundConstness {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { BoundConstness::Never }
                    1usize => {
                        BoundConstness::Always(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        BoundConstness::Maybe(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `BoundConstness`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for BoundConstness {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            BoundConstness::Never =>
                ::core::fmt::Formatter::write_str(f, "Never"),
            BoundConstness::Always(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Always",
                    &__self_0),
            BoundConstness::Maybe(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Maybe",
                    &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::hash::Hash for BoundConstness {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state);
        match self {
            BoundConstness::Always(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            BoundConstness::Maybe(__self_0) =>
                ::core::hash::Hash::hash(__self_0, state),
            _ => {}
        }
    }
}Hash)]
3193#[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)]
3194pub enum BoundConstness {
3195    /// `Type: Trait`
3196    Never,
3197    /// `Type: const Trait`
3198    Always(Span),
3199    /// `Type: [const] Trait`
3200    Maybe(Span),
3201}
3202
3203impl BoundConstness {
3204    pub fn as_str(self) -> &'static str {
3205        match self {
3206            Self::Never => "",
3207            Self::Always(_) => "const",
3208            Self::Maybe(_) => "[const]",
3209        }
3210    }
3211}
3212
3213/// The asyncness of a trait bound.
3214#[derive(#[automatically_derived]
impl ::core::marker::Copy for BoundAsyncness { }Copy, #[automatically_derived]
impl ::core::clone::Clone for BoundAsyncness {
    #[inline]
    fn clone(&self) -> BoundAsyncness {
        let _: ::core::clone::AssertParamIsClone<Span>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for BoundAsyncness {
    #[inline]
    fn eq(&self, other: &BoundAsyncness) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (BoundAsyncness::Async(__self_0),
                    BoundAsyncness::Async(__arg1_0)) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for BoundAsyncness {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Span>;
    }
}Eq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for BoundAsyncness {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        BoundAsyncness::Normal => { 0usize }
                        BoundAsyncness::Async(ref __binding_0) => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    BoundAsyncness::Normal => {}
                    BoundAsyncness::Async(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for BoundAsyncness {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { BoundAsyncness::Normal }
                    1usize => {
                        BoundAsyncness::Async(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `BoundAsyncness`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for BoundAsyncness {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            BoundAsyncness::Normal =>
                ::core::fmt::Formatter::write_str(f, "Normal"),
            BoundAsyncness::Async(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Async",
                    &__self_0),
        }
    }
}Debug)]
3215#[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)]
3216pub enum BoundAsyncness {
3217    /// `Type: Trait`
3218    Normal,
3219    /// `Type: async Trait`
3220    Async(Span),
3221}
3222
3223impl BoundAsyncness {
3224    pub fn as_str(self) -> &'static str {
3225        match self {
3226            Self::Normal => "",
3227            Self::Async(_) => "async",
3228        }
3229    }
3230}
3231
3232#[derive(#[automatically_derived]
impl ::core::clone::Clone for FnRetTy {
    #[inline]
    fn clone(&self) -> FnRetTy {
        match self {
            FnRetTy::Default(__self_0) =>
                FnRetTy::Default(::core::clone::Clone::clone(__self_0)),
            FnRetTy::Ty(__self_0) =>
                FnRetTy::Ty(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for FnRetTy {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        FnRetTy::Default(ref __binding_0) => { 0usize }
                        FnRetTy::Ty(ref __binding_0) => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    FnRetTy::Default(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    FnRetTy::Ty(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for FnRetTy {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        FnRetTy::Default(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        FnRetTy::Ty(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `FnRetTy`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for FnRetTy {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            FnRetTy::Default(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Default", &__self_0),
            FnRetTy::Ty(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Ty",
                    &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for FnRetTy
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    FnRetTy::Default(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    FnRetTy::Ty(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for FnRetTy where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    FnRetTy::Default(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    FnRetTy::Ty(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3233pub enum FnRetTy {
3234    /// Returns type is not specified.
3235    ///
3236    /// Functions default to `()` and closures default to inference.
3237    /// Span points to where return type would be inserted.
3238    Default(Span),
3239    /// Everything else.
3240    Ty(Box<Ty>),
3241}
3242
3243impl FnRetTy {
3244    pub fn span(&self) -> Span {
3245        match self {
3246            &FnRetTy::Default(span) => span,
3247            FnRetTy::Ty(ty) => ty.span,
3248        }
3249    }
3250}
3251
3252#[derive(#[automatically_derived]
impl ::core::clone::Clone for Inline {
    #[inline]
    fn clone(&self) -> Inline {
        let _: ::core::clone::AssertParamIsClone<Result<(), ErrorGuaranteed>>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for Inline { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for Inline {
    #[inline]
    fn eq(&self, other: &Inline) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (Inline::No { had_parse_error: __self_0 }, Inline::No {
                    had_parse_error: __arg1_0 }) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Inline {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        Inline::Yes => { 0usize }
                        Inline::No { had_parse_error: ref __binding_0 } => {
                            1usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    Inline::Yes => {}
                    Inline::No { had_parse_error: ref __binding_0 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Inline {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { Inline::Yes }
                    1usize => {
                        Inline::No {
                            had_parse_error: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Inline`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Inline {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Inline::Yes => ::core::fmt::Formatter::write_str(f, "Yes"),
            Inline::No { had_parse_error: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "No",
                    "had_parse_error", &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Inline where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Inline::Yes => {}
                    Inline::No { had_parse_error: ref __binding_0 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Inline where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Inline::Yes => {}
                    Inline::No { had_parse_error: ref mut __binding_0 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3253pub enum Inline {
3254    Yes,
3255    No { had_parse_error: Result<(), ErrorGuaranteed> },
3256}
3257
3258/// Module item kind.
3259#[derive(#[automatically_derived]
impl ::core::clone::Clone for ModKind {
    #[inline]
    fn clone(&self) -> ModKind {
        match self {
            ModKind::Loaded(__self_0, __self_1, __self_2) =>
                ModKind::Loaded(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1),
                    ::core::clone::Clone::clone(__self_2)),
            ModKind::Unloaded => ModKind::Unloaded,
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ModKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        ModKind::Loaded(ref __binding_0, ref __binding_1,
                            ref __binding_2) => {
                            0usize
                        }
                        ModKind::Unloaded => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    ModKind::Loaded(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    ModKind::Unloaded => {}
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ModKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        ModKind::Loaded(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => { ModKind::Unloaded }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `ModKind`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ModKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            ModKind::Loaded(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Loaded",
                    __self_0, __self_1, &__self_2),
            ModKind::Unloaded =>
                ::core::fmt::Formatter::write_str(f, "Unloaded"),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for ModKind
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    ModKind::Loaded(ref __binding_0, ref __binding_1,
                        ref __binding_2) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    ModKind::Unloaded => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for ModKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    ModKind::Loaded(ref mut __binding_0, ref mut __binding_1,
                        ref mut __binding_2) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                    ModKind::Unloaded => {}
                }
            }
        }
    };Walkable)]
3260pub enum ModKind {
3261    /// Module with inlined definition `mod foo { ... }`,
3262    /// or with definition outlined to a separate file `mod foo;` and already loaded from it.
3263    /// The inner span is from the first token past `{` to the last token until `}`,
3264    /// or from the first to the last token in the loaded file.
3265    Loaded(ThinVec<Box<Item>>, Inline, ModSpans),
3266    /// Module with definition outlined to a separate file `mod foo;` but not yet loaded from it.
3267    Unloaded,
3268}
3269
3270#[derive(#[automatically_derived]
impl ::core::marker::Copy for ModSpans { }Copy, #[automatically_derived]
impl ::core::clone::Clone for ModSpans {
    #[inline]
    fn clone(&self) -> ModSpans {
        let _: ::core::clone::AssertParamIsClone<Span>;
        *self
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ModSpans {
            fn encode(&self, __encoder: &mut __E) {
                let ModSpans {
                        inner_span: ref __binding_0,
                        inject_use_span: ref __binding_1 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ModSpans {
            fn decode(__decoder: &mut __D) -> Self {
                ModSpans {
                    inner_span: ::rustc_serialize::Decodable::decode(__decoder),
                    inject_use_span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ModSpans {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "ModSpans",
            "inner_span", &self.inner_span, "inject_use_span",
            &&self.inject_use_span)
    }
}Debug, #[automatically_derived]
impl ::core::default::Default for ModSpans {
    #[inline]
    fn default() -> ModSpans {
        ModSpans {
            inner_span: ::core::default::Default::default(),
            inject_use_span: ::core::default::Default::default(),
        }
    }
}Default, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for ModSpans
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    ModSpans {
                        inner_span: ref __binding_0,
                        inject_use_span: ref __binding_1 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for ModSpans where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    ModSpans {
                        inner_span: ref mut __binding_0,
                        inject_use_span: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3271pub struct ModSpans {
3272    /// `inner_span` covers the body of the module; for a file module, its the whole file.
3273    /// For an inline module, its the span inside the `{ ... }`, not including the curly braces.
3274    pub inner_span: Span,
3275    pub inject_use_span: Span,
3276}
3277
3278/// Foreign module declaration.
3279///
3280/// E.g., `extern { .. }` or `extern "C" { .. }`.
3281#[derive(#[automatically_derived]
impl ::core::clone::Clone for ForeignMod {
    #[inline]
    fn clone(&self) -> ForeignMod {
        ForeignMod {
            extern_span: ::core::clone::Clone::clone(&self.extern_span),
            safety: ::core::clone::Clone::clone(&self.safety),
            abi: ::core::clone::Clone::clone(&self.abi),
            items: ::core::clone::Clone::clone(&self.items),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ForeignMod {
            fn encode(&self, __encoder: &mut __E) {
                let ForeignMod {
                        extern_span: ref __binding_0,
                        safety: ref __binding_1,
                        abi: ref __binding_2,
                        items: ref __binding_3 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ForeignMod {
            fn decode(__decoder: &mut __D) -> Self {
                ForeignMod {
                    extern_span: ::rustc_serialize::Decodable::decode(__decoder),
                    safety: ::rustc_serialize::Decodable::decode(__decoder),
                    abi: ::rustc_serialize::Decodable::decode(__decoder),
                    items: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ForeignMod {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "ForeignMod",
            "extern_span", &self.extern_span, "safety", &self.safety, "abi",
            &self.abi, "items", &&self.items)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for ForeignMod
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    ForeignMod {
                        extern_span: ref __binding_0,
                        safety: ref __binding_1,
                        abi: ref __binding_2,
                        items: ref __binding_3 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for ForeignMod where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    ForeignMod {
                        extern_span: ref mut __binding_0,
                        safety: ref mut __binding_1,
                        abi: ref mut __binding_2,
                        items: ref mut __binding_3 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3282pub struct ForeignMod {
3283    /// Span of the `extern` keyword.
3284    pub extern_span: Span,
3285    /// `unsafe` keyword accepted syntactically for macro DSLs, but not
3286    /// semantically by Rust.
3287    pub safety: Safety,
3288    pub abi: Option<StrLit>,
3289    pub items: ThinVec<Box<ForeignItem>>,
3290}
3291
3292#[derive(#[automatically_derived]
impl ::core::clone::Clone for EnumDef {
    #[inline]
    fn clone(&self) -> EnumDef {
        EnumDef { variants: ::core::clone::Clone::clone(&self.variants) }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for EnumDef {
            fn encode(&self, __encoder: &mut __E) {
                let EnumDef { variants: ref __binding_0 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for EnumDef {
            fn decode(__decoder: &mut __D) -> Self {
                EnumDef {
                    variants: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for EnumDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field1_finish(f, "EnumDef",
            "variants", &&self.variants)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for EnumDef
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    EnumDef { variants: ref __binding_0 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for EnumDef where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    EnumDef { variants: ref mut __binding_0 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3293pub struct EnumDef {
3294    pub variants: ThinVec<Variant>,
3295}
3296
3297/// Enum variant.
3298#[derive(#[automatically_derived]
impl ::core::clone::Clone for Variant {
    #[inline]
    fn clone(&self) -> Variant {
        Variant {
            attrs: ::core::clone::Clone::clone(&self.attrs),
            id: ::core::clone::Clone::clone(&self.id),
            span: ::core::clone::Clone::clone(&self.span),
            vis: ::core::clone::Clone::clone(&self.vis),
            ident: ::core::clone::Clone::clone(&self.ident),
            data: ::core::clone::Clone::clone(&self.data),
            disr_expr: ::core::clone::Clone::clone(&self.disr_expr),
            is_placeholder: ::core::clone::Clone::clone(&self.is_placeholder),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Variant {
            fn encode(&self, __encoder: &mut __E) {
                let Variant {
                        attrs: ref __binding_0,
                        id: ref __binding_1,
                        span: ref __binding_2,
                        vis: ref __binding_3,
                        ident: ref __binding_4,
                        data: ref __binding_5,
                        disr_expr: ref __binding_6,
                        is_placeholder: ref __binding_7 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_5,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_6,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_7,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Variant {
            fn decode(__decoder: &mut __D) -> Self {
                Variant {
                    attrs: ::rustc_serialize::Decodable::decode(__decoder),
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    vis: ::rustc_serialize::Decodable::decode(__decoder),
                    ident: ::rustc_serialize::Decodable::decode(__decoder),
                    data: ::rustc_serialize::Decodable::decode(__decoder),
                    disr_expr: ::rustc_serialize::Decodable::decode(__decoder),
                    is_placeholder: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Variant {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["attrs", "id", "span", "vis", "ident", "data", "disr_expr",
                        "is_placeholder"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.attrs, &self.id, &self.span, &self.vis, &self.ident,
                        &self.data, &self.disr_expr, &&self.is_placeholder];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "Variant",
            names, values)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Variant
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Variant {
                        attrs: ref __binding_0,
                        id: ref __binding_1,
                        span: ref __binding_2,
                        vis: ref __binding_3,
                        ident: ref __binding_4,
                        data: ref __binding_5,
                        disr_expr: ref __binding_6,
                        is_placeholder: ref __binding_7 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_5,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_6,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_7,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Variant where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Variant {
                        attrs: ref mut __binding_0,
                        id: ref mut __binding_1,
                        span: ref mut __binding_2,
                        vis: ref mut __binding_3,
                        ident: ref mut __binding_4,
                        data: ref mut __binding_5,
                        disr_expr: ref mut __binding_6,
                        is_placeholder: ref mut __binding_7 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_5,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_6,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_7,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3299pub struct Variant {
3300    /// Attributes of the variant.
3301    pub attrs: AttrVec,
3302    /// Id of the variant (not the constructor, see `VariantData::ctor_id()`).
3303    pub id: NodeId,
3304    /// Span
3305    pub span: Span,
3306    /// The visibility of the variant. Syntactically accepted but not semantically.
3307    pub vis: Visibility,
3308    /// Name of the variant.
3309    pub ident: Ident,
3310
3311    /// Fields and constructor id of the variant.
3312    pub data: VariantData,
3313    /// Explicit discriminant, e.g., `Foo = 1`.
3314    pub disr_expr: Option<AnonConst>,
3315    /// Is a macro placeholder.
3316    pub is_placeholder: bool,
3317}
3318
3319/// Part of `use` item to the right of its prefix.
3320#[derive(#[automatically_derived]
impl ::core::clone::Clone for UseTreeKind {
    #[inline]
    fn clone(&self) -> UseTreeKind {
        match self {
            UseTreeKind::Simple(__self_0) =>
                UseTreeKind::Simple(::core::clone::Clone::clone(__self_0)),
            UseTreeKind::Nested { items: __self_0, span: __self_1 } =>
                UseTreeKind::Nested {
                    items: ::core::clone::Clone::clone(__self_0),
                    span: ::core::clone::Clone::clone(__self_1),
                },
            UseTreeKind::Glob(__self_0) =>
                UseTreeKind::Glob(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for UseTreeKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        UseTreeKind::Simple(ref __binding_0) => { 0usize }
                        UseTreeKind::Nested {
                            items: ref __binding_0, span: ref __binding_1 } => {
                            1usize
                        }
                        UseTreeKind::Glob(ref __binding_0) => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    UseTreeKind::Simple(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    UseTreeKind::Nested {
                        items: ref __binding_0, span: ref __binding_1 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    UseTreeKind::Glob(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for UseTreeKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        UseTreeKind::Simple(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        UseTreeKind::Nested {
                            items: ::rustc_serialize::Decodable::decode(__decoder),
                            span: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    2usize => {
                        UseTreeKind::Glob(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `UseTreeKind`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for UseTreeKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            UseTreeKind::Simple(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Simple",
                    &__self_0),
            UseTreeKind::Nested { items: __self_0, span: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "Nested", "items", __self_0, "span", &__self_1),
            UseTreeKind::Glob(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Glob",
                    &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for UseTreeKind
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    UseTreeKind::Simple(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    UseTreeKind::Nested {
                        items: ref __binding_0, span: ref __binding_1 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    UseTreeKind::Glob(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for UseTreeKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    UseTreeKind::Simple(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    UseTreeKind::Nested {
                        items: ref mut __binding_0, span: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                    UseTreeKind::Glob(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3321pub enum UseTreeKind {
3322    /// `use prefix` or `use prefix as rename`
3323    Simple(Option<Ident>),
3324    /// `use prefix::{...}`
3325    ///
3326    /// The span represents the braces of the nested group and all elements within:
3327    ///
3328    /// ```text
3329    /// use foo::{bar, baz};
3330    ///          ^^^^^^^^^^
3331    /// ```
3332    Nested { items: ThinVec<(UseTree, NodeId)>, span: Span },
3333    /// `use prefix::*`
3334    Glob(Span),
3335}
3336
3337/// A tree of paths sharing common prefixes.
3338/// Used in `use` items both at top-level and inside of braces in import groups.
3339#[derive(#[automatically_derived]
impl ::core::clone::Clone for UseTree {
    #[inline]
    fn clone(&self) -> UseTree {
        UseTree {
            prefix: ::core::clone::Clone::clone(&self.prefix),
            kind: ::core::clone::Clone::clone(&self.kind),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for UseTree {
            fn encode(&self, __encoder: &mut __E) {
                let UseTree { prefix: ref __binding_0, kind: ref __binding_1
                        } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for UseTree {
            fn decode(__decoder: &mut __D) -> Self {
                UseTree {
                    prefix: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for UseTree {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "UseTree",
            "prefix", &self.prefix, "kind", &&self.kind)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for UseTree
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    UseTree { prefix: ref __binding_0, kind: ref __binding_1 }
                        => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for UseTree where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    UseTree {
                        prefix: ref mut __binding_0, kind: ref mut __binding_1 } =>
                        {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3340pub struct UseTree {
3341    pub prefix: Path,
3342    pub kind: UseTreeKind,
3343}
3344
3345impl UseTree {
3346    /// If the `UseTree` is just an identifier, return that.
3347    /// Panics if it's a glob (`*`) or a nested use tree.
3348    pub fn ident(&self) -> Ident {
3349        match self.kind {
3350            UseTreeKind::Simple(Some(rename)) => rename,
3351            UseTreeKind::Simple(None) => {
3352                self.prefix.segments.last().expect("empty prefix in a simple import").ident
3353            }
3354            _ => {
    ::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"),
3355        }
3356    }
3357
3358    /// Returns the full span from the start of the path to the
3359    /// closing `}` or nested spans, `*` of glob spans or the end of the
3360    /// identifier of simple spans.
3361    pub fn span(&self) -> Span {
3362        self.prefix.span.to(self.hi_span())
3363    }
3364
3365    /// Returns the trailing element's span. So for a nested
3366    /// span you get the entire `{}`-block, for a glob you
3367    /// get the span of the `*` itself, and for simple use trees
3368    /// you get the identifier to rename the import to or the full
3369    /// path if no rename is specified.
3370    pub fn hi_span(&self) -> Span {
3371        match self.kind {
3372            UseTreeKind::Simple(None) => self.prefix.span,
3373            UseTreeKind::Simple(Some(name)) => name.span,
3374            UseTreeKind::Nested { span, .. } => span,
3375            UseTreeKind::Glob(span) => span,
3376        }
3377    }
3378}
3379
3380/// Distinguishes between `Attribute`s that decorate items and Attributes that
3381/// are contained as statements within items. These two cases need to be
3382/// distinguished for pretty-printing.
3383#[derive(#[automatically_derived]
impl ::core::clone::Clone for AttrStyle {
    #[inline]
    fn clone(&self) -> AttrStyle { *self }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for AttrStyle {
    #[inline]
    fn eq(&self, other: &AttrStyle) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for AttrStyle {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for AttrStyle {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        ::core::hash::Hash::hash(&__self_discr, state)
    }
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for AttrStyle {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                AttrStyle::Outer => "Outer",
                AttrStyle::Inner => "Inner",
            })
    }
}Debug, #[automatically_derived]
impl ::core::marker::Copy for AttrStyle { }Copy)]
3384#[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)]
3385pub enum AttrStyle {
3386    Outer,
3387    Inner,
3388}
3389
3390impl AttrStyle {
3391    pub fn line_doc_comment_prefix(self) -> &'static str {
3392        match self {
3393            AttrStyle::Outer => "///",
3394            AttrStyle::Inner => "//!",
3395        }
3396    }
3397}
3398
3399/// A list of attributes.
3400pub type AttrVec = ThinVec<Attribute>;
3401
3402/// A syntax-level representation of an attribute.
3403#[derive(#[automatically_derived]
impl ::core::clone::Clone for Attribute {
    #[inline]
    fn clone(&self) -> Attribute {
        Attribute {
            kind: ::core::clone::Clone::clone(&self.kind),
            id: ::core::clone::Clone::clone(&self.id),
            style: ::core::clone::Clone::clone(&self.style),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Attribute {
            fn encode(&self, __encoder: &mut __E) {
                let Attribute {
                        kind: ref __binding_0,
                        id: ref __binding_1,
                        style: ref __binding_2,
                        span: ref __binding_3 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Attribute {
            fn decode(__decoder: &mut __D) -> Self {
                Attribute {
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    style: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Attribute {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "Attribute",
            "kind", &self.kind, "id", &self.id, "style", &self.style, "span",
            &&self.span)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Attribute
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Attribute {
                        kind: ref __binding_0,
                        id: ref __binding_1,
                        style: ref __binding_2,
                        span: ref __binding_3 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Attribute where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Attribute {
                        kind: ref mut __binding_0,
                        id: ref mut __binding_1,
                        style: ref mut __binding_2,
                        span: ref mut __binding_3 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3404pub struct Attribute {
3405    pub kind: AttrKind,
3406    pub id: AttrId,
3407    /// Denotes if the attribute decorates the following construct (outer)
3408    /// or the construct this attribute is contained within (inner).
3409    pub style: AttrStyle,
3410
3411    /// The carets in the examples below show the spans for various cases.
3412    /// ```text
3413    /// #[foo]                  - A vanilla parsed attribute.
3414    /// ^^^^^^                  - Its span covers it all.
3415    ///
3416    /// /** abc */  /// xyz     - A parsed doc comment.
3417    /// ^^^^^^^^^^  ^^^^^^^     - Its span covers the text and comment marker(s).
3418    ///                         - The same span is also used if the doc comment is desugared (into
3419    ///                           a new normal `#[doc = r"..."]` attribute) by
3420    ///                           `desugar_doc_comments` before being passed to a macro (which
3421    ///                           is done so that `#[$m:meta]` will match).
3422    ///
3423    /// #[cfg_attr(pred, foo)]  - A parsed `cfg_attr` attribute.
3424    /// ^^^^^^^^^^^^^^^^^^^^^^  - Its span covers it all.
3425    ///                  ^^^    - Span of the new replacement attribute (equivalent to `#[foo]`)
3426    ///                           created by `cfg_attr` expansion (if `pred` is true).
3427    /// ^^^^^^^^^^^^^^^^^^^^^^  - Span of the synthetic `CfgAttrTrace` attribute created by
3428    ///                           `cfg_attr` expansion. (`CfgTrace` is derived from `#[cfg(..)]` and
3429    ///                           handled similarly.)
3430    /// ```
3431    /// Finally, for compiler-generated attributes the span is whatever the construction site
3432    /// chooses. Usually `DUMMY_SP` or some relevant span from the source code.
3433    pub span: Span,
3434}
3435
3436#[derive(#[automatically_derived]
impl ::core::clone::Clone for AttrKind {
    #[inline]
    fn clone(&self) -> AttrKind {
        match self {
            AttrKind::Normal(__self_0) =>
                AttrKind::Normal(::core::clone::Clone::clone(__self_0)),
            AttrKind::Synthetic(__self_0) =>
                AttrKind::Synthetic(::core::clone::Clone::clone(__self_0)),
            AttrKind::DocComment(__self_0, __self_1) =>
                AttrKind::DocComment(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for AttrKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        AttrKind::Normal(ref __binding_0) => { 0usize }
                        AttrKind::Synthetic(ref __binding_0) => { 1usize }
                        AttrKind::DocComment(ref __binding_0, ref __binding_1) => {
                            2usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    AttrKind::Normal(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AttrKind::Synthetic(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    AttrKind::DocComment(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for AttrKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        AttrKind::Normal(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        AttrKind::Synthetic(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        AttrKind::DocComment(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `AttrKind`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for AttrKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            AttrKind::Normal(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Normal",
                    &__self_0),
            AttrKind::Synthetic(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Synthetic", &__self_0),
            AttrKind::DocComment(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "DocComment", __self_0, &__self_1),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for AttrKind
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    AttrKind::Normal(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    AttrKind::Synthetic(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    AttrKind::DocComment(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for AttrKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    AttrKind::Normal(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    AttrKind::Synthetic(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    AttrKind::DocComment(ref mut __binding_0,
                        ref mut __binding_1) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3437pub enum AttrKind {
3438    /// A normal attribute.
3439    Normal(Box<NormalAttr>),
3440
3441    /// A synthetic attribute inserted by the compiler.
3442    Synthetic(Box<SyntheticAttr>),
3443
3444    /// A doc comment (e.g. `/// ...`, `//! ...`, `/** ... */`, `/*! ... */`).
3445    /// Doc attributes (e.g. `#[doc="..."]`) are represented with the `Normal`
3446    /// variant (which is much less compact and thus more expensive).
3447    DocComment(CommentKind, Symbol),
3448}
3449
3450#[derive(#[automatically_derived]
impl ::core::clone::Clone for NormalAttr {
    #[inline]
    fn clone(&self) -> NormalAttr {
        NormalAttr {
            item: ::core::clone::Clone::clone(&self.item),
            tokens: ::core::clone::Clone::clone(&self.tokens),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for NormalAttr {
            fn encode(&self, __encoder: &mut __E) {
                let NormalAttr {
                        item: ref __binding_0, tokens: ref __binding_1 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for NormalAttr {
            fn decode(__decoder: &mut __D) -> Self {
                NormalAttr {
                    item: ::rustc_serialize::Decodable::decode(__decoder),
                    tokens: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for NormalAttr {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "NormalAttr",
            "item", &self.item, "tokens", &&self.tokens)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for NormalAttr
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    NormalAttr { item: ref __binding_0, tokens: ref __binding_1
                        } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for NormalAttr where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    NormalAttr {
                        item: ref mut __binding_0, tokens: ref mut __binding_1 } =>
                        {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3451pub struct NormalAttr {
3452    pub item: AttrItem,
3453    // Tokens for the full attribute, e.g. `#[foo]`, `#![bar]`. (Compare this with
3454    // `ParseNtResult::Meta`; `expand_cfg_attr_item` is where the two cases interact.)
3455    pub tokens: Option<LazyAttrTokenStream>,
3456}
3457
3458impl NormalAttr {
3459    pub fn from_ident(ident: Ident) -> Self {
3460        Self {
3461            item: AttrItem {
3462                unsafety: Safety::Default,
3463                path: Path::from_ident(ident),
3464                args: AttrArgs::Empty,
3465                span: ident.span,
3466            },
3467            tokens: None,
3468        }
3469    }
3470}
3471
3472#[derive(#[automatically_derived]
impl ::core::clone::Clone for AttrItem {
    #[inline]
    fn clone(&self) -> AttrItem {
        AttrItem {
            unsafety: ::core::clone::Clone::clone(&self.unsafety),
            path: ::core::clone::Clone::clone(&self.path),
            args: ::core::clone::Clone::clone(&self.args),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for AttrItem {
            fn encode(&self, __encoder: &mut __E) {
                let AttrItem {
                        unsafety: ref __binding_0,
                        path: ref __binding_1,
                        args: ref __binding_2,
                        span: ref __binding_3 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for AttrItem {
            fn decode(__decoder: &mut __D) -> Self {
                AttrItem {
                    unsafety: ::rustc_serialize::Decodable::decode(__decoder),
                    path: ::rustc_serialize::Decodable::decode(__decoder),
                    args: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for AttrItem {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "AttrItem",
            "unsafety", &self.unsafety, "path", &self.path, "args",
            &self.args, "span", &&self.span)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for AttrItem
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    AttrItem {
                        unsafety: ref __binding_0,
                        path: ref __binding_1,
                        args: ref __binding_2,
                        span: ref __binding_3 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for AttrItem where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    AttrItem {
                        unsafety: ref mut __binding_0,
                        path: ref mut __binding_1,
                        args: ref mut __binding_2,
                        span: ref mut __binding_3 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3473pub struct AttrItem {
3474    pub unsafety: Safety,
3475    pub path: Path,
3476    pub args: AttrArgs,
3477    /// The span of the entire attr item. For parse attrs this excludes `#[`/`]`. E.g.:
3478    /// ```ignore (illustrative)
3479    /// #[foo(bar)]
3480    ///   ^^^^^^^^
3481    /// #[unsafe(no_mangle)]
3482    ///   ^^^^^^^^^^^^^^^^^
3483    /// ```
3484    /// For internally constructed spans (`mk_attr_*`) the exact meaning may differ.
3485    pub span: Span,
3486}
3487
3488/// A synthetic attribute.
3489///
3490/// Synthetic attributes are inserted by the compiler. They cannot be written in source code, and
3491/// so cannot be pretty-printed by the AST pretty printer (because its output should be valid Rust
3492/// code). They receive special treatment because they must not affect observable language
3493/// behaviour: they are invisible to proc macros and are unable to re-enter the parser.
3494#[derive(#[automatically_derived]
impl ::core::clone::Clone for SyntheticAttr {
    #[inline]
    fn clone(&self) -> SyntheticAttr {
        match self {
            SyntheticAttr::CfgTrace(__self_0) =>
                SyntheticAttr::CfgTrace(::core::clone::Clone::clone(__self_0)),
            SyntheticAttr::CfgAttrTrace(__self_0) =>
                SyntheticAttr::CfgAttrTrace(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for SyntheticAttr {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        SyntheticAttr::CfgTrace(ref __binding_0) => { 0usize }
                        SyntheticAttr::CfgAttrTrace(ref __binding_0) => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    SyntheticAttr::CfgTrace(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    SyntheticAttr::CfgAttrTrace(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for SyntheticAttr {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        SyntheticAttr::CfgTrace(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    1usize => {
                        SyntheticAttr::CfgAttrTrace(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `SyntheticAttr`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for SyntheticAttr {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            SyntheticAttr::CfgTrace(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "CfgTrace", &__self_0),
            SyntheticAttr::CfgAttrTrace(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "CfgAttrTrace", &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for
            SyntheticAttr {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    SyntheticAttr::CfgTrace(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    SyntheticAttr::CfgAttrTrace(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
3495pub enum SyntheticAttr {
3496    /// This synthetic attribute is added by the compiler when a `cfg` attribute is expanded so that
3497    /// subsequent code can tell that conditional compilation occurred. A `#[cfg(pred)]` with a
3498    /// true predicate is replaced by a synthetic `CfgTrace` attribute that records the parsed
3499    /// predicate. A `#[cfg(pred)]` with a false predicate leaves no trace because there is no node
3500    /// left to annotate.
3501    ///
3502    /// The attribute is used for some diagnostics, by rustdoc (for detecting feature usage), and
3503    /// by some clippy lints.
3504    CfgTrace(CfgEntry),
3505
3506    /// This synthetic attribute is added by the compiler when a `cfg_attr` attribute is expanded so
3507    /// that subsequent code can tell that conditional compilation occurred. A `#[cfg_attr(pred,
3508    /// attrs)]` is replaced by a synthetic `CfgAttrTrace` attribute whether the predicate
3509    /// evaluated true or not (or even failed to parse). The `pred` and `attrs` are not recorded
3510    /// because they are not needed.
3511    ///
3512    /// The attribute is used by rustdoc to display `doc_cfg` information and by some clippy lints.
3513    CfgAttrTrace(CfgEntry),
3514}
3515
3516impl AttrItem {
3517    pub fn is_valid_for_outer_style(&self) -> bool {
3518        self.path == sym::cfg_attr
3519            || self.path == sym::cfg
3520            || self.path == sym::forbid
3521            || self.path == sym::warn
3522            || self.path == sym::allow
3523            || self.path == sym::deny
3524            || self.path == sym::expect
3525    }
3526}
3527
3528/// `TraitRef`s appear in impls.
3529///
3530/// Resolution maps each `TraitRef`'s `ref_id` to its defining trait; that's all
3531/// that the `ref_id` is for. The `impl_id` maps to the "self type" of this impl.
3532/// If this impl is an `ItemKind::Impl`, the `impl_id` is redundant (it could be the
3533/// same as the impl's `NodeId`).
3534#[derive(#[automatically_derived]
impl ::core::clone::Clone for TraitRef {
    #[inline]
    fn clone(&self) -> TraitRef {
        TraitRef {
            path: ::core::clone::Clone::clone(&self.path),
            ref_id: ::core::clone::Clone::clone(&self.ref_id),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for TraitRef {
            fn encode(&self, __encoder: &mut __E) {
                let TraitRef { path: ref __binding_0, ref_id: ref __binding_1
                        } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for TraitRef {
            fn decode(__decoder: &mut __D) -> Self {
                TraitRef {
                    path: ::rustc_serialize::Decodable::decode(__decoder),
                    ref_id: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for TraitRef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "TraitRef",
            "path", &self.path, "ref_id", &&self.ref_id)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for TraitRef
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    TraitRef { path: ref __binding_0, ref_id: ref __binding_1 }
                        => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for TraitRef where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    TraitRef {
                        path: ref mut __binding_0, ref_id: ref mut __binding_1 } =>
                        {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3535pub struct TraitRef {
3536    pub path: Path,
3537    pub ref_id: NodeId,
3538}
3539
3540/// Whether enclosing parentheses are present or not.
3541#[derive(#[automatically_derived]
impl ::core::clone::Clone for Parens {
    #[inline]
    fn clone(&self) -> Parens {
        match self { Parens::Yes => Parens::Yes, Parens::No => Parens::No, }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Parens {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        Parens::Yes => { 0usize }
                        Parens::No => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Parens {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { Parens::Yes }
                    1usize => { Parens::No }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Parens`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Parens {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self { Parens::Yes => "Yes", Parens::No => "No", })
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Parens where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self { Parens::Yes => {} Parens::No => {} }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Parens where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self { Parens::Yes => {} Parens::No => {} }
            }
        }
    };Walkable)]
3542pub enum Parens {
3543    Yes,
3544    No,
3545}
3546
3547#[derive(#[automatically_derived]
impl ::core::clone::Clone for PolyTraitRef {
    #[inline]
    fn clone(&self) -> PolyTraitRef {
        PolyTraitRef {
            bound_generic_params: ::core::clone::Clone::clone(&self.bound_generic_params),
            modifiers: ::core::clone::Clone::clone(&self.modifiers),
            trait_ref: ::core::clone::Clone::clone(&self.trait_ref),
            span: ::core::clone::Clone::clone(&self.span),
            parens: ::core::clone::Clone::clone(&self.parens),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for PolyTraitRef {
            fn encode(&self, __encoder: &mut __E) {
                let PolyTraitRef {
                        bound_generic_params: ref __binding_0,
                        modifiers: ref __binding_1,
                        trait_ref: ref __binding_2,
                        span: ref __binding_3,
                        parens: ref __binding_4 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for PolyTraitRef {
            fn decode(__decoder: &mut __D) -> Self {
                PolyTraitRef {
                    bound_generic_params: ::rustc_serialize::Decodable::decode(__decoder),
                    modifiers: ::rustc_serialize::Decodable::decode(__decoder),
                    trait_ref: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    parens: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for PolyTraitRef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field5_finish(f, "PolyTraitRef",
            "bound_generic_params", &self.bound_generic_params, "modifiers",
            &self.modifiers, "trait_ref", &self.trait_ref, "span", &self.span,
            "parens", &&self.parens)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for PolyTraitRef
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    PolyTraitRef {
                        bound_generic_params: ref __binding_0,
                        modifiers: ref __binding_1,
                        trait_ref: ref __binding_2,
                        span: ref __binding_3,
                        parens: ref __binding_4 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for PolyTraitRef where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    PolyTraitRef {
                        bound_generic_params: ref mut __binding_0,
                        modifiers: ref mut __binding_1,
                        trait_ref: ref mut __binding_2,
                        span: ref mut __binding_3,
                        parens: ref mut __binding_4 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3548pub struct PolyTraitRef {
3549    /// The `'a` in `for<'a> Foo<&'a T>`.
3550    pub bound_generic_params: ThinVec<GenericParam>,
3551
3552    // Optional constness, asyncness, or polarity.
3553    pub modifiers: TraitBoundModifiers,
3554
3555    /// The `Foo<&'a T>` in `<'a> Foo<&'a T>`.
3556    pub trait_ref: TraitRef,
3557
3558    pub span: Span,
3559
3560    /// When `Yes`, the first and last character of `span` are an opening
3561    /// and a closing paren respectively.
3562    pub parens: Parens,
3563}
3564
3565impl PolyTraitRef {
3566    pub fn new(
3567        generic_params: ThinVec<GenericParam>,
3568        path: Path,
3569        modifiers: TraitBoundModifiers,
3570        span: Span,
3571        parens: Parens,
3572    ) -> Self {
3573        PolyTraitRef {
3574            bound_generic_params: generic_params,
3575            modifiers,
3576            trait_ref: TraitRef { path, ref_id: DUMMY_NODE_ID },
3577            span,
3578            parens,
3579        }
3580    }
3581}
3582
3583#[derive(#[automatically_derived]
impl ::core::clone::Clone for Visibility {
    #[inline]
    fn clone(&self) -> Visibility {
        Visibility {
            kind: ::core::clone::Clone::clone(&self.kind),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Visibility {
            fn encode(&self, __encoder: &mut __E) {
                let Visibility { kind: ref __binding_0, span: ref __binding_1
                        } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Visibility {
            fn decode(__decoder: &mut __D) -> Self {
                Visibility {
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Visibility {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "Visibility",
            "kind", &self.kind, "span", &&self.span)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Visibility
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Visibility { kind: ref __binding_0, span: ref __binding_1 }
                        => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Visibility where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Visibility {
                        kind: ref mut __binding_0, span: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3584pub struct Visibility {
3585    pub kind: VisibilityKind,
3586    pub span: Span,
3587}
3588
3589#[derive(#[automatically_derived]
impl ::core::clone::Clone for VisibilityKind {
    #[inline]
    fn clone(&self) -> VisibilityKind {
        match self {
            VisibilityKind::Public => VisibilityKind::Public,
            VisibilityKind::Restricted {
                path: __self_0, id: __self_1, shorthand: __self_2 } =>
                VisibilityKind::Restricted {
                    path: ::core::clone::Clone::clone(__self_0),
                    id: ::core::clone::Clone::clone(__self_1),
                    shorthand: ::core::clone::Clone::clone(__self_2),
                },
            VisibilityKind::Inherited => VisibilityKind::Inherited,
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for VisibilityKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        VisibilityKind::Public => { 0usize }
                        VisibilityKind::Restricted {
                            path: ref __binding_0,
                            id: ref __binding_1,
                            shorthand: ref __binding_2 } => {
                            1usize
                        }
                        VisibilityKind::Inherited => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    VisibilityKind::Public => {}
                    VisibilityKind::Restricted {
                        path: ref __binding_0,
                        id: ref __binding_1,
                        shorthand: ref __binding_2 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                    VisibilityKind::Inherited => {}
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for VisibilityKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { VisibilityKind::Public }
                    1usize => {
                        VisibilityKind::Restricted {
                            path: ::rustc_serialize::Decodable::decode(__decoder),
                            id: ::rustc_serialize::Decodable::decode(__decoder),
                            shorthand: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    2usize => { VisibilityKind::Inherited }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `VisibilityKind`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for VisibilityKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            VisibilityKind::Public =>
                ::core::fmt::Formatter::write_str(f, "Public"),
            VisibilityKind::Restricted {
                path: __self_0, id: __self_1, shorthand: __self_2 } =>
                ::core::fmt::Formatter::debug_struct_field3_finish(f,
                    "Restricted", "path", __self_0, "id", __self_1, "shorthand",
                    &__self_2),
            VisibilityKind::Inherited =>
                ::core::fmt::Formatter::write_str(f, "Inherited"),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            VisibilityKind where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    VisibilityKind::Public => {}
                    VisibilityKind::Restricted {
                        path: ref __binding_0,
                        id: ref __binding_1,
                        shorthand: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    VisibilityKind::Inherited => {}
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for VisibilityKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    VisibilityKind::Public => {}
                    VisibilityKind::Restricted {
                        path: ref mut __binding_0,
                        id: ref mut __binding_1,
                        shorthand: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                    VisibilityKind::Inherited => {}
                }
            }
        }
    };Walkable)]
3590pub enum VisibilityKind {
3591    Public,
3592    Restricted { path: Box<Path>, id: NodeId, shorthand: bool },
3593    Inherited,
3594}
3595
3596impl VisibilityKind {
3597    pub fn is_pub(&self) -> bool {
3598        #[allow(non_exhaustive_omitted_patterns)] match self {
    VisibilityKind::Public => true,
    _ => false,
}matches!(self, VisibilityKind::Public)
3599    }
3600}
3601
3602#[derive(#[automatically_derived]
impl ::core::clone::Clone for ImplRestriction {
    #[inline]
    fn clone(&self) -> ImplRestriction {
        ImplRestriction {
            kind: ::core::clone::Clone::clone(&self.kind),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for ImplRestriction {
            fn encode(&self, __encoder: &mut __E) {
                let ImplRestriction {
                        kind: ref __binding_0, span: ref __binding_1 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for ImplRestriction {
            fn decode(__decoder: &mut __D) -> Self {
                ImplRestriction {
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ImplRestriction {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "ImplRestriction", "kind", &self.kind, "span", &&self.span)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            ImplRestriction where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    ImplRestriction {
                        kind: ref __binding_0, span: ref __binding_1 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for ImplRestriction where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    ImplRestriction {
                        kind: ref mut __binding_0, span: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3603pub struct ImplRestriction {
3604    pub kind: RestrictionKind,
3605    pub span: Span,
3606}
3607
3608#[derive(#[automatically_derived]
impl ::core::clone::Clone for MutRestriction {
    #[inline]
    fn clone(&self) -> MutRestriction {
        MutRestriction {
            kind: ::core::clone::Clone::clone(&self.kind),
            span: ::core::clone::Clone::clone(&self.span),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for MutRestriction {
            fn encode(&self, __encoder: &mut __E) {
                let MutRestriction {
                        kind: ref __binding_0, span: ref __binding_1 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for MutRestriction {
            fn decode(__decoder: &mut __D) -> Self {
                MutRestriction {
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for MutRestriction {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "MutRestriction", "kind", &self.kind, "span", &&self.span)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            MutRestriction where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    MutRestriction {
                        kind: ref __binding_0, span: ref __binding_1 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for MutRestriction where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    MutRestriction {
                        kind: ref mut __binding_0, span: ref mut __binding_1 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3609pub struct MutRestriction {
3610    pub kind: RestrictionKind,
3611    /// Note: this span is currently thrown away
3612    /// for [RestrictionKind::Unrestricted] when constructing [FieldDef],
3613    /// to keep its size small. This is not a problem at the moment,
3614    /// because this span is unused, but we will need to refactor
3615    /// [FieldDef] and [FieldDefExtras] to restore it when we need it.
3616    pub span: Span,
3617}
3618
3619#[derive(#[automatically_derived]
impl ::core::clone::Clone for RestrictionKind {
    #[inline]
    fn clone(&self) -> RestrictionKind {
        match self {
            RestrictionKind::Unrestricted => RestrictionKind::Unrestricted,
            RestrictionKind::Restricted {
                path: __self_0, id: __self_1, shorthand: __self_2 } =>
                RestrictionKind::Restricted {
                    path: ::core::clone::Clone::clone(__self_0),
                    id: ::core::clone::Clone::clone(__self_1),
                    shorthand: ::core::clone::Clone::clone(__self_2),
                },
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for RestrictionKind {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        RestrictionKind::Unrestricted => { 0usize }
                        RestrictionKind::Restricted {
                            path: ref __binding_0,
                            id: ref __binding_1,
                            shorthand: ref __binding_2 } => {
                            1usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    RestrictionKind::Unrestricted => {}
                    RestrictionKind::Restricted {
                        path: ref __binding_0,
                        id: ref __binding_1,
                        shorthand: ref __binding_2 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for RestrictionKind {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { RestrictionKind::Unrestricted }
                    1usize => {
                        RestrictionKind::Restricted {
                            path: ::rustc_serialize::Decodable::decode(__decoder),
                            id: ::rustc_serialize::Decodable::decode(__decoder),
                            shorthand: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `RestrictionKind`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for RestrictionKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            RestrictionKind::Unrestricted =>
                ::core::fmt::Formatter::write_str(f, "Unrestricted"),
            RestrictionKind::Restricted {
                path: __self_0, id: __self_1, shorthand: __self_2 } =>
                ::core::fmt::Formatter::debug_struct_field3_finish(f,
                    "Restricted", "path", __self_0, "id", __self_1, "shorthand",
                    &__self_2),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            RestrictionKind where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    RestrictionKind::Unrestricted => {}
                    RestrictionKind::Restricted {
                        path: ref __binding_0,
                        id: ref __binding_1,
                        shorthand: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for RestrictionKind where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    RestrictionKind::Unrestricted => {}
                    RestrictionKind::Restricted {
                        path: ref mut __binding_0,
                        id: ref mut __binding_1,
                        shorthand: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3620pub enum RestrictionKind {
3621    Unrestricted,
3622    Restricted { path: Box<Path>, id: NodeId, shorthand: bool },
3623}
3624
3625/// Field definition in a struct, variant or union.
3626///
3627/// E.g., `bar: usize` as in `struct Foo { bar: usize }`.
3628#[derive(#[automatically_derived]
impl ::core::clone::Clone for FieldDef {
    #[inline]
    fn clone(&self) -> FieldDef {
        FieldDef {
            attrs: ::core::clone::Clone::clone(&self.attrs),
            id: ::core::clone::Clone::clone(&self.id),
            span: ::core::clone::Clone::clone(&self.span),
            vis: ::core::clone::Clone::clone(&self.vis),
            extras: ::core::clone::Clone::clone(&self.extras),
            ident: ::core::clone::Clone::clone(&self.ident),
            ty: ::core::clone::Clone::clone(&self.ty),
            is_placeholder: ::core::clone::Clone::clone(&self.is_placeholder),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for FieldDef {
            fn encode(&self, __encoder: &mut __E) {
                let FieldDef {
                        attrs: ref __binding_0,
                        id: ref __binding_1,
                        span: ref __binding_2,
                        vis: ref __binding_3,
                        extras: ref __binding_4,
                        ident: ref __binding_5,
                        ty: ref __binding_6,
                        is_placeholder: ref __binding_7 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_5,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_6,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_7,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for FieldDef {
            fn decode(__decoder: &mut __D) -> Self {
                FieldDef {
                    attrs: ::rustc_serialize::Decodable::decode(__decoder),
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    vis: ::rustc_serialize::Decodable::decode(__decoder),
                    extras: ::rustc_serialize::Decodable::decode(__decoder),
                    ident: ::rustc_serialize::Decodable::decode(__decoder),
                    ty: ::rustc_serialize::Decodable::decode(__decoder),
                    is_placeholder: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for FieldDef {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["attrs", "id", "span", "vis", "extras", "ident", "ty",
                        "is_placeholder"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.attrs, &self.id, &self.span, &self.vis, &self.extras,
                        &self.ident, &self.ty, &&self.is_placeholder];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "FieldDef",
            names, values)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for FieldDef
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    FieldDef {
                        attrs: ref __binding_0,
                        id: ref __binding_1,
                        span: ref __binding_2,
                        vis: ref __binding_3,
                        extras: ref __binding_4,
                        ident: ref __binding_5,
                        ty: ref __binding_6,
                        is_placeholder: ref __binding_7 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_4,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_5,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_6,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_7,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for FieldDef where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    FieldDef {
                        attrs: ref mut __binding_0,
                        id: ref mut __binding_1,
                        span: ref mut __binding_2,
                        vis: ref mut __binding_3,
                        extras: ref mut __binding_4,
                        ident: ref mut __binding_5,
                        ty: ref mut __binding_6,
                        is_placeholder: ref mut __binding_7 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_4,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_5,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_6,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_7,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3629pub struct FieldDef {
3630    pub attrs: AttrVec,
3631    pub id: NodeId,
3632    pub span: Span,
3633    pub vis: Visibility,
3634    pub extras: Option<Box<FieldDefExtras>>,
3635    pub ident: Option<Ident>,
3636
3637    pub ty: Box<Ty>,
3638    pub is_placeholder: bool,
3639}
3640
3641/// Some properties from [FieldDef] are rarely used,
3642/// so we outline them to make FieldDef smaller.
3643/// At the time of writing, these are all related to unstable features.
3644#[derive(#[automatically_derived]
impl ::core::clone::Clone for FieldDefExtras {
    #[inline]
    fn clone(&self) -> FieldDefExtras {
        FieldDefExtras {
            safety: ::core::clone::Clone::clone(&self.safety),
            mut_restriction: ::core::clone::Clone::clone(&self.mut_restriction),
            default: ::core::clone::Clone::clone(&self.default),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for FieldDefExtras {
            fn encode(&self, __encoder: &mut __E) {
                let FieldDefExtras {
                        safety: ref __binding_0,
                        mut_restriction: ref __binding_1,
                        default: ref __binding_2 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for FieldDefExtras {
            fn decode(__decoder: &mut __D) -> Self {
                FieldDefExtras {
                    safety: ::rustc_serialize::Decodable::decode(__decoder),
                    mut_restriction: ::rustc_serialize::Decodable::decode(__decoder),
                    default: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for FieldDefExtras {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field3_finish(f,
            "FieldDefExtras", "safety", &self.safety, "mut_restriction",
            &self.mut_restriction, "default", &&self.default)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for
            FieldDefExtras where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    FieldDefExtras {
                        safety: ref __binding_0,
                        mut_restriction: ref __binding_1,
                        default: ref __binding_2 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for FieldDefExtras where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    FieldDefExtras {
                        safety: ref mut __binding_0,
                        mut_restriction: ref mut __binding_1,
                        default: ref mut __binding_2 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3645pub struct FieldDefExtras {
3646    pub safety: Safety,
3647    pub mut_restriction: MutRestriction,
3648    pub default: Option<AnonConst>,
3649}
3650
3651impl FieldDef {
3652    pub fn mut_restriction(&self) -> &MutRestriction {
3653        static DEFAULT: MutRestriction =
3654            MutRestriction { kind: RestrictionKind::Unrestricted, span: DUMMY_SP };
3655
3656        self.extras.as_ref().map_or(&DEFAULT, |extras| &extras.mut_restriction)
3657    }
3658
3659    pub fn default_value(&self) -> Option<&AnonConst> {
3660        self.extras.as_ref().and_then(|e| e.default.as_ref())
3661    }
3662
3663    pub fn safety(&self) -> Safety {
3664        self.extras.as_ref().map_or(Safety::Default, |extras| extras.safety)
3665    }
3666}
3667/// Was parsing recovery performed?
3668#[derive(#[automatically_derived]
impl ::core::marker::Copy for Recovered { }Copy, #[automatically_derived]
impl ::core::clone::Clone for Recovered {
    #[inline]
    fn clone(&self) -> Recovered {
        let _: ::core::clone::AssertParamIsClone<ErrorGuaranteed>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for Recovered {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Recovered::No => ::core::fmt::Formatter::write_str(f, "No"),
            Recovered::Yes(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Yes",
                    &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Recovered {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        Recovered::No => { 0usize }
                        Recovered::Yes(ref __binding_0) => { 1usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    Recovered::No => {}
                    Recovered::Yes(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Recovered {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { Recovered::No }
                    1usize => {
                        Recovered::Yes(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Recovered`, expected 0..2, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for Recovered {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hash::StableHasher) {
                ::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
                match *self {
                    Recovered::No => {}
                    Recovered::Yes(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Recovered
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Recovered::No => {}
                    Recovered::Yes(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Recovered where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Recovered::No => {}
                    Recovered::Yes(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3669pub enum Recovered {
3670    No,
3671    Yes(ErrorGuaranteed),
3672}
3673
3674/// Fields and constructor ids of enum variants and structs.
3675#[derive(#[automatically_derived]
impl ::core::clone::Clone for VariantData {
    #[inline]
    fn clone(&self) -> VariantData {
        match self {
            VariantData::Struct { fields: __self_0, recovered: __self_1 } =>
                VariantData::Struct {
                    fields: ::core::clone::Clone::clone(__self_0),
                    recovered: ::core::clone::Clone::clone(__self_1),
                },
            VariantData::Tuple(__self_0, __self_1) =>
                VariantData::Tuple(::core::clone::Clone::clone(__self_0),
                    ::core::clone::Clone::clone(__self_1)),
            VariantData::Unit(__self_0) =>
                VariantData::Unit(::core::clone::Clone::clone(__self_0)),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for VariantData {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        VariantData::Struct {
                            fields: ref __binding_0, recovered: ref __binding_1 } => {
                            0usize
                        }
                        VariantData::Tuple(ref __binding_0, ref __binding_1) => {
                            1usize
                        }
                        VariantData::Unit(ref __binding_0) => { 2usize }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    VariantData::Struct {
                        fields: ref __binding_0, recovered: ref __binding_1 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    VariantData::Tuple(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                    VariantData::Unit(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for VariantData {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => {
                        VariantData::Struct {
                            fields: ::rustc_serialize::Decodable::decode(__decoder),
                            recovered: ::rustc_serialize::Decodable::decode(__decoder),
                        }
                    }
                    1usize => {
                        VariantData::Tuple(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        VariantData::Unit(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `VariantData`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for VariantData {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            VariantData::Struct { fields: __self_0, recovered: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "Struct", "fields", __self_0, "recovered", &__self_1),
            VariantData::Tuple(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f, "Tuple",
                    __self_0, &__self_1),
            VariantData::Unit(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Unit",
                    &__self_0),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for VariantData
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    VariantData::Struct {
                        fields: ref __binding_0, recovered: ref __binding_1 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    VariantData::Tuple(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    VariantData::Unit(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for VariantData where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    VariantData::Struct {
                        fields: ref mut __binding_0, recovered: ref mut __binding_1
                        } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                    VariantData::Tuple(ref mut __binding_0, ref mut __binding_1)
                        => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                    VariantData::Unit(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3676pub enum VariantData {
3677    /// Struct variant.
3678    ///
3679    /// E.g., `Bar { .. }` as in `enum Foo { Bar { .. } }`.
3680    Struct { fields: ThinVec<FieldDef>, recovered: Recovered },
3681    /// Tuple variant.
3682    ///
3683    /// E.g., `Bar(..)` as in `enum Foo { Bar(..) }`.
3684    Tuple(ThinVec<FieldDef>, NodeId),
3685    /// Unit variant.
3686    ///
3687    /// E.g., `Bar = ..` as in `enum Foo { Bar = .. }`.
3688    Unit(NodeId),
3689}
3690
3691impl VariantData {
3692    /// Return the fields of this variant.
3693    pub fn fields(&self) -> &[FieldDef] {
3694        match self {
3695            VariantData::Struct { fields, .. } | VariantData::Tuple(fields, _) => fields,
3696            _ => &[],
3697        }
3698    }
3699
3700    /// Return the `NodeId` of this variant's constructor, if it has one.
3701    pub fn ctor_node_id(&self) -> Option<NodeId> {
3702        match *self {
3703            VariantData::Struct { .. } => None,
3704            VariantData::Tuple(_, id) | VariantData::Unit(id) => Some(id),
3705        }
3706    }
3707}
3708
3709/// An item definition.
3710#[derive(#[automatically_derived]
impl<K: ::core::clone::Clone> ::core::clone::Clone for Item<K> {
    #[inline]
    fn clone(&self) -> Item<K> {
        Item {
            attrs: ::core::clone::Clone::clone(&self.attrs),
            id: ::core::clone::Clone::clone(&self.id),
            span: ::core::clone::Clone::clone(&self.span),
            vis: ::core::clone::Clone::clone(&self.vis),
            kind: ::core::clone::Clone::clone(&self.kind),
            tokens: ::core::clone::Clone::clone(&self.tokens),
        }
    }
}Clone, const _: () =
    {
        impl<K, __E: ::rustc_span::SpanEncoder>
            ::rustc_serialize::Encodable<__E> for Item<K> where
            K: ::rustc_serialize::Encodable<__E> {
            fn encode(&self, __encoder: &mut __E) {
                let Item {
                        attrs: ref __binding_0,
                        id: ref __binding_1,
                        span: ref __binding_2,
                        vis: ref __binding_3,
                        kind: ref __binding_4,
                        tokens: ref __binding_5 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_4,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_5,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<K, __D: ::rustc_span::SpanDecoder>
            ::rustc_serialize::Decodable<__D> for Item<K> where
            K: ::rustc_serialize::Decodable<__D> {
            fn decode(__decoder: &mut __D) -> Self {
                Item {
                    attrs: ::rustc_serialize::Decodable::decode(__decoder),
                    id: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                    vis: ::rustc_serialize::Decodable::decode(__decoder),
                    kind: ::rustc_serialize::Decodable::decode(__decoder),
                    tokens: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl<K: ::core::fmt::Debug> ::core::fmt::Debug for Item<K> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        let names: &'static _ =
            &["attrs", "id", "span", "vis", "kind", "tokens"];
        let values: &[&dyn ::core::fmt::Debug] =
            &[&self.attrs, &self.id, &self.span, &self.vis, &self.kind,
                        &&self.tokens];
        ::core::fmt::Formatter::debug_struct_fields_finish(f, "Item", names,
            values)
    }
}Debug)]
3711pub struct Item<K = ItemKind> {
3712    pub attrs: AttrVec,
3713    pub id: NodeId,
3714    pub span: Span,
3715    pub vis: Visibility,
3716
3717    pub kind: K,
3718
3719    /// Original tokens this item was parsed from. This isn't necessarily
3720    /// available for all items, although over time more and more items should
3721    /// have this be `Some`. Right now this is primarily used for procedural
3722    /// macros, notably custom attributes.
3723    ///
3724    /// Note that the tokens here do not include the outer attributes, but will
3725    /// include inner attributes.
3726    pub tokens: Option<LazyAttrTokenStream>,
3727}
3728
3729impl Item {
3730    /// Return the span that encompasses the attributes.
3731    pub fn span_with_attributes(&self) -> Span {
3732        self.attrs.iter().fold(self.span, |acc, attr| acc.to(attr.span))
3733    }
3734
3735    pub fn opt_generics(&self) -> Option<&Generics> {
3736        self.kind.generics()
3737    }
3738}
3739
3740impl Item<AssocItemKind> {
3741    pub fn opt_generics(&self) -> Option<&Generics> {
3742        match &self.kind {
3743            AssocItemKind::Fn(fun) => Some(&fun.generics),
3744            AssocItemKind::Const(ct) => Some(&ct.generics),
3745            AssocItemKind::Type(ty) => Some(&ty.generics),
3746            AssocItemKind::Delegation(..)
3747            | AssocItemKind::MacCall(_)
3748            | AssocItemKind::DelegationMac(_) => None,
3749        }
3750    }
3751}
3752
3753/// `extern` qualifier on a function item or function type.
3754#[derive(#[automatically_derived]
impl ::core::clone::Clone for Extern {
    #[inline]
    fn clone(&self) -> Extern {
        let _: ::core::clone::AssertParamIsClone<Span>;
        let _: ::core::clone::AssertParamIsClone<StrLit>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for Extern { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Extern {
            fn encode(&self, __encoder: &mut __E) {
                let disc =
                    match *self {
                        Extern::None => { 0usize }
                        Extern::Implicit(ref __binding_0) => { 1usize }
                        Extern::Explicit(ref __binding_0, ref __binding_1) => {
                            2usize
                        }
                    };
                ::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
                match *self {
                    Extern::None => {}
                    Extern::Implicit(ref __binding_0) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                    }
                    Extern::Explicit(ref __binding_0, ref __binding_1) => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Extern {
            fn decode(__decoder: &mut __D) -> Self {
                match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
                    {
                    0usize => { Extern::None }
                    1usize => {
                        Extern::Implicit(::rustc_serialize::Decodable::decode(__decoder))
                    }
                    2usize => {
                        Extern::Explicit(::rustc_serialize::Decodable::decode(__decoder),
                            ::rustc_serialize::Decodable::decode(__decoder))
                    }
                    n => {
                        ::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Extern`, expected 0..3, actual {0}",
                                n));
                    }
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for Extern {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Extern::None => ::core::fmt::Formatter::write_str(f, "None"),
            Extern::Implicit(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Implicit", &__self_0),
            Extern::Explicit(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "Explicit", __self_0, &__self_1),
        }
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for Extern where
            __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    Extern::None => {}
                    Extern::Implicit(ref __binding_0) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                    Extern::Explicit(ref __binding_0, ref __binding_1) => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for Extern where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    Extern::None => {}
                    Extern::Implicit(ref mut __binding_0) => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                    }
                    Extern::Explicit(ref mut __binding_0, ref mut __binding_1)
                        => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3755pub enum Extern {
3756    /// No explicit extern keyword was used.
3757    ///
3758    /// E.g. `fn foo() {}`.
3759    None,
3760    /// An explicit extern keyword was used, but with implicit ABI.
3761    ///
3762    /// E.g. `extern fn foo() {}`.
3763    ///
3764    /// This is just `extern "C"` (see `rustc_abi::ExternAbi::FALLBACK`).
3765    Implicit(Span),
3766    /// An explicit extern keyword was used with an explicit ABI.
3767    ///
3768    /// E.g. `extern "C" fn foo() {}`.
3769    Explicit(StrLit, Span),
3770}
3771
3772impl Extern {
3773    pub fn from_abi(abi: Option<StrLit>, span: Span) -> Extern {
3774        match abi {
3775            Some(name) => Extern::Explicit(name, span),
3776            None => Extern::Implicit(span),
3777        }
3778    }
3779
3780    pub fn span(self) -> Option<Span> {
3781        match self {
3782            Extern::None => None,
3783            Extern::Implicit(span) | Extern::Explicit(_, span) => Some(span),
3784        }
3785    }
3786}
3787
3788/// A function header.
3789///
3790/// All the information between the visibility and the name of the function is
3791/// included in this struct (e.g., `async unsafe fn` or `const extern "C" fn`).
3792#[derive(#[automatically_derived]
impl ::core::clone::Clone for FnHeader {
    #[inline]
    fn clone(&self) -> FnHeader {
        let _: ::core::clone::AssertParamIsClone<Const>;
        let _: ::core::clone::AssertParamIsClone<Option<CoroutineMarker>>;
        let _: ::core::clone::AssertParamIsClone<Safety>;
        let _: ::core::clone::AssertParamIsClone<Extern>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for FnHeader { }Copy, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for FnHeader {
            fn encode(&self, __encoder: &mut __E) {
                let FnHeader {
                        constness: ref __binding_0,
                        coroutine_marker: ref __binding_1,
                        safety: ref __binding_2,
                        ext: ref __binding_3 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for FnHeader {
            fn decode(__decoder: &mut __D) -> Self {
                FnHeader {
                    constness: ::rustc_serialize::Decodable::decode(__decoder),
                    coroutine_marker: ::rustc_serialize::Decodable::decode(__decoder),
                    safety: ::rustc_serialize::Decodable::decode(__decoder),
                    ext: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for FnHeader {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "FnHeader",
            "constness", &self.constness, "coroutine_marker",
            &self.coroutine_marker, "safety", &self.safety, "ext", &&self.ext)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for FnHeader
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    FnHeader {
                        constness: ref __binding_0,
                        coroutine_marker: ref __binding_1,
                        safety: ref __binding_2,
                        ext: ref __binding_3 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for FnHeader where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    FnHeader {
                        constness: ref mut __binding_0,
                        coroutine_marker: ref mut __binding_1,
                        safety: ref mut __binding_2,
                        ext: ref mut __binding_3 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, ())
                        }
                    }
                }
            }
        }
    };Walkable)]
3793pub struct FnHeader {
3794    /// The `const` keyword, if any
3795    pub constness: Const,
3796    /// The `async`/`gen`/`gen asyn` marker, if there is one.
3797    pub coroutine_marker: Option<CoroutineMarker>,
3798    /// Whether this is `unsafe`, or has a default safety.
3799    pub safety: Safety,
3800    /// The `extern` keyword and corresponding ABI string, if any.
3801    pub ext: Extern,
3802}
3803
3804impl FnHeader {
3805    /// Does this function header have any qualifiers or is it empty?
3806    pub fn has_qualifiers(&self) -> bool {
3807        let Self { safety, coroutine_marker, constness, ext } = self;
3808        #[allow(non_exhaustive_omitted_patterns)] match safety {
    Safety::Unsafe(_) => true,
    _ => false,
}matches!(safety, Safety::Unsafe(_))
3809            || coroutine_marker.is_some()
3810            || #[allow(non_exhaustive_omitted_patterns)] match constness {
    Const::Yes(_) => true,
    _ => false,
}matches!(constness, Const::Yes(_))
3811            || !#[allow(non_exhaustive_omitted_patterns)] match ext {
    Extern::None => true,
    _ => false,
}matches!(ext, Extern::None)
3812    }
3813
3814    pub fn span(&self) -> Option<Span> {
3815        let mut spans = smallvec::SmallVec::<[Span; 4]>::new();
3816
3817        match self.ext {
3818            Extern::Implicit(span) | Extern::Explicit(_, span) => spans.push(span),
3819            Extern::None => {}
3820        }
3821
3822        match self.safety {
3823            Safety::Unsafe(span) | Safety::Safe(span) => spans.push(span),
3824            Safety::Default => {}
3825        };
3826
3827        if let Some(coroutine_marker) = self.coroutine_marker {
3828            spans.push(coroutine_marker.span);
3829        }
3830
3831        if let Const::Yes(span) = self.constness {
3832            spans.push(span)
3833        }
3834
3835        spans.into_iter().reduce(Span::to)
3836    }
3837}
3838
3839impl Default for FnHeader {
3840    fn default() -> FnHeader {
3841        FnHeader {
3842            safety: Safety::Default,
3843            coroutine_marker: None,
3844            constness: Const::No,
3845            ext: Extern::None,
3846        }
3847    }
3848}
3849
3850#[derive(#[automatically_derived]
impl ::core::clone::Clone for TraitAlias {
    #[inline]
    fn clone(&self) -> TraitAlias {
        TraitAlias {
            constness: ::core::clone::Clone::clone(&self.constness),
            ident: ::core::clone::Clone::clone(&self.ident),
            generics: ::core::clone::Clone::clone(&self.generics),
            bounds: ::core::clone::Clone::clone(&self.bounds),
        }
    }
}Clone, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for TraitAlias {
            fn encode(&self, __encoder: &mut __E) {
                let TraitAlias {
                        constness: ref __binding_0,
                        ident: ref __binding_1,
                        generics: ref __binding_2,
                        bounds: ref __binding_3 } = *self;
                ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_2,
                    __encoder);
                ::rustc_serialize::Encodable::<__E>::encode(__binding_3,
                    __encoder);
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for TraitAlias {
            fn decode(__decoder: &mut __D) -> Self {
                TraitAlias {
                    constness: ::rustc_serialize::Decodable::decode(__decoder),
                    ident: ::rustc_serialize::Decodable::decode(__decoder),
                    generics: ::rustc_serialize::Decodable::decode(__decoder),
                    bounds: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable, #[automatically_derived]
impl ::core::fmt::Debug for TraitAlias {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field4_finish(f, "TraitAlias",
            "constness", &self.constness, "ident", &self.ident, "generics",
            &self.generics, "bounds", &&self.bounds)
    }
}Debug, const _: () =
    {
        impl<'__ast, __V> crate::visit::Walkable<'__ast, __V> for TraitAlias
            where __V: crate::visit::Visitor<'__ast> {
            fn walk_ref(&'__ast self, __visitor: &mut __V) -> __V::Result {
                match *self {
                    TraitAlias {
                        constness: ref __binding_0,
                        ident: ref __binding_1,
                        generics: ref __binding_2,
                        bounds: ref __binding_3 } => {
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_0,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_1,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_2,
                                        __visitor, ())) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                        {
                            match ::rustc_ast_ir::visit::VisitorResult::branch(crate::visit::Visitable::visit(__binding_3,
                                        __visitor, (BoundKind::Bound))) {
                                core::ops::ControlFlow::Continue(()) =>
                                    (),
                                    #[allow(unreachable_code)]
                                    core::ops::ControlFlow::Break(r) => {
                                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                                }
                            }
                        }
                    }
                }
                <__V::Result as rustc_ast_ir::visit::VisitorResult>::output()
            }
        }
        impl<__V> crate::mut_visit::MutWalkable<__V> for TraitAlias where
            __V: crate::mut_visit::MutVisitor {
            fn walk_mut(&mut self, __visitor: &mut __V) {
                match *self {
                    TraitAlias {
                        constness: ref mut __binding_0,
                        ident: ref mut __binding_1,
                        generics: ref mut __binding_2,
                        bounds: ref mut __binding_3 } => {
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_0,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_1,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_2,
                                __visitor, ())
                        }
                        {
                            crate::mut_visit::MutVisitable::visit_mut(__binding_3,
                                __visitor, (BoundKind::Bound))