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