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