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