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            WhereEqPredicate,
580            WhereRegionPredicate,
581            YieldKind,
582            // tidy-alphabetical-end
583        }
584
585        /// Each method of this trait is a hook to be potentially
586        /// overridden. Each method's default implementation recursively visits
587        /// the substructure of the input via the corresponding `walk` method;
588        #[doc = concat!(
589            " e.g., the `visit_item` method by default calls `visit"
590            $(, "_", stringify!($mut))?,
591            "::walk_item`."
592        )]
593        ///
594        /// If you want to ensure that your code handles every variant
595        /// explicitly, you need to override each method. (And you also need
596        /// to monitor future changes to this trait in case a new method with a
597        /// new default implementation gets introduced.)
598        ///
599        /// Every `walk_*` method uses deconstruction to access fields of structs and
600        /// enums. This will result in a compile error if a field is added, which makes
601        /// it more likely the appropriate visit call will be added for it.
602        pub trait $Visitor<$($lt)?>: Sized $(${ignore($mut)} + MutVisitorResult<Result = ()>)? {
603            $(
604                ${ignore($lt)}
605                /// The result type of the `visit_*` methods. Can be either `()`,
606                /// or `ControlFlow<T>`.
607                type Result: VisitorResult = ();
608            )?
609
610            // Methods in this trait have one of three forms, with the last two forms
611            // only occurring on `MutVisitor`:
612            //
613            //   fn visit_t(&mut self, t: &mut T);                      // common
614            //   fn flat_map_t(&mut self, t: T) -> SmallVec<[T; 1]>;    // rare
615            //   fn filter_map_t(&mut self, t: T) -> Option<T>;         // rarest
616            //
617            // When writing these methods, it is better to use destructuring like this:
618            //
619            //   fn visit_abc(&mut self, ABC { a, b, c: _ }: &mut ABC) {
620            //       visit_a(a);
621            //       visit_b(b);
622            //   }
623            //
624            // than to use field access like this:
625            //
626            //   fn visit_abc(&mut self, abc: &mut ABC) {
627            //       visit_a(&mut abc.a);
628            //       visit_b(&mut abc.b);
629            //       // ignore abc.c
630            //   }
631            //
632            // As well as being more concise, the former is explicit about which fields
633            // are skipped. Furthermore, if a new field is added, the destructuring
634            // version will cause a compile error, which is good. In comparison, the
635            // field access version will continue working and it would be easy to
636            // forget to add handling for it.
637            fn visit_ident(&mut self, Ident { name: _, span }: &$($lt)? $($mut)? Ident)
638                -> Self::Result
639            {
640                visit_visitable!(self, span);
641                Self::Result::output()
642            }
643
644            crate::visit::for_each_ast_visit_hook! { fn_visit! }
645
646            // We want `Visitor` to take the `NodeId` by value.
647            fn visit_id(&mut self, _id: $(&$mut)? NodeId) -> Self::Result {
648                Self::Result::output()
649            }
650
651            /// This method is a hack to workaround unstable of `stmt_expr_attributes`.
652            /// It can be removed once that feature is stabilized.
653            fn visit_method_receiver_expr(&mut self, ex: &$($lt)? $($mut)? Expr) -> Self::Result {
654                self.visit_expr(ex)
655            }
656
657            fn visit_item(&mut self, item: &$($lt)? $($mut)? Item) -> Self::Result {
658                walk_item(self, item)
659            }
660
661            fn visit_foreign_item(&mut self, item: &$($lt)? $($mut)? ForeignItem) -> Self::Result {
662                walk_item(self, item)
663            }
664
665            fn visit_assoc_item(&mut self, item: &$($lt)? $($mut)? AssocItem, ctxt: AssocCtxt)
666                -> Self::Result
667            {
668                walk_assoc_item(self, item, ctxt)
669            }
670
671            // for `MutVisitor`: `Span` and `NodeId` are mutated at the caller site.
672            fn visit_fn(
673                &mut self,
674                fk: FnKind<$($lt)? $(${ignore($mut)} '_)?>,
675                _: &AttrVec,
676                _: Span,
677                _: NodeId,
678            ) -> Self::Result {
679                walk_fn(self, fk)
680            }
681
682            // (non-mut) `Visitor`-only methods
683            $(
684                fn visit_stmt(&mut self, s: &$lt Stmt) -> Self::Result {
685                    walk_stmt(self, s)
686                }
687            )?
688
689            // `MutVisitor`-only methods
690            $(
691                // Span visiting is no longer used, but we keep it for now,
692                // in case it's needed for something like #127241.
693                #[inline]
694                fn visit_span(&mut self, _sp: &$mut Span) {
695                    // Do nothing.
696                }
697
698                fn flat_map_foreign_item(&mut self, ni: Box<ForeignItem>)
699                    -> SmallVec<[Box<ForeignItem>; 1]>
700                {
701                    walk_flat_map_foreign_item(self, ni)
702                }
703
704                fn flat_map_item(&mut self, i: Box<Item>) -> SmallVec<[Box<Item>; 1]> {
705                    walk_flat_map_item(self, i)
706                }
707
708                fn flat_map_field_def(&mut self, fd: FieldDef) -> SmallVec<[FieldDef; 1]> {
709                    walk_flat_map_field_def(self, fd)
710                }
711
712                fn flat_map_assoc_item(
713                    &mut self,
714                    i: Box<AssocItem>,
715                    ctxt: AssocCtxt,
716                ) -> SmallVec<[Box<AssocItem>; 1]> {
717                    walk_flat_map_assoc_item(self, i, ctxt)
718                }
719
720                fn flat_map_stmt(&mut self, s: Stmt) -> SmallVec<[Stmt; 1]> {
721                    walk_flat_map_stmt(self, s)
722                }
723
724                fn flat_map_arm(&mut self, arm: Arm) -> SmallVec<[Arm; 1]> {
725                    walk_flat_map_arm(self, arm)
726                }
727
728                fn filter_map_expr(&mut self, e: Box<Expr>) -> Option<Box<Expr>> {
729                    walk_filter_map_expr(self, e)
730                }
731
732                fn flat_map_variant(&mut self, v: Variant) -> SmallVec<[Variant; 1]> {
733                    walk_flat_map_variant(self, v)
734                }
735
736                fn flat_map_param(&mut self, param: Param) -> SmallVec<[Param; 1]> {
737                    walk_flat_map_param(self, param)
738                }
739
740                fn flat_map_generic_param(&mut self, param: GenericParam)
741                    -> SmallVec<[GenericParam; 1]>
742                {
743                    walk_flat_map_generic_param(self, param)
744                }
745
746                fn flat_map_expr_field(&mut self, f: ExprField) -> SmallVec<[ExprField; 1]> {
747                    walk_flat_map_expr_field(self, f)
748                }
749
750                fn flat_map_where_predicate(
751                    &mut self,
752                    where_predicate: WherePredicate,
753                ) -> SmallVec<[WherePredicate; 1]> {
754                    walk_flat_map_where_predicate(self, where_predicate)
755                }
756
757                fn flat_map_pat_field(&mut self, fp: PatField) -> SmallVec<[PatField; 1]> {
758                    walk_flat_map_pat_field(self, fp)
759                }
760            )?
761        }
762
763        crate::visit::for_each_ast_visit_hook! { impl_visitable_visit! }
764
765        impl_visitable!(|&$($lt)? $($mut)? self: Ident, visitor: &mut V| {
766            visitor.visit_ident(self)
767        });
768
769        $(
770            impl_visitable!(
771                |&$lt self: NodeId, visitor: &mut V| {
772                    visitor.visit_id(*self)
773                }
774            );
775        )?
776        $(
777            impl_visitable!(
778                |&$mut self: NodeId, visitor: &mut V| {
779                    visitor.visit_id(self)
780                }
781            );
782
783            impl_visitable!(|&mut self: Span, visitor: &mut V| {
784                visitor.visit_span(self)
785            });
786        )?
787
788        impl_visitable!(|&$($lt)? $($mut)? self: Item, vis: &mut V| {
789            vis.visit_item(self)
790        });
791        impl_visitable!(|&$($lt)? $($mut)? self: ForeignItem, vis: &mut V| {
792            vis.visit_foreign_item(self)
793        });
794        impl_visitable!(|&$($lt)? $($mut)? self: AssocItem, vis: &mut V, ctxt: AssocCtxt| {
795            vis.visit_assoc_item(self, ctxt)
796        });
797
798        pub trait WalkItemKind {
799            type Ctxt;
800            fn walk<$($lt,)? V: $Visitor$(<$lt>)?>(
801                &$($lt)? $($mut)? self,
802                attrs: &AttrVec,
803                span: Span,
804                id: NodeId,
805                visibility: &$($lt)? $($mut)? Visibility,
806                ctxt: Self::Ctxt,
807                vis: &mut V,
808            ) -> V::Result;
809        }
810
811        fn walk_item_inner<$($lt,)? K: WalkItemKind, V: $Visitor$(<$lt>)?>(
812            visitor: &mut V,
813            item: &$($lt)? $($mut)? Item<K>,
814            ctxt: K::Ctxt,
815        ) -> V::Result {
816            let Item { attrs, id, kind, vis, span, tokens: _ } = item;
817            visit_visitable!(visitor, id, attrs, vis);
818            try_visit!(kind.walk(attrs, *span, *id, vis, ctxt, visitor));
819            visit_visitable!(visitor, span);
820            V::Result::output()
821        }
822
823        // Do not implement `Walkable`/`MutWalkable` for *Item to avoid confusion.
824        pub fn walk_item<$($lt,)? K: WalkItemKind<Ctxt = ()>, V: $Visitor$(<$lt>)?>(
825            visitor: &mut V,
826            item: &$($lt)? $($mut)? Item<K>,
827        ) -> V::Result {
828            walk_item_inner(visitor, item, ())
829        }
830
831        // Do not implement `Walkable`/`MutWalkable` for *Item to avoid confusion.
832        pub fn walk_assoc_item<$($lt,)? K: WalkItemKind<Ctxt = AssocCtxt>, V: $Visitor$(<$lt>)?>(
833            visitor: &mut V,
834            item: &$($lt)? $($mut)? Item<K>,
835            ctxt: AssocCtxt,
836        ) -> V::Result {
837            walk_item_inner(visitor, item, ctxt)
838        }
839
840        impl WalkItemKind for ItemKind {
841            type Ctxt = ();
842            fn walk<$($lt,)? V: $Visitor$(<$lt>)?>(
843                &$($lt)? $($mut)? self,
844                attrs: &AttrVec,
845                span: Span,
846                id: NodeId,
847                visibility: &$($lt)? $($mut)? Visibility,
848                _ctxt: Self::Ctxt,
849                vis: &mut V,
850            ) -> V::Result {
851                match self {
852                    ItemKind::Fn(func) => {
853                        let kind = FnKind::Fn(FnCtxt::Free, visibility, &$($mut)? *func);
854                        try_visit!(vis.visit_fn(kind, attrs, span, id));
855                    }
856                    ItemKind::ExternCrate(orig_name, ident) =>
857                        visit_visitable!(vis, orig_name, ident),
858                    ItemKind::Use(use_tree) =>
859                        visit_visitable!(vis, use_tree),
860                    ItemKind::Static(item) =>
861                        visit_visitable!(vis, item),
862                    ItemKind::ConstBlock(item) =>
863                        visit_visitable!(vis, item),
864                    ItemKind::Const(item) =>
865                        visit_visitable!(vis, item),
866                    ItemKind::Mod(safety, ident, mod_kind) =>
867                        visit_visitable!(vis, safety, ident, mod_kind),
868                    ItemKind::ForeignMod(nm) =>
869                        visit_visitable!(vis, nm),
870                    ItemKind::GlobalAsm(asm) =>
871                        visit_visitable!(vis, asm),
872                    ItemKind::TyAlias(ty_alias) =>
873                        visit_visitable!(vis, ty_alias),
874                    ItemKind::Enum(ident, generics, enum_definition) =>
875                        visit_visitable!(vis, ident, generics, enum_definition),
876                    ItemKind::Struct(ident, generics, variant_data)
877                    | ItemKind::Union(ident, generics, variant_data) =>
878                        visit_visitable!(vis, ident, generics, variant_data),
879                    ItemKind::Impl(impl_) =>
880                        visit_visitable!(vis, impl_),
881                    ItemKind::Trait(trait_) =>
882                        visit_visitable!(vis, trait_),
883                    ItemKind::TraitAlias(TraitAlias { constness, ident, generics, bounds }) => {
884                        visit_visitable!(vis, constness, ident, generics);
885                        visit_visitable_with!(vis, bounds, BoundKind::Bound)
886                    }
887                    ItemKind::MacCall(m) =>
888                        visit_visitable!(vis, m),
889                    ItemKind::MacroDef(ident, def) =>
890                        visit_visitable!(vis, ident, def),
891                    ItemKind::Delegation(delegation) =>
892                        visit_visitable!(vis, delegation),
893                    ItemKind::DelegationMac(dm) =>
894                        visit_visitable!(vis, dm),
895                    ItemKind::TestBinderConstraints(item) =>
896                        visit_visitable!(vis, item),
897                }
898                V::Result::output()
899            }
900        }
901
902        impl WalkItemKind for AssocItemKind {
903            type Ctxt = AssocCtxt;
904            fn walk<$($lt,)? V: $Visitor$(<$lt>)?>(
905                &$($lt)? $($mut)? self,
906                attrs: &AttrVec,
907                span: Span,
908                id: NodeId,
909                visibility: &$($lt)? $($mut)? Visibility,
910                ctxt: Self::Ctxt,
911                vis: &mut V,
912            ) -> V::Result {
913                match self {
914                    AssocItemKind::Const(item) =>
915                        visit_visitable!(vis, item),
916                    AssocItemKind::Fn(func) => {
917                        let kind = FnKind::Fn(FnCtxt::Assoc(ctxt), visibility, &$($mut)? *func);
918                        try_visit!(vis.visit_fn(kind, attrs, span, id))
919                    }
920                    AssocItemKind::Type(alias) =>
921                        visit_visitable!(vis, alias),
922                    AssocItemKind::MacCall(mac) =>
923                        visit_visitable!(vis, mac),
924                    AssocItemKind::Delegation(delegation) =>
925                        visit_visitable!(vis, delegation),
926                    AssocItemKind::DelegationMac(dm) =>
927                        visit_visitable!(vis, dm),
928                }
929                V::Result::output()
930            }
931        }
932
933        impl WalkItemKind for ForeignItemKind {
934            type Ctxt = ();
935            fn walk<$($lt,)? V: $Visitor$(<$lt>)?>(
936                &$($lt)? $($mut)? self,
937                attrs: &AttrVec,
938                span: Span,
939                id: NodeId,
940                visibility: &$($lt)? $($mut)? Visibility,
941                _ctxt: Self::Ctxt,
942                vis: &mut V,
943            ) -> V::Result {
944                match self {
945                    ForeignItemKind::Static(item) =>
946                        visit_visitable!(vis, item),
947                    ForeignItemKind::Fn(func) => {
948                        let kind = FnKind::Fn(FnCtxt::Foreign, visibility, &$($mut)? *func);
949                        try_visit!(vis.visit_fn(kind, attrs, span, id))
950                    }
951                    ForeignItemKind::TyAlias(alias) =>
952                        visit_visitable!(vis, alias),
953                    ForeignItemKind::MacCall(mac) =>
954                        visit_visitable!(vis, mac),
955                }
956                V::Result::output()
957            }
958        }
959
960        pub fn walk_fn<$($lt,)? V: $Visitor$(<$lt>)?>(
961            vis: &mut V,
962            kind: FnKind<$($lt)? $(${ignore($mut)} '_)?>,
963        ) -> V::Result {
964            match kind {
965                FnKind::Fn(
966                    _ctxt,
967                    // Visibility is visited as a part of the item.
968                    _vis,
969                    Fn {
970                        defaultness,
971                        ident,
972                        sig,
973                        generics,
974                        contract,
975                        body,
976                        define_opaque,
977                        eii_impl,
978                    },
979                ) => {
980                    let FnSig { header, decl, span } = sig;
981                    visit_visitable!(vis,
982                        defaultness, ident, header, generics, decl,
983                        contract, body, span, define_opaque, eii_impl
984                    );
985                }
986                FnKind::Closure(binder, coroutine_marker, decl, body) =>
987                    visit_visitable!(vis, binder, coroutine_marker, decl, body),
988            }
989            V::Result::output()
990        }
991
992        impl_walkable!(|&$($lt)? $($mut)? self: Impl, vis: &mut V| {
993            let Impl { generics, of_trait, self_ty, items, constness: _ } = self;
994            try_visit!(vis.visit_generics(generics));
995            if let Some(of_trait) = of_trait {
996                let TraitImplHeader { defaultness, safety, polarity, trait_ref } = of_trait;
997                visit_visitable!(vis, defaultness, safety, polarity, trait_ref);
998            }
999            try_visit!(vis.visit_ty(self_ty));
1000            visit_visitable_with!(vis, items, AssocCtxt::Impl { of_trait: of_trait.is_some() });
1001            V::Result::output()
1002        });
1003
1004        // Special case to call `visit_method_receiver_expr`.
1005        impl_walkable!(|&$($lt)? $($mut)? self: MethodCall, vis: &mut V| {
1006            let MethodCall { seg, receiver, args, span } = self;
1007            try_visit!(vis.visit_method_receiver_expr(receiver));
1008            visit_visitable!(vis, seg, args, span);
1009            V::Result::output()
1010        });
1011
1012        impl_walkable!(|&$($lt)? $($mut)? self: Expr, vis: &mut V| {
1013            let Expr { id, kind, span, attrs, tokens: _ } = self;
1014            visit_visitable!(vis, id, attrs);
1015            match kind {
1016                ExprKind::Array(exprs) =>
1017                    visit_visitable!(vis, exprs),
1018                ExprKind::ConstBlock(anon_const) =>
1019                    visit_visitable!(vis, anon_const),
1020                ExprKind::Repeat(element, count) =>
1021                    visit_visitable!(vis, element, count),
1022                ExprKind::Struct(se) =>
1023                    visit_visitable!(vis, se),
1024                ExprKind::Tup(exprs) =>
1025                    visit_visitable!(vis, exprs),
1026                ExprKind::Call(callee_expression, arguments) =>
1027                    visit_visitable!(vis, callee_expression, arguments),
1028                ExprKind::MethodCall(mc) =>
1029                    visit_visitable!(vis, mc),
1030                ExprKind::Binary(op, lhs, rhs) =>
1031                    visit_visitable!(vis, op, lhs, rhs),
1032                ExprKind::AddrOf(kind, mutbl, subexpression) =>
1033                    visit_visitable!(vis, kind, mutbl, subexpression),
1034                ExprKind::Unary(op, subexpression) =>
1035                    visit_visitable!(vis, op, subexpression),
1036                ExprKind::Cast(subexpression, typ) | ExprKind::Type(subexpression, typ) =>
1037                    visit_visitable!(vis, subexpression, typ),
1038                ExprKind::Let(pat, expr, span, _recovered) =>
1039                    visit_visitable!(vis, pat, expr, span),
1040                ExprKind::If(head_expression, if_block, optional_else) =>
1041                    visit_visitable!(vis, head_expression, if_block, optional_else),
1042                ExprKind::While(subexpression, block, opt_label) =>
1043                    visit_visitable!(vis, subexpression, block, opt_label),
1044                ExprKind::ForLoop(ForLoop { pat, iter, body, label, kind }) =>
1045                    visit_visitable!(vis, pat, iter, body, label, kind),
1046                ExprKind::Loop(block, opt_label, span) =>
1047                    visit_visitable!(vis, block, opt_label, span),
1048                ExprKind::Match(subexpression, arms, kind) =>
1049                    visit_visitable!(vis, subexpression, arms, kind),
1050                ExprKind::Closure(Closure {
1051                    binder,
1052                    capture_clause,
1053                    coroutine_marker,
1054                    constness,
1055                    movability,
1056                    fn_decl,
1057                    body,
1058                    fn_decl_span,
1059                    fn_arg_span,
1060                }) => {
1061                    visit_visitable!(vis, constness, movability, capture_clause);
1062                    let kind = FnKind::Closure(binder, coroutine_marker, fn_decl, body);
1063                    try_visit!(vis.visit_fn(kind, attrs, *span, *id));
1064                    visit_visitable!(vis, fn_decl_span, fn_arg_span);
1065                }
1066                ExprKind::Block(block, opt_label) =>
1067                    visit_visitable!(vis, block, opt_label),
1068                ExprKind::Gen(capt, body, kind, decl_span) =>
1069                    visit_visitable!(vis, capt, body, kind, decl_span),
1070                ExprKind::Await(expr, span)
1071                | ExprKind::Move(expr, span)
1072                | ExprKind::Use(expr, span) =>
1073                    visit_visitable!(vis, expr, span),
1074                ExprKind::Assign(lhs, rhs, span) =>
1075                    visit_visitable!(vis, lhs, rhs, span),
1076                ExprKind::AssignOp(op, lhs, rhs) =>
1077                    visit_visitable!(vis, op, lhs, rhs),
1078                ExprKind::Field(subexpression, ident) =>
1079                    visit_visitable!(vis, subexpression, ident),
1080                ExprKind::Index(main_expression, index_expression, span) =>
1081                    visit_visitable!(vis, main_expression, index_expression, span),
1082                ExprKind::Range(start, end, limit) =>
1083                    visit_visitable!(vis, start, end, limit),
1084                ExprKind::Underscore => {}
1085                ExprKind::Path(maybe_qself, path) =>
1086                    visit_visitable!(vis, maybe_qself, path),
1087                ExprKind::Break(opt_label, opt_expr) =>
1088                    visit_visitable!(vis, opt_label, opt_expr),
1089                ExprKind::Continue(opt_label) =>
1090                    visit_visitable!(vis, opt_label),
1091                ExprKind::Ret(optional_expression) | ExprKind::Yeet(optional_expression) =>
1092                    visit_visitable!(vis, optional_expression),
1093                ExprKind::Become(expr) =>
1094                    visit_visitable!(vis, expr),
1095                ExprKind::MacCall(mac) =>
1096                    visit_visitable!(vis, mac),
1097                ExprKind::Paren(subexpression) =>
1098                    visit_visitable!(vis, subexpression),
1099                ExprKind::InlineAsm(asm) =>
1100                    visit_visitable!(vis, asm),
1101                ExprKind::FormatArgs(f) =>
1102                    visit_visitable!(vis, f),
1103                ExprKind::OffsetOf(container, fields) =>
1104                    visit_visitable!(vis, container, fields),
1105                ExprKind::Yield(kind) =>
1106                    visit_visitable!(vis, kind),
1107                ExprKind::Try(subexpression) =>
1108                    visit_visitable!(vis, subexpression),
1109                ExprKind::TryBlock(body, optional_type) =>
1110                    visit_visitable!(vis, body, optional_type),
1111                ExprKind::Lit(token) =>
1112                    visit_visitable!(vis, token),
1113                ExprKind::IncludedBytes(bytes) =>
1114                    visit_visitable!(vis, bytes),
1115                ExprKind::UnsafeBinderCast(kind, expr, ty) =>
1116                    visit_visitable!(vis, kind, expr, ty),
1117                ExprKind::GcaMacro(expr) =>
1118                    visit_visitable!(vis, expr),
1119                ExprKind::Err(_guar) => {}
1120                ExprKind::Dummy => {}
1121            }
1122
1123            visit_visitable!(vis, span);
1124            V::Result::output()
1125        });
1126
1127        crate::visit::for_each_ast_visit_hook! { fn_walk! }
1128    };
1129}
1130pub(crate) use common_visitor_and_walkers;
1131
1132pub 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 WhereEqPredicate {
    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>);
