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 {
        static __NAMES: &str =
            "PathVariableTraitBoundGenericExternFnParamClosureParamPointerParamFnTraitParamExternFnReturnClosureReturnPointerReturnFnTraitReturnGenericDefaultConstTyStaticTyAssocTyFieldTyCastImplSelfOffsetOf";
        static __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(self.arena.alloc(hir::InferArg {
                                        hir_id: self.lower_node_id(ty.id),
                                        span: self.lower_span(ty.span),
                                        kind: hir::InferArgKind::TypeOrConst,
                                    }));
                    }
                    match &ty.kind {
                        TyKind::Path(None, path) if
                            path.is_single_argless_ident() &&
                                    let Some(res) =
                                        self.get_partial_res(ty.id).and_then(|partial_res|
                                                partial_res.full_res()) &&
                                !res.matches_ns(Namespace::TypeNS) => {
                            let ct =
                                self.lower_const_path_to_const_arg(&None, path, res, ty.id,
                                    ty.span);
                            let ct = self.arena.alloc(ct);
                            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(self.arena.alloc(hir::InferArg {
                                                    hir_id: ct.hir_id,
                                                    span: ct.span,
                                                    kind: hir::InferArgKind::Const,
                                                })),
                                };
                        }
                        _ => {}
                    }
                    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(self.arena.alloc(hir::InferArg {
                                        hir_id: ct.hir_id,
                                        span: ct.span,
                                        kind: hir::InferArgKind::Const,
                                    })),
                    }
                }
            }
        }
    }
}#[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(self.arena.alloc(hir::InferArg {
1435                        hir_id: self.lower_node_id(ty.id),
1436                        span: self.lower_span(ty.span),
1437                        kind: hir::InferArgKind::TypeOrConst,
1438                    }));
1439                }
1440
1441                match &ty.kind {
1442                    // We parse const arguments as path types as we cannot distinguish them during
1443                    // parsing. We try to resolve that ambiguity by attempting resolution in both the
1444                    // type and value namespaces. If we resolved the path in the value namespace, we
1445                    // transform it into a generic const argument.
1446                    //
1447                    // Note that even under `#![feature(min_generic_const_args)]`, only plain paths
1448                    // to constants are allowed - e.g. `A::<T::ASSOC_CONST>` and
1449                    // `A::<CONST_WITH_PARAM::<2>>` are disallowed (they must be wrapped in `{ }`).
1450                    //
1451                    // FIXME: Should we be handling `(PATH_TO_CONST)`?
1452                    TyKind::Path(None, path)
1453                        if path.is_single_argless_ident()
1454                            && let Some(res) = self
1455                                .get_partial_res(ty.id)
1456                                .and_then(|partial_res| partial_res.full_res())
1457                            && !res.matches_ns(Namespace::TypeNS) =>
1458                    {
1459                        let ct =
1460                            self.lower_const_path_to_const_arg(&None, path, res, ty.id, ty.span);
1461                        let ct = self.arena.alloc(ct);
1462                        return GenericArg::Const(ct.try_as_ambig_ct().unwrap());
1463                    }
1464                    TyKind::DirectConstArg(expr)
1465                        if self.tcx.features().min_generic_const_args() =>
1466                    {
1467                        let ct = match self.can_lower_expr_to_const_arg_direct(
1468                            expr,
1469                            DirectConstArgContext::MacrolessMinGenericConstArgs,
1470                        ) {
1471                            Ok(()) => self.lower_expr_to_const_arg_direct(expr, None),
1472                            Err(e) => e.emit(self),
1473                        };
1474                        let ct = self.arena.alloc(ct);
1475                        return match ct.try_as_ambig_ct() {
1476                            Some(ct) => GenericArg::Const(ct),
1477                            None => GenericArg::Infer(self.arena.alloc(hir::InferArg {
1478                                hir_id: ct.hir_id,
1479                                span: ct.span,
1480                                kind: hir::InferArgKind::Const,
1481                            })),
1482                        };
1483                    }
1484                    _ => {}
1485                }
1486                GenericArg::Type(self.lower_ty_alloc(ty, itctx).try_as_ambig_ty().unwrap())
1487            }
1488            ast::GenericArg::Const(ct) => {
1489                let ct = self.lower_anon_const_to_const_arg_and_alloc(ct);
1490                match ct.try_as_ambig_ct() {
1491                    Some(ct) => GenericArg::Const(ct),
1492                    None => GenericArg::Infer(self.arena.alloc(hir::InferArg {
1493                        hir_id: ct.hir_id,
1494                        span: ct.span,
1495                        kind: hir::InferArgKind::Const,
1496                    })),
1497                }
1498            }
1499        }
1500    }
1501
1502    #[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(1502u32),
                                    ::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))]
