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