1133
1134macro_rules! generate_list_visit_fns {
1135    ($($visit_fn:ident, $Ty:ty $(, $extra:ident: $ExtraTy:ty)?;)+) => {
1136        $(impl_visitable!(|&'a self: ThinVec<$Ty>, visitor: &mut V $(, $extra: $ExtraTy)?| {
1137            walk_list!(visitor, $visit_fn, self $(, $extra)?);
1138            V::Result::output()
1139        });)+
1140    }
1141}
1142
1143impl<'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! {
1144    // tidy-alphabetical-start
1145    visit_arm, Arm;
1146    visit_assoc_item, Box<AssocItem>, ctxt: AssocCtxt;
1147    visit_expr, Box<Expr>;
1148    visit_expr_field, ExprField;
1149    visit_field_def, FieldDef;
1150    visit_foreign_item, Box<ForeignItem>;
1151    visit_generic_param, GenericParam;
1152    visit_item, Box<Item>;
1153    visit_param, Param;
1154    visit_pat_field, PatField;
1155    visit_stmt, Stmt;
1156    visit_variant, Variant;
1157    visit_where_predicate, WherePredicate;
1158    // tidy-alphabetical-end
1159}
1160
1161pub fn walk_stmt<'a, V: Visitor<'a>>(visitor: &mut V, statement: &'a Stmt) -> V::Result {
1162    let Stmt { id, kind, span: _ } = statement;
1163    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));
1164    match kind {
1165        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)),
1166        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)),
1167        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)),
1168        StmtKind::Empty => {}
1169        StmtKind::MacCall(mac) => {
1170            let MacCallStmt { mac, attrs, style: _, tokens: _ } = &**mac;
1171            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);
1172            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));
1173        }
1174    }
1175    V::Result::output()
1176}