]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_ast_lowering/src/lib.rs
Address nits
[rust.git] / compiler / rustc_ast_lowering / src / 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 #![feature(box_patterns)]
34 #![feature(let_chains)]
35 #![feature(let_else)]
36 #![feature(never_type)]
37 #![recursion_limit = "256"]
38 #![allow(rustc::potential_query_instability)]
39 #![deny(rustc::untranslatable_diagnostic)]
40 #![deny(rustc::diagnostic_outside_of_impl)]
41
42 #[macro_use]
43 extern crate tracing;
44
45 use crate::errors::{AssocTyParentheses, AssocTyParenthesesSub, MisplacedImplTrait, TraitFnAsync};
46
47 use rustc_arena::declare_arena;
48 use rustc_ast::ptr::P;
49 use rustc_ast::visit;
50 use rustc_ast::{self as ast, *};
51 use rustc_ast_pretty::pprust;
52 use rustc_data_structures::captures::Captures;
53 use rustc_data_structures::fingerprint::Fingerprint;
54 use rustc_data_structures::fx::FxHashMap;
55 use rustc_data_structures::sorted_map::SortedMap;
56 use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
57 use rustc_data_structures::sync::Lrc;
58 use rustc_errors::{DiagnosticArgFromDisplay, Handler, StashKey};
59 use rustc_hir as hir;
60 use rustc_hir::def::{DefKind, LifetimeRes, Namespace, PartialRes, PerNS, Res};
61 use rustc_hir::def_id::{LocalDefId, CRATE_DEF_ID};
62 use rustc_hir::definitions::DefPathData;
63 use rustc_hir::{ConstArg, GenericArg, ItemLocalId, ParamName, TraitCandidate};
64 use rustc_index::vec::{Idx, IndexVec};
65 use rustc_middle::span_bug;
66 use rustc_middle::ty::{ResolverAstLowering, TyCtxt};
67 use rustc_session::parse::feature_err;
68 use rustc_span::hygiene::MacroKind;
69 use rustc_span::source_map::DesugaringKind;
70 use rustc_span::symbol::{kw, sym, Ident, Symbol};
71 use rustc_span::{Span, DUMMY_SP};
72
73 use smallvec::SmallVec;
74 use std::collections::hash_map::Entry;
75
76 macro_rules! arena_vec {
77     ($this:expr; $($x:expr),*) => (
78         $this.arena.alloc_from_iter([$($x),*])
79     );
80 }
81
82 mod asm;
83 mod block;
84 mod errors;
85 mod expr;
86 mod index;
87 mod item;
88 mod lifetime_collector;
89 mod pat;
90 mod path;
91
92 struct LoweringContext<'a, 'hir> {
93     tcx: TyCtxt<'hir>,
94     resolver: &'a mut ResolverAstLowering,
95
96     /// Used to allocate HIR nodes.
97     arena: &'hir hir::Arena<'hir>,
98
99     /// Used to allocate temporary AST nodes for use during lowering.
100     /// This allows us to create "fake" AST -- these nodes can sometimes
101     /// be allocated on the stack, but other times we need them to live longer
102     /// than the current stack frame, so they can be collected into vectors
103     /// and things like that.
104     ast_arena: &'a Arena<'static>,
105
106     /// Bodies inside the owner being lowered.
107     bodies: Vec<(hir::ItemLocalId, &'hir hir::Body<'hir>)>,
108     /// Attributes inside the owner being lowered.
109     attrs: SortedMap<hir::ItemLocalId, &'hir [Attribute]>,
110     /// Collect items that were created by lowering the current owner.
111     children: FxHashMap<LocalDefId, hir::MaybeOwner<&'hir hir::OwnerInfo<'hir>>>,
112
113     generator_kind: Option<hir::GeneratorKind>,
114
115     /// When inside an `async` context, this is the `HirId` of the
116     /// `task_context` local bound to the resume argument of the generator.
117     task_context: Option<hir::HirId>,
118
119     /// Used to get the current `fn`'s def span to point to when using `await`
120     /// outside of an `async fn`.
121     current_item: Option<Span>,
122
123     catch_scope: Option<NodeId>,
124     loop_scope: Option<NodeId>,
125     is_in_loop_condition: bool,
126     is_in_trait_impl: bool,
127     is_in_dyn_type: bool,
128
129     current_hir_id_owner: LocalDefId,
130     item_local_id_counter: hir::ItemLocalId,
131     local_id_to_def_id: SortedMap<ItemLocalId, LocalDefId>,
132     trait_map: FxHashMap<ItemLocalId, Box<[TraitCandidate]>>,
133
134     impl_trait_defs: Vec<hir::GenericParam<'hir>>,
135     impl_trait_bounds: Vec<hir::WherePredicate<'hir>>,
136
137     /// NodeIds that are lowered inside the current HIR owner.
138     node_id_to_local_id: FxHashMap<NodeId, hir::ItemLocalId>,
139
140     allow_try_trait: Option<Lrc<[Symbol]>>,
141     allow_gen_future: Option<Lrc<[Symbol]>>,
142     allow_into_future: Option<Lrc<[Symbol]>>,
143
144     /// Mapping from generics `def_id`s to TAIT generics `def_id`s.
145     /// For each captured lifetime (e.g., 'a), we create a new lifetime parameter that is a generic
146     /// defined on the TAIT, so we have type Foo<'a1> = ... and we establish a mapping in this
147     /// field from the original parameter 'a to the new parameter 'a1.
148     generics_def_id_map: Vec<FxHashMap<LocalDefId, LocalDefId>>,
149 }
150
151 declare_arena!([
152     [] tys: rustc_ast::Ty,
153     [] aba: rustc_ast::AngleBracketedArgs,
154     [] ptr: rustc_ast::PolyTraitRef,
155     // This _marker field is needed because `declare_arena` creates `Arena<'tcx>` and we need to
156     // use `'tcx`. If we don't have this we get a compile error.
157     [] _marker: std::marker::PhantomData<&'tcx ()>,
158 ]);
159
160 trait ResolverAstLoweringExt {
161     fn legacy_const_generic_args(&self, expr: &Expr) -> Option<Vec<usize>>;
162     fn get_partial_res(&self, id: NodeId) -> Option<PartialRes>;
163     fn get_import_res(&self, id: NodeId) -> PerNS<Option<Res<NodeId>>>;
164     fn get_label_res(&self, id: NodeId) -> Option<NodeId>;
165     fn get_lifetime_res(&self, id: NodeId) -> Option<LifetimeRes>;
166     fn take_extra_lifetime_params(&mut self, id: NodeId) -> Vec<(Ident, NodeId, LifetimeRes)>;
167     fn decl_macro_kind(&self, def_id: LocalDefId) -> MacroKind;
168 }
169
170 impl ResolverAstLoweringExt for ResolverAstLowering {
171     fn legacy_const_generic_args(&self, expr: &Expr) -> Option<Vec<usize>> {
172         if let ExprKind::Path(None, path) = &expr.kind {
173             // Don't perform legacy const generics rewriting if the path already
174             // has generic arguments.
175             if path.segments.last().unwrap().args.is_some() {
176                 return None;
177             }
178
179             let partial_res = self.partial_res_map.get(&expr.id)?;
180             if partial_res.unresolved_segments() != 0 {
181                 return None;
182             }
183
184             if let Res::Def(DefKind::Fn, def_id) = partial_res.base_res() {
185                 // We only support cross-crate argument rewriting. Uses
186                 // within the same crate should be updated to use the new
187                 // const generics style.
188                 if def_id.is_local() {
189                     return None;
190                 }
191
192                 if let Some(v) = self.legacy_const_generic_args.get(&def_id) {
193                     return v.clone();
194                 }
195             }
196         }
197
198         None
199     }
200
201     /// Obtains resolution for a `NodeId` with a single resolution.
202     fn get_partial_res(&self, id: NodeId) -> Option<PartialRes> {
203         self.partial_res_map.get(&id).copied()
204     }
205
206     /// Obtains per-namespace resolutions for `use` statement with the given `NodeId`.
207     fn get_import_res(&self, id: NodeId) -> PerNS<Option<Res<NodeId>>> {
208         self.import_res_map.get(&id).copied().unwrap_or_default()
209     }
210
211     /// Obtains resolution for a label with the given `NodeId`.
212     fn get_label_res(&self, id: NodeId) -> Option<NodeId> {
213         self.label_res_map.get(&id).copied()
214     }
215
216     /// Obtains resolution for a lifetime with the given `NodeId`.
217     fn get_lifetime_res(&self, id: NodeId) -> Option<LifetimeRes> {
218         self.lifetimes_res_map.get(&id).copied()
219     }
220
221     /// Obtain the list of lifetimes parameters to add to an item.
222     ///
223     /// Extra lifetime parameters should only be added in places that can appear
224     /// as a `binder` in `LifetimeRes`.
225     ///
226     /// The extra lifetimes that appear from the parenthesized `Fn`-trait desugaring
227     /// should appear at the enclosing `PolyTraitRef`.
228     fn take_extra_lifetime_params(&mut self, id: NodeId) -> Vec<(Ident, NodeId, LifetimeRes)> {
229         self.extra_lifetime_params_map.remove(&id).unwrap_or_default()
230     }
231
232     fn decl_macro_kind(&self, def_id: LocalDefId) -> MacroKind {
233         self.builtin_macro_kinds.get(&def_id).copied().unwrap_or(MacroKind::Bang)
234     }
235 }
236
237 /// Context of `impl Trait` in code, which determines whether it is allowed in an HIR subtree,
238 /// and if so, what meaning it has.
239 #[derive(Debug, Copy, Clone, PartialEq, Eq)]
240 enum ImplTraitContext {
241     /// Treat `impl Trait` as shorthand for a new universal generic parameter.
242     /// Example: `fn foo(x: impl Debug)`, where `impl Debug` is conceptually
243     /// equivalent to a fresh universal parameter like `fn foo<T: Debug>(x: T)`.
244     ///
245     /// Newly generated parameters should be inserted into the given `Vec`.
246     Universal,
247
248     /// Treat `impl Trait` as shorthand for a new opaque type.
249     /// Example: `fn foo() -> impl Debug`, where `impl Debug` is conceptually
250     /// equivalent to a new opaque type like `type T = impl Debug; fn foo() -> T`.
251     ///
252     ReturnPositionOpaqueTy {
253         /// Origin: Either OpaqueTyOrigin::FnReturn or OpaqueTyOrigin::AsyncFn,
254         origin: hir::OpaqueTyOrigin,
255     },
256     /// Impl trait in type aliases.
257     TypeAliasesOpaqueTy,
258     /// Return-position `impl Trait` in trait definition
259     InTrait,
260     /// `impl Trait` is not accepted in this position.
261     Disallowed(ImplTraitPosition),
262 }
263
264 /// Position in which `impl Trait` is disallowed.
265 #[derive(Debug, Copy, Clone, PartialEq, Eq)]
266 enum ImplTraitPosition {
267     Path,
268     Variable,
269     Type,
270     Trait,
271     AsyncBlock,
272     Bound,
273     Generic,
274     ExternFnParam,
275     ClosureParam,
276     PointerParam,
277     FnTraitParam,
278     TraitParam,
279     ImplParam,
280     ExternFnReturn,
281     ClosureReturn,
282     PointerReturn,
283     FnTraitReturn,
284     TraitReturn,
285     ImplReturn,
286 }
287
288 impl std::fmt::Display for ImplTraitPosition {
289     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
290         let name = match self {
291             ImplTraitPosition::Path => "path",
292             ImplTraitPosition::Variable => "variable binding",
293             ImplTraitPosition::Type => "type",
294             ImplTraitPosition::Trait => "trait",
295             ImplTraitPosition::AsyncBlock => "async block",
296             ImplTraitPosition::Bound => "bound",
297             ImplTraitPosition::Generic => "generic",
298             ImplTraitPosition::ExternFnParam => "`extern fn` param",
299             ImplTraitPosition::ClosureParam => "closure param",
300             ImplTraitPosition::PointerParam => "`fn` pointer param",
301             ImplTraitPosition::FnTraitParam => "`Fn` trait param",
302             ImplTraitPosition::TraitParam => "trait method param",
303             ImplTraitPosition::ImplParam => "`impl` method param",
304             ImplTraitPosition::ExternFnReturn => "`extern fn` return",
305             ImplTraitPosition::ClosureReturn => "closure return",
306             ImplTraitPosition::PointerReturn => "`fn` pointer return",
307             ImplTraitPosition::FnTraitReturn => "`Fn` trait return",
308             ImplTraitPosition::TraitReturn => "trait method return",
309             ImplTraitPosition::ImplReturn => "`impl` method return",
310         };
311
312         write!(f, "{}", name)
313     }
314 }
315
316 #[derive(Debug)]
317 enum FnDeclKind {
318     Fn,
319     Inherent,
320     ExternFn,
321     Closure,
322     Pointer,
323     Trait,
324     Impl,
325 }
326
327 impl FnDeclKind {
328     fn impl_trait_return_allowed(&self, tcx: TyCtxt<'_>) -> bool {
329         match self {
330             FnDeclKind::Fn | FnDeclKind::Inherent => true,
331             FnDeclKind::Impl if tcx.features().return_position_impl_trait_in_trait => true,
332             _ => false,
333         }
334     }
335
336     fn impl_trait_in_trait_allowed(&self, tcx: TyCtxt<'_>) -> bool {
337         match self {
338             FnDeclKind::Trait if tcx.features().return_position_impl_trait_in_trait => true,
339             _ => false,
340         }
341     }
342 }
343
344 #[derive(Copy, Clone)]
345 enum AstOwner<'a> {
346     NonOwner,
347     Crate(&'a ast::Crate),
348     Item(&'a ast::Item),
349     AssocItem(&'a ast::AssocItem, visit::AssocCtxt),
350     ForeignItem(&'a ast::ForeignItem),
351 }
352
353 fn index_crate<'a>(
354     node_id_to_def_id: &FxHashMap<NodeId, LocalDefId>,
355     krate: &'a Crate,
356 ) -> IndexVec<LocalDefId, AstOwner<'a>> {
357     let mut indexer = Indexer { node_id_to_def_id, index: IndexVec::new() };
358     indexer.index.ensure_contains_elem(CRATE_DEF_ID, || AstOwner::NonOwner);
359     indexer.index[CRATE_DEF_ID] = AstOwner::Crate(krate);
360     visit::walk_crate(&mut indexer, krate);
361     return indexer.index;
362
363     struct Indexer<'s, 'a> {
364         node_id_to_def_id: &'s FxHashMap<NodeId, LocalDefId>,
365         index: IndexVec<LocalDefId, AstOwner<'a>>,
366     }
367
368     impl<'a> visit::Visitor<'a> for Indexer<'_, 'a> {
369         fn visit_attribute(&mut self, _: &'a Attribute) {
370             // We do not want to lower expressions that appear in attributes,
371             // as they are not accessible to the rest of the HIR.
372         }
373
374         fn visit_item(&mut self, item: &'a ast::Item) {
375             let def_id = self.node_id_to_def_id[&item.id];
376             self.index.ensure_contains_elem(def_id, || AstOwner::NonOwner);
377             self.index[def_id] = AstOwner::Item(item);
378             visit::walk_item(self, item)
379         }
380
381         fn visit_assoc_item(&mut self, item: &'a ast::AssocItem, ctxt: visit::AssocCtxt) {
382             let def_id = self.node_id_to_def_id[&item.id];
383             self.index.ensure_contains_elem(def_id, || AstOwner::NonOwner);
384             self.index[def_id] = AstOwner::AssocItem(item, ctxt);
385             visit::walk_assoc_item(self, item, ctxt);
386         }
387
388         fn visit_foreign_item(&mut self, item: &'a ast::ForeignItem) {
389             let def_id = self.node_id_to_def_id[&item.id];
390             self.index.ensure_contains_elem(def_id, || AstOwner::NonOwner);
391             self.index[def_id] = AstOwner::ForeignItem(item);
392             visit::walk_foreign_item(self, item);
393         }
394     }
395 }
396
397 /// Compute the hash for the HIR of the full crate.
398 /// This hash will then be part of the crate_hash which is stored in the metadata.
399 fn compute_hir_hash(
400     tcx: TyCtxt<'_>,
401     owners: &IndexVec<LocalDefId, hir::MaybeOwner<&hir::OwnerInfo<'_>>>,
402 ) -> Fingerprint {
403     let mut hir_body_nodes: Vec<_> = owners
404         .iter_enumerated()
405         .filter_map(|(def_id, info)| {
406             let info = info.as_owner()?;
407             let def_path_hash = tcx.hir().def_path_hash(def_id);
408             Some((def_path_hash, info))
409         })
410         .collect();
411     hir_body_nodes.sort_unstable_by_key(|bn| bn.0);
412
413     tcx.with_stable_hashing_context(|mut hcx| {
414         let mut stable_hasher = StableHasher::new();
415         hir_body_nodes.hash_stable(&mut hcx, &mut stable_hasher);
416         stable_hasher.finish()
417     })
418 }
419
420 pub fn lower_to_hir<'hir>(tcx: TyCtxt<'hir>, (): ()) -> hir::Crate<'hir> {
421     let sess = tcx.sess;
422     let krate = tcx.untracked_crate.steal();
423     let mut resolver = tcx.resolver_for_lowering(()).steal();
424
425     let ast_index = index_crate(&resolver.node_id_to_def_id, &krate);
426     let mut owners = IndexVec::from_fn_n(
427         |_| hir::MaybeOwner::Phantom,
428         tcx.definitions_untracked().def_index_count(),
429     );
430
431     let ast_arena = Arena::default();
432
433     for def_id in ast_index.indices() {
434         item::ItemLowerer {
435             tcx,
436             resolver: &mut resolver,
437             ast_arena: &ast_arena,
438             ast_index: &ast_index,
439             owners: &mut owners,
440         }
441         .lower_node(def_id);
442     }
443
444     // Drop AST to free memory
445     std::mem::drop(ast_index);
446     sess.time("drop_ast", || std::mem::drop(krate));
447
448     // Discard hygiene data, which isn't required after lowering to HIR.
449     if !sess.opts.unstable_opts.keep_hygiene_data {
450         rustc_span::hygiene::clear_syntax_context_map();
451     }
452
453     let hir_hash = compute_hir_hash(tcx, &owners);
454     hir::Crate { owners, hir_hash }
455 }
456
457 #[derive(Copy, Clone, PartialEq, Debug)]
458 enum ParamMode {
459     /// Any path in a type context.
460     Explicit,
461     /// Path in a type definition, where the anonymous lifetime `'_` is not allowed.
462     ExplicitNamed,
463     /// The `module::Type` in `module::Type::method` in an expression.
464     Optional,
465 }
466
467 enum ParenthesizedGenericArgs {
468     Ok,
469     Err,
470 }
471
472 impl<'a, 'hir> LoweringContext<'a, 'hir> {
473     fn create_def(
474         &mut self,
475         parent: LocalDefId,
476         node_id: ast::NodeId,
477         data: DefPathData,
478     ) -> LocalDefId {
479         debug_assert_ne!(node_id, ast::DUMMY_NODE_ID);
480         assert!(
481             self.opt_local_def_id(node_id).is_none(),
482             "adding a def'n for node-id {:?} and data {:?} but a previous def'n exists: {:?}",
483             node_id,
484             data,
485             self.tcx.hir().def_key(self.local_def_id(node_id)),
486         );
487
488         let def_id = self.tcx.create_def(parent, data);
489
490         debug!("create_def: def_id_to_node_id[{:?}] <-> {:?}", def_id, node_id);
491         self.resolver.node_id_to_def_id.insert(node_id, def_id);
492
493         def_id
494     }
495
496     fn next_node_id(&mut self) -> NodeId {
497         let start = self.resolver.next_node_id;
498         let next = start.as_u32().checked_add(1).expect("input too large; ran out of NodeIds");
499         self.resolver.next_node_id = ast::NodeId::from_u32(next);
500         start
501     }
502
503     /// Given the id of some node in the AST, finds the `LocalDefId` associated with it by the name
504     /// resolver (if any), after applying any remapping from `get_remapped_def_id`.
505     ///
506     /// For example, in a function like `fn foo<'a>(x: &'a u32)`,
507     /// invoking with the id from the `ast::Lifetime` node found inside
508     /// the `&'a u32` type would return the `LocalDefId` of the
509     /// `'a` parameter declared on `foo`.
510     ///
511     /// This function also applies remapping from `get_remapped_def_id`.
512     /// These are used when synthesizing opaque types from `-> impl Trait` return types and so forth.
513     /// For example, in a function like `fn foo<'a>() -> impl Debug + 'a`,
514     /// we would create an opaque type `type FooReturn<'a1> = impl Debug + 'a1`.
515     /// When lowering the `Debug + 'a` bounds, we add a remapping to map `'a` to `'a1`.
516     fn opt_local_def_id(&self, node: NodeId) -> Option<LocalDefId> {
517         self.resolver
518             .node_id_to_def_id
519             .get(&node)
520             .map(|local_def_id| self.get_remapped_def_id(*local_def_id))
521     }
522
523     fn local_def_id(&self, node: NodeId) -> LocalDefId {
524         self.opt_local_def_id(node).unwrap_or_else(|| panic!("no entry for node id: `{:?}`", node))
525     }
526
527     /// Get the previously recorded `to` local def id given the `from` local def id, obtained using
528     /// `generics_def_id_map` field.
529     fn get_remapped_def_id(&self, mut local_def_id: LocalDefId) -> LocalDefId {
530         // `generics_def_id_map` is a stack of mappings. As we go deeper in impl traits nesting we
531         // push new mappings so we need to try first the latest mappings, hence `iter().rev()`.
532         //
533         // Consider:
534         //
535         // `fn test<'a, 'b>() -> impl Trait<&'a u8, Ty = impl Sized + 'b> {}`
536         //
537         // We would end with a generics_def_id_map like:
538         //
539         // `[[fn#'b -> impl_trait#'b], [fn#'b -> impl_sized#'b]]`
540         //
541         // for the opaque type generated on `impl Sized + 'b`, We want the result to be:
542         // impl_sized#'b, so iterating forward is the wrong thing to do.
543         for map in self.generics_def_id_map.iter().rev() {
544             if let Some(r) = map.get(&local_def_id) {
545                 debug!("def_id_remapper: remapping from `{local_def_id:?}` to `{r:?}`");
546                 local_def_id = *r;
547             } else {
548                 debug!("def_id_remapper: no remapping for `{local_def_id:?}` found in map");
549             }
550         }
551
552         local_def_id
553     }
554
555     /// Freshen the `LoweringContext` and ready it to lower a nested item.
556     /// The lowered item is registered into `self.children`.
557     ///
558     /// This function sets up `HirId` lowering infrastructure,
559     /// and stashes the shared mutable state to avoid pollution by the closure.
560     #[instrument(level = "debug", skip(self, f))]
561     fn with_hir_id_owner(
562         &mut self,
563         owner: NodeId,
564         f: impl FnOnce(&mut Self) -> hir::OwnerNode<'hir>,
565     ) {
566         let def_id = self.local_def_id(owner);
567
568         let current_attrs = std::mem::take(&mut self.attrs);
569         let current_bodies = std::mem::take(&mut self.bodies);
570         let current_node_ids = std::mem::take(&mut self.node_id_to_local_id);
571         let current_id_to_def_id = std::mem::take(&mut self.local_id_to_def_id);
572         let current_trait_map = std::mem::take(&mut self.trait_map);
573         let current_owner = std::mem::replace(&mut self.current_hir_id_owner, def_id);
574         let current_local_counter =
575             std::mem::replace(&mut self.item_local_id_counter, hir::ItemLocalId::new(1));
576         let current_impl_trait_defs = std::mem::take(&mut self.impl_trait_defs);
577         let current_impl_trait_bounds = std::mem::take(&mut self.impl_trait_bounds);
578
579         // Do not reset `next_node_id` and `node_id_to_def_id`:
580         // we want `f` to be able to refer to the `LocalDefId`s that the caller created.
581         // and the caller to refer to some of the subdefinitions' nodes' `LocalDefId`s.
582
583         // Always allocate the first `HirId` for the owner itself.
584         let _old = self.node_id_to_local_id.insert(owner, hir::ItemLocalId::new(0));
585         debug_assert_eq!(_old, None);
586
587         let item = f(self);
588         debug_assert_eq!(def_id, item.def_id());
589         // `f` should have consumed all the elements in these vectors when constructing `item`.
590         debug_assert!(self.impl_trait_defs.is_empty());
591         debug_assert!(self.impl_trait_bounds.is_empty());
592         let info = self.make_owner_info(item);
593
594         self.attrs = current_attrs;
595         self.bodies = current_bodies;
596         self.node_id_to_local_id = current_node_ids;
597         self.local_id_to_def_id = current_id_to_def_id;
598         self.trait_map = current_trait_map;
599         self.current_hir_id_owner = current_owner;
600         self.item_local_id_counter = current_local_counter;
601         self.impl_trait_defs = current_impl_trait_defs;
602         self.impl_trait_bounds = current_impl_trait_bounds;
603
604         let _old = self.children.insert(def_id, hir::MaybeOwner::Owner(info));
605         debug_assert!(_old.is_none())
606     }
607
608     /// Installs the remapping `remap` in scope while `f` is being executed.
609     /// This causes references to the `LocalDefId` keys to be changed to
610     /// refer to the values instead.
611     ///
612     /// The remapping is used when one piece of AST expands to multiple
613     /// pieces of HIR. For example, the function `fn foo<'a>(...) -> impl Debug + 'a`,
614     /// expands to both a function definition (`foo`) and a TAIT for the return value,
615     /// both of which have a lifetime parameter `'a`. The remapping allows us to
616     /// rewrite the `'a` in the return value to refer to the
617     /// `'a` declared on the TAIT, instead of the function.
618     fn with_remapping<R>(
619         &mut self,
620         remap: FxHashMap<LocalDefId, LocalDefId>,
621         f: impl FnOnce(&mut Self) -> R,
622     ) -> R {
623         self.generics_def_id_map.push(remap);
624         let res = f(self);
625         self.generics_def_id_map.pop();
626         res
627     }
628
629     fn make_owner_info(&mut self, node: hir::OwnerNode<'hir>) -> &'hir hir::OwnerInfo<'hir> {
630         let attrs = std::mem::take(&mut self.attrs);
631         let mut bodies = std::mem::take(&mut self.bodies);
632         let local_id_to_def_id = std::mem::take(&mut self.local_id_to_def_id);
633         let trait_map = std::mem::take(&mut self.trait_map);
634
635         #[cfg(debug_assertions)]
636         for (id, attrs) in attrs.iter() {
637             // Verify that we do not store empty slices in the map.
638             if attrs.is_empty() {
639                 panic!("Stored empty attributes for {:?}", id);
640             }
641         }
642
643         bodies.sort_by_key(|(k, _)| *k);
644         let bodies = SortedMap::from_presorted_elements(bodies);
645         let (hash_including_bodies, hash_without_bodies) = self.hash_owner(node, &bodies);
646         let (nodes, parenting) =
647             index::index_hir(self.tcx.sess, &*self.tcx.definitions_untracked(), node, &bodies);
648         let nodes = hir::OwnerNodes {
649             hash_including_bodies,
650             hash_without_bodies,
651             nodes,
652             bodies,
653             local_id_to_def_id,
654         };
655         let attrs = {
656             let hash = self.tcx.with_stable_hashing_context(|mut hcx| {
657                 let mut stable_hasher = StableHasher::new();
658                 attrs.hash_stable(&mut hcx, &mut stable_hasher);
659                 stable_hasher.finish()
660             });
661             hir::AttributeMap { map: attrs, hash }
662         };
663
664         self.arena.alloc(hir::OwnerInfo { nodes, parenting, attrs, trait_map })
665     }
666
667     /// Hash the HIR node twice, one deep and one shallow hash.  This allows to differentiate
668     /// queries which depend on the full HIR tree and those which only depend on the item signature.
669     fn hash_owner(
670         &mut self,
671         node: hir::OwnerNode<'hir>,
672         bodies: &SortedMap<hir::ItemLocalId, &'hir hir::Body<'hir>>,
673     ) -> (Fingerprint, Fingerprint) {
674         self.tcx.with_stable_hashing_context(|mut hcx| {
675             let mut stable_hasher = StableHasher::new();
676             hcx.with_hir_bodies(node.def_id(), bodies, |hcx| {
677                 node.hash_stable(hcx, &mut stable_hasher)
678             });
679             let hash_including_bodies = stable_hasher.finish();
680             let mut stable_hasher = StableHasher::new();
681             hcx.without_hir_bodies(|hcx| node.hash_stable(hcx, &mut stable_hasher));
682             let hash_without_bodies = stable_hasher.finish();
683             (hash_including_bodies, hash_without_bodies)
684         })
685     }
686
687     /// This method allocates a new `HirId` for the given `NodeId` and stores it in
688     /// the `LoweringContext`'s `NodeId => HirId` map.
689     /// Take care not to call this method if the resulting `HirId` is then not
690     /// actually used in the HIR, as that would trigger an assertion in the
691     /// `HirIdValidator` later on, which makes sure that all `NodeId`s got mapped
692     /// properly. Calling the method twice with the same `NodeId` is fine though.
693     #[instrument(level = "debug", skip(self), ret)]
694     fn lower_node_id(&mut self, ast_node_id: NodeId) -> hir::HirId {
695         assert_ne!(ast_node_id, DUMMY_NODE_ID);
696
697         match self.node_id_to_local_id.entry(ast_node_id) {
698             Entry::Occupied(o) => {
699                 hir::HirId { owner: self.current_hir_id_owner, local_id: *o.get() }
700             }
701             Entry::Vacant(v) => {
702                 // Generate a new `HirId`.
703                 let owner = self.current_hir_id_owner;
704                 let local_id = self.item_local_id_counter;
705                 let hir_id = hir::HirId { owner, local_id };
706
707                 v.insert(local_id);
708                 self.item_local_id_counter.increment_by(1);
709
710                 assert_ne!(local_id, hir::ItemLocalId::new(0));
711                 if let Some(def_id) = self.opt_local_def_id(ast_node_id) {
712                     // Do not override a `MaybeOwner::Owner` that may already here.
713                     self.children.entry(def_id).or_insert(hir::MaybeOwner::NonOwner(hir_id));
714                     self.local_id_to_def_id.insert(local_id, def_id);
715                 }
716
717                 if let Some(traits) = self.resolver.trait_map.remove(&ast_node_id) {
718                     self.trait_map.insert(hir_id.local_id, traits.into_boxed_slice());
719                 }
720
721                 hir_id
722             }
723         }
724     }
725
726     /// Generate a new `HirId` without a backing `NodeId`.
727     #[instrument(level = "debug", skip(self), ret)]
728     fn next_id(&mut self) -> hir::HirId {
729         let owner = self.current_hir_id_owner;
730         let local_id = self.item_local_id_counter;
731         assert_ne!(local_id, hir::ItemLocalId::new(0));
732         self.item_local_id_counter.increment_by(1);
733         hir::HirId { owner, local_id }
734     }
735
736     #[instrument(level = "trace", skip(self))]
737     fn lower_res(&mut self, res: Res<NodeId>) -> Res {
738         let res: Result<Res, ()> = res.apply_id(|id| {
739             let owner = self.current_hir_id_owner;
740             let local_id = self.node_id_to_local_id.get(&id).copied().ok_or(())?;
741             Ok(hir::HirId { owner, local_id })
742         });
743         trace!(?res);
744
745         // We may fail to find a HirId when the Res points to a Local from an enclosing HIR owner.
746         // This can happen when trying to lower the return type `x` in erroneous code like
747         //   async fn foo(x: u8) -> x {}
748         // In that case, `x` is lowered as a function parameter, and the return type is lowered as
749         // an opaque type as a synthesized HIR owner.
750         res.unwrap_or(Res::Err)
751     }
752
753     fn expect_full_res(&mut self, id: NodeId) -> Res<NodeId> {
754         self.resolver.get_partial_res(id).map_or(Res::Err, |pr| {
755             if pr.unresolved_segments() != 0 {
756                 panic!("path not fully resolved: {:?}", pr);
757             }
758             pr.base_res()
759         })
760     }
761
762     fn expect_full_res_from_use(&mut self, id: NodeId) -> impl Iterator<Item = Res<NodeId>> {
763         self.resolver.get_import_res(id).present_items()
764     }
765
766     fn diagnostic(&self) -> &Handler {
767         self.tcx.sess.diagnostic()
768     }
769
770     /// Reuses the span but adds information like the kind of the desugaring and features that are
771     /// allowed inside this span.
772     fn mark_span_with_reason(
773         &self,
774         reason: DesugaringKind,
775         span: Span,
776         allow_internal_unstable: Option<Lrc<[Symbol]>>,
777     ) -> Span {
778         self.tcx.with_stable_hashing_context(|hcx| {
779             span.mark_with_reason(allow_internal_unstable, reason, self.tcx.sess.edition(), hcx)
780         })
781     }
782
783     /// Intercept all spans entering HIR.
784     /// Mark a span as relative to the current owning item.
785     fn lower_span(&self, span: Span) -> Span {
786         if self.tcx.sess.opts.unstable_opts.incremental_relative_spans {
787             span.with_parent(Some(self.current_hir_id_owner))
788         } else {
789             // Do not make spans relative when not using incremental compilation.
790             span
791         }
792     }
793
794     fn lower_ident(&self, ident: Ident) -> Ident {
795         Ident::new(ident.name, self.lower_span(ident.span))
796     }
797
798     /// Converts a lifetime into a new generic parameter.
799     #[instrument(level = "debug", skip(self))]
800     fn lifetime_res_to_generic_param(
801         &mut self,
802         ident: Ident,
803         node_id: NodeId,
804         res: LifetimeRes,
805     ) -> Option<hir::GenericParam<'hir>> {
806         let (name, kind) = match res {
807             LifetimeRes::Param { .. } => {
808                 (hir::ParamName::Plain(ident), hir::LifetimeParamKind::Explicit)
809             }
810             LifetimeRes::Fresh { param, .. } => {
811                 // Late resolution delegates to us the creation of the `LocalDefId`.
812                 let _def_id = self.create_def(
813                     self.current_hir_id_owner,
814                     param,
815                     DefPathData::LifetimeNs(kw::UnderscoreLifetime),
816                 );
817                 debug!(?_def_id);
818
819                 (hir::ParamName::Fresh, hir::LifetimeParamKind::Elided)
820             }
821             LifetimeRes::Static | LifetimeRes::Error => return None,
822             res => panic!(
823                 "Unexpected lifetime resolution {:?} for {:?} at {:?}",
824                 res, ident, ident.span
825             ),
826         };
827         let hir_id = self.lower_node_id(node_id);
828         Some(hir::GenericParam {
829             hir_id,
830             name,
831             span: self.lower_span(ident.span),
832             pure_wrt_drop: false,
833             kind: hir::GenericParamKind::Lifetime { kind },
834             colon_span: None,
835         })
836     }
837
838     /// Lowers a lifetime binder that defines `generic_params`, returning the corresponding HIR
839     /// nodes. The returned list includes any "extra" lifetime parameters that were added by the
840     /// name resolver owing to lifetime elision; this also populates the resolver's node-id->def-id
841     /// map, so that later calls to `opt_node_id_to_def_id` that refer to these extra lifetime
842     /// parameters will be successful.
843     #[instrument(level = "debug", skip(self, in_binder))]
844     #[inline]
845     fn lower_lifetime_binder<R>(
846         &mut self,
847         binder: NodeId,
848         generic_params: &[GenericParam],
849         in_binder: impl FnOnce(&mut Self, &'hir [hir::GenericParam<'hir>]) -> R,
850     ) -> R {
851         let extra_lifetimes = self.resolver.take_extra_lifetime_params(binder);
852         debug!(?extra_lifetimes);
853         let extra_lifetimes: Vec<_> = extra_lifetimes
854             .into_iter()
855             .filter_map(|(ident, node_id, res)| {
856                 self.lifetime_res_to_generic_param(ident, node_id, res)
857             })
858             .collect();
859
860         let generic_params: Vec<_> = self
861             .lower_generic_params_mut(generic_params)
862             .chain(extra_lifetimes.into_iter())
863             .collect();
864         let generic_params = self.arena.alloc_from_iter(generic_params);
865         debug!(?generic_params);
866
867         in_binder(self, generic_params)
868     }
869
870     fn with_dyn_type_scope<T>(&mut self, in_scope: bool, f: impl FnOnce(&mut Self) -> T) -> T {
871         let was_in_dyn_type = self.is_in_dyn_type;
872         self.is_in_dyn_type = in_scope;
873
874         let result = f(self);
875
876         self.is_in_dyn_type = was_in_dyn_type;
877
878         result
879     }
880
881     fn with_new_scopes<T>(&mut self, f: impl FnOnce(&mut Self) -> T) -> T {
882         let was_in_loop_condition = self.is_in_loop_condition;
883         self.is_in_loop_condition = false;
884
885         let catch_scope = self.catch_scope.take();
886         let loop_scope = self.loop_scope.take();
887         let ret = f(self);
888         self.catch_scope = catch_scope;
889         self.loop_scope = loop_scope;
890
891         self.is_in_loop_condition = was_in_loop_condition;
892
893         ret
894     }
895
896     fn lower_attrs(&mut self, id: hir::HirId, attrs: &[Attribute]) -> Option<&'hir [Attribute]> {
897         if attrs.is_empty() {
898             None
899         } else {
900             debug_assert_eq!(id.owner, self.current_hir_id_owner);
901             let ret = self.arena.alloc_from_iter(attrs.iter().map(|a| self.lower_attr(a)));
902             debug_assert!(!ret.is_empty());
903             self.attrs.insert(id.local_id, ret);
904             Some(ret)
905         }
906     }
907
908     fn lower_attr(&self, attr: &Attribute) -> Attribute {
909         // Note that we explicitly do not walk the path. Since we don't really
910         // lower attributes (we use the AST version) there is nowhere to keep
911         // the `HirId`s. We don't actually need HIR version of attributes anyway.
912         // Tokens are also not needed after macro expansion and parsing.
913         let kind = match attr.kind {
914             AttrKind::Normal(ref normal) => AttrKind::Normal(P(NormalAttr {
915                 item: AttrItem {
916                     path: normal.item.path.clone(),
917                     args: self.lower_mac_args(&normal.item.args),
918                     tokens: None,
919                 },
920                 tokens: None,
921             })),
922             AttrKind::DocComment(comment_kind, data) => AttrKind::DocComment(comment_kind, data),
923         };
924
925         Attribute { kind, id: attr.id, style: attr.style, span: self.lower_span(attr.span) }
926     }
927
928     fn alias_attrs(&mut self, id: hir::HirId, target_id: hir::HirId) {
929         debug_assert_eq!(id.owner, self.current_hir_id_owner);
930         debug_assert_eq!(target_id.owner, self.current_hir_id_owner);
931         if let Some(&a) = self.attrs.get(&target_id.local_id) {
932             debug_assert!(!a.is_empty());
933             self.attrs.insert(id.local_id, a);
934         }
935     }
936
937     fn lower_mac_args(&self, args: &MacArgs) -> MacArgs {
938         match *args {
939             MacArgs::Empty => MacArgs::Empty,
940             MacArgs::Delimited(dspan, delim, ref tokens) => {
941                 // This is either a non-key-value attribute, or a `macro_rules!` body.
942                 // We either not have any nonterminals present (in the case of an attribute),
943                 // or have tokens available for all nonterminals in the case of a nested
944                 // `macro_rules`: e.g:
945                 //
946                 // ```rust
947                 // macro_rules! outer {
948                 //     ($e:expr) => {
949                 //         macro_rules! inner {
950                 //             () => { $e }
951                 //         }
952                 //     }
953                 // }
954                 // ```
955                 //
956                 // In both cases, we don't want to synthesize any tokens
957                 MacArgs::Delimited(dspan, delim, tokens.flattened())
958             }
959             // This is an inert key-value attribute - it will never be visible to macros
960             // after it gets lowered to HIR. Therefore, we can extract literals to handle
961             // nonterminals in `#[doc]` (e.g. `#[doc = $e]`).
962             MacArgs::Eq(eq_span, MacArgsEq::Ast(ref expr)) => {
963                 // In valid code the value always ends up as a single literal. Otherwise, a dummy
964                 // literal suffices because the error is handled elsewhere.
965                 let lit = if let ExprKind::Lit(lit) = &expr.kind {
966                     lit.clone()
967                 } else {
968                     Lit {
969                         token_lit: token::Lit::new(token::LitKind::Err, kw::Empty, None),
970                         kind: LitKind::Err,
971                         span: DUMMY_SP,
972                     }
973                 };
974                 MacArgs::Eq(eq_span, MacArgsEq::Hir(lit))
975             }
976             MacArgs::Eq(_, MacArgsEq::Hir(ref lit)) => {
977                 unreachable!("in literal form when lowering mac args eq: {:?}", lit)
978             }
979         }
980     }
981
982     /// Given an associated type constraint like one of these:
983     ///
984     /// ```ignore (illustrative)
985     /// T: Iterator<Item: Debug>
986     ///             ^^^^^^^^^^^
987     /// T: Iterator<Item = Debug>
988     ///             ^^^^^^^^^^^^
989     /// ```
990     ///
991     /// returns a `hir::TypeBinding` representing `Item`.
992     #[instrument(level = "debug", skip(self))]
993     fn lower_assoc_ty_constraint(
994         &mut self,
995         constraint: &AssocConstraint,
996         itctx: &mut ImplTraitContext,
997     ) -> hir::TypeBinding<'hir> {
998         debug!("lower_assoc_ty_constraint(constraint={:?}, itctx={:?})", constraint, itctx);
999         // lower generic arguments of identifier in constraint
1000         let gen_args = if let Some(ref gen_args) = constraint.gen_args {
1001             let gen_args_ctor = match gen_args {
1002                 GenericArgs::AngleBracketed(ref data) => {
1003                     self.lower_angle_bracketed_parameter_data(data, ParamMode::Explicit, itctx).0
1004                 }
1005                 GenericArgs::Parenthesized(ref data) => {
1006                     self.emit_bad_parenthesized_trait_in_assoc_ty(data);
1007                     let aba = self.ast_arena.aba.alloc(data.as_angle_bracketed_args());
1008                     self.lower_angle_bracketed_parameter_data(aba, ParamMode::Explicit, itctx).0
1009                 }
1010             };
1011             gen_args_ctor.into_generic_args(self)
1012         } else {
1013             self.arena.alloc(hir::GenericArgs::none())
1014         };
1015         let mut itctx_tait = ImplTraitContext::TypeAliasesOpaqueTy;
1016
1017         let kind = match constraint.kind {
1018             AssocConstraintKind::Equality { ref term } => {
1019                 let term = match term {
1020                     Term::Ty(ref ty) => self.lower_ty(ty, itctx).into(),
1021                     Term::Const(ref c) => self.lower_anon_const(c).into(),
1022                 };
1023                 hir::TypeBindingKind::Equality { term }
1024             }
1025             AssocConstraintKind::Bound { ref bounds } => {
1026                 // Piggy-back on the `impl Trait` context to figure out the correct behavior.
1027                 let (desugar_to_impl_trait, itctx) = match itctx {
1028                     // We are in the return position:
1029                     //
1030                     //     fn foo() -> impl Iterator<Item: Debug>
1031                     //
1032                     // so desugar to
1033                     //
1034                     //     fn foo() -> impl Iterator<Item = impl Debug>
1035                     ImplTraitContext::ReturnPositionOpaqueTy { .. }
1036                     | ImplTraitContext::TypeAliasesOpaqueTy { .. } => (true, itctx),
1037
1038                     // We are in the argument position, but within a dyn type:
1039                     //
1040                     //     fn foo(x: dyn Iterator<Item: Debug>)
1041                     //
1042                     // so desugar to
1043                     //
1044                     //     fn foo(x: dyn Iterator<Item = impl Debug>)
1045                     ImplTraitContext::Universal if self.is_in_dyn_type => (true, itctx),
1046
1047                     // In `type Foo = dyn Iterator<Item: Debug>` we desugar to
1048                     // `type Foo = dyn Iterator<Item = impl Debug>` but we have to override the
1049                     // "impl trait context" to permit `impl Debug` in this position (it desugars
1050                     // then to an opaque type).
1051                     //
1052                     // FIXME: this is only needed until `impl Trait` is allowed in type aliases.
1053                     ImplTraitContext::Disallowed(_) if self.is_in_dyn_type => {
1054                         (true, &mut itctx_tait)
1055                     }
1056
1057                     // We are in the parameter position, but not within a dyn type:
1058                     //
1059                     //     fn foo(x: impl Iterator<Item: Debug>)
1060                     //
1061                     // so we leave it as is and this gets expanded in astconv to a bound like
1062                     // `<T as Iterator>::Item: Debug` where `T` is the type parameter for the
1063                     // `impl Iterator`.
1064                     _ => (false, itctx),
1065                 };
1066
1067                 if desugar_to_impl_trait {
1068                     // Desugar `AssocTy: Bounds` into `AssocTy = impl Bounds`. We do this by
1069                     // constructing the HIR for `impl bounds...` and then lowering that.
1070
1071                     let parent_def_id = self.current_hir_id_owner;
1072                     let impl_trait_node_id = self.next_node_id();
1073                     self.create_def(parent_def_id, impl_trait_node_id, DefPathData::ImplTrait);
1074
1075                     self.with_dyn_type_scope(false, |this| {
1076                         let node_id = this.next_node_id();
1077                         let ty = this.ast_arena.tys.alloc(Ty {
1078                             id: node_id,
1079                             kind: TyKind::ImplTrait(impl_trait_node_id, bounds.clone()),
1080                             span: this.lower_span(constraint.span),
1081                             tokens: None,
1082                         });
1083                         let ty = this.lower_ty(ty, itctx);
1084
1085                         hir::TypeBindingKind::Equality { term: ty.into() }
1086                     })
1087                 } else {
1088                     // Desugar `AssocTy: Bounds` into a type binding where the
1089                     // later desugars into a trait predicate.
1090                     let bounds = self.lower_param_bounds(bounds, itctx);
1091
1092                     hir::TypeBindingKind::Constraint { bounds }
1093                 }
1094             }
1095         };
1096
1097         hir::TypeBinding {
1098             hir_id: self.lower_node_id(constraint.id),
1099             ident: self.lower_ident(constraint.ident),
1100             gen_args,
1101             kind,
1102             span: self.lower_span(constraint.span),
1103         }
1104     }
1105
1106     fn emit_bad_parenthesized_trait_in_assoc_ty(&self, data: &ParenthesizedArgs) {
1107         // Suggest removing empty parentheses: "Trait()" -> "Trait"
1108         let sub = if data.inputs.is_empty() {
1109             let parentheses_span =
1110                 data.inputs_span.shrink_to_lo().to(data.inputs_span.shrink_to_hi());
1111             AssocTyParenthesesSub::Empty { parentheses_span }
1112         }
1113         // Suggest replacing parentheses with angle brackets `Trait(params...)` to `Trait<params...>`
1114         else {
1115             // Start of parameters to the 1st argument
1116             let open_param = data.inputs_span.shrink_to_lo().to(data
1117                 .inputs
1118                 .first()
1119                 .unwrap()
1120                 .span
1121                 .shrink_to_lo());
1122             // End of last argument to end of parameters
1123             let close_param =
1124                 data.inputs.last().unwrap().span.shrink_to_hi().to(data.inputs_span.shrink_to_hi());
1125             AssocTyParenthesesSub::NotEmpty { open_param, close_param }
1126         };
1127         self.tcx.sess.emit_err(AssocTyParentheses { span: data.span, sub });
1128     }
1129
1130     #[instrument(level = "debug", skip(self))]
1131     fn lower_generic_arg(
1132         &mut self,
1133         arg: &ast::GenericArg,
1134         itctx: &mut ImplTraitContext,
1135     ) -> hir::GenericArg<'hir> {
1136         match arg {
1137             ast::GenericArg::Lifetime(lt) => GenericArg::Lifetime(self.lower_lifetime(&lt)),
1138             ast::GenericArg::Type(ty) => {
1139                 match ty.kind {
1140                     TyKind::Infer if self.tcx.features().generic_arg_infer => {
1141                         return GenericArg::Infer(hir::InferArg {
1142                             hir_id: self.lower_node_id(ty.id),
1143                             span: self.lower_span(ty.span),
1144                         });
1145                     }
1146                     // We parse const arguments as path types as we cannot distinguish them during
1147                     // parsing. We try to resolve that ambiguity by attempting resolution in both the
1148                     // type and value namespaces. If we resolved the path in the value namespace, we
1149                     // transform it into a generic const argument.
1150                     TyKind::Path(ref qself, ref path) => {
1151                         if let Some(partial_res) = self.resolver.get_partial_res(ty.id) {
1152                             let res = partial_res.base_res();
1153                             if !res.matches_ns(Namespace::TypeNS) {
1154                                 debug!(
1155                                     "lower_generic_arg: Lowering type argument as const argument: {:?}",
1156                                     ty,
1157                                 );
1158
1159                                 // Construct an AnonConst where the expr is the "ty"'s path.
1160
1161                                 let parent_def_id = self.current_hir_id_owner;
1162                                 let node_id = self.next_node_id();
1163
1164                                 // Add a definition for the in-band const def.
1165                                 self.create_def(parent_def_id, node_id, DefPathData::AnonConst);
1166
1167                                 let span = self.lower_span(ty.span);
1168                                 let path_expr = Expr {
1169                                     id: ty.id,
1170                                     kind: ExprKind::Path(qself.clone(), path.clone()),
1171                                     span,
1172                                     attrs: AttrVec::new(),
1173                                     tokens: None,
1174                                 };
1175
1176                                 let ct = self.with_new_scopes(|this| hir::AnonConst {
1177                                     hir_id: this.lower_node_id(node_id),
1178                                     body: this.lower_const_body(path_expr.span, Some(&path_expr)),
1179                                 });
1180                                 return GenericArg::Const(ConstArg { value: ct, span });
1181                             }
1182                         }
1183                     }
1184                     _ => {}
1185                 }
1186                 GenericArg::Type(self.lower_ty(&ty, itctx))
1187             }
1188             ast::GenericArg::Const(ct) => GenericArg::Const(ConstArg {
1189                 value: self.lower_anon_const(&ct),
1190                 span: self.lower_span(ct.value.span),
1191             }),
1192         }
1193     }
1194
1195     #[instrument(level = "debug", skip(self))]
1196     fn lower_ty(&mut self, t: &Ty, itctx: &mut ImplTraitContext) -> &'hir hir::Ty<'hir> {
1197         self.arena.alloc(self.lower_ty_direct(t, itctx))
1198     }
1199
1200     fn lower_path_ty(
1201         &mut self,
1202         t: &Ty,
1203         qself: &Option<QSelf>,
1204         path: &Path,
1205         param_mode: ParamMode,
1206         itctx: &mut ImplTraitContext,
1207     ) -> hir::Ty<'hir> {
1208         // Check whether we should interpret this as a bare trait object.
1209         // This check mirrors the one in late resolution.  We only introduce this special case in
1210         // the rare occurrence we need to lower `Fresh` anonymous lifetimes.
1211         // The other cases when a qpath should be opportunistically made a trait object are handled
1212         // by `ty_path`.
1213         if qself.is_none()
1214             && let Some(partial_res) = self.resolver.get_partial_res(t.id)
1215             && partial_res.unresolved_segments() == 0
1216             && let Res::Def(DefKind::Trait | DefKind::TraitAlias, _) = partial_res.base_res()
1217         {
1218             let (bounds, lifetime_bound) = self.with_dyn_type_scope(true, |this| {
1219                 let poly_trait_ref = this.ast_arena.ptr.alloc(PolyTraitRef {
1220                     bound_generic_params: vec![],
1221                     trait_ref: TraitRef { path: path.clone(), ref_id: t.id },
1222                     span: t.span
1223                 });
1224                 let bound = this.lower_poly_trait_ref(
1225                     poly_trait_ref,
1226                     itctx,
1227                 );
1228                 let bounds = this.arena.alloc_from_iter([bound]);
1229                 let lifetime_bound = this.elided_dyn_bound(t.span);
1230                 (bounds, lifetime_bound)
1231             });
1232             let kind = hir::TyKind::TraitObject(bounds, &lifetime_bound, TraitObjectSyntax::None);
1233             return hir::Ty { kind, span: self.lower_span(t.span), hir_id: self.next_id() };
1234         }
1235
1236         let id = self.lower_node_id(t.id);
1237         let qpath = self.lower_qpath(t.id, qself, path, param_mode, itctx);
1238         self.ty_path(id, t.span, qpath)
1239     }
1240
1241     fn ty(&mut self, span: Span, kind: hir::TyKind<'hir>) -> hir::Ty<'hir> {
1242         hir::Ty { hir_id: self.next_id(), kind, span: self.lower_span(span) }
1243     }
1244
1245     fn ty_tup(&mut self, span: Span, tys: &'hir [hir::Ty<'hir>]) -> hir::Ty<'hir> {
1246         self.ty(span, hir::TyKind::Tup(tys))
1247     }
1248
1249     fn lower_ty_direct(&mut self, t: &Ty, itctx: &mut ImplTraitContext) -> hir::Ty<'hir> {
1250         let kind = match t.kind {
1251             TyKind::Infer => hir::TyKind::Infer,
1252             TyKind::Err => hir::TyKind::Err,
1253             TyKind::Slice(ref ty) => hir::TyKind::Slice(self.lower_ty(ty, itctx)),
1254             TyKind::Ptr(ref mt) => hir::TyKind::Ptr(self.lower_mt(mt, itctx)),
1255             TyKind::Rptr(ref region, ref mt) => {
1256                 let region = region.unwrap_or_else(|| {
1257                     let id = if let Some(LifetimeRes::ElidedAnchor { start, end }) =
1258                         self.resolver.get_lifetime_res(t.id)
1259                     {
1260                         debug_assert_eq!(start.plus(1), end);
1261                         start
1262                     } else {
1263                         self.next_node_id()
1264                     };
1265                     let span = self.tcx.sess.source_map().start_point(t.span);
1266                     Lifetime { ident: Ident::new(kw::UnderscoreLifetime, span), id }
1267                 });
1268                 let lifetime = self.lower_lifetime(&region);
1269                 hir::TyKind::Rptr(lifetime, self.lower_mt(mt, itctx))
1270             }
1271             TyKind::BareFn(ref f) => {
1272                 self.lower_lifetime_binder(t.id, &f.generic_params, |lctx, generic_params| {
1273                     hir::TyKind::BareFn(lctx.arena.alloc(hir::BareFnTy {
1274                         generic_params,
1275                         unsafety: lctx.lower_unsafety(f.unsafety),
1276                         abi: lctx.lower_extern(f.ext),
1277                         decl: lctx.lower_fn_decl(&f.decl, None, t.span, FnDeclKind::Pointer, None),
1278                         param_names: lctx.lower_fn_params_to_names(&f.decl),
1279                     }))
1280                 })
1281             }
1282             TyKind::Never => hir::TyKind::Never,
1283             TyKind::Tup(ref tys) => hir::TyKind::Tup(
1284                 self.arena.alloc_from_iter(tys.iter().map(|ty| self.lower_ty_direct(ty, itctx))),
1285             ),
1286             TyKind::Paren(ref ty) => {
1287                 return self.lower_ty_direct(ty, itctx);
1288             }
1289             TyKind::Path(ref qself, ref path) => {
1290                 return self.lower_path_ty(t, qself, path, ParamMode::Explicit, itctx);
1291             }
1292             TyKind::ImplicitSelf => {
1293                 let hir_id = self.lower_node_id(t.id);
1294                 let res = self.expect_full_res(t.id);
1295                 let res = self.lower_res(res);
1296                 hir::TyKind::Path(hir::QPath::Resolved(
1297                     None,
1298                     self.arena.alloc(hir::Path {
1299                         res,
1300                         segments: arena_vec![self; hir::PathSegment::new(
1301                             Ident::with_dummy_span(kw::SelfUpper),
1302                             hir_id,
1303                             res
1304                         )],
1305                         span: self.lower_span(t.span),
1306                     }),
1307                 ))
1308             }
1309             TyKind::Array(ref ty, ref length) => {
1310                 hir::TyKind::Array(self.lower_ty(ty, itctx), self.lower_array_length(length))
1311             }
1312             TyKind::Typeof(ref expr) => hir::TyKind::Typeof(self.lower_anon_const(expr)),
1313             TyKind::TraitObject(ref bounds, kind) => {
1314                 let mut lifetime_bound = None;
1315                 let (bounds, lifetime_bound) = self.with_dyn_type_scope(true, |this| {
1316                     let bounds =
1317                         this.arena.alloc_from_iter(bounds.iter().filter_map(
1318                             |bound| match *bound {
1319                                 GenericBound::Trait(
1320                                     ref ty,
1321                                     TraitBoundModifier::None | TraitBoundModifier::MaybeConst,
1322                                 ) => Some(this.lower_poly_trait_ref(ty, itctx)),
1323                                 // `~const ?Bound` will cause an error during AST validation
1324                                 // anyways, so treat it like `?Bound` as compilation proceeds.
1325                                 GenericBound::Trait(
1326                                     _,
1327                                     TraitBoundModifier::Maybe | TraitBoundModifier::MaybeConstMaybe,
1328                                 ) => None,
1329                                 GenericBound::Outlives(ref lifetime) => {
1330                                     if lifetime_bound.is_none() {
1331                                         lifetime_bound = Some(this.lower_lifetime(lifetime));
1332                                     }
1333                                     None
1334                                 }
1335                             },
1336                         ));
1337                     let lifetime_bound =
1338                         lifetime_bound.unwrap_or_else(|| this.elided_dyn_bound(t.span));
1339                     (bounds, lifetime_bound)
1340                 });
1341                 hir::TyKind::TraitObject(bounds, lifetime_bound, kind)
1342             }
1343             TyKind::ImplTrait(def_node_id, ref bounds) => {
1344                 let span = t.span;
1345                 match itctx {
1346                     ImplTraitContext::ReturnPositionOpaqueTy { origin } => {
1347                         self.lower_opaque_impl_trait(span, *origin, def_node_id, bounds, itctx)
1348                     }
1349                     ImplTraitContext::TypeAliasesOpaqueTy => {
1350                         let mut nested_itctx = ImplTraitContext::TypeAliasesOpaqueTy;
1351                         self.lower_opaque_impl_trait(
1352                             span,
1353                             hir::OpaqueTyOrigin::TyAlias,
1354                             def_node_id,
1355                             bounds,
1356                             &mut nested_itctx,
1357                         )
1358                     }
1359                     ImplTraitContext::InTrait => {
1360                         self.lower_impl_trait_in_trait(span, def_node_id, |lctx| {
1361                             lctx.lower_param_bounds(
1362                                 bounds,
1363                                 ImplTraitContext::Disallowed(ImplTraitPosition::Trait),
1364                             )
1365                         })
1366                     }
1367                     ImplTraitContext::Universal => {
1368                         let span = t.span;
1369                         let ident = Ident::from_str_and_span(&pprust::ty_to_string(t), span);
1370                         let (param, bounds, path) =
1371                             self.lower_generic_and_bounds(def_node_id, span, ident, bounds);
1372                         self.impl_trait_defs.push(param);
1373                         if let Some(bounds) = bounds {
1374                             self.impl_trait_bounds.push(bounds);
1375                         }
1376                         path
1377                     }
1378                     ImplTraitContext::Disallowed(position) => {
1379                         self.tcx.sess.emit_err(MisplacedImplTrait {
1380                             span: t.span,
1381                             position: DiagnosticArgFromDisplay(&position),
1382                         });
1383                         hir::TyKind::Err
1384                     }
1385                 }
1386             }
1387             TyKind::MacCall(_) => panic!("`TyKind::MacCall` should have been expanded by now"),
1388             TyKind::CVarArgs => {
1389                 self.tcx.sess.delay_span_bug(
1390                     t.span,
1391                     "`TyKind::CVarArgs` should have been handled elsewhere",
1392                 );
1393                 hir::TyKind::Err
1394             }
1395         };
1396
1397         hir::Ty { kind, span: self.lower_span(t.span), hir_id: self.lower_node_id(t.id) }
1398     }
1399
1400     /// Lowers a `ReturnPositionOpaqueTy` (`-> impl Trait`) or a `TypeAliasesOpaqueTy` (`type F =
1401     /// impl Trait`): this creates the associated Opaque Type (TAIT) definition and then returns a
1402     /// HIR type that references the TAIT.
1403     ///
1404     /// Given a function definition like:
1405     ///
1406     /// ```rust
1407     /// fn test<'a, T: Debug>(x: &'a T) -> impl Debug + 'a {
1408     ///     x
1409     /// }
1410     /// ```
1411     ///
1412     /// we will create a TAIT definition in the HIR like
1413     ///
1414     /// ```
1415     /// type TestReturn<'a, T, 'x> = impl Debug + 'x
1416     /// ```
1417     ///
1418     /// and return a type like `TestReturn<'static, T, 'a>`, so that the function looks like:
1419     ///
1420     /// ```rust
1421     /// fn test<'a, T: Debug>(x: &'a T) -> TestReturn<'static, T, 'a>
1422     /// ```
1423     ///
1424     /// Note the subtlety around type parameters! The new TAIT, `TestReturn`, inherits all the
1425     /// type parameters from the function `test` (this is implemented in the query layer, they aren't
1426     /// added explicitly in the HIR). But this includes all the lifetimes, and we only want to
1427     /// capture the lifetimes that are referenced in the bounds. Therefore, we add *extra* lifetime parameters
1428     /// for the lifetimes that get captured (`'x`, in our example above) and reference those.
1429     #[instrument(level = "debug", skip(self), ret)]
1430     fn lower_opaque_impl_trait(
1431         &mut self,
1432         span: Span,
1433         origin: hir::OpaqueTyOrigin,
1434         opaque_ty_node_id: NodeId,
1435         bounds: &GenericBounds,
1436         itctx: &mut ImplTraitContext,
1437     ) -> hir::TyKind<'hir> {
1438         // Make sure we know that some funky desugaring has been going on here.
1439         // This is a first: there is code in other places like for loop
1440         // desugaring that explicitly states that we don't want to track that.
1441         // Not tracking it makes lints in rustc and clippy very fragile, as
1442         // frequently opened issues show.
1443         let opaque_ty_span = self.mark_span_with_reason(DesugaringKind::OpaqueTy, span, None);
1444
1445         let opaque_ty_def_id = self.local_def_id(opaque_ty_node_id);
1446         debug!(?opaque_ty_def_id);
1447
1448         // Contains the new lifetime definitions created for the TAIT (if any).
1449         let mut collected_lifetimes = Vec::new();
1450
1451         // If this came from a TAIT (as opposed to a function that returns an RPIT), we only want
1452         // to capture the lifetimes that appear in the bounds. So visit the bounds to find out
1453         // exactly which ones those are.
1454         let lifetimes_to_remap = if origin == hir::OpaqueTyOrigin::TyAlias {
1455             // in a TAIT like `type Foo<'a> = impl Foo<'a>`, we don't keep all the lifetime parameters
1456             Vec::new()
1457         } else {
1458             // in fn return position, like the `fn test<'a>() -> impl Debug + 'a` example,
1459             // we only keep the lifetimes that appear in the `impl Debug` itself:
1460             lifetime_collector::lifetimes_in_bounds(&self.resolver, bounds)
1461         };
1462         debug!(?lifetimes_to_remap);
1463
1464         self.with_hir_id_owner(opaque_ty_node_id, |lctx| {
1465             let mut new_remapping = FxHashMap::default();
1466
1467             // If this opaque type is only capturing a subset of the lifetimes (those that appear
1468             // in bounds), then create the new lifetime parameters required and create a mapping
1469             // from the old `'a` (on the function) to the new `'a` (on the opaque type).
1470             collected_lifetimes = lctx.create_lifetime_defs(
1471                 opaque_ty_def_id,
1472                 &lifetimes_to_remap,
1473                 &mut new_remapping,
1474             );
1475             debug!(?collected_lifetimes);
1476             debug!(?new_remapping);
1477
1478             // Install the remapping from old to new (if any):
1479             lctx.with_remapping(new_remapping, |lctx| {
1480                 // This creates HIR lifetime definitions as `hir::GenericParam`, in the given
1481                 // example `type TestReturn<'a, T, 'x> = impl Debug + 'x`, it creates a collection
1482                 // containing `&['x]`.
1483                 let lifetime_defs = lctx.arena.alloc_from_iter(collected_lifetimes.iter().map(
1484                     |&(new_node_id, lifetime)| {
1485                         let hir_id = lctx.lower_node_id(new_node_id);
1486                         debug_assert_ne!(lctx.opt_local_def_id(new_node_id), None);
1487
1488                         let (name, kind) = if lifetime.ident.name == kw::UnderscoreLifetime {
1489                             (hir::ParamName::Fresh, hir::LifetimeParamKind::Elided)
1490                         } else {
1491                             (
1492                                 hir::ParamName::Plain(lifetime.ident),
1493                                 hir::LifetimeParamKind::Explicit,
1494                             )
1495                         };
1496
1497                         hir::GenericParam {
1498                             hir_id,
1499                             name,
1500                             span: lifetime.ident.span,
1501                             pure_wrt_drop: false,
1502                             kind: hir::GenericParamKind::Lifetime { kind },
1503                             colon_span: None,
1504                         }
1505                     },
1506                 ));
1507                 debug!(?lifetime_defs);
1508
1509                 // Then when we lower the param bounds, references to 'a are remapped to 'a1, so we
1510                 // get back Debug + 'a1, which is suitable for use on the TAIT.
1511                 let hir_bounds = lctx.lower_param_bounds(bounds, itctx);
1512                 debug!(?hir_bounds);
1513
1514                 let opaque_ty_item = hir::OpaqueTy {
1515                     generics: self.arena.alloc(hir::Generics {
1516                         params: lifetime_defs,
1517                         predicates: &[],
1518                         has_where_clause_predicates: false,
1519                         where_clause_span: lctx.lower_span(span),
1520                         span: lctx.lower_span(span),
1521                     }),
1522                     bounds: hir_bounds,
1523                     origin,
1524                 };
1525                 debug!(?opaque_ty_item);
1526
1527                 lctx.generate_opaque_type(opaque_ty_def_id, opaque_ty_item, span, opaque_ty_span)
1528             })
1529         });
1530
1531         // This creates HIR lifetime arguments as `hir::GenericArg`, in the given example `type
1532         // TestReturn<'a, T, 'x> = impl Debug + 'x`, it creates a collection containing `&['x]`.
1533         let lifetimes =
1534             self.arena.alloc_from_iter(collected_lifetimes.into_iter().map(|(_, lifetime)| {
1535                 let id = self.next_node_id();
1536                 let span = lifetime.ident.span;
1537
1538                 let ident = if lifetime.ident.name == kw::UnderscoreLifetime {
1539                     Ident::with_dummy_span(kw::UnderscoreLifetime)
1540                 } else {
1541                     lifetime.ident
1542                 };
1543
1544                 let l = self.new_named_lifetime(lifetime.id, id, span, ident);
1545                 hir::GenericArg::Lifetime(l)
1546             }));
1547         debug!(?lifetimes);
1548
1549         // `impl Trait` now just becomes `Foo<'a, 'b, ..>`.
1550         hir::TyKind::OpaqueDef(hir::ItemId { def_id: opaque_ty_def_id }, lifetimes)
1551     }
1552
1553     #[instrument(level = "debug", skip(self, lower_bounds))]
1554     fn lower_impl_trait_in_trait(
1555         &mut self,
1556         span: Span,
1557         opaque_ty_node_id: NodeId,
1558         lower_bounds: impl FnOnce(&mut Self) -> hir::GenericBounds<'hir>,
1559     ) -> hir::TyKind<'hir> {
1560         let opaque_ty_def_id = self.local_def_id(opaque_ty_node_id);
1561         self.with_hir_id_owner(opaque_ty_node_id, |lctx| {
1562             // FIXME(RPITIT): This should be a more descriptive ImplTraitPosition, i.e. nested RPITIT
1563             // FIXME(RPITIT): We _also_ should support this eventually
1564             let hir_bounds = lower_bounds(lctx);
1565             let rpitit_placeholder = hir::ImplTraitPlaceholder { bounds: hir_bounds };
1566             let rpitit_item = hir::Item {
1567                 def_id: opaque_ty_def_id,
1568                 ident: Ident::empty(),
1569                 kind: hir::ItemKind::ImplTraitPlaceholder(rpitit_placeholder),
1570                 span: lctx.lower_span(span),
1571                 vis_span: lctx.lower_span(span.shrink_to_lo()),
1572             };
1573             hir::OwnerNode::Item(lctx.arena.alloc(rpitit_item))
1574         });
1575         hir::TyKind::ImplTraitInTrait(hir::ItemId { def_id: opaque_ty_def_id })
1576     }
1577
1578     /// Registers a new opaque type with the proper `NodeId`s and
1579     /// returns the lowered node-ID for the opaque type.
1580     fn generate_opaque_type(
1581         &mut self,
1582         opaque_ty_id: LocalDefId,
1583         opaque_ty_item: hir::OpaqueTy<'hir>,
1584         span: Span,
1585         opaque_ty_span: Span,
1586     ) -> hir::OwnerNode<'hir> {
1587         let opaque_ty_item_kind = hir::ItemKind::OpaqueTy(opaque_ty_item);
1588         // Generate an `type Foo = impl Trait;` declaration.
1589         trace!("registering opaque type with id {:#?}", opaque_ty_id);
1590         let opaque_ty_item = hir::Item {
1591             def_id: opaque_ty_id,
1592             ident: Ident::empty(),
1593             kind: opaque_ty_item_kind,
1594             vis_span: self.lower_span(span.shrink_to_lo()),
1595             span: self.lower_span(opaque_ty_span),
1596         };
1597         hir::OwnerNode::Item(self.arena.alloc(opaque_ty_item))
1598     }
1599
1600     /// Given a `parent_def_id`, a list of `lifetimes_in_bounds and a `remapping` hash to be
1601     /// filled, this function creates new definitions for `Param` and `Fresh` lifetimes, inserts the
1602     /// new definition, adds it to the remapping with the definition of the given lifetime and
1603     /// returns a list of lifetimes to be lowered afterwards.
1604     fn create_lifetime_defs(
1605         &mut self,
1606         parent_def_id: LocalDefId,
1607         lifetimes_in_bounds: &[Lifetime],
1608         remapping: &mut FxHashMap<LocalDefId, LocalDefId>,
1609     ) -> Vec<(NodeId, Lifetime)> {
1610         let mut result = Vec::new();
1611
1612         for lifetime in lifetimes_in_bounds {
1613             let res = self.resolver.get_lifetime_res(lifetime.id).unwrap_or(LifetimeRes::Error);
1614             debug!(?res);
1615
1616             match res {
1617                 LifetimeRes::Param { param: old_def_id, binder: _ } => {
1618                     if remapping.get(&old_def_id).is_none() {
1619                         let node_id = self.next_node_id();
1620
1621                         let new_def_id = self.create_def(
1622                             parent_def_id,
1623                             node_id,
1624                             DefPathData::LifetimeNs(lifetime.ident.name),
1625                         );
1626                         remapping.insert(old_def_id, new_def_id);
1627
1628                         result.push((node_id, *lifetime));
1629                     }
1630                 }
1631
1632                 LifetimeRes::Fresh { param, binder: _ } => {
1633                     debug_assert_eq!(lifetime.ident.name, kw::UnderscoreLifetime);
1634                     if let Some(old_def_id) = self.opt_local_def_id(param) && remapping.get(&old_def_id).is_none() {
1635                         let node_id = self.next_node_id();
1636
1637                         let new_def_id = self.create_def(
1638                             parent_def_id,
1639                             node_id,
1640                             DefPathData::LifetimeNs(kw::UnderscoreLifetime),
1641                         );
1642                         remapping.insert(old_def_id, new_def_id);
1643
1644                         result.push((node_id, *lifetime));
1645                     }
1646                 }
1647
1648                 LifetimeRes::Static | LifetimeRes::Error => {}
1649
1650                 res => {
1651                     let bug_msg = format!(
1652                         "Unexpected lifetime resolution {:?} for {:?} at {:?}",
1653                         res, lifetime.ident, lifetime.ident.span
1654                     );
1655                     span_bug!(lifetime.ident.span, "{}", bug_msg);
1656                 }
1657             }
1658         }
1659
1660         result
1661     }
1662
1663     fn lower_fn_params_to_names(&mut self, decl: &FnDecl) -> &'hir [Ident] {
1664         // Skip the `...` (`CVarArgs`) trailing arguments from the AST,
1665         // as they are not explicit in HIR/Ty function signatures.
1666         // (instead, the `c_variadic` flag is set to `true`)
1667         let mut inputs = &decl.inputs[..];
1668         if decl.c_variadic() {
1669             inputs = &inputs[..inputs.len() - 1];
1670         }
1671         self.arena.alloc_from_iter(inputs.iter().map(|param| match param.pat.kind {
1672             PatKind::Ident(_, ident, _) => self.lower_ident(ident),
1673             _ => Ident::new(kw::Empty, self.lower_span(param.pat.span)),
1674         }))
1675     }
1676
1677     // Lowers a function declaration.
1678     //
1679     // `decl`: the unlowered (AST) function declaration.
1680     // `fn_def_id`: if `Some`, impl Trait arguments are lowered into generic parameters on the
1681     //      given DefId, otherwise impl Trait is disallowed. Must be `Some` if
1682     //      `make_ret_async` is also `Some`.
1683     // `make_ret_async`: if `Some`, converts `-> T` into `-> impl Future<Output = T>` in the
1684     //      return type. This is used for `async fn` declarations. The `NodeId` is the ID of the
1685     //      return type `impl Trait` item, and the `Span` points to the `async` keyword.
1686     #[instrument(level = "debug", skip(self))]
1687     fn lower_fn_decl(
1688         &mut self,
1689         decl: &FnDecl,
1690         fn_node_id: Option<NodeId>,
1691         fn_span: Span,
1692         kind: FnDeclKind,
1693         make_ret_async: Option<(NodeId, Span)>,
1694     ) -> &'hir hir::FnDecl<'hir> {
1695         let c_variadic = decl.c_variadic();
1696
1697         // Skip the `...` (`CVarArgs`) trailing arguments from the AST,
1698         // as they are not explicit in HIR/Ty function signatures.
1699         // (instead, the `c_variadic` flag is set to `true`)
1700         let mut inputs = &decl.inputs[..];
1701         if c_variadic {
1702             inputs = &inputs[..inputs.len() - 1];
1703         }
1704         let inputs = self.arena.alloc_from_iter(inputs.iter().map(|param| {
1705             if fn_node_id.is_some() {
1706                 self.lower_ty_direct(&param.ty, &mut ImplTraitContext::Universal)
1707             } else {
1708                 self.lower_ty_direct(
1709                     &param.ty,
1710                     &mut ImplTraitContext::Disallowed(match kind {
1711                         FnDeclKind::Fn | FnDeclKind::Inherent => {
1712                             unreachable!("fn should allow in-band lifetimes")
1713                         }
1714                         FnDeclKind::ExternFn => ImplTraitPosition::ExternFnParam,
1715                         FnDeclKind::Closure => ImplTraitPosition::ClosureParam,
1716                         FnDeclKind::Pointer => ImplTraitPosition::PointerParam,
1717                         FnDeclKind::Trait => ImplTraitPosition::TraitParam,
1718                         FnDeclKind::Impl => ImplTraitPosition::ImplParam,
1719                     }),
1720                 )
1721             }
1722         }));
1723
1724         let output = if let Some((ret_id, span)) = make_ret_async {
1725             match kind {
1726                 FnDeclKind::Trait => {
1727                     if !kind.impl_trait_in_trait_allowed(self.tcx) {
1728                         self.tcx
1729                             .sess
1730                             .create_feature_err(
1731                                 TraitFnAsync { fn_span, span },
1732                                 sym::return_position_impl_trait_in_trait,
1733                             )
1734                             .emit();
1735                     }
1736                     self.lower_async_fn_ret_ty_in_trait(
1737                         &decl.output,
1738                         fn_node_id.expect("`make_ret_async` but no `fn_def_id`"),
1739                         ret_id,
1740                     )
1741                 }
1742                 _ => {
1743                     if !kind.impl_trait_return_allowed(self.tcx) {
1744                         if kind == FnDeclKind::Impl {
1745                             self.tcx
1746                                 .sess
1747                                 .create_feature_err(
1748                                     TraitFnAsync { fn_span, span },
1749                                     sym::return_position_impl_trait_in_trait,
1750                                 )
1751                                 .emit();
1752                         } else {
1753                             self.tcx.sess.emit_err(TraitFnAsync { fn_span, span });
1754                         }
1755                     }
1756                     self.lower_async_fn_ret_ty(
1757                         &decl.output,
1758                         fn_node_id.expect("`make_ret_async` but no `fn_def_id`"),
1759                         ret_id,
1760                     )
1761                 }
1762             }
1763         } else {
1764             match decl.output {
1765                 FnRetTy::Ty(ref ty) => {
1766                     let mut context = match fn_node_id {
1767                         Some(fn_node_id) if kind.impl_trait_return_allowed(self.tcx) => {
1768                             let fn_def_id = self.local_def_id(fn_node_id);
1769                             ImplTraitContext::ReturnPositionOpaqueTy {
1770                                 origin: hir::OpaqueTyOrigin::FnReturn(fn_def_id),
1771                             }
1772                         }
1773                         Some(_) if kind.impl_trait_in_trait_allowed(self.tcx) => {
1774                             ImplTraitContext::InTrait
1775                         }
1776                         _ => ImplTraitContext::Disallowed(match kind {
1777                             FnDeclKind::Fn | FnDeclKind::Inherent => {
1778                                 unreachable!("fn should allow in-band lifetimes")
1779                             }
1780                             FnDeclKind::ExternFn => ImplTraitPosition::ExternFnReturn,
1781                             FnDeclKind::Closure => ImplTraitPosition::ClosureReturn,
1782                             FnDeclKind::Pointer => ImplTraitPosition::PointerReturn,
1783                             FnDeclKind::Trait => ImplTraitPosition::TraitReturn,
1784                             FnDeclKind::Impl => ImplTraitPosition::ImplReturn,
1785                         }),
1786                     };
1787                     hir::FnRetTy::Return(self.lower_ty(ty, &mut context))
1788                 }
1789                 FnRetTy::Default(span) => hir::FnRetTy::DefaultReturn(self.lower_span(span)),
1790             }
1791         };
1792
1793         self.arena.alloc(hir::FnDecl {
1794             inputs,
1795             output,
1796             c_variadic,
1797             implicit_self: decl.inputs.get(0).map_or(hir::ImplicitSelfKind::None, |arg| {
1798                 let is_mutable_pat = matches!(
1799                     arg.pat.kind,
1800                     PatKind::Ident(hir::BindingAnnotation(_, Mutability::Mut), ..)
1801                 );
1802
1803                 match arg.ty.kind {
1804                     TyKind::ImplicitSelf if is_mutable_pat => hir::ImplicitSelfKind::Mut,
1805                     TyKind::ImplicitSelf => hir::ImplicitSelfKind::Imm,
1806                     // Given we are only considering `ImplicitSelf` types, we needn't consider
1807                     // the case where we have a mutable pattern to a reference as that would
1808                     // no longer be an `ImplicitSelf`.
1809                     TyKind::Rptr(_, ref mt)
1810                         if mt.ty.kind.is_implicit_self() && mt.mutbl == ast::Mutability::Mut =>
1811                     {
1812                         hir::ImplicitSelfKind::MutRef
1813                     }
1814                     TyKind::Rptr(_, ref mt) if mt.ty.kind.is_implicit_self() => {
1815                         hir::ImplicitSelfKind::ImmRef
1816                     }
1817                     _ => hir::ImplicitSelfKind::None,
1818                 }
1819             }),
1820         })
1821     }
1822
1823     // Transforms `-> T` for `async fn` into `-> OpaqueTy { .. }`
1824     // combined with the following definition of `OpaqueTy`:
1825     //
1826     //     type OpaqueTy<generics_from_parent_fn> = impl Future<Output = T>;
1827     //
1828     // `output`: unlowered output type (`T` in `-> T`)
1829     // `fn_def_id`: `DefId` of the parent function (used to create child impl trait definition)
1830     // `opaque_ty_node_id`: `NodeId` of the opaque `impl Trait` type that should be created
1831     #[instrument(level = "debug", skip(self))]
1832     fn lower_async_fn_ret_ty(
1833         &mut self,
1834         output: &FnRetTy,
1835         fn_node_id: NodeId,
1836         opaque_ty_node_id: NodeId,
1837     ) -> hir::FnRetTy<'hir> {
1838         let span = output.span();
1839
1840         let opaque_ty_span = self.mark_span_with_reason(DesugaringKind::Async, span, None);
1841
1842         let opaque_ty_def_id = self.local_def_id(opaque_ty_node_id);
1843         let fn_def_id = self.local_def_id(fn_node_id);
1844
1845         // When we create the opaque type for this async fn, it is going to have
1846         // to capture all the lifetimes involved in the signature (including in the
1847         // return type). This is done by introducing lifetime parameters for:
1848         //
1849         // - all the explicitly declared lifetimes from the impl and function itself;
1850         // - all the elided lifetimes in the fn arguments;
1851         // - all the elided lifetimes in the return type.
1852         //
1853         // So for example in this snippet:
1854         //
1855         // ```rust
1856         // impl<'a> Foo<'a> {
1857         //   async fn bar<'b>(&self, x: &'b Vec<f64>, y: &str) -> &u32 {
1858         //   //               ^ '0                       ^ '1     ^ '2
1859         //   // elided lifetimes used below
1860         //   }
1861         // }
1862         // ```
1863         //
1864         // we would create an opaque type like:
1865         //
1866         // ```
1867         // type Bar<'a, 'b, '0, '1, '2> = impl Future<Output = &'2 u32>;
1868         // ```
1869         //
1870         // and we would then desugar `bar` to the equivalent of:
1871         //
1872         // ```rust
1873         // impl<'a> Foo<'a> {
1874         //   fn bar<'b, '0, '1>(&'0 self, x: &'b Vec<f64>, y: &'1 str) -> Bar<'a, 'b, '0, '1, '_>
1875         // }
1876         // ```
1877         //
1878         // Note that the final parameter to `Bar` is `'_`, not `'2` --
1879         // this is because the elided lifetimes from the return type
1880         // should be figured out using the ordinary elision rules, and
1881         // this desugaring achieves that.
1882
1883         // Calculate all the lifetimes that should be captured
1884         // by the opaque type. This should include all in-scope
1885         // lifetime parameters, including those defined in-band.
1886
1887         // Contains the new lifetime definitions created for the TAIT (if any) generated for the
1888         // return type.
1889         let mut collected_lifetimes = Vec::new();
1890         let mut new_remapping = FxHashMap::default();
1891
1892         let extra_lifetime_params = self.resolver.take_extra_lifetime_params(opaque_ty_node_id);
1893         debug!(?extra_lifetime_params);
1894         for (ident, outer_node_id, outer_res) in extra_lifetime_params {
1895             let outer_def_id = self.local_def_id(outer_node_id);
1896             let inner_node_id = self.next_node_id();
1897
1898             // Add a definition for the in scope lifetime def.
1899             let inner_def_id = self.create_def(
1900                 opaque_ty_def_id,
1901                 inner_node_id,
1902                 DefPathData::LifetimeNs(ident.name),
1903             );
1904             new_remapping.insert(outer_def_id, inner_def_id);
1905
1906             let inner_res = match outer_res {
1907                 // Input lifetime like `'a`:
1908                 LifetimeRes::Param { param, .. } => {
1909                     LifetimeRes::Param { param, binder: fn_node_id }
1910                 }
1911                 // Input lifetime like `'1`:
1912                 LifetimeRes::Fresh { param, .. } => {
1913                     LifetimeRes::Fresh { param, binder: fn_node_id }
1914                 }
1915                 LifetimeRes::Static | LifetimeRes::Error => continue,
1916                 res => {
1917                     panic!(
1918                         "Unexpected lifetime resolution {:?} for {:?} at {:?}",
1919                         res, ident, ident.span
1920                     )
1921                 }
1922             };
1923
1924             let lifetime = Lifetime { id: outer_node_id, ident };
1925             collected_lifetimes.push((inner_node_id, lifetime, Some(inner_res)));
1926         }
1927
1928         debug!(?collected_lifetimes);
1929
1930         // We only want to capture the lifetimes that appear in the bounds. So visit the bounds to
1931         // find out exactly which ones those are.
1932         // in fn return position, like the `fn test<'a>() -> impl Debug + 'a` example,
1933         // we only keep the lifetimes that appear in the `impl Debug` itself:
1934         let lifetimes_to_remap = lifetime_collector::lifetimes_in_ret_ty(&self.resolver, output);
1935         debug!(?lifetimes_to_remap);
1936
1937         self.with_hir_id_owner(opaque_ty_node_id, |this| {
1938             // If this opaque type is only capturing a subset of the lifetimes (those that appear
1939             // in bounds), then create the new lifetime parameters required and create a mapping
1940             // from the old `'a` (on the function) to the new `'a` (on the opaque type).
1941             collected_lifetimes.extend(
1942                 this.create_lifetime_defs(
1943                     opaque_ty_def_id,
1944                     &lifetimes_to_remap,
1945                     &mut new_remapping,
1946                 )
1947                 .into_iter()
1948                 .map(|(new_node_id, lifetime)| (new_node_id, lifetime, None)),
1949             );
1950             debug!(?collected_lifetimes);
1951             debug!(?new_remapping);
1952
1953             // Install the remapping from old to new (if any):
1954             this.with_remapping(new_remapping, |this| {
1955                 // We have to be careful to get elision right here. The
1956                 // idea is that we create a lifetime parameter for each
1957                 // lifetime in the return type.  So, given a return type
1958                 // like `async fn foo(..) -> &[&u32]`, we lower to `impl
1959                 // Future<Output = &'1 [ &'2 u32 ]>`.
1960                 //
1961                 // Then, we will create `fn foo(..) -> Foo<'_, '_>`, and
1962                 // hence the elision takes place at the fn site.
1963                 let future_bound =
1964                     this.lower_async_fn_output_type_to_future_bound(output, fn_def_id, span);
1965
1966                 let generic_params = this.arena.alloc_from_iter(collected_lifetimes.iter().map(
1967                     |&(new_node_id, lifetime, _)| {
1968                         let hir_id = this.lower_node_id(new_node_id);
1969                         debug_assert_ne!(this.opt_local_def_id(new_node_id), None);
1970
1971                         let (name, kind) = if lifetime.ident.name == kw::UnderscoreLifetime {
1972                             (hir::ParamName::Fresh, hir::LifetimeParamKind::Elided)
1973                         } else {
1974                             (
1975                                 hir::ParamName::Plain(lifetime.ident),
1976                                 hir::LifetimeParamKind::Explicit,
1977                             )
1978                         };
1979
1980                         hir::GenericParam {
1981                             hir_id,
1982                             name,
1983                             span: lifetime.ident.span,
1984                             pure_wrt_drop: false,
1985                             kind: hir::GenericParamKind::Lifetime { kind },
1986                             colon_span: None,
1987                         }
1988                     },
1989                 ));
1990                 debug!("lower_async_fn_ret_ty: generic_params={:#?}", generic_params);
1991
1992                 let opaque_ty_item = hir::OpaqueTy {
1993                     generics: this.arena.alloc(hir::Generics {
1994                         params: generic_params,
1995                         predicates: &[],
1996                         has_where_clause_predicates: false,
1997                         where_clause_span: this.lower_span(span),
1998                         span: this.lower_span(span),
1999                     }),
2000                     bounds: arena_vec![this; future_bound],
2001                     origin: hir::OpaqueTyOrigin::AsyncFn(fn_def_id),
2002                 };
2003
2004                 trace!("exist ty from async fn def id: {:#?}", opaque_ty_def_id);
2005                 this.generate_opaque_type(opaque_ty_def_id, opaque_ty_item, span, opaque_ty_span)
2006             })
2007         });
2008
2009         // As documented above, we need to create the lifetime
2010         // arguments to our opaque type. Continuing with our example,
2011         // we're creating the type arguments for the return type:
2012         //
2013         // ```
2014         // Bar<'a, 'b, '0, '1, '_>
2015         // ```
2016         //
2017         // For the "input" lifetime parameters, we wish to create
2018         // references to the parameters themselves, including the
2019         // "implicit" ones created from parameter types (`'a`, `'b`,
2020         // '`0`, `'1`).
2021         //
2022         // For the "output" lifetime parameters, we just want to
2023         // generate `'_`.
2024         let generic_args = self.arena.alloc_from_iter(collected_lifetimes.into_iter().map(
2025             |(_, lifetime, res)| {
2026                 let id = self.next_node_id();
2027                 let span = lifetime.ident.span;
2028
2029                 let ident = if lifetime.ident.name == kw::UnderscoreLifetime {
2030                     Ident::with_dummy_span(kw::UnderscoreLifetime)
2031                 } else {
2032                     lifetime.ident
2033                 };
2034
2035                 let res = res.unwrap_or(
2036                     self.resolver.get_lifetime_res(lifetime.id).unwrap_or(LifetimeRes::Error),
2037                 );
2038                 hir::GenericArg::Lifetime(self.new_named_lifetime_with_res(id, span, ident, res))
2039             },
2040         ));
2041
2042         // Create the `Foo<...>` reference itself. Note that the `type
2043         // Foo = impl Trait` is, internally, created as a child of the
2044         // async fn, so the *type parameters* are inherited.  It's
2045         // only the lifetime parameters that we must supply.
2046         let opaque_ty_ref =
2047             hir::TyKind::OpaqueDef(hir::ItemId { def_id: opaque_ty_def_id }, generic_args);
2048         let opaque_ty = self.ty(opaque_ty_span, opaque_ty_ref);
2049         hir::FnRetTy::Return(self.arena.alloc(opaque_ty))
2050     }
2051
2052     // Transforms `-> T` for `async fn` into `-> OpaqueTy { .. }`
2053     // combined with the following definition of `OpaqueTy`:
2054     //
2055     //     type OpaqueTy<generics_from_parent_fn> = impl Future<Output = T>;
2056     //
2057     // `output`: unlowered output type (`T` in `-> T`)
2058     // `fn_def_id`: `DefId` of the parent function (used to create child impl trait definition)
2059     // `opaque_ty_node_id`: `NodeId` of the opaque `impl Trait` type that should be created
2060     #[instrument(level = "debug", skip(self))]
2061     fn lower_async_fn_ret_ty_in_trait(
2062         &mut self,
2063         output: &FnRetTy,
2064         fn_node_id: NodeId,
2065         opaque_ty_node_id: NodeId,
2066     ) -> hir::FnRetTy<'hir> {
2067         let span = output.span();
2068
2069         let opaque_ty_span = self.mark_span_with_reason(DesugaringKind::Async, span, None);
2070
2071         let fn_def_id = self.local_def_id(fn_node_id);
2072
2073         let kind = self.lower_impl_trait_in_trait(output.span(), opaque_ty_node_id, |lctx| {
2074             let bound =
2075                 lctx.lower_async_fn_output_type_to_future_bound(output, fn_def_id, output.span());
2076             arena_vec![lctx; bound]
2077         });
2078         let opaque_ty = self.ty(opaque_ty_span, kind);
2079         hir::FnRetTy::Return(self.arena.alloc(opaque_ty))
2080     }
2081
2082     /// Transforms `-> T` into `Future<Output = T>`.
2083     fn lower_async_fn_output_type_to_future_bound(
2084         &mut self,
2085         output: &FnRetTy,
2086         fn_def_id: LocalDefId,
2087         span: Span,
2088     ) -> hir::GenericBound<'hir> {
2089         // Compute the `T` in `Future<Output = T>` from the return type.
2090         let output_ty = match output {
2091             FnRetTy::Ty(ty) => {
2092                 // Not `OpaqueTyOrigin::AsyncFn`: that's only used for the
2093                 // `impl Future` opaque type that `async fn` implicitly
2094                 // generates.
2095                 let mut context = ImplTraitContext::ReturnPositionOpaqueTy {
2096                     origin: hir::OpaqueTyOrigin::FnReturn(fn_def_id),
2097                 };
2098                 self.lower_ty(ty, &mut context)
2099             }
2100             FnRetTy::Default(ret_ty_span) => self.arena.alloc(self.ty_tup(*ret_ty_span, &[])),
2101         };
2102
2103         // "<Output = T>"
2104         let future_args = self.arena.alloc(hir::GenericArgs {
2105             args: &[],
2106             bindings: arena_vec![self; self.output_ty_binding(span, output_ty)],
2107             parenthesized: false,
2108             span_ext: DUMMY_SP,
2109         });
2110
2111         hir::GenericBound::LangItemTrait(
2112             // ::std::future::Future<future_params>
2113             hir::LangItem::Future,
2114             self.lower_span(span),
2115             self.next_id(),
2116             future_args,
2117         )
2118     }
2119
2120     #[instrument(level = "trace", skip(self))]
2121     fn lower_param_bound(
2122         &mut self,
2123         tpb: &GenericBound,
2124         itctx: &mut ImplTraitContext,
2125     ) -> hir::GenericBound<'hir> {
2126         match tpb {
2127             GenericBound::Trait(p, modifier) => hir::GenericBound::Trait(
2128                 self.lower_poly_trait_ref(p, itctx),
2129                 self.lower_trait_bound_modifier(*modifier),
2130             ),
2131             GenericBound::Outlives(lifetime) => {
2132                 hir::GenericBound::Outlives(self.lower_lifetime(lifetime))
2133             }
2134         }
2135     }
2136
2137     fn lower_lifetime(&mut self, l: &Lifetime) -> &'hir hir::Lifetime {
2138         let span = self.lower_span(l.ident.span);
2139         let ident = self.lower_ident(l.ident);
2140         self.new_named_lifetime(l.id, l.id, span, ident)
2141     }
2142
2143     #[instrument(level = "debug", skip(self))]
2144     fn new_named_lifetime_with_res(
2145         &mut self,
2146         id: NodeId,
2147         span: Span,
2148         ident: Ident,
2149         res: LifetimeRes,
2150     ) -> &'hir hir::Lifetime {
2151         let name = match res {
2152             LifetimeRes::Param { param, .. } => {
2153                 let p_name = ParamName::Plain(ident);
2154                 let param = self.get_remapped_def_id(param);
2155
2156                 hir::LifetimeName::Param(param, p_name)
2157             }
2158             LifetimeRes::Fresh { param, .. } => {
2159                 debug_assert_eq!(ident.name, kw::UnderscoreLifetime);
2160                 let param = self.local_def_id(param);
2161
2162                 hir::LifetimeName::Param(param, ParamName::Fresh)
2163             }
2164             LifetimeRes::Infer => hir::LifetimeName::Infer,
2165             LifetimeRes::Static => hir::LifetimeName::Static,
2166             LifetimeRes::Error => hir::LifetimeName::Error,
2167             res => panic!("Unexpected lifetime resolution {:?} for {:?} at {:?}", res, ident, span),
2168         };
2169
2170         debug!(?name);
2171         self.arena.alloc(hir::Lifetime {
2172             hir_id: self.lower_node_id(id),
2173             span: self.lower_span(span),
2174             name,
2175         })
2176     }
2177
2178     #[instrument(level = "debug", skip(self))]
2179     fn new_named_lifetime(
2180         &mut self,
2181         id: NodeId,
2182         new_id: NodeId,
2183         span: Span,
2184         ident: Ident,
2185     ) -> &'hir hir::Lifetime {
2186         let res = self.resolver.get_lifetime_res(id).unwrap_or(LifetimeRes::Error);
2187         self.new_named_lifetime_with_res(new_id, span, ident, res)
2188     }
2189
2190     fn lower_generic_params_mut<'s>(
2191         &'s mut self,
2192         params: &'s [GenericParam],
2193     ) -> impl Iterator<Item = hir::GenericParam<'hir>> + Captures<'a> + Captures<'s> {
2194         params.iter().map(move |param| self.lower_generic_param(param))
2195     }
2196
2197     fn lower_generic_params(&mut self, params: &[GenericParam]) -> &'hir [hir::GenericParam<'hir>] {
2198         self.arena.alloc_from_iter(self.lower_generic_params_mut(params))
2199     }
2200
2201     #[instrument(level = "trace", skip(self))]
2202     fn lower_generic_param(&mut self, param: &GenericParam) -> hir::GenericParam<'hir> {
2203         let (name, kind) = self.lower_generic_param_kind(param);
2204
2205         let hir_id = self.lower_node_id(param.id);
2206         self.lower_attrs(hir_id, &param.attrs);
2207         hir::GenericParam {
2208             hir_id,
2209             name,
2210             span: self.lower_span(param.span()),
2211             pure_wrt_drop: self.tcx.sess.contains_name(&param.attrs, sym::may_dangle),
2212             kind,
2213             colon_span: param.colon_span.map(|s| self.lower_span(s)),
2214         }
2215     }
2216
2217     fn lower_generic_param_kind(
2218         &mut self,
2219         param: &GenericParam,
2220     ) -> (hir::ParamName, hir::GenericParamKind<'hir>) {
2221         match param.kind {
2222             GenericParamKind::Lifetime => {
2223                 // AST resolution emitted an error on those parameters, so we lower them using
2224                 // `ParamName::Error`.
2225                 let param_name =
2226                     if let Some(LifetimeRes::Error) = self.resolver.get_lifetime_res(param.id) {
2227                         ParamName::Error
2228                     } else {
2229                         let ident = self.lower_ident(param.ident);
2230                         ParamName::Plain(ident)
2231                     };
2232                 let kind =
2233                     hir::GenericParamKind::Lifetime { kind: hir::LifetimeParamKind::Explicit };
2234
2235                 (param_name, kind)
2236             }
2237             GenericParamKind::Type { ref default, .. } => {
2238                 let kind = hir::GenericParamKind::Type {
2239                     default: default.as_ref().map(|x| {
2240                         self.lower_ty(x, &mut ImplTraitContext::Disallowed(ImplTraitPosition::Type))
2241                     }),
2242                     synthetic: false,
2243                 };
2244
2245                 (hir::ParamName::Plain(self.lower_ident(param.ident)), kind)
2246             }
2247             GenericParamKind::Const { ref ty, kw_span: _, ref default } => {
2248                 let ty =
2249                     self.lower_ty(&ty, &mut ImplTraitContext::Disallowed(ImplTraitPosition::Type));
2250                 let default = default.as_ref().map(|def| self.lower_anon_const(def));
2251                 (
2252                     hir::ParamName::Plain(self.lower_ident(param.ident)),
2253                     hir::GenericParamKind::Const { ty, default },
2254                 )
2255             }
2256         }
2257     }
2258
2259     fn lower_trait_ref(
2260         &mut self,
2261         p: &TraitRef,
2262         itctx: &mut ImplTraitContext,
2263     ) -> hir::TraitRef<'hir> {
2264         let path = match self.lower_qpath(p.ref_id, &None, &p.path, ParamMode::Explicit, itctx) {
2265             hir::QPath::Resolved(None, path) => path,
2266             qpath => panic!("lower_trait_ref: unexpected QPath `{:?}`", qpath),
2267         };
2268         hir::TraitRef { path, hir_ref_id: self.lower_node_id(p.ref_id) }
2269     }
2270
2271     #[instrument(level = "debug", skip(self))]
2272     fn lower_poly_trait_ref(
2273         &mut self,
2274         p: &PolyTraitRef,
2275         itctx: &mut ImplTraitContext,
2276     ) -> hir::PolyTraitRef<'hir> {
2277         self.lower_lifetime_binder(
2278             p.trait_ref.ref_id,
2279             &p.bound_generic_params,
2280             |lctx, bound_generic_params| {
2281                 let trait_ref = lctx.lower_trait_ref(&p.trait_ref, itctx);
2282                 hir::PolyTraitRef { bound_generic_params, trait_ref, span: lctx.lower_span(p.span) }
2283             },
2284         )
2285     }
2286
2287     fn lower_mt(&mut self, mt: &MutTy, itctx: &mut ImplTraitContext) -> hir::MutTy<'hir> {
2288         hir::MutTy { ty: self.lower_ty(&mt.ty, itctx), mutbl: mt.mutbl }
2289     }
2290
2291     #[instrument(level = "debug", skip(self), ret)]
2292     fn lower_param_bounds(
2293         &mut self,
2294         bounds: &[GenericBound],
2295         itctx: &mut ImplTraitContext,
2296     ) -> hir::GenericBounds<'hir> {
2297         self.arena.alloc_from_iter(self.lower_param_bounds_mut(bounds, itctx))
2298     }
2299
2300     fn lower_param_bounds_mut<'s, 'b>(
2301         &'s mut self,
2302         bounds: &'s [GenericBound],
2303         itctx: &'b mut ImplTraitContext,
2304     ) -> impl Iterator<Item = hir::GenericBound<'hir>> + Captures<'s> + Captures<'a> + Captures<'b>
2305     {
2306         bounds.iter().map(move |bound| self.lower_param_bound(bound, itctx))
2307     }
2308
2309     #[instrument(level = "debug", skip(self), ret)]
2310     fn lower_generic_and_bounds(
2311         &mut self,
2312         node_id: NodeId,
2313         span: Span,
2314         ident: Ident,
2315         bounds: &[GenericBound],
2316     ) -> (hir::GenericParam<'hir>, Option<hir::WherePredicate<'hir>>, hir::TyKind<'hir>) {
2317         // Add a definition for the in-band `Param`.
2318         let def_id = self.local_def_id(node_id);
2319
2320         // Set the name to `impl Bound1 + Bound2`.
2321         let param = hir::GenericParam {
2322             hir_id: self.lower_node_id(node_id),
2323             name: ParamName::Plain(self.lower_ident(ident)),
2324             pure_wrt_drop: false,
2325             span: self.lower_span(span),
2326             kind: hir::GenericParamKind::Type { default: None, synthetic: true },
2327             colon_span: None,
2328         };
2329
2330         let preds = self.lower_generic_bound_predicate(
2331             ident,
2332             node_id,
2333             &GenericParamKind::Type { default: None },
2334             bounds,
2335             &mut ImplTraitContext::Universal,
2336             hir::PredicateOrigin::ImplTrait,
2337         );
2338
2339         let hir_id = self.next_id();
2340         let res = Res::Def(DefKind::TyParam, def_id.to_def_id());
2341         let ty = hir::TyKind::Path(hir::QPath::Resolved(
2342             None,
2343             self.arena.alloc(hir::Path {
2344                 span: self.lower_span(span),
2345                 res,
2346                 segments:
2347                     arena_vec![self; hir::PathSegment::new(self.lower_ident(ident), hir_id, res)],
2348             }),
2349         ));
2350
2351         (param, preds, ty)
2352     }
2353
2354     /// Lowers a block directly to an expression, presuming that it
2355     /// has no attributes and is not targeted by a `break`.
2356     fn lower_block_expr(&mut self, b: &Block) -> hir::Expr<'hir> {
2357         let block = self.lower_block(b, false);
2358         self.expr_block(block, AttrVec::new())
2359     }
2360
2361     fn lower_array_length(&mut self, c: &AnonConst) -> hir::ArrayLen {
2362         match c.value.kind {
2363             ExprKind::Underscore => {
2364                 if self.tcx.features().generic_arg_infer {
2365                     hir::ArrayLen::Infer(self.lower_node_id(c.id), c.value.span)
2366                 } else {
2367                     feature_err(
2368                         &self.tcx.sess.parse_sess,
2369                         sym::generic_arg_infer,
2370                         c.value.span,
2371                         "using `_` for array lengths is unstable",
2372                     )
2373                     .stash(c.value.span, StashKey::UnderscoreForArrayLengths);
2374                     hir::ArrayLen::Body(self.lower_anon_const(c))
2375                 }
2376             }
2377             _ => hir::ArrayLen::Body(self.lower_anon_const(c)),
2378         }
2379     }
2380
2381     fn lower_anon_const(&mut self, c: &AnonConst) -> hir::AnonConst {
2382         self.with_new_scopes(|this| hir::AnonConst {
2383             hir_id: this.lower_node_id(c.id),
2384             body: this.lower_const_body(c.value.span, Some(&c.value)),
2385         })
2386     }
2387
2388     fn lower_unsafe_source(&mut self, u: UnsafeSource) -> hir::UnsafeSource {
2389         match u {
2390             CompilerGenerated => hir::UnsafeSource::CompilerGenerated,
2391             UserProvided => hir::UnsafeSource::UserProvided,
2392         }
2393     }
2394
2395     fn lower_trait_bound_modifier(&mut self, f: TraitBoundModifier) -> hir::TraitBoundModifier {
2396         match f {
2397             TraitBoundModifier::None => hir::TraitBoundModifier::None,
2398             TraitBoundModifier::MaybeConst => hir::TraitBoundModifier::MaybeConst,
2399
2400             // `MaybeConstMaybe` will cause an error during AST validation, but we need to pick a
2401             // placeholder for compilation to proceed.
2402             TraitBoundModifier::MaybeConstMaybe | TraitBoundModifier::Maybe => {
2403                 hir::TraitBoundModifier::Maybe
2404             }
2405         }
2406     }
2407
2408     // Helper methods for building HIR.
2409
2410     fn stmt(&mut self, span: Span, kind: hir::StmtKind<'hir>) -> hir::Stmt<'hir> {
2411         hir::Stmt { span: self.lower_span(span), kind, hir_id: self.next_id() }
2412     }
2413
2414     fn stmt_expr(&mut self, span: Span, expr: hir::Expr<'hir>) -> hir::Stmt<'hir> {
2415         self.stmt(span, hir::StmtKind::Expr(self.arena.alloc(expr)))
2416     }
2417
2418     fn stmt_let_pat(
2419         &mut self,
2420         attrs: Option<&'hir [Attribute]>,
2421         span: Span,
2422         init: Option<&'hir hir::Expr<'hir>>,
2423         pat: &'hir hir::Pat<'hir>,
2424         source: hir::LocalSource,
2425     ) -> hir::Stmt<'hir> {
2426         let hir_id = self.next_id();
2427         if let Some(a) = attrs {
2428             debug_assert!(!a.is_empty());
2429             self.attrs.insert(hir_id.local_id, a);
2430         }
2431         let local = hir::Local {
2432             hir_id,
2433             init,
2434             pat,
2435             els: None,
2436             source,
2437             span: self.lower_span(span),
2438             ty: None,
2439         };
2440         self.stmt(span, hir::StmtKind::Local(self.arena.alloc(local)))
2441     }
2442
2443     fn block_expr(&mut self, expr: &'hir hir::Expr<'hir>) -> &'hir hir::Block<'hir> {
2444         self.block_all(expr.span, &[], Some(expr))
2445     }
2446
2447     fn block_all(
2448         &mut self,
2449         span: Span,
2450         stmts: &'hir [hir::Stmt<'hir>],
2451         expr: Option<&'hir hir::Expr<'hir>>,
2452     ) -> &'hir hir::Block<'hir> {
2453         let blk = hir::Block {
2454             stmts,
2455             expr,
2456             hir_id: self.next_id(),
2457             rules: hir::BlockCheckMode::DefaultBlock,
2458             span: self.lower_span(span),
2459             targeted_by_break: false,
2460         };
2461         self.arena.alloc(blk)
2462     }
2463
2464     fn pat_cf_continue(&mut self, span: Span, pat: &'hir hir::Pat<'hir>) -> &'hir hir::Pat<'hir> {
2465         let field = self.single_pat_field(span, pat);
2466         self.pat_lang_item_variant(span, hir::LangItem::ControlFlowContinue, field, None)
2467     }
2468
2469     fn pat_cf_break(&mut self, span: Span, pat: &'hir hir::Pat<'hir>) -> &'hir hir::Pat<'hir> {
2470         let field = self.single_pat_field(span, pat);
2471         self.pat_lang_item_variant(span, hir::LangItem::ControlFlowBreak, field, None)
2472     }
2473
2474     fn pat_some(&mut self, span: Span, pat: &'hir hir::Pat<'hir>) -> &'hir hir::Pat<'hir> {
2475         let field = self.single_pat_field(span, pat);
2476         self.pat_lang_item_variant(span, hir::LangItem::OptionSome, field, None)
2477     }
2478
2479     fn pat_none(&mut self, span: Span) -> &'hir hir::Pat<'hir> {
2480         self.pat_lang_item_variant(span, hir::LangItem::OptionNone, &[], None)
2481     }
2482
2483     fn single_pat_field(
2484         &mut self,
2485         span: Span,
2486         pat: &'hir hir::Pat<'hir>,
2487     ) -> &'hir [hir::PatField<'hir>] {
2488         let field = hir::PatField {
2489             hir_id: self.next_id(),
2490             ident: Ident::new(sym::integer(0), self.lower_span(span)),
2491             is_shorthand: false,
2492             pat,
2493             span: self.lower_span(span),
2494         };
2495         arena_vec![self; field]
2496     }
2497
2498     fn pat_lang_item_variant(
2499         &mut self,
2500         span: Span,
2501         lang_item: hir::LangItem,
2502         fields: &'hir [hir::PatField<'hir>],
2503         hir_id: Option<hir::HirId>,
2504     ) -> &'hir hir::Pat<'hir> {
2505         let qpath = hir::QPath::LangItem(lang_item, self.lower_span(span), hir_id);
2506         self.pat(span, hir::PatKind::Struct(qpath, fields, false))
2507     }
2508
2509     fn pat_ident(&mut self, span: Span, ident: Ident) -> (&'hir hir::Pat<'hir>, hir::HirId) {
2510         self.pat_ident_binding_mode(span, ident, hir::BindingAnnotation::NONE)
2511     }
2512
2513     fn pat_ident_mut(&mut self, span: Span, ident: Ident) -> (hir::Pat<'hir>, hir::HirId) {
2514         self.pat_ident_binding_mode_mut(span, ident, hir::BindingAnnotation::NONE)
2515     }
2516
2517     fn pat_ident_binding_mode(
2518         &mut self,
2519         span: Span,
2520         ident: Ident,
2521         bm: hir::BindingAnnotation,
2522     ) -> (&'hir hir::Pat<'hir>, hir::HirId) {
2523         let (pat, hir_id) = self.pat_ident_binding_mode_mut(span, ident, bm);
2524         (self.arena.alloc(pat), hir_id)
2525     }
2526
2527     fn pat_ident_binding_mode_mut(
2528         &mut self,
2529         span: Span,
2530         ident: Ident,
2531         bm: hir::BindingAnnotation,
2532     ) -> (hir::Pat<'hir>, hir::HirId) {
2533         let hir_id = self.next_id();
2534
2535         (
2536             hir::Pat {
2537                 hir_id,
2538                 kind: hir::PatKind::Binding(bm, hir_id, self.lower_ident(ident), None),
2539                 span: self.lower_span(span),
2540                 default_binding_modes: true,
2541             },
2542             hir_id,
2543         )
2544     }
2545
2546     fn pat(&mut self, span: Span, kind: hir::PatKind<'hir>) -> &'hir hir::Pat<'hir> {
2547         self.arena.alloc(hir::Pat {
2548             hir_id: self.next_id(),
2549             kind,
2550             span: self.lower_span(span),
2551             default_binding_modes: true,
2552         })
2553     }
2554
2555     fn pat_without_dbm(&mut self, span: Span, kind: hir::PatKind<'hir>) -> hir::Pat<'hir> {
2556         hir::Pat {
2557             hir_id: self.next_id(),
2558             kind,
2559             span: self.lower_span(span),
2560             default_binding_modes: false,
2561         }
2562     }
2563
2564     fn ty_path(
2565         &mut self,
2566         mut hir_id: hir::HirId,
2567         span: Span,
2568         qpath: hir::QPath<'hir>,
2569     ) -> hir::Ty<'hir> {
2570         let kind = match qpath {
2571             hir::QPath::Resolved(None, path) => {
2572                 // Turn trait object paths into `TyKind::TraitObject` instead.
2573                 match path.res {
2574                     Res::Def(DefKind::Trait | DefKind::TraitAlias, _) => {
2575                         let principal = hir::PolyTraitRef {
2576                             bound_generic_params: &[],
2577                             trait_ref: hir::TraitRef { path, hir_ref_id: hir_id },
2578                             span: self.lower_span(span),
2579                         };
2580
2581                         // The original ID is taken by the `PolyTraitRef`,
2582                         // so the `Ty` itself needs a different one.
2583                         hir_id = self.next_id();
2584                         hir::TyKind::TraitObject(
2585                             arena_vec![self; principal],
2586                             self.elided_dyn_bound(span),
2587                             TraitObjectSyntax::None,
2588                         )
2589                     }
2590                     _ => hir::TyKind::Path(hir::QPath::Resolved(None, path)),
2591                 }
2592             }
2593             _ => hir::TyKind::Path(qpath),
2594         };
2595
2596         hir::Ty { hir_id, kind, span: self.lower_span(span) }
2597     }
2598
2599     /// Invoked to create the lifetime argument(s) for an elided trait object
2600     /// bound, like the bound in `Box<dyn Debug>`. This method is not invoked
2601     /// when the bound is written, even if it is written with `'_` like in
2602     /// `Box<dyn Debug + '_>`. In those cases, `lower_lifetime` is invoked.
2603     fn elided_dyn_bound(&mut self, span: Span) -> &'hir hir::Lifetime {
2604         let r = hir::Lifetime {
2605             hir_id: self.next_id(),
2606             span: self.lower_span(span),
2607             name: hir::LifetimeName::ImplicitObjectLifetimeDefault,
2608         };
2609         debug!("elided_dyn_bound: r={:?}", r);
2610         self.arena.alloc(r)
2611     }
2612 }
2613
2614 /// Helper struct for delayed construction of GenericArgs.
2615 struct GenericArgsCtor<'hir> {
2616     args: SmallVec<[hir::GenericArg<'hir>; 4]>,
2617     bindings: &'hir [hir::TypeBinding<'hir>],
2618     parenthesized: bool,
2619     span: Span,
2620 }
2621
2622 impl<'hir> GenericArgsCtor<'hir> {
2623     fn is_empty(&self) -> bool {
2624         self.args.is_empty() && self.bindings.is_empty() && !self.parenthesized
2625     }
2626
2627     fn into_generic_args(self, this: &LoweringContext<'_, 'hir>) -> &'hir hir::GenericArgs<'hir> {
2628         let ga = hir::GenericArgs {
2629             args: this.arena.alloc_from_iter(self.args),
2630             bindings: self.bindings,
2631             parenthesized: self.parenthesized,
2632             span_ext: this.lower_span(self.span),
2633         };
2634         this.arena.alloc(ga)
2635     }
2636 }