Skip to main content

rustc_ast_lowering/
lib.rs

1//! Lowers the AST to the HIR.
2//!
3//! Since the AST and HIR are fairly similar, this is mostly a simple procedure,
4//! much like a fold. Where lowering involves a bit more work things get more
5//! interesting and there are some invariants you should know about. These mostly
6//! concern spans and IDs.
7//!
8//! Spans are assigned to AST nodes during parsing and then are modified during
9//! expansion to indicate the origin of a node and the process it went through
10//! being expanded. IDs are assigned to AST nodes just before lowering.
11//!
12//! For the simpler lowering steps, IDs and spans should be preserved. Unlike
13//! expansion we do not preserve the process of lowering in the spans, so spans
14//! should not be modified here. When creating a new node (as opposed to
15//! "folding" an existing one), create a new ID using `next_id()`.
16//!
17//! You must ensure that IDs are unique. That means that you should only use the
18//! ID from an AST node in a single HIR node (you can assume that AST node-IDs
19//! are unique). Every new node must have a unique ID. Avoid cloning HIR nodes.
20//! If you do, you must then set the new node's ID to a fresh one.
21//!
22//! Spans are used for error messages and for tools to map semantics back to
23//! source code. It is therefore not as important with spans as IDs to be strict
24//! about use (you can't break the compiler by screwing up a span). Obviously, a
25//! HIR node can only have a single span. But multiple nodes can have the same
26//! span and spans don't need to be kept in order, etc. Where code is preserved
27//! by lowering, it should have the same span as in the AST. Where HIR nodes are
28//! new it is probably best to give a span for the whole AST node being lowered.
29//! All nodes should have real spans; don't use dummy spans. Tools are likely to
30//! get confused if the spans from leaf AST nodes occur in multiple places
31//! in the HIR, especially for multiple identifiers.
32
33// tidy-alphabetical-start
34#![feature(const_default)]
35#![feature(const_trait_impl)]
36#![feature(default_field_values)]
37#![feature(deref_patterns)]
38#![recursion_limit = "256"]
39// tidy-alphabetical-end
40
41use std::mem;
42use std::sync::Arc;
43
44use rustc_ast::mut_visit::{self, MutVisitor};
45use rustc_ast::node_id::NodeMap;
46use rustc_ast::visit::{self, Visitor};
47use rustc_ast::{self as ast, *};
48use rustc_attr_parsing::{AttributeParser, OmitDoc, Recovery, ShouldEmit};
49use rustc_data_structures::fx::FxIndexMap;
50use rustc_data_structures::sorted_map::SortedMap;
51use rustc_data_structures::stable_hash::{StableHash, StableHasher};
52use rustc_data_structures::steal::Steal;
53use rustc_data_structures::tagged_ptr::TaggedRef;
54use rustc_data_structures::unord::ExtendUnord;
55use rustc_errors::codes::*;
56use rustc_errors::{DiagArgFromDisplay, DiagCtxtHandle, ErrorGuaranteed};
57use rustc_hir::attrs::lang_items::LangItem;
58use rustc_hir::def::{DefKind, LifetimeRes, Namespace, PartialRes, PerNS, Res};
59use rustc_hir::def_id::{DefId, LOCAL_CRATE, LocalDefId, LocalDefIdMap};
60use rustc_hir::definitions::PerParentDisambiguatorState;
61use rustc_hir::lints::DelayedLint;
62use rustc_hir::{
63    self as hir, AngleBrackets, ConstArg, GenericArg, HirId, ItemLocalMap, LifetimeSource,
64    LifetimeSyntax, MissingLifetimeKind, ParamName, Target, TraitCandidate, find_attr,
65};
66use rustc_index::{Idx, IndexVec};
67use rustc_macros::extension;
68use rustc_middle::queries::Providers;
69use rustc_middle::span_bug;
70use rustc_middle::ty::{PerOwnerResolverData, ResolverAstLowering, TyCtxt};
71use rustc_session::diagnostics::add_feature_diagnostics;
72use rustc_span::symbol::{Ident, Symbol, kw, sym};
73use rustc_span::{DUMMY_SP, DesugaringKind, Span};
74use smallvec::{SmallVec, smallvec};
75use thin_vec::ThinVec;
76use tracing::{debug, instrument, trace};
77
78use crate::diagnostics::{AssocTyParentheses, AssocTyParenthesesSub, MisplacedImplTrait};
79
80macro_rules! arena_vec {
81    ($this:expr; $($x:expr),*) => (
82        $this.arena.alloc_from_iter([$($x),*])
83    );
84}
85
86mod asm;
87mod block;
88mod contract;
89mod delegation;
90mod diagnostics;
91mod expr;
92mod format;
93mod index;
94mod item;
95mod pat;
96mod path;
97pub mod stability;
98
99pub fn provide(providers: &mut Providers) {
100    providers.index_ast = index_ast;
101    providers.lower_to_hir = lower_to_hir;
102}
103
104#[cfg(debug_assertions)]
105pub(crate) mod re_lowering {
106    use rustc_ast::NodeId;
107    use rustc_ast::node_id::NodeMap;
108    use rustc_hir as hir;
109
110    use crate::LoweringContext;
111
112    #[derive(#[automatically_derived]
impl ::core::fmt::Debug for ReloweringChecker {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "ReloweringChecker", "node_id_to_local_id",
            &self.node_id_to_local_id, "can_relower", &&self.can_relower)
    }
}Debug, #[automatically_derived]
impl ::core::default::Default for ReloweringChecker {
    #[inline]
    fn default() -> ReloweringChecker {
        ReloweringChecker {
            node_id_to_local_id: ::core::default::Default::default(),
            can_relower: ::core::default::Default::default(),
        }
    }
}Default)]
113    pub(crate) struct ReloweringChecker {
114        node_id_to_local_id: NodeMap<hir::ItemLocalId>,
115        can_relower: bool,
116    }
117
118    impl ReloweringChecker {
119        pub(crate) fn assert_node_is_not_relowered(
120            &mut self,
121            ast_node_id: NodeId,
122            local_id: hir::ItemLocalId,
123        ) {
124            if !self.can_relower {
125                let old = self.node_id_to_local_id.insert(ast_node_id, local_id);
126                {
    match (&old, &None) {
        (left_val, right_val) => {
            if !(*left_val == *right_val) {
                let kind = ::core::panicking::AssertKind::Eq;
                ::core::panicking::assert_failed(kind, &*left_val,
                    &*right_val, ::core::option::Option::None);
            }
        }
    }
};assert_eq!(old, None);
127            }
128        }
129
130        pub(crate) fn allow_relowering<'a, 'hir, TRes>(
131            ctx: &mut LoweringContext<'a, 'hir>,
132            op: impl FnOnce(&mut LoweringContext<'a, 'hir>) -> TRes,
133        ) -> TRes {
134            if !!ctx.relowering_checker.can_relower {
    {
        ::core::panicking::panic_fmt(format_args!("reentrant relowering is not supported"));
    }
};assert!(!ctx.relowering_checker.can_relower, "reentrant relowering is not supported");
135
136            ctx.relowering_checker.can_relower = true;
137
138            let res = op(ctx);
139
140            ctx.relowering_checker.can_relower = false;
141
142            res
143        }
144    }
145}
146
147struct LoweringContext<'a, 'hir> {
148    tcx: TyCtxt<'hir>,
149    resolver: &'a ResolverAstLowering<'hir>,
150    current_disambiguator: PerParentDisambiguatorState,
151
152    /// Used to allocate HIR nodes.
153    arena: &'hir hir::Arena<'hir>,
154
155    /// Bodies inside the owner being lowered.
156    bodies: Vec<(hir::ItemLocalId, &'hir hir::Body<'hir>)>,
157    /// `#[define_opaque]` attributes
158    define_opaque: Option<&'hir [(Span, LocalDefId)]>,
159    /// Attributes inside the owner being lowered.
160    attrs: SortedMap<hir::ItemLocalId, &'hir [hir::Attribute]>,
161    /// Collect items that were created by lowering the current owner.
162    children: LocalDefIdMap<hir::MaybeOwner<'hir>>,
163
164    contract_ensures: Option<(Span, Ident, HirId)>,
165
166    coroutine_kind: Option<hir::CoroutineKind>,
167
168    /// When inside an `async` context, this is the `HirId` of the
169    /// `task_context` local bound to the resume argument of the coroutine.
170    task_context: Option<HirId>,
171
172    /// Used to get the current `fn`'s def span to point to when using `await`
173    /// outside of an `async fn`.
174    current_item: Option<Span>,
175
176    try_block_scope: TryBlockScope,
177    loop_scope: Option<HirId>,
178    is_in_loop_condition: bool,
179    is_in_dyn_type: bool,
180
181    current_hir_id_owner: hir::OwnerId,
182    owner: &'a PerOwnerResolverData<'hir>,
183    item_local_id_counter: hir::ItemLocalId,
184    trait_map: ItemLocalMap<&'hir [TraitCandidate<'hir>]>,
185
186    impl_trait_defs: Vec<hir::GenericParam<'hir>>,
187    impl_trait_bounds: Vec<hir::WherePredicate<'hir>>,
188
189    /// NodeIds of pattern identifiers and labelled nodes that are lowered inside the current HIR owner.
190    ident_and_label_to_local_id: NodeMap<hir::ItemLocalId>,
191    /// NodeIds that are lowered inside the current HIR owner. Only used for duplicate lowering check.
192    #[cfg(debug_assertions)]
193    relowering_checker: re_lowering::ReloweringChecker,
194    /// The `NodeId` space is split in two.
195    /// `0..resolver.next_node_id` are created by the resolver on the AST.
196    /// The higher part `resolver.next_node_id..next_node_id` are created during lowering.
197    next_node_id: NodeId,
198    /// Maps the `NodeId`s created during lowering to `LocalDefId`s.
199    node_id_to_def_id: NodeMap<LocalDefId>,
200    /// Overlay over resolver's `partial_res_map` used by delegation.
201    /// This only contains `PartialRes::new(Res::Local(self_param_id))`,
202    /// so we only store `self_param_id`.
203    partial_res_overrides: NodeMap<NodeId>,
204
205    allow_contracts: Arc<[Symbol]>,
206    allow_try_trait: Arc<[Symbol]>,
207    allow_gen_future: Arc<[Symbol]>,
208    allow_pattern_type: Arc<[Symbol]>,
209    allow_async_gen: Arc<[Symbol]>,
210    allow_async_iterator: Arc<[Symbol]>,
211    allow_for_await: Arc<[Symbol]>,
212    allow_async_fn_traits: Arc<[Symbol]>,
213
214    delayed_lints: Vec<DelayedLint>,
215
216    /// Stack of `move(...)` collection states. A plain closure body pushes
217    /// `Some`, so `move(...)` expressions can record the generated locals they
218    /// should lower to. Nested bodies that cannot use `move(...)` push `None`.
219    move_expr_bindings: Vec<Option<expr::MoveExprState<'hir>>>,
220
221    attribute_parser: AttributeParser<'hir>,
222}
223
224impl<'a, 'hir> LoweringContext<'a, 'hir> {
225    fn new(tcx: TyCtxt<'hir>, resolver: &'a ResolverAstLowering<'hir>, owner: NodeId) -> Self {
226        let current_ast_owner = &resolver.owners[&owner];
227        let current_hir_id_owner = hir::OwnerId { def_id: current_ast_owner.def_id };
228        let current_disambiguator = resolver
229            .disambiguators
230            .get(&current_hir_id_owner.def_id)
231            .map(|s| s.steal())
232            .unwrap_or_else(|| PerParentDisambiguatorState::new(current_hir_id_owner.def_id));
233
234        Self {
235            tcx,
236            resolver,
237            current_disambiguator,
238            owner: current_ast_owner,
239            arena: tcx.hir_arena,
240
241            // HirId handling.
242            bodies: Vec::new(),
243            define_opaque: None,
244            attrs: SortedMap::default(),
245            children: LocalDefIdMap::default(),
246            contract_ensures: None,
247            current_hir_id_owner,
248            // 0 corresponds to `owner` lowered as `current_hir_id_owner`,
249            // and we never call `lower_node_id(owner)`.
250            item_local_id_counter: hir::ItemLocalId::new(1),
251            ident_and_label_to_local_id: Default::default(),
252
253            #[cfg(debug_assertions)]
254            relowering_checker: Default::default(),
255
256            trait_map: Default::default(),
257            next_node_id: resolver.next_node_id,
258            node_id_to_def_id: NodeMap::default(),
259            partial_res_overrides: NodeMap::default(),
260
261            // Lowering state.
262            try_block_scope: TryBlockScope::Function,
263            loop_scope: None,
264            is_in_loop_condition: false,
265            is_in_dyn_type: false,
266            coroutine_kind: None,
267            task_context: None,
268            current_item: None,
269            impl_trait_defs: Vec::new(),
270            impl_trait_bounds: Vec::new(),
271            allow_contracts: [sym::contracts_internals].into(),
272            allow_try_trait: [
273                sym::try_trait_v2,
274                sym::try_trait_v2_residual,
275                sym::yeet_desugar_details,
276            ]
277            .into(),
278            allow_pattern_type: [sym::pattern_types, sym::pattern_type_range_trait].into(),
279            allow_gen_future: if tcx.features().async_fn_track_caller() {
280                [sym::gen_future, sym::closure_track_caller].into()
281            } else {
282                [sym::gen_future].into()
283            },
284            allow_for_await: [sym::async_gen_internals, sym::async_iterator].into(),
285            allow_async_fn_traits: [sym::async_fn_traits].into(),
286            allow_async_gen: [sym::async_gen_internals].into(),
287            // FIXME(gen_blocks): how does `closure_track_caller`/`async_fn_track_caller`
288            // interact with `gen`/`async gen` blocks
289            allow_async_iterator: [sym::gen_future, sym::async_iterator].into(),
290
291            move_expr_bindings: Vec::new(),
292            attribute_parser: AttributeParser::new(
293                tcx.sess,
294                tcx.features(),
295                tcx.registered_attr_tools(()),
296                ShouldEmit::ErrorsAndLints { recovery: Recovery::Allowed },
297            ),
298            delayed_lints: Vec::new(),
299        }
300    }
301
302    pub(crate) fn dcx(&self) -> DiagCtxtHandle<'hir> {
303        self.tcx.dcx()
304    }
305}
306
307struct SpanLowerer {
308    is_incremental: bool,
309    def_id: LocalDefId,
310}
311
312impl SpanLowerer {
313    fn lower(&self, span: Span) -> Span {
314        if self.is_incremental {
315            span.with_parent(Some(self.def_id))
316        } else {
317            // Do not make spans relative when not using incremental compilation.
318            span
319        }
320    }
321}
322
323impl<'tcx> ResolverAstLoweringExt<'tcx> for ResolverAstLowering<'tcx> {
    fn legacy_const_generic_args(&self, expr: &Expr, tcx: TyCtxt<'tcx>)
        -> Option<Vec<usize>> {
        let ExprKind::Path(None, path) = &expr.kind else { return None; };
        if path.segments.last().unwrap().args.is_some() { return None; }
        let def_id =
            self.partial_res_map.get(&expr.id)?.full_res()?.opt_def_id()?;
        if def_id.is_local() { return None; }
        {
                {
                    'done:
                        {
                        for i in ::rustc_attr_ir::HasAttrs::get_attrs(def_id, &tcx)
                            {
                            #[allow(unused_imports)]
                            use ::rustc_attr_ir::AttributeKind::*;
                            let i: &::rustc_attr_ir::Attribute = i;
                            match i {
                                ::rustc_attr_ir::Attribute::Parsed(RustcLegacyConstGenerics {
                                    fn_indexes, .. }) => {
                                    break 'done Some(fn_indexes);
                                }
                                ::rustc_attr_ir::Attribute::Unparsed(..) =>
                                    {}
                                    #[deny(unreachable_patterns)]
                                    _ => {}
                            }
                        }
                        None
                    }
                }
            }.map(|fn_indexes|
                fn_indexes.iter().map(|(num, _)| *num).collect())
    }
}#[extension(trait ResolverAstLoweringExt<'tcx>)]
324impl<'tcx> ResolverAstLowering<'tcx> {
325    fn legacy_const_generic_args(&self, expr: &Expr, tcx: TyCtxt<'tcx>) -> Option<Vec<usize>> {
326        let ExprKind::Path(None, path) = &expr.kind else {
327            return None;
328        };
329
330        // Don't perform legacy const generics rewriting if the path already
331        // has generic arguments.
332        if path.segments.last().unwrap().args.is_some() {
333            return None;
334        }
335
336        // We do not need to look at `partial_res_overrides`. That map only contains overrides for
337        // `self_param` locals. And here we are looking for the function definition that `expr`
338        // resolves to.
339        let def_id = self.partial_res_map.get(&expr.id)?.full_res()?.opt_def_id()?;
340
341        // We only support cross-crate argument rewriting. Uses
342        // within the same crate should be updated to use the new
343        // const generics style.
344        if def_id.is_local() {
345            return None;
346        }
347
348        // we can use parsed attrs here since for other crates they're already available
349        find_attr!(
350            tcx, def_id,
351            RustcLegacyConstGenerics{fn_indexes,..} => fn_indexes
352        )
353        .map(|fn_indexes| fn_indexes.iter().map(|(num, _)| *num).collect())
354    }
355}
356
357/// How relaxed bounds `?Trait` should be treated.
358///
359/// Relaxed bounds should only be allowed in places where we later
360/// (namely during HIR ty lowering) perform *sized elaboration*.
361#[derive(#[automatically_derived]
impl<'a> ::core::fmt::Debug for RelaxedBoundPolicy<'a> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            RelaxedBoundPolicy::Allowed(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Allowed", &__self_0),
            RelaxedBoundPolicy::Forbidden(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Forbidden", &__self_0),
        }
    }
}Debug)]
362enum RelaxedBoundPolicy<'a> {
363    /// The `DefId` refers to the trait that is being relaxed.
364    Allowed(&'a mut FxIndexMap<DefId, Span>),
365    Forbidden(RelaxedBoundForbiddenReason),
366}
367impl RelaxedBoundPolicy<'_> {
368    fn reborrow(&mut self) -> RelaxedBoundPolicy<'_> {
369        match self {
370            RelaxedBoundPolicy::Allowed(m) => RelaxedBoundPolicy::Allowed(m),
371            RelaxedBoundPolicy::Forbidden(reason) => RelaxedBoundPolicy::Forbidden(*reason),
372        }
373    }
374}
375
376#[derive(#[automatically_derived]
impl ::core::clone::Clone for RelaxedBoundForbiddenReason {
    #[inline]
    fn clone(&self) -> RelaxedBoundForbiddenReason { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for RelaxedBoundForbiddenReason { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for RelaxedBoundForbiddenReason {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                RelaxedBoundForbiddenReason::TraitObjectTy => "TraitObjectTy",
                RelaxedBoundForbiddenReason::SuperTrait => "SuperTrait",
                RelaxedBoundForbiddenReason::TraitAlias => "TraitAlias",
                RelaxedBoundForbiddenReason::AssocTyBounds => "AssocTyBounds",
                RelaxedBoundForbiddenReason::WhereBound => "WhereBound",
            })
    }
}Debug)]
377enum RelaxedBoundForbiddenReason {
378    TraitObjectTy,
379    SuperTrait,
380    TraitAlias,
381    AssocTyBounds,
382    /// We do not allow where bounds doing relaxed bounds,
383    /// except if it's for generic parameters of the current item.
384    WhereBound,
385}
386
387/// Context of `impl Trait` in code, which determines whether it is allowed in an HIR subtree,
388/// and if so, what meaning it has.
389#[derive(#[automatically_derived]
impl ::core::fmt::Debug for ImplTraitContext {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            ImplTraitContext::Universal =>
                ::core::fmt::Formatter::write_str(f, "Universal"),
            ImplTraitContext::OpaqueTy { origin: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "OpaqueTy", "origin", &__self_0),
            ImplTraitContext::InBinding =>
                ::core::fmt::Formatter::write_str(f, "InBinding"),
            ImplTraitContext::FeatureGated(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "FeatureGated", __self_0, &__self_1),
            ImplTraitContext::Disallowed(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Disallowed", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::marker::Copy for ImplTraitContext { }Copy, #[automatically_derived]
impl ::core::clone::Clone for ImplTraitContext {
    #[inline]
    fn clone(&self) -> ImplTraitContext {
        let _:
                ::core::clone::AssertParamIsClone<hir::OpaqueTyOrigin<LocalDefId>>;
        let _: ::core::clone::AssertParamIsClone<ImplTraitPosition>;
        let _: ::core::clone::AssertParamIsClone<Symbol>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for ImplTraitContext {
    #[inline]
    fn eq(&self, other: &ImplTraitContext) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (ImplTraitContext::OpaqueTy { origin: __self_0 },
                    ImplTraitContext::OpaqueTy { origin: __arg1_0 }) =>
                    __self_0 == __arg1_0,
                (ImplTraitContext::FeatureGated(__self_0, __self_1),
                    ImplTraitContext::FeatureGated(__arg1_0, __arg1_1)) =>
                    __self_0 == __arg1_0 && __self_1 == __arg1_1,
                (ImplTraitContext::Disallowed(__self_0),
                    ImplTraitContext::Disallowed(__arg1_0)) =>
                    __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ImplTraitContext {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<hir::OpaqueTyOrigin<LocalDefId>>;
        let _: ::core::cmp::AssertParamIsEq<ImplTraitPosition>;
        let _: ::core::cmp::AssertParamIsEq<Symbol>;
    }
}Eq)]
390enum ImplTraitContext {
391    /// Treat `impl Trait` as shorthand for a new universal generic parameter.
392    /// Example: `fn foo(x: impl Debug)`, where `impl Debug` is conceptually
393    /// equivalent to a fresh universal parameter like `fn foo<T: Debug>(x: T)`.
394    ///
395    /// Newly generated parameters should be inserted into the given `Vec`.
396    Universal,
397
398    /// Treat `impl Trait` as shorthand for a new opaque type.
399    /// Example: `fn foo() -> impl Debug`, where `impl Debug` is conceptually
400    /// equivalent to a new opaque type like `type T = impl Debug; fn foo() -> T`.
401    ///
402    OpaqueTy { origin: hir::OpaqueTyOrigin<LocalDefId> },
403
404    /// Treat `impl Trait` as a "trait ascription", which is like a type
405    /// variable but that also enforces that a set of trait goals hold.
406    ///
407    /// This is useful to guide inference for unnameable types.
408    InBinding,
409
410    /// `impl Trait` is unstably accepted in this position.
411    FeatureGated(ImplTraitPosition, Symbol),
412    /// `impl Trait` is not accepted in this position.
413    Disallowed(ImplTraitPosition),
414}
415
416/// Position in which `impl Trait` is disallowed.
417#[derive(#[automatically_derived]
impl ::core::fmt::Debug for ImplTraitPosition {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        const __NAMES: &str =
            "PathVariableTraitBoundGenericExternFnParamClosureParamPointerParamFnTraitParamExternFnReturnClosureReturnPointerReturnFnTraitReturnGenericDefaultConstTyStaticTyAssocTyFieldTyCastImplSelfOffsetOf";
        const __OFFSET: [usize; 22] =
            [0usize, 4usize, 12usize, 17usize, 22usize, 29usize, 42usize,
                    54usize, 66usize, 78usize, 92usize, 105usize, 118usize,
                    131usize, 145usize, 152usize, 160usize, 167usize, 174usize,
                    178usize, 186usize, 194usize];
        let __d = ::core::intrinsics::discriminant_value(self) as usize;
        ::core::fmt::Formatter::debug_c_like_enum_write_str(f, __NAMES,
            &__OFFSET, __d)
    }
}Debug, #[automatically_derived]
impl ::core::marker::Copy for ImplTraitPosition { }Copy, #[automatically_derived]
impl ::core::clone::Clone for ImplTraitPosition {
    #[inline]
    fn clone(&self) -> ImplTraitPosition { *self }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for ImplTraitPosition {
    #[inline]
    fn eq(&self, other: &ImplTraitPosition) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ImplTraitPosition {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq)]
418enum ImplTraitPosition {
419    Path,
420    Variable,
421    Trait,
422    Bound,
423    Generic,
424    ExternFnParam,
425    ClosureParam,
426    PointerParam,
427    FnTraitParam,
428    ExternFnReturn,
429    ClosureReturn,
430    PointerReturn,
431    FnTraitReturn,
432    GenericDefault,
433    ConstTy,
434    StaticTy,
435    AssocTy,
436    FieldTy,
437    Cast,
438    ImplSelf,
439    OffsetOf,
440}
441
442impl std::fmt::Display for ImplTraitPosition {
443    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
444        let name = match self {
445            ImplTraitPosition::Path => "paths",
446            ImplTraitPosition::Variable => "the type of variable bindings",
447            ImplTraitPosition::Trait => "traits",
448            ImplTraitPosition::Bound => "bounds",
449            ImplTraitPosition::Generic => "generics",
450            ImplTraitPosition::ExternFnParam => "`extern fn` parameters",
451            ImplTraitPosition::ClosureParam => "closure parameters",
452            ImplTraitPosition::PointerParam => "`fn` pointer parameters",
453            ImplTraitPosition::FnTraitParam => "the parameters of `Fn` trait bounds",
454            ImplTraitPosition::ExternFnReturn => "`extern fn` return types",
455            ImplTraitPosition::ClosureReturn => "closure return types",
456            ImplTraitPosition::PointerReturn => "`fn` pointer return types",
457            ImplTraitPosition::FnTraitReturn => "the return type of `Fn` trait bounds",
458            ImplTraitPosition::GenericDefault => "generic parameter defaults",
459            ImplTraitPosition::ConstTy => "const types",
460            ImplTraitPosition::StaticTy => "static types",
461            ImplTraitPosition::AssocTy => "associated types",
462            ImplTraitPosition::FieldTy => "field types",
463            ImplTraitPosition::Cast => "cast expression types",
464            ImplTraitPosition::ImplSelf => "impl headers",
465            ImplTraitPosition::OffsetOf => "`offset_of!` parameters",
466        };
467
468        f.write_fmt(format_args!("{0}", name))write!(f, "{name}")
469    }
470}
471
472#[derive(#[automatically_derived]
impl ::core::marker::Copy for FnDeclKind { }Copy, #[automatically_derived]
impl ::core::clone::Clone for FnDeclKind {
    #[inline]
    fn clone(&self) -> FnDeclKind { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for FnDeclKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                FnDeclKind::Fn => "Fn",
                FnDeclKind::Inherent => "Inherent",
                FnDeclKind::ExternFn => "ExternFn",
                FnDeclKind::Closure => "Closure",
                FnDeclKind::Pointer => "Pointer",
                FnDeclKind::Trait => "Trait",
                FnDeclKind::Impl => "Impl",
            })
    }
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for FnDeclKind {
    #[inline]
    fn eq(&self, other: &FnDeclKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for FnDeclKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {}
}Eq)]
473enum FnDeclKind {
474    Fn,
475    Inherent,
476    ExternFn,
477    Closure,
478    Pointer,
479    Trait,
480    Impl,
481}
482
483#[derive(#[automatically_derived]
impl ::core::marker::Copy for TryBlockScope { }Copy, #[automatically_derived]
impl ::core::clone::Clone for TryBlockScope {
    #[inline]
    fn clone(&self) -> TryBlockScope {
        let _: ::core::clone::AssertParamIsClone<HirId>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for TryBlockScope {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            TryBlockScope::Function =>
                ::core::fmt::Formatter::write_str(f, "Function"),
            TryBlockScope::Homogeneous(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Homogeneous", &__self_0),
            TryBlockScope::Heterogeneous(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Heterogeneous", &__self_0),
        }
    }
}Debug)]
484enum TryBlockScope {
485    /// There isn't a `try` block, so a `?` will use `return`.
486    Function,
487    /// We're inside a `try { … }` block, so a `?` will block-break
488    /// from that block using a type depending only on the argument.
489    Homogeneous(HirId),
490    /// We're inside a `try as _ { … }` block, so a `?` will block-break
491    /// from that block using the type specified.
492    Heterogeneous(HirId),
493}
494
495fn index_ast<'tcx>(
496    tcx: TyCtxt<'tcx>,
497    (): (),
498) -> IndexVec<LocalDefId, Steal<(Arc<ResolverAstLowering<'tcx>>, AstOwner)>> {
499    // Queries that borrow `resolver_for_lowering`.
500    tcx.ensure_done().output_filenames(());
501    tcx.ensure_done().early_lint_checks(());
502    tcx.ensure_done().get_lang_items(());
503    tcx.ensure_done().debugger_visualizers(LOCAL_CRATE);
504
505    let (resolver, krate) = tcx.resolver_for_lowering();
506    let mut resolver = resolver.steal();
507    let mut krate = krate.steal();
508
509    let mut indexer = Indexer {
510        owners: &resolver.owners,
511        index: IndexVec::new(),
512        next_node_id: resolver.next_node_id,
513    };
514    indexer.visit_crate(&mut krate);
515    indexer.insert(CRATE_NODE_ID, AstOwner::Crate(Box::new(krate)));
516    resolver.next_node_id = indexer.next_node_id;
517
518    let index = indexer.index;
519    let resolver = Arc::new(resolver);
520    let index = index.into_iter().map(|owner| Steal::new((Arc::clone(&resolver), owner))).collect();
521    return index;
522
523    struct Indexer<'s, 'hir> {
524        owners: &'s NodeMap<PerOwnerResolverData<'hir>>,
525        index: IndexVec<LocalDefId, AstOwner>,
526        next_node_id: NodeId,
527    }
528
529    impl Indexer<'_, '_> {
530        fn insert(&mut self, id: NodeId, node: AstOwner) {
531            let def_id = self.owners[&id].def_id;
532            self.index.ensure_contains_elem(def_id, || AstOwner::NonOwner);
533            self.index[def_id] = node;
534        }
535
536        fn make_dummy<K>(
537            &mut self,
538            id: NodeId,
539            span: Span,
540            dummy: impl FnOnce(Box<MacCall>) -> K,
541        ) -> Box<Item<K>> {
542            use rustc_ast::token::Delimiter;
543            use rustc_ast::tokenstream::{DelimSpan, TokenStream};
544            use thin_vec::thin_vec;
545
546            Box::new(Item {
547                attrs: AttrVec::default(),
548                id,
549                span,
550                vis: Visibility { kind: VisibilityKind::Public, span },
551                // Lacking a better choice, we replace the contents with a macro call.
552                // Unexpanded macros should never reach lowering, so this is not confusing.
553                kind: dummy(Box::new(MacCall {
554                    path: Path { span, segments: ::thin_vec::ThinVec::new()thin_vec![] },
555                    args: Box::new(DelimArgs {
556                        dspan: DelimSpan::from_single(span),
557                        delim: Delimiter::Parenthesis,
558                        tokens: TokenStream::new(Vec::new()),
559                    }),
560                })),
561                tokens: None,
562            })
563        }
564
565        fn replace_with_dummy<K>(
566            &mut self,
567            item: &mut ast::Item<K>,
568            dummy: impl FnOnce(Box<MacCall>) -> K,
569            node: impl FnOnce(Box<Item<K>>) -> AstOwner,
570        ) {
571            let dummy = self.make_dummy(item.id, item.span, dummy);
572            let item = mem::replace(item, *dummy);
573            self.insert(item.id, node(Box::new(item)));
574        }
575
576        #[allow(clippy :: suspicious_else_formatting)]
{
    let __tracing_attr_span;
    let __tracing_attr_guard;
    if ::tracing::Level::TRACE <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::TRACE <=
                    ::tracing::level_filters::LevelFilter::current() ||
            { false } {
        __tracing_attr_span =
            {
                use ::tracing::__macro_support::Callsite as _;
                static __CALLSITE: ::tracing::callsite::DefaultCallsite =
                    {
                        static META: ::tracing::Metadata<'static> =
                            {
                                ::tracing_core::metadata::Metadata::new("visit_item_id_use_tree",
                                    "rustc_ast_lowering", ::tracing::Level::TRACE,
                                    ::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
                                    ::tracing_core::__macro_support::Option::Some(576u32),
                                    ::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
                                    ::tracing_core::field::FieldSet::new(&[{
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("tree")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("tree");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("parent")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("parent");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("items")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("items");
                                                        NAME.as_str()
                                                    }], ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                    ::tracing::metadata::Kind::SPAN)
                            };
                        ::tracing::callsite::DefaultCallsite::new(&META)
                    };
                let mut interest = ::tracing::subscriber::Interest::never();
                if ::tracing::Level::TRACE <=
                                    ::tracing::level_filters::STATIC_MAX_LEVEL &&
                                ::tracing::Level::TRACE <=
                                    ::tracing::level_filters::LevelFilter::current() &&
                            { interest = __CALLSITE.interest(); !interest.is_never() }
                        &&
                        ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                            interest) {
                    let meta = __CALLSITE.metadata();
                    ::tracing::Span::new(meta,
                        &{
                                #[allow(unused_imports)]
                                use ::tracing::field::{debug, display, Value};
                                meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&tree)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&parent)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&items)
                                                            as &dyn ::tracing::field::Value))])
                            })
                } else {
                    let span =
                        ::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
                    {};
                    span
                }
            };
        __tracing_attr_guard = __tracing_attr_span.enter();
    }

    #[warn(clippy :: suspicious_else_formatting)]
    {

        #[allow(unknown_lints, unreachable_code, clippy ::
        diverging_sub_expression, clippy :: empty_loop, clippy ::
        let_unit_value, clippy :: let_with_type_underscore, clippy ::
        needless_return, clippy :: unreachable)]
        if false {
            let __tracing_attr_fake_return: () = loop {};
            return __tracing_attr_fake_return;
        }
        {
            match tree.kind {
                UseTreeKind::Glob(_) | UseTreeKind::Simple(_) => {}
                UseTreeKind::Nested { items: ref nested_vec, span } => {
                    for &(ref nested, id) in nested_vec {
                        self.insert(id, AstOwner::NestedUseTree(parent));
                        items.push(self.make_dummy(id, span, ItemKind::MacCall));
                        let def_id = self.owners[&id].def_id;
                        self.visit_item_id_use_tree(nested, def_id, items);
                    }
                }
            }
        }
    }
}#[tracing::instrument(level = "trace", skip(self))]
577        fn visit_item_id_use_tree(
578            &mut self,
579            tree: &UseTree,
580            parent: LocalDefId,
581            items: &mut SmallVec<[Box<Item>; 1]>,
582        ) {
583            match tree.kind {
584                UseTreeKind::Glob(_) | UseTreeKind::Simple(_) => {}
585                UseTreeKind::Nested { items: ref nested_vec, span } => {
586                    for &(ref nested, id) in nested_vec {
587                        self.insert(id, AstOwner::NestedUseTree(parent));
588                        items.push(self.make_dummy(id, span, ItemKind::MacCall));
589
590                        let def_id = self.owners[&id].def_id;
591                        self.visit_item_id_use_tree(nested, def_id, items);
592                    }
593                }
594            }
595        }
596    }
597
598    impl MutVisitor for Indexer<'_, '_> {
599        fn visit_attribute(&mut self, _: &mut Attribute) {
600            // We do not want to lower expressions that appear in attributes,
601            // as they are not accessible to the rest of the HIR.
602        }
603
604        fn flat_map_item(&mut self, mut item: Box<Item>) -> SmallVec<[Box<Item>; 1]> {
605            let def_id = self.owners[&item.id].def_id;
606            mut_visit::walk_item(self, &mut *item);
607            let dummy = self.make_dummy(item.id, item.span, ItemKind::MacCall);
608            let mut items = {
    let count = 0usize + 1usize;
    let mut vec = ::smallvec::SmallVec::new();
    if count <= vec.inline_size() {
        vec.push(dummy);
        vec
    } else {
        ::smallvec::SmallVec::from_vec(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
                    [dummy])))
    }
}smallvec![dummy];
609            if let ItemKind::Use(ref use_tree) = item.kind {
610                self.visit_item_id_use_tree(use_tree, def_id, &mut items);
611            }
612            self.insert(item.id, AstOwner::Item(item));
613            items
614        }
615
616        fn flat_map_stmt(&mut self, stmt: Stmt) -> SmallVec<[Stmt; 1]> {
617            let Stmt { id, span, kind } = stmt;
618            let mut id = Some(id);
619            mut_visit::walk_flat_map_stmt_kind(self, kind)
620                .into_iter()
621                .map(|kind| {
622                    // Expanding the current statement is a nested `use` item,
623                    // it is expanded into several flat `use` items.
624                    // Create new NodeIds for the corresponding statements
625                    // as two statements cannot have the same.
626                    let id = id.take().unwrap_or_else(|| {
627                        let next = self.next_node_id;
628                        self.next_node_id.increment_by(1);
629                        next
630                    });
631                    Stmt { id, kind, span }
632                })
633                .collect()
634        }
635
636        fn visit_assoc_item(&mut self, item: &mut AssocItem, ctxt: visit::AssocCtxt) {
637            mut_visit::walk_assoc_item(self, item, ctxt);
638            match ctxt {
639                visit::AssocCtxt::Trait => {
640                    self.replace_with_dummy(item, AssocItemKind::MacCall, AstOwner::TraitItem)
641                }
642                visit::AssocCtxt::Impl { .. } => {
643                    self.replace_with_dummy(item, AssocItemKind::MacCall, AstOwner::ImplItem)
644                }
645            }
646        }
647
648        fn visit_foreign_item(&mut self, item: &mut ForeignItem) {
649            mut_visit::walk_item(self, item);
650            self.replace_with_dummy(item, ForeignItemKind::MacCall, AstOwner::ForeignItem);
651        }
652    }
653}
654
655#[allow(clippy :: suspicious_else_formatting)]
{
    let __tracing_attr_span;
    let __tracing_attr_guard;
    if ::tracing::Level::TRACE <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::TRACE <=
                    ::tracing::level_filters::LevelFilter::current() ||
            { false } {
        __tracing_attr_span =
            {
                use ::tracing::__macro_support::Callsite as _;
                static __CALLSITE: ::tracing::callsite::DefaultCallsite =
                    {
                        static META: ::tracing::Metadata<'static> =
                            {
                                ::tracing_core::metadata::Metadata::new("lower_to_hir",
                                    "rustc_ast_lowering", ::tracing::Level::TRACE,
                                    ::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
                                    ::tracing_core::__macro_support::Option::Some(655u32),
                                    ::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
                                    ::tracing_core::field::FieldSet::new(&[{
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("def_id")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("def_id");
                                                        NAME.as_str()
                                                    }], ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                    ::tracing::metadata::Kind::SPAN)
                            };
                        ::tracing::callsite::DefaultCallsite::new(&META)
                    };
                let mut interest = ::tracing::subscriber::Interest::never();
                if ::tracing::Level::TRACE <=
                                    ::tracing::level_filters::STATIC_MAX_LEVEL &&
                                ::tracing::Level::TRACE <=
                                    ::tracing::level_filters::LevelFilter::current() &&
                            { interest = __CALLSITE.interest(); !interest.is_never() }
                        &&
                        ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                            interest) {
                    let meta = __CALLSITE.metadata();
                    ::tracing::Span::new(meta,
                        &{
                                #[allow(unused_imports)]
                                use ::tracing::field::{debug, display, Value};
                                meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&def_id)
                                                            as &dyn ::tracing::field::Value))])
                            })
                } else {
                    let span =
                        ::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
                    {};
                    span
                }
            };
        __tracing_attr_guard = __tracing_attr_span.enter();
    }

    #[warn(clippy :: suspicious_else_formatting)]
    {

        #[allow(unknown_lints, unreachable_code, clippy ::
        diverging_sub_expression, clippy :: empty_loop, clippy ::
        let_unit_value, clippy :: let_with_type_underscore, clippy ::
        needless_return, clippy :: unreachable)]
        if false {
            let __tracing_attr_fake_return: hir::MaybeOwner<'_> = loop {};
            return __tracing_attr_fake_return;
        }
        {
            let ast_index = tcx.index_ast(());
            let resolver_and_node = ast_index.get(def_id).map(Steal::steal);
            let fallback_to_ancestor =
                |parent_id|
                    {
                        let mut parent_info = tcx.lower_to_hir(parent_id);
                        if let hir::MaybeOwner::NonOwner(hir_id) = parent_info {
                            parent_info = tcx.lower_to_hir(hir_id.owner);
                        }
                        let parent_info = parent_info.unwrap();
                        *parent_info.children.get(&def_id).unwrap_or_else(||
                                    {
                                        {
                                            ::core::panicking::panic_fmt(format_args!("{0:?} does not appear in children of {1:?}",
                                                    def_id, parent_info.nodes.node().def_id()));
                                        }
                                    })
                    };
            let Some((resolver, node)) =
                resolver_and_node else {
                    return fallback_to_ancestor(tcx.local_parent(def_id));
                };
            let mut item_lowerer =
                item::ItemLowerer { tcx, resolver: &*resolver };
            let item =
                match &node {
                    AstOwner::Crate(c) => item_lowerer.lower_crate(&c),
                    AstOwner::Item(item) => item_lowerer.lower_item(&item),
                    AstOwner::TraitItem(item) =>
                        item_lowerer.lower_trait_item(&item),
                    AstOwner::ImplItem(item) =>
                        item_lowerer.lower_impl_item(&item),
                    AstOwner::ForeignItem(item) =>
                        item_lowerer.lower_foreign_item(&item),
                    AstOwner::NestedUseTree(owner_id) =>
                        fallback_to_ancestor(*owner_id),
                    AstOwner::NonOwner =>
                        fallback_to_ancestor(tcx.local_parent(def_id)),
                };
            tcx.sess.time("drop_ast", || mem::drop(node));
            item
        }
    }
}#[instrument(level = "trace", skip(tcx))]
656fn lower_to_hir(tcx: TyCtxt<'_>, def_id: LocalDefId) -> hir::MaybeOwner<'_> {
657    let ast_index = tcx.index_ast(());
658    let resolver_and_node = ast_index.get(def_id).map(Steal::steal);
659
660    let fallback_to_ancestor = |parent_id| {
661        // The item did not exist in the AST, it was created while lowering another item.
662        // `parent_id` may be different from the direct parent of `def_id`,
663        // for instance use-trees are lowered by the first sibling.
664        let mut parent_info = tcx.lower_to_hir(parent_id);
665        if let hir::MaybeOwner::NonOwner(hir_id) = parent_info {
666            // `parent_id` could also not be a owner either.
667            // For instance if `def_id` is an enum variant field,
668            // the direct parent is the enum variant.
669            // In that case `hir_id.owner` point to the actual HIR owner
670            // and skips all non-owner parents, so fetch the HIR associated to it.
671            parent_info = tcx.lower_to_hir(hir_id.owner);
672        }
673
674        let parent_info = parent_info.unwrap();
675        *parent_info.children.get(&def_id).unwrap_or_else(|| {
676            panic!(
677                "{:?} does not appear in children of {:?}",
678                def_id,
679                parent_info.nodes.node().def_id()
680            )
681        })
682    };
683
684    let Some((resolver, node)) = resolver_and_node else {
685        // `ast_index` does not contain all definitions, only up-to the highest
686        // `LocalDefId` which has a non-trivial `AstOwner`. Gracefully handle
687        // other definitions, in particular those nested inside this highest definition.
688        return fallback_to_ancestor(tcx.local_parent(def_id));
689    };
690
691    let mut item_lowerer = item::ItemLowerer { tcx, resolver: &*resolver };
692
693    let item = match &node {
694        // The item existed in the AST.
695        AstOwner::Crate(c) => item_lowerer.lower_crate(&c),
696        AstOwner::Item(item) => item_lowerer.lower_item(&item),
697        AstOwner::TraitItem(item) => item_lowerer.lower_trait_item(&item),
698        AstOwner::ImplItem(item) => item_lowerer.lower_impl_item(&item),
699        AstOwner::ForeignItem(item) => item_lowerer.lower_foreign_item(&item),
700        AstOwner::NestedUseTree(owner_id) => fallback_to_ancestor(*owner_id),
701        // The item existed in the AST, but is not a HIR owner.
702        // Fetch the correct information from its parent.
703        AstOwner::NonOwner => fallback_to_ancestor(tcx.local_parent(def_id)),
704    };
705
706    tcx.sess.time("drop_ast", || mem::drop(node));
707
708    item
709}
710
711#[derive(#[automatically_derived]
impl ::core::marker::Copy for ParamMode { }Copy, #[automatically_derived]
impl ::core::clone::Clone for ParamMode {
    #[inline]
    fn clone(&self) -> ParamMode { *self }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for ParamMode {
    #[inline]
    fn eq(&self, other: &ParamMode) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr
    }
}PartialEq, #[automatically_derived]
impl ::core::fmt::Debug for ParamMode {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                ParamMode::Explicit => "Explicit",
                ParamMode::Optional => "Optional",
            })
    }
}Debug)]
712enum ParamMode {
713    /// Any path in a type context.
714    Explicit,
715    /// The `module::Type` in `module::Type::method` in an expression.
716    Optional,
717}
718
719#[derive(#[automatically_derived]
impl ::core::marker::Copy for AllowReturnTypeNotation { }Copy, #[automatically_derived]
impl ::core::clone::Clone for AllowReturnTypeNotation {
    #[inline]
    fn clone(&self) -> AllowReturnTypeNotation { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for AllowReturnTypeNotation {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                AllowReturnTypeNotation::Yes => "Yes",
                AllowReturnTypeNotation::No => "No",
            })
    }
}Debug)]
720enum AllowReturnTypeNotation {
721    /// Only in types, since RTN is denied later during HIR lowering.
722    Yes,
723    /// All other positions (path expr, method, use tree).
724    No,
725}
726
727enum GenericArgsMode {
728    /// Allow paren sugar, don't allow RTN.
729    ParenSugar,
730    /// Allow RTN, don't allow paren sugar.
731    ReturnTypeNotation,
732    // Error if parenthesized generics or RTN are encountered.
733    Err,
734    /// Silence errors when lowering generics. Only used with `Res::Err`.
735    Silence,
736}
737
738impl<'hir> LoweringContext<'_, 'hir> {
739    fn create_def(
740        &mut self,
741        node_id: NodeId,
742        name: Option<Symbol>,
743        def_kind: DefKind,
744        span: Span,
745    ) -> LocalDefId {
746        let parent = self.current_hir_id_owner.def_id;
747        {
    match (&node_id, &ast::DUMMY_NODE_ID) {
        (left_val, right_val) => {
            if *left_val == *right_val {
                let kind = ::core::panicking::AssertKind::Ne;
                ::core::panicking::assert_failed(kind, &*left_val,
                    &*right_val, ::core::option::Option::None);
            }
        }
    }
};assert_ne!(node_id, ast::DUMMY_NODE_ID);
748        if !self.opt_local_def_id(node_id).is_none() {
    {
        ::core::panicking::panic_fmt(format_args!("adding a def\'n for node-id {0:?} and def kind {1:?} but a previous def\'n exists: {2:?}",
                node_id, def_kind,
                self.tcx.hir_def_key(self.local_def_id(node_id))));
    }
};assert!(
749            self.opt_local_def_id(node_id).is_none(),
750            "adding a def'n for node-id {:?} and def kind {:?} but a previous def'n exists: {:?}",
751            node_id,
752            def_kind,
753            self.tcx.hir_def_key(self.local_def_id(node_id)),
754        );
755
756        let def_id = self
757            .tcx
758            .at(span)
759            .create_def(parent, name, def_kind, None, &mut self.current_disambiguator)
760            .def_id();
761
762        {
    use ::tracing::__macro_support::Callsite as _;
    static __CALLSITE: ::tracing::callsite::DefaultCallsite =
        {
            static META: ::tracing::Metadata<'static> =
                {
                    ::tracing_core::metadata::Metadata::new("event compiler/rustc_ast_lowering/src/lib.rs:762",
                        "rustc_ast_lowering", ::tracing::Level::DEBUG,
                        ::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
                        ::tracing_core::__macro_support::Option::Some(762u32),
                        ::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
                        ::tracing_core::field::FieldSet::new(&["message"],
                            ::tracing_core::callsite::Identifier(&__CALLSITE)),
                        ::tracing::metadata::Kind::EVENT)
                };
            ::tracing::callsite::DefaultCallsite::new(&META)
        };
    let enabled =
        ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::DEBUG <=
                    ::tracing::level_filters::LevelFilter::current() &&
            {
                let interest = __CALLSITE.interest();
                !interest.is_never() &&
                    ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                        interest)
            };
    if enabled {
        (|value_set: ::tracing::field::ValueSet|
                    {
                        let meta = __CALLSITE.metadata();
                        ::tracing::Event::dispatch(meta, &value_set);
                        ;
                    })({
                #[allow(unused_imports)]
                use ::tracing::field::{debug, display, Value};
                __CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("create_def: def_id_to_node_id[{0:?}] <-> {1:?}",
                                                    def_id, node_id) as &dyn ::tracing::field::Value))])
            });
    } else { ; }
};debug!("create_def: def_id_to_node_id[{:?}] <-> {:?}", def_id, node_id);
763        self.node_id_to_def_id.insert(node_id, def_id);
764
765        def_id
766    }
767
768    fn next_node_id(&mut self) -> NodeId {
769        let start = self.next_node_id;
770        let next = start.as_u32().checked_add(1).expect("input too large; ran out of NodeIds");
771        self.next_node_id = NodeId::from_u32(next);
772        start
773    }
774
775    /// Given the id of some node in the AST, finds the `LocalDefId` associated with it by the name
776    /// resolver (if any).
777    x;#[instrument(level = "trace", skip(self), ret)]
778    fn opt_local_def_id(&self, node: NodeId) -> Option<LocalDefId> {
779        self.node_id_to_def_id
780            .get(&node)
781            .or_else(|| self.owner.node_id_to_def_id.get(&node))
782            .copied()
783    }
784
785    fn local_def_id(&self, node: NodeId) -> LocalDefId {
786        self.opt_local_def_id(node).unwrap_or_else(|| {
787            self.resolver.owners.items().any(|(id, items)| {
788                items.node_id_to_def_id.items().any(|(node_id, def_id)| {
789                    if *node_id == node {
790                        let actual_owner = items.node_id_to_def_id.get(id);
791                        {
    ::core::panicking::panic_fmt(format_args!("{0:?} ({1}) was found in {2:?} ({3})",
            def_id, node_id, actual_owner, id));
}panic!("{def_id:?} ({node_id}) was found in {actual_owner:?} ({id})",)
792                    }
793                    false
794                })
795            });
796            {
    ::core::panicking::panic_fmt(format_args!("no entry for node id: `{0:?}`",
            node));
};panic!("no entry for node id: `{node:?}`");
797        })
798    }
799
800    fn get_partial_res(&self, id: NodeId) -> Option<PartialRes> {
801        match self.partial_res_overrides.get(&id) {
802            Some(self_param_id) => Some(PartialRes::new(Res::Local(*self_param_id))),
803            None => self.resolver.partial_res_map.get(&id).copied(),
804        }
805    }
806
807    /// Given the id of an owner node in the AST, returns the corresponding `OwnerId`.
808    fn owner_id(&self, node: NodeId) -> hir::OwnerId {
809        hir::OwnerId { def_id: self.resolver.owners[&node].def_id }
810    }
811
812    /// Freshen the `LoweringContext` and ready it to lower a nested item.
813    /// The lowered item is registered into `self.children`.
814    ///
815    /// This function sets up `HirId` lowering infrastructure,
816    /// and stashes the shared mutable state to avoid pollution by the closure.
817    #[allow(clippy :: suspicious_else_formatting)]
{
    let __tracing_attr_span;
    let __tracing_attr_guard;
    if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::DEBUG <=
                    ::tracing::level_filters::LevelFilter::current() ||
            { false } {
        __tracing_attr_span =
            {
                use ::tracing::__macro_support::Callsite as _;
                static __CALLSITE: ::tracing::callsite::DefaultCallsite =
                    {
                        static META: ::tracing::Metadata<'static> =
                            {
                                ::tracing_core::metadata::Metadata::new("with_hir_id_owner",
                                    "rustc_ast_lowering", ::tracing::Level::DEBUG,
                                    ::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
                                    ::tracing_core::__macro_support::Option::Some(817u32),
                                    ::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
                                    ::tracing_core::field::FieldSet::new(&[{
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("owner")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("owner");
                                                        NAME.as_str()
                                                    }], ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                    ::tracing::metadata::Kind::SPAN)
                            };
                        ::tracing::callsite::DefaultCallsite::new(&META)
                    };
                let mut interest = ::tracing::subscriber::Interest::never();
                if ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::STATIC_MAX_LEVEL &&
                                ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::LevelFilter::current() &&
                            { interest = __CALLSITE.interest(); !interest.is_never() }
                        &&
                        ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                            interest) {
                    let meta = __CALLSITE.metadata();
                    ::tracing::Span::new(meta,
                        &{
                                #[allow(unused_imports)]
                                use ::tracing::field::{debug, display, Value};
                                meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&owner)
                                                            as &dyn ::tracing::field::Value))])
                            })
                } else {
                    let span =
                        ::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
                    {};
                    span
                }
            };
        __tracing_attr_guard = __tracing_attr_span.enter();
    }

    #[warn(clippy :: suspicious_else_formatting)]
    {

        #[allow(unknown_lints, unreachable_code, clippy ::
        diverging_sub_expression, clippy :: empty_loop, clippy ::
        let_unit_value, clippy :: let_with_type_underscore, clippy ::
        needless_return, clippy :: unreachable)]
        if false {
            let __tracing_attr_fake_return: () = loop {};
            return __tracing_attr_fake_return;
        }
        {
            let owner_id = self.owner_id(owner);
            let def_id = owner_id.def_id;
            let new_disambig =
                self.resolver.disambiguators.get(&def_id).map(|s|
                            s.steal()).unwrap_or_else(||
                        PerParentDisambiguatorState::new(def_id));
            let disambiguator =
                mem::replace(&mut self.current_disambiguator, new_disambig);
            let current_ast_owner =
                mem::replace(&mut self.owner, &self.resolver.owners[&owner]);
            let current_attrs = mem::take(&mut self.attrs);
            let current_bodies = mem::take(&mut self.bodies);
            let current_define_opaque = mem::take(&mut self.define_opaque);
            let current_ident_and_label_to_local_id =
                mem::take(&mut self.ident_and_label_to_local_id);
            let current_relowering_checker =
                mem::take(&mut self.relowering_checker);
            let current_trait_map = mem::take(&mut self.trait_map);
            let current_owner =
                mem::replace(&mut self.current_hir_id_owner, owner_id);
            let current_local_counter =
                mem::replace(&mut self.item_local_id_counter,
                    hir::ItemLocalId::new(1));
            let current_impl_trait_defs =
                mem::take(&mut self.impl_trait_defs);
            let current_impl_trait_bounds =
                mem::take(&mut self.impl_trait_bounds);
            let current_delayed_lints = mem::take(&mut self.delayed_lints);
            let current_children = mem::take(&mut self.children);
            self.relowering_checker.assert_node_is_not_relowered(owner,
                hir::ItemLocalId::ZERO);
            let item = f(self);
            {
                match (&owner_id, &item.def_id()) {
                    (left_val, right_val) => {
                        if !(*left_val == *right_val) {
                            let kind = ::core::panicking::AssertKind::Eq;
                            ::core::panicking::assert_failed(kind, &*left_val,
                                &*right_val, ::core::option::Option::None);
                        }
                    }
                }
            };
            if !self.impl_trait_defs.is_empty() {
                ::core::panicking::panic("assertion failed: self.impl_trait_defs.is_empty()")
            };
            if !self.impl_trait_bounds.is_empty() {
                ::core::panicking::panic("assertion failed: self.impl_trait_bounds.is_empty()")
            };
            let info = self.make_owner_info(item);
            self.current_disambiguator = disambiguator;
            self.owner = current_ast_owner;
            self.attrs = current_attrs;
            self.bodies = current_bodies;
            self.define_opaque = current_define_opaque;
            self.ident_and_label_to_local_id =
                current_ident_and_label_to_local_id;
            { self.relowering_checker = current_relowering_checker; }
            self.trait_map = current_trait_map;
            self.current_hir_id_owner = current_owner;
            self.item_local_id_counter = current_local_counter;
            self.impl_trait_defs = current_impl_trait_defs;
            self.impl_trait_bounds = current_impl_trait_bounds;
            self.delayed_lints = current_delayed_lints;
            self.children = current_children;
            self.children.extend_unord(info.children.items().map(|(&def_id,
                            &info)| (def_id, info)));
            if true {
                if !!self.children.contains_key(&owner_id.def_id) {
                    ::core::panicking::panic("assertion failed: !self.children.contains_key(&owner_id.def_id)")
                };
            };
            self.children.insert(owner_id.def_id,
                hir::MaybeOwner::Owner(info));
        }
    }
}#[instrument(level = "debug", skip(self, f))]
818    fn with_hir_id_owner(
819        &mut self,
820        owner: NodeId,
821        f: impl FnOnce(&mut Self) -> hir::OwnerNode<'hir>,
822    ) {
823        let owner_id = self.owner_id(owner);
824        let def_id = owner_id.def_id;
825
826        let new_disambig = self
827            .resolver
828            .disambiguators
829            .get(&def_id)
830            .map(|s| s.steal())
831            .unwrap_or_else(|| PerParentDisambiguatorState::new(def_id));
832
833        let disambiguator = mem::replace(&mut self.current_disambiguator, new_disambig);
834        let current_ast_owner = mem::replace(&mut self.owner, &self.resolver.owners[&owner]);
835        let current_attrs = mem::take(&mut self.attrs);
836        let current_bodies = mem::take(&mut self.bodies);
837        let current_define_opaque = mem::take(&mut self.define_opaque);
838        let current_ident_and_label_to_local_id = mem::take(&mut self.ident_and_label_to_local_id);
839
840        #[cfg(debug_assertions)]
841        let current_relowering_checker = mem::take(&mut self.relowering_checker);
842        let current_trait_map = mem::take(&mut self.trait_map);
843        let current_owner = mem::replace(&mut self.current_hir_id_owner, owner_id);
844        let current_local_counter =
845            mem::replace(&mut self.item_local_id_counter, hir::ItemLocalId::new(1));
846        let current_impl_trait_defs = mem::take(&mut self.impl_trait_defs);
847        let current_impl_trait_bounds = mem::take(&mut self.impl_trait_bounds);
848        let current_delayed_lints = mem::take(&mut self.delayed_lints);
849        let current_children = mem::take(&mut self.children);
850
851        // Do not reset `next_node_id` and `node_id_to_def_id`:
852        // we want `f` to be able to refer to the `LocalDefId`s that the caller created.
853        // and the caller to refer to some of the subdefinitions' nodes' `LocalDefId`s.
854
855        // Always allocate the first `HirId` for the owner itself.
856        #[cfg(debug_assertions)]
857        self.relowering_checker.assert_node_is_not_relowered(owner, hir::ItemLocalId::ZERO);
858
859        let item = f(self);
860        assert_eq!(owner_id, item.def_id());
861        // `f` should have consumed all the elements in these vectors when constructing `item`.
862        assert!(self.impl_trait_defs.is_empty());
863        assert!(self.impl_trait_bounds.is_empty());
864        let info = self.make_owner_info(item);
865
866        self.current_disambiguator = disambiguator;
867        self.owner = current_ast_owner;
868        self.attrs = current_attrs;
869        self.bodies = current_bodies;
870        self.define_opaque = current_define_opaque;
871        self.ident_and_label_to_local_id = current_ident_and_label_to_local_id;
872
873        #[cfg(debug_assertions)]
874        {
875            self.relowering_checker = current_relowering_checker;
876        }
877        self.trait_map = current_trait_map;
878        self.current_hir_id_owner = current_owner;
879        self.item_local_id_counter = current_local_counter;
880        self.impl_trait_defs = current_impl_trait_defs;
881        self.impl_trait_bounds = current_impl_trait_bounds;
882        self.delayed_lints = current_delayed_lints;
883        self.children = current_children;
884        self.children.extend_unord(info.children.items().map(|(&def_id, &info)| (def_id, info)));
885
886        debug_assert!(!self.children.contains_key(&owner_id.def_id));
887        self.children.insert(owner_id.def_id, hir::MaybeOwner::Owner(info));
888    }
889
890    fn make_owner_info(&mut self, node: hir::OwnerNode<'hir>) -> &'hir hir::OwnerInfo<'hir> {
891        let attrs = mem::take(&mut self.attrs);
892        let mut bodies = mem::take(&mut self.bodies);
893        let define_opaque = mem::take(&mut self.define_opaque);
894        let trait_map = mem::take(&mut self.trait_map);
895        let delayed_lints = Steal::new(mem::take(&mut self.delayed_lints).into_boxed_slice());
896        let children = mem::take(&mut self.children);
897
898        #[cfg(debug_assertions)]
899        for (id, attrs) in attrs.iter() {
900            // Verify that we do not store empty slices in the map.
901            if attrs.is_empty() {
902                {
    ::core::panicking::panic_fmt(format_args!("Stored empty attributes for {0:?}",
            id));
};panic!("Stored empty attributes for {:?}", id);
903            }
904        }
905
906        bodies.sort_by_key(|(k, _)| *k);
907        let bodies = SortedMap::from_presorted_elements(bodies);
908
909        // Don't hash unless necessary, because it's expensive.
910        let rustc_middle::hir::Hashes { bodies_hash, attrs_hash } =
911            self.tcx.hash_owner_nodes(node, &bodies, &attrs, define_opaque);
912        let num_nodes = self.item_local_id_counter.as_usize();
913        let (nodes, parenting) = index::index_hir(self.tcx, node, &bodies, num_nodes);
914        let nodes = hir::OwnerNodes { opt_hash: bodies_hash, nodes, bodies };
915        let attrs = hir::AttributeMap { map: attrs, opt_hash: attrs_hash, define_opaque };
916
917        let opt_hash = self.tcx.needs_hir_hash().then(|| {
918            self.tcx.with_stable_hashing_context(|mut hcx| {
919                let mut stable_hasher = StableHasher::new();
920                bodies_hash.unwrap().stable_hash(&mut hcx, &mut stable_hasher);
921                attrs_hash.unwrap().stable_hash(&mut hcx, &mut stable_hasher);
922                // Do not hash delayed_lints.
923                parenting.stable_hash(&mut hcx, &mut stable_hasher);
924                trait_map.stable_hash(&mut hcx, &mut stable_hasher);
925                children.stable_hash(&mut hcx, &mut stable_hasher);
926                stable_hasher.finish()
927            })
928        });
929
930        self.arena.alloc(hir::OwnerInfo {
931            opt_hash,
932            nodes,
933            parenting,
934            attrs,
935            trait_map,
936            delayed_lints,
937            children,
938        })
939    }
940
941    /// This method allocates a new `HirId` for the given `NodeId`.
942    /// Take care not to call this method if the resulting `HirId` is then not
943    /// actually used in the HIR, as that would trigger an assertion in the
944    /// `HirIdValidator` later on, which makes sure that all `NodeId`s got mapped
945    /// properly. Calling the method twice with the same `NodeId` is also forbidden.
946    x;#[instrument(level = "debug", skip(self), ret)]
947    fn lower_node_id(&mut self, ast_node_id: NodeId) -> HirId {
948        assert_ne!(ast_node_id, DUMMY_NODE_ID);
949
950        let owner = self.current_hir_id_owner;
951        let local_id = self.item_local_id_counter;
952        assert_ne!(local_id, hir::ItemLocalId::ZERO);
953        self.item_local_id_counter.increment_by(1);
954        let hir_id = HirId { owner, local_id };
955
956        if let Some(def_id) = self.opt_local_def_id(ast_node_id) {
957            self.children.insert(def_id, hir::MaybeOwner::NonOwner(hir_id));
958        }
959
960        if let Some(traits) = self.owner.trait_map.get(&ast_node_id) {
961            self.trait_map.insert(hir_id.local_id, *traits);
962        }
963
964        // Check whether the same `NodeId` is lowered more than once.
965        #[cfg(debug_assertions)]
966        self.relowering_checker.assert_node_is_not_relowered(ast_node_id, local_id);
967
968        hir_id
969    }
970
971    /// Generate a new `HirId` without a backing `NodeId`.
972    x;#[instrument(level = "debug", skip(self), ret)]
973    fn next_id(&mut self) -> HirId {
974        let owner = self.current_hir_id_owner;
975        let local_id = self.item_local_id_counter;
976        assert_ne!(local_id, hir::ItemLocalId::ZERO);
977        self.item_local_id_counter.increment_by(1);
978        HirId { owner, local_id }
979    }
980
981    #[allow(clippy :: suspicious_else_formatting)]
{
    let __tracing_attr_span;
    let __tracing_attr_guard;
    if ::tracing::Level::TRACE <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::TRACE <=
                    ::tracing::level_filters::LevelFilter::current() ||
            { false } {
        __tracing_attr_span =
            {
                use ::tracing::__macro_support::Callsite as _;
                static __CALLSITE: ::tracing::callsite::DefaultCallsite =
                    {
                        static META: ::tracing::Metadata<'static> =
                            {
                                ::tracing_core::metadata::Metadata::new("lower_res",
                                    "rustc_ast_lowering", ::tracing::Level::TRACE,
                                    ::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
                                    ::tracing_core::__macro_support::Option::Some(981u32),
                                    ::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
                                    ::tracing_core::field::FieldSet::new(&[{
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("res")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("res");
                                                        NAME.as_str()
                                                    }], ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                    ::tracing::metadata::Kind::SPAN)
                            };
                        ::tracing::callsite::DefaultCallsite::new(&META)
                    };
                let mut interest = ::tracing::subscriber::Interest::never();
                if ::tracing::Level::TRACE <=
                                    ::tracing::level_filters::STATIC_MAX_LEVEL &&
                                ::tracing::Level::TRACE <=
                                    ::tracing::level_filters::LevelFilter::current() &&
                            { interest = __CALLSITE.interest(); !interest.is_never() }
                        &&
                        ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                            interest) {
                    let meta = __CALLSITE.metadata();
                    ::tracing::Span::new(meta,
                        &{
                                #[allow(unused_imports)]
                                use ::tracing::field::{debug, display, Value};
                                meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&res)
                                                            as &dyn ::tracing::field::Value))])
                            })
                } else {
                    let span =
                        ::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
                    {};
                    span
                }
            };
        __tracing_attr_guard = __tracing_attr_span.enter();
    }

    #[warn(clippy :: suspicious_else_formatting)]
    {

        #[allow(unknown_lints, unreachable_code, clippy ::
        diverging_sub_expression, clippy :: empty_loop, clippy ::
        let_unit_value, clippy :: let_with_type_underscore, clippy ::
        needless_return, clippy :: unreachable)]
        if false {
            let __tracing_attr_fake_return: Res = loop {};
            return __tracing_attr_fake_return;
        }
        {
            let res: Result<Res, ()> =
                res.apply_id(|id|
                        {
                            let owner = self.current_hir_id_owner;
                            let local_id =
                                self.ident_and_label_to_local_id.get(&id).copied().ok_or(())?;
                            Ok(HirId { owner, local_id })
                        });
            {
                use ::tracing::__macro_support::Callsite as _;
                static __CALLSITE: ::tracing::callsite::DefaultCallsite =
                    {
                        static META: ::tracing::Metadata<'static> =
                            {
                                ::tracing_core::metadata::Metadata::new("event compiler/rustc_ast_lowering/src/lib.rs:988",
                                    "rustc_ast_lowering", ::tracing::Level::TRACE,
                                    ::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
                                    ::tracing_core::__macro_support::Option::Some(988u32),
                                    ::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
                                    ::tracing_core::field::FieldSet::new(&[{
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("res")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("res");
                                                        NAME.as_str()
                                                    }], ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                    ::tracing::metadata::Kind::EVENT)
                            };
                        ::tracing::callsite::DefaultCallsite::new(&META)
                    };
                let enabled =
                    ::tracing::Level::TRACE <=
                                ::tracing::level_filters::STATIC_MAX_LEVEL &&
                            ::tracing::Level::TRACE <=
                                ::tracing::level_filters::LevelFilter::current() &&
                        {
                            let interest = __CALLSITE.interest();
                            !interest.is_never() &&
                                ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                                    interest)
                        };
                if enabled {
                    (|value_set: ::tracing::field::ValueSet|
                                {
                                    let meta = __CALLSITE.metadata();
                                    ::tracing::Event::dispatch(meta, &value_set);
                                    ;
                                })({
                            #[allow(unused_imports)]
                            use ::tracing::field::{debug, display, Value};
                            __CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&res)
                                                        as &dyn ::tracing::field::Value))])
                        });
                } else { ; }
            };
            res.unwrap_or(Res::Err)
        }
    }
}#[instrument(level = "trace", skip(self))]
982    fn lower_res(&mut self, res: Res<NodeId>) -> Res {
983        let res: Result<Res, ()> = res.apply_id(|id| {
984            let owner = self.current_hir_id_owner;
985            let local_id = self.ident_and_label_to_local_id.get(&id).copied().ok_or(())?;
986            Ok(HirId { owner, local_id })
987        });
988        trace!(?res);
989
990        // We may fail to find a HirId when the Res points to a Local from an enclosing HIR owner.
991        // This can happen when trying to lower the return type `x` in erroneous code like
992        //   async fn foo(x: u8) -> x {}
993        // In that case, `x` is lowered as a function parameter, and the return type is lowered as
994        // an opaque type as a synthesized HIR owner.
995        res.unwrap_or(Res::Err)
996    }
997
998    fn expect_full_res(&mut self, id: NodeId) -> Res<NodeId> {
999        self.get_partial_res(id).map_or(Res::Err, |pr| pr.expect_full_res())
1000    }
1001
1002    fn lower_import_res(&mut self, id: NodeId, span: Span) -> PerNS<Option<Res>> {
1003        if true {
    {
        match (&id, &self.owner.id) {
            (left_val, right_val) => {
                if !(*left_val == *right_val) {
                    let kind = ::core::panicking::AssertKind::Eq;
                    ::core::panicking::assert_failed(kind, &*left_val,
                        &*right_val, ::core::option::Option::None);
                }
            }
        }
    };
};debug_assert_eq!(id, self.owner.id);
1004        let per_ns = self.owner.import_res.map(|res| res.map(|res| self.lower_res(res)));
1005        if per_ns.is_empty() {
1006            // Propagate the error to all namespaces, just to be sure.
1007            self.dcx().span_delayed_bug(span, "no resolution for an import");
1008            let err = Some(Res::Err);
1009            return PerNS { type_ns: err, value_ns: err, macro_ns: err };
1010        }
1011        per_ns
1012    }
1013
1014    fn make_lang_item_qpath(
1015        &mut self,
1016        lang_item: LangItem,
1017        span: Span,
1018        args: Option<&'hir hir::GenericArgs<'hir>>,
1019    ) -> hir::QPath<'hir> {
1020        hir::QPath::Resolved(None, self.make_lang_item_path(lang_item, span, args))
1021    }
1022
1023    fn make_lang_item_path(
1024        &mut self,
1025        lang_item: LangItem,
1026        span: Span,
1027        args: Option<&'hir hir::GenericArgs<'hir>>,
1028    ) -> &'hir hir::Path<'hir> {
1029        let def_id = self.tcx.require_lang_item(lang_item, span);
1030        let def_kind = self.tcx.def_kind(def_id);
1031        let res = Res::Def(def_kind, def_id);
1032        self.arena.alloc(hir::Path {
1033            span,
1034            res,
1035            segments: self.arena.alloc_from_iter([hir::PathSegment {
1036                ident: Ident::new(lang_item.name(), span),
1037                hir_id: self.next_id(),
1038                res,
1039                args,
1040                infer_args: args.is_none(),
1041                delegation_child_segment: false,
1042            }]),
1043        })
1044    }
1045
1046    /// Reuses the span but adds information like the kind of the desugaring and features that are
1047    /// allowed inside this span.
1048    fn mark_span_with_reason(
1049        &self,
1050        reason: DesugaringKind,
1051        span: Span,
1052        allow_internal_unstable: Option<Arc<[Symbol]>>,
1053    ) -> Span {
1054        self.tcx.with_stable_hashing_context(|hcx| {
1055            span.mark_with_reason(allow_internal_unstable, reason, span.edition(), hcx)
1056        })
1057    }
1058
1059    fn span_lowerer(&self) -> SpanLowerer {
1060        SpanLowerer {
1061            is_incremental: self.tcx.sess.opts.incremental.is_some(),
1062            def_id: self.current_hir_id_owner.def_id,
1063        }
1064    }
1065
1066    /// Intercept all spans entering HIR.
1067    /// Mark a span as relative to the current owning item.
1068    fn lower_span(&self, span: Span) -> Span {
1069        self.span_lowerer().lower(span)
1070    }
1071
1072    fn lower_ident(&self, ident: Ident) -> Ident {
1073        Ident::new(ident.name, self.lower_span(ident.span))
1074    }
1075
1076    /// Converts a lifetime into a new generic parameter.
1077    #[allow(clippy :: suspicious_else_formatting)]
{
    let __tracing_attr_span;
    let __tracing_attr_guard;
    if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::DEBUG <=
                    ::tracing::level_filters::LevelFilter::current() ||
            { false } {
        __tracing_attr_span =
            {
                use ::tracing::__macro_support::Callsite as _;
                static __CALLSITE: ::tracing::callsite::DefaultCallsite =
                    {
                        static META: ::tracing::Metadata<'static> =
                            {
                                ::tracing_core::metadata::Metadata::new("lifetime_res_to_generic_param",
                                    "rustc_ast_lowering", ::tracing::Level::DEBUG,
                                    ::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
                                    ::tracing_core::__macro_support::Option::Some(1077u32),
                                    ::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
                                    ::tracing_core::field::FieldSet::new(&[{
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("ident")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("ident");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("node_id")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("node_id");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("kind")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("kind");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("source")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("source");
                                                        NAME.as_str()
                                                    }], ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                    ::tracing::metadata::Kind::SPAN)
                            };
                        ::tracing::callsite::DefaultCallsite::new(&META)
                    };
                let mut interest = ::tracing::subscriber::Interest::never();
                if ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::STATIC_MAX_LEVEL &&
                                ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::LevelFilter::current() &&
                            { interest = __CALLSITE.interest(); !interest.is_never() }
                        &&
                        ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                            interest) {
                    let meta = __CALLSITE.metadata();
                    ::tracing::Span::new(meta,
                        &{
                                #[allow(unused_imports)]
                                use ::tracing::field::{debug, display, Value};
                                meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&ident)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&node_id)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&kind)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&source)
                                                            as &dyn ::tracing::field::Value))])
                            })
                } else {
                    let span =
                        ::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
                    {};
                    span
                }
            };
        __tracing_attr_guard = __tracing_attr_span.enter();
    }

    #[warn(clippy :: suspicious_else_formatting)]
    {

        #[allow(unknown_lints, unreachable_code, clippy ::
        diverging_sub_expression, clippy :: empty_loop, clippy ::
        let_unit_value, clippy :: let_with_type_underscore, clippy ::
        needless_return, clippy :: unreachable)]
        if false {
            let __tracing_attr_fake_return: hir::GenericParam<'hir> = loop {};
            return __tracing_attr_fake_return;
        }
        {
            let _def_id =
                self.create_def(node_id, Some(kw::UnderscoreLifetime),
                    DefKind::LifetimeParam, ident.span);
            {
                use ::tracing::__macro_support::Callsite as _;
                static __CALLSITE: ::tracing::callsite::DefaultCallsite =
                    {
                        static META: ::tracing::Metadata<'static> =
                            {
                                ::tracing_core::metadata::Metadata::new("event compiler/rustc_ast_lowering/src/lib.rs:1092",
                                    "rustc_ast_lowering", ::tracing::Level::DEBUG,
                                    ::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
                                    ::tracing_core::__macro_support::Option::Some(1092u32),
                                    ::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
                                    ::tracing_core::field::FieldSet::new(&[{
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("_def_id")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("_def_id");
                                                        NAME.as_str()
                                                    }], ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                    ::tracing::metadata::Kind::EVENT)
                            };
                        ::tracing::callsite::DefaultCallsite::new(&META)
                    };
                let enabled =
                    ::tracing::Level::DEBUG <=
                                ::tracing::level_filters::STATIC_MAX_LEVEL &&
                            ::tracing::Level::DEBUG <=
                                ::tracing::level_filters::LevelFilter::current() &&
                        {
                            let interest = __CALLSITE.interest();
                            !interest.is_never() &&
                                ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                                    interest)
                        };
                if enabled {
                    (|value_set: ::tracing::field::ValueSet|
                                {
                                    let meta = __CALLSITE.metadata();
                                    ::tracing::Event::dispatch(meta, &value_set);
                                    ;
                                })({
                            #[allow(unused_imports)]
                            use ::tracing::field::{debug, display, Value};
                            __CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&_def_id)
                                                        as &dyn ::tracing::field::Value))])
                        });
                } else { ; }
            };
            let hir_id = self.lower_node_id(node_id);
            let def_id = self.local_def_id(node_id);
            hir::GenericParam {
                hir_id,
                def_id,
                name: hir::ParamName::Fresh,
                span: self.lower_span(ident.span),
                pure_wrt_drop: false,
                kind: hir::GenericParamKind::Lifetime {
                    kind: hir::LifetimeParamKind::Elided(kind),
                },
                colon_span: None,
                source,
            }
        }
    }
}#[instrument(level = "debug", skip(self))]
1078    fn lifetime_res_to_generic_param(
1079        &mut self,
1080        ident: Ident,
1081        node_id: NodeId,
1082        kind: MissingLifetimeKind,
1083        source: hir::GenericParamSource,
1084    ) -> hir::GenericParam<'hir> {
1085        // Late resolution delegates to us the creation of the `LocalDefId`.
1086        let _def_id = self.create_def(
1087            node_id,
1088            Some(kw::UnderscoreLifetime),
1089            DefKind::LifetimeParam,
1090            ident.span,
1091        );
1092        debug!(?_def_id);
1093
1094        let hir_id = self.lower_node_id(node_id);
1095        let def_id = self.local_def_id(node_id);
1096        hir::GenericParam {
1097            hir_id,
1098            def_id,
1099            name: hir::ParamName::Fresh,
1100            span: self.lower_span(ident.span),
1101            pure_wrt_drop: false,
1102            kind: hir::GenericParamKind::Lifetime { kind: hir::LifetimeParamKind::Elided(kind) },
1103            colon_span: None,
1104            source,
1105        }
1106    }
1107
1108    /// Lowers a lifetime binder that defines `generic_params`, returning the corresponding HIR
1109    /// nodes. The returned list includes any "extra" lifetime parameters that were added by the
1110    /// name resolver owing to lifetime elision; this also populates the resolver's node-id->def-id
1111    /// map, so that later calls to `opt_node_id_to_def_id` that refer to these extra lifetime
1112    /// parameters will be successful.
1113    x;#[instrument(level = "debug", skip(self), ret)]
1114    #[inline]
1115    fn lower_lifetime_binder(
1116        &mut self,
1117        binder: NodeId,
1118        generic_params: &[GenericParam],
1119    ) -> &'hir [hir::GenericParam<'hir>] {
1120        // Start by creating params for extra lifetimes params, as this creates the definitions
1121        // that may be referred to by the AST inside `generic_params`.
1122        let extra_lifetimes = self.owner.extra_lifetime_params(binder);
1123        debug!(?extra_lifetimes);
1124        let extra_lifetimes: Vec<_> = extra_lifetimes
1125            .iter()
1126            .map(|&(ident, node_id, res)| {
1127                self.lifetime_res_to_generic_param(
1128                    ident,
1129                    node_id,
1130                    res,
1131                    hir::GenericParamSource::Binder,
1132                )
1133            })
1134            .collect();
1135        let arena = self.arena;
1136        let explicit_generic_params =
1137            self.lower_generic_params_mut(generic_params, hir::GenericParamSource::Binder);
1138        arena.alloc_from_iter(explicit_generic_params.chain(extra_lifetimes.into_iter()))
1139    }
1140
1141    fn with_dyn_type_scope<T>(&mut self, in_scope: bool, f: impl FnOnce(&mut Self) -> T) -> T {
1142        let was_in_dyn_type = self.is_in_dyn_type;
1143        self.is_in_dyn_type = in_scope;
1144
1145        let result = f(self);
1146
1147        self.is_in_dyn_type = was_in_dyn_type;
1148
1149        result
1150    }
1151
1152    fn with_new_scopes<T>(&mut self, scope_span: Span, f: impl FnOnce(&mut Self) -> T) -> T {
1153        let current_item = self.current_item;
1154        self.current_item = Some(scope_span);
1155
1156        let was_in_loop_condition = self.is_in_loop_condition;
1157        self.is_in_loop_condition = false;
1158
1159        let old_contract = self.contract_ensures.take();
1160
1161        let try_block_scope = mem::replace(&mut self.try_block_scope, TryBlockScope::Function);
1162        let loop_scope = self.loop_scope.take();
1163        let ret = f(self);
1164        self.try_block_scope = try_block_scope;
1165        self.loop_scope = loop_scope;
1166
1167        self.contract_ensures = old_contract;
1168
1169        self.is_in_loop_condition = was_in_loop_condition;
1170
1171        self.current_item = current_item;
1172
1173        ret
1174    }
1175
1176    fn lower_attrs(
1177        &mut self,
1178        id: HirId,
1179        attrs: &[Attribute],
1180        target_span: Span,
1181        target: Target,
1182    ) -> &'hir [hir::Attribute] {
1183        self.lower_attrs_with_extra(id, attrs, target_span, target, &[])
1184    }
1185
1186    fn lower_attrs_with_extra(
1187        &mut self,
1188        id: HirId,
1189        attrs: &[Attribute],
1190        target_span: Span,
1191        target: Target,
1192        extra_hir_attributes: &[hir::Attribute],
1193    ) -> &'hir [hir::Attribute] {
1194        if attrs.is_empty() && extra_hir_attributes.is_empty() {
1195            &[]
1196        } else {
1197            let mut lowered_attrs =
1198                self.lower_attrs_vec(attrs, self.lower_span(target_span), id, target);
1199            lowered_attrs.extend(extra_hir_attributes.iter().cloned());
1200
1201            {
    match (&id.owner, &self.current_hir_id_owner) {
        (left_val, right_val) => {
            if !(*left_val == *right_val) {
                let kind = ::core::panicking::AssertKind::Eq;
                ::core::panicking::assert_failed(kind, &*left_val,
                    &*right_val, ::core::option::Option::None);
            }
        }
    }
};assert_eq!(id.owner, self.current_hir_id_owner);
1202            let ret = self.arena.alloc_from_iter(lowered_attrs);
1203
1204            // this is possible if an item contained syntactical attribute,
1205            // but none of them parse successfully or all of them were ignored
1206            // for not being built-in attributes at all. They could be remaining
1207            // unexpanded attributes used as markers in proc-macro derives for example.
1208            // This will have emitted some diagnostics for the misparse, but will then
1209            // not emit the attribute making the list empty.
1210            if ret.is_empty() {
1211                &[]
1212            } else {
1213                self.attrs.insert(id.local_id, ret);
1214                ret
1215            }
1216        }
1217    }
1218
1219    fn lower_attrs_vec(
1220        &mut self,
1221        attrs: &[Attribute],
1222        target_span: Span,
1223        target_hir_id: HirId,
1224        target: Target,
1225    ) -> Vec<hir::Attribute> {
1226        let l = self.span_lowerer();
1227        self.attribute_parser.parse_attribute_list(
1228            attrs,
1229            target_span,
1230            target,
1231            OmitDoc::Lower,
1232            |s| l.lower(s),
1233            |lint_id, span, kind| {
1234                self.delayed_lints.push(DelayedLint {
1235                    lint_id,
1236                    id: target_hir_id,
1237                    span,
1238                    callback: Box::new(move |dcx, level, sess: &dyn std::any::Any| {
1239                        let sess = sess
1240                            .downcast_ref::<rustc_session::Session>()
1241                            .expect("expected `Session`");
1242                        (kind.0)(dcx, level, sess)
1243                    }),
1244                });
1245            },
1246        )
1247    }
1248
1249    fn alias_attrs(&mut self, id: HirId, target_id: HirId) {
1250        {
    match (&id.owner, &self.current_hir_id_owner) {
        (left_val, right_val) => {
            if !(*left_val == *right_val) {
                let kind = ::core::panicking::AssertKind::Eq;
                ::core::panicking::assert_failed(kind, &*left_val,
                    &*right_val, ::core::option::Option::None);
            }
        }
    }
};assert_eq!(id.owner, self.current_hir_id_owner);
1251        {
    match (&target_id.owner, &self.current_hir_id_owner) {
        (left_val, right_val) => {
            if !(*left_val == *right_val) {
                let kind = ::core::panicking::AssertKind::Eq;
                ::core::panicking::assert_failed(kind, &*left_val,
                    &*right_val, ::core::option::Option::None);
            }
        }
    }
};assert_eq!(target_id.owner, self.current_hir_id_owner);
1252        if let Some(&a) = self.attrs.get(&target_id.local_id) {
1253            if !!a.is_empty() {
    ::core::panicking::panic("assertion failed: !a.is_empty()")
};assert!(!a.is_empty());
1254            self.attrs.insert(id.local_id, a);
1255        }
1256    }
1257
1258    fn lower_delim_args(&self, args: &DelimArgs) -> DelimArgs {
1259        args.clone()
1260    }
1261
1262    /// Lower an associated item constraint.
1263    #[allow(clippy :: suspicious_else_formatting)]
{
    let __tracing_attr_span;
    let __tracing_attr_guard;
    if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::DEBUG <=
                    ::tracing::level_filters::LevelFilter::current() ||
            { false } {
        __tracing_attr_span =
            {
                use ::tracing::__macro_support::Callsite as _;
                static __CALLSITE: ::tracing::callsite::DefaultCallsite =
                    {
                        static META: ::tracing::Metadata<'static> =
                            {
                                ::tracing_core::metadata::Metadata::new("lower_assoc_item_constraint",
                                    "rustc_ast_lowering", ::tracing::Level::DEBUG,
                                    ::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
                                    ::tracing_core::__macro_support::Option::Some(1263u32),
                                    ::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
                                    ::tracing_core::field::FieldSet::new(&[],
                                        ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                    ::tracing::metadata::Kind::SPAN)
                            };
                        ::tracing::callsite::DefaultCallsite::new(&META)
                    };
                let mut interest = ::tracing::subscriber::Interest::never();
                if ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::STATIC_MAX_LEVEL &&
                                ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::LevelFilter::current() &&
                            { interest = __CALLSITE.interest(); !interest.is_never() }
                        &&
                        ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                            interest) {
                    let meta = __CALLSITE.metadata();
                    ::tracing::Span::new(meta,
                        &{ meta.fields().value_set_all(&[]) })
                } else {
                    let span =
                        ::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
                    {};
                    span
                }
            };
        __tracing_attr_guard = __tracing_attr_span.enter();
    }

    #[warn(clippy :: suspicious_else_formatting)]
    {

        #[allow(unknown_lints, unreachable_code, clippy ::
        diverging_sub_expression, clippy :: empty_loop, clippy ::
        let_unit_value, clippy :: let_with_type_underscore, clippy ::
        needless_return, clippy :: unreachable)]
        if false {
            let __tracing_attr_fake_return: hir::AssocItemConstraint<'hir> =
                loop {};
            return __tracing_attr_fake_return;
        }
        {
            {
                use ::tracing::__macro_support::Callsite as _;
                static __CALLSITE: ::tracing::callsite::DefaultCallsite =
                    {
                        static META: ::tracing::Metadata<'static> =
                            {
                                ::tracing_core::metadata::Metadata::new("event compiler/rustc_ast_lowering/src/lib.rs:1269",
                                    "rustc_ast_lowering", ::tracing::Level::DEBUG,
                                    ::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
                                    ::tracing_core::__macro_support::Option::Some(1269u32),
                                    ::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
                                    ::tracing_core::field::FieldSet::new(&[{
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("constraint")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("constraint");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("itctx")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("itctx");
                                                        NAME.as_str()
                                                    }], ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                    ::tracing::metadata::Kind::EVENT)
                            };
                        ::tracing::callsite::DefaultCallsite::new(&META)
                    };
                let enabled =
                    ::tracing::Level::DEBUG <=
                                ::tracing::level_filters::STATIC_MAX_LEVEL &&
                            ::tracing::Level::DEBUG <=
                                ::tracing::level_filters::LevelFilter::current() &&
                        {
                            let interest = __CALLSITE.interest();
                            !interest.is_never() &&
                                ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                                    interest)
                        };
                if enabled {
                    (|value_set: ::tracing::field::ValueSet|
                                {
                                    let meta = __CALLSITE.metadata();
                                    ::tracing::Event::dispatch(meta, &value_set);
                                    ;
                                })({
                            #[allow(unused_imports)]
                            use ::tracing::field::{debug, display, Value};
                            __CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&constraint)
                                                        as &dyn ::tracing::field::Value)),
                                            (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&itctx)
                                                        as &dyn ::tracing::field::Value))])
                        });
                } else { ; }
            };
            let gen_args =
                if let Some(gen_args) = &constraint.gen_args {
                    let gen_args_ctor =
                        match gen_args {
                            GenericArgs::AngleBracketed(data) => {
                                self.lower_angle_bracketed_parameter_data(data,
                                        ParamMode::Explicit, itctx).0
                            }
                            GenericArgs::Parenthesized(data) => {
                                if let Some(first_char) =
                                            constraint.ident.as_str().chars().next() &&
                                        first_char.is_ascii_lowercase() {
                                    let err =
                                        match (&data.inputs[..], &data.output) {
                                            ([_, ..], FnRetTy::Default(_)) => {
                                                diagnostics::BadReturnTypeNotation::Inputs {
                                                    span: data.inputs_span,
                                                }
                                            }
                                            ([], FnRetTy::Default(_)) => {
                                                diagnostics::BadReturnTypeNotation::NeedsDots {
                                                    span: data.inputs_span,
                                                }
                                            }
                                            (_, FnRetTy::Ty(ty)) => {
                                                let span = data.inputs_span.shrink_to_hi().to(ty.span);
                                                diagnostics::BadReturnTypeNotation::Output {
                                                    span,
                                                    suggestion: diagnostics::RTNSuggestion {
                                                        output: span,
                                                        input: data.inputs_span,
                                                    },
                                                }
                                            }
                                        };
                                    let mut err = self.dcx().create_err(err);
                                    if !self.tcx.features().return_type_notation() &&
                                            self.tcx.sess.is_nightly_build() {
                                        add_feature_diagnostics(&mut err, &self.tcx.sess,
                                            sym::return_type_notation);
                                    }
                                    err.emit();
                                    GenericArgsCtor {
                                        args: Default::default(),
                                        constraints: &[],
                                        parenthesized: hir::GenericArgsParentheses::ReturnTypeNotation,
                                        span: data.span,
                                    }
                                } else {
                                    self.emit_bad_parenthesized_trait_in_assoc_ty(data);
                                    self.lower_angle_bracketed_parameter_data(&data.as_angle_bracketed_args(),
                                            ParamMode::Explicit, itctx).0
                                }
                            }
                            GenericArgs::ParenthesizedElided(span) =>
                                GenericArgsCtor {
                                    args: Default::default(),
                                    constraints: &[],
                                    parenthesized: hir::GenericArgsParentheses::ReturnTypeNotation,
                                    span: *span,
                                },
                        };
                    gen_args_ctor.into_generic_args(self)
                } else { hir::GenericArgs::NONE };
            let kind =
                match &constraint.kind {
                    AssocItemConstraintKind::Equality { term } => {
                        let term =
                            match term {
                                Term::Ty(ty) => self.lower_ty_alloc(ty, itctx).into(),
                                Term::Const(c) =>
                                    self.lower_anon_const_to_const_arg_and_alloc(c).into(),
                            };
                        hir::AssocItemConstraintKind::Equality { term }
                    }
                    AssocItemConstraintKind::Bound { bounds } => {
                        if self.is_in_dyn_type {
                            let suggestion =
                                match itctx {
                                    ImplTraitContext::OpaqueTy { .. } |
                                        ImplTraitContext::Universal => {
                                        let bound_end_span =
                                            constraint.gen_args.as_ref().map_or(constraint.ident.span,
                                                |args| args.span());
                                        if bound_end_span.eq_ctxt(constraint.span) {
                                            Some(self.tcx.sess.source_map().next_point(bound_end_span))
                                        } else { None }
                                    }
                                    _ => None,
                                };
                            let guar =
                                self.dcx().emit_err(diagnostics::MisplacedAssocTyBinding {
                                        span: constraint.span,
                                        suggestion,
                                    });
                            let err_ty =
                                &*self.arena.alloc(self.ty(constraint.span,
                                                hir::TyKind::Err(guar)));
                            hir::AssocItemConstraintKind::Equality {
                                term: err_ty.into(),
                            }
                        } else {
                            let bounds =
                                self.lower_param_bounds(bounds,
                                    RelaxedBoundPolicy::Forbidden(RelaxedBoundForbiddenReason::AssocTyBounds),
                                    itctx);
                            hir::AssocItemConstraintKind::Bound { bounds }
                        }
                    }
                };
            hir::AssocItemConstraint {
                hir_id: self.lower_node_id(constraint.id),
                ident: self.lower_ident(constraint.ident),
                gen_args,
                kind,
                span: self.lower_span(constraint.span),
            }
        }
    }
}#[instrument(level = "debug", skip_all)]
1264    fn lower_assoc_item_constraint(
1265        &mut self,
1266        constraint: &AssocItemConstraint,
1267        itctx: ImplTraitContext,
1268    ) -> hir::AssocItemConstraint<'hir> {
1269        debug!(?constraint, ?itctx);
1270        // Lower the generic arguments for the associated item.
1271        let gen_args = if let Some(gen_args) = &constraint.gen_args {
1272            let gen_args_ctor = match gen_args {
1273                GenericArgs::AngleBracketed(data) => {
1274                    self.lower_angle_bracketed_parameter_data(data, ParamMode::Explicit, itctx).0
1275                }
1276                GenericArgs::Parenthesized(data) => {
1277                    if let Some(first_char) = constraint.ident.as_str().chars().next()
1278                        && first_char.is_ascii_lowercase()
1279                    {
1280                        let err = match (&data.inputs[..], &data.output) {
1281                            ([_, ..], FnRetTy::Default(_)) => {
1282                                diagnostics::BadReturnTypeNotation::Inputs {
1283                                    span: data.inputs_span,
1284                                }
1285                            }
1286                            ([], FnRetTy::Default(_)) => {
1287                                diagnostics::BadReturnTypeNotation::NeedsDots {
1288                                    span: data.inputs_span,
1289                                }
1290                            }
1291                            // The case `T: Trait<method(..) -> Ret>` is handled in the parser.
1292                            (_, FnRetTy::Ty(ty)) => {
1293                                let span = data.inputs_span.shrink_to_hi().to(ty.span);
1294                                diagnostics::BadReturnTypeNotation::Output {
1295                                    span,
1296                                    suggestion: diagnostics::RTNSuggestion {
1297                                        output: span,
1298                                        input: data.inputs_span,
1299                                    },
1300                                }
1301                            }
1302                        };
1303                        let mut err = self.dcx().create_err(err);
1304                        if !self.tcx.features().return_type_notation()
1305                            && self.tcx.sess.is_nightly_build()
1306                        {
1307                            add_feature_diagnostics(
1308                                &mut err,
1309                                &self.tcx.sess,
1310                                sym::return_type_notation,
1311                            );
1312                        }
1313                        err.emit();
1314                        GenericArgsCtor {
1315                            args: Default::default(),
1316                            constraints: &[],
1317                            parenthesized: hir::GenericArgsParentheses::ReturnTypeNotation,
1318                            span: data.span,
1319                        }
1320                    } else {
1321                        self.emit_bad_parenthesized_trait_in_assoc_ty(data);
1322                        self.lower_angle_bracketed_parameter_data(
1323                            &data.as_angle_bracketed_args(),
1324                            ParamMode::Explicit,
1325                            itctx,
1326                        )
1327                        .0
1328                    }
1329                }
1330                GenericArgs::ParenthesizedElided(span) => GenericArgsCtor {
1331                    args: Default::default(),
1332                    constraints: &[],
1333                    parenthesized: hir::GenericArgsParentheses::ReturnTypeNotation,
1334                    span: *span,
1335                },
1336            };
1337            gen_args_ctor.into_generic_args(self)
1338        } else {
1339            hir::GenericArgs::NONE
1340        };
1341        let kind = match &constraint.kind {
1342            AssocItemConstraintKind::Equality { term } => {
1343                let term = match term {
1344                    Term::Ty(ty) => self.lower_ty_alloc(ty, itctx).into(),
1345                    Term::Const(c) => self.lower_anon_const_to_const_arg_and_alloc(c).into(),
1346                };
1347                hir::AssocItemConstraintKind::Equality { term }
1348            }
1349            AssocItemConstraintKind::Bound { bounds } => {
1350                // Disallow ATB in dyn types
1351                if self.is_in_dyn_type {
1352                    let suggestion = match itctx {
1353                        ImplTraitContext::OpaqueTy { .. } | ImplTraitContext::Universal => {
1354                            let bound_end_span = constraint
1355                                .gen_args
1356                                .as_ref()
1357                                .map_or(constraint.ident.span, |args| args.span());
1358                            if bound_end_span.eq_ctxt(constraint.span) {
1359                                Some(self.tcx.sess.source_map().next_point(bound_end_span))
1360                            } else {
1361                                None
1362                            }
1363                        }
1364                        _ => None,
1365                    };
1366
1367                    let guar = self.dcx().emit_err(diagnostics::MisplacedAssocTyBinding {
1368                        span: constraint.span,
1369                        suggestion,
1370                    });
1371                    let err_ty =
1372                        &*self.arena.alloc(self.ty(constraint.span, hir::TyKind::Err(guar)));
1373                    hir::AssocItemConstraintKind::Equality { term: err_ty.into() }
1374                } else {
1375                    let bounds = self.lower_param_bounds(
1376                        bounds,
1377                        RelaxedBoundPolicy::Forbidden(RelaxedBoundForbiddenReason::AssocTyBounds),
1378                        itctx,
1379                    );
1380                    hir::AssocItemConstraintKind::Bound { bounds }
1381                }
1382            }
1383        };
1384
1385        hir::AssocItemConstraint {
1386            hir_id: self.lower_node_id(constraint.id),
1387            ident: self.lower_ident(constraint.ident),
1388            gen_args,
1389            kind,
1390            span: self.lower_span(constraint.span),
1391        }
1392    }
1393
1394    fn emit_bad_parenthesized_trait_in_assoc_ty(&self, data: &ParenthesizedArgs) {
1395        // Suggest removing empty parentheses: "Trait()" -> "Trait"
1396        let sub = if data.inputs.is_empty() {
1397            let parentheses_span =
1398                data.inputs_span.shrink_to_lo().to(data.inputs_span.shrink_to_hi());
1399            AssocTyParenthesesSub::Empty { parentheses_span }
1400        }
1401        // Suggest replacing parentheses with angle brackets `Trait(params...)` to `Trait<params...>`
1402        else {
1403            // Start of parameters to the 1st argument
1404            let open_param = data.inputs_span.shrink_to_lo().to(data
1405                .inputs
1406                .first()
1407                .unwrap()
1408                .span
1409                .shrink_to_lo());
1410            // End of last argument to end of parameters
1411            let close_param =
1412                data.inputs.last().unwrap().span.shrink_to_hi().to(data.inputs_span.shrink_to_hi());
1413            AssocTyParenthesesSub::NotEmpty { open_param, close_param }
1414        };
1415        self.dcx().emit_err(AssocTyParentheses { span: data.span, sub });
1416    }
1417
1418    #[allow(clippy :: suspicious_else_formatting)]
{
    let __tracing_attr_span;
    let __tracing_attr_guard;
    if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::DEBUG <=
                    ::tracing::level_filters::LevelFilter::current() ||
            { false } {
        __tracing_attr_span =
            {
                use ::tracing::__macro_support::Callsite as _;
                static __CALLSITE: ::tracing::callsite::DefaultCallsite =
                    {
                        static META: ::tracing::Metadata<'static> =
                            {
                                ::tracing_core::metadata::Metadata::new("lower_generic_arg",
                                    "rustc_ast_lowering", ::tracing::Level::DEBUG,
                                    ::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
                                    ::tracing_core::__macro_support::Option::Some(1418u32),
                                    ::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
                                    ::tracing_core::field::FieldSet::new(&[{
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("arg")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("arg");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("itctx")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("itctx");
                                                        NAME.as_str()
                                                    }], ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                    ::tracing::metadata::Kind::SPAN)
                            };
                        ::tracing::callsite::DefaultCallsite::new(&META)
                    };
                let mut interest = ::tracing::subscriber::Interest::never();
                if ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::STATIC_MAX_LEVEL &&
                                ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::LevelFilter::current() &&
                            { interest = __CALLSITE.interest(); !interest.is_never() }
                        &&
                        ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                            interest) {
                    let meta = __CALLSITE.metadata();
                    ::tracing::Span::new(meta,
                        &{
                                #[allow(unused_imports)]
                                use ::tracing::field::{debug, display, Value};
                                meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&arg)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&itctx)
                                                            as &dyn ::tracing::field::Value))])
                            })
                } else {
                    let span =
                        ::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
                    {};
                    span
                }
            };
        __tracing_attr_guard = __tracing_attr_span.enter();
    }

    #[warn(clippy :: suspicious_else_formatting)]
    {

        #[allow(unknown_lints, unreachable_code, clippy ::
        diverging_sub_expression, clippy :: empty_loop, clippy ::
        let_unit_value, clippy :: let_with_type_underscore, clippy ::
        needless_return, clippy :: unreachable)]
        if false {
            let __tracing_attr_fake_return: hir::GenericArg<'hir> = loop {};
            return __tracing_attr_fake_return;
        }
        {
            match arg {
                ast::GenericArg::Lifetime(lt) =>
                    GenericArg::Lifetime(self.lower_lifetime(lt,
                            LifetimeSource::Path {
                                angle_brackets: hir::AngleBrackets::Full,
                            }, lt.ident.into())),
                ast::GenericArg::Type(ty) => {
                    if ty.is_maybe_parenthesised_infer() {
                        return GenericArg::Infer(hir::InferArg {
                                    hir_id: self.lower_node_id(ty.id),
                                    span: self.lower_span(ty.span),
                                });
                    }
                    match &ty.kind {
                        TyKind::Path(None, path) => {
                            if let Some(res) =
                                    self.get_partial_res(ty.id).and_then(|partial_res|
                                            partial_res.full_res()) {
                                if !res.matches_ns(Namespace::TypeNS) &&
                                        path.is_potential_trivial_const_arg() {
                                    {
                                        use ::tracing::__macro_support::Callsite as _;
                                        static __CALLSITE: ::tracing::callsite::DefaultCallsite =
                                            {
                                                static META: ::tracing::Metadata<'static> =
                                                    {
                                                        ::tracing_core::metadata::Metadata::new("event compiler/rustc_ast_lowering/src/lib.rs:1455",
                                                            "rustc_ast_lowering", ::tracing::Level::DEBUG,
                                                            ::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
                                                            ::tracing_core::__macro_support::Option::Some(1455u32),
                                                            ::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
                                                            ::tracing_core::field::FieldSet::new(&["message"],
                                                                ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                                            ::tracing::metadata::Kind::EVENT)
                                                    };
                                                ::tracing::callsite::DefaultCallsite::new(&META)
                                            };
                                        let enabled =
                                            ::tracing::Level::DEBUG <=
                                                        ::tracing::level_filters::STATIC_MAX_LEVEL &&
                                                    ::tracing::Level::DEBUG <=
                                                        ::tracing::level_filters::LevelFilter::current() &&
                                                {
                                                    let interest = __CALLSITE.interest();
                                                    !interest.is_never() &&
                                                        ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                                                            interest)
                                                };
                                        if enabled {
                                            (|value_set: ::tracing::field::ValueSet|
                                                        {
                                                            let meta = __CALLSITE.metadata();
                                                            ::tracing::Event::dispatch(meta, &value_set);
                                                            ;
                                                        })({
                                                    #[allow(unused_imports)]
                                                    use ::tracing::field::{debug, display, Value};
                                                    __CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("lower_generic_arg: Lowering type argument as const argument: {0:?}",
                                                                                        ty) as &dyn ::tracing::field::Value))])
                                                });
                                        } else { ; }
                                    };
                                    let ct =
                                        self.lower_const_path_to_const_arg(path, res, ty.id,
                                            ty.span);
                                    return GenericArg::Const(ct.try_as_ambig_ct().unwrap());
                                }
                            }
                        }
                        TyKind::DirectConstArg(expr) if
                            self.tcx.features().min_generic_const_args() => {
                            let ct =
                                match self.can_lower_expr_to_const_arg_direct(expr,
                                        DirectConstArgContext::MacrolessMinGenericConstArgs) {
                                    Ok(()) => self.lower_expr_to_const_arg_direct(expr, None),
                                    Err(e) => e.emit(self),
                                };
                            let ct = self.arena.alloc(ct);
                            return match ct.try_as_ambig_ct() {
                                    Some(ct) => GenericArg::Const(ct),
                                    None =>
                                        GenericArg::Infer(hir::InferArg {
                                                hir_id: ct.hir_id,
                                                span: ct.span,
                                            }),
                                };
                        }
                        _ => {}
                    }
                    GenericArg::Type(self.lower_ty_alloc(ty,
                                    itctx).try_as_ambig_ty().unwrap())
                }
                ast::GenericArg::Const(ct) => {
                    let ct = self.lower_anon_const_to_const_arg_and_alloc(ct);
                    match ct.try_as_ambig_ct() {
                        Some(ct) => GenericArg::Const(ct),
                        None =>
                            GenericArg::Infer(hir::InferArg {
                                    hir_id: ct.hir_id,
                                    span: ct.span,
                                }),
                    }
                }
            }
        }
    }
}#[instrument(level = "debug", skip(self))]
1419    fn lower_generic_arg(
1420        &mut self,
1421        arg: &ast::GenericArg,
1422        itctx: ImplTraitContext,
1423    ) -> hir::GenericArg<'hir> {
1424        match arg {
1425            ast::GenericArg::Lifetime(lt) => GenericArg::Lifetime(self.lower_lifetime(
1426                lt,
1427                LifetimeSource::Path { angle_brackets: hir::AngleBrackets::Full },
1428                lt.ident.into(),
1429            )),
1430            ast::GenericArg::Type(ty) => {
1431                // We cannot just match on `TyKind::Infer` as `(_)` is represented as
1432                // `TyKind::Paren(TyKind::Infer)` and should also be lowered to `GenericArg::Infer`
1433                if ty.is_maybe_parenthesised_infer() {
1434                    return GenericArg::Infer(hir::InferArg {
1435                        hir_id: self.lower_node_id(ty.id),
1436                        span: self.lower_span(ty.span),
1437                    });
1438                }
1439
1440                match &ty.kind {
1441                    // We parse const arguments as path types as we cannot distinguish them during
1442                    // parsing. We try to resolve that ambiguity by attempting resolution in both the
1443                    // type and value namespaces. If we resolved the path in the value namespace, we
1444                    // transform it into a generic const argument.
1445                    //
1446                    // FIXME: Should we be handling `(PATH_TO_CONST)`?
1447                    TyKind::Path(None, path) => {
1448                        if let Some(res) = self
1449                            .get_partial_res(ty.id)
1450                            .and_then(|partial_res| partial_res.full_res())
1451                        {
1452                            if !res.matches_ns(Namespace::TypeNS)
1453                                && path.is_potential_trivial_const_arg()
1454                            {
1455                                debug!(
1456                                    "lower_generic_arg: Lowering type argument as const argument: {:?}",
1457                                    ty,
1458                                );
1459
1460                                let ct =
1461                                    self.lower_const_path_to_const_arg(path, res, ty.id, ty.span);
1462                                return GenericArg::Const(ct.try_as_ambig_ct().unwrap());
1463                            }
1464                        }
1465                    }
1466                    TyKind::DirectConstArg(expr)
1467                        if self.tcx.features().min_generic_const_args() =>
1468                    {
1469                        let ct = match self.can_lower_expr_to_const_arg_direct(
1470                            expr,
1471                            DirectConstArgContext::MacrolessMinGenericConstArgs,
1472                        ) {
1473                            Ok(()) => self.lower_expr_to_const_arg_direct(expr, None),
1474                            Err(e) => e.emit(self),
1475                        };
1476                        let ct = self.arena.alloc(ct);
1477                        // note: this allows direct_const_arg!(_) to be inferred to a type. a little
1478                        // wonky.
1479                        return match ct.try_as_ambig_ct() {
1480                            Some(ct) => GenericArg::Const(ct),
1481                            None => GenericArg::Infer(hir::InferArg {
1482                                hir_id: ct.hir_id,
1483                                span: ct.span,
1484                            }),
1485                        };
1486                    }
1487                    _ => {}
1488                }
1489                GenericArg::Type(self.lower_ty_alloc(ty, itctx).try_as_ambig_ty().unwrap())
1490            }
1491            ast::GenericArg::Const(ct) => {
1492                let ct = self.lower_anon_const_to_const_arg_and_alloc(ct);
1493                match ct.try_as_ambig_ct() {
1494                    Some(ct) => GenericArg::Const(ct),
1495                    None => GenericArg::Infer(hir::InferArg { hir_id: ct.hir_id, span: ct.span }),
1496                }
1497            }
1498        }
1499    }
1500
1501    #[allow(clippy :: suspicious_else_formatting)]
{
    let __tracing_attr_span;
    let __tracing_attr_guard;
    if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::DEBUG <=
                    ::tracing::level_filters::LevelFilter::current() ||
            { false } {
        __tracing_attr_span =
            {
                use ::tracing::__macro_support::Callsite as _;
                static __CALLSITE: ::tracing::callsite::DefaultCallsite =
                    {
                        static META: ::tracing::Metadata<'static> =
                            {
                                ::tracing_core::metadata::Metadata::new("lower_ty_alloc",
                                    "rustc_ast_lowering", ::tracing::Level::DEBUG,
                                    ::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
                                    ::tracing_core::__macro_support::Option::Some(1501u32),
                                    ::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
                                    ::tracing_core::field::FieldSet::new(&[{
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("t")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("t");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("itctx")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("itctx");
                                                        NAME.as_str()
                                                    }], ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                    ::tracing::metadata::Kind::SPAN)
                            };
                        ::tracing::callsite::DefaultCallsite::new(&META)
                    };
                let mut interest = ::tracing::subscriber::Interest::never();
                if ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::STATIC_MAX_LEVEL &&
                                ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::LevelFilter::current() &&
                            { interest = __CALLSITE.interest(); !interest.is_never() }
                        &&
                        ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                            interest) {
                    let meta = __CALLSITE.metadata();
                    ::tracing::Span::new(meta,
                        &{
                                #[allow(unused_imports)]
                                use ::tracing::field::{debug, display, Value};
                                meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&t)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&itctx)
                                                            as &dyn ::tracing::field::Value))])
                            })
                } else {
                    let span =
                        ::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
                    {};
                    span
                }
            };
        __tracing_attr_guard = __tracing_attr_span.enter();
    }

    #[warn(clippy :: suspicious_else_formatting)]
    {

        #[allow(unknown_lints, unreachable_code, clippy ::
        diverging_sub_expression, clippy :: empty_loop, clippy ::
        let_unit_value, clippy :: let_with_type_underscore, clippy ::
        needless_return, clippy :: unreachable)]
        if false {
            let __tracing_attr_fake_return: &'hir hir::Ty<'hir> = loop {};
            return __tracing_attr_fake_return;
        }
        { self.arena.alloc(self.lower_ty(t, itctx)) }
    }
}#[instrument(level = "debug", skip(self))]
1502    fn lower_ty_alloc(&mut self, t: &Ty, itctx: ImplTraitContext) -> &'hir hir::Ty<'hir> {
1503        self.arena.alloc(self.lower_ty(t, itctx))
1504    }
1505
1506    fn lower_path_ty(
1507        &mut self,
1508        t: &Ty,
1509        qself: &Option<Box<QSelf>>,
1510        path: &Path,
1511        param_mode: ParamMode,
1512        itctx: ImplTraitContext,
1513    ) -> hir::Ty<'hir> {
1514        // Check whether we should interpret this as a bare trait object.
1515        // This check mirrors the one in late resolution. We only introduce this special case in
1516        // the rare occurrence we need to lower `Fresh` anonymous lifetimes.
1517        // The other cases when a qpath should be opportunistically made a trait object are handled
1518        // by `ty_path`.
1519        if qself.is_none()
1520            && let Some(partial_res) = self.get_partial_res(t.id)
1521            && let Some(Res::Def(DefKind::Trait | DefKind::TraitAlias, _)) = partial_res.full_res()
1522        {
1523            let (bounds, lifetime_bound) = self.with_dyn_type_scope(true, |this| {
1524                let bound = this.lower_poly_trait_ref(
1525                    &PolyTraitRef {
1526                        bound_generic_params: ThinVec::new(),
1527                        modifiers: TraitBoundModifiers::NONE,
1528                        trait_ref: TraitRef { path: path.clone(), ref_id: t.id },
1529                        span: t.span,
1530                        parens: ast::Parens::No,
1531                    },
1532                    RelaxedBoundPolicy::Forbidden(RelaxedBoundForbiddenReason::TraitObjectTy),
1533                    itctx,
1534                );
1535                let bounds = this.arena.alloc_from_iter([bound]);
1536                let lifetime_bound = this.elided_dyn_bound(t.span);
1537                (bounds, lifetime_bound)
1538            });
1539            let kind = hir::TyKind::TraitObject(
1540                bounds,
1541                TaggedRef::new(lifetime_bound, TraitObjectSyntax::None),
1542            );
1543            return hir::Ty { kind, span: self.lower_span(t.span), hir_id: self.next_id() };
1544        }
1545
1546        let id = self.lower_node_id(t.id);
1547        let qpath = self.lower_qpath(
1548            t.id,
1549            qself,
1550            path,
1551            param_mode,
1552            AllowReturnTypeNotation::Yes,
1553            itctx,
1554            None,
1555        );
1556        self.ty_path(id, t.span, qpath)
1557    }
1558
1559    fn ty(&mut self, span: Span, kind: hir::TyKind<'hir>) -> hir::Ty<'hir> {
1560        hir::Ty { hir_id: self.next_id(), kind, span: self.lower_span(span) }
1561    }
1562
1563    fn ty_tup(&mut self, span: Span, tys: &'hir [hir::Ty<'hir>]) -> hir::Ty<'hir> {
1564        self.ty(span, hir::TyKind::Tup(tys))
1565    }
1566
1567    fn lower_ty(&mut self, t: &Ty, itctx: ImplTraitContext) -> hir::Ty<'hir> {
1568        let kind = match &t.kind {
1569            TyKind::Infer => hir::TyKind::Infer(()),
1570            TyKind::Err(guar) => hir::TyKind::Err(*guar),
1571            TyKind::Slice(ty) => hir::TyKind::Slice(self.lower_ty_alloc(ty, itctx)),
1572            TyKind::Ptr(mt) => hir::TyKind::Ptr(self.lower_mt(mt, itctx)),
1573            TyKind::Ref(region, mt) => {
1574                let lifetime = self.lower_ty_direct_lifetime(t, *region);
1575                hir::TyKind::Ref(lifetime, self.lower_mt(mt, itctx))
1576            }
1577            TyKind::PinnedRef(region, mt) => {
1578                let lifetime = self.lower_ty_direct_lifetime(t, *region);
1579                let kind = hir::TyKind::Ref(lifetime, self.lower_mt(mt, itctx));
1580                let span = self.lower_span(t.span);
1581                let arg = hir::Ty { kind, span, hir_id: self.next_id() };
1582                let args = self.arena.alloc(hir::GenericArgs {
1583                    args: self.arena.alloc([hir::GenericArg::Type(self.arena.alloc(arg))]),
1584                    constraints: &[],
1585                    parenthesized: hir::GenericArgsParentheses::No,
1586                    span_ext: span,
1587                });
1588                let path = self.make_lang_item_qpath(LangItem::Pin, span, Some(args));
1589                hir::TyKind::Path(path)
1590            }
1591            TyKind::FnPtr(f) => {
1592                let generic_params = self.lower_lifetime_binder(t.id, &f.generic_params);
1593                hir::TyKind::FnPtr(self.arena.alloc(hir::FnPtrTy {
1594                    generic_params,
1595                    safety: self.lower_safety(f.safety, hir::Safety::Safe),
1596                    abi: self.lower_extern(f.ext),
1597                    decl: self.lower_fn_decl(&f.decl, t.id, t.span, FnDeclKind::Pointer, None),
1598                    param_idents: self.lower_fn_params_to_idents(&f.decl),
1599                }))
1600            }
1601            TyKind::UnsafeBinder(f) => {
1602                let generic_params = self.lower_lifetime_binder(t.id, &f.generic_params);
1603                hir::TyKind::UnsafeBinder(self.arena.alloc(hir::UnsafeBinderTy {
1604                    generic_params,
1605                    inner_ty: self.lower_ty_alloc(&f.inner_ty, itctx),
1606                }))
1607            }
1608            TyKind::Never => hir::TyKind::Never,
1609            TyKind::Tup(tys) => hir::TyKind::Tup(
1610                self.arena.alloc_from_iter(tys.iter().map(|ty| self.lower_ty(ty, itctx))),
1611            ),
1612            TyKind::Paren(ty) => {
1613                return self.lower_ty(ty, itctx);
1614            }
1615            TyKind::Path(qself, path) => {
1616                return self.lower_path_ty(t, qself, path, ParamMode::Explicit, itctx);
1617            }
1618            TyKind::ImplicitSelf => {
1619                let hir_id = self.next_id();
1620                let res = self.expect_full_res(t.id);
1621                let res = self.lower_res(res);
1622                hir::TyKind::Path(hir::QPath::Resolved(
1623                    None,
1624                    self.arena.alloc(hir::Path {
1625                        res,
1626                        segments: self.arena.alloc_from_iter([hir::PathSegment::new(Ident::with_dummy_span(kw::SelfUpper),
                hir_id, res)])arena_vec![self; hir::PathSegment::new(
1627                            Ident::with_dummy_span(kw::SelfUpper),
1628                            hir_id,
1629                            res
1630                        )],
1631                        span: self.lower_span(t.span),
1632                    }),
1633                ))
1634            }
1635            TyKind::Array(ty, length) => hir::TyKind::Array(
1636                self.lower_ty_alloc(ty, itctx),
1637                self.lower_array_length_to_const_arg(length),
1638            ),
1639            TyKind::TraitObject(bounds, kind) => {
1640                let mut lifetime_bound = None;
1641                let (bounds, lifetime_bound) = self.with_dyn_type_scope(true, |this| {
1642                    let bounds =
1643                        this.arena.alloc_from_iter(bounds.iter().filter_map(|bound| match bound {
1644                            // We can safely ignore constness here since AST validation
1645                            // takes care of rejecting invalid modifier combinations and
1646                            // const trait bounds in trait object types.
1647                            GenericBound::Trait(ty) => {
1648                                let trait_ref = this.lower_poly_trait_ref(
1649                                    ty,
1650                                    RelaxedBoundPolicy::Forbidden(
1651                                        RelaxedBoundForbiddenReason::TraitObjectTy,
1652                                    ),
1653                                    itctx,
1654                                );
1655                                Some(trait_ref)
1656                            }
1657                            GenericBound::Outlives(lifetime) => {
1658                                if lifetime_bound.is_none() {
1659                                    lifetime_bound = Some(this.lower_lifetime(
1660                                        lifetime,
1661                                        LifetimeSource::Other,
1662                                        lifetime.ident.into(),
1663                                    ));
1664                                }
1665                                None
1666                            }
1667                            // Ignore `use` syntax since that is not valid in objects.
1668                            GenericBound::Use(_, span) => {
1669                                this.dcx()
1670                                    .span_delayed_bug(*span, "use<> not allowed in dyn types");
1671                                None
1672                            }
1673                        }));
1674                    let lifetime_bound =
1675                        lifetime_bound.unwrap_or_else(|| this.elided_dyn_bound(t.span));
1676                    (bounds, lifetime_bound)
1677                });
1678                hir::TyKind::TraitObject(bounds, TaggedRef::new(lifetime_bound, *kind))
1679            }
1680            TyKind::ImplTrait(def_node_id, bounds) => {
1681                let span = t.span;
1682                match itctx {
1683                    ImplTraitContext::OpaqueTy { origin } => {
1684                        self.lower_opaque_impl_trait(span, origin, *def_node_id, bounds, itctx)
1685                    }
1686                    ImplTraitContext::Universal => {
1687                        if let Some(span) = bounds.iter().find_map(|bound| match *bound {
1688                            ast::GenericBound::Use(_, span) => Some(span),
1689                            _ => None,
1690                        }) {
1691                            self.tcx.dcx().emit_err(diagnostics::NoPreciseCapturesOnApit { span });
1692                        }
1693
1694                        let def_id = self.local_def_id(*def_node_id);
1695                        let name = self.tcx.item_name(def_id.to_def_id());
1696                        let ident = Ident::new(name, span);
1697                        let (param, bounds, path) = self.lower_universal_param_and_bounds(
1698                            *def_node_id,
1699                            span,
1700                            ident,
1701                            bounds,
1702                        );
1703                        self.impl_trait_defs.push(param);
1704                        if let Some(bounds) = bounds {
1705                            self.impl_trait_bounds.push(bounds);
1706                        }
1707                        path
1708                    }
1709                    ImplTraitContext::InBinding => {
1710                        hir::TyKind::TraitAscription(self.lower_param_bounds(
1711                            bounds,
1712                            RelaxedBoundPolicy::Allowed(&mut Default::default()),
1713                            itctx,
1714                        ))
1715                    }
1716                    ImplTraitContext::FeatureGated(position, feature) => {
1717                        let guar = self
1718                            .tcx
1719                            .sess
1720                            .create_feature_err(
1721                                MisplacedImplTrait {
1722                                    span: t.span,
1723                                    position: DiagArgFromDisplay(&position),
1724                                },
1725                                feature,
1726                            )
1727                            .emit();
1728                        hir::TyKind::Err(guar)
1729                    }
1730                    ImplTraitContext::Disallowed(position) => {
1731                        let guar = self.dcx().emit_err(MisplacedImplTrait {
1732                            span: t.span,
1733                            position: DiagArgFromDisplay(&position),
1734                        });
1735                        hir::TyKind::Err(guar)
1736                    }
1737                }
1738            }
1739            TyKind::Pat(ty, pat) => {
1740                hir::TyKind::Pat(self.lower_ty_alloc(ty, itctx), self.lower_ty_pat(pat, ty.span))
1741            }
1742            TyKind::FieldOf(ty, variant, field) => hir::TyKind::FieldOf(
1743                self.lower_ty_alloc(ty, itctx),
1744                self.arena.alloc(hir::TyFieldPath {
1745                    variant: variant.map(|variant| self.lower_ident(variant)),
1746                    field: self.lower_ident(*field),
1747                }),
1748            ),
1749            TyKind::MacCall(_) => {
1750                ::rustc_middle::util::bug::span_bug_fmt(t.span,
    format_args!("`TyKind::MacCall` should have been expanded by now"))span_bug!(t.span, "`TyKind::MacCall` should have been expanded by now")
1751            }
1752            TyKind::CVarArgs => {
1753                let guar = self.dcx().span_delayed_bug(
1754                    t.span,
1755                    "`TyKind::CVarArgs` should have been handled elsewhere",
1756                );
1757                hir::TyKind::Err(guar)
1758            }
1759            TyKind::View(ty, fields) => {
1760                let ty = self.lower_ty_alloc(ty, itctx);
1761                let fields = self.arena.alloc_slice(fields);
1762                hir::TyKind::View(ty, fields)
1763            }
1764            TyKind::DirectConstArg(expr) => {
1765                let e = self.emit_bad_direct_const_arg(t.span, expr, "type");
1766                hir::TyKind::Err(e)
1767            }
1768            TyKind::Dummy => {
    ::core::panicking::panic_fmt(format_args!("`TyKind::Dummy` should never be lowered"));
}panic!("`TyKind::Dummy` should never be lowered"),
1769        };
1770
1771        hir::Ty { kind, span: self.lower_span(t.span), hir_id: self.lower_node_id(t.id) }
1772    }
1773
1774    pub(crate) fn emit_bad_direct_const_arg(
1775        &mut self,
1776        span: Span,
1777        expr: &Expr,
1778        expected: &'static str,
1779    ) -> ErrorGuaranteed {
1780        let msg = ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("expected {0}, found `direct_const_arg!()` constant",
                expected))
    })format!("expected {expected}, found `direct_const_arg!()` constant");