1503    fn lower_ty_alloc(&mut self, t: &Ty, itctx: ImplTraitContext) -> &'hir hir::Ty<'hir> {
1504        self.arena.alloc(self.lower_ty(t, itctx))
1505    }
1506
1507    fn lower_path_ty(
1508        &mut self,
1509        t: &Ty,
1510        qself: &Option<Box<QSelf>>,
1511        path: &Path,
1512        param_mode: ParamMode,
1513        itctx: ImplTraitContext,
1514    ) -> hir::Ty<'hir> {
1515        // Check whether we should interpret this as a bare trait object.
1516        // This check mirrors the one in late resolution. We only introduce this special case in
1517        // the rare occurrence we need to lower `Fresh` anonymous lifetimes.
1518        // The other cases when a qpath should be opportunistically made a trait object are handled
1519        // by `ty_path`.
1520        if qself.is_none()
1521            && let Some(partial_res) = self.get_partial_res(t.id)
1522            && let Some(Res::Def(DefKind::Trait | DefKind::TraitAlias, _)) = partial_res.full_res()
1523        {
1524            let (bounds, lifetime_bound) = self.with_dyn_type_scope(true, |this| {
1525                let bound = this.lower_poly_trait_ref(
1526                    &PolyTraitRef {
1527                        bound_generic_params: ThinVec::new(),
1528                        modifiers: TraitBoundModifiers::NONE,
1529                        trait_ref: TraitRef { path: path.clone(), ref_id: t.id },
1530                        span: t.span,
1531                        parens: ast::Parens::No,
1532                    },
1533                    RelaxedBoundPolicy::Forbidden(RelaxedBoundForbiddenReason::TraitObjectTy),
1534                    itctx,
1535                );
1536                let bounds = this.arena.alloc_from_iter([bound]);
1537                let lifetime_bound = this.elided_dyn_bound(t.span);
1538                (bounds, lifetime_bound)
1539            });
1540            let kind = hir::TyKind::TraitObject(
1541                bounds,
1542                TaggedRef::new(lifetime_bound, TraitObjectSyntax::None),
1543            );
1544            return hir::Ty { kind, span: self.lower_span(t.span), hir_id: self.next_id() };
1545        }
1546
1547        let id = self.lower_node_id(t.id);
1548        let qpath = self.lower_qpath(
1549            t.id,
1550            qself,
1551            path,
1552            param_mode,
1553            AllowReturnTypeNotation::Yes,
1554            itctx,
1555            None,
1556        );
1557        self.ty_path(id, t.span, qpath)
1558    }
1559
1560    fn ty(&mut self, span: Span, kind: hir::TyKind<'hir>) -> hir::Ty<'hir> {
1561        hir::Ty { hir_id: self.next_id(), kind, span: self.lower_span(span) }
1562    }
1563
1564    fn ty_tup(&mut self, span: Span, tys: &'hir [hir::Ty<'hir>]) -> hir::Ty<'hir> {
1565        self.ty(span, hir::TyKind::Tup(tys))
1566    }
1567
1568    fn lower_ty(&mut self, t: &Ty, itctx: ImplTraitContext) -> hir::Ty<'hir> {
1569        let kind = match &t.kind {
1570            TyKind::Infer => hir::TyKind::Infer(()),
1571            TyKind::Err(guar) => hir::TyKind::Err(*guar),
1572            TyKind::Slice(ty) => hir::TyKind::Slice(self.lower_ty_alloc(ty, itctx)),
1573            TyKind::Ptr(mt) => hir::TyKind::Ptr(self.lower_mt(mt, itctx)),
1574            TyKind::Ref(region, mt) => {
1575                let lifetime = self.lower_ty_direct_lifetime(t, *region);
1576                hir::TyKind::Ref(lifetime, self.lower_mt(mt, itctx))
1577            }
1578            TyKind::PinnedRef(region, mt) => {
1579                let lifetime = self.lower_ty_direct_lifetime(t, *region);
1580                let kind = hir::TyKind::Ref(lifetime, self.lower_mt(mt, itctx));
1581                let span = self.lower_span(t.span);
1582                let arg = hir::Ty { kind, span, hir_id: self.next_id() };
1583                let args = self.arena.alloc(hir::GenericArgs {
1584                    args: self.arena.alloc([hir::GenericArg::Type(self.arena.alloc(arg))]),
1585                    constraints: &[],
1586                    parenthesized: hir::GenericArgsParentheses::No,
1587                    span_ext: span,
1588                });
1589                let path = self.make_lang_item_qpath(LangItem::Pin, span, Some(args));
1590                hir::TyKind::Path(path)
1591            }
1592            TyKind::FnPtr(f) => {
1593                let generic_params = self.lower_lifetime_binder(t.id, &f.generic_params);
1594                hir::TyKind::FnPtr(self.arena.alloc(hir::FnPtrTy {
1595                    generic_params,
1596                    safety: self.lower_safety(f.safety, hir::Safety::Safe),
1597                    abi: self.lower_extern(f.ext),
1598                    decl: self.lower_fn_decl(&f.decl, t.id, t.span, FnDeclKind::Pointer, None),
1599                    param_idents: self.lower_fn_params_to_idents(&f.decl),
1600                }))
1601            }
1602            TyKind::UnsafeBinder(f) => {
1603                let generic_params = self.lower_lifetime_binder(t.id, &f.generic_params);
1604                hir::TyKind::UnsafeBinder(self.arena.alloc(hir::UnsafeBinderTy {
1605                    generic_params,
1606                    inner_ty: self.lower_ty_alloc(&f.inner_ty, itctx),
1607                }))
1608            }
1609            TyKind::Never => hir::TyKind::Never,
1610            TyKind::Tup(tys) => hir::TyKind::Tup(
1611                self.arena.alloc_from_iter(tys.iter().map(|ty| self.lower_ty(ty, itctx))),
1612            ),
1613            TyKind::Paren(ty) => {
1614                return self.lower_ty(ty, itctx);
1615            }
1616            TyKind::Path(qself, path) => {
1617                return self.lower_path_ty(t, qself, path, ParamMode::Explicit, itctx);
1618            }
1619            TyKind::ImplicitSelf => {
1620                let hir_id = self.next_id();
1621                let res = self.expect_full_res(t.id);
1622                let res = self.lower_res(res);
1623                hir::TyKind::Path(hir::QPath::Resolved(
1624                    None,
1625                    self.arena.alloc(hir::Path {
1626                        res,
1627                        segments: self.arena.alloc_from_iter([hir::PathSegment::new(Ident::with_dummy_span(kw::SelfUpper),
                hir_id, res)])arena_vec![self; hir::PathSegment::new(
1628                            Ident::with_dummy_span(kw::SelfUpper),
1629                            hir_id,
1630                            res
1631                        )],
1632                        span: self.lower_span(t.span),
1633                    }),
1634                ))
1635            }
1636            TyKind::Array(ty, length) => hir::TyKind::Array(
1637                self.lower_ty_alloc(ty, itctx),
1638                self.lower_array_length_to_const_arg(length),
1639            ),
1640            TyKind::TraitObject(bounds, kind) => {
1641                let mut lifetime_bound = None;
1642                let (bounds, lifetime_bound) = self.with_dyn_type_scope(true, |this| {
1643                    let bounds =
1644                        this.arena.alloc_from_iter(bounds.iter().filter_map(|bound| match bound {
1645                            // We can safely ignore constness here since AST validation
1646                            // takes care of rejecting invalid modifier combinations and
1647                            // const trait bounds in trait object types.
1648                            GenericBound::Trait(ty) => {
1649                                let trait_ref = this.lower_poly_trait_ref(
1650                                    ty,
1651                                    RelaxedBoundPolicy::Forbidden(
1652                                        RelaxedBoundForbiddenReason::TraitObjectTy,
1653                                    ),
1654                                    itctx,
1655                                );
1656                                Some(trait_ref)
1657                            }
1658                            GenericBound::Outlives(lifetime) => {
1659                                if lifetime_bound.is_none() {
1660                                    lifetime_bound = Some(this.lower_lifetime(
1661                                        lifetime,
1662                                        LifetimeSource::Other,
1663                                        lifetime.ident.into(),
1664                                    ));
1665                                }
1666                                None
1667                            }
1668                            // Ignore `use` syntax since that is not valid in objects.
1669                            GenericBound::Use(_, span) => {
1670                                this.dcx()
1671                                    .span_delayed_bug(*span, "use<> not allowed in dyn types");
1672                                None
1673                            }
1674                        }));
1675                    let lifetime_bound =
1676                        lifetime_bound.unwrap_or_else(|| this.elided_dyn_bound(t.span));
1677                    (bounds, lifetime_bound)
1678                });
1679                hir::TyKind::TraitObject(bounds, TaggedRef::new(lifetime_bound, *kind))
1680            }
1681            TyKind::ImplTrait(def_node_id, bounds) => {
1682                let span = t.span;
1683                match itctx {
1684                    ImplTraitContext::OpaqueTy { origin } => {
1685                        self.lower_opaque_impl_trait(span, origin, *def_node_id, bounds, itctx)
1686                    }
1687                    ImplTraitContext::Universal => {
1688                        if let Some(span) = bounds.iter().find_map(|bound| match *bound {
1689                            ast::GenericBound::Use(_, span) => Some(span),
1690                            _ => None,
1691                        }) {
1692                            self.tcx.dcx().emit_err(diagnostics::NoPreciseCapturesOnApit { span });
1693                        }
1694
1695                        let def_id = self.local_def_id(*def_node_id);
1696                        let name = self.tcx.item_name(def_id.to_def_id());
1697                        let ident = Ident::new(name, span);
1698                        let (param, bounds, path) = self.lower_universal_param_and_bounds(
1699                            *def_node_id,
1700                            span,
1701                            ident,
1702                            bounds,
1703                        );
1704                        self.impl_trait_defs.push(param);
1705                        if let Some(bounds) = bounds {
1706                            self.impl_trait_bounds.push(bounds);
1707                        }
1708                        path
1709                    }
1710                    ImplTraitContext::InBinding => {
1711                        hir::TyKind::TraitAscription(self.lower_param_bounds(
1712                            bounds,
1713                            RelaxedBoundPolicy::Allowed(&mut Default::default()),
1714                            itctx,
1715                        ))
1716                    }
1717                    ImplTraitContext::FeatureGated(position, feature) => {
1718                        let guar = self
1719                            .tcx
1720                            .sess
1721                            .create_feature_err(
1722                                MisplacedImplTrait {
1723                                    span: t.span,
1724                                    position: DiagArgFromDisplay(&position),
1725                                },
1726                                feature,
1727                            )
1728                            .emit();
1729                        hir::TyKind::Err(guar)
1730                    }
1731                    ImplTraitContext::Disallowed(position) => {
1732                        let guar = self.dcx().emit_err(MisplacedImplTrait {
1733                            span: t.span,
1734                            position: DiagArgFromDisplay(&position),
1735                        });
1736                        hir::TyKind::Err(guar)
1737                    }
1738                }
1739            }
1740            TyKind::Pat(ty, pat) => {
1741                hir::TyKind::Pat(self.lower_ty_alloc(ty, itctx), self.lower_ty_pat(pat, ty.span))
1742            }
1743            TyKind::FieldOf(ty, variant, field) => hir::TyKind::FieldOf(
1744                self.lower_ty_alloc(ty, itctx),
1745                self.arena.alloc(hir::TyFieldPath {
1746                    variant: variant.map(|variant| self.lower_ident(variant)),
1747                    field: self.lower_ident(*field),
1748                }),
1749            ),
1750            TyKind::MacCall(_) => {
1751                ::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")
1752            }
1753            TyKind::CVarArgs => {
1754                let guar = self.dcx().span_delayed_bug(
1755                    t.span,
1756                    "`TyKind::CVarArgs` should have been handled elsewhere",
1757                );
1758                hir::TyKind::Err(guar)
1759            }
1760            TyKind::View(ty, fields) => {
1761                let ty = self.lower_ty_alloc(ty, itctx);
1762                let fields = self.arena.alloc_slice(fields);
1763                hir::TyKind::View(ty, fields)
1764            }
1765            TyKind::DirectConstArg(expr) => {
1766                let e = self.emit_bad_direct_const_arg(t.span, expr, "type");
1767                hir::TyKind::Err(e)
1768            }
1769            TyKind::Dummy => {
    ::core::panicking::panic_fmt(format_args!("`TyKind::Dummy` should never be lowered"));
}panic!("`TyKind::Dummy` should never be lowered"),
1770        };
1771
1772        hir::Ty { kind, span: self.lower_span(t.span), hir_id: self.lower_node_id(t.id) }
1773    }
1774
1775    pub(crate) fn emit_bad_direct_const_arg(
1776        &mut self,
1777        span: Span,
1778        expr: &Expr,
1779        expected: &'static str,
1780    ) -> ErrorGuaranteed {
1781        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");
1782        if expr::WillCreateDefIdsVisitor.visit_expr(expr).is_break() {
1783            // FIXME(mgca): make this non-fatal once we have a better way to handle
1784            // nested items in invalid `direct_const_arg!()` arguments.
1785            self.dcx().struct_span_fatal(span, msg).emit()
1786        } else {
1787            self.dcx().struct_span_err(span, msg).emit()
1788        }
1789    }
1790
1791    fn lower_ty_direct_lifetime(
1792        &mut self,
1793        t: &Ty,
1794        region: Option<Lifetime>,
1795    ) -> &'hir hir::Lifetime {
1796        let (region, syntax) = match region {
1797            Some(region) => (region, region.ident.into()),
1798
1799            None => {
1800                let id = if let Some(LifetimeRes::ElidedAnchor { start, end }) =
1801                    self.owner.get_lifetime_res(t.id)
1802                {
1803                    {
    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);
1804                    start
1805                } else {
1806                    self.next_node_id()
1807                };
1808                let span = self.tcx.sess.source_map().start_point(t.span).shrink_to_hi();
1809                let region = Lifetime { ident: Ident::new(kw::UnderscoreLifetime, span), id };
1810                (region, LifetimeSyntax::Implicit)
1811            }
1812        };
1813        self.lower_lifetime(&region, LifetimeSource::Reference, syntax)
1814    }
1815
1816    /// Lowers a `ReturnPositionOpaqueTy` (`-> impl Trait`) or a `TypeAliasesOpaqueTy` (`type F =
1817    /// impl Trait`): this creates the associated Opaque Type (TAIT) definition and then returns a
1818    /// HIR type that references the TAIT.
1819    ///
1820    /// Given a function definition like:
1821    ///
1822    /// ```rust
1823    /// use std::fmt::Debug;
1824    ///
1825    /// fn test<'a, T: Debug>(x: &'a T) -> impl Debug + 'a {
1826    ///     x
1827    /// }
1828    /// ```
1829    ///
1830    /// we will create a TAIT definition in the HIR like
1831    ///
1832    /// ```rust,ignore (pseudo-Rust)
1833    /// type TestReturn<'a, T, 'x> = impl Debug + 'x
1834    /// ```
1835    ///
1836    /// and return a type like `TestReturn<'static, T, 'a>`, so that the function looks like:
1837    ///
1838    /// ```rust,ignore (pseudo-Rust)
1839    /// fn test<'a, T: Debug>(x: &'a T) -> TestReturn<'static, T, 'a>
1840    /// ```
1841    ///
1842    /// Note the subtlety around type parameters! The new TAIT, `TestReturn`, inherits all the
1843    /// type parameters from the function `test` (this is implemented in the query layer, they aren't
1844    /// added explicitly in the HIR). But this includes all the lifetimes, and we only want to
1845    /// capture the lifetimes that are referenced in the bounds. Therefore, we add *extra* lifetime parameters
1846    /// for the lifetimes that get captured (`'x`, in our example above) and reference those.
1847    x;#[instrument(level = "debug", skip(self), ret)]
1848    fn lower_opaque_impl_trait(
1849        &mut self,
1850        span: Span,
1851        origin: hir::OpaqueTyOrigin<LocalDefId>,
1852        opaque_ty_node_id: NodeId,
1853        bounds: &GenericBounds,
1854        itctx: ImplTraitContext,
1855    ) -> hir::TyKind<'hir> {
1856        // Make sure we know that some funky desugaring has been going on here.
1857        // This is a first: there is code in other places like for loop
1858        // desugaring that explicitly states that we don't want to track that.
1859        // Not tracking it makes lints in rustc and clippy very fragile, as
1860        // frequently opened issues show.
1861        let opaque_ty_span = self.mark_span_with_reason(DesugaringKind::OpaqueTy, span, None);
1862
1863        self.lower_opaque_inner(opaque_ty_node_id, origin, opaque_ty_span, |this| {
1864            this.lower_param_bounds(
1865                bounds,
1866                RelaxedBoundPolicy::Allowed(&mut Default::default()),
1867                itctx,
1868            )
1869        })
1870    }
1871
1872    fn lower_opaque_inner(
1873        &mut self,
1874        opaque_ty_node_id: NodeId,
1875        origin: hir::OpaqueTyOrigin<LocalDefId>,
1876        opaque_ty_span: Span,
1877        lower_item_bounds: impl FnOnce(&mut Self) -> &'hir [hir::GenericBound<'hir>],
1878    ) -> hir::TyKind<'hir> {
1879        let opaque_ty_def_id = self.local_def_id(opaque_ty_node_id);
1880        let opaque_ty_hir_id = self.lower_node_id(opaque_ty_node_id);
1881        {
    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:1881",
                        "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(1881u32),
                        ::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);
