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