1781        if expr::WillCreateDefIdsVisitor.visit_expr(expr).is_break() {
1782            // FIXME(mgca): make this non-fatal once we have a better way to handle
1783            // nested items in invalid `direct_const_arg!()` arguments.
1784            self.dcx().struct_span_fatal(span, msg).emit()
1785        } else {
1786            self.dcx().struct_span_err(span, msg).emit()
1787        }
1788    }
1789
1790    fn lower_ty_direct_lifetime(
1791        &mut self,
1792        t: &Ty,
1793        region: Option<Lifetime>,
1794    ) -> &'hir hir::Lifetime {
1795        let (region, syntax) = match region {
1796            Some(region) => (region, region.ident.into()),
1797
1798            None => {
1799                let id = if let Some(LifetimeRes::ElidedAnchor { start, end }) =
1800                    self.owner.get_lifetime_res(t.id)
1801                {
1802                    {
    match (&start.plus(1), &end) {
        (left_val, right_val) => {
            if !(*left_val == *right_val) {
                let kind = ::core::panicking::AssertKind::Eq;
                ::core::panicking::assert_failed(kind, &*left_val,
                    &*right_val, ::core::option::Option::None);
            }
        }
    }
};assert_eq!(start.plus(1), end);
1803                    start
1804                } else {
1805                    self.next_node_id()
1806                };
1807                let span = self.tcx.sess.source_map().start_point(t.span).shrink_to_hi();
1808                let region = Lifetime { ident: Ident::new(kw::UnderscoreLifetime, span), id };
1809                (region, LifetimeSyntax::Implicit)
1810            }
1811        };
1812        self.lower_lifetime(&region, LifetimeSource::Reference, syntax)
1813    }
1814
1815    /// Lowers a `ReturnPositionOpaqueTy` (`-> impl Trait`) or a `TypeAliasesOpaqueTy` (`type F =
1816    /// impl Trait`): this creates the associated Opaque Type (TAIT) definition and then returns a
1817    /// HIR type that references the TAIT.
1818    ///
1819    /// Given a function definition like:
1820    ///
1821    /// ```rust
1822    /// use std::fmt::Debug;
1823    ///
1824    /// fn test<'a, T: Debug>(x: &'a T) -> impl Debug + 'a {
1825    ///     x
1826    /// }
1827    /// ```
1828    ///
1829    /// we will create a TAIT definition in the HIR like
1830    ///
1831    /// ```rust,ignore (pseudo-Rust)
1832    /// type TestReturn<'a, T, 'x> = impl Debug + 'x
1833    /// ```
1834    ///
1835    /// and return a type like `TestReturn<'static, T, 'a>`, so that the function looks like:
1836    ///
1837    /// ```rust,ignore (pseudo-Rust)
1838    /// fn test<'a, T: Debug>(x: &'a T) -> TestReturn<'static, T, 'a>
1839    /// ```
1840    ///
1841    /// Note the subtlety around type parameters! The new TAIT, `TestReturn`, inherits all the
1842    /// type parameters from the function `test` (this is implemented in the query layer, they aren't
1843    /// added explicitly in the HIR). But this includes all the lifetimes, and we only want to
1844    /// capture the lifetimes that are referenced in the bounds. Therefore, we add *extra* lifetime parameters
1845    /// for the lifetimes that get captured (`'x`, in our example above) and reference those.
1846    x;#[instrument(level = "debug", skip(self), ret)]
1847    fn lower_opaque_impl_trait(
1848        &mut self,
1849        span: Span,
1850        origin: hir::OpaqueTyOrigin<LocalDefId>,
1851        opaque_ty_node_id: NodeId,
1852        bounds: &GenericBounds,
1853        itctx: ImplTraitContext,
1854    ) -> hir::TyKind<'hir> {
1855        // Make sure we know that some funky desugaring has been going on here.
1856        // This is a first: there is code in other places like for loop
1857        // desugaring that explicitly states that we don't want to track that.
1858        // Not tracking it makes lints in rustc and clippy very fragile, as
1859        // frequently opened issues show.
1860        let opaque_ty_span = self.mark_span_with_reason(DesugaringKind::OpaqueTy, span, None);
1861
1862        self.lower_opaque_inner(opaque_ty_node_id, origin, opaque_ty_span, |this| {
1863            this.lower_param_bounds(
1864                bounds,
1865                RelaxedBoundPolicy::Allowed(&mut Default::default()),
1866                itctx,
1867            )
1868        })
1869    }
1870
1871    fn lower_opaque_inner(
1872        &mut self,
1873        opaque_ty_node_id: NodeId,
1874        origin: hir::OpaqueTyOrigin<LocalDefId>,
1875        opaque_ty_span: Span,
1876        lower_item_bounds: impl FnOnce(&mut Self) -> &'hir [hir::GenericBound<'hir>],
1877    ) -> hir::TyKind<'hir> {
1878        let opaque_ty_def_id = self.local_def_id(opaque_ty_node_id);
1879        let opaque_ty_hir_id = self.lower_node_id(opaque_ty_node_id);
1880        {
    use ::tracing::__macro_support::Callsite as _;
    static __CALLSITE: ::tracing::callsite::DefaultCallsite =
        {
            static META: ::tracing::Metadata<'static> =
                {
                    ::tracing_core::metadata::Metadata::new("event compiler/rustc_ast_lowering/src/lib.rs:1880",
                        "rustc_ast_lowering", ::tracing::Level::DEBUG,
                        ::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
                        ::tracing_core::__macro_support::Option::Some(1880u32),
                        ::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
                        ::tracing_core::field::FieldSet::new(&[{
                                            const NAME:
                                                ::tracing::__macro_support::FieldName<{
                                                    ::tracing::__macro_support::FieldName::len("opaque_ty_def_id")
                                                }> =
                                                ::tracing::__macro_support::FieldName::new("opaque_ty_def_id");
                                            NAME.as_str()
                                        },
                                        {
                                            const NAME:
                                                ::tracing::__macro_support::FieldName<{
                                                    ::tracing::__macro_support::FieldName::len("opaque_ty_hir_id")
                                                }> =
                                                ::tracing::__macro_support::FieldName::new("opaque_ty_hir_id");
                                            NAME.as_str()
                                        }], ::tracing_core::callsite::Identifier(&__CALLSITE)),
                        ::tracing::metadata::Kind::EVENT)
                };
            ::tracing::callsite::DefaultCallsite::new(&META)
        };
    let enabled =
        ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::DEBUG <=
                    ::tracing::level_filters::LevelFilter::current() &&
            {
                let interest = __CALLSITE.interest();
                !interest.is_never() &&
                    ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                        interest)
            };
    if enabled {
        (|value_set: ::tracing::field::ValueSet|
                    {
                        let meta = __CALLSITE.metadata();
                        ::tracing::Event::dispatch(meta, &value_set);
                        ;
                    })({
                #[allow(unused_imports)]
                use ::tracing::field::{debug, display, Value};
                __CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&opaque_ty_def_id)
                                            as &dyn ::tracing::field::Value)),
                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&opaque_ty_hir_id)
                                            as &dyn ::tracing::field::Value))])
            });
    } else { ; }
};debug!(?opaque_ty_def_id, ?opaque_ty_hir_id);
1881
1882        let bounds = lower_item_bounds(self);
1883        let opaque_ty_def = hir::OpaqueTy {
1884            hir_id: opaque_ty_hir_id,
1885            def_id: opaque_ty_def_id,
1886            bounds,
1887            origin,
1888            span: self.lower_span(opaque_ty_span),
1889        };
1890        let opaque_ty_def = self.arena.alloc(opaque_ty_def);
1891
1892        hir::TyKind::OpaqueDef(opaque_ty_def)
1893    }
1894
1895    fn lower_precise_capturing_args(
1896        &mut self,
1897        precise_capturing_args: &[PreciseCapturingArg],
1898    ) -> &'hir [hir::PreciseCapturingArg<'hir>] {
1899        self.arena.alloc_from_iter(precise_capturing_args.iter().map(|arg| match arg {
1900            PreciseCapturingArg::Lifetime(lt) => hir::PreciseCapturingArg::Lifetime(
1901                self.lower_lifetime(lt, LifetimeSource::PreciseCapturing, lt.ident.into()),
1902            ),
1903            PreciseCapturingArg::Arg(path, id) => {
1904                let [segment] = path.segments.as_slice() else {
1905                    ::core::panicking::panic("explicit panic");panic!();
1906                };
1907                let res = self.get_partial_res(*id).map_or(Res::Err, |partial_res| {
1908                    partial_res.full_res().expect("no partial res expected for precise capture arg")
1909                });
1910                hir::PreciseCapturingArg::Param(hir::PreciseCapturingNonLifetimeArg {
1911                    hir_id: self.lower_node_id(*id),
1912                    ident: self.lower_ident(segment.ident),
1913                    res: self.lower_res(res),
1914                })
1915            }
1916        }))
1917    }
1918
1919    fn lower_fn_params_to_idents(&mut self, decl: &FnDecl) -> &'hir [Option<Ident>] {
1920        self.arena.alloc_from_iter(decl.inputs.iter().map(|param| match param.pat.kind {
1921            PatKind::Missing => None,
1922            PatKind::Ident(_, ident, _) => Some(self.lower_ident(ident)),
1923            PatKind::Wild => Some(Ident::new(kw::Underscore, self.lower_span(param.pat.span))),
1924            _ => {
1925                self.dcx().span_delayed_bug(
1926                    param.pat.span,
1927                    "non-missing/ident/wild param pat must trigger an error",
1928                );
1929                None
1930            }
1931        }))
1932    }
1933
1934    /// Lowers a function declaration.
1935    ///
1936    /// `decl`: the unlowered (AST) function declaration.
1937    ///
1938    /// `fn_node_id`: `impl Trait` arguments are lowered into generic parameters on the given
1939    /// `NodeId`.
1940    ///
1941    /// `transform_return_type`: if `Some`, applies some conversion to the return type, such as is
1942    /// needed for `async fn` and `gen fn`. See [`CoroutineKind`] for more details.
1943    #[allow(clippy :: suspicious_else_formatting)]
{
    let __tracing_attr_span;
    let __tracing_attr_guard;
    if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::DEBUG <=
                    ::tracing::level_filters::LevelFilter::current() ||
            { false } {
        __tracing_attr_span =
            {
                use ::tracing::__macro_support::Callsite as _;
                static __CALLSITE: ::tracing::callsite::DefaultCallsite =
                    {
                        static META: ::tracing::Metadata<'static> =
                            {
                                ::tracing_core::metadata::Metadata::new("lower_fn_decl",
                                    "rustc_ast_lowering", ::tracing::Level::DEBUG,
                                    ::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
                                    ::tracing_core::__macro_support::Option::Some(1943u32),
                                    ::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
                                    ::tracing_core::field::FieldSet::new(&[{
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("decl")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("decl");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("fn_node_id")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("fn_node_id");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("fn_span")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("fn_span");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("kind")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("kind");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("coro")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("coro");
                                                        NAME.as_str()
                                                    }], ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                    ::tracing::metadata::Kind::SPAN)
                            };
                        ::tracing::callsite::DefaultCallsite::new(&META)
                    };
                let mut interest = ::tracing::subscriber::Interest::never();
                if ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::STATIC_MAX_LEVEL &&
                                ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::LevelFilter::current() &&
                            { interest = __CALLSITE.interest(); !interest.is_never() }
                        &&
                        ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                            interest) {
                    let meta = __CALLSITE.metadata();
                    ::tracing::Span::new(meta,
                        &{
                                #[allow(unused_imports)]
                                use ::tracing::field::{debug, display, Value};
                                meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&decl)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&fn_node_id)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&fn_span)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&kind)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&coro)
                                                            as &dyn ::tracing::field::Value))])
                            })
                } else {
                    let span =
                        ::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
                    {};
                    span
                }
            };
        __tracing_attr_guard = __tracing_attr_span.enter();
    }

    #[warn(clippy :: suspicious_else_formatting)]
    {

        #[allow(unknown_lints, unreachable_code, clippy ::
        diverging_sub_expression, clippy :: empty_loop, clippy ::
        let_unit_value, clippy :: let_with_type_underscore, clippy ::
        needless_return, clippy :: unreachable)]
        if false {
            let __tracing_attr_fake_return: &'hir hir::FnDecl<'hir> = loop {};
            return __tracing_attr_fake_return;
        }
        {
            let c_variadic = decl.c_variadic();
            let mut splatted = decl.splatted();
            let mut inputs = &decl.inputs[..];
            if decl.c_variadic() {
                splatted = None;
                inputs = &inputs[..inputs.len() - 1];
            }
            let inputs =
                self.arena.alloc_from_iter(inputs.iter().map(|param|
                            {
                                let itctx =
                                    match kind {
                                        FnDeclKind::Fn | FnDeclKind::Inherent | FnDeclKind::Impl |
                                            FnDeclKind::Trait => {
                                            ImplTraitContext::Universal
                                        }
                                        FnDeclKind::ExternFn => {
                                            ImplTraitContext::Disallowed(ImplTraitPosition::ExternFnParam)
                                        }
                                        FnDeclKind::Closure => {
                                            ImplTraitContext::Disallowed(ImplTraitPosition::ClosureParam)
                                        }
                                        FnDeclKind::Pointer => {
                                            ImplTraitContext::Disallowed(ImplTraitPosition::PointerParam)
                                        }
                                    };
                                self.lower_ty(&param.ty, itctx)
                            }));
            let output =
                match coro {
                    Some(coro) => {
                        let fn_def_id = self.owner.def_id;
                        self.lower_coroutine_fn_ret_ty(&decl.output, fn_def_id,
                            coro, kind)
                    }
                    None =>
                        match &decl.output {
                            FnRetTy::Ty(ty) => {
                                let itctx =
                                    match kind {
                                        FnDeclKind::Fn | FnDeclKind::Inherent =>
                                            ImplTraitContext::OpaqueTy {
                                                origin: hir::OpaqueTyOrigin::FnReturn {
                                                    parent: self.owner.def_id,
                                                    in_trait_or_impl: None,
                                                },
                                            },
                                        FnDeclKind::Trait =>
                                            ImplTraitContext::OpaqueTy {
                                                origin: hir::OpaqueTyOrigin::FnReturn {
                                                    parent: self.owner.def_id,
                                                    in_trait_or_impl: Some(hir::RpitContext::Trait),
                                                },
                                            },
                                        FnDeclKind::Impl =>
                                            ImplTraitContext::OpaqueTy {
                                                origin: hir::OpaqueTyOrigin::FnReturn {
                                                    parent: self.owner.def_id,
                                                    in_trait_or_impl: Some(hir::RpitContext::TraitImpl),
                                                },
                                            },
                                        FnDeclKind::ExternFn => {
                                            ImplTraitContext::Disallowed(ImplTraitPosition::ExternFnReturn)
                                        }
                                        FnDeclKind::Closure => {
                                            ImplTraitContext::Disallowed(ImplTraitPosition::ClosureReturn)
                                        }
                                        FnDeclKind::Pointer => {
                                            ImplTraitContext::Disallowed(ImplTraitPosition::PointerReturn)
                                        }
                                    };
                                hir::FnRetTy::Return(self.lower_ty_alloc(ty, itctx))
                            }
                            FnRetTy::Default(span) =>
                                hir::FnRetTy::DefaultReturn(self.lower_span(*span)),
                        },
                };
            let fn_decl_kind =
                hir::FnDeclFlags::default().set_implicit_self(decl.inputs.get(0).map_or(hir::ImplicitSelfKind::None,
                                        |arg|
                                            {
                                                let is_mutable_pat =
                                                    #[allow(non_exhaustive_omitted_patterns)] match arg.pat.kind
                                                        {
                                                        PatKind::Ident(hir::BindingMode(_, Mutability::Mut), ..) =>
                                                            true,
                                                        _ => false,
                                                    };
                                                match &arg.ty.kind {
                                                    TyKind::ImplicitSelf if is_mutable_pat =>
                                                        hir::ImplicitSelfKind::Mut,
                                                    TyKind::ImplicitSelf => hir::ImplicitSelfKind::Imm,
                                                    TyKind::Ref(_, mt) | TyKind::PinnedRef(_, mt) if
                                                        mt.ty.kind.is_implicit_self() => {
                                                        match mt.mutbl {
                                                            hir::Mutability::Not => hir::ImplicitSelfKind::RefImm,
                                                            hir::Mutability::Mut => hir::ImplicitSelfKind::RefMut,
                                                        }
                                                    }
                                                    _ => hir::ImplicitSelfKind::None,
                                                }
                                            })).set_lifetime_elision_allowed(self.owner.id == fn_node_id
                                    &&
                                    self.owner.lifetime_elision_allowed).set_c_variadic(c_variadic).set_splatted(splatted,
                        inputs.len()).unwrap();
            self.arena.alloc(hir::FnDecl { inputs, output, fn_decl_kind })
        }
    }
}#[instrument(level = "debug", skip(self))]
1944    fn lower_fn_decl(
1945        &mut self,
1946        decl: &FnDecl,
1947        fn_node_id: NodeId,
1948        fn_span: Span,
1949        kind: FnDeclKind,
1950        coro: Option<CoroutineKind>,
1951    ) -> &'hir hir::FnDecl<'hir> {
1952        let c_variadic = decl.c_variadic();
1953        let mut splatted = decl.splatted();
1954
1955        // Skip the `...` (`CVarArgs`) trailing arguments from the AST,
1956        // as they are not explicit in HIR/Ty function signatures.
1957        // (instead, the `c_variadic` flag is set to `true`)
1958        let mut inputs = &decl.inputs[..];
1959        if decl.c_variadic() {
1960            // Splat + variadic errors in AST validation, so just ignore one of them here.
1961            splatted = None;
1962            inputs = &inputs[..inputs.len() - 1];
1963        }
1964        let inputs = self.arena.alloc_from_iter(inputs.iter().map(|param| {
1965            let itctx = match kind {
1966                FnDeclKind::Fn | FnDeclKind::Inherent | FnDeclKind::Impl | FnDeclKind::Trait => {
1967                    ImplTraitContext::Universal
1968                }
1969                FnDeclKind::ExternFn => {
1970                    ImplTraitContext::Disallowed(ImplTraitPosition::ExternFnParam)
1971                }
1972                FnDeclKind::Closure => {
1973                    ImplTraitContext::Disallowed(ImplTraitPosition::ClosureParam)
1974                }
1975                FnDeclKind::Pointer => {
1976                    ImplTraitContext::Disallowed(ImplTraitPosition::PointerParam)
1977                }
1978            };
1979            self.lower_ty(&param.ty, itctx)
1980        }));
1981
1982        let output = match coro {
1983            Some(coro) => {
1984                let fn_def_id = self.owner.def_id;
1985                self.lower_coroutine_fn_ret_ty(&decl.output, fn_def_id, coro, kind)
1986            }
1987            None => match &decl.output {
1988                FnRetTy::Ty(ty) => {
1989                    let itctx = match kind {
1990                        FnDeclKind::Fn | FnDeclKind::Inherent => ImplTraitContext::OpaqueTy {
1991                            origin: hir::OpaqueTyOrigin::FnReturn {
1992                                parent: self.owner.def_id,
1993                                in_trait_or_impl: None,
1994                            },
1995                        },
1996                        FnDeclKind::Trait => ImplTraitContext::OpaqueTy {
1997                            origin: hir::OpaqueTyOrigin::FnReturn {
1998                                parent: self.owner.def_id,
1999                                in_trait_or_impl: Some(hir::RpitContext::Trait),
2000                            },
2001                        },
2002                        FnDeclKind::Impl => ImplTraitContext::OpaqueTy {
2003                            origin: hir::OpaqueTyOrigin::FnReturn {
2004                                parent: self.owner.def_id,
2005                                in_trait_or_impl: Some(hir::RpitContext::TraitImpl),
2006                            },
2007                        },
2008                        FnDeclKind::ExternFn => {
2009                            ImplTraitContext::Disallowed(ImplTraitPosition::ExternFnReturn)
2010                        }
2011                        FnDeclKind::Closure => {
2012                            ImplTraitContext::Disallowed(ImplTraitPosition::ClosureReturn)
2013                        }
2014                        FnDeclKind::Pointer => {
2015                            ImplTraitContext::Disallowed(ImplTraitPosition::PointerReturn)
2016                        }
2017                    };
2018                    hir::FnRetTy::Return(self.lower_ty_alloc(ty, itctx))
2019                }
2020                FnRetTy::Default(span) => hir::FnRetTy::DefaultReturn(self.lower_span(*span)),
2021            },
2022        };
2023
2024        let fn_decl_kind = hir::FnDeclFlags::default()
2025            .set_implicit_self(decl.inputs.get(0).map_or(hir::ImplicitSelfKind::None, |arg| {
2026                let is_mutable_pat = matches!(
2027                    arg.pat.kind,
2028                    PatKind::Ident(hir::BindingMode(_, Mutability::Mut), ..)
2029                );
2030
2031                match &arg.ty.kind {
2032                    TyKind::ImplicitSelf if is_mutable_pat => hir::ImplicitSelfKind::Mut,
2033                    TyKind::ImplicitSelf => hir::ImplicitSelfKind::Imm,
2034                    // Given we are only considering `ImplicitSelf` types, we needn't consider
2035                    // the case where we have a mutable pattern to a reference as that would
2036                    // no longer be an `ImplicitSelf`.
2037                    TyKind::Ref(_, mt) | TyKind::PinnedRef(_, mt)
2038                        if mt.ty.kind.is_implicit_self() =>
2039                    {
2040                        match mt.mutbl {
2041                            hir::Mutability::Not => hir::ImplicitSelfKind::RefImm,
2042                            hir::Mutability::Mut => hir::ImplicitSelfKind::RefMut,
2043                        }
2044                    }
2045                    _ => hir::ImplicitSelfKind::None,
2046                }
2047            }))
2048            .set_lifetime_elision_allowed(
2049                self.owner.id == fn_node_id && self.owner.lifetime_elision_allowed,
2050            )
2051            .set_c_variadic(c_variadic)
2052            .set_splatted(splatted, inputs.len())
2053            .unwrap();
2054
2055        self.arena.alloc(hir::FnDecl { inputs, output, fn_decl_kind })
2056    }
2057
2058    // Transforms `-> T` for `async fn` into `-> OpaqueTy { .. }`
2059    // combined with the following definition of `OpaqueTy`:
2060    //
2061    //     type OpaqueTy<generics_from_parent_fn> = impl Future<Output = T>;
2062    //
2063    // `output`: unlowered output type (`T` in `-> T`)
2064    // `fn_node_id`: `NodeId` of the parent function (used to create child impl trait definition)
2065    // `opaque_ty_node_id`: `NodeId` of the opaque `impl Trait` type that should be created
2066    #[allow(clippy :: suspicious_else_formatting)]
{
    let __tracing_attr_span;
    let __tracing_attr_guard;
    if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::DEBUG <=
                    ::tracing::level_filters::LevelFilter::current() ||
            { false } {
        __tracing_attr_span =
            {
                use ::tracing::__macro_support::Callsite as _;
                static __CALLSITE: ::tracing::callsite::DefaultCallsite =
                    {
                        static META: ::tracing::Metadata<'static> =
                            {
                                ::tracing_core::metadata::Metadata::new("lower_coroutine_fn_ret_ty",
                                    "rustc_ast_lowering", ::tracing::Level::DEBUG,
                                    ::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
                                    ::tracing_core::__macro_support::Option::Some(2066u32),
                                    ::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
                                    ::tracing_core::field::FieldSet::new(&[{
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("output")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("output");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("fn_def_id")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("fn_def_id");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("coro")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("coro");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("fn_kind")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("fn_kind");
                                                        NAME.as_str()
                                                    }], ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                    ::tracing::metadata::Kind::SPAN)
                            };
                        ::tracing::callsite::DefaultCallsite::new(&META)
                    };
                let mut interest = ::tracing::subscriber::Interest::never();
                if ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::STATIC_MAX_LEVEL &&
                                ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::LevelFilter::current() &&
                            { interest = __CALLSITE.interest(); !interest.is_never() }
                        &&
                        ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                            interest) {
                    let meta = __CALLSITE.metadata();
                    ::tracing::Span::new(meta,
                        &{
                                #[allow(unused_imports)]
                                use ::tracing::field::{debug, display, Value};
                                meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&output)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&fn_def_id)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&coro)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&fn_kind)
                                                            as &dyn ::tracing::field::Value))])
                            })
                } else {
                    let span =
                        ::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
                    {};
                    span
                }
            };
        __tracing_attr_guard = __tracing_attr_span.enter();
    }

    #[warn(clippy :: suspicious_else_formatting)]
    {

        #[allow(unknown_lints, unreachable_code, clippy ::
        diverging_sub_expression, clippy :: empty_loop, clippy ::
        let_unit_value, clippy :: let_with_type_underscore, clippy ::
        needless_return, clippy :: unreachable)]
        if false {
            let __tracing_attr_fake_return: hir::FnRetTy<'hir> = loop {};
            return __tracing_attr_fake_return;
        }
        {
            let span = self.lower_span(output.span());
            let (opaque_ty_node_id, allowed_features) =
                match coro {
                    CoroutineKind::Async { return_impl_trait_id, .. } =>
                        (return_impl_trait_id, None),
                    CoroutineKind::Gen { return_impl_trait_id, .. } =>
                        (return_impl_trait_id, None),
                    CoroutineKind::AsyncGen { return_impl_trait_id, .. } => {
                        (return_impl_trait_id,
                            Some(Arc::clone(&self.allow_async_iterator)))
                    }
                };
            let opaque_ty_span =
                self.mark_span_with_reason(DesugaringKind::Async, span,
                    allowed_features);
            let in_trait_or_impl =
                match fn_kind {
                    FnDeclKind::Trait => Some(hir::RpitContext::Trait),
                    FnDeclKind::Impl => Some(hir::RpitContext::TraitImpl),
                    FnDeclKind::Fn | FnDeclKind::Inherent => None,
                    FnDeclKind::ExternFn | FnDeclKind::Closure |
                        FnDeclKind::Pointer =>
                        ::core::panicking::panic("internal error: entered unreachable code"),
                };
            let opaque_ty_ref =
                self.lower_opaque_inner(opaque_ty_node_id,
                    hir::OpaqueTyOrigin::AsyncFn {
                        parent: fn_def_id,
                        in_trait_or_impl,
                    }, opaque_ty_span,
                    |this|
                        {
                            let bound =
                                this.lower_coroutine_fn_output_type_to_bound(output, coro,
                                    opaque_ty_span,
                                    ImplTraitContext::OpaqueTy {
                                        origin: hir::OpaqueTyOrigin::FnReturn {
                                            parent: fn_def_id,
                                            in_trait_or_impl,
                                        },
                                    });
                            this.arena.alloc_from_iter([bound])
                        });
            let opaque_ty = self.ty(opaque_ty_span, opaque_ty_ref);
            hir::FnRetTy::Return(self.arena.alloc(opaque_ty))
        }
    }
}#[instrument(level = "debug", skip(self))]
2067    fn lower_coroutine_fn_ret_ty(
2068        &mut self,
2069        output: &FnRetTy,
2070        fn_def_id: LocalDefId,
2071        coro: CoroutineKind,
2072        fn_kind: FnDeclKind,
2073    ) -> hir::FnRetTy<'hir> {
2074        let span = self.lower_span(output.span());
2075
2076        let (opaque_ty_node_id, allowed_features) = match coro {
2077            CoroutineKind::Async { return_impl_trait_id, .. } => (return_impl_trait_id, None),
2078            CoroutineKind::Gen { return_impl_trait_id, .. } => (return_impl_trait_id, None),
2079            CoroutineKind::AsyncGen { return_impl_trait_id, .. } => {
2080                (return_impl_trait_id, Some(Arc::clone(&self.allow_async_iterator)))
2081            }
2082        };
2083
2084        let opaque_ty_span =
2085            self.mark_span_with_reason(DesugaringKind::Async, span, allowed_features);
2086
2087        let in_trait_or_impl = match fn_kind {
2088            FnDeclKind::Trait => Some(hir::RpitContext::Trait),
2089            FnDeclKind::Impl => Some(hir::RpitContext::TraitImpl),
2090            FnDeclKind::Fn | FnDeclKind::Inherent => None,
2091            FnDeclKind::ExternFn | FnDeclKind::Closure | FnDeclKind::Pointer => unreachable!(),
2092        };
2093
2094        let opaque_ty_ref = self.lower_opaque_inner(
2095            opaque_ty_node_id,
2096            hir::OpaqueTyOrigin::AsyncFn { parent: fn_def_id, in_trait_or_impl },
2097            opaque_ty_span,
2098            |this| {
2099                let bound = this.lower_coroutine_fn_output_type_to_bound(
2100                    output,
2101                    coro,
2102                    opaque_ty_span,
2103                    ImplTraitContext::OpaqueTy {
2104                        origin: hir::OpaqueTyOrigin::FnReturn {
2105                            parent: fn_def_id,
2106                            in_trait_or_impl,
2107                        },
2108                    },
2109                );
2110                arena_vec![this; bound]
2111            },
2112        );
2113
2114        let opaque_ty = self.ty(opaque_ty_span, opaque_ty_ref);
2115        hir::FnRetTy::Return(self.arena.alloc(opaque_ty))
2116    }
2117
2118    /// Transforms `-> T` into `Future<Output = T>`.
2119    fn lower_coroutine_fn_output_type_to_bound(
2120        &mut self,
2121        output: &FnRetTy,
2122        coro: CoroutineKind,
2123        opaque_ty_span: Span,
2124        itctx: ImplTraitContext,
2125    ) -> hir::GenericBound<'hir> {
2126        // Compute the `T` in `Future<Output = T>` from the return type.
2127        let output_ty = match output {
2128            FnRetTy::Ty(ty) => {
2129                // Not `OpaqueTyOrigin::AsyncFn`: that's only used for the
2130                // `impl Future` opaque type that `async fn` implicitly
2131                // generates.
2132                self.lower_ty_alloc(ty, itctx)
2133            }
2134            FnRetTy::Default(ret_ty_span) => self.arena.alloc(self.ty_tup(*ret_ty_span, &[])),
2135        };
2136
2137        // "<$assoc_ty_name = T>"
2138        let (assoc_ty_name, trait_lang_item) = match coro {
2139            CoroutineKind::Async { .. } => (sym::Output, LangItem::Future),
2140            CoroutineKind::Gen { .. } => (sym::Item, LangItem::Iterator),
2141            CoroutineKind::AsyncGen { .. } => (sym::Item, LangItem::AsyncIterator),
2142        };
2143
2144        let bound_args = self.arena.alloc(hir::GenericArgs {
2145            args: &[],
2146            constraints: self.arena.alloc_from_iter([self.assoc_ty_binding(assoc_ty_name,
                opaque_ty_span, output_ty)])arena_vec![self; self.assoc_ty_binding(assoc_ty_name, opaque_ty_span, output_ty)],
2147            parenthesized: hir::GenericArgsParentheses::No,
2148            span_ext: DUMMY_SP,
2149        });
2150
2151        hir::GenericBound::Trait(hir::PolyTraitRef {
2152            bound_generic_params: &[],
2153            modifiers: hir::TraitBoundModifiers::NONE,
2154            trait_ref: hir::TraitRef {
2155                path: self.make_lang_item_path(trait_lang_item, opaque_ty_span, Some(bound_args)),
2156                hir_ref_id: self.next_id(),
2157            },
2158            span: opaque_ty_span,
2159        })
2160    }
2161
2162    #[allow(clippy :: suspicious_else_formatting)]
{
    let __tracing_attr_span;
    let __tracing_attr_guard;
    if ::tracing::Level::TRACE <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::TRACE <=
                    ::tracing::level_filters::LevelFilter::current() ||
            { false } {
        __tracing_attr_span =
            {
                use ::tracing::__macro_support::Callsite as _;
                static __CALLSITE: ::tracing::callsite::DefaultCallsite =
                    {
                        static META: ::tracing::Metadata<'static> =
                            {
                                ::tracing_core::metadata::Metadata::new("lower_param_bound",
                                    "rustc_ast_lowering", ::tracing::Level::TRACE,
                                    ::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
                                    ::tracing_core::__macro_support::Option::Some(2162u32),
                                    ::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
                                    ::tracing_core::field::FieldSet::new(&[{
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("tpb")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("tpb");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("rbp")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("rbp");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("itctx")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("itctx");
                                                        NAME.as_str()
                                                    }], ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                    ::tracing::metadata::Kind::SPAN)
                            };
                        ::tracing::callsite::DefaultCallsite::new(&META)
                    };
                let mut interest = ::tracing::subscriber::Interest::never();
                if ::tracing::Level::TRACE <=
                                    ::tracing::level_filters::STATIC_MAX_LEVEL &&
                                ::tracing::Level::TRACE <=
                                    ::tracing::level_filters::LevelFilter::current() &&
                            { interest = __CALLSITE.interest(); !interest.is_never() }
                        &&
                        ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                            interest) {
                    let meta = __CALLSITE.metadata();
                    ::tracing::Span::new(meta,
                        &{
                                #[allow(unused_imports)]
                                use ::tracing::field::{debug, display, Value};
                                meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&tpb)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&rbp)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&itctx)
                                                            as &dyn ::tracing::field::Value))])
                            })
                } else {
                    let span =
                        ::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
                    {};
                    span
                }
            };
        __tracing_attr_guard = __tracing_attr_span.enter();
    }

    #[warn(clippy :: suspicious_else_formatting)]
    {

        #[allow(unknown_lints, unreachable_code, clippy ::
        diverging_sub_expression, clippy :: empty_loop, clippy ::
        let_unit_value, clippy :: let_with_type_underscore, clippy ::
        needless_return, clippy :: unreachable)]
        if false {
            let __tracing_attr_fake_return: hir::GenericBound<'hir> = loop {};
            return __tracing_attr_fake_return;
        }
        {
            match tpb {
                GenericBound::Trait(p) => {
                    hir::GenericBound::Trait(self.lower_poly_trait_ref(p, rbp,
                            itctx))
                }
                GenericBound::Outlives(lifetime) =>
                    hir::GenericBound::Outlives(self.lower_lifetime(lifetime,
                            LifetimeSource::OutlivesBound, lifetime.ident.into())),
                GenericBound::Use(args, span) =>
                    hir::GenericBound::Use(self.lower_precise_capturing_args(args),
                        self.lower_span(*span)),
            }
        }
    }
}#[instrument(level = "trace", skip(self))]
2163    fn lower_param_bound(
2164        &mut self,
2165        tpb: &GenericBound,
2166        rbp: RelaxedBoundPolicy<'_>,
2167        itctx: ImplTraitContext,
2168    ) -> hir::GenericBound<'hir> {
2169        match tpb {
2170            GenericBound::Trait(p) => {
2171                hir::GenericBound::Trait(self.lower_poly_trait_ref(p, rbp, itctx))
2172            }
2173            GenericBound::Outlives(lifetime) => hir::GenericBound::Outlives(self.lower_lifetime(
2174                lifetime,
2175                LifetimeSource::OutlivesBound,
2176                lifetime.ident.into(),
2177            )),
2178            GenericBound::Use(args, span) => hir::GenericBound::Use(
2179                self.lower_precise_capturing_args(args),
2180                self.lower_span(*span),
2181            ),
2182        }
2183    }
2184
2185    fn lower_lifetime(
2186        &mut self,
2187        l: &Lifetime,
2188        source: LifetimeSource,
2189        syntax: LifetimeSyntax,
2190    ) -> &'hir hir::Lifetime {
2191        self.new_named_lifetime(l.id, l.id, l.ident, source, syntax)
2192    }
2193
2194    fn lower_lifetime_hidden_in_path(
2195        &mut self,
2196        id: NodeId,
2197        span: Span,
2198        angle_brackets: AngleBrackets,
2199    ) -> &'hir hir::Lifetime {
2200        self.new_named_lifetime(
2201            id,
2202            id,
2203            Ident::new(kw::UnderscoreLifetime, span),
2204            LifetimeSource::Path { angle_brackets },
2205            LifetimeSyntax::Implicit,
2206        )
2207    }
2208
2209    #[allow(clippy :: suspicious_else_formatting)]
{
    let __tracing_attr_span;
    let __tracing_attr_guard;
    if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::DEBUG <=
                    ::tracing::level_filters::LevelFilter::current() ||
            { false } {
        __tracing_attr_span =
            {
                use ::tracing::__macro_support::Callsite as _;
                static __CALLSITE: ::tracing::callsite::DefaultCallsite =
                    {
                        static META: ::tracing::Metadata<'static> =
                            {
                                ::tracing_core::metadata::Metadata::new("new_named_lifetime",
                                    "rustc_ast_lowering", ::tracing::Level::DEBUG,
                                    ::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
                                    ::tracing_core::__macro_support::Option::Some(2209u32),
                                    ::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
                                    ::tracing_core::field::FieldSet::new(&[{
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("id")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("id");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("new_id")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("new_id");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("ident")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("ident");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("source")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("source");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("syntax")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("syntax");
                                                        NAME.as_str()
                                                    }], ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                    ::tracing::metadata::Kind::SPAN)
                            };
                        ::tracing::callsite::DefaultCallsite::new(&META)
                    };
                let mut interest = ::tracing::subscriber::Interest::never();
                if ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::STATIC_MAX_LEVEL &&
                                ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::LevelFilter::current() &&
                            { interest = __CALLSITE.interest(); !interest.is_never() }
                        &&
                        ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                            interest) {
                    let meta = __CALLSITE.metadata();
                    ::tracing::Span::new(meta,
                        &{
                                #[allow(unused_imports)]
                                use ::tracing::field::{debug, display, Value};
                                meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&id)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&new_id)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&ident)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&source)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&syntax)
                                                            as &dyn ::tracing::field::Value))])
                            })
                } else {
                    let span =
                        ::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
                    {};
                    span
                }
            };
        __tracing_attr_guard = __tracing_attr_span.enter();
    }

    #[warn(clippy :: suspicious_else_formatting)]
    {

        #[allow(unknown_lints, unreachable_code, clippy ::
        diverging_sub_expression, clippy :: empty_loop, clippy ::
        let_unit_value, clippy :: let_with_type_underscore, clippy ::
        needless_return, clippy :: unreachable)]
        if false {
            let __tracing_attr_fake_return: &'hir hir::Lifetime = loop {};
            return __tracing_attr_fake_return;
        }
        {
            let res =
                if let Some(res) = self.owner.get_lifetime_res(id) {
                    match res {
                        LifetimeRes::Param { param, .. } =>
                            hir::LifetimeKind::Param(param),
                        LifetimeRes::Fresh { param, .. } => {
                            {
                                match (&ident.name, &kw::UnderscoreLifetime) {
                                    (left_val, right_val) => {
                                        if !(*left_val == *right_val) {
                                            let kind = ::core::panicking::AssertKind::Eq;
                                            ::core::panicking::assert_failed(kind, &*left_val,
                                                &*right_val, ::core::option::Option::None);
                                        }
                                    }
                                }
                            };
                            let param = self.local_def_id(param);
                            hir::LifetimeKind::Param(param)
                        }
                        LifetimeRes::Infer => {
                            {
                                match (&ident.name, &kw::UnderscoreLifetime) {
                                    (left_val, right_val) => {
                                        if !(*left_val == *right_val) {
                                            let kind = ::core::panicking::AssertKind::Eq;
                                            ::core::panicking::assert_failed(kind, &*left_val,
                                                &*right_val, ::core::option::Option::None);
                                        }
                                    }
                                }
                            };
                            hir::LifetimeKind::Infer
                        }
                        LifetimeRes::Static { .. } => {
                            if !#[allow(non_exhaustive_omitted_patterns)] match ident.name
                                        {
                                        kw::StaticLifetime | kw::UnderscoreLifetime => true,
                                        _ => false,
                                    } {
                                ::core::panicking::panic("assertion failed: matches!(ident.name, kw::StaticLifetime | kw::UnderscoreLifetime)")
                            };
                            hir::LifetimeKind::Static
                        }
                        LifetimeRes::Error(guar) => hir::LifetimeKind::Error(guar),
                        LifetimeRes::ElidedAnchor { .. } => {
                            {
                                ::core::panicking::panic_fmt(format_args!("Unexpected `ElidedAnchar` {0:?} at {1:?}",
                                        ident, ident.span));
                            };
                        }
                    }
                } else {
                    hir::LifetimeKind::Error(self.dcx().span_delayed_bug(ident.span,
                            "unresolved lifetime"))
                };
            {
                use ::tracing::__macro_support::Callsite as _;
                static __CALLSITE: ::tracing::callsite::DefaultCallsite =
                    {
                        static META: ::tracing::Metadata<'static> =
                            {
                                ::tracing_core::metadata::Metadata::new("event compiler/rustc_ast_lowering/src/lib.rs:2243",
                                    "rustc_ast_lowering", ::tracing::Level::DEBUG,
                                    ::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
                                    ::tracing_core::__macro_support::Option::Some(2243u32),
                                    ::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
                                    ::tracing_core::field::FieldSet::new(&[{
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("res")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("res");
                                                        NAME.as_str()
                                                    }], ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                    ::tracing::metadata::Kind::EVENT)
                            };
                        ::tracing::callsite::DefaultCallsite::new(&META)
                    };
                let enabled =
                    ::tracing::Level::DEBUG <=
                                ::tracing::level_filters::STATIC_MAX_LEVEL &&
                            ::tracing::Level::DEBUG <=
                                ::tracing::level_filters::LevelFilter::current() &&
                        {
                            let interest = __CALLSITE.interest();
                            !interest.is_never() &&
                                ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                                    interest)
                        };
                if enabled {
                    (|value_set: ::tracing::field::ValueSet|
                                {
                                    let meta = __CALLSITE.metadata();
                                    ::tracing::Event::dispatch(meta, &value_set);
                                    ;
                                })({
                            #[allow(unused_imports)]
                            use ::tracing::field::{debug, display, Value};
                            __CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&res)
                                                        as &dyn ::tracing::field::Value))])
                        });
                } else { ; }
            };
            self.arena.alloc(hir::Lifetime::new(self.lower_node_id(new_id),
                    self.lower_ident(ident), res, source, syntax))
        }
    }
}#[instrument(level = "debug", skip(self))]
2210    fn new_named_lifetime(
2211        &mut self,
2212        id: NodeId,
2213        new_id: NodeId,
2214        ident: Ident,
2215        source: LifetimeSource,
2216        syntax: LifetimeSyntax,
2217    ) -> &'hir hir::Lifetime {
2218        let res = if let Some(res) = self.owner.get_lifetime_res(id) {
2219            match res {
2220                LifetimeRes::Param { param, .. } => hir::LifetimeKind::Param(param),
2221                LifetimeRes::Fresh { param, .. } => {
2222                    assert_eq!(ident.name, kw::UnderscoreLifetime);
2223                    let param = self.local_def_id(param);
2224                    hir::LifetimeKind::Param(param)
2225                }
2226                LifetimeRes::Infer => {
2227                    assert_eq!(ident.name, kw::UnderscoreLifetime);
2228                    hir::LifetimeKind::Infer
2229                }
2230                LifetimeRes::Static { .. } => {
2231                    assert!(matches!(ident.name, kw::StaticLifetime | kw::UnderscoreLifetime));
2232                    hir::LifetimeKind::Static
2233                }
2234                LifetimeRes::Error(guar) => hir::LifetimeKind::Error(guar),
2235                LifetimeRes::ElidedAnchor { .. } => {
2236                    panic!("Unexpected `ElidedAnchar` {:?} at {:?}", ident, ident.span);
2237                }
2238            }
2239        } else {
2240            hir::LifetimeKind::Error(self.dcx().span_delayed_bug(ident.span, "unresolved lifetime"))
2241        };
2242
2243        debug!(?res);
2244        self.arena.alloc(hir::Lifetime::new(
2245            self.lower_node_id(new_id),
2246            self.lower_ident(ident),
2247            res,
2248            source,
2249            syntax,
2250        ))
2251    }
2252
2253    fn lower_generic_params_mut(
2254        &mut self,
2255        params: &[GenericParam],
2256        source: hir::GenericParamSource,
2257    ) -> impl Iterator<Item = hir::GenericParam<'hir>> {
2258        params.iter().map(move |param| self.lower_generic_param(param, source))
2259    }
2260
2261    fn lower_generic_params(
2262        &mut self,
2263        params: &[GenericParam],
2264        source: hir::GenericParamSource,
2265    ) -> &'hir [hir::GenericParam<'hir>] {
2266        self.arena.alloc_from_iter(self.lower_generic_params_mut(params, source))
2267    }
2268
2269    #[allow(clippy :: suspicious_else_formatting)]
{
    let __tracing_attr_span;
    let __tracing_attr_guard;
    if ::tracing::Level::TRACE <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::TRACE <=
                    ::tracing::level_filters::LevelFilter::current() ||
            { false } {
        __tracing_attr_span =
            {
                use ::tracing::__macro_support::Callsite as _;
                static __CALLSITE: ::tracing::callsite::DefaultCallsite =
                    {
                        static META: ::tracing::Metadata<'static> =
                            {
                                ::tracing_core::metadata::Metadata::new("lower_generic_param",
                                    "rustc_ast_lowering", ::tracing::Level::TRACE,
                                    ::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
                                    ::tracing_core::__macro_support::Option::Some(2269u32),
                                    ::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
                                    ::tracing_core::field::FieldSet::new(&[{
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("param")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("param");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("source")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("source");
                                                        NAME.as_str()
                                                    }], ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                    ::tracing::metadata::Kind::SPAN)
                            };
                        ::tracing::callsite::DefaultCallsite::new(&META)
                    };
                let mut interest = ::tracing::subscriber::Interest::never();
                if ::tracing::Level::TRACE <=
                                    ::tracing::level_filters::STATIC_MAX_LEVEL &&
                                ::tracing::Level::TRACE <=
                                    ::tracing::level_filters::LevelFilter::current() &&
                            { interest = __CALLSITE.interest(); !interest.is_never() }
                        &&
                        ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                            interest) {
                    let meta = __CALLSITE.metadata();
                    ::tracing::Span::new(meta,
                        &{
                                #[allow(unused_imports)]
                                use ::tracing::field::{debug, display, Value};
                                meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&param)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&source)
                                                            as &dyn ::tracing::field::Value))])
                            })
                } else {
                    let span =
                        ::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
                    {};
                    span
                }
            };
        __tracing_attr_guard = __tracing_attr_span.enter();
    }

    #[warn(clippy :: suspicious_else_formatting)]
    {

        #[allow(unknown_lints, unreachable_code, clippy ::
        diverging_sub_expression, clippy :: empty_loop, clippy ::
        let_unit_value, clippy :: let_with_type_underscore, clippy ::
        needless_return, clippy :: unreachable)]
        if false {
            let __tracing_attr_fake_return: hir::GenericParam<'hir> = loop {};
            return __tracing_attr_fake_return;
        }
        {
            let (name, kind) = self.lower_generic_param_kind(param, source);
            let hir_id = self.lower_node_id(param.id);
            let param_attrs = &param.attrs;
            let param_span = param.span();
            let param =
                hir::GenericParam {
                    hir_id,
                    def_id: self.local_def_id(param.id),
                    name,
                    span: self.lower_span(param.span()),
                    pure_wrt_drop: attr::contains_name(&param.attrs,
                        sym::may_dangle),
                    kind,
                    colon_span: param.colon_span.map(|s| self.lower_span(s)),
                    source,
                };
            self.lower_attrs(hir_id, param_attrs, param_span,
                Target::from(&param));
            param
        }
    }
}#[instrument(level = "trace", skip(self))]
2270    fn lower_generic_param(
2271        &mut self,
2272        param: &GenericParam,
2273        source: hir::GenericParamSource,
2274    ) -> hir::GenericParam<'hir> {
2275        let (name, kind) = self.lower_generic_param_kind(param, source);
2276
2277        let hir_id = self.lower_node_id(param.id);
2278        let param_attrs = &param.attrs;
2279        let param_span = param.span();
2280        let param = hir::GenericParam {
2281            hir_id,
2282            def_id: self.local_def_id(param.id),
2283            name,
2284            span: self.lower_span(param.span()),
2285            pure_wrt_drop: attr::contains_name(&param.attrs, sym::may_dangle),
2286            kind,
2287            colon_span: param.colon_span.map(|s| self.lower_span(s)),
2288            source,
2289        };
2290        self.lower_attrs(hir_id, param_attrs, param_span, Target::from(&param));
2291        param
2292    }
2293
2294    fn lower_generic_param_kind(
2295        &mut self,
2296        param: &GenericParam,
2297        source: hir::GenericParamSource,
2298    ) -> (hir::ParamName, hir::GenericParamKind<'hir>) {
2299        match &param.kind {
2300            GenericParamKind::Lifetime => {
2301                // AST resolution emitted an error on those parameters, so we lower them using
2302                // `ParamName::Error`.
2303                let ident = self.lower_ident(param.ident);
2304                let param_name =
2305                    if let Some(LifetimeRes::Error(..)) = self.owner.get_lifetime_res(param.id) {
2306                        ParamName::Error(ident)
2307                    } else {
2308                        ParamName::Plain(ident)
2309                    };
2310                let kind =
2311                    hir::GenericParamKind::Lifetime { kind: hir::LifetimeParamKind::Explicit };
2312
2313                (param_name, kind)
2314            }
2315            GenericParamKind::Type { default, .. } => {
2316                // Not only do we deny type param defaults in binders but we also map them to `None`
2317                // since later compiler stages cannot handle them (and shouldn't need to be able to).
2318                let default = default
2319                    .as_ref()
2320                    .filter(|_| match source {
2321                        hir::GenericParamSource::Generics => true,
2322                        hir::GenericParamSource::Binder => {
2323                            self.dcx().emit_err(diagnostics::GenericParamDefaultInBinder {
2324                                span: param.span(),
2325                            });
2326
2327                            false
2328                        }
2329                    })
2330                    .map(|def| {
2331                        self.lower_ty_alloc(
2332                            def,
2333                            ImplTraitContext::Disallowed(ImplTraitPosition::GenericDefault),
2334                        )
2335                    });
2336
2337                let kind = hir::GenericParamKind::Type { default, synthetic: false };
2338
2339                (hir::ParamName::Plain(self.lower_ident(param.ident)), kind)
2340            }
2341            GenericParamKind::Const { ty, span: _, default } => {
2342                let ty = self.lower_ty_alloc(
2343                    ty,
2344                    ImplTraitContext::Disallowed(ImplTraitPosition::GenericDefault),
2345                );
2346
2347                // Not only do we deny const param defaults in binders but we also map them to `None`
2348                // since later compiler stages cannot handle them (and shouldn't need to be able to).
2349                let default = default
2350                    .as_ref()
2351                    .filter(|anon_const| match source {
2352                        hir::GenericParamSource::Generics => true,
2353                        hir::GenericParamSource::Binder => {
2354                            let err =
2355                                diagnostics::GenericParamDefaultInBinder { span: param.span() };
2356                            if expr::WillCreateDefIdsVisitor
2357                                .visit_expr(&anon_const.value)
2358                                .is_break()
2359                            {
2360                                // FIXME(mgca): make this non-fatal once we have a better way
2361                                // to handle nested items in anno const from binder
2362                                // Issue: https://github.com/rust-lang/rust/issues/123629
2363                                self.dcx().emit_fatal(err)
2364                            } else {
2365                                self.dcx().emit_err(err);
2366                                false
2367                            }
2368                        }
2369                    })
2370                    .map(|def| self.lower_anon_const_to_const_arg_and_alloc(def));
2371
2372                (
2373                    hir::ParamName::Plain(self.lower_ident(param.ident)),
2374                    hir::GenericParamKind::Const { ty, default },
2375                )
2376            }
2377        }
2378    }
2379
2380    fn lower_trait_ref(
2381        &mut self,
2382        modifiers: ast::TraitBoundModifiers,
2383        p: &TraitRef,
2384        itctx: ImplTraitContext,
2385    ) -> hir::TraitRef<'hir> {
2386        let path = match self.lower_qpath(
2387            p.ref_id,
2388            &None,
2389            &p.path,
2390            ParamMode::Explicit,
2391            AllowReturnTypeNotation::No,
2392            itctx,
2393            Some(modifiers),
2394        ) {
2395            hir::QPath::Resolved(None, path) => path,
2396            qpath => {
    ::core::panicking::panic_fmt(format_args!("lower_trait_ref: unexpected QPath `{0:?}`",
            qpath));
}panic!("lower_trait_ref: unexpected QPath `{qpath:?}`"),
2397        };
2398        hir::TraitRef { path, hir_ref_id: self.lower_node_id(p.ref_id) }
2399    }
2400
2401    #[allow(clippy :: suspicious_else_formatting)]
{
    let __tracing_attr_span;
    let __tracing_attr_guard;
    if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::DEBUG <=
                    ::tracing::level_filters::LevelFilter::current() ||
            { false } {
        __tracing_attr_span =
            {
                use ::tracing::__macro_support::Callsite as _;
                static __CALLSITE: ::tracing::callsite::DefaultCallsite =
                    {
                        static META: ::tracing::Metadata<'static> =
                            {
                                ::tracing_core::metadata::Metadata::new("lower_poly_trait_ref",
                                    "rustc_ast_lowering", ::tracing::Level::DEBUG,
                                    ::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
                                    ::tracing_core::__macro_support::Option::Some(2401u32),
                                    ::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
                                    ::tracing_core::field::FieldSet::new(&[{
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("bound_generic_params")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("bound_generic_params");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("modifiers")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("modifiers");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("trait_ref")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("trait_ref");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("span")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("span");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("rbp")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("rbp");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("itctx")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("itctx");
                                                        NAME.as_str()
                                                    }], ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                    ::tracing::metadata::Kind::SPAN)
                            };
                        ::tracing::callsite::DefaultCallsite::new(&META)
                    };
                let mut interest = ::tracing::subscriber::Interest::never();
                if ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::STATIC_MAX_LEVEL &&
                                ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::LevelFilter::current() &&
                            { interest = __CALLSITE.interest(); !interest.is_never() }
                        &&
                        ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                            interest) {
                    let meta = __CALLSITE.metadata();
                    ::tracing::Span::new(meta,
                        &{
                                #[allow(unused_imports)]
                                use ::tracing::field::{debug, display, Value};
                                meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&bound_generic_params)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&modifiers)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&trait_ref)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&span)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&rbp)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&itctx)
                                                            as &dyn ::tracing::field::Value))])
                            })
                } else {
                    let span =
                        ::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
                    {};
                    span
                }
            };
        __tracing_attr_guard = __tracing_attr_span.enter();
    }

    #[warn(clippy :: suspicious_else_formatting)]
    {

        #[allow(unknown_lints, unreachable_code, clippy ::
        diverging_sub_expression, clippy :: empty_loop, clippy ::
        let_unit_value, clippy :: let_with_type_underscore, clippy ::
        needless_return, clippy :: unreachable)]
        if false {
            let __tracing_attr_fake_return: hir::PolyTraitRef<'hir> = loop {};
            return __tracing_attr_fake_return;
        }
        {
            let bound_generic_params =
                self.lower_lifetime_binder(trait_ref.ref_id,
                    bound_generic_params);
            let trait_ref =
                self.lower_trait_ref(*modifiers, trait_ref, itctx);
            let modifiers = self.lower_trait_bound_modifiers(*modifiers);
            if let ast::BoundPolarity::Maybe(_) = modifiers.polarity {
                self.validate_relaxed_bound(trait_ref, *span, rbp);
            }
            hir::PolyTraitRef {
                bound_generic_params,
                modifiers,
                trait_ref,
                span: self.lower_span(*span),
            }
        }
    }
}#[instrument(level = "debug", skip(self))]
2402    fn lower_poly_trait_ref(
2403        &mut self,
2404        PolyTraitRef { bound_generic_params, modifiers, trait_ref, span, parens: _ }: &PolyTraitRef,
2405        rbp: RelaxedBoundPolicy<'_>,
2406        itctx: ImplTraitContext,
2407    ) -> hir::PolyTraitRef<'hir> {
2408        let bound_generic_params =
2409            self.lower_lifetime_binder(trait_ref.ref_id, bound_generic_params);
2410        let trait_ref = self.lower_trait_ref(*modifiers, trait_ref, itctx);
2411        let modifiers = self.lower_trait_bound_modifiers(*modifiers);
2412
2413        if let ast::BoundPolarity::Maybe(_) = modifiers.polarity {
2414            self.validate_relaxed_bound(trait_ref, *span, rbp);
2415        }
2416
2417        hir::PolyTraitRef {
2418            bound_generic_params,
2419            modifiers,
2420            trait_ref,
2421            span: self.lower_span(*span),
2422        }
2423    }
2424
2425    fn validate_relaxed_bound(
2426        &self,
2427        trait_ref: hir::TraitRef<'_>,
2428        span: Span,
2429        rbp: RelaxedBoundPolicy<'_>,
2430    ) {
2431        // Even though feature `more_maybe_bounds` enables the user to relax all default bounds
2432        // other than `Sized` in a lot more positions (thereby bypassing the given policy), we don't
2433        // want to advertise it to the user (via a feature gate error) since it's super internal.
2434        //
2435        // FIXME(more_maybe_bounds): Moreover, if we actually were to add proper default traits
2436        // (like a hypothetical `Move` or `Leak`) we would want to validate the location according
2437        // to default trait elaboration in HIR ty lowering (which depends on the specific trait in
2438        // question: E.g., `?Sized` & `?Move` most likely won't be allowed in all the same places).
2439
2440        match rbp {
2441            RelaxedBoundPolicy::Allowed(dedup_map) => {
2442                // `trait_def_id` only returns `None` for errors during resolution.
2443                let Some(trait_def_id) = trait_ref.trait_def_id() else { return };
2444                let tcx = self.tcx;
2445                let err = |s| {
2446                    let name = tcx.item_name(trait_def_id);
2447                    tcx.dcx()
2448                        .struct_span_err(
2449                            ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
        [span, s]))vec![span, s],
2450                            ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("duplicate relaxed `{0}` bounds",
                name))
    })format!("duplicate relaxed `{name}` bounds"),