1882
1883        let bounds = lower_item_bounds(self);
1884        let opaque_ty_def = hir::OpaqueTy {
1885            hir_id: opaque_ty_hir_id,
1886            def_id: opaque_ty_def_id,
1887            bounds,
1888            origin,
1889            span: self.lower_span(opaque_ty_span),
1890        };
1891        let opaque_ty_def = self.arena.alloc(opaque_ty_def);
1892
1893        hir::TyKind::OpaqueDef(opaque_ty_def)
1894    }
1895
1896    fn lower_precise_capturing_args(
1897        &mut self,
1898        precise_capturing_args: &[PreciseCapturingArg],
1899    ) -> &'hir [hir::PreciseCapturingArg<'hir>] {
1900        self.arena.alloc_from_iter(precise_capturing_args.iter().map(|arg| match arg {
1901            PreciseCapturingArg::Lifetime(lt) => hir::PreciseCapturingArg::Lifetime(
1902                self.lower_lifetime(lt, LifetimeSource::PreciseCapturing, lt.ident.into()),
1903            ),
1904            PreciseCapturingArg::Arg(path, id) => {
1905                let [segment] = path.segments.as_slice() else {
1906                    ::core::panicking::panic("explicit panic");panic!();
1907                };
1908                let res = self.get_partial_res(*id).map_or(Res::Err, |partial_res| {
1909                    partial_res.full_res().expect("no partial res expected for precise capture arg")
1910                });
1911                hir::PreciseCapturingArg::Param(hir::PreciseCapturingNonLifetimeArg {
1912                    hir_id: self.lower_node_id(*id),
1913                    ident: self.lower_ident(segment.ident),
1914                    res: self.lower_res(res),
1915                })
1916            }
1917        }))
1918    }
1919
1920    fn lower_fn_params_to_idents(&mut self, decl: &FnDecl) -> &'hir [Option<Ident>] {
1921        self.arena.alloc_from_iter(decl.inputs.iter().map(|param| match param.pat.kind {
1922            PatKind::Missing => None,
1923            PatKind::Ident(_, ident, _) => Some(self.lower_ident(ident)),
1924            PatKind::Wild => Some(Ident::new(kw::Underscore, self.lower_span(param.pat.span))),
1925            _ => {
1926                self.dcx().span_delayed_bug(
1927                    param.pat.span,
1928                    "non-missing/ident/wild param pat must trigger an error",
1929                );
1930                None
1931            }
1932        }))
1933    }
1934
1935    /// Lowers a function declaration.
1936    ///
1937    /// `decl`: the unlowered (AST) function declaration.
1938    ///
1939    /// `fn_node_id`: `impl Trait` arguments are lowered into generic parameters on the given
1940    /// `NodeId`.
1941    ///
1942    /// `transform_return_type`: if `Some`, applies some conversion to the return type, such as is
1943    /// needed for `async fn` and `gen fn`. See [`CoroutineKind`] for more details.
1944    #[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(1944u32),
                                    ::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))]
