Skip to main content

rustc_ast/
visit.rs

1//! AST walker. Each overridden visit method has full control over what
2//! happens with its node, it can do its own traversal of the node's children,
3//! call `visit::walk_*` to apply the default traversal algorithm, or prevent
4//! deeper traversal by doing nothing.
5//!
6//! Note: it is an important invariant that the default visitor walks the body
7//! of a function in "execution order" (more concretely, reverse post-order
8//! with respect to the CFG implied by the AST), meaning that if AST node A may
9//! execute before AST node B, then A is visited first. The borrow checker in
10//! particular relies on this property.
11//!
12//! Note: walking an AST before macro expansion is probably a bad idea. For
13//! instance, a walker looking for item names in a module will miss all of
14//! those that are created by the expansion of a macro.
15
16pub use rustc_ast_ir::visit::VisitorResult;
17pub use rustc_ast_ir::{try_visit, visit_opt, walk_list, walk_visitable_list};
18use rustc_macros::StableHash;
19use rustc_span::{Ident, Span, Spanned, Symbol};
20use thin_vec::ThinVec;
21
22use crate::ast::*;
23use crate::tokenstream::DelimSpan;
24
25#[derive(#[automatically_derived]
impl ::core::marker::Copy for AssocCtxt { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for AssocCtxt { }
#[automatically_derived]
impl ::core::clone::Clone for AssocCtxt {
    #[inline]
    fn clone(&self) -> AssocCtxt {
        let _: ::core::clone::AssertParamIsClone<bool>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for AssocCtxt {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            AssocCtxt::Trait => ::core::fmt::Formatter::write_str(f, "Trait"),
            AssocCtxt::Impl { of_trait: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Impl",
                    "of_trait", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for AssocCtxt { }
#[automatically_derived]
impl ::core::cmp::PartialEq for AssocCtxt {
    #[inline]
    fn eq(&self, other: &AssocCtxt) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (AssocCtxt::Impl { of_trait: __self_0 }, AssocCtxt::Impl {
                    of_trait: __arg1_0 }) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for AssocCtxt {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<bool>;
    }
}Eq, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for AssocCtxt {
            #[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 {
                    AssocCtxt::Trait => {}
                    AssocCtxt::Impl { of_trait: ref __binding_0 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash)]
26pub enum AssocCtxt {
27    Trait,
28    Impl { of_trait: bool },
29}
30
31#[derive(#[automatically_derived]
impl ::core::marker::Copy for FnCtxt { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for FnCtxt { }
#[automatically_derived]
impl ::core::clone::Clone for FnCtxt {
    #[inline]
    fn clone(&self) -> FnCtxt {
        let _: ::core::clone::AssertParamIsClone<AssocCtxt>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for FnCtxt {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            FnCtxt::Free => ::core::fmt::Formatter::write_str(f, "Free"),
            FnCtxt::Foreign =>
                ::core::fmt::Formatter::write_str(f, "Foreign"),
            FnCtxt::Assoc(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Assoc",
                    &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for FnCtxt { }
#[automatically_derived]
impl ::core::cmp::PartialEq for FnCtxt {
    #[inline]
    fn eq(&self, other: &FnCtxt) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (FnCtxt::Assoc(__self_0), FnCtxt::Assoc(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq)]
32pub enum FnCtxt {
33    Free,
34    Foreign,
35    Assoc(AssocCtxt),
36}
37
38#[derive(#[automatically_derived]
impl ::core::marker::Copy for BoundKind { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for BoundKind { }
#[automatically_derived]
impl ::core::clone::Clone for BoundKind {
    #[inline]
    fn clone(&self) -> BoundKind { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for BoundKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                BoundKind::Bound => "Bound",
                BoundKind::Impl => "Impl",
                BoundKind::TraitObject => "TraitObject",
                BoundKind::SuperTraits => "SuperTraits",
            })
    }
}Debug)]
39pub enum BoundKind {
40    /// Trait bounds in generics bounds and type/trait alias.
41    /// E.g., `<T: Bound>`, `type A: Bound`, or `where T: Bound`.
42    Bound,
43
44    /// Trait bounds in `impl` type.
45    /// E.g., `type Foo = impl Bound1 + Bound2 + Bound3`.
46    Impl,
47
48    /// Trait bounds in trait object type.
49    /// E.g., `dyn Bound1 + Bound2 + Bound3`.
50    TraitObject,
51
52    /// Super traits of a trait.
53    /// E.g., `trait A: B`
54    SuperTraits,
55}
56impl BoundKind {
57    pub fn descr(self) -> &'static str {
58        match self {
59            BoundKind::Bound => "bounds",
60            BoundKind::Impl => "`impl Trait`",
61            BoundKind::TraitObject => "`dyn` trait object bounds",
62            BoundKind::SuperTraits => "supertrait bounds",
63        }
64    }
65}
66
67#[derive(#[automatically_derived]
impl ::core::marker::Copy for LifetimeCtxt { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for LifetimeCtxt { }
#[automatically_derived]
impl ::core::clone::Clone for LifetimeCtxt {
    #[inline]
    fn clone(&self) -> LifetimeCtxt { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for LifetimeCtxt {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                LifetimeCtxt::Ref => "Ref",
                LifetimeCtxt::Bound => "Bound",
                LifetimeCtxt::GenericArg => "GenericArg",
            })
    }
}Debug)]
68pub enum LifetimeCtxt {
69    /// Appears in a reference type.
70    Ref,
71    /// Appears as a bound on a type or another lifetime.
72    Bound,
73    /// Appears as a generic argument.
74    GenericArg,
75}
76
77pub(crate) trait Visitable<'a, V: Visitor<'a>> {
78    type Extra: Copy;
79
80    #[must_use]
81    fn visit(&'a self, visitor: &mut V, extra: Self::Extra) -> V::Result;
82}
83
84impl<'a, V: Visitor<'a>, T: ?Sized> Visitable<'a, V> for Box<T>
85where
86    T: Visitable<'a, V>,
87{
88    type Extra = T::Extra;
89    fn visit(&'a self, visitor: &mut V, extra: Self::Extra) -> V::Result {
90        (**self).visit(visitor, extra)
91    }
92}
93
94impl<'a, V: Visitor<'a>, T> Visitable<'a, V> for Option<T>
95where
96    T: Visitable<'a, V>,
97{
98    type Extra = T::Extra;
99    fn visit(&'a self, visitor: &mut V, extra: Self::Extra) -> V::Result {
100        if let Some(this) = self {
101            match ::rustc_ast_ir::visit::VisitorResult::branch(this.visit(visitor, extra))
    {
    core::ops::ControlFlow::Continue(()) =>
        (),
        #[allow(unreachable_code)]
        core::ops::ControlFlow::Break(r) => {
        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
    }
};try_visit!(this.visit(visitor, extra));
102        }
103        V::Result::output()
104    }
105}
106
107impl<'a, V: Visitor<'a>, T> Visitable<'a, V> for Spanned<T>
108where
109    T: Visitable<'a, V>,
110{
111    type Extra = T::Extra;
112    fn visit(&'a self, visitor: &mut V, extra: Self::Extra) -> V::Result {
113        let Spanned { span: _, node } = self;
114        node.visit(visitor, extra)
115    }
116}
117
118impl<'a, V: Visitor<'a>, T> Visitable<'a, V> for [T]
119where
120    T: Visitable<'a, V>,
121{
122    type Extra = T::Extra;
123    fn visit(&'a self, visitor: &mut V, extra: Self::Extra) -> V::Result {
124        for item in self {
125            match ::rustc_ast_ir::visit::VisitorResult::branch(item.visit(visitor, extra))
    {
    core::ops::ControlFlow::Continue(()) =>
        (),
        #[allow(unreachable_code)]
        core::ops::ControlFlow::Break(r) => {
        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
    }
};try_visit!(item.visit(visitor, extra));
126        }
127        V::Result::output()
128    }
129}
130
131impl<'a, V: Visitor<'a>, T> Visitable<'a, V> for Vec<T>
132where
133    T: Visitable<'a, V>,
134{
135    type Extra = T::Extra;
136    fn visit(&'a self, visitor: &mut V, extra: Self::Extra) -> V::Result {
137        for item in self {
138            match ::rustc_ast_ir::visit::VisitorResult::branch(item.visit(visitor, extra))
    {
    core::ops::ControlFlow::Continue(()) =>
        (),
        #[allow(unreachable_code)]
        core::ops::ControlFlow::Break(r) => {
        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
    }
};try_visit!(item.visit(visitor, extra));
139        }
140        V::Result::output()
141    }
142}
143
144impl<'a, V: Visitor<'a>, T1, T2> Visitable<'a, V> for (T1, T2)
145where
146    T1: Visitable<'a, V, Extra = ()>,
147    T2: Visitable<'a, V, Extra = ()>,
148{
149    type Extra = ();
150    fn visit(&'a self, visitor: &mut V, extra: Self::Extra) -> V::Result {
151        match ::rustc_ast_ir::visit::VisitorResult::branch(self.0.visit(visitor,
            extra)) {
    core::ops::ControlFlow::Continue(()) =>
        (),
        #[allow(unreachable_code)]
        core::ops::ControlFlow::Break(r) => {
        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
    }
};try_visit!(self.0.visit(visitor, extra));
152        match ::rustc_ast_ir::visit::VisitorResult::branch(self.1.visit(visitor,
            extra)) {
    core::ops::ControlFlow::Continue(()) =>
        (),
        #[allow(unreachable_code)]
        core::ops::ControlFlow::Break(r) => {
        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
    }
};try_visit!(self.1.visit(visitor, extra));
153        V::Result::output()
154    }
155}
156
157impl<'a, V: Visitor<'a>, T1, T2, T3> Visitable<'a, V> for (T1, T2, T3)
158where
159    T1: Visitable<'a, V, Extra = ()>,
160    T2: Visitable<'a, V, Extra = ()>,
161    T3: Visitable<'a, V, Extra = ()>,
162{
163    type Extra = ();
164    fn visit(&'a self, visitor: &mut V, extra: Self::Extra) -> V::Result {
165        match ::rustc_ast_ir::visit::VisitorResult::branch(self.0.visit(visitor,
            extra)) {
    core::ops::ControlFlow::Continue(()) =>
        (),
        #[allow(unreachable_code)]
        core::ops::ControlFlow::Break(r) => {
        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
    }
};try_visit!(self.0.visit(visitor, extra));
166        match ::rustc_ast_ir::visit::VisitorResult::branch(self.1.visit(visitor,
            extra)) {
    core::ops::ControlFlow::Continue(()) =>
        (),
        #[allow(unreachable_code)]
        core::ops::ControlFlow::Break(r) => {
        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
    }
};try_visit!(self.1.visit(visitor, extra));
167        match ::rustc_ast_ir::visit::VisitorResult::branch(self.2.visit(visitor,
            extra)) {
    core::ops::ControlFlow::Continue(()) =>
        (),
        #[allow(unreachable_code)]
        core::ops::ControlFlow::Break(r) => {
        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
    }
};try_visit!(self.2.visit(visitor, extra));
168        V::Result::output()
169    }
170}
171
172impl<'a, V: Visitor<'a>, T1, T2, T3, T4> Visitable<'a, V> for (T1, T2, T3, T4)
173where
174    T1: Visitable<'a, V, Extra = ()>,
175    T2: Visitable<'a, V, Extra = ()>,
176    T3: Visitable<'a, V, Extra = ()>,
177    T4: Visitable<'a, V, Extra = ()>,
178{
179    type Extra = ();
180    fn visit(&'a self, visitor: &mut V, extra: Self::Extra) -> V::Result {
181        match ::rustc_ast_ir::visit::VisitorResult::branch(self.0.visit(visitor,
            extra)) {
    core::ops::ControlFlow::Continue(()) =>
        (),
        #[allow(unreachable_code)]
        core::ops::ControlFlow::Break(r) => {
        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
    }
};try_visit!(self.0.visit(visitor, extra));
182        match ::rustc_ast_ir::visit::VisitorResult::branch(self.1.visit(visitor,
            extra)) {
    core::ops::ControlFlow::Continue(()) =>
        (),
        #[allow(unreachable_code)]
        core::ops::ControlFlow::Break(r) => {
        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
    }
};try_visit!(self.1.visit(visitor, extra));
183        match ::rustc_ast_ir::visit::VisitorResult::branch(self.2.visit(visitor,
            extra)) {
    core::ops::ControlFlow::Continue(()) =>
        (),
        #[allow(unreachable_code)]
        core::ops::ControlFlow::Break(r) => {
        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
    }
};try_visit!(self.2.visit(visitor, extra));
184        match ::rustc_ast_ir::visit::VisitorResult::branch(self.3.visit(visitor,
            extra)) {
    core::ops::ControlFlow::Continue(()) =>
        (),
        #[allow(unreachable_code)]
        core::ops::ControlFlow::Break(r) => {
        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
    }
};try_visit!(self.3.visit(visitor, extra));
185        V::Result::output()
186    }
187}
188
189pub(crate) trait Walkable<'a, V: Visitor<'a>> {
190    #[must_use]
191    fn walk_ref(&'a self, visitor: &mut V) -> V::Result;
192}
193
194macro_rules! visit_visitable {
195    ($visitor:expr, $($expr:expr),* $(,)?) => {{
196        $(try_visit!(Visitable::visit($expr, $visitor, ()));)*
197    }};
198}
199
200macro_rules! visit_visitable_with {
201    ($visitor:expr, $expr:expr, $extra:expr $(,)?) => {
202        try_visit!(Visitable::visit($expr, $visitor, $extra))
203    };
204}
205
206macro_rules! impl_visitable {
207    (|&$lt:lifetime $self:ident: $self_ty:ty,
208      $vis:ident: &mut $vis_ty:ident,
209      $extra:ident: $extra_ty:ty| $block:block) => {
210        #[allow(unused_parens, non_local_definitions)]
211        impl<$lt, $vis_ty: Visitor<$lt>> Visitable<$lt, $vis_ty> for $self_ty {
212            type Extra = $extra_ty;
213            fn visit(&$lt $self, $vis: &mut $vis_ty, $extra: Self::Extra) -> V::Result {
214                $block
215            }
216        }
217    };
218}
219
220macro_rules! impl_walkable {
221    (|&$lt:lifetime $self:ident: $self_ty:ty,
222      $vis:ident: &mut $vis_ty:ident| $block:block) => {
223        impl<$lt, $vis_ty: Visitor<$lt>> Walkable<$lt, $vis_ty> for $self_ty {
224            fn walk_ref(&$lt $self, $vis: &mut $vis_ty) -> V::Result {
225                $block
226            }
227        }
228    };
229}
230
231macro_rules! impl_visitable_noop {
232    (<$lt:lifetime> $($ty:ty,)*) => {
233        $(
234            impl_visitable!(|&$lt self: $ty, _vis: &mut V, _extra: ()| {
235                V::Result::output()
236            });
237        )*
238    };
239}
240
241macro_rules! impl_visitable_list {
242    (<$lt:lifetime> $($ty:ty,)*) => {
243        $(impl<$lt, V: Visitor<$lt>, T> Visitable<$lt, V> for $ty
244        where
245            &$lt $ty: IntoIterator<Item = &$lt T>,
246            T: $lt + Visitable<$lt, V>,
247        {
248            type Extra = <T as Visitable<$lt, V>>::Extra;
249
250            #[inline]
251            fn visit(&$lt self, visitor: &mut V, extra: Self::Extra) -> V::Result {
252                for i in self {
253                    try_visit!(i.visit(visitor, extra));
254                }
255                V::Result::output()
256            }
257        })*
258    };
259}
260
261macro_rules! impl_visitable_direct {
262    (<$lt:lifetime> $($ty:ty,)*) => {
263        $(impl_visitable!(
264            |&$lt self: $ty, visitor: &mut V, _extra: ()| {
265                Walkable::walk_ref(self, visitor)
266            }
267        );)*
268    };
269}
270
271macro_rules! impl_visitable_calling_walkable {
272    (<$lt:lifetime>
273        $( fn $method:ident($ty:ty $(, $extra_name:ident: $extra_ty:ty)?); )*
274    ) => {
275        $(fn $method(&mut self, node: &$lt $ty $(, $extra_name:$extra_ty)?) -> Self::Result {
276            impl_visitable!(|&$lt self: $ty, visitor: &mut V, extra: ($($extra_ty)?)| {
277                let ($($extra_name)?) = extra;
278                visitor.$method(self $(, $extra_name)?)
279            });
280            Walkable::walk_ref(node, self)
281        })*
282    };
283}
284
285macro_rules! define_named_walk {
286    ($Visitor:ident<$lt:lifetime>
287        $( pub fn $method:ident($ty:ty); )*
288    ) => {
289        $(pub fn $method<$lt, V: $Visitor<$lt>>(visitor: &mut V, node: &$lt $ty) -> V::Result {
290            Walkable::walk_ref(node, visitor)
291        })*
292    };
293}
294
295#[macro_export]
296macro_rules! common_visitor_and_walkers {
297    ($(($mut: ident))? $Visitor:ident$(<$lt:lifetime>)?) => {
298        $(${ignore($lt)}
299            #[derive(Copy, Clone)]
300        )?
301        #[derive(Debug)]
302        pub enum FnKind<'a> {
303            /// E.g., `fn foo()`, `fn foo(&self)`, or `extern "Abi" fn foo()`.
304            Fn(FnCtxt, &'a $($mut)? Visibility, &'a $($mut)? Fn),
305
306            /// E.g., `|x, y| body`.
307            Closure(
308                &'a $($mut)? ClosureBinder,
309                &'a $($mut)? Option<CoroutineMarker>,
310                &'a $($mut)? Box<FnDecl>,
311                &'a $($mut)? Box<Expr>,
312            ),
313        }
314
315        impl<'a> FnKind<'_> {
316            pub fn header(&'a $($mut)? self) -> Option<&'a $($mut)? FnHeader> {
317                match *self {
318                    FnKind::Fn(_, _, Fn { sig, .. }) => Some(&$($mut)? sig.header),
319                    FnKind::Closure(..) => None,
320                }
321            }
322
323            pub fn ident(&'a $($mut)? self) -> Option<&'a $($mut)? Ident> {
324                match self {
325                    FnKind::Fn(_, _, Fn { ident, .. }) => Some(ident),
326                    _ => None,
327                }
328            }
329
330            pub fn decl(&'a $($mut)? self) -> &'a $($mut)? FnDecl {
331                match self {
332                    FnKind::Fn(_, _, Fn { sig, .. }) => &$($mut)? sig.decl,
333                    FnKind::Closure(_, _, decl, _) => decl,
334                }
335            }
336
337            pub fn ctxt(&self) -> Option<FnCtxt> {
338                match self {
339                    FnKind::Fn(ctxt, ..) => Some(*ctxt),
340                    FnKind::Closure(..) => None,
341                }
342            }
343        }
344
345        // This macro generates `impl Visitable` and `impl MutVisitable` that do nothing.
346        impl_visitable_noop!($(<$lt>)?
347            AttrId,
348            bool,
349            rustc_span::ByteSymbol,
350            char,
351            crate::token::CommentKind,
352            crate::token::Delimiter,
353            crate::token::Lit,
354            crate::token::LitKind,
355            crate::tokenstream::LazyAttrTokenStream,
356            crate::tokenstream::TokenStream,
357            Movability,
358            Mutability,
359            Pinnedness,
360            Result<(), rustc_span::ErrorGuaranteed>,
361            rustc_data_structures::fx::FxHashMap<Symbol, usize>,
362            rustc_span::ErrorGuaranteed,
363            std::borrow::Cow<'_, str>,
364            Symbol,
365            SyntheticAttr,
366            u8,
367            usize,
368        );
369        // `Span` is only a no-op for the non-mutable visitor.
370        $(impl_visitable_noop!(<$lt> Span,);)?
371
372        // This macro generates `impl Visitable` and `impl MutVisitable` that simply iterate over
373        // their contents. We do not use a generic impl for `ThinVec` because we want to allow
374        // custom visits for the `MutVisitor`.
375        impl_visitable_list!($(<$lt>)?
376            ThinVec<AngleBracketedArg>,
377            ThinVec<Attribute>,
378            ThinVec<GenericBound>,
379            ThinVec<Ident>,
380            ThinVec<(Ident, Option<Ident>)>,
381            ThinVec<(NodeId, Path)>,
382            ThinVec<PathSegment>,
383            ThinVec<PreciseCapturingArg>,
384            ThinVec<Pat>,
385            ThinVec<TestBinderConstraint>,
386            ThinVec<TestBinderExists>,
387            ThinVec<TestBinderForall>,
388            ThinVec<Box<Ty>>,
389            ThinVec<TyPat>,
390            ThinVec<EiiImpl>,
391        );
392
393        // This macro generates `impl Visitable` and `impl MutVisitable` that forward to `Walkable`
394        // or `MutWalkable`. By default, all types that do not have a custom visit method in the
395        // visitor should appear here.
396        impl_visitable_direct!($(<$lt>)?
397            AngleBracketedArg,
398            AngleBracketedArgs,
399            AsmMacro,
400            AssignOpKind,
401            AssocItemConstraintKind,
402            AttrArgs,
403            AttrItem,
404            AttrKind,
405            AttrStyle,
406            FnPtrTy,
407            BindingMode,
408            CoroutineKind,
409            RangeLimits,
410            UnsafeBinderCastKind,
411            BinOpKind,
412            BlockCheckMode,
413            BorrowKind,
414            BoundAsyncness,
415            BoundConstness,
416            BoundPolarity,
417            ByRef,
418            Closure,
419            Const,
420            ConstBlockItem,
421            ConstItem,
422            Defaultness,
423            Delegation,
424            DelegationMac,
425            DelegationSuffixes,
426            DelimArgs,
427            DelimSpan,
428            EnumDef,
429            Extern,
430            ForLoopKind,
431            FormatArgPosition,
432            FormatArgsPiece,
433            FormatArgument,
434            FormatArgumentKind,
435            FormatArguments,
436            FormatPlaceholder,
437            GenericParamKind,
438            Guard,
439            Impl,
440            ImplPolarity,
441            Inline,
442            InlineAsmOperand,
443            InlineAsmRegOrRegClass,
444            InlineAsmTemplatePiece,
445            IsAuto,
446            LocalKind,
447            MacCallStmt,
448            MacStmtStyle,
449            MatchKind,
450            MethodCall,
451            ModKind,
452            ModSpans,
453            MutTy,
454            NormalAttr,
455            Parens,
456            ParenthesizedArgs,
457            PatFieldsRest,
458            PatKind,
459            RangeEnd,
460            RangeSyntax,
461            Recovered,
462            RestrictionKind,
463            Safety,
464            StaticItem,
465            StrLit,
466            StrStyle,
467            StructExpr,
468            StructRest,
469            Term,
470            Trait,
471            TraitBoundModifiers,
472            TraitObjectSyntax,
473            TyAlias,
474            TyKind,
475            TyPatKind,
476            UnOp,
477            UnsafeBinderTy,
478            UnsafeSource,
479            UseTreeKind,
480            VisibilityKind,
481            WhereBoundPredicate,
482            WhereClause,
483            WhereEqPredicate,
484            WhereRegionPredicate,
485            YieldKind,
486            EiiDecl,
487            EiiImpl,
488        );
489
490        /// Each method of this trait is a hook to be potentially
491        /// overridden. Each method's default implementation recursively visits
492        /// the substructure of the input via the corresponding `walk` method;
493        #[doc = concat!(
494            " e.g., the `visit_item` method by default calls `visit"
495            $(, "_", stringify!($mut))?,
496            "::walk_item`."
497        )]
498        ///
499        /// If you want to ensure that your code handles every variant
500        /// explicitly, you need to override each method. (And you also need
501        /// to monitor future changes to this trait in case a new method with a
502        /// new default implementation gets introduced.)
503        ///
504        /// Every `walk_*` method uses deconstruction to access fields of structs and
505        /// enums. This will result in a compile error if a field is added, which makes
506        /// it more likely the appropriate visit call will be added for it.
507        pub trait $Visitor<$($lt)?>: Sized $(${ignore($mut)} + MutVisitorResult<Result = ()>)? {
508            $(
509                ${ignore($lt)}
510                /// The result type of the `visit_*` methods. Can be either `()`,
511                /// or `ControlFlow<T>`.
512                type Result: VisitorResult = ();
513            )?
514
515            // Methods in this trait have one of three forms, with the last two forms
516            // only occurring on `MutVisitor`:
517            //
518            //   fn visit_t(&mut self, t: &mut T);                      // common
519            //   fn flat_map_t(&mut self, t: T) -> SmallVec<[T; 1]>;    // rare
520            //   fn filter_map_t(&mut self, t: T) -> Option<T>;         // rarest
521            //
522            // When writing these methods, it is better to use destructuring like this:
523            //
524            //   fn visit_abc(&mut self, ABC { a, b, c: _ }: &mut ABC) {
525            //       visit_a(a);
526            //       visit_b(b);
527            //   }
528            //
529            // than to use field access like this:
530            //
531            //   fn visit_abc(&mut self, abc: &mut ABC) {
532            //       visit_a(&mut abc.a);
533            //       visit_b(&mut abc.b);
534            //       // ignore abc.c
535            //   }
536            //
537            // As well as being more concise, the former is explicit about which fields
538            // are skipped. Furthermore, if a new field is added, the destructuring
539            // version will cause a compile error, which is good. In comparison, the
540            // field access version will continue working and it would be easy to
541            // forget to add handling for it.
542            fn visit_ident(&mut self, Ident { name: _, span }: &$($lt)? $($mut)? Ident)
543                -> Self::Result
544            {
545                impl_visitable!(|&$($lt)? $($mut)? self: Ident, visitor: &mut V, _extra: ()| {
546                    visitor.visit_ident(self)
547                });
548                visit_visitable!(self, span);
549                Self::Result::output()
550            }
551
552            // This macro defines a custom visit method for each listed type.
553            // It implements `impl Visitable` and `impl MutVisitable` to call those methods on the
554            // visitor.
555            impl_visitable_calling_walkable!($(<$lt>)?
556                fn visit_anon_const(AnonConst);
557                fn visit_arm(Arm);
558                //fn visit_assoc_item(AssocItem, _ctxt: AssocCtxt);
559                fn visit_assoc_item_constraint(AssocItemConstraint);
560                fn visit_attribute(Attribute);
561                fn visit_block(Block);
562                //fn visit_nested_use_tree((UseTree, NodeId));
563                fn visit_capture_by(CaptureBy);
564                fn visit_closure_binder(ClosureBinder);
565                fn visit_contract(FnContract);
566                fn visit_coroutine_marker(CoroutineMarker);
567                fn visit_crate(Crate);
568                fn visit_expr(Expr);
569                fn visit_expr_field(ExprField);
570                fn visit_field_def(FieldDef);
571                fn visit_field_def_extras(FieldDefExtras);
572                fn visit_fn_decl(FnDecl);
573                fn visit_fn_header(FnHeader);
574                fn visit_fn_ret_ty(FnRetTy);
575                //fn visit_foreign_item(ForeignItem);
576                fn visit_foreign_mod(ForeignMod);
577                fn visit_format_args(FormatArgs);
578                fn visit_generic_arg(GenericArg);
579                fn visit_generic_args(GenericArgs);
580                fn visit_generic_param(GenericParam);
581                fn visit_generics(Generics);
582                fn visit_inline_asm(InlineAsm);
583                fn visit_inline_asm_sym(InlineAsmSym);
584                fn visit_impl_restriction(ImplRestriction);
585                //fn visit_item(Item);
586                fn visit_label(Label);
587                fn visit_lifetime(Lifetime, _ctxt: LifetimeCtxt);
588                fn visit_local(Local);
589                fn visit_mac_call(MacCall);
590                fn visit_macro_def(MacroDef);
591                fn visit_mut_restriction(MutRestriction);
592                fn visit_param_bound(GenericBound, _ctxt: BoundKind);
593                fn visit_param(Param);
594                fn visit_pat_field(PatField);
595                fn visit_path(Path);
596                fn visit_path_segment(PathSegment);
597                fn visit_pat(Pat);
598                fn visit_poly_trait_ref(PolyTraitRef);
599                fn visit_precise_capturing_arg(PreciseCapturingArg);
600                fn visit_qself(QSelf);
601                fn visit_test_binder_body(TestBinderBody);
602                fn visit_test_binder_constraint(TestBinderConstraint);
603                fn visit_test_binder_bound_type_constraint(TestBinderBoundTypeConstraint);
604                fn visit_test_binder_constraints(TestBinderConstraints);
605                fn visit_test_binder_exists(TestBinderExists);
606                fn visit_test_binder_forall(TestBinderForall);
607                fn visit_trait_ref(TraitRef);
608                fn visit_ty_pat(TyPat);
609                fn visit_ty(Ty);
610                fn visit_use_tree(UseTree);
611                fn visit_variant_data(VariantData);
612                fn visit_variant(Variant);
613                fn visit_vis(Visibility);
614                fn visit_where_predicate_kind(WherePredicateKind);
615                fn visit_where_predicate(WherePredicate);
616            );
617
618            // We want `Visitor` to take the `NodeId` by value.
619            fn visit_id(&mut self, _id: $(&$mut)? NodeId) -> Self::Result {
620                $(impl_visitable!(
621                    |&$lt self: NodeId, visitor: &mut V, _extra: ()| {
622                        visitor.visit_id(*self)
623                    }
624                );)?
625                $(impl_visitable!(
626                    |&$mut self: NodeId, visitor: &mut V, _extra: ()| {
627                        visitor.visit_id(self)
628                    }
629                );)?
630                Self::Result::output()
631            }
632
633            /// This method is a hack to workaround unstable of `stmt_expr_attributes`.
634            /// It can be removed once that feature is stabilized.
635            fn visit_method_receiver_expr(&mut self, ex: &$($lt)? $($mut)? Expr) -> Self::Result {
636                self.visit_expr(ex)
637            }
638
639            fn visit_item(&mut self, item: &$($lt)? $($mut)? Item) -> Self::Result {
640                impl_visitable!(|&$($lt)? $($mut)? self: Item, vis: &mut V, _extra: ()| {
641                    vis.visit_item(self)
642                });
643                walk_item(self, item)
644            }
645
646            fn visit_foreign_item(&mut self, item: &$($lt)? $($mut)? ForeignItem) -> Self::Result {
647                impl_visitable!(|&$($lt)? $($mut)? self: ForeignItem, vis: &mut V, _extra: ()| {
648                    vis.visit_foreign_item(self)
649                });
650                walk_item(self, item)
651            }
652
653            fn visit_assoc_item(&mut self, item: &$($lt)? $($mut)? AssocItem, ctxt: AssocCtxt)
654                -> Self::Result
655            {
656                impl_visitable!(|&$($lt)? $($mut)? self: AssocItem, vis: &mut V, ctxt: AssocCtxt| {
657                    vis.visit_assoc_item(self, ctxt)
658                });
659                walk_assoc_item(self, item, ctxt)
660            }
661
662            // for `MutVisitor`: `Span` and `NodeId` are mutated at the caller site.
663            fn visit_fn(
664                &mut self,
665                fk: FnKind<$($lt)? $(${ignore($mut)} '_)?>,
666                _: &AttrVec,
667                _: Span,
668                _: NodeId,
669            ) -> Self::Result {
670                walk_fn(self, fk)
671            }
672
673            // (non-mut) `Visitor`-only methods
674            $(
675                fn visit_stmt(&mut self, s: &$lt Stmt) -> Self::Result {
676                    walk_stmt(self, s)
677                }
678
679                fn visit_nested_use_tree(&mut self, use_tree: &$lt UseTree, id: NodeId)
680                    -> Self::Result
681                {
682                    try_visit!(self.visit_id(id));
683                    self.visit_use_tree(use_tree)
684                }
685            )?
686
687            // `MutVisitor`-only methods
688            $(
689                // Span visiting is no longer used, but we keep it for now,
690                // in case it's needed for something like #127241.
691                #[inline]
692                fn visit_span(&mut self, _sp: &$mut Span) {
693                    impl_visitable!(|&mut self: Span, visitor: &mut V, _extra: ()| {
694                        visitor.visit_span(self)
695                    });
696                    // Do nothing.
697                }
698
699                fn flat_map_foreign_item(&mut self, ni: Box<ForeignItem>)
700                    -> SmallVec<[Box<ForeignItem>; 1]>
701                {
702                    walk_flat_map_foreign_item(self, ni)
703                }
704
705                fn flat_map_item(&mut self, i: Box<Item>) -> SmallVec<[Box<Item>; 1]> {
706                    walk_flat_map_item(self, i)
707                }
708
709                fn flat_map_field_def(&mut self, fd: FieldDef) -> SmallVec<[FieldDef; 1]> {
710                    walk_flat_map_field_def(self, fd)
711                }
712
713                fn flat_map_assoc_item(
714                    &mut self,
715                    i: Box<AssocItem>,
716                    ctxt: AssocCtxt,
717                ) -> SmallVec<[Box<AssocItem>; 1]> {
718                    walk_flat_map_assoc_item(self, i, ctxt)
719                }
720
721                fn flat_map_stmt(&mut self, s: Stmt) -> SmallVec<[Stmt; 1]> {
722                    walk_flat_map_stmt(self, s)
723                }
724
725                fn flat_map_arm(&mut self, arm: Arm) -> SmallVec<[Arm; 1]> {
726                    walk_flat_map_arm(self, arm)
727                }
728
729                fn filter_map_expr(&mut self, e: Box<Expr>) -> Option<Box<Expr>> {
730                    walk_filter_map_expr(self, e)
731                }
732
733                fn flat_map_variant(&mut self, v: Variant) -> SmallVec<[Variant; 1]> {
734                    walk_flat_map_variant(self, v)
735                }
736
737                fn flat_map_param(&mut self, param: Param) -> SmallVec<[Param; 1]> {
738                    walk_flat_map_param(self, param)
739                }
740
741                fn flat_map_generic_param(&mut self, param: GenericParam)
742                    -> SmallVec<[GenericParam; 1]>
743                {
744                    walk_flat_map_generic_param(self, param)
745                }
746
747                fn flat_map_expr_field(&mut self, f: ExprField) -> SmallVec<[ExprField; 1]> {
748                    walk_flat_map_expr_field(self, f)
749                }
750
751                fn flat_map_where_predicate(
752                    &mut self,
753                    where_predicate: WherePredicate,
754                ) -> SmallVec<[WherePredicate; 1]> {
755                    walk_flat_map_where_predicate(self, where_predicate)
756                }
757
758                fn flat_map_pat_field(&mut self, fp: PatField) -> SmallVec<[PatField; 1]> {
759                    walk_flat_map_pat_field(self, fp)
760                }
761            )?
762        }
763
764        pub trait WalkItemKind {
765            type Ctxt;
766            fn walk<$($lt,)? V: $Visitor$(<$lt>)?>(
767                &$($lt)? $($mut)? self,
768                attrs: &AttrVec,
769                span: Span,
770                id: NodeId,
771                visibility: &$($lt)? $($mut)? Visibility,
772                ctxt: Self::Ctxt,
773                vis: &mut V,
774            ) -> V::Result;
775        }
776
777        $(impl_visitable!(|&$lt self: ThinVec<(UseTree, NodeId)>, vis: &mut V, _extra: ()| {
778            for (nested_tree, nested_id) in self {
779                try_visit!(vis.visit_nested_use_tree(nested_tree, *nested_id));
780            }
781            V::Result::output()
782        });)?
783        $(${ignore($mut)} impl_visitable_list!(ThinVec<(UseTree, NodeId)>,);)?
784
785        fn walk_item_inner<$($lt,)? K: WalkItemKind, V: $Visitor$(<$lt>)?>(
786            visitor: &mut V,
787            item: &$($lt)? $($mut)? Item<K>,
788            ctxt: K::Ctxt,
789        ) -> V::Result {
790            let Item { attrs, id, kind, vis, span, tokens: _ } = item;
791            visit_visitable!(visitor, id, attrs, vis);
792            try_visit!(kind.walk(attrs, *span, *id, vis, ctxt, visitor));
793            visit_visitable!(visitor, span);
794            V::Result::output()
795        }
796
797        // Do not implement `Walkable`/`MutWalkable` for *Item to avoid confusion.
798        pub fn walk_item<$($lt,)? K: WalkItemKind<Ctxt = ()>, V: $Visitor$(<$lt>)?>(
799            visitor: &mut V,
800            item: &$($lt)? $($mut)? Item<K>,
801        ) -> V::Result {
802            walk_item_inner(visitor, item, ())
803        }
804
805        // Do not implement `Walkable`/`MutWalkable` for *Item to avoid confusion.
806        pub fn walk_assoc_item<$($lt,)? K: WalkItemKind<Ctxt = AssocCtxt>, V: $Visitor$(<$lt>)?>(
807            visitor: &mut V,
808            item: &$($lt)? $($mut)? Item<K>,
809            ctxt: AssocCtxt,
810        ) -> V::Result {
811            walk_item_inner(visitor, item, ctxt)
812        }
813
814        impl WalkItemKind for ItemKind {
815            type Ctxt = ();
816            fn walk<$($lt,)? V: $Visitor$(<$lt>)?>(
817                &$($lt)? $($mut)? self,
818                attrs: &AttrVec,
819                span: Span,
820                id: NodeId,
821                visibility: &$($lt)? $($mut)? Visibility,
822                _ctxt: Self::Ctxt,
823                vis: &mut V,
824            ) -> V::Result {
825                match self {
826                    ItemKind::Fn(func) => {
827                        let kind = FnKind::Fn(FnCtxt::Free, visibility, &$($mut)? *func);
828                        try_visit!(vis.visit_fn(kind, attrs, span, id));
829                    }
830                    ItemKind::ExternCrate(orig_name, ident) =>
831                        visit_visitable!(vis, orig_name, ident),
832                    ItemKind::Use(use_tree) =>
833                        visit_visitable!(vis, use_tree),
834                    ItemKind::Static(item) =>
835                        visit_visitable!(vis, item),
836                    ItemKind::ConstBlock(item) =>
837                        visit_visitable!(vis, item),
838                    ItemKind::Const(item) =>
839                        visit_visitable!(vis, item),
840                    ItemKind::Mod(safety, ident, mod_kind) =>
841                        visit_visitable!(vis, safety, ident, mod_kind),
842                    ItemKind::ForeignMod(nm) =>
843                        visit_visitable!(vis, nm),
844                    ItemKind::GlobalAsm(asm) =>
845                        visit_visitable!(vis, asm),
846                    ItemKind::TyAlias(ty_alias) =>
847                        visit_visitable!(vis, ty_alias),
848                    ItemKind::Enum(ident, generics, enum_definition) =>
849                        visit_visitable!(vis, ident, generics, enum_definition),
850                    ItemKind::Struct(ident, generics, variant_data)
851                    | ItemKind::Union(ident, generics, variant_data) =>
852                        visit_visitable!(vis, ident, generics, variant_data),
853                    ItemKind::Impl(impl_) =>
854                        visit_visitable!(vis, impl_),
855                    ItemKind::Trait(trait_) =>
856                        visit_visitable!(vis, trait_),
857                    ItemKind::TraitAlias(TraitAlias { constness, ident, generics, bounds }) => {
858                        visit_visitable!(vis, constness, ident, generics);
859                        visit_visitable_with!(vis, bounds, BoundKind::Bound)
860                    }
861                    ItemKind::MacCall(m) =>
862                        visit_visitable!(vis, m),
863                    ItemKind::MacroDef(ident, def) =>
864                        visit_visitable!(vis, ident, def),
865                    ItemKind::Delegation(delegation) =>
866                        visit_visitable!(vis, delegation),
867                    ItemKind::DelegationMac(dm) =>
868                        visit_visitable!(vis, dm),
869                    ItemKind::TestBinderConstraints(item) =>
870                        visit_visitable!(vis, item),
871                }
872                V::Result::output()
873            }
874        }
875
876        impl WalkItemKind for AssocItemKind {
877            type Ctxt = AssocCtxt;
878            fn walk<$($lt,)? V: $Visitor$(<$lt>)?>(
879                &$($lt)? $($mut)? self,
880                attrs: &AttrVec,
881                span: Span,
882                id: NodeId,
883                visibility: &$($lt)? $($mut)? Visibility,
884                ctxt: Self::Ctxt,
885                vis: &mut V,
886            ) -> V::Result {
887                match self {
888                    AssocItemKind::Const(item) =>
889                        visit_visitable!(vis, item),
890                    AssocItemKind::Fn(func) => {
891                        let kind = FnKind::Fn(FnCtxt::Assoc(ctxt), visibility, &$($mut)? *func);
892                        try_visit!(vis.visit_fn(kind, attrs, span, id))
893                    }
894                    AssocItemKind::Type(alias) =>
895                        visit_visitable!(vis, alias),
896                    AssocItemKind::MacCall(mac) =>
897                        visit_visitable!(vis, mac),
898                    AssocItemKind::Delegation(delegation) =>
899                        visit_visitable!(vis, delegation),
900                    AssocItemKind::DelegationMac(dm) =>
901                        visit_visitable!(vis, dm),
902                }
903                V::Result::output()
904            }
905        }
906
907        impl WalkItemKind for ForeignItemKind {
908            type Ctxt = ();
909            fn walk<$($lt,)? V: $Visitor$(<$lt>)?>(
910                &$($lt)? $($mut)? self,
911                attrs: &AttrVec,
912                span: Span,
913                id: NodeId,
914                visibility: &$($lt)? $($mut)? Visibility,
915                _ctxt: Self::Ctxt,
916                vis: &mut V,
917            ) -> V::Result {
918                match self {
919                    ForeignItemKind::Static(item) =>
920                        visit_visitable!(vis, item),
921                    ForeignItemKind::Fn(func) => {
922                        let kind = FnKind::Fn(FnCtxt::Foreign, visibility, &$($mut)? *func);
923                        try_visit!(vis.visit_fn(kind, attrs, span, id))
924                    }
925                    ForeignItemKind::TyAlias(alias) =>
926                        visit_visitable!(vis, alias),
927                    ForeignItemKind::MacCall(mac) =>
928                        visit_visitable!(vis, mac),
929                }
930                V::Result::output()
931            }
932        }
933
934        pub fn walk_fn<$($lt,)? V: $Visitor$(<$lt>)?>(
935            vis: &mut V,
936            kind: FnKind<$($lt)? $(${ignore($mut)} '_)?>,
937        ) -> V::Result {
938            match kind {
939                FnKind::Fn(
940                    _ctxt,
941                    // Visibility is visited as a part of the item.
942                    _vis,
943                    Fn {
944                        defaultness,
945                        ident,
946                        sig,
947                        generics,
948                        contract,
949                        body,
950                        define_opaque,
951                        eii_impl,
952                    },
953                ) => {
954                    let FnSig { header, decl, span } = sig;
955                    visit_visitable!(vis,
956                        defaultness, ident, header, generics, decl,
957                        contract, body, span, define_opaque, eii_impl
958                    );
959                }
960                FnKind::Closure(binder, coroutine_marker, decl, body) =>
961                    visit_visitable!(vis, binder, coroutine_marker, decl, body),
962            }
963            V::Result::output()
964        }
965
966        impl_walkable!(|&$($lt)? $($mut)? self: Impl, vis: &mut V| {
967            let Impl { generics, of_trait, self_ty, items, constness: _ } = self;
968            try_visit!(vis.visit_generics(generics));
969            if let Some(of_trait) = of_trait {
970                let TraitImplHeader { defaultness, safety, polarity, trait_ref } = of_trait;
971                visit_visitable!(vis, defaultness, safety, polarity, trait_ref);
972            }
973            try_visit!(vis.visit_ty(self_ty));
974            visit_visitable_with!(vis, items, AssocCtxt::Impl { of_trait: of_trait.is_some() });
975            V::Result::output()
976        });
977
978        // Special case to call `visit_method_receiver_expr`.
979        impl_walkable!(|&$($lt)? $($mut)? self: MethodCall, vis: &mut V| {
980            let MethodCall { seg, receiver, args, span } = self;
981            try_visit!(vis.visit_method_receiver_expr(receiver));
982            visit_visitable!(vis, seg, args, span);
983            V::Result::output()
984        });
985
986        impl_walkable!(|&$($lt)? $($mut)? self: Expr, vis: &mut V| {
987            let Expr { id, kind, span, attrs, tokens: _ } = self;
988            visit_visitable!(vis, id, attrs);
989            match kind {
990                ExprKind::Array(exprs) =>
991                    visit_visitable!(vis, exprs),
992                ExprKind::ConstBlock(anon_const) =>
993                    visit_visitable!(vis, anon_const),
994                ExprKind::Repeat(element, count) =>
995                    visit_visitable!(vis, element, count),
996                ExprKind::Struct(se) =>
997                    visit_visitable!(vis, se),
998                ExprKind::Tup(exprs) =>
999                    visit_visitable!(vis, exprs),
1000                ExprKind::Call(callee_expression, arguments) =>
1001                    visit_visitable!(vis, callee_expression, arguments),
1002                ExprKind::MethodCall(mc) =>
1003                    visit_visitable!(vis, mc),
1004                ExprKind::Binary(op, lhs, rhs) =>
1005                    visit_visitable!(vis, op, lhs, rhs),
1006                ExprKind::AddrOf(kind, mutbl, subexpression) =>
1007                    visit_visitable!(vis, kind, mutbl, subexpression),
1008                ExprKind::Unary(op, subexpression) =>
1009                    visit_visitable!(vis, op, subexpression),
1010                ExprKind::Cast(subexpression, typ) | ExprKind::Type(subexpression, typ) =>
1011                    visit_visitable!(vis, subexpression, typ),
1012                ExprKind::Let(pat, expr, span, _recovered) =>
1013                    visit_visitable!(vis, pat, expr, span),
1014                ExprKind::If(head_expression, if_block, optional_else) =>
1015                    visit_visitable!(vis, head_expression, if_block, optional_else),
1016                ExprKind::While(subexpression, block, opt_label) =>
1017                    visit_visitable!(vis, subexpression, block, opt_label),
1018                ExprKind::ForLoop(ForLoop { pat, iter, body, label, kind }) =>
1019                    visit_visitable!(vis, pat, iter, body, label, kind),
1020                ExprKind::Loop(block, opt_label, span) =>
1021                    visit_visitable!(vis, block, opt_label, span),
1022                ExprKind::Match(subexpression, arms, kind) =>
1023                    visit_visitable!(vis, subexpression, arms, kind),
1024                ExprKind::Closure(Closure {
1025                    binder,
1026                    capture_clause,
1027                    coroutine_marker,
1028                    constness,
1029                    movability,
1030                    fn_decl,
1031                    body,
1032                    fn_decl_span,
1033                    fn_arg_span,
1034                }) => {
1035                    visit_visitable!(vis, constness, movability, capture_clause);
1036                    let kind = FnKind::Closure(binder, coroutine_marker, fn_decl, body);
1037                    try_visit!(vis.visit_fn(kind, attrs, *span, *id));
1038                    visit_visitable!(vis, fn_decl_span, fn_arg_span);
1039                }
1040                ExprKind::Block(block, opt_label) =>
1041                    visit_visitable!(vis, block, opt_label),
1042                ExprKind::Gen(capt, body, kind, decl_span) =>
1043                    visit_visitable!(vis, capt, body, kind, decl_span),
1044                ExprKind::Await(expr, span)
1045                | ExprKind::Move(expr, span)
1046                | ExprKind::Use(expr, span) =>
1047                    visit_visitable!(vis, expr, span),
1048                ExprKind::Assign(lhs, rhs, span) =>
1049                    visit_visitable!(vis, lhs, rhs, span),
1050                ExprKind::AssignOp(op, lhs, rhs) =>
1051                    visit_visitable!(vis, op, lhs, rhs),
1052                ExprKind::Field(subexpression, ident) =>
1053                    visit_visitable!(vis, subexpression, ident),
1054                ExprKind::Index(main_expression, index_expression, span) =>
1055                    visit_visitable!(vis, main_expression, index_expression, span),
1056                ExprKind::Range(start, end, limit) =>
1057                    visit_visitable!(vis, start, end, limit),
1058                ExprKind::Underscore => {}
1059                ExprKind::Path(maybe_qself, path) =>
1060                    visit_visitable!(vis, maybe_qself, path),
1061                ExprKind::Break(opt_label, opt_expr) =>
1062                    visit_visitable!(vis, opt_label, opt_expr),
1063                ExprKind::Continue(opt_label) =>
1064                    visit_visitable!(vis, opt_label),
1065                ExprKind::Ret(optional_expression) | ExprKind::Yeet(optional_expression) =>
1066                    visit_visitable!(vis, optional_expression),
1067                ExprKind::Become(expr) =>
1068                    visit_visitable!(vis, expr),
1069                ExprKind::MacCall(mac) =>
1070                    visit_visitable!(vis, mac),
1071                ExprKind::Paren(subexpression) =>
1072                    visit_visitable!(vis, subexpression),
1073                ExprKind::InlineAsm(asm) =>
1074                    visit_visitable!(vis, asm),
1075                ExprKind::FormatArgs(f) =>
1076                    visit_visitable!(vis, f),
1077                ExprKind::OffsetOf(container, fields) =>
1078                    visit_visitable!(vis, container, fields),
1079                ExprKind::Yield(kind) =>
1080                    visit_visitable!(vis, kind),
1081                ExprKind::Try(subexpression) =>
1082                    visit_visitable!(vis, subexpression),
1083                ExprKind::TryBlock(body, optional_type) =>
1084                    visit_visitable!(vis, body, optional_type),
1085                ExprKind::Lit(token) =>
1086                    visit_visitable!(vis, token),
1087                ExprKind::IncludedBytes(bytes) =>
1088                    visit_visitable!(vis, bytes),
1089                ExprKind::UnsafeBinderCast(kind, expr, ty) =>
1090                    visit_visitable!(vis, kind, expr, ty),
1091                ExprKind::DirectConstArg(expr) =>
1092                    visit_visitable!(vis, expr),
1093                ExprKind::Err(_guar) => {}
1094                ExprKind::Dummy => {}
1095            }
1096
1097            visit_visitable!(vis, span);
1098            V::Result::output()
1099        });
1100
1101        define_named_walk!($Visitor$(<$lt>)?
1102            pub fn walk_anon_const(AnonConst);
1103            pub fn walk_arm(Arm);
1104            //pub fn walk_assoc_item(AssocItem, _ctxt: AssocCtxt);
1105            pub fn walk_assoc_item_constraint(AssocItemConstraint);
1106            pub fn walk_attribute(Attribute);
1107            pub fn walk_block(Block);
1108            //pub fn walk_nested_use_tree((UseTree, NodeId));
1109            pub fn walk_capture_by(CaptureBy);
1110            pub fn walk_closure_binder(ClosureBinder);
1111            pub fn walk_contract(FnContract);
1112            pub fn walk_coroutine_marker(CoroutineMarker);
1113            pub fn walk_crate(Crate);
1114            pub fn walk_expr(Expr);
1115            pub fn walk_expr_field(ExprField);
1116            pub fn walk_field_def(FieldDef);
1117            pub fn walk_field_def_extras(FieldDefExtras);
1118            pub fn walk_fn_decl(FnDecl);
1119            pub fn walk_fn_header(FnHeader);
1120            pub fn walk_fn_ret_ty(FnRetTy);
1121            //pub fn walk_foreign_item(ForeignItem);
1122            pub fn walk_foreign_mod(ForeignMod);
1123            pub fn walk_format_args(FormatArgs);
1124            pub fn walk_generic_arg(GenericArg);
1125            pub fn walk_generic_args(GenericArgs);
1126            pub fn walk_generic_param(GenericParam);
1127            pub fn walk_generics(Generics);
1128            pub fn walk_inline_asm(InlineAsm);
1129            pub fn walk_inline_asm_sym(InlineAsmSym);
1130            pub fn walk_impl_restriction(ImplRestriction);
1131            //pub fn walk_item(Item);
1132            pub fn walk_label(Label);
1133            pub fn walk_lifetime(Lifetime);
1134            pub fn walk_local(Local);
1135            pub fn walk_mac(MacCall);
1136            pub fn walk_macro_def(MacroDef);
1137            pub fn walk_mut_restriction(MutRestriction);
1138            pub fn walk_param_bound(GenericBound);
1139            pub fn walk_param(Param);
1140            pub fn walk_pat_field(PatField);
1141            pub fn walk_path(Path);
1142            pub fn walk_path_segment(PathSegment);
1143            pub fn walk_pat(Pat);
1144            pub fn walk_poly_trait_ref(PolyTraitRef);
1145            pub fn walk_precise_capturing_arg(PreciseCapturingArg);
1146            pub fn walk_qself(QSelf);
1147            pub fn walk_test_binder_body(TestBinderBody);
1148            pub fn walk_test_binder_constraint(TestBinderConstraint);
1149            pub fn walk_test_binder_bound_type_constraint(TestBinderBoundTypeConstraint);
1150            pub fn walk_test_binder_exists(TestBinderExists);
1151            pub fn walk_test_binder_forall(TestBinderForall);
1152            pub fn walk_trait_ref(TraitRef);
1153            pub fn walk_ty_pat(TyPat);
1154            pub fn walk_ty(Ty);
1155            pub fn walk_use_tree(UseTree);
1156            pub fn walk_variant_data(VariantData);
1157            pub fn walk_variant(Variant);
1158            pub fn walk_vis(Visibility);
1159            pub fn walk_where_predicate_kind(WherePredicateKind);
1160            pub fn walk_where_predicate(WherePredicate);
1161        );
1162    };
1163}
1164
1165pub enum FnKind<'a> {

    /// E.g., `fn foo()`, `fn foo(&self)`, or `extern "Abi" fn foo()`.
    Fn(FnCtxt, &'a Visibility, &'a Fn),

    /// E.g., `|x, y| body`.
    Closure(&'a ClosureBinder, &'a Option<CoroutineMarker>, &'a Box<FnDecl>,
        &'a Box<Expr>),
}
#[automatically_derived]
impl<'a> ::core::fmt::Debug for FnKind<'a> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            FnKind::Fn(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Fn",
                    __self_0, __self_1, &__self_2),
            FnKind::Closure(__self_0, __self_1, __self_2, __self_3) =>
                ::core::fmt::Formatter::debug_tuple_field4_finish(f,
                    "Closure", __self_0, __self_1, __self_2, &__self_3),
        }
    }
}
#[automatically_derived]
impl<'a> ::core::marker::Copy for FnKind<'a> { }
#[automatically_derived]
#[doc(hidden)]
unsafe impl<'a> ::core::clone::TrivialClone for FnKind<'a> { }
#[automatically_derived]
impl<'a> ::core::clone::Clone for FnKind<'a> {
    #[inline]
    fn clone(&self) -> FnKind<'a> {
        let _: ::core::clone::AssertParamIsClone<FnCtxt>;
        let _: ::core::clone::AssertParamIsClone<&'a Visibility>;
        let _: ::core::clone::AssertParamIsClone<&'a Fn>;
        let _: ::core::clone::AssertParamIsClone<&'a ClosureBinder>;
        let _: ::core::clone::AssertParamIsClone<&'a Option<CoroutineMarker>>;
        let _: ::core::clone::AssertParamIsClone<&'a Box<FnDecl>>;
        let _: ::core::clone::AssertParamIsClone<&'a Box<Expr>>;
        *self
    }
}
impl<'a> FnKind<'_> {
    pub fn header(&'a self) -> Option<&'a FnHeader> {
        match *self {
            FnKind::Fn(_, _, Fn { sig, .. }) => Some(&sig.header),
            FnKind::Closure(..) => None,
        }
    }
    pub fn ident(&'a self) -> Option<&'a Ident> {
        match self {
            FnKind::Fn(_, _, Fn { ident, .. }) => Some(ident),
            _ => None,
        }
    }
    pub fn decl(&'a self) -> &'a FnDecl {
        match self {
            FnKind::Fn(_, _, Fn { sig, .. }) => &sig.decl,
            FnKind::Closure(_, _, decl, _) => decl,
        }
    }
    pub fn ctxt(&self) -> Option<FnCtxt> {
        match self {
            FnKind::Fn(ctxt, ..) => Some(*ctxt),
            FnKind::Closure(..) => None,
        }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for AttrId {
    type Extra = ();
    fn visit(&'a self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        { V::Result::output() }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for bool {
    type Extra = ();
    fn visit(&'a self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        { V::Result::output() }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for rustc_span::ByteSymbol {
    type Extra = ();
    fn visit(&'a self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        { V::Result::output() }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for char {
    type Extra = ();
    fn visit(&'a self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        { V::Result::output() }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for crate::token::CommentKind {
    type Extra = ();
    fn visit(&'a self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        { V::Result::output() }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for crate::token::Delimiter {
    type Extra = ();
    fn visit(&'a self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        { V::Result::output() }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for crate::token::Lit {
    type Extra = ();
    fn visit(&'a self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        { V::Result::output() }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for crate::token::LitKind {
    type Extra = ();
    fn visit(&'a self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        { V::Result::output() }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for
    crate::tokenstream::LazyAttrTokenStream {
    type Extra = ();
    fn visit(&'a self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        { V::Result::output() }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for crate::tokenstream::TokenStream
    {
    type Extra = ();
    fn visit(&'a self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        { V::Result::output() }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for Movability {
    type Extra = ();
    fn visit(&'a self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        { V::Result::output() }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for Mutability {
    type Extra = ();
    fn visit(&'a self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        { V::Result::output() }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for Pinnedness {
    type Extra = ();
    fn visit(&'a self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        { V::Result::output() }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for
    Result<(), rustc_span::ErrorGuaranteed> {
    type Extra = ();
    fn visit(&'a self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        { V::Result::output() }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for
    rustc_data_structures::fx::FxHashMap<Symbol, usize> {
    type Extra = ();
    fn visit(&'a self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        { V::Result::output() }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for rustc_span::ErrorGuaranteed {
    type Extra = ();
    fn visit(&'a self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        { V::Result::output() }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for std::borrow::Cow<'_, str> {
    type Extra = ();
    fn visit(&'a self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        { V::Result::output() }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for Symbol {
    type Extra = ();
    fn visit(&'a self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        { V::Result::output() }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for SyntheticAttr {
    type Extra = ();
    fn visit(&'a self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        { V::Result::output() }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for u8 {
    type Extra = ();
    fn visit(&'a self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        { V::Result::output() }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for usize {
    type Extra = ();
    fn visit(&'a self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        { V::Result::output() }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for Span {
    type Extra = ();
    fn visit(&'a self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        { V::Result::output() }
    }
}
impl<'a, V: Visitor<'a>, T> Visitable<'a, V> for ThinVec<AngleBracketedArg>
    where &'a ThinVec<AngleBracketedArg>: IntoIterator<Item = &'a T>, T: 'a +
    Visitable<'a, V> {
    type Extra = <T as Visitable<'a, V>>::Extra;
    #[inline]
    fn visit(&'a self, visitor: &mut V, extra: Self::Extra) -> V::Result {
        for i in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(i.visit(visitor,
                        extra)) {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        }
        V::Result::output()
    }
}
impl<'a, V: Visitor<'a>, T> Visitable<'a, V> for ThinVec<Attribute> where
    &'a ThinVec<Attribute>: IntoIterator<Item = &'a T>, T: 'a +
    Visitable<'a, V> {
    type Extra = <T as Visitable<'a, V>>::Extra;
    #[inline]
    fn visit(&'a self, visitor: &mut V, extra: Self::Extra) -> V::Result {
        for i in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(i.visit(visitor,
                        extra)) {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        }
        V::Result::output()
    }
}
impl<'a, V: Visitor<'a>, T> Visitable<'a, V> for ThinVec<GenericBound> where
    &'a ThinVec<GenericBound>: IntoIterator<Item = &'a T>, T: 'a +
    Visitable<'a, V> {
    type Extra = <T as Visitable<'a, V>>::Extra;
    #[inline]
    fn visit(&'a self, visitor: &mut V, extra: Self::Extra) -> V::Result {
        for i in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(i.visit(visitor,
                        extra)) {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        }
        V::Result::output()
    }
}
impl<'a, V: Visitor<'a>, T> Visitable<'a, V> for ThinVec<Ident> where
    &'a ThinVec<Ident>: IntoIterator<Item = &'a T>, T: 'a + Visitable<'a, V> {
    type Extra = <T as Visitable<'a, V>>::Extra;
    #[inline]
    fn visit(&'a self, visitor: &mut V, extra: Self::Extra) -> V::Result {
        for i in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(i.visit(visitor,
                        extra)) {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        }
        V::Result::output()
    }
}
impl<'a, V: Visitor<'a>, T> Visitable<'a, V> for
    ThinVec<(Ident, Option<Ident>)> where
    &'a ThinVec<(Ident, Option<Ident>)>: IntoIterator<Item = &'a T>, T: 'a +
    Visitable<'a, V> {
    type Extra = <T as Visitable<'a, V>>::Extra;
    #[inline]
    fn visit(&'a self, visitor: &mut V, extra: Self::Extra) -> V::Result {
        for i in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(i.visit(visitor,
                        extra)) {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        }
        V::Result::output()
    }
}
impl<'a, V: Visitor<'a>, T> Visitable<'a, V> for ThinVec<(NodeId, Path)> where
    &'a ThinVec<(NodeId, Path)>: IntoIterator<Item = &'a T>, T: 'a +
    Visitable<'a, V> {
    type Extra = <T as Visitable<'a, V>>::Extra;
    #[inline]
    fn visit(&'a self, visitor: &mut V, extra: Self::Extra) -> V::Result {
        for i in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(i.visit(visitor,
                        extra)) {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        }
        V::Result::output()
    }
}
impl<'a, V: Visitor<'a>, T> Visitable<'a, V> for ThinVec<PathSegment> where
    &'a ThinVec<PathSegment>: IntoIterator<Item = &'a T>, T: 'a +
    Visitable<'a, V> {
    type Extra = <T as Visitable<'a, V>>::Extra;
    #[inline]
    fn visit(&'a self, visitor: &mut V, extra: Self::Extra) -> V::Result {
        for i in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(i.visit(visitor,
                        extra)) {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        }
        V::Result::output()
    }
}
impl<'a, V: Visitor<'a>, T> Visitable<'a, V> for ThinVec<PreciseCapturingArg>
    where &'a ThinVec<PreciseCapturingArg>: IntoIterator<Item = &'a T>,
    T: 'a + Visitable<'a, V> {
    type Extra = <T as Visitable<'a, V>>::Extra;
    #[inline]
    fn visit(&'a self, visitor: &mut V, extra: Self::Extra) -> V::Result {
        for i in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(i.visit(visitor,
                        extra)) {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        }
        V::Result::output()
    }
}
impl<'a, V: Visitor<'a>, T> Visitable<'a, V> for ThinVec<Pat> where
    &'a ThinVec<Pat>: IntoIterator<Item = &'a T>, T: 'a + Visitable<'a, V> {
    type Extra = <T as Visitable<'a, V>>::Extra;
    #[inline]
    fn visit(&'a self, visitor: &mut V, extra: Self::Extra) -> V::Result {
        for i in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(i.visit(visitor,
                        extra)) {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        }
        V::Result::output()
    }
}
impl<'a, V: Visitor<'a>, T> Visitable<'a, V> for ThinVec<TestBinderConstraint>
    where &'a ThinVec<TestBinderConstraint>: IntoIterator<Item = &'a T>,
    T: 'a + Visitable<'a, V> {
    type Extra = <T as Visitable<'a, V>>::Extra;
    #[inline]
    fn visit(&'a self, visitor: &mut V, extra: Self::Extra) -> V::Result {
        for i in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(i.visit(visitor,
                        extra)) {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        }
        V::Result::output()
    }
}
impl<'a, V: Visitor<'a>, T> Visitable<'a, V> for ThinVec<TestBinderExists>
    where &'a ThinVec<TestBinderExists>: IntoIterator<Item = &'a T>, T: 'a +
    Visitable<'a, V> {
    type Extra = <T as Visitable<'a, V>>::Extra;
    #[inline]
    fn visit(&'a self, visitor: &mut V, extra: Self::Extra) -> V::Result {
        for i in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(i.visit(visitor,
                        extra)) {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        }
        V::Result::output()
    }
}
impl<'a, V: Visitor<'a>, T> Visitable<'a, V> for ThinVec<TestBinderForall>
    where &'a ThinVec<TestBinderForall>: IntoIterator<Item = &'a T>, T: 'a +
    Visitable<'a, V> {
    type Extra = <T as Visitable<'a, V>>::Extra;
    #[inline]
    fn visit(&'a self, visitor: &mut V, extra: Self::Extra) -> V::Result {
        for i in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(i.visit(visitor,
                        extra)) {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        }
        V::Result::output()
    }
}
impl<'a, V: Visitor<'a>, T> Visitable<'a, V> for ThinVec<Box<Ty>> where
    &'a ThinVec<Box<Ty>>: IntoIterator<Item = &'a T>, T: 'a + Visitable<'a, V>
    {
    type Extra = <T as Visitable<'a, V>>::Extra;
    #[inline]
    fn visit(&'a self, visitor: &mut V, extra: Self::Extra) -> V::Result {
        for i in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(i.visit(visitor,
                        extra)) {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        }
        V::Result::output()
    }
}
impl<'a, V: Visitor<'a>, T> Visitable<'a, V> for ThinVec<TyPat> where
    &'a ThinVec<TyPat>: IntoIterator<Item = &'a T>, T: 'a + Visitable<'a, V> {
    type Extra = <T as Visitable<'a, V>>::Extra;
    #[inline]
    fn visit(&'a self, visitor: &mut V, extra: Self::Extra) -> V::Result {
        for i in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(i.visit(visitor,
                        extra)) {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        }
        V::Result::output()
    }
}
impl<'a, V: Visitor<'a>, T> Visitable<'a, V> for ThinVec<EiiImpl> where
    &'a ThinVec<EiiImpl>: IntoIterator<Item = &'a T>, T: 'a + Visitable<'a, V>
    {
    type Extra = <T as Visitable<'a, V>>::Extra;
    #[inline]
    fn visit(&'a self, visitor: &mut V, extra: Self::Extra) -> V::Result {
        for i in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(i.visit(visitor,
                        extra)) {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        }
        V::Result::output()
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for AngleBracketedArg {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for AngleBracketedArgs {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for AsmMacro {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for AssignOpKind {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for AssocItemConstraintKind {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for AttrArgs {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for AttrItem {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for AttrKind {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for AttrStyle {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for FnPtrTy {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for BindingMode {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for CoroutineKind {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for RangeLimits {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for UnsafeBinderCastKind {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for BinOpKind {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for BlockCheckMode {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for BorrowKind {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for BoundAsyncness {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for BoundConstness {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for BoundPolarity {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for ByRef {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for Closure {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for Const {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for ConstBlockItem {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for ConstItem {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for Defaultness {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for Delegation {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for DelegationMac {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for DelegationSuffixes {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for DelimArgs {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for DelimSpan {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for EnumDef {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for Extern {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for ForLoopKind {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for FormatArgPosition {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for FormatArgsPiece {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for FormatArgument {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for FormatArgumentKind {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for FormatArguments {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for FormatPlaceholder {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for GenericParamKind {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for Guard {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for Impl {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for ImplPolarity {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for Inline {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for InlineAsmOperand {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for InlineAsmRegOrRegClass {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for InlineAsmTemplatePiece {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for IsAuto {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for LocalKind {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for MacCallStmt {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for MacStmtStyle {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for MatchKind {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for MethodCall {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for ModKind {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for ModSpans {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for MutTy {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for NormalAttr {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for Parens {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for ParenthesizedArgs {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for PatFieldsRest {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for PatKind {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for RangeEnd {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for RangeSyntax {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for Recovered {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for RestrictionKind {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for Safety {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for StaticItem {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for StrLit {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for StrStyle {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for StructExpr {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for StructRest {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for Term {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for Trait {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for TraitBoundModifiers {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for TraitObjectSyntax {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for TyAlias {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for TyKind {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for TyPatKind {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for UnOp {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for UnsafeBinderTy {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for UnsafeSource {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for UseTreeKind {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for VisibilityKind {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for WhereBoundPredicate {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for WhereClause {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for WhereEqPredicate {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for WhereRegionPredicate {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for YieldKind {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for EiiDecl {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for EiiImpl {
    type Extra = ();
    fn visit(&'a self, visitor: &mut V, _extra: Self::Extra) -> V::Result {
        { Walkable::walk_ref(self, visitor) }
    }
}
/// Each method of this trait is a hook to be potentially
/// overridden. Each method's default implementation recursively visits
/// the substructure of the input via the corresponding `walk` method;
#[doc = " e.g., the `visit_item` method by default calls `visit::walk_item`."]
///
/// If you want to ensure that your code handles every variant
/// explicitly, you need to override each method. (And you also need
/// to monitor future changes to this trait in case a new method with a
/// new default implementation gets introduced.)
///
/// Every `walk_*` method uses deconstruction to access fields of structs and
/// enums. This will result in a compile error if a field is added, which makes
/// it more likely the appropriate visit call will be added for it.
pub trait Visitor<'a>: Sized {
    /// The result type of the `visit_*` methods. Can be either `()`,
    /// or `ControlFlow<T>`.
    type Result: VisitorResult = ();
    fn visit_ident(&mut self, Ident { name: _, span }: &'a Ident)
        -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for Ident {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, _extra: Self::Extra)
                -> V::Result {
                { visitor.visit_ident(self) }
            }
        }
        {
            match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(span,
                        self, ())) {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        };
        Self::Result::output()
    }
    fn visit_anon_const(&mut self, node: &'a AnonConst) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for AnonConst {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_anon_const(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_arm(&mut self, node: &'a Arm) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for Arm {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_arm(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_assoc_item_constraint(&mut self, node: &'a AssocItemConstraint)
        -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for AssocItemConstraint {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_assoc_item_constraint(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_attribute(&mut self, node: &'a Attribute) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for Attribute {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_attribute(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_block(&mut self, node: &'a Block) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for Block {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_block(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_capture_by(&mut self, node: &'a CaptureBy) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for CaptureBy {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_capture_by(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_closure_binder(&mut self, node: &'a ClosureBinder)
        -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for ClosureBinder {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_closure_binder(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_contract(&mut self, node: &'a FnContract) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for FnContract {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_contract(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_coroutine_marker(&mut self, node: &'a CoroutineMarker)
        -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for CoroutineMarker {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_coroutine_marker(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_crate(&mut self, node: &'a Crate) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for Crate {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_crate(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_expr(&mut self, node: &'a Expr) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for Expr {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_expr(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_expr_field(&mut self, node: &'a ExprField) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for ExprField {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_expr_field(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_field_def(&mut self, node: &'a FieldDef) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for FieldDef {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_field_def(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_field_def_extras(&mut self, node: &'a FieldDefExtras)
        -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for FieldDefExtras {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_field_def_extras(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_fn_decl(&mut self, node: &'a FnDecl) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for FnDecl {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_fn_decl(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_fn_header(&mut self, node: &'a FnHeader) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for FnHeader {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_fn_header(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_fn_ret_ty(&mut self, node: &'a FnRetTy) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for FnRetTy {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_fn_ret_ty(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_foreign_mod(&mut self, node: &'a ForeignMod) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for ForeignMod {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_foreign_mod(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_format_args(&mut self, node: &'a FormatArgs) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for FormatArgs {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_format_args(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_generic_arg(&mut self, node: &'a GenericArg) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for GenericArg {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_generic_arg(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_generic_args(&mut self, node: &'a GenericArgs) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for GenericArgs {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_generic_args(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_generic_param(&mut self, node: &'a GenericParam)
        -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for GenericParam {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_generic_param(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_generics(&mut self, node: &'a Generics) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for Generics {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_generics(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_inline_asm(&mut self, node: &'a InlineAsm) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for InlineAsm {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_inline_asm(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_inline_asm_sym(&mut self, node: &'a InlineAsmSym)
        -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for InlineAsmSym {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_inline_asm_sym(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_impl_restriction(&mut self, node: &'a ImplRestriction)
        -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for ImplRestriction {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_impl_restriction(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_label(&mut self, node: &'a Label) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for Label {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_label(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_lifetime(&mut self, node: &'a Lifetime, _ctxt: LifetimeCtxt)
        -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for Lifetime {
            type Extra = (LifetimeCtxt);
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let (_ctxt) = extra; visitor.visit_lifetime(self, _ctxt) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_local(&mut self, node: &'a Local) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for Local {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_local(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_mac_call(&mut self, node: &'a MacCall) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for MacCall {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_mac_call(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_macro_def(&mut self, node: &'a MacroDef) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for MacroDef {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_macro_def(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_mut_restriction(&mut self, node: &'a MutRestriction)
        -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for MutRestriction {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_mut_restriction(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_param_bound(&mut self, node: &'a GenericBound, _ctxt: BoundKind)
        -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for GenericBound {
            type Extra = (BoundKind);
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                {
                    let (_ctxt) = extra;
                    visitor.visit_param_bound(self, _ctxt)
                }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_param(&mut self, node: &'a Param) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for Param {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_param(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_pat_field(&mut self, node: &'a PatField) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for PatField {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_pat_field(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_path(&mut self, node: &'a Path) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for Path {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_path(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_path_segment(&mut self, node: &'a PathSegment) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for PathSegment {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_path_segment(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_pat(&mut self, node: &'a Pat) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for Pat {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_pat(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_poly_trait_ref(&mut self, node: &'a PolyTraitRef)
        -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for PolyTraitRef {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_poly_trait_ref(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_precise_capturing_arg(&mut self, node: &'a PreciseCapturingArg)
        -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for PreciseCapturingArg {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_precise_capturing_arg(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_qself(&mut self, node: &'a QSelf) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for QSelf {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_qself(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_test_binder_body(&mut self, node: &'a TestBinderBody)
        -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for TestBinderBody {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_test_binder_body(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_test_binder_constraint(&mut self, node: &'a TestBinderConstraint)
        -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for TestBinderConstraint {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_test_binder_constraint(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_test_binder_bound_type_constraint(&mut self,
        node: &'a TestBinderBoundTypeConstraint) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for
            TestBinderBoundTypeConstraint {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                {
                    let () = extra;
                    visitor.visit_test_binder_bound_type_constraint(self)
                }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_test_binder_constraints(&mut self,
        node: &'a TestBinderConstraints) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for TestBinderConstraints {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                {
                    let () = extra;
                    visitor.visit_test_binder_constraints(self)
                }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_test_binder_exists(&mut self, node: &'a TestBinderExists)
        -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for TestBinderExists {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_test_binder_exists(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_test_binder_forall(&mut self, node: &'a TestBinderForall)
        -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for TestBinderForall {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_test_binder_forall(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_trait_ref(&mut self, node: &'a TraitRef) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for TraitRef {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_trait_ref(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_ty_pat(&mut self, node: &'a TyPat) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for TyPat {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_ty_pat(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_ty(&mut self, node: &'a Ty) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for Ty {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_ty(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_use_tree(&mut self, node: &'a UseTree) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for UseTree {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_use_tree(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_variant_data(&mut self, node: &'a VariantData) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for VariantData {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_variant_data(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_variant(&mut self, node: &'a Variant) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for Variant {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_variant(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_vis(&mut self, node: &'a Visibility) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for Visibility {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_vis(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_where_predicate_kind(&mut self, node: &'a WherePredicateKind)
        -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for WherePredicateKind {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_where_predicate_kind(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_where_predicate(&mut self, node: &'a WherePredicate)
        -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for WherePredicate {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_where_predicate(self) }
            }
        }
        Walkable::walk_ref(node, self)
    }
    fn visit_id(&mut self, _id: NodeId) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for NodeId {
            type Extra = ();
            fn visit(&'a self, visitor: &mut V, _extra: Self::Extra)
                -> V::Result {
                { visitor.visit_id(*self) }
            }
        }
        Self::Result::output()
    }
    /// This method is a hack to workaround unstable of `stmt_expr_attributes`.
    /// It can be removed once that feature is stabilized.
    fn visit_method_receiver_expr(&mut self, ex: &'a Expr) -> Self::Result {
        self.visit_expr(ex)
    }
    fn visit_item(&mut self, item: &'a Item) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for Item {
            type Extra = ();
            fn visit(&'a self, vis: &mut V, _extra: Self::Extra)
                -> V::Result {
                { vis.visit_item(self) }
            }
        }
        walk_item(self, item)
    }
    fn visit_foreign_item(&mut self, item: &'a ForeignItem) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for ForeignItem {
            type Extra = ();
            fn visit(&'a self, vis: &mut V, _extra: Self::Extra)
                -> V::Result {
                { vis.visit_foreign_item(self) }
            }
        }
        walk_item(self, item)
    }
    fn visit_assoc_item(&mut self, item: &'a AssocItem, ctxt: AssocCtxt)
        -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<'a, V: Visitor<'a>> Visitable<'a, V> for AssocItem {
            type Extra = AssocCtxt;
            fn visit(&'a self, vis: &mut V, ctxt: Self::Extra) -> V::Result {
                { vis.visit_assoc_item(self, ctxt) }
            }
        }
        walk_assoc_item(self, item, ctxt)
    }
    fn visit_fn(&mut self, fk: FnKind<'a>, _: &AttrVec, _: Span, _: NodeId)
        -> Self::Result {
        walk_fn(self, fk)
    }
    fn visit_stmt(&mut self, s: &'a Stmt) -> Self::Result {
        walk_stmt(self, s)
    }
    fn visit_nested_use_tree(&mut self, use_tree: &'a UseTree, id: NodeId)
        -> Self::Result {
        match ::rustc_ast_ir::visit::VisitorResult::branch(self.visit_id(id))
            {
            core::ops::ControlFlow::Continue(()) =>
                (),
                #[allow(unreachable_code)]
                core::ops::ControlFlow::Break(r) => {
                return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
            }
        };
        self.visit_use_tree(use_tree)
    }
}
pub trait WalkItemKind {
    type Ctxt;
    fn walk<'a,
    V: Visitor<'a>>(&'a self, attrs: &AttrVec, span: Span, id: NodeId,
    visibility: &'a Visibility, ctxt: Self::Ctxt, vis: &mut V)
    -> V::Result;
}
#[allow(unused_parens, non_local_definitions)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for ThinVec<(UseTree, NodeId)> {
    type Extra = ();
    fn visit(&'a self, vis: &mut V, _extra: Self::Extra) -> V::Result {
        {
            for (nested_tree, nested_id) in self {
                match ::rustc_ast_ir::visit::VisitorResult::branch(vis.visit_nested_use_tree(nested_tree,
                            *nested_id)) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
            V::Result::output()
        }
    }
}
fn walk_item_inner<'a, K: WalkItemKind,
    V: Visitor<'a>>(visitor: &mut V, item: &'a Item<K>, ctxt: K::Ctxt)
    -> V::Result {
    let Item { attrs, id, kind, vis, span, tokens: _ } = item;
    {
        match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(id,
                    visitor, ())) {
            core::ops::ControlFlow::Continue(()) =>
                (),
                #[allow(unreachable_code)]
                core::ops::ControlFlow::Break(r) => {
                return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
            }
        };
        match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(attrs,
                    visitor, ())) {
            core::ops::ControlFlow::Continue(()) =>
                (),
                #[allow(unreachable_code)]
                core::ops::ControlFlow::Break(r) => {
                return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
            }
        };
        match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(vis,
                    visitor, ())) {
            core::ops::ControlFlow::Continue(()) =>
                (),
                #[allow(unreachable_code)]
                core::ops::ControlFlow::Break(r) => {
                return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
            }
        };
    };
    match ::rustc_ast_ir::visit::VisitorResult::branch(kind.walk(attrs, *span,
                *id, vis, ctxt, visitor)) {
        core::ops::ControlFlow::Continue(()) =>
            (),
            #[allow(unreachable_code)]
            core::ops::ControlFlow::Break(r) => {
            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
        }
    };
    {
        match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(span,
                    visitor, ())) {
            core::ops::ControlFlow::Continue(()) =>
                (),
                #[allow(unreachable_code)]
                core::ops::ControlFlow::Break(r) => {
                return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
            }
        };
    };
    V::Result::output()
}
pub fn walk_item<'a, K: WalkItemKind<Ctxt = ()>,
    V: Visitor<'a>>(visitor: &mut V, item: &'a Item<K>) -> V::Result {
    walk_item_inner(visitor, item, ())
}
pub fn walk_assoc_item<'a, K: WalkItemKind<Ctxt = AssocCtxt>,
    V: Visitor<'a>>(visitor: &mut V, item: &'a Item<K>, ctxt: AssocCtxt)
    -> V::Result {
    walk_item_inner(visitor, item, ctxt)
}
impl WalkItemKind for ItemKind {
    type Ctxt = ();
    fn walk<'a,
        V: Visitor<'a>>(&'a self, attrs: &AttrVec, span: Span, id: NodeId,
        visibility: &'a Visibility, _ctxt: Self::Ctxt, vis: &mut V)
        -> V::Result {
        match self {
            ItemKind::Fn(func) => {
                let kind = FnKind::Fn(FnCtxt::Free, visibility, &*func);
                match ::rustc_ast_ir::visit::VisitorResult::branch(vis.visit_fn(kind,
                            attrs, span, id)) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
            ItemKind::ExternCrate(orig_name, ident) => {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(orig_name,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(ident,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
            ItemKind::Use(use_tree) => {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(use_tree,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
            ItemKind::Static(item) => {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(item,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
            ItemKind::ConstBlock(item) => {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(item,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
            ItemKind::Const(item) => {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(item,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
            ItemKind::Mod(safety, ident, mod_kind) => {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(safety,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(ident,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(mod_kind,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
            ItemKind::ForeignMod(nm) => {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(nm,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
            ItemKind::GlobalAsm(asm) => {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(asm,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
            ItemKind::TyAlias(ty_alias) => {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(ty_alias,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
            ItemKind::Enum(ident, generics, enum_definition) => {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(ident,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(generics,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(enum_definition,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
            ItemKind::Struct(ident, generics, variant_data) |
                ItemKind::Union(ident, generics, variant_data) => {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(ident,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(generics,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(variant_data,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
            ItemKind::Impl(impl_) => {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(impl_,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
            ItemKind::Trait(trait_) => {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(trait_,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
            ItemKind::TraitAlias(TraitAlias {
                constness, ident, generics, bounds }) => {
                {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(constness,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(ident,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(generics,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                };
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(bounds,
                            vis, BoundKind::Bound)) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                }
            }
            ItemKind::MacCall(m) => {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(m,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
            ItemKind::MacroDef(ident, def) => {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(ident,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(def,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
            ItemKind::Delegation(delegation) => {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(delegation,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
            ItemKind::DelegationMac(dm) => {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(dm,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
            ItemKind::TestBinderConstraints(item) => {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(item,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
        }
        V::Result::output()
    }
}
impl WalkItemKind for AssocItemKind {
    type Ctxt = AssocCtxt;
    fn walk<'a,
        V: Visitor<'a>>(&'a self, attrs: &AttrVec, span: Span, id: NodeId,
        visibility: &'a Visibility, ctxt: Self::Ctxt, vis: &mut V)
        -> V::Result {
        match self {
            AssocItemKind::Const(item) => {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(item,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
            AssocItemKind::Fn(func) => {
                let kind =
                    FnKind::Fn(FnCtxt::Assoc(ctxt), visibility, &*func);
                match ::rustc_ast_ir::visit::VisitorResult::branch(vis.visit_fn(kind,
                            attrs, span, id)) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                }
            }
            AssocItemKind::Type(alias) => {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(alias,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
            AssocItemKind::MacCall(mac) => {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(mac,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
            AssocItemKind::Delegation(delegation) => {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(delegation,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
            AssocItemKind::DelegationMac(dm) => {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(dm,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
        }
        V::Result::output()
    }
}
impl WalkItemKind for ForeignItemKind {
    type Ctxt = ();
    fn walk<'a,
        V: Visitor<'a>>(&'a self, attrs: &AttrVec, span: Span, id: NodeId,
        visibility: &'a Visibility, _ctxt: Self::Ctxt, vis: &mut V)
        -> V::Result {
        match self {
            ForeignItemKind::Static(item) => {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(item,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
            ForeignItemKind::Fn(func) => {
                let kind = FnKind::Fn(FnCtxt::Foreign, visibility, &*func);
                match ::rustc_ast_ir::visit::VisitorResult::branch(vis.visit_fn(kind,
                            attrs, span, id)) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                }
            }
            ForeignItemKind::TyAlias(alias) => {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(alias,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
            ForeignItemKind::MacCall(mac) => {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(mac,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
        }
        V::Result::output()
    }
}
pub fn walk_fn<'a, V: Visitor<'a>>(vis: &mut V, kind: FnKind<'a>)
    -> V::Result {
    match kind {
        FnKind::Fn(_ctxt, _vis, Fn {
            defaultness,
            ident,
            sig,
            generics,
            contract,
            body,
            define_opaque,
            eii_impl }) => {
            let FnSig { header, decl, span } = sig;
            {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(defaultness,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(ident,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(header,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(generics,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(decl,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(contract,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(body,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(span,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(define_opaque,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(eii_impl,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            };
        }
        FnKind::Closure(binder, coroutine_marker, decl, body) => {
            match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(binder,
                        vis, ())) {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
            match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(coroutine_marker,
                        vis, ())) {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
            match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(decl,
                        vis, ())) {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
            match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(body,
                        vis, ())) {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        }
    }
    V::Result::output()
}
impl<'a, V: Visitor<'a>> Walkable<'a, V> for Impl {
    fn walk_ref(&'a self, vis: &mut V) -> V::Result {
        {
            let Impl { generics, of_trait, self_ty, items, constness: _ } =
                self;
            match ::rustc_ast_ir::visit::VisitorResult::branch(vis.visit_generics(generics))
                {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
            if let Some(of_trait) = of_trait {
                let TraitImplHeader { defaultness, safety, polarity, trait_ref
                        } = of_trait;
                {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(defaultness,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(safety,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(polarity,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(trait_ref,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                };
            }
            match ::rustc_ast_ir::visit::VisitorResult::branch(vis.visit_ty(self_ty))
                {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
            match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(items,
                        vis, AssocCtxt::Impl { of_trait: of_trait.is_some() })) {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
            V::Result::output()
        }
    }
}
impl<'a, V: Visitor<'a>> Walkable<'a, V> for MethodCall {
    fn walk_ref(&'a self, vis: &mut V) -> V::Result {
        {
            let MethodCall { seg, receiver, args, span } = self;
            match ::rustc_ast_ir::visit::VisitorResult::branch(vis.visit_method_receiver_expr(receiver))
                {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
            {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(seg,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(args,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(span,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            };
            V::Result::output()
        }
    }
}
impl<'a, V: Visitor<'a>> Walkable<'a, V> for Expr {
    fn walk_ref(&'a self, vis: &mut V) -> V::Result {
        {
            let Expr { id, kind, span, attrs, tokens: _ } = self;
            {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(id,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(attrs,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            };
            match kind {
                ExprKind::Array(exprs) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(exprs,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::ConstBlock(anon_const) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(anon_const,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::Repeat(element, count) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(element,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(count,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::Struct(se) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(se,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::Tup(exprs) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(exprs,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::Call(callee_expression, arguments) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(callee_expression,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(arguments,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::MethodCall(mc) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(mc,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::Binary(op, lhs, rhs) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(op,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(lhs,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(rhs,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::AddrOf(kind, mutbl, subexpression) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(kind,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(mutbl,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(subexpression,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::Unary(op, subexpression) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(op,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(subexpression,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::Cast(subexpression, typ) |
                    ExprKind::Type(subexpression, typ) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(subexpression,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(typ,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::Let(pat, expr, span, _recovered) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(pat,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(expr,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(span,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::If(head_expression, if_block, optional_else) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(head_expression,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(if_block,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(optional_else,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::While(subexpression, block, opt_label) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(subexpression,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(block,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(opt_label,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::ForLoop(ForLoop { pat, iter, body, label, kind }) =>
                    {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(pat,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(iter,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(body,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(label,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(kind,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::Loop(block, opt_label, span) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(block,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(opt_label,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(span,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::Match(subexpression, arms, kind) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(subexpression,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(arms,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(kind,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::Closure(Closure {
                    binder,
                    capture_clause,
                    coroutine_marker,
                    constness,
                    movability,
                    fn_decl,
                    body,
                    fn_decl_span,
                    fn_arg_span }) => {
                    {
                        match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(constness,
                                    vis, ())) {
                            core::ops::ControlFlow::Continue(()) =>
                                (),
                                #[allow(unreachable_code)]
                                core::ops::ControlFlow::Break(r) => {
                                return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                            }
                        };
                        match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(movability,
                                    vis, ())) {
                            core::ops::ControlFlow::Continue(()) =>
                                (),
                                #[allow(unreachable_code)]
                                core::ops::ControlFlow::Break(r) => {
                                return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                            }
                        };
                        match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(capture_clause,
                                    vis, ())) {
                            core::ops::ControlFlow::Continue(()) =>
                                (),
                                #[allow(unreachable_code)]
                                core::ops::ControlFlow::Break(r) => {
                                return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                            }
                        };
                    };
                    let kind =
                        FnKind::Closure(binder, coroutine_marker, fn_decl, body);
                    match ::rustc_ast_ir::visit::VisitorResult::branch(vis.visit_fn(kind,
                                attrs, *span, *id)) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    {
                        match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(fn_decl_span,
                                    vis, ())) {
                            core::ops::ControlFlow::Continue(()) =>
                                (),
                                #[allow(unreachable_code)]
                                core::ops::ControlFlow::Break(r) => {
                                return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                            }
                        };
                        match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(fn_arg_span,
                                    vis, ())) {
                            core::ops::ControlFlow::Continue(()) =>
                                (),
                                #[allow(unreachable_code)]
                                core::ops::ControlFlow::Break(r) => {
                                return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                            }
                        };
                    };
                }
                ExprKind::Block(block, opt_label) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(block,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(opt_label,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::Gen(capt, body, kind, decl_span) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(capt,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(body,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(kind,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(decl_span,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::Await(expr, span) | ExprKind::Move(expr, span) |
                    ExprKind::Use(expr, span) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(expr,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(span,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::Assign(lhs, rhs, span) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(lhs,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(rhs,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(span,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::AssignOp(op, lhs, rhs) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(op,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(lhs,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(rhs,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::Field(subexpression, ident) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(subexpression,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(ident,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::Index(main_expression, index_expression, span) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(main_expression,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(index_expression,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(span,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::Range(start, end, limit) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(start,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(end,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(limit,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::Underscore => {}
                ExprKind::Path(maybe_qself, path) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(maybe_qself,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(path,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::Break(opt_label, opt_expr) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(opt_label,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(opt_expr,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::Continue(opt_label) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(opt_label,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::Ret(optional_expression) |
                    ExprKind::Yeet(optional_expression) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(optional_expression,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::Become(expr) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(expr,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::MacCall(mac) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(mac,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::Paren(subexpression) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(subexpression,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::InlineAsm(asm) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(asm,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::FormatArgs(f) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(f,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::OffsetOf(container, fields) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(container,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(fields,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::Yield(kind) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(kind,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::Try(subexpression) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(subexpression,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::TryBlock(body, optional_type) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(body,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(optional_type,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::Lit(token) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(token,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::IncludedBytes(bytes) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(bytes,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::UnsafeBinderCast(kind, expr, ty) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(kind,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(expr,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(ty,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::DirectConstArg(expr) => {
                    match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(expr,
                                vis, ())) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                }
                ExprKind::Err(_guar) => {}
                ExprKind::Dummy => {}
            }
            {
                match ::rustc_ast_ir::visit::VisitorResult::branch(Visitable::visit(span,
                            vis, ())) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            };
            V::Result::output()
        }
    }
}
pub fn walk_anon_const<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a AnonConst) -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_arm<'a, V: Visitor<'a>>(visitor: &mut V, node: &'a Arm)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_assoc_item_constraint<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a AssocItemConstraint)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_attribute<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a Attribute) -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_block<'a, V: Visitor<'a>>(visitor: &mut V, node: &'a Block)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_capture_by<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a CaptureBy) -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_closure_binder<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a ClosureBinder) -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_contract<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a FnContract) -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_coroutine_marker<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a CoroutineMarker) -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_crate<'a, V: Visitor<'a>>(visitor: &mut V, node: &'a Crate)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_expr<'a, V: Visitor<'a>>(visitor: &mut V, node: &'a Expr)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_expr_field<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a ExprField) -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_field_def<'a, V: Visitor<'a>>(visitor: &mut V, node: &'a FieldDef)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_field_def_extras<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a FieldDefExtras) -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_fn_decl<'a, V: Visitor<'a>>(visitor: &mut V, node: &'a FnDecl)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_fn_header<'a, V: Visitor<'a>>(visitor: &mut V, node: &'a FnHeader)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_fn_ret_ty<'a, V: Visitor<'a>>(visitor: &mut V, node: &'a FnRetTy)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_foreign_mod<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a ForeignMod) -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_format_args<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a FormatArgs) -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_generic_arg<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a GenericArg) -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_generic_args<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a GenericArgs) -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_generic_param<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a GenericParam) -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_generics<'a, V: Visitor<'a>>(visitor: &mut V, node: &'a Generics)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_inline_asm<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a InlineAsm) -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_inline_asm_sym<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a InlineAsmSym) -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_impl_restriction<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a ImplRestriction) -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_label<'a, V: Visitor<'a>>(visitor: &mut V, node: &'a Label)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_lifetime<'a, V: Visitor<'a>>(visitor: &mut V, node: &'a Lifetime)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_local<'a, V: Visitor<'a>>(visitor: &mut V, node: &'a Local)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_mac<'a, V: Visitor<'a>>(visitor: &mut V, node: &'a MacCall)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_macro_def<'a, V: Visitor<'a>>(visitor: &mut V, node: &'a MacroDef)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_mut_restriction<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a MutRestriction) -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_param_bound<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a GenericBound) -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_param<'a, V: Visitor<'a>>(visitor: &mut V, node: &'a Param)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_pat_field<'a, V: Visitor<'a>>(visitor: &mut V, node: &'a PatField)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_path<'a, V: Visitor<'a>>(visitor: &mut V, node: &'a Path)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_path_segment<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a PathSegment) -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_pat<'a, V: Visitor<'a>>(visitor: &mut V, node: &'a Pat)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_poly_trait_ref<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a PolyTraitRef) -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_precise_capturing_arg<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a PreciseCapturingArg)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_qself<'a, V: Visitor<'a>>(visitor: &mut V, node: &'a QSelf)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_test_binder_body<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a TestBinderBody) -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_test_binder_constraint<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a TestBinderConstraint)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_test_binder_bound_type_constraint<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a TestBinderBoundTypeConstraint)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_test_binder_exists<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a TestBinderExists)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_test_binder_forall<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a TestBinderForall)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_trait_ref<'a, V: Visitor<'a>>(visitor: &mut V, node: &'a TraitRef)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_ty_pat<'a, V: Visitor<'a>>(visitor: &mut V, node: &'a TyPat)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_ty<'a, V: Visitor<'a>>(visitor: &mut V, node: &'a Ty)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_use_tree<'a, V: Visitor<'a>>(visitor: &mut V, node: &'a UseTree)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_variant_data<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a VariantData) -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_variant<'a, V: Visitor<'a>>(visitor: &mut V, node: &'a Variant)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_vis<'a, V: Visitor<'a>>(visitor: &mut V, node: &'a Visibility)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_where_predicate_kind<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a WherePredicateKind)
    -> V::Result {
    Walkable::walk_ref(node, visitor)
}
pub fn walk_where_predicate<'a,
    V: Visitor<'a>>(visitor: &mut V, node: &'a WherePredicate) -> V::Result {
    Walkable::walk_ref(node, visitor)
}common_visitor_and_walkers!(Visitor<'a>);
1166
1167macro_rules! generate_list_visit_fns {
1168    ($($visit_fn:ident, $Ty:ty $(, $param:ident: $ParamTy:ty)?;)+) => {
1169        $(
1170            #[allow(unused_parens)]
1171            impl<'a, V: Visitor<'a>> Visitable<'a, V> for ThinVec<$Ty> {
1172                type Extra = ($($ParamTy)?);
1173
1174                #[inline]
1175                fn visit(&'a self, visitor: &mut V, ($($param)?): Self::Extra) -> V::Result {
1176                    walk_list!(visitor, $visit_fn, self $(, $param)?);
1177                    V::Result::output()
1178                }
1179            }
1180        )+
1181    }
1182}
1183
1184#[allow(unused_parens)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for ThinVec<Box<Item>> {
    type Extra = ();
    #[inline]
    fn visit(&'a self, visitor: &mut V, (): Self::Extra) -> V::Result {
        for elem in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(visitor.visit_item(elem))
                {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        };
        V::Result::output()
    }
}
#[allow(unused_parens)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for ThinVec<Box<ForeignItem>> {
    type Extra = ();
    #[inline]
    fn visit(&'a self, visitor: &mut V, (): Self::Extra) -> V::Result {
        for elem in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(visitor.visit_foreign_item(elem))
                {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        };
        V::Result::output()
    }
}
#[allow(unused_parens)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for ThinVec<GenericParam> {
    type Extra = ();
    #[inline]
    fn visit(&'a self, visitor: &mut V, (): Self::Extra) -> V::Result {
        for elem in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(visitor.visit_generic_param(elem))
                {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        };
        V::Result::output()
    }
}
#[allow(unused_parens)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for ThinVec<Stmt> {
    type Extra = ();
    #[inline]
    fn visit(&'a self, visitor: &mut V, (): Self::Extra) -> V::Result {
        for elem in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(visitor.visit_stmt(elem))
                {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        };
        V::Result::output()
    }
}
#[allow(unused_parens)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for ThinVec<Box<Expr>> {
    type Extra = ();
    #[inline]
    fn visit(&'a self, visitor: &mut V, (): Self::Extra) -> V::Result {
        for elem in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(visitor.visit_expr(elem))
                {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        };
        V::Result::output()
    }
}
#[allow(unused_parens)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for ThinVec<ExprField> {
    type Extra = ();
    #[inline]
    fn visit(&'a self, visitor: &mut V, (): Self::Extra) -> V::Result {
        for elem in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(visitor.visit_expr_field(elem))
                {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        };
        V::Result::output()
    }
}
#[allow(unused_parens)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for ThinVec<PatField> {
    type Extra = ();
    #[inline]
    fn visit(&'a self, visitor: &mut V, (): Self::Extra) -> V::Result {
        for elem in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(visitor.visit_pat_field(elem))
                {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        };
        V::Result::output()
    }
}
#[allow(unused_parens)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for ThinVec<Variant> {
    type Extra = ();
    #[inline]
    fn visit(&'a self, visitor: &mut V, (): Self::Extra) -> V::Result {
        for elem in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(visitor.visit_variant(elem))
                {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        };
        V::Result::output()
    }
}
#[allow(unused_parens)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for ThinVec<Box<AssocItem>> {
    type Extra = (AssocCtxt);
    #[inline]
    fn visit(&'a self, visitor: &mut V, (ctxt): Self::Extra) -> V::Result {
        for elem in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(visitor.visit_assoc_item(elem,
                        ctxt)) {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        };
        V::Result::output()
    }
}
#[allow(unused_parens)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for ThinVec<WherePredicate> {
    type Extra = ();
    #[inline]
    fn visit(&'a self, visitor: &mut V, (): Self::Extra) -> V::Result {
        for elem in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(visitor.visit_where_predicate(elem))
                {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        };
        V::Result::output()
    }
}
#[allow(unused_parens)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for ThinVec<Param> {
    type Extra = ();
    #[inline]
    fn visit(&'a self, visitor: &mut V, (): Self::Extra) -> V::Result {
        for elem in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(visitor.visit_param(elem))
                {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        };
        V::Result::output()
    }
}
#[allow(unused_parens)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for ThinVec<FieldDef> {
    type Extra = ();
    #[inline]
    fn visit(&'a self, visitor: &mut V, (): Self::Extra) -> V::Result {
        for elem in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(visitor.visit_field_def(elem))
                {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        };
        V::Result::output()
    }
}
#[allow(unused_parens)]
impl<'a, V: Visitor<'a>> Visitable<'a, V> for ThinVec<Arm> {
    type Extra = ();
    #[inline]
    fn visit(&'a self, visitor: &mut V, (): Self::Extra) -> V::Result {
        for elem in self {
            match ::rustc_ast_ir::visit::VisitorResult::branch(visitor.visit_arm(elem))
                {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
        };
        V::Result::output()
    }
}generate_list_visit_fns! {
1185    visit_item, Box<Item>;
1186    visit_foreign_item, Box<ForeignItem>;
1187    visit_generic_param, GenericParam;
1188    visit_stmt, Stmt;
1189    visit_expr, Box<Expr>;
1190    visit_expr_field, ExprField;
1191    visit_pat_field, PatField;
1192    visit_variant, Variant;
1193    visit_assoc_item, Box<AssocItem>, ctxt: AssocCtxt;
1194    visit_where_predicate, WherePredicate;
1195    visit_param, Param;
1196    visit_field_def, FieldDef;
1197    visit_arm, Arm;
1198}
1199
1200pub fn walk_stmt<'a, V: Visitor<'a>>(visitor: &mut V, statement: &'a Stmt) -> V::Result {
1201    let Stmt { id, kind, span: _ } = statement;
1202    match ::rustc_ast_ir::visit::VisitorResult::branch(visitor.visit_id(*id)) {
    core::ops::ControlFlow::Continue(()) =>
        (),
        #[allow(unreachable_code)]
        core::ops::ControlFlow::Break(r) => {
        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
    }
};try_visit!(visitor.visit_id(*id));
1203    match kind {
1204        StmtKind::Let(local) => match ::rustc_ast_ir::visit::VisitorResult::branch(visitor.visit_local(local))
    {
    core::ops::ControlFlow::Continue(()) =>
        (),
        #[allow(unreachable_code)]
        core::ops::ControlFlow::Break(r) => {
        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
    }
}try_visit!(visitor.visit_local(local)),
1205        StmtKind::Item(item) => match ::rustc_ast_ir::visit::VisitorResult::branch(visitor.visit_item(item)) {
    core::ops::ControlFlow::Continue(()) =>
        (),
        #[allow(unreachable_code)]
        core::ops::ControlFlow::Break(r) => {
        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
    }
}try_visit!(visitor.visit_item(item)),
1206        StmtKind::Expr(expr) | StmtKind::Semi(expr) => match ::rustc_ast_ir::visit::VisitorResult::branch(visitor.visit_expr(expr)) {
    core::ops::ControlFlow::Continue(()) =>
        (),
        #[allow(unreachable_code)]
        core::ops::ControlFlow::Break(r) => {
        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
    }
}try_visit!(visitor.visit_expr(expr)),
1207        StmtKind::Empty => {}
1208        StmtKind::MacCall(mac) => {
1209            let MacCallStmt { mac, attrs, style: _, tokens: _ } = &**mac;
1210            for elem in attrs {
    match ::rustc_ast_ir::visit::VisitorResult::branch(visitor.visit_attribute(elem))
        {
        core::ops::ControlFlow::Continue(()) =>
            (),
            #[allow(unreachable_code)]
            core::ops::ControlFlow::Break(r) => {
            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
        }
    };
};walk_list!(visitor, visit_attribute, attrs);
1211            match ::rustc_ast_ir::visit::VisitorResult::branch(visitor.visit_mac_call(mac))
    {
    core::ops::ControlFlow::Continue(()) =>
        (),
        #[allow(unreachable_code)]
        core::ops::ControlFlow::Break(r) => {
        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
    }
};try_visit!(visitor.visit_mac_call(mac));
1212        }
1213    }
1214    V::Result::output()
1215}