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