1945    fn lower_fn_decl(
1946        &mut self,
1947        decl: &FnDecl,
1948        fn_node_id: NodeId,
1949        fn_span: Span,
1950        kind: FnDeclKind,
1951        coro: Option<CoroutineMarker>,
1952    ) -> &'hir hir::FnDecl<'hir> {
1953        let c_variadic = decl.c_variadic();
1954        let mut splatted = decl.splatted();
1955
1956        // Skip the `...` (`CVarArgs`) trailing arguments from the AST,
1957        // as they are not explicit in HIR/Ty function signatures.
1958        // (instead, the `c_variadic` flag is set to `true`)
1959        let mut inputs = &decl.inputs[..];
1960        if decl.c_variadic() {
1961            // Splat + variadic errors in AST validation, so just ignore one of them here.
1962            splatted = None;
1963            inputs = &inputs[..inputs.len() - 1];
1964        }
1965        let inputs = self.arena.alloc_from_iter(inputs.iter().map(|param| {
1966            let itctx = match kind {
1967                FnDeclKind::Fn | FnDeclKind::Inherent | FnDeclKind::Impl | FnDeclKind::Trait => {
1968                    ImplTraitContext::Universal
1969                }
1970                FnDeclKind::ExternFn => {
1971                    ImplTraitContext::Disallowed(ImplTraitPosition::ExternFnParam)
1972                }
1973                FnDeclKind::Closure => {
1974                    ImplTraitContext::Disallowed(ImplTraitPosition::ClosureParam)
1975                }
1976                FnDeclKind::Pointer => {
1977                    ImplTraitContext::Disallowed(ImplTraitPosition::PointerParam)
1978                }
1979            };
1980            self.lower_ty(&param.ty, itctx)
1981        }));
1982
1983        let output = match coro {
1984            Some(coro) => {
1985                let fn_def_id = self.owner.def_id;
1986                self.lower_coroutine_fn_ret_ty(&decl.output, fn_def_id, coro, kind)
1987            }
1988            None => match &decl.output {
1989                FnRetTy::Ty(ty) => {
1990                    let itctx = match kind {
1991                        FnDeclKind::Fn | FnDeclKind::Inherent => ImplTraitContext::OpaqueTy {
1992                            origin: hir::OpaqueTyOrigin::FnReturn {
1993                                parent: self.owner.def_id,
1994                                in_trait_or_impl: None,
1995                            },
1996                        },
1997                        FnDeclKind::Trait => ImplTraitContext::OpaqueTy {
1998                            origin: hir::OpaqueTyOrigin::FnReturn {
1999                                parent: self.owner.def_id,
2000                                in_trait_or_impl: Some(hir::RpitContext::Trait),
2001                            },
2002                        },
2003                        FnDeclKind::Impl => ImplTraitContext::OpaqueTy {
2004                            origin: hir::OpaqueTyOrigin::FnReturn {
2005                                parent: self.owner.def_id,
2006                                in_trait_or_impl: Some(hir::RpitContext::TraitImpl),
2007                            },
2008                        },
2009                        FnDeclKind::ExternFn => {
2010                            ImplTraitContext::Disallowed(ImplTraitPosition::ExternFnReturn)
2011                        }
2012                        FnDeclKind::Closure => {
2013                            ImplTraitContext::Disallowed(ImplTraitPosition::ClosureReturn)
2014                        }
2015                        FnDeclKind::Pointer => {
2016                            ImplTraitContext::Disallowed(ImplTraitPosition::PointerReturn)
2017                        }
2018                    };
2019                    hir::FnRetTy::Return(self.lower_ty_alloc(ty, itctx))
2020                }
2021                FnRetTy::Default(span) => hir::FnRetTy::DefaultReturn(self.lower_span(*span)),
2022            },
2023        };
2024
2025        let fn_decl_kind = hir::FnDeclFlags::default()
2026            .set_implicit_self(decl.inputs.get(0).map_or(hir::ImplicitSelfKind::None, |arg| {
2027                let is_mutable_pat = matches!(
2028                    arg.pat.kind,
2029                    PatKind::Ident(hir::BindingMode(_, Mutability::Mut), ..)
2030                );
2031
2032                match &arg.ty.kind {
2033                    TyKind::ImplicitSelf if is_mutable_pat => hir::ImplicitSelfKind::Mut,
2034                    TyKind::ImplicitSelf => hir::ImplicitSelfKind::Imm,
2035                    // Given we are only considering `ImplicitSelf` types, we needn't consider
2036                    // the case where we have a mutable pattern to a reference as that would
2037                    // no longer be an `ImplicitSelf`.
2038                    TyKind::Ref(_, mt) | TyKind::PinnedRef(_, mt)
2039                        if mt.ty.kind.is_implicit_self() =>
2040                    {
2041                        match mt.mutbl {
2042                            hir::Mutability::Not => hir::ImplicitSelfKind::RefImm,
2043                            hir::Mutability::Mut => hir::ImplicitSelfKind::RefMut,
2044                        }
2045                    }
2046                    _ => hir::ImplicitSelfKind::None,
2047                }
2048            }))
2049            .set_lifetime_elision_allowed(
2050                self.owner.id == fn_node_id && self.owner.lifetime_elision_allowed,
2051            )
2052            .set_c_variadic(c_variadic)
2053            .set_splatted(splatted, inputs.len())
2054            .unwrap();
2055
2056        self.arena.alloc(hir::FnDecl { inputs, output, fn_decl_kind })
2057    }
2058
2059    // Transforms `-> T` for `async fn` into `-> OpaqueTy { .. }`
2060    // combined with the following definition of `OpaqueTy`:
2061    //
2062    //     type OpaqueTy<generics_from_parent_fn> = impl Future<Output = T>;
2063    //
2064    // `output`: unlowered output type (`T` in `-> T`)
2065    // `fn_node_id`: `NodeId` of the parent function (used to create child impl trait definition)
2066    // `opaque_ty_node_id`: `NodeId` of the opaque `impl Trait` type that should be created
2067    #[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(2067u32),
                                    ::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.kind {
                    CoroutineKind::Async | CoroutineKind::Gen =>
                        (coro.return_impl_trait_id, None),
                    CoroutineKind::AsyncGen => {
                        (coro.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))]