2451                        )
2452                        .with_code(E0203)
2453                        .emit();
2454                };
2455                dedup_map.entry(trait_def_id).and_modify(|&mut s| err(s)).or_insert(span);
2456                return;
2457            }
2458            RelaxedBoundPolicy::Forbidden(reason) => {
2459                let gate = |context, subject| {
2460                    let extended = self.tcx.features().more_maybe_bounds();
2461                    let is_sized = trait_ref
2462                        .trait_def_id()
2463                        .is_some_and(|def_id| self.tcx.is_lang_item(def_id, LangItem::Sized));
2464
2465                    if extended && !is_sized {
2466                        return;
2467                    }
2468
2469                    let prefix = if extended { "`Sized` " } else { "" };
2470                    let mut diag = self.dcx().struct_span_err(
2471                        span,
2472                        ::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("relaxed {0}bounds are not permitted in {1}",
                prefix, context))
    })format!("relaxed {prefix}bounds are not permitted in {context}"),
2473                    );
2474                    if is_sized {
2475                        diag.note(::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("{0} are not implicitly bounded by `Sized`, so there is nothing to relax",
                subject))
    })format!(
2476                            "{subject} are not implicitly bounded by `Sized`, \
2477                             so there is nothing to relax"
2478                        ));
2479                    }
2480                    diag.emit();
2481                };
2482
2483                match reason {
2484                    RelaxedBoundForbiddenReason::TraitObjectTy => {
2485                        gate("trait object types", "trait object types");
2486                        return;
2487                    }
2488                    RelaxedBoundForbiddenReason::SuperTrait => {
2489                        gate("supertrait bounds", "traits");
2490                        return;
2491                    }
2492                    RelaxedBoundForbiddenReason::TraitAlias => {
2493                        gate("trait alias bounds", "trait aliases");
2494                        return;
2495                    }
2496                    RelaxedBoundForbiddenReason::AssocTyBounds
2497                    | RelaxedBoundForbiddenReason::WhereBound => {}
2498                };
2499            }
2500        }
2501
2502        self.dcx()
2503            .struct_span_err(span, "this relaxed bound is not permitted here")
2504            .with_note(
2505                "in this context, relaxed bounds are only allowed on \
2506                 type parameters defined on the closest item",
2507            )
2508            .emit();
2509    }
2510
2511    fn lower_mt(&mut self, mt: &MutTy, itctx: ImplTraitContext) -> hir::MutTy<'hir> {
2512        hir::MutTy { ty: self.lower_ty_alloc(&mt.ty, itctx), mutbl: mt.mutbl }
2513    }
2514
2515    x;#[instrument(level = "debug", skip(self), ret)]
2516    fn lower_param_bounds(
2517        &mut self,
2518        bounds: &[GenericBound],
2519        rbp: RelaxedBoundPolicy<'_>,
2520        itctx: ImplTraitContext,
2521    ) -> hir::GenericBounds<'hir> {
2522        self.arena.alloc_from_iter(self.lower_param_bounds_mut(bounds, rbp, itctx))
2523    }
2524
2525    fn lower_param_bounds_mut(
2526        &mut self,
2527        bounds: &[GenericBound],
2528        mut rbp: RelaxedBoundPolicy<'_>,
2529        itctx: ImplTraitContext,
2530    ) -> impl Iterator<Item = hir::GenericBound<'hir>> {
2531        bounds.iter().map(move |bound| self.lower_param_bound(bound, rbp.reborrow(), itctx))
2532    }
2533
2534    x;#[instrument(level = "debug", skip(self), ret)]
2535    fn lower_universal_param_and_bounds(
2536        &mut self,
2537        node_id: NodeId,
2538        span: Span,
2539        ident: Ident,
2540        bounds: &[GenericBound],
2541    ) -> (hir::GenericParam<'hir>, Option<hir::WherePredicate<'hir>>, hir::TyKind<'hir>) {
2542        // Add a definition for the in-band `Param`.
2543        let def_id = self.local_def_id(node_id);
2544        let span = self.lower_span(span);
2545
2546        // Set the name to `impl Bound1 + Bound2`.
2547        let param = hir::GenericParam {
2548            hir_id: self.lower_node_id(node_id),
2549            def_id,
2550            name: ParamName::Plain(self.lower_ident(ident)),
2551            pure_wrt_drop: false,
2552            span,
2553            kind: hir::GenericParamKind::Type { default: None, synthetic: true },
2554            colon_span: None,
2555            source: hir::GenericParamSource::Generics,
2556        };
2557
2558        let preds = self.lower_generic_bound_predicate(
2559            ident,
2560            node_id,
2561            &GenericParamKind::Type { default: None },
2562            bounds,
2563            /* colon_span */ None,
2564            span,
2565            RelaxedBoundPolicy::Allowed(&mut Default::default()),
2566            ImplTraitContext::Universal,
2567            hir::PredicateOrigin::ImplTrait,
2568        );
2569
2570        let hir_id = self.next_id();
2571        let res = Res::Def(DefKind::TyParam, def_id.to_def_id());
2572        let ty = hir::TyKind::Path(hir::QPath::Resolved(
2573            None,
2574            self.arena.alloc(hir::Path {
2575                span,
2576                res,
2577                segments:
2578                    arena_vec![self; hir::PathSegment::new(self.lower_ident(ident), hir_id, res)],
2579            }),
2580        ));
2581
2582        (param, preds, ty)
2583    }
2584
2585    /// Lowers a block directly to an expression, presuming that it
2586    /// has no attributes and is not targeted by a `break`.
2587    fn lower_block_expr(&mut self, b: &Block) -> hir::Expr<'hir> {
2588        let block = self.lower_block(b, false);
2589        self.expr_block(block)
2590    }
2591
2592    fn lower_array_length_to_const_arg(&mut self, c: &AnonConst) -> &'hir hir::ConstArg<'hir> {
2593        // We cannot just match on `ExprKind::Underscore` as `(_)` is represented as
2594        // `ExprKind::Paren(ExprKind::Underscore)` and should also be lowered to `GenericArg::Infer`
2595        match c.value.peel_parens().kind {
2596            ExprKind::Underscore => {
2597                let ct_kind = hir::ConstArgKind::Infer(());
2598                self.arena.alloc(hir::ConstArg {
2599                    hir_id: self.lower_node_id(c.id),
2600                    kind: ct_kind,
2601                    span: self.lower_span(c.value.span),
2602                })
2603            }
2604            _ => self.lower_anon_const_to_const_arg_and_alloc(c),
2605        }
2606    }
2607
2608    /// Used when lowering a type argument that turned out to actually be a const argument.
2609    ///
2610    /// Only use for that purpose since otherwise it will create a duplicate def.
2611    #[allow(clippy :: suspicious_else_formatting)]
{
    let __tracing_attr_span;
    let __tracing_attr_guard;
    if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::DEBUG <=
                    ::tracing::level_filters::LevelFilter::current() ||
            { false } {
        __tracing_attr_span =
            {
                use ::tracing::__macro_support::Callsite as _;
                static __CALLSITE: ::tracing::callsite::DefaultCallsite =
                    {
                        static META: ::tracing::Metadata<'static> =
                            {
                                ::tracing_core::metadata::Metadata::new("lower_const_path_to_const_arg",
                                    "rustc_ast_lowering", ::tracing::Level::DEBUG,
                                    ::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
                                    ::tracing_core::__macro_support::Option::Some(2611u32),
                                    ::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
                                    ::tracing_core::field::FieldSet::new(&[{
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("path")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("path");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("res")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("res");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("ty_id")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("ty_id");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("span")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("span");
                                                        NAME.as_str()
                                                    }], ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                    ::tracing::metadata::Kind::SPAN)
                            };
                        ::tracing::callsite::DefaultCallsite::new(&META)
                    };
                let mut interest = ::tracing::subscriber::Interest::never();
                if ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::STATIC_MAX_LEVEL &&
                                ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::LevelFilter::current() &&
                            { interest = __CALLSITE.interest(); !interest.is_never() }
                        &&
                        ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                            interest) {
                    let meta = __CALLSITE.metadata();
                    ::tracing::Span::new(meta,
                        &{
                                #[allow(unused_imports)]
                                use ::tracing::field::{debug, display, Value};
                                meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&path)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&res)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&ty_id)
                                                            as &dyn ::tracing::field::Value)),
                                                (::tracing::__macro_support::Option::Some(&::tracing::field::debug(&span)
                                                            as &dyn ::tracing::field::Value))])
                            })
                } else {
                    let span =
                        ::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
                    {};
                    span
                }
            };
        __tracing_attr_guard = __tracing_attr_span.enter();
    }

    #[warn(clippy :: suspicious_else_formatting)]
    {

        #[allow(unknown_lints, unreachable_code, clippy ::
        diverging_sub_expression, clippy :: empty_loop, clippy ::
        let_unit_value, clippy :: let_with_type_underscore, clippy ::
        needless_return, clippy :: unreachable)]
        if false {
            let __tracing_attr_fake_return: &'hir hir::ConstArg<'hir> =
                loop {};
            return __tracing_attr_fake_return;
        }
        {
            let tcx = self.tcx;
            let is_trivial_path =
                path.is_potential_trivial_const_arg() &&
                    #[allow(non_exhaustive_omitted_patterns)] match res {
                        Res::Def(DefKind::ConstParam, _) => true,
                        _ => false,
                    };
            let ct_kind =
                if is_trivial_path ||
                        tcx.features().macroless_generic_const_args() {
                    let qpath =
                        self.lower_qpath(ty_id, &None, path, ParamMode::Explicit,
                            AllowReturnTypeNotation::No,
                            ImplTraitContext::Disallowed(ImplTraitPosition::Path),
                            None);
                    hir::ConstArgKind::Path(qpath)
                } else {
                    let node_id = self.next_node_id();
                    let span = self.lower_span(span);
                    let def_id =
                        self.create_def(node_id, None, DefKind::AnonConst, span);
                    let hir_id = self.lower_node_id(node_id);
                    let path_expr =
                        Expr {
                            id: ty_id,
                            kind: ExprKind::Path(None, path.clone()),
                            span,
                            attrs: AttrVec::new(),
                            tokens: None,
                        };
                    let ct =
                        self.with_new_scopes(span,
                            |this|
                                {
                                    self.arena.alloc(hir::AnonConst {
                                            def_id,
                                            hir_id,
                                            body: this.lower_const_body(path_expr.span,
                                                Some(&path_expr)),
                                            span,
                                        })
                                });
                    hir::ConstArgKind::Anon(ct)
                };
            self.arena.alloc(hir::ConstArg {
                    hir_id: self.next_id(),
                    kind: ct_kind,
                    span: self.lower_span(span),
                })
        }
    }
}#[instrument(level = "debug", skip(self))]
2612    fn lower_const_path_to_const_arg(
2613        &mut self,
2614        path: &Path,
2615        res: Res<NodeId>,
2616        ty_id: NodeId,
2617        span: Span,
2618    ) -> &'hir hir::ConstArg<'hir> {
2619        let tcx = self.tcx;
2620
2621        let is_trivial_path = path.is_potential_trivial_const_arg()
2622            && matches!(res, Res::Def(DefKind::ConstParam, _));
2623        let ct_kind = if is_trivial_path || tcx.features().macroless_generic_const_args() {
2624            let qpath = self.lower_qpath(
2625                ty_id,
2626                &None,
2627                path,
2628                ParamMode::Explicit,
2629                AllowReturnTypeNotation::No,
2630                // FIXME(mgca): update for `fn foo() -> Bar<FOO<impl Trait>>` support
2631                ImplTraitContext::Disallowed(ImplTraitPosition::Path),
2632                None,
2633            );
2634            hir::ConstArgKind::Path(qpath)
2635        } else {
2636            // Construct an AnonConst where the expr is the "ty"'s path.
2637            let node_id = self.next_node_id();
2638            let span = self.lower_span(span);
2639
2640            // Add a definition for the in-band const def.
2641            // We're lowering a const argument that was originally thought to be a type argument,
2642            // so the def collector didn't create the def ahead of time. That's why we have to do
2643            // it here.
2644            let def_id = self.create_def(node_id, None, DefKind::AnonConst, span);
2645            let hir_id = self.lower_node_id(node_id);
2646
2647            let path_expr = Expr {
2648                id: ty_id,
2649                kind: ExprKind::Path(None, path.clone()),
2650                span,
2651                attrs: AttrVec::new(),
2652                tokens: None,
2653            };
2654
2655            let ct = self.with_new_scopes(span, |this| {
2656                self.arena.alloc(hir::AnonConst {
2657                    def_id,
2658                    hir_id,
2659                    body: this.lower_const_body(path_expr.span, Some(&path_expr)),
2660                    span,
2661                })
2662            });
2663            hir::ConstArgKind::Anon(ct)
2664        };
2665
2666        self.arena.alloc(hir::ConstArg {
2667            hir_id: self.next_id(),
2668            kind: ct_kind,
2669            span: self.lower_span(span),
2670        })
2671    }
2672
2673    fn lower_const_item_rhs(
2674        &mut self,
2675        body: &Option<Box<Expr>>,
2676        kind: ConstItemKind,
2677        span: Span,
2678    ) -> hir::ConstItemRhs<'hir> {
2679        match (body, kind) {
2680            (body, ConstItemKind::Body) => {
2681                hir::ConstItemRhs::Body(self.lower_const_body(span, body.as_deref()))
2682            }
2683            (Some(body), ConstItemKind::TypeConst) => {
2684                hir::ConstItemRhs::TypeConst(self.arena.alloc(
2685                    match self.can_lower_expr_to_const_arg_direct(
2686                        &body,
2687                        DirectConstArgContext::MacrolessMinGenericConstArgs,
2688                    ) {
2689                        Ok(()) => self.lower_expr_to_const_arg_direct(&body, None),
2690                        Err(err) => err.emit(self),
2691                    },
2692                ))
2693            }
2694            (None, ConstItemKind::TypeConst) => {
2695                let const_arg = ConstArg {
2696                    hir_id: self.next_id(),
2697                    kind: hir::ConstArgKind::Error(
2698                        self.dcx().span_delayed_bug(DUMMY_SP, "no block"),
2699                    ),
2700                    span: DUMMY_SP,
2701                };
2702                hir::ConstItemRhs::TypeConst(self.arena.alloc(const_arg))
2703            }
2704        }
2705    }
2706
2707    x;#[instrument(level = "debug", skip(self), ret)]
2708    fn can_lower_expr_to_const_arg_direct(
2709        &mut self,
2710        expr: &Expr,
2711        context: DirectConstArgContext,
2712    ) -> Result<(), UnrepresentableConstArgError> {
2713        use DirectConstArgContext::*;
2714        // Note the only stable case is currently ExprKind::Path
2715        match (&expr.kind, context) {
2716            (
2717                ExprKind::Call(Expr { kind: ExprKind::Path(_, _), .. }, args),
2718                MacrolessMinGenericConstArgs,
2719            ) => {
2720                for arg in args {
2721                    self.can_lower_expr_to_const_arg_direct(arg, context)?;
2722                }
2723                Ok(())
2724            }
2725            (ExprKind::Tup(exprs), MacrolessMinGenericConstArgs) => {
2726                for expr in exprs {
2727                    self.can_lower_expr_to_const_arg_direct(expr, context)?;
2728                }
2729                Ok(())
2730            }
2731            (ExprKind::Path(_, _), MacrolessMinGenericConstArgs) => Ok(()),
2732            (ExprKind::Path(_, path), _) => {
2733                if path.is_potential_trivial_const_arg()
2734                    && matches!(
2735                        self.get_partial_res(expr.id)
2736                            .and_then(|partial_res| partial_res.full_res()),
2737                        Some(Res::Def(DefKind::ConstParam, _))
2738                    )
2739                {
2740                    Ok(())
2741                } else {
2742                    Err(UnrepresentableConstArgError::new(expr))
2743                }
2744            }
2745            (ExprKind::Struct(se), MacrolessMinGenericConstArgs) => {
2746                for f in &se.fields {
2747                    self.can_lower_expr_to_const_arg_direct(&f.expr, context)?;
2748                }
2749                Ok(())
2750            }
2751            (ExprKind::Array(elements), MacrolessMinGenericConstArgs) => {
2752                for element in elements {
2753                    self.can_lower_expr_to_const_arg_direct(element, context)?;
2754                }
2755                Ok(())
2756            }
2757            (ExprKind::Underscore, MacrolessMinGenericConstArgs) => Ok(()),
2758            (ExprKind::Block(block, _), MacrolessMinGenericConstArgs)
2759                if let [stmt] = block.stmts.as_slice()
2760                    && let StmtKind::Expr(expr) = &stmt.kind =>
2761            {
2762                self.can_lower_expr_to_const_arg_direct(expr, context)
2763            }
2764            (ExprKind::Lit(_), MacrolessMinGenericConstArgs) => Ok(()),
2765            (ExprKind::Unary(UnOp::Neg, inner_expr), MacrolessMinGenericConstArgs)
2766                if let ExprKind::Lit(_) = &inner_expr.kind =>
2767            {
2768                Ok(())
2769            }
2770            (ExprKind::ConstBlock(_), MacrolessMinGenericConstArgs) => Ok(()),
2771            (ExprKind::DirectConstArg(_), MacrolessMinGenericConstArgs | MinGenericConstArgs) => {
2772                // Always report this as able to be represented directly. If it turns out not to be,
2773                // `lower_expr_to_const_arg_direct` will report an error.
2774                Ok(())
2775            }
2776            _ => Err(UnrepresentableConstArgError::new(expr)),
2777        }
2778    }
2779
2780    /// It is not allowed to call this function without checking can_lower_expr_to_const_arg_direct
2781    /// first, as we assume all feature gates/etc. have been checked already.
2782    x;#[instrument(level = "debug", skip(self), ret)]
2783    fn lower_expr_to_const_arg_direct(
2784        &mut self,
2785        expr: &Expr,
2786        id_override: Option<NodeId>,
2787    ) -> hir::ConstArg<'hir> {
2788        let span = self.lower_span(expr.span);
2789        let node_id = id_override.unwrap_or(expr.id);
2790        match &expr.kind {
2791            ExprKind::Call(func, args) if let ExprKind::Path(qself, path) = &func.kind => {
2792                let qpath = self.lower_qpath(
2793                    func.id,
2794                    qself,
2795                    path,
2796                    ParamMode::Explicit,
2797                    AllowReturnTypeNotation::No,
2798                    ImplTraitContext::Disallowed(ImplTraitPosition::Path),
2799                    None,
2800                );
2801
2802                let lowered_args = self.arena.alloc_from_iter(args.iter().map(|arg| {
2803                    let const_arg = self.lower_expr_to_const_arg_direct(arg, None);
2804                    &*self.arena.alloc(const_arg)
2805                }));
2806
2807                ConstArg {
2808                    hir_id: self.lower_node_id(node_id),
2809                    kind: hir::ConstArgKind::TupleCall(qpath, lowered_args),
2810                    span,
2811                }
2812            }
2813            ExprKind::Tup(exprs) => {
2814                let exprs = self.arena.alloc_from_iter(exprs.iter().map(|expr| {
2815                    let expr = self.lower_expr_to_const_arg_direct(expr, None);
2816                    &*self.arena.alloc(expr)
2817                }));
2818
2819                ConstArg {
2820                    hir_id: self.lower_node_id(node_id),
2821                    kind: hir::ConstArgKind::Tup(exprs),
2822                    span,
2823                }
2824            }
2825            ExprKind::Path(qself, path) => {
2826                let qpath = self.lower_qpath(
2827                    expr.id,
2828                    qself,
2829                    path,
2830                    ParamMode::Explicit,
2831                    AllowReturnTypeNotation::No,
2832                    // FIXME(mgca): update for `fn foo() -> Bar<FOO<impl Trait>>` support
2833                    ImplTraitContext::Disallowed(ImplTraitPosition::Path),
2834                    None,
2835                );
2836
2837                ConstArg {
2838                    hir_id: self.lower_node_id(node_id),
2839                    kind: hir::ConstArgKind::Path(qpath),
2840                    span,
2841                }
2842            }
2843            ExprKind::Struct(se) => {
2844                let path = self.lower_qpath(
2845                    expr.id,
2846                    &se.qself,
2847                    &se.path,
2848                    // FIXME(mgca): we may want this to be `Optional` instead, but
2849                    // we would also need to make sure that HIR ty lowering errors
2850                    // when these paths wind up in signatures.
2851                    ParamMode::Explicit,
2852                    AllowReturnTypeNotation::No,
2853                    ImplTraitContext::Disallowed(ImplTraitPosition::Path),
2854                    None,
2855                );
2856
2857                let fields = self.arena.alloc_from_iter(se.fields.iter().map(|f| {
2858                    let hir_id = self.lower_node_id(f.id);
2859                    // FIXME(mgca): This might result in lowering attributes that
2860                    // then go unused as the `Target::ExprField` is not actually
2861                    // corresponding to `Node::ExprField`.
2862                    self.lower_attrs(hir_id, &f.attrs, f.span, Target::ExprField);
2863                    let expr = self.lower_expr_to_const_arg_direct(&f.expr, None);
2864
2865                    &*self.arena.alloc(hir::ConstArgExprField {
2866                        hir_id,
2867                        field: self.lower_ident(f.ident),
2868                        expr: self.arena.alloc(expr),
2869                        span: self.lower_span(f.span),
2870                    })
2871                }));
2872
2873                ConstArg {
2874                    hir_id: self.lower_node_id(node_id),
2875                    kind: hir::ConstArgKind::Struct(path, fields),
2876                    span,
2877                }
2878            }
2879            ExprKind::Array(elements) => {
2880                let lowered_elems = self.arena.alloc_from_iter(elements.iter().map(|element| {
2881                    let const_arg = self.lower_expr_to_const_arg_direct(element, None);
2882                    &*self.arena.alloc(const_arg)
2883                }));
2884                let array_expr = self.arena.alloc(hir::ConstArgArrayExpr {
2885                    span: self.lower_span(expr.span),
2886                    elems: lowered_elems,
2887                });
2888
2889                ConstArg {
2890                    hir_id: self.lower_node_id(node_id),
2891                    kind: hir::ConstArgKind::Array(array_expr),
2892                    span,
2893                }
2894            }
2895            ExprKind::Underscore => ConstArg {
2896                hir_id: self.lower_node_id(node_id),
2897                kind: hir::ConstArgKind::Infer(()),
2898                span,
2899            },
2900            ExprKind::Block(block, _)
2901                if let [stmt] = block.stmts.as_slice()
2902                    && let StmtKind::Expr(expr) = &stmt.kind =>
2903            {
2904                return self.lower_expr_to_const_arg_direct(expr, id_override);
2905            }
2906            ExprKind::Lit(literal) => {
2907                let span = self.lower_span(expr.span);
2908                let literal = self.lower_lit(literal, span);
2909
2910                ConstArg {
2911                    hir_id: self.lower_node_id(node_id),
2912                    kind: hir::ConstArgKind::Literal { lit: literal.node, negated: false },
2913                    span,
2914                }
2915            }
2916            ExprKind::Unary(UnOp::Neg, inner_expr)
2917                if let ExprKind::Lit(literal) = &inner_expr.kind =>
2918            {
2919                let span = self.lower_span(expr.span);
2920                let literal = self.lower_lit(literal, span);
2921
2922                let kind = if !matches!(literal.node, LitKind::Int(..)) {
2923                    let err =
2924                        self.dcx().struct_span_err(expr.span, "negated literal must be an integer");
2925                    hir::ConstArgKind::Error(err.emit())
2926                } else {
2927                    hir::ConstArgKind::Literal { lit: literal.node, negated: true }
2928                };
2929                ConstArg { hir_id: self.lower_node_id(node_id), kind, span }
2930            }
2931            ExprKind::ConstBlock(anon_const) => {
2932                // Do not use lower_anon_const_to_const_arg, as that attempts to represent the body
2933                // directly. Instead, force an anon const.
2934                let def_id = self.local_def_id(anon_const.id);
2935                assert_eq!(DefKind::AnonConst, self.tcx.def_kind(def_id));
2936                let lowered_anon = self.lower_anon_const_to_anon_const(anon_const, span);
2937                ConstArg {
2938                    hir_id: self.lower_node_id(node_id),
2939                    kind: hir::ConstArgKind::Anon(lowered_anon),
2940                    span,
2941                }
2942            }
2943            ExprKind::DirectConstArg(expr) => {
2944                // `can_lower_expr_to_const_arg_direct` always returns success upon encountering a
2945                // ExprKind::DirectConstArg, which effectively forces the expression to be lowered
2946                // as a direct arg. If it actually turns out to not be possible, emit an error
2947                // instead.
2948                // Always use MacrolessMinGenericConstArgs, even if we're under regular GCA, because
2949                // that's what the macro means: to enter a context that is like macroless GCA.
2950                match self.can_lower_expr_to_const_arg_direct(
2951                    expr,
2952                    DirectConstArgContext::MacrolessMinGenericConstArgs,
2953                ) {
2954                    Ok(()) => self.lower_expr_to_const_arg_direct(expr, id_override),
2955                    Err(err) => err.emit(self),
2956                }
2957            }
2958            _ => {
2959                span_bug!(
2960                    expr.span,
2961                    "lower_expr_to_const_arg_direct encountered an unlowerable expression, either \
2962                    can_lower_expr_to_const_arg_direct returned Ok() on something it shouldn't \
2963                    have, or you forgot to check can_lower_expr_to_const_arg_direct first"
2964                );
2965            }
2966        }
2967    }
2968
2969    /// See [`hir::ConstArg`] for when to use this function vs
2970    /// [`Self::lower_anon_const_to_anon_const`].
2971    fn lower_anon_const_to_const_arg_and_alloc(
2972        &mut self,
2973        anon: &AnonConst,
2974    ) -> &'hir hir::ConstArg<'hir> {
2975        self.arena.alloc(self.lower_anon_const_to_const_arg(anon))
2976    }
2977
2978    #[allow(clippy :: suspicious_else_formatting)]
{
    let __tracing_attr_span;
    let __tracing_attr_guard;
    if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::DEBUG <=
                    ::tracing::level_filters::LevelFilter::current() ||
            { false } {
        __tracing_attr_span =
            {
                use ::tracing::__macro_support::Callsite as _;
                static __CALLSITE: ::tracing::callsite::DefaultCallsite =
                    {
                        static META: ::tracing::Metadata<'static> =
                            {
                                ::tracing_core::metadata::Metadata::new("lower_anon_const_to_const_arg",
                                    "rustc_ast_lowering", ::tracing::Level::DEBUG,
                                    ::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
                                    ::tracing_core::__macro_support::Option::Some(2978u32),
                                    ::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
                                    ::tracing_core::field::FieldSet::new(&[{
                                                        const NAME:
                                                            ::tracing::__macro_support::FieldName<{
                                                                ::tracing::__macro_support::FieldName::len("anon")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("anon");
                                                        NAME.as_str()
                                                    }], ::tracing_core::callsite::Identifier(&__CALLSITE)),
                                    ::tracing::metadata::Kind::SPAN)
                            };
                        ::tracing::callsite::DefaultCallsite::new(&META)
                    };
                let mut interest = ::tracing::subscriber::Interest::never();
                if ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::STATIC_MAX_LEVEL &&
                                ::tracing::Level::DEBUG <=
                                    ::tracing::level_filters::LevelFilter::current() &&
                            { interest = __CALLSITE.interest(); !interest.is_never() }
                        &&
                        ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                            interest) {
                    let meta = __CALLSITE.metadata();
                    ::tracing::Span::new(meta,
                        &{
                                #[allow(unused_imports)]
                                use ::tracing::field::{debug, display, Value};
                                meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&anon)
                                                            as &dyn ::tracing::field::Value))])
                            })
                } else {
                    let span =
                        ::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
                    {};
                    span
                }
            };
        __tracing_attr_guard = __tracing_attr_span.enter();
    }

    #[warn(clippy :: suspicious_else_formatting)]
    {

        #[allow(unknown_lints, unreachable_code, clippy ::
        diverging_sub_expression, clippy :: empty_loop, clippy ::
        let_unit_value, clippy :: let_with_type_underscore, clippy ::
        needless_return, clippy :: unreachable)]
        if false {
            let __tracing_attr_fake_return: hir::ConstArg<'hir> = loop {};
            return __tracing_attr_fake_return;
        }
        {
            let expr =
                if self.tcx.features().macroless_generic_const_args() {
                    &anon.value
                } else { anon.value.maybe_unwrap_block() };
            let context =
                if self.tcx.features().macroless_generic_const_args() {
                    DirectConstArgContext::MacrolessMinGenericConstArgs
                } else if self.tcx.features().min_generic_const_args() {
                    DirectConstArgContext::MinGenericConstArgs
                } else { DirectConstArgContext::Stable };
            if self.can_lower_expr_to_const_arg_direct(expr, context).is_ok()
                {
                return self.lower_expr_to_const_arg_direct(expr,
                        Some(anon.id));
            }
            let lowered_anon =
                self.lower_anon_const_to_anon_const(anon, anon.value.span);
            ConstArg {
                hir_id: self.next_id(),
                kind: hir::ConstArgKind::Anon(lowered_anon),
                span: self.lower_span(anon.value.span),
            }
        }
    }
}#[instrument(level = "debug", skip(self))]
2979    fn lower_anon_const_to_const_arg(&mut self, anon: &AnonConst) -> hir::ConstArg<'hir> {
2980        // Stable only allows one nesting of blocks for directly represented paths. mGCA allows
2981        // arbitrarily many, and are handled inside lower_expr_to_const_arg_direct for consistency.
2982        let expr = if self.tcx.features().macroless_generic_const_args() {
2983            &anon.value
2984        } else {
2985            anon.value.maybe_unwrap_block()
2986        };
2987
2988        let context = if self.tcx.features().macroless_generic_const_args() {
2989            DirectConstArgContext::MacrolessMinGenericConstArgs
2990        } else if self.tcx.features().min_generic_const_args() {
2991            DirectConstArgContext::MinGenericConstArgs
2992        } else {
2993            DirectConstArgContext::Stable
2994        };
2995
2996        if self.can_lower_expr_to_const_arg_direct(expr, context).is_ok() {
2997            return self.lower_expr_to_const_arg_direct(expr, Some(anon.id));
2998        }
2999
3000        let lowered_anon = self.lower_anon_const_to_anon_const(anon, anon.value.span);
3001        ConstArg {
3002            hir_id: self.next_id(),
3003            kind: hir::ConstArgKind::Anon(lowered_anon),
3004            span: self.lower_span(anon.value.span),
3005        }
3006    }
3007
3008    /// See [`hir::ConstArg`] for when to use this function vs
3009    /// [`Self::lower_anon_const_to_const_arg`].
3010    fn lower_anon_const_to_anon_const(
3011        &mut self,
3012        c: &AnonConst,
3013        span: Span,
3014    ) -> &'hir hir::AnonConst {
3015        self.arena.alloc(self.with_new_scopes(c.value.span, |this| {
3016            let def_id = this.local_def_id(c.id);
3017            let hir_id = this.lower_node_id(c.id);
3018            hir::AnonConst {
3019                def_id,
3020                hir_id,
3021                body: this.lower_const_body(c.value.span, Some(&c.value)),
3022                span: this.lower_span(span),
3023            }
3024        }))
3025    }
3026
3027    fn lower_unsafe_source(&mut self, u: UnsafeSource) -> hir::UnsafeSource {
3028        match u {
3029            CompilerGenerated => hir::UnsafeSource::CompilerGenerated,
3030            UserProvided => hir::UnsafeSource::UserProvided,
3031        }
3032    }
3033
3034    fn lower_trait_bound_modifiers(
3035        &mut self,
3036        modifiers: TraitBoundModifiers,
3037    ) -> hir::TraitBoundModifiers {
3038        let constness = match modifiers.constness {
3039            BoundConstness::Never => BoundConstness::Never,
3040            BoundConstness::Always(span) => BoundConstness::Always(self.lower_span(span)),
3041            BoundConstness::Maybe(span) => BoundConstness::Maybe(self.lower_span(span)),
3042        };
3043        let polarity = match modifiers.polarity {
3044            BoundPolarity::Positive => BoundPolarity::Positive,
3045            BoundPolarity::Negative(span) => BoundPolarity::Negative(self.lower_span(span)),
3046            BoundPolarity::Maybe(span) => BoundPolarity::Maybe(self.lower_span(span)),
3047        };
3048        hir::TraitBoundModifiers { constness, polarity }
3049    }
3050
3051    // Helper methods for building HIR.
3052
3053    fn stmt(&mut self, span: Span, kind: hir::StmtKind<'hir>) -> hir::Stmt<'hir> {
3054        hir::Stmt { span: self.lower_span(span), kind, hir_id: self.next_id() }
3055    }
3056
3057    fn stmt_expr(&mut self, span: Span, expr: hir::Expr<'hir>) -> hir::Stmt<'hir> {
3058        self.stmt(span, hir::StmtKind::Expr(self.arena.alloc(expr)))
3059    }
3060
3061    fn stmt_let_pat(
3062        &mut self,
3063        attrs: Option<&'hir [hir::Attribute]>,
3064        span: Span,
3065        init: Option<&'hir hir::Expr<'hir>>,
3066        pat: &'hir hir::Pat<'hir>,
3067        source: hir::LocalSource,
3068    ) -> hir::Stmt<'hir> {
3069        let hir_id = self.next_id();
3070        if let Some(a) = attrs {
3071            if !!a.is_empty() {
    ::core::panicking::panic("assertion failed: !a.is_empty()")
};assert!(!a.is_empty());
3072            self.attrs.insert(hir_id.local_id, a);
3073        }
3074        let local = hir::LetStmt {
3075            super_: None,
3076            hir_id,
3077            init,
3078            pat,
3079            els: None,
3080            source,
3081            span: self.lower_span(span),
3082            ty: None,
3083        };
3084        self.stmt(span, hir::StmtKind::Let(self.arena.alloc(local)))
3085    }
3086
3087    fn stmt_super_let_pat(
3088        &mut self,
3089        span: Span,
3090        pat: &'hir hir::Pat<'hir>,
3091        init: Option<&'hir hir::Expr<'hir>>,
3092    ) -> hir::Stmt<'hir> {
3093        let hir_id = self.next_id();
3094        let span = self.lower_span(span);
3095        let local = hir::LetStmt {
3096            super_: Some(span),
3097            hir_id,
3098            init,
3099            pat,
3100            els: None,
3101            source: hir::LocalSource::Normal,
3102            span,
3103            ty: None,
3104        };
3105        self.stmt(span, hir::StmtKind::Let(self.arena.alloc(local)))
3106    }
3107
3108    fn block_expr(&mut self, expr: &'hir hir::Expr<'hir>) -> &'hir hir::Block<'hir> {
3109        self.block_all(expr.span, &[], Some(expr))
3110    }
3111
3112    fn block_all(
3113        &mut self,
3114        span: Span,
3115        stmts: &'hir [hir::Stmt<'hir>],
3116        expr: Option<&'hir hir::Expr<'hir>>,
3117    ) -> &'hir hir::Block<'hir> {
3118        let blk = hir::Block {
3119            stmts,
3120            expr,
3121            hir_id: self.next_id(),
3122            rules: hir::BlockCheckMode::DefaultBlock,
3123            span: self.lower_span(span),
3124            targeted_by_break: false,
3125        };
3126        self.arena.alloc(blk)
3127    }
3128
3129    fn pat_cf_continue(&mut self, span: Span, pat: &'hir hir::Pat<'hir>) -> &'hir hir::Pat<'hir> {
3130        let field = self.single_pat_field(span, pat);
3131        self.pat_lang_item_variant(span, LangItem::ControlFlowContinue, field)
3132    }
3133
3134    fn pat_cf_break(&mut self, span: Span, pat: &'hir hir::Pat<'hir>) -> &'hir hir::Pat<'hir> {
3135        let field = self.single_pat_field(span, pat);
3136        self.pat_lang_item_variant(span, LangItem::ControlFlowBreak, field)
3137    }
3138
3139    fn pat_some(&mut self, span: Span, pat: &'hir hir::Pat<'hir>) -> &'hir hir::Pat<'hir> {
3140        let field = self.single_pat_field(span, pat);
3141        self.pat_lang_item_variant(span, LangItem::OptionSome, field)
3142    }
3143
3144    fn pat_none(&mut self, span: Span) -> &'hir hir::Pat<'hir> {
3145        self.pat_lang_item_variant(span, LangItem::OptionNone, &[])
3146    }
3147
3148    fn single_pat_field(
3149        &mut self,
3150        span: Span,
3151        pat: &'hir hir::Pat<'hir>,
3152    ) -> &'hir [hir::PatField<'hir>] {
3153        let field = hir::PatField {
3154            hir_id: self.next_id(),
3155            ident: Ident::new(sym::integer(0), self.lower_span(span)),
3156            is_shorthand: false,
3157            pat,
3158            span: self.lower_span(span),
3159        };
3160        self.arena.alloc_from_iter([field])arena_vec![self; field]
3161    }
3162
3163    fn pat_lang_item_variant(
3164        &mut self,
3165        span: Span,
3166        lang_item: LangItem,
3167        fields: &'hir [hir::PatField<'hir>],
3168    ) -> &'hir hir::Pat<'hir> {
3169        let path = self.make_lang_item_qpath(lang_item, self.lower_span(span), None);
3170        self.pat(span, hir::PatKind::Struct(path, fields, None))
3171    }
3172
3173    fn pat_ident(&mut self, span: Span, ident: Ident) -> (&'hir hir::Pat<'hir>, HirId) {
3174        self.pat_ident_binding_mode(span, ident, hir::BindingMode::NONE)
3175    }
3176
3177    fn pat_ident_mut(&mut self, span: Span, ident: Ident) -> (hir::Pat<'hir>, HirId) {
3178        self.pat_ident_binding_mode_mut(span, ident, hir::BindingMode::NONE)
3179    }
3180
3181    fn pat_ident_binding_mode(
3182        &mut self,
3183        span: Span,
3184        ident: Ident,
3185        bm: hir::BindingMode,
3186    ) -> (&'hir hir::Pat<'hir>, HirId) {
3187        let (pat, hir_id) = self.pat_ident_binding_mode_mut(span, ident, bm);
3188        (self.arena.alloc(pat), hir_id)
3189    }
3190
3191    fn pat_ident_binding_mode_mut(
3192        &mut self,
3193        span: Span,
3194        ident: Ident,
3195        bm: hir::BindingMode,
3196    ) -> (hir::Pat<'hir>, HirId) {
3197        let hir_id = self.next_id();
3198
3199        (
3200            hir::Pat {
3201                hir_id,
3202                kind: hir::PatKind::Binding(bm, hir_id, self.lower_ident(ident), None),
3203                span: self.lower_span(span),
3204                default_binding_modes: true,
3205            },
3206            hir_id,
3207        )
3208    }
3209
3210    fn pat(&mut self, span: Span, kind: hir::PatKind<'hir>) -> &'hir hir::Pat<'hir> {
3211        self.arena.alloc(hir::Pat {
3212            hir_id: self.next_id(),
3213            kind,
3214            span: self.lower_span(span),
3215            default_binding_modes: true,
3216        })
3217    }
3218
3219    fn pat_without_dbm(&mut self, span: Span, kind: hir::PatKind<'hir>) -> hir::Pat<'hir> {
3220        hir::Pat {
3221            hir_id: self.next_id(),
3222            kind,
3223            span: self.lower_span(span),
3224            default_binding_modes: false,
3225        }
3226    }
3227
3228    fn ty_path(&mut self, mut hir_id: HirId, span: Span, qpath: hir::QPath<'hir>) -> hir::Ty<'hir> {
3229        let kind = match qpath {
3230            hir::QPath::Resolved(None, path) => {
3231                // Turn trait object paths into `TyKind::TraitObject` instead.
3232                match path.res {
3233                    Res::Def(DefKind::Trait | DefKind::TraitAlias, _) => {
3234                        let principal = hir::PolyTraitRef {
3235                            bound_generic_params: &[],
3236                            modifiers: hir::TraitBoundModifiers::NONE,
3237                            trait_ref: hir::TraitRef { path, hir_ref_id: hir_id },
3238                            span: self.lower_span(span),
3239                        };
3240
3241                        // The original ID is taken by the `PolyTraitRef`,
3242                        // so the `Ty` itself needs a different one.
3243                        hir_id = self.next_id();
3244                        hir::TyKind::TraitObject(
3245                            self.arena.alloc_from_iter([principal])arena_vec![self; principal],
3246                            TaggedRef::new(self.elided_dyn_bound(span), TraitObjectSyntax::None),
3247                        )
3248                    }
3249                    _ => hir::TyKind::Path(hir::QPath::Resolved(None, path)),
3250                }
3251            }
3252            _ => hir::TyKind::Path(qpath),
3253        };
3254
3255        hir::Ty { hir_id, kind, span: self.lower_span(span) }
3256    }
3257
3258    /// Invoked to create the lifetime argument(s) for an elided trait object
3259    /// bound, like the bound in `Box<dyn Debug>`. This method is not invoked
3260    /// when the bound is written, even if it is written with `'_` like in
3261    /// `Box<dyn Debug + '_>`. In those cases, `lower_lifetime` is invoked.
3262    fn elided_dyn_bound(&mut self, span: Span) -> &'hir hir::Lifetime {
3263        let r = hir::Lifetime::new(
3264            self.next_id(),
3265            Ident::new(kw::UnderscoreLifetime, self.lower_span(span)),
3266            hir::LifetimeKind::ImplicitObjectLifetimeDefault,
3267            LifetimeSource::Other,
3268            LifetimeSyntax::Implicit,
3269        );
3270        {
    use ::tracing::__macro_support::Callsite as _;
    static __CALLSITE: ::tracing::callsite::DefaultCallsite =
        {
            static META: ::tracing::Metadata<'static> =
                {
                    ::tracing_core::metadata::Metadata::new("event compiler/rustc_ast_lowering/src/lib.rs:3270",
                        "rustc_ast_lowering", ::tracing::Level::DEBUG,
                        ::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
                        ::tracing_core::__macro_support::Option::Some(3270u32),
                        ::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
                        ::tracing_core::field::FieldSet::new(&["message"],
                            ::tracing_core::callsite::Identifier(&__CALLSITE)),
                        ::tracing::metadata::Kind::EVENT)
                };
            ::tracing::callsite::DefaultCallsite::new(&META)
        };
    let enabled =
        ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::DEBUG <=
                    ::tracing::level_filters::LevelFilter::current() &&
            {
                let interest = __CALLSITE.interest();
                !interest.is_never() &&
                    ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                        interest)
            };
    if enabled {
        (|value_set: ::tracing::field::ValueSet|
                    {
                        let meta = __CALLSITE.metadata();
                        ::tracing::Event::dispatch(meta, &value_set);
                        ;
                    })({
                #[allow(unused_imports)]
                use ::tracing::field::{debug, display, Value};
                __CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("elided_dyn_bound: r={0:?}",
                                                    r) as &dyn ::tracing::field::Value))])
            });
    } else { ; }
};debug!("elided_dyn_bound: r={:?}", r);
3271        self.arena.alloc(r)
3272    }
3273}
3274
3275/// Helper struct for the delayed construction of [`hir::GenericArgs`].
3276struct GenericArgsCtor<'hir> {
3277    args: SmallVec<[hir::GenericArg<'hir>; 4]>,
3278    constraints: &'hir [hir::AssocItemConstraint<'hir>],
3279    parenthesized: hir::GenericArgsParentheses,
3280    span: Span,
3281}
3282
3283impl<'hir> GenericArgsCtor<'hir> {
3284    fn is_empty(&self) -> bool {
3285        self.args.is_empty()
3286            && self.constraints.is_empty()
3287            && self.parenthesized == hir::GenericArgsParentheses::No
3288    }
3289
3290    fn into_generic_args(self, this: &LoweringContext<'_, 'hir>) -> &'hir hir::GenericArgs<'hir> {
3291        let ga = hir::GenericArgs {
3292            args: this.arena.alloc_from_iter(self.args),
3293            constraints: self.constraints,
3294            parenthesized: self.parenthesized,
3295            span_ext: this.lower_span(self.span),
3296        };
3297        this.arena.alloc(ga)
3298    }
3299}
3300
3301#[derive(#[automatically_derived]
impl ::core::marker::Copy for DirectConstArgContext { }Copy, #[automatically_derived]
impl ::core::clone::Clone for DirectConstArgContext {
    #[inline]
    fn clone(&self) -> DirectConstArgContext { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for DirectConstArgContext {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                DirectConstArgContext::Stable => "Stable",
                DirectConstArgContext::MinGenericConstArgs =>
                    "MinGenericConstArgs",
                DirectConstArgContext::MacrolessMinGenericConstArgs =>
                    "MacrolessMinGenericConstArgs",
            })
    }
}Debug)]
3302enum DirectConstArgContext {
3303    /// The only allowed direct const arg representation is simple paths that nameres to generic
3304    /// const parameters.
3305    Stable,
3306    /// The allowed representations are what is allowed on stable, plus the `direct_const_arg!` macro.
3307    MinGenericConstArgs,
3308    /// Expressions attempt to be lowered directly, and if that fails, the expression falls back to
3309    /// being represented as an anon const.
3310    ///
3311    /// This context is also used under MinGenericConstArgs inside a `direct_const_arg!` macro, for
3312    /// simplicity, as they allow the same code.
3313    MacrolessMinGenericConstArgs,
3314}
3315
3316#[derive(#[automatically_derived]
impl ::core::fmt::Debug for UnrepresentableConstArgError {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "UnrepresentableConstArgError", "span", &self.span,
            "will_create_def_ids", &&self.will_create_def_ids)
    }
}Debug)]
3317struct UnrepresentableConstArgError {
3318    span: Span,
3319    will_create_def_ids: bool,
3320}
3321
3322impl UnrepresentableConstArgError {
3323    fn new(expr: &Expr) -> Self {
3324        Self {
3325            span: expr.span,
3326            will_create_def_ids: expr::WillCreateDefIdsVisitor.visit_expr(expr).is_break(),
3327        }
3328    }
3329
3330    fn emit<'hir>(self, lowering_context: &mut LoweringContext<'_, 'hir>) -> ConstArg<'hir> {
3331        let msg = "complex const arguments must be placed inside of a `const` block";
3332        let e = if self.will_create_def_ids {
3333            // FIXME(mgca): make this non-fatal once we have a better way to handle
3334            // nested items in const args
3335            // Issue: https://github.com/rust-lang/rust/issues/154539
3336            lowering_context.dcx().struct_span_fatal(self.span, msg).emit()
3337        } else {
3338            lowering_context.dcx().struct_span_err(self.span, msg).emit()
3339        };
3340
3341        ConstArg {
3342            hir_id: lowering_context.next_id(),
3343            kind: hir::ConstArgKind::Error(e),
3344            span: self.span,
3345        }
3346    }
3347}