2068    fn lower_coroutine_fn_ret_ty(
2069        &mut self,
2070        output: &FnRetTy,
2071        fn_def_id: LocalDefId,
2072        coro: CoroutineMarker,
2073        fn_kind: FnDeclKind,
2074    ) -> hir::FnRetTy<'hir> {
2075        let span = self.lower_span(output.span());
2076
2077        let (opaque_ty_node_id, allowed_features) = match coro.kind {
2078            CoroutineKind::Async | CoroutineKind::Gen => (coro.return_impl_trait_id, None),
2079            CoroutineKind::AsyncGen => {
2080                (coro.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: CoroutineMarker,
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.kind {
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        //
2596        // FIXME(macroless_generic_const_args): Handling of underscores should be moved into
2597        // lower_expr_to_const_arg_direct. It is left here as retaining compatibility of what is
2598        // currently allowed on stable gets hairy and annoying otherwise.
2599        match c.value.peel_parens().kind {
2600            ExprKind::Underscore => {
2601                let ct_kind = hir::ConstArgKind::Infer(());
2602                self.arena.alloc(hir::ConstArg {
2603                    hir_id: self.lower_node_id(c.id),
2604                    kind: ct_kind,
2605                    span: self.lower_span(c.value.span),
2606                })
2607            }
2608            _ => self.lower_anon_const_to_const_arg_and_alloc(c),
2609        }
2610    }
2611
2612    /// Used when lowering a type argument that turned out to actually be a const argument.
2613    ///
2614    /// Only use for that purpose since otherwise it will create a duplicate def.
2615    #[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(2615u32),
                                    ::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("qself")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("qself");
                                                        NAME.as_str()
                                                    },
                                                    {
                                                        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("id")
                                                            }> =
                                                            ::tracing::__macro_support::FieldName::new("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(&qself)
                                                            as &dyn ::tracing::field::Value)),
                                                (::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(&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::ConstArg<'hir> = loop {};
            return __tracing_attr_fake_return;
        }
        {
            let context = self.ambient_direct_const_arg_context();
            if self.can_lower_path_to_const_arg_direct(qself, path, span,
                        Some(res), context).is_ok() {
                let span = self.lower_span(span);
                self.lower_path_to_const_arg_direct(id, None, qself, path,
                    span)
            } 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,
                        kind: ExprKind::Path(qself.clone(), 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::ConstArg {
                    hir_id: self.next_id(),
                    kind: hir::ConstArgKind::Anon(ct),
                    span: self.lower_span(span),
                }
            }
        }
    }
}#[instrument(level = "debug", skip(self))]
2616    fn lower_const_path_to_const_arg(
2617        &mut self,
2618        qself: &Option<Box<QSelf>>,
2619        path: &Path,
2620        res: Res<NodeId>,
2621        id: NodeId,
2622        span: Span,
2623    ) -> hir::ConstArg<'hir> {
2624        let context = self.ambient_direct_const_arg_context();
2625        if self.can_lower_path_to_const_arg_direct(qself, path, span, Some(res), context).is_ok() {
2626            let span = self.lower_span(span);
2627            self.lower_path_to_const_arg_direct(id, None, qself, path, span)
2628        } else {
2629            // Construct an AnonConst where the expr is the "ty"'s path.
2630            let node_id = self.next_node_id();
2631            let span = self.lower_span(span);
2632
2633            // Add a definition for the in-band const def.
2634            // We're lowering a const argument that was originally thought to be a type argument,
2635            // so the def collector didn't create the def ahead of time. That's why we have to do
2636            // it here.
2637            let def_id = self.create_def(node_id, None, DefKind::AnonConst, span);
2638            let hir_id = self.lower_node_id(node_id);
2639
2640            let path_expr = Expr {
2641                id,
2642                kind: ExprKind::Path(qself.clone(), path.clone()),
2643                span,
2644                attrs: AttrVec::new(),
2645                tokens: None,
2646            };
2647
2648            let ct = self.with_new_scopes(span, |this| {
2649                self.arena.alloc(hir::AnonConst {
2650                    def_id,
2651                    hir_id,
2652                    body: this.lower_const_body(path_expr.span, Some(&path_expr)),
2653                    span,
2654                })
2655            });
2656            hir::ConstArg {
2657                hir_id: self.next_id(),
2658                kind: hir::ConstArgKind::Anon(ct),
2659                span: self.lower_span(span),
2660            }
2661        }
2662    }
2663
2664    fn lower_const_item_rhs(
2665        &mut self,
2666        body: &Option<Box<Expr>>,
2667        kind: ConstItemKind,
2668        span: Span,
2669    ) -> hir::ConstItemRhs<'hir> {
2670        match (body, kind) {
2671            (body, ConstItemKind::Body) => {
2672                hir::ConstItemRhs::Body(self.lower_const_body(span, body.as_deref()))
2673            }
2674            (Some(body), ConstItemKind::TypeConst) => {
2675                hir::ConstItemRhs::TypeConst(self.arena.alloc(
2676                    match self.can_lower_expr_to_const_arg_direct(
2677                        &body,
2678                        DirectConstArgContext::MacrolessMinGenericConstArgs,
2679                    ) {
2680                        Ok(()) => self.lower_expr_to_const_arg_direct(&body, None),
2681                        Err(err) => err.emit(self),
2682                    },
2683                ))
2684            }
2685            (None, ConstItemKind::TypeConst) => {
2686                let const_arg = ConstArg {
2687                    hir_id: self.next_id(),
2688                    kind: hir::ConstArgKind::Error(
2689                        self.dcx().span_delayed_bug(DUMMY_SP, "no block"),
2690                    ),
2691                    span: DUMMY_SP,
2692                };
2693                hir::ConstItemRhs::TypeConst(self.arena.alloc(const_arg))
2694            }
2695        }
2696    }
2697
2698    fn ambient_direct_const_arg_context(&self) -> DirectConstArgContext {
2699        if self.tcx.features().macroless_generic_const_args() {
2700            DirectConstArgContext::MacrolessMinGenericConstArgs
2701        } else if self.tcx.features().min_generic_const_args() {
2702            DirectConstArgContext::MinGenericConstArgs
2703        } else {
2704            DirectConstArgContext::Stable
2705        }
2706    }
2707
2708    fn can_lower_path_to_const_arg_direct(
2709        &self,
2710        qself: &Option<Box<QSelf>>,
2711        path: &Path,
2712        span: Span,
2713        res: Option<Res<NodeId>>,
2714        context: DirectConstArgContext,
2715    ) -> Result<(), UnrepresentableConstArgError> {
2716        if let DirectConstArgContext::MacrolessMinGenericConstArgs = context {
2717            Ok(())
2718        } else if qself.is_none()
2719            && path.is_single_argless_ident()
2720            && #[allow(non_exhaustive_omitted_patterns)] match res {
    Some(Res::Def(DefKind::ConstParam, _)) => true,
    _ => false,
}matches!(res, Some(Res::Def(DefKind::ConstParam, _)))
2721        {
2722            Ok(())
2723        } else {
2724            Err(UnrepresentableConstArgError { span, will_create_def_ids: false })
2725        }
2726    }
2727
2728    x;#[instrument(level = "debug", skip(self), ret)]
2729    fn can_lower_expr_to_const_arg_direct(
2730        &self,
2731        expr: &Expr,
2732        context: DirectConstArgContext,
2733    ) -> Result<(), UnrepresentableConstArgError> {
2734        use DirectConstArgContext::*;
2735        // Note the only stable case is currently ExprKind::Path
2736        match (&expr.kind, context) {
2737            (
2738                ExprKind::Call(Expr { kind: ExprKind::Path(_, _), .. }, args),
2739                MacrolessMinGenericConstArgs,
2740            ) => {
2741                for arg in args {
2742                    self.can_lower_expr_to_const_arg_direct(arg, context)?;
2743                }
2744                Ok(())
2745            }
2746            (ExprKind::Tup(exprs), MacrolessMinGenericConstArgs) => {
2747                for expr in exprs {
2748                    self.can_lower_expr_to_const_arg_direct(expr, context)?;
2749                }
2750                Ok(())
2751            }
2752            (ExprKind::Path(qself, path), _) => {
2753                let res =
2754                    self.get_partial_res(expr.id).and_then(|partial_res| partial_res.full_res());
2755                self.can_lower_path_to_const_arg_direct(qself, path, expr.span, res, context)
2756            }
2757            (ExprKind::Struct(se), MacrolessMinGenericConstArgs) => {
2758                for f in &se.fields {
2759                    self.can_lower_expr_to_const_arg_direct(&f.expr, context)?;
2760                }
2761                Ok(())
2762            }
2763            (ExprKind::Array(elements), MacrolessMinGenericConstArgs) => {
2764                for element in elements {
2765                    self.can_lower_expr_to_const_arg_direct(element, context)?;
2766                }
2767                Ok(())
2768            }
2769            (ExprKind::Underscore, MacrolessMinGenericConstArgs) => Ok(()),
2770            (ExprKind::Paren(expr), MacrolessMinGenericConstArgs) => {
2771                self.can_lower_expr_to_const_arg_direct(expr, context)
2772            }
2773            (ExprKind::Block(block, _), MacrolessMinGenericConstArgs)
2774                if let [stmt] = block.stmts.as_slice()
2775                    && let StmtKind::Expr(expr) = &stmt.kind =>
2776            {
2777                self.can_lower_expr_to_const_arg_direct(expr, context)
2778            }
2779            (ExprKind::Lit(_), MacrolessMinGenericConstArgs) => Ok(()),
2780            (ExprKind::Unary(UnOp::Neg, inner_expr), MacrolessMinGenericConstArgs)
2781                if let ExprKind::Lit(_) = &inner_expr.kind =>
2782            {
2783                Ok(())
2784            }
2785            (ExprKind::ConstBlock(_), MacrolessMinGenericConstArgs) => Ok(()),
2786            (ExprKind::DirectConstArg(_), MacrolessMinGenericConstArgs | MinGenericConstArgs) => {
2787                // Always report this as able to be represented directly. If it turns out not to be,
2788                // `lower_expr_to_const_arg_direct` will report an error.
2789                Ok(())
2790            }
2791            _ => Err(UnrepresentableConstArgError::new(expr)),
2792        }
2793    }
2794
2795    /// It is not allowed to call this function without checking can_lower_path_to_const_arg_direct
2796    /// first, as we assume all feature gates/etc. have been checked already.
2797    fn lower_path_to_const_arg_direct(
2798        &mut self,
2799        id: NodeId,
2800        id_override: Option<NodeId>,
2801        qself: &Option<Box<QSelf>>,
2802        path: &Path,
2803        span: Span,
2804    ) -> hir::ConstArg<'hir> {
2805        let qpath = self.lower_qpath(
2806            id,
2807            qself,
2808            path,
2809            ParamMode::Explicit,
2810            AllowReturnTypeNotation::No,
2811            // FIXME(mgca): update for `fn foo() -> Bar<FOO<impl Trait>>` support
2812            ImplTraitContext::Disallowed(ImplTraitPosition::Path),
2813            None,
2814        );
2815
2816        let node_id = id_override.unwrap_or(id);
2817        ConstArg { hir_id: self.lower_node_id(node_id), kind: hir::ConstArgKind::Path(qpath), span }
2818    }
2819
2820    /// It is not allowed to call this function without checking can_lower_expr_to_const_arg_direct
2821    /// first, as we assume all feature gates/etc. have been checked already.
2822    x;#[instrument(level = "debug", skip(self), ret)]
2823    fn lower_expr_to_const_arg_direct(
2824        &mut self,
2825        expr: &Expr,
2826        id_override: Option<NodeId>,
2827    ) -> hir::ConstArg<'hir> {
2828        let span = self.lower_span(expr.span);
2829        let node_id = id_override.unwrap_or(expr.id);
2830        match &expr.kind {
2831            ExprKind::Call(func, args) if let ExprKind::Path(qself, path) = &func.kind => {
2832                let qpath = self.lower_qpath(
2833                    func.id,
2834                    qself,
2835                    path,
2836                    ParamMode::Explicit,
2837                    AllowReturnTypeNotation::No,
2838                    ImplTraitContext::Disallowed(ImplTraitPosition::Path),
2839                    None,
2840                );
2841
2842                let lowered_args = self.arena.alloc_from_iter(args.iter().map(|arg| {
2843                    let const_arg = self.lower_expr_to_const_arg_direct(arg, None);
2844                    &*self.arena.alloc(const_arg)
2845                }));
2846
2847                ConstArg {
2848                    hir_id: self.lower_node_id(node_id),
2849                    kind: hir::ConstArgKind::TupleCall(qpath, lowered_args),
2850                    span,
2851                }
2852            }
2853            ExprKind::Tup(exprs) => {
2854                let exprs = self.arena.alloc_from_iter(exprs.iter().map(|expr| {
2855                    let expr = self.lower_expr_to_const_arg_direct(expr, None);
2856                    &*self.arena.alloc(expr)
2857                }));
2858
2859                ConstArg {
2860                    hir_id: self.lower_node_id(node_id),
2861                    kind: hir::ConstArgKind::Tup(exprs),
2862                    span,
2863                }
2864            }
2865            ExprKind::Path(qself, path) => {
2866                self.lower_path_to_const_arg_direct(expr.id, id_override, qself, path, span)
2867            }
2868            ExprKind::Struct(se) => {
2869                let path = self.lower_qpath(
2870                    expr.id,
2871                    &se.qself,
2872                    &se.path,
2873                    // FIXME(mgca): we may want this to be `Optional` instead, but
2874                    // we would also need to make sure that HIR ty lowering errors
2875                    // when these paths wind up in signatures.
2876                    ParamMode::Explicit,
2877                    AllowReturnTypeNotation::No,
2878                    ImplTraitContext::Disallowed(ImplTraitPosition::Path),
2879                    None,
2880                );
2881
2882                let fields = self.arena.alloc_from_iter(se.fields.iter().map(|f| {
2883                    let hir_id = self.lower_node_id(f.id);
2884                    // FIXME(mgca): This might result in lowering attributes that
2885                    // then go unused as the `Target::ExprField` is not actually
2886                    // corresponding to `Node::ExprField`.
2887                    self.lower_attrs(hir_id, &f.attrs, f.span, Target::ExprField);
2888                    let expr = self.lower_expr_to_const_arg_direct(&f.expr, None);
2889
2890                    &*self.arena.alloc(hir::ConstArgExprField {
2891                        hir_id,
2892                        field: self.lower_ident(f.ident),
2893                        expr: self.arena.alloc(expr),
2894                        span: self.lower_span(f.span),
2895                    })
2896                }));
2897
2898                ConstArg {
2899                    hir_id: self.lower_node_id(node_id),
2900                    kind: hir::ConstArgKind::Struct(path, fields),
2901                    span,
2902                }
2903            }
2904            ExprKind::Array(elements) => {
2905                let lowered_elems = self.arena.alloc_from_iter(elements.iter().map(|element| {
2906                    let const_arg = self.lower_expr_to_const_arg_direct(element, None);
2907                    &*self.arena.alloc(const_arg)
2908                }));
2909                let array_expr = self.arena.alloc(hir::ConstArgArrayExpr {
2910                    span: self.lower_span(expr.span),
2911                    elems: lowered_elems,
2912                });
2913
2914                ConstArg {
2915                    hir_id: self.lower_node_id(node_id),
2916                    kind: hir::ConstArgKind::Array(array_expr),
2917                    span,
2918                }
2919            }
2920            ExprKind::Underscore => ConstArg {
2921                hir_id: self.lower_node_id(node_id),
2922                kind: hir::ConstArgKind::Infer(()),
2923                span,
2924            },
2925            ExprKind::Paren(expr) => self.lower_expr_to_const_arg_direct(expr, id_override),
2926            ExprKind::Block(block, _)
2927                if let [stmt] = block.stmts.as_slice()
2928                    && let StmtKind::Expr(expr) = &stmt.kind =>
2929            {
2930                self.lower_expr_to_const_arg_direct(expr, id_override)
2931            }
2932            ExprKind::Lit(literal) => {
2933                let span = self.lower_span(expr.span);
2934                let literal = self.lower_lit(literal, span);
2935
2936                ConstArg {
2937                    hir_id: self.lower_node_id(node_id),
2938                    kind: hir::ConstArgKind::Literal { lit: literal.node, negated: false },
2939                    span,
2940                }
2941            }
2942            ExprKind::Unary(UnOp::Neg, inner_expr)
2943                if let ExprKind::Lit(literal) = &inner_expr.kind =>
2944            {
2945                let span = self.lower_span(expr.span);
2946                let literal = self.lower_lit(literal, span);
2947
2948                let kind = if !matches!(literal.node, LitKind::Int(..)) {
2949                    let err =
2950                        self.dcx().struct_span_err(expr.span, "negated literal must be an integer");
2951                    hir::ConstArgKind::Error(err.emit())
2952                } else {
2953                    hir::ConstArgKind::Literal { lit: literal.node, negated: true }
2954                };
2955                ConstArg { hir_id: self.lower_node_id(node_id), kind, span }
2956            }
2957            ExprKind::ConstBlock(anon_const) => {
2958                // Do not use lower_anon_const_to_const_arg, as that attempts to represent the body
2959                // directly. Instead, force an anon const.
2960                let def_id = self.local_def_id(anon_const.id);
2961                assert_eq!(DefKind::AnonConst, self.tcx.def_kind(def_id));
2962                let lowered_anon = self.lower_anon_const_to_anon_const(anon_const, span);
2963                ConstArg {
2964                    hir_id: self.lower_node_id(node_id),
2965                    kind: hir::ConstArgKind::Anon(lowered_anon),
2966                    span,
2967                }
2968            }
2969            ExprKind::DirectConstArg(expr) => {
2970                // `can_lower_expr_to_const_arg_direct` always returns success upon encountering a
2971                // ExprKind::DirectConstArg, which effectively forces the expression to be lowered
2972                // as a direct arg. If it actually turns out to not be possible, emit an error
2973                // instead.
2974                // Always use MacrolessMinGenericConstArgs, even if we're under regular GCA, because
2975                // that's what the macro means: to enter a context that is like macroless GCA.
2976                match self.can_lower_expr_to_const_arg_direct(
2977                    expr,
2978                    DirectConstArgContext::MacrolessMinGenericConstArgs,
2979                ) {
2980                    Ok(()) => self.lower_expr_to_const_arg_direct(expr, id_override),
2981                    Err(err) => err.emit(self),
2982                }
2983            }
2984            _ => {
2985                span_bug!(
2986                    expr.span,
2987                    "lower_expr_to_const_arg_direct encountered an unlowerable expression, either \
2988                    can_lower_expr_to_const_arg_direct returned Ok() on something it shouldn't \
2989                    have, or you forgot to check can_lower_expr_to_const_arg_direct first"
2990                );
2991            }
2992        }
2993    }
2994
2995    /// See [`hir::ConstArg`] for when to use this function vs
2996    /// [`Self::lower_anon_const_to_anon_const`].
2997    fn lower_anon_const_to_const_arg_and_alloc(
2998        &mut self,
2999        anon: &AnonConst,
3000    ) -> &'hir hir::ConstArg<'hir> {
3001        self.arena.alloc(self.lower_anon_const_to_const_arg(anon))
3002    }
3003
3004    #[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(3004u32),
                                    ::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 = self.ambient_direct_const_arg_context();
            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))]
3005    fn lower_anon_const_to_const_arg(&mut self, anon: &AnonConst) -> hir::ConstArg<'hir> {
3006        // Stable only allows one nesting of blocks for directly represented paths. mGCA allows
3007        // arbitrarily many, and are handled inside lower_expr_to_const_arg_direct for consistency.
3008        let expr = if self.tcx.features().macroless_generic_const_args() {
3009            &anon.value
3010        } else {
3011            anon.value.maybe_unwrap_block()
3012        };
3013
3014        let context = self.ambient_direct_const_arg_context();
3015        if self.can_lower_expr_to_const_arg_direct(expr, context).is_ok() {
3016            return self.lower_expr_to_const_arg_direct(expr, Some(anon.id));
3017        }
3018
3019        let lowered_anon = self.lower_anon_const_to_anon_const(anon, anon.value.span);
3020        ConstArg {
3021            hir_id: self.next_id(),
3022            kind: hir::ConstArgKind::Anon(lowered_anon),
3023            span: self.lower_span(anon.value.span),
3024        }
3025    }
3026
3027    /// See [`hir::ConstArg`] for when to use this function vs
3028    /// [`Self::lower_anon_const_to_const_arg`].
3029    fn lower_anon_const_to_anon_const(
3030        &mut self,
3031        c: &AnonConst,
3032        span: Span,
3033    ) -> &'hir hir::AnonConst {
3034        self.arena.alloc(self.with_new_scopes(c.value.span, |this| {
3035            let def_id = this.local_def_id(c.id);
3036            let hir_id = this.lower_node_id(c.id);
3037            hir::AnonConst {
3038                def_id,
3039                hir_id,
3040                body: this.lower_const_body(c.value.span, Some(&c.value)),
3041                span: this.lower_span(span),
3042            }
3043        }))
3044    }
3045
3046    fn lower_unsafe_source(&mut self, u: UnsafeSource) -> hir::UnsafeSource {
3047        match u {
3048            CompilerGenerated => hir::UnsafeSource::CompilerGenerated,
3049            UserProvided => hir::UnsafeSource::UserProvided,
3050        }
3051    }
3052
3053    fn lower_trait_bound_modifiers(
3054        &mut self,
3055        modifiers: TraitBoundModifiers,
3056    ) -> hir::TraitBoundModifiers {
3057        let constness = match modifiers.constness {
3058            BoundConstness::Never => BoundConstness::Never,
3059            BoundConstness::Always(span) => BoundConstness::Always(self.lower_span(span)),
3060            BoundConstness::Maybe(span) => BoundConstness::Maybe(self.lower_span(span)),
3061        };
3062        let polarity = match modifiers.polarity {
3063            BoundPolarity::Positive => BoundPolarity::Positive,
3064            BoundPolarity::Negative(span) => BoundPolarity::Negative(self.lower_span(span)),
3065            BoundPolarity::Maybe(span) => BoundPolarity::Maybe(self.lower_span(span)),
3066        };
3067        hir::TraitBoundModifiers { constness, polarity }
3068    }
3069
3070    // Helper methods for building HIR.
3071
3072    fn stmt(&mut self, span: Span, kind: hir::StmtKind<'hir>) -> hir::Stmt<'hir> {
3073        hir::Stmt { span: self.lower_span(span), kind, hir_id: self.next_id() }
3074    }
3075
3076    fn stmt_expr(&mut self, span: Span, expr: hir::Expr<'hir>) -> hir::Stmt<'hir> {
3077        self.stmt(span, hir::StmtKind::Expr(self.arena.alloc(expr)))
3078    }
3079
3080    fn stmt_let_pat(
3081        &mut self,
3082        attrs: Option<&'hir [hir::Attribute]>,
3083        span: Span,
3084        init: Option<&'hir hir::Expr<'hir>>,
3085        pat: &'hir hir::Pat<'hir>,
3086        source: hir::LocalSource,
3087    ) -> hir::Stmt<'hir> {
3088        let hir_id = self.next_id();
3089        if let Some(a) = attrs {
3090            if !!a.is_empty() {
    ::core::panicking::panic("assertion failed: !a.is_empty()")
};assert!(!a.is_empty());
3091            self.attrs.insert(hir_id.local_id, a);
3092        }
3093        let local = hir::LetStmt {
3094            super_: None,
3095            hir_id,
3096            init,
3097            pat,
3098            els: None,
3099            source,
3100            span: self.lower_span(span),
3101            ty: None,
3102        };
3103        self.stmt(span, hir::StmtKind::Let(self.arena.alloc(local)))
3104    }
3105
3106    fn stmt_super_let_pat(
3107        &mut self,
3108        span: Span,
3109        pat: &'hir hir::Pat<'hir>,
3110        init: Option<&'hir hir::Expr<'hir>>,
3111    ) -> hir::Stmt<'hir> {
3112        let hir_id = self.next_id();
3113        let span = self.lower_span(span);
3114        let local = hir::LetStmt {
3115            super_: Some(span),
3116            hir_id,
3117            init,
3118            pat,
3119            els: None,
3120            source: hir::LocalSource::Normal,
3121            span,
3122            ty: None,
3123        };
3124        self.stmt(span, hir::StmtKind::Let(self.arena.alloc(local)))
3125    }
3126
3127    fn block_expr(&mut self, expr: &'hir hir::Expr<'hir>) -> &'hir hir::Block<'hir> {
3128        self.block_all(expr.span, &[], Some(expr))
3129    }
3130
3131    fn block_all(
3132        &mut self,
3133        span: Span,
3134        stmts: &'hir [hir::Stmt<'hir>],
3135        expr: Option<&'hir hir::Expr<'hir>>,
3136    ) -> &'hir hir::Block<'hir> {
3137        let blk = hir::Block {
3138            stmts,
3139            expr,
3140            hir_id: self.next_id(),
3141            rules: hir::BlockCheckMode::DefaultBlock,
3142            span: self.lower_span(span),
3143            targeted_by_break: false,
3144        };
3145        self.arena.alloc(blk)
3146    }
3147
3148    fn pat_cf_continue(&mut self, span: Span, pat: &'hir hir::Pat<'hir>) -> &'hir hir::Pat<'hir> {
3149        let field = self.single_pat_field(span, pat);
3150        self.pat_lang_item_variant(span, LangItem::ControlFlowContinue, field)
3151    }
3152
3153    fn pat_cf_break(&mut self, span: Span, pat: &'hir hir::Pat<'hir>) -> &'hir hir::Pat<'hir> {
3154        let field = self.single_pat_field(span, pat);
3155        self.pat_lang_item_variant(span, LangItem::ControlFlowBreak, field)
3156    }
3157
3158    fn pat_some(&mut self, span: Span, pat: &'hir hir::Pat<'hir>) -> &'hir hir::Pat<'hir> {
3159        let field = self.single_pat_field(span, pat);
3160        self.pat_lang_item_variant(span, LangItem::OptionSome, field)
3161    }
3162
3163    fn pat_none(&mut self, span: Span) -> &'hir hir::Pat<'hir> {
3164        self.pat_lang_item_variant(span, LangItem::OptionNone, &[])
3165    }
3166
3167    fn single_pat_field(
3168        &mut self,
3169        span: Span,
3170        pat: &'hir hir::Pat<'hir>,
3171    ) -> &'hir [hir::PatField<'hir>] {
3172        let field = hir::PatField {
3173            hir_id: self.next_id(),
3174            ident: Ident::new(sym::integer(0), self.lower_span(span)),
3175            is_shorthand: false,
3176            pat,
3177            span: self.lower_span(span),
3178        };
3179        self.arena.alloc_from_iter([field])arena_vec![self; field]
3180    }
3181
3182    fn pat_lang_item_variant(
3183        &mut self,
3184        span: Span,
3185        lang_item: LangItem,
3186        fields: &'hir [hir::PatField<'hir>],
3187    ) -> &'hir hir::Pat<'hir> {
3188        let path = self.make_lang_item_qpath(lang_item, self.lower_span(span), None);
3189        self.pat(span, hir::PatKind::Struct(path, fields, None))
3190    }
3191
3192    fn pat_ident(&mut self, span: Span, ident: Ident) -> (&'hir hir::Pat<'hir>, HirId) {
3193        self.pat_ident_binding_mode(span, ident, hir::BindingMode::NONE)
3194    }
3195
3196    fn pat_ident_mut(&mut self, span: Span, ident: Ident) -> (hir::Pat<'hir>, HirId) {
3197        self.pat_ident_binding_mode_mut(span, ident, hir::BindingMode::NONE)
3198    }
3199
3200    fn pat_ident_binding_mode(
3201        &mut self,
3202        span: Span,
3203        ident: Ident,
3204        bm: hir::BindingMode,
3205    ) -> (&'hir hir::Pat<'hir>, HirId) {
3206        let (pat, hir_id) = self.pat_ident_binding_mode_mut(span, ident, bm);
3207        (self.arena.alloc(pat), hir_id)
3208    }
3209
3210    fn pat_ident_binding_mode_mut(
3211        &mut self,
3212        span: Span,
3213        ident: Ident,
3214        bm: hir::BindingMode,
3215    ) -> (hir::Pat<'hir>, HirId) {
3216        let hir_id = self.next_id();
3217
3218        (
3219            hir::Pat {
3220                hir_id,
3221                kind: hir::PatKind::Binding(bm, hir_id, self.lower_ident(ident), None),
3222                span: self.lower_span(span),
3223                default_binding_modes: true,
3224            },
3225            hir_id,
3226        )
3227    }
3228
3229    fn pat(&mut self, span: Span, kind: hir::PatKind<'hir>) -> &'hir hir::Pat<'hir> {
3230        self.arena.alloc(hir::Pat {
3231            hir_id: self.next_id(),
3232            kind,
3233            span: self.lower_span(span),
3234            default_binding_modes: true,
3235        })
3236    }
3237
3238    fn pat_without_dbm(&mut self, span: Span, kind: hir::PatKind<'hir>) -> hir::Pat<'hir> {
3239        hir::Pat {
3240            hir_id: self.next_id(),
3241            kind,
3242            span: self.lower_span(span),
3243            default_binding_modes: false,
3244        }
3245    }
3246
3247    fn ty_path(&mut self, mut hir_id: HirId, span: Span, qpath: hir::QPath<'hir>) -> hir::Ty<'hir> {
3248        let kind = match qpath {
3249            hir::QPath::Resolved(None, path) => {
3250                // Turn trait object paths into `TyKind::TraitObject` instead.
3251                match path.res {
3252                    Res::Def(DefKind::Trait | DefKind::TraitAlias, _) => {
3253                        let principal = hir::PolyTraitRef {
3254                            bound_generic_params: &[],
3255                            modifiers: hir::TraitBoundModifiers::NONE,
3256                            trait_ref: hir::TraitRef { path, hir_ref_id: hir_id },
3257                            span: self.lower_span(span),
3258                        };
3259
3260                        // The original ID is taken by the `PolyTraitRef`,
3261                        // so the `Ty` itself needs a different one.
3262                        hir_id = self.next_id();
3263                        hir::TyKind::TraitObject(
3264                            self.arena.alloc_from_iter([principal])arena_vec![self; principal],
3265                            TaggedRef::new(self.elided_dyn_bound(span), TraitObjectSyntax::None),
3266                        )
3267                    }
3268                    _ => hir::TyKind::Path(hir::QPath::Resolved(None, path)),
3269                }
3270            }
3271            _ => hir::TyKind::Path(qpath),
3272        };
3273
3274        hir::Ty { hir_id, kind, span: self.lower_span(span) }
3275    }
3276
3277    /// Invoked to create the lifetime argument(s) for an elided trait object
3278    /// bound, like the bound in `Box<dyn Debug>`. This method is not invoked
3279    /// when the bound is written, even if it is written with `'_` like in
3280    /// `Box<dyn Debug + '_>`. In those cases, `lower_lifetime` is invoked.
3281    fn elided_dyn_bound(&mut self, span: Span) -> &'hir hir::Lifetime {
3282        let r = hir::Lifetime::new(
3283            self.next_id(),
3284            Ident::new(kw::UnderscoreLifetime, self.lower_span(span)),
3285            hir::LifetimeKind::ImplicitObjectLifetimeDefault,
3286            LifetimeSource::Other,
3287            LifetimeSyntax::Implicit,
3288        );
3289        {
    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:3289",
                        "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(3289u32),
                        ::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);
3290        self.arena.alloc(r)
3291    }
3292}
3293
3294/// Helper struct for the delayed construction of [`hir::GenericArgs`].
3295struct GenericArgsCtor<'hir> {
3296    args: SmallVec<[hir::GenericArg<'hir>; 4]>,
3297    constraints: &'hir [hir::AssocItemConstraint<'hir>],
3298    parenthesized: hir::GenericArgsParentheses,
3299    span: Span,
3300}
3301
3302impl<'hir> GenericArgsCtor<'hir> {
3303    fn is_empty(&self) -> bool {
3304        self.args.is_empty()
3305            && self.constraints.is_empty()
3306            && self.parenthesized == hir::GenericArgsParentheses::No
3307    }
3308
3309    fn into_generic_args(self, this: &LoweringContext<'_, 'hir>) -> &'hir hir::GenericArgs<'hir> {
3310        let ga = hir::GenericArgs {
3311            args: this.arena.alloc_from_iter(self.args),
3312            constraints: self.constraints,
3313            parenthesized: self.parenthesized,
3314            span_ext: this.lower_span(self.span),
3315        };
3316        this.arena.alloc(ga)
3317    }
3318}
3319
3320#[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)]
3321enum DirectConstArgContext {
3322    /// The only allowed direct const arg representation is simple paths that nameres to generic
3323    /// const parameters.
3324    Stable,
3325    /// The allowed representations are what is allowed on stable, plus the `direct_const_arg!` macro.
3326    MinGenericConstArgs,
3327    /// Expressions attempt to be lowered directly, and if that fails, the expression falls back to
3328    /// being represented as an anon const.
3329    ///
3330    /// This context is also used under MinGenericConstArgs inside a `direct_const_arg!` macro, for
3331    /// simplicity, as they allow the same code.
3332    MacrolessMinGenericConstArgs,
3333}
3334
3335#[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)]
3336struct UnrepresentableConstArgError {
3337    span: Span,
3338    will_create_def_ids: bool,
3339}
3340
3341impl UnrepresentableConstArgError {
3342    fn new(expr: &Expr) -> Self {
3343        Self {
3344            span: expr.span,
3345            will_create_def_ids: expr::WillCreateDefIdsVisitor.visit_expr(expr).is_break(),
3346        }
3347    }
3348
3349    fn emit<'hir>(self, lowering_context: &mut LoweringContext<'_, 'hir>) -> ConstArg<'hir> {
3350        let msg = "complex const arguments must be placed inside of a `const` block";
3351        let e = if self.will_create_def_ids {
3352            // FIXME(mgca): make this non-fatal once we have a better way to handle
3353            // nested items in const args
3354            // Issue: https://github.com/rust-lang/rust/issues/154539
3355            lowering_context.dcx().struct_span_fatal(self.span, msg).emit()
3356        } else {
3357            lowering_context.dcx().struct_span_err(self.span, msg).emit()
3358        };
3359
3360        ConstArg {
3361            hir_id: lowering_context.next_id(),
3362            kind: hir::ConstArgKind::Error(e),
3363            span: self.span,
3364        }
3365    }
3366}