]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_ast_lowering/src/lib.rs
Bless tests, fix ICE with ImplTraitPlaceholder
[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 = this.lower_async_fn_output_type_to_future_bound(
1964                     output,
1965                     span,
1966                     ImplTraitContext::ReturnPositionOpaqueTy {
1967                         origin: hir::OpaqueTyOrigin::FnReturn(fn_def_id),
1968                     },
1969                 );
1970
1971                 let generic_params = this.arena.alloc_from_iter(collected_lifetimes.iter().map(
1972                     |&(new_node_id, lifetime, _)| {
1973                         let hir_id = this.lower_node_id(new_node_id);
1974                         debug_assert_ne!(this.opt_local_def_id(new_node_id), None);
1975
1976                         let (name, kind) = if lifetime.ident.name == kw::UnderscoreLifetime {
1977                             (hir::ParamName::Fresh, hir::LifetimeParamKind::Elided)
1978                         } else {
1979                             (
1980                                 hir::ParamName::Plain(lifetime.ident),
1981                                 hir::LifetimeParamKind::Explicit,
1982                             )
1983                         };
1984
1985                         hir::GenericParam {
1986                             hir_id,
1987                             name,
1988                             span: lifetime.ident.span,
1989                             pure_wrt_drop: false,
1990                             kind: hir::GenericParamKind::Lifetime { kind },
1991                             colon_span: None,
1992                         }
1993                     },
1994                 ));
1995                 debug!("lower_async_fn_ret_ty: generic_params={:#?}", generic_params);
1996
1997                 let opaque_ty_item = hir::OpaqueTy {
1998                     generics: this.arena.alloc(hir::Generics {
1999                         params: generic_params,
2000                         predicates: &[],
2001                         has_where_clause_predicates: false,
2002                         where_clause_span: this.lower_span(span),
2003                         span: this.lower_span(span),
2004                     }),
2005                     bounds: arena_vec![this; future_bound],
2006                     origin: hir::OpaqueTyOrigin::AsyncFn(fn_def_id),
2007                 };
2008
2009                 trace!("exist ty from async fn def id: {:#?}", opaque_ty_def_id);
2010                 this.generate_opaque_type(opaque_ty_def_id, opaque_ty_item, span, opaque_ty_span)
2011             })
2012         });
2013
2014         // As documented above, we need to create the lifetime
2015         // arguments to our opaque type. Continuing with our example,
2016         // we're creating the type arguments for the return type:
2017         //
2018         // ```
2019         // Bar<'a, 'b, '0, '1, '_>
2020         // ```
2021         //
2022         // For the "input" lifetime parameters, we wish to create
2023         // references to the parameters themselves, including the
2024         // "implicit" ones created from parameter types (`'a`, `'b`,
2025         // '`0`, `'1`).
2026         //
2027         // For the "output" lifetime parameters, we just want to
2028         // generate `'_`.
2029         let generic_args = self.arena.alloc_from_iter(collected_lifetimes.into_iter().map(
2030             |(_, lifetime, res)| {
2031                 let id = self.next_node_id();
2032                 let span = lifetime.ident.span;
2033
2034                 let ident = if lifetime.ident.name == kw::UnderscoreLifetime {
2035                     Ident::with_dummy_span(kw::UnderscoreLifetime)
2036                 } else {
2037                     lifetime.ident
2038                 };
2039
2040                 let res = res.unwrap_or(
2041                     self.resolver.get_lifetime_res(lifetime.id).unwrap_or(LifetimeRes::Error),
2042                 );
2043                 hir::GenericArg::Lifetime(self.new_named_lifetime_with_res(id, span, ident, res))
2044             },
2045         ));
2046
2047         // Create the `Foo<...>` reference itself. Note that the `type
2048         // Foo = impl Trait` is, internally, created as a child of the
2049         // async fn, so the *type parameters* are inherited.  It's
2050         // only the lifetime parameters that we must supply.
2051         let opaque_ty_ref =
2052             hir::TyKind::OpaqueDef(hir::ItemId { def_id: opaque_ty_def_id }, generic_args);
2053         let opaque_ty = self.ty(opaque_ty_span, opaque_ty_ref);
2054         hir::FnRetTy::Return(self.arena.alloc(opaque_ty))
2055     }
2056
2057     // Transforms `-> T` for `async fn` into `-> OpaqueTy { .. }`
2058     // combined with the following definition of `OpaqueTy`:
2059     //
2060     //     type OpaqueTy<generics_from_parent_fn> = impl Future<Output = T>;
2061     //
2062     // `output`: unlowered output type (`T` in `-> T`)
2063     // `fn_def_id`: `DefId` of the parent function (used to create child impl trait definition)
2064     // `opaque_ty_node_id`: `NodeId` of the opaque `impl Trait` type that should be created
2065     #[instrument(level = "debug", skip(self))]
2066     fn lower_async_fn_ret_ty_in_trait(
2067         &mut self,
2068         output: &FnRetTy,
2069         fn_node_id: NodeId,
2070         opaque_ty_node_id: NodeId,
2071     ) -> hir::FnRetTy<'hir> {
2072         let kind = self.lower_impl_trait_in_trait(output.span(), opaque_ty_node_id, |lctx| {
2073             let bound = lctx.lower_async_fn_output_type_to_future_bound(
2074                 output,
2075                 output.span(),
2076                 ImplTraitContext::Disallowed(ImplTraitPosition::TraitReturn),
2077             );
2078             arena_vec![lctx; bound]
2079         });
2080
2081         let opaque_ty_span = self.mark_span_with_reason(DesugaringKind::Async, output.span(), None);
2082         let opaque_ty = self.ty(opaque_ty_span, kind);
2083         hir::FnRetTy::Return(self.arena.alloc(opaque_ty))
2084     }
2085
2086     /// Transforms `-> T` into `Future<Output = T>`.
2087     fn lower_async_fn_output_type_to_future_bound(
2088         &mut self,
2089         output: &FnRetTy,
2090         span: Span,
2091         mut nested_impl_trait_context: ImplTraitContext,
2092     ) -> hir::GenericBound<'hir> {
2093         // Compute the `T` in `Future<Output = T>` from the return type.
2094         let output_ty = match output {
2095             FnRetTy::Ty(ty) => {
2096                 // Not `OpaqueTyOrigin::AsyncFn`: that's only used for the
2097                 // `impl Future` opaque type that `async fn` implicitly
2098                 // generates.
2099                 self.lower_ty(ty, &mut nested_impl_trait_context)
2100             }
2101             FnRetTy::Default(ret_ty_span) => self.arena.alloc(self.ty_tup(*ret_ty_span, &[])),
2102         };
2103
2104         // "<Output = T>"
2105         let future_args = self.arena.alloc(hir::GenericArgs {
2106             args: &[],
2107             bindings: arena_vec![self; self.output_ty_binding(span, output_ty)],
2108             parenthesized: false,
2109             span_ext: DUMMY_SP,
2110         });
2111
2112         hir::GenericBound::LangItemTrait(
2113             // ::std::future::Future<future_params>
2114             hir::LangItem::Future,
2115             self.lower_span(span),
2116             self.next_id(),
2117             future_args,
2118         )
2119     }
2120
2121     #[instrument(level = "trace", skip(self))]
2122     fn lower_param_bound(
2123         &mut self,
2124         tpb: &GenericBound,
2125         itctx: &mut ImplTraitContext,
2126     ) -> hir::GenericBound<'hir> {
2127         match tpb {
2128             GenericBound::Trait(p, modifier) => hir::GenericBound::Trait(
2129                 self.lower_poly_trait_ref(p, itctx),
2130                 self.lower_trait_bound_modifier(*modifier),
2131             ),
2132             GenericBound::Outlives(lifetime) => {
2133                 hir::GenericBound::Outlives(self.lower_lifetime(lifetime))
2134             }
2135         }
2136     }
2137
2138     fn lower_lifetime(&mut self, l: &Lifetime) -> &'hir hir::Lifetime {
2139         let span = self.lower_span(l.ident.span);
2140         let ident = self.lower_ident(l.ident);
2141         self.new_named_lifetime(l.id, l.id, span, ident)
2142     }
2143
2144     #[instrument(level = "debug", skip(self))]
2145     fn new_named_lifetime_with_res(
2146         &mut self,
2147         id: NodeId,
2148         span: Span,
2149         ident: Ident,
2150         res: LifetimeRes,
2151     ) -> &'hir hir::Lifetime {
2152         let name = match res {
2153             LifetimeRes::Param { param, .. } => {
2154                 let p_name = ParamName::Plain(ident);
2155                 let param = self.get_remapped_def_id(param);
2156
2157                 hir::LifetimeName::Param(param, p_name)
2158             }
2159             LifetimeRes::Fresh { param, .. } => {
2160                 debug_assert_eq!(ident.name, kw::UnderscoreLifetime);
2161                 let param = self.local_def_id(param);
2162
2163                 hir::LifetimeName::Param(param, ParamName::Fresh)
2164             }
2165             LifetimeRes::Infer => hir::LifetimeName::Infer,
2166             LifetimeRes::Static => hir::LifetimeName::Static,
2167             LifetimeRes::Error => hir::LifetimeName::Error,
2168             res => panic!("Unexpected lifetime resolution {:?} for {:?} at {:?}", res, ident, span),
2169         };
2170
2171         debug!(?name);
2172         self.arena.alloc(hir::Lifetime {
2173             hir_id: self.lower_node_id(id),
2174             span: self.lower_span(span),
2175             name,
2176         })
2177     }
2178
2179     #[instrument(level = "debug", skip(self))]
2180     fn new_named_lifetime(
2181         &mut self,
2182         id: NodeId,
2183         new_id: NodeId,
2184         span: Span,
2185         ident: Ident,
2186     ) -> &'hir hir::Lifetime {
2187         let res = self.resolver.get_lifetime_res(id).unwrap_or(LifetimeRes::Error);
2188         self.new_named_lifetime_with_res(new_id, span, ident, res)
2189     }
2190
2191     fn lower_generic_params_mut<'s>(
2192         &'s mut self,
2193         params: &'s [GenericParam],
2194     ) -> impl Iterator<Item = hir::GenericParam<'hir>> + Captures<'a> + Captures<'s> {
2195         params.iter().map(move |param| self.lower_generic_param(param))
2196     }
2197
2198     fn lower_generic_params(&mut self, params: &[GenericParam]) -> &'hir [hir::GenericParam<'hir>] {
2199         self.arena.alloc_from_iter(self.lower_generic_params_mut(params))
2200     }
2201
2202     #[instrument(level = "trace", skip(self))]
2203     fn lower_generic_param(&mut self, param: &GenericParam) -> hir::GenericParam<'hir> {
2204         let (name, kind) = self.lower_generic_param_kind(param);
2205
2206         let hir_id = self.lower_node_id(param.id);
2207         self.lower_attrs(hir_id, &param.attrs);
2208         hir::GenericParam {
2209             hir_id,
2210             name,
2211             span: self.lower_span(param.span()),
2212             pure_wrt_drop: self.tcx.sess.contains_name(&param.attrs, sym::may_dangle),
2213             kind,
2214             colon_span: param.colon_span.map(|s| self.lower_span(s)),
2215         }
2216     }
2217
2218     fn lower_generic_param_kind(
2219         &mut self,
2220         param: &GenericParam,
2221     ) -> (hir::ParamName, hir::GenericParamKind<'hir>) {
2222         match param.kind {
2223             GenericParamKind::Lifetime => {
2224                 // AST resolution emitted an error on those parameters, so we lower them using
2225                 // `ParamName::Error`.
2226                 let param_name =
2227                     if let Some(LifetimeRes::Error) = self.resolver.get_lifetime_res(param.id) {
2228                         ParamName::Error
2229                     } else {
2230                         let ident = self.lower_ident(param.ident);
2231                         ParamName::Plain(ident)
2232                     };
2233                 let kind =
2234                     hir::GenericParamKind::Lifetime { kind: hir::LifetimeParamKind::Explicit };
2235
2236                 (param_name, kind)
2237             }
2238             GenericParamKind::Type { ref default, .. } => {
2239                 let kind = hir::GenericParamKind::Type {
2240                     default: default.as_ref().map(|x| {
2241                         self.lower_ty(x, &mut ImplTraitContext::Disallowed(ImplTraitPosition::Type))
2242                     }),
2243                     synthetic: false,
2244                 };
2245
2246                 (hir::ParamName::Plain(self.lower_ident(param.ident)), kind)
2247             }
2248             GenericParamKind::Const { ref ty, kw_span: _, ref default } => {
2249                 let ty =
2250                     self.lower_ty(&ty, &mut ImplTraitContext::Disallowed(ImplTraitPosition::Type));
2251                 let default = default.as_ref().map(|def| self.lower_anon_const(def));
2252                 (
2253                     hir::ParamName::Plain(self.lower_ident(param.ident)),
2254                     hir::GenericParamKind::Const { ty, default },
2255                 )
2256             }
2257         }
2258     }
2259
2260     fn lower_trait_ref(
2261         &mut self,
2262         p: &TraitRef,
2263         itctx: &mut ImplTraitContext,
2264     ) -> hir::TraitRef<'hir> {
2265         let path = match self.lower_qpath(p.ref_id, &None, &p.path, ParamMode::Explicit, itctx) {
2266             hir::QPath::Resolved(None, path) => path,
2267             qpath => panic!("lower_trait_ref: unexpected QPath `{:?}`", qpath),
2268         };
2269         hir::TraitRef { path, hir_ref_id: self.lower_node_id(p.ref_id) }
2270     }
2271
2272     #[instrument(level = "debug", skip(self))]
2273     fn lower_poly_trait_ref(
2274         &mut self,
2275         p: &PolyTraitRef,
2276         itctx: &mut ImplTraitContext,
2277     ) -> hir::PolyTraitRef<'hir> {
2278         self.lower_lifetime_binder(
2279             p.trait_ref.ref_id,
2280             &p.bound_generic_params,
2281             |lctx, bound_generic_params| {
2282                 let trait_ref = lctx.lower_trait_ref(&p.trait_ref, itctx);
2283                 hir::PolyTraitRef { bound_generic_params, trait_ref, span: lctx.lower_span(p.span) }
2284             },
2285         )
2286     }
2287
2288     fn lower_mt(&mut self, mt: &MutTy, itctx: &mut ImplTraitContext) -> hir::MutTy<'hir> {
2289         hir::MutTy { ty: self.lower_ty(&mt.ty, itctx), mutbl: mt.mutbl }
2290     }
2291
2292     #[instrument(level = "debug", skip(self), ret)]
2293     fn lower_param_bounds(
2294         &mut self,
2295         bounds: &[GenericBound],
2296         itctx: &mut ImplTraitContext,
2297     ) -> hir::GenericBounds<'hir> {
2298         self.arena.alloc_from_iter(self.lower_param_bounds_mut(bounds, itctx))
2299     }
2300
2301     fn lower_param_bounds_mut<'s, 'b>(
2302         &'s mut self,
2303         bounds: &'s [GenericBound],
2304         itctx: &'b mut ImplTraitContext,
2305     ) -> impl Iterator<Item = hir::GenericBound<'hir>> + Captures<'s> + Captures<'a> + Captures<'b>
2306     {
2307         bounds.iter().map(move |bound| self.lower_param_bound(bound, itctx))
2308     }
2309
2310     #[instrument(level = "debug", skip(self), ret)]
2311     fn lower_generic_and_bounds(
2312         &mut self,
2313         node_id: NodeId,
2314         span: Span,
2315         ident: Ident,
2316         bounds: &[GenericBound],
2317     ) -> (hir::GenericParam<'hir>, Option<hir::WherePredicate<'hir>>, hir::TyKind<'hir>) {
2318         // Add a definition for the in-band `Param`.
2319         let def_id = self.local_def_id(node_id);
2320
2321         // Set the name to `impl Bound1 + Bound2`.
2322         let param = hir::GenericParam {
2323             hir_id: self.lower_node_id(node_id),
2324             name: ParamName::Plain(self.lower_ident(ident)),
2325             pure_wrt_drop: false,
2326             span: self.lower_span(span),
2327             kind: hir::GenericParamKind::Type { default: None, synthetic: true },
2328             colon_span: None,
2329         };
2330
2331         let preds = self.lower_generic_bound_predicate(
2332             ident,
2333             node_id,
2334             &GenericParamKind::Type { default: None },
2335             bounds,
2336             &mut ImplTraitContext::Universal,
2337             hir::PredicateOrigin::ImplTrait,
2338         );
2339
2340         let hir_id = self.next_id();
2341         let res = Res::Def(DefKind::TyParam, def_id.to_def_id());
2342         let ty = hir::TyKind::Path(hir::QPath::Resolved(
2343             None,
2344             self.arena.alloc(hir::Path {
2345                 span: self.lower_span(span),
2346                 res,
2347                 segments:
2348                     arena_vec![self; hir::PathSegment::new(self.lower_ident(ident), hir_id, res)],
2349             }),
2350         ));
2351
2352         (param, preds, ty)
2353     }
2354
2355     /// Lowers a block directly to an expression, presuming that it
2356     /// has no attributes and is not targeted by a `break`.
2357     fn lower_block_expr(&mut self, b: &Block) -> hir::Expr<'hir> {
2358         let block = self.lower_block(b, false);
2359         self.expr_block(block, AttrVec::new())
2360     }
2361
2362     fn lower_array_length(&mut self, c: &AnonConst) -> hir::ArrayLen {
2363         match c.value.kind {
2364             ExprKind::Underscore => {
2365                 if self.tcx.features().generic_arg_infer {
2366                     hir::ArrayLen::Infer(self.lower_node_id(c.id), c.value.span)
2367                 } else {
2368                     feature_err(
2369                         &self.tcx.sess.parse_sess,
2370                         sym::generic_arg_infer,
2371                         c.value.span,
2372                         "using `_` for array lengths is unstable",
2373                     )
2374                     .stash(c.value.span, StashKey::UnderscoreForArrayLengths);
2375                     hir::ArrayLen::Body(self.lower_anon_const(c))
2376                 }
2377             }
2378             _ => hir::ArrayLen::Body(self.lower_anon_const(c)),
2379         }
2380     }
2381
2382     fn lower_anon_const(&mut self, c: &AnonConst) -> hir::AnonConst {
2383         self.with_new_scopes(|this| hir::AnonConst {
2384             hir_id: this.lower_node_id(c.id),
2385             body: this.lower_const_body(c.value.span, Some(&c.value)),
2386         })
2387     }
2388
2389     fn lower_unsafe_source(&mut self, u: UnsafeSource) -> hir::UnsafeSource {
2390         match u {
2391             CompilerGenerated => hir::UnsafeSource::CompilerGenerated,
2392             UserProvided => hir::UnsafeSource::UserProvided,
2393         }
2394     }
2395
2396     fn lower_trait_bound_modifier(&mut self, f: TraitBoundModifier) -> hir::TraitBoundModifier {
2397         match f {
2398             TraitBoundModifier::None => hir::TraitBoundModifier::None,
2399             TraitBoundModifier::MaybeConst => hir::TraitBoundModifier::MaybeConst,
2400
2401             // `MaybeConstMaybe` will cause an error during AST validation, but we need to pick a
2402             // placeholder for compilation to proceed.
2403             TraitBoundModifier::MaybeConstMaybe | TraitBoundModifier::Maybe => {
2404                 hir::TraitBoundModifier::Maybe
2405             }
2406         }
2407     }
2408
2409     // Helper methods for building HIR.
2410
2411     fn stmt(&mut self, span: Span, kind: hir::StmtKind<'hir>) -> hir::Stmt<'hir> {
2412         hir::Stmt { span: self.lower_span(span), kind, hir_id: self.next_id() }
2413     }
2414
2415     fn stmt_expr(&mut self, span: Span, expr: hir::Expr<'hir>) -> hir::Stmt<'hir> {
2416         self.stmt(span, hir::StmtKind::Expr(self.arena.alloc(expr)))
2417     }
2418
2419     fn stmt_let_pat(
2420         &mut self,
2421         attrs: Option<&'hir [Attribute]>,
2422         span: Span,
2423         init: Option<&'hir hir::Expr<'hir>>,
2424         pat: &'hir hir::Pat<'hir>,
2425         source: hir::LocalSource,
2426     ) -> hir::Stmt<'hir> {
2427         let hir_id = self.next_id();
2428         if let Some(a) = attrs {
2429             debug_assert!(!a.is_empty());
2430             self.attrs.insert(hir_id.local_id, a);
2431         }
2432         let local = hir::Local {
2433             hir_id,
2434             init,
2435             pat,
2436             els: None,
2437             source,
2438             span: self.lower_span(span),
2439             ty: None,
2440         };
2441         self.stmt(span, hir::StmtKind::Local(self.arena.alloc(local)))
2442     }
2443
2444     fn block_expr(&mut self, expr: &'hir hir::Expr<'hir>) -> &'hir hir::Block<'hir> {
2445         self.block_all(expr.span, &[], Some(expr))
2446     }
2447
2448     fn block_all(
2449         &mut self,
2450         span: Span,
2451         stmts: &'hir [hir::Stmt<'hir>],
2452         expr: Option<&'hir hir::Expr<'hir>>,
2453     ) -> &'hir hir::Block<'hir> {
2454         let blk = hir::Block {
2455             stmts,
2456             expr,
2457             hir_id: self.next_id(),
2458             rules: hir::BlockCheckMode::DefaultBlock,
2459             span: self.lower_span(span),
2460             targeted_by_break: false,
2461         };
2462         self.arena.alloc(blk)
2463     }
2464
2465     fn pat_cf_continue(&mut self, span: Span, pat: &'hir hir::Pat<'hir>) -> &'hir hir::Pat<'hir> {
2466         let field = self.single_pat_field(span, pat);
2467         self.pat_lang_item_variant(span, hir::LangItem::ControlFlowContinue, field, None)
2468     }
2469
2470     fn pat_cf_break(&mut self, span: Span, pat: &'hir hir::Pat<'hir>) -> &'hir hir::Pat<'hir> {
2471         let field = self.single_pat_field(span, pat);
2472         self.pat_lang_item_variant(span, hir::LangItem::ControlFlowBreak, field, None)
2473     }
2474
2475     fn pat_some(&mut self, span: Span, pat: &'hir hir::Pat<'hir>) -> &'hir hir::Pat<'hir> {
2476         let field = self.single_pat_field(span, pat);
2477         self.pat_lang_item_variant(span, hir::LangItem::OptionSome, field, None)
2478     }
2479
2480     fn pat_none(&mut self, span: Span) -> &'hir hir::Pat<'hir> {
2481         self.pat_lang_item_variant(span, hir::LangItem::OptionNone, &[], None)
2482     }
2483
2484     fn single_pat_field(
2485         &mut self,
2486         span: Span,
2487         pat: &'hir hir::Pat<'hir>,
2488     ) -> &'hir [hir::PatField<'hir>] {
2489         let field = hir::PatField {
2490             hir_id: self.next_id(),
2491             ident: Ident::new(sym::integer(0), self.lower_span(span)),
2492             is_shorthand: false,
2493             pat,
2494             span: self.lower_span(span),
2495         };
2496         arena_vec![self; field]
2497     }
2498
2499     fn pat_lang_item_variant(
2500         &mut self,
2501         span: Span,
2502         lang_item: hir::LangItem,
2503         fields: &'hir [hir::PatField<'hir>],
2504         hir_id: Option<hir::HirId>,
2505     ) -> &'hir hir::Pat<'hir> {
2506         let qpath = hir::QPath::LangItem(lang_item, self.lower_span(span), hir_id);
2507         self.pat(span, hir::PatKind::Struct(qpath, fields, false))
2508     }
2509
2510     fn pat_ident(&mut self, span: Span, ident: Ident) -> (&'hir hir::Pat<'hir>, hir::HirId) {
2511         self.pat_ident_binding_mode(span, ident, hir::BindingAnnotation::NONE)
2512     }
2513
2514     fn pat_ident_mut(&mut self, span: Span, ident: Ident) -> (hir::Pat<'hir>, hir::HirId) {
2515         self.pat_ident_binding_mode_mut(span, ident, hir::BindingAnnotation::NONE)
2516     }
2517
2518     fn pat_ident_binding_mode(
2519         &mut self,
2520         span: Span,
2521         ident: Ident,
2522         bm: hir::BindingAnnotation,
2523     ) -> (&'hir hir::Pat<'hir>, hir::HirId) {
2524         let (pat, hir_id) = self.pat_ident_binding_mode_mut(span, ident, bm);
2525         (self.arena.alloc(pat), hir_id)
2526     }
2527
2528     fn pat_ident_binding_mode_mut(
2529         &mut self,
2530         span: Span,
2531         ident: Ident,
2532         bm: hir::BindingAnnotation,
2533     ) -> (hir::Pat<'hir>, hir::HirId) {
2534         let hir_id = self.next_id();
2535
2536         (
2537             hir::Pat {
2538                 hir_id,
2539                 kind: hir::PatKind::Binding(bm, hir_id, self.lower_ident(ident), None),
2540                 span: self.lower_span(span),
2541                 default_binding_modes: true,
2542             },
2543             hir_id,
2544         )
2545     }
2546
2547     fn pat(&mut self, span: Span, kind: hir::PatKind<'hir>) -> &'hir hir::Pat<'hir> {
2548         self.arena.alloc(hir::Pat {
2549             hir_id: self.next_id(),
2550             kind,
2551             span: self.lower_span(span),
2552             default_binding_modes: true,
2553         })
2554     }
2555
2556     fn pat_without_dbm(&mut self, span: Span, kind: hir::PatKind<'hir>) -> hir::Pat<'hir> {
2557         hir::Pat {
2558             hir_id: self.next_id(),
2559             kind,
2560             span: self.lower_span(span),
2561             default_binding_modes: false,
2562         }
2563     }
2564
2565     fn ty_path(
2566         &mut self,
2567         mut hir_id: hir::HirId,
2568         span: Span,
2569         qpath: hir::QPath<'hir>,
2570     ) -> hir::Ty<'hir> {
2571         let kind = match qpath {
2572             hir::QPath::Resolved(None, path) => {
2573                 // Turn trait object paths into `TyKind::TraitObject` instead.
2574                 match path.res {
2575                     Res::Def(DefKind::Trait | DefKind::TraitAlias, _) => {
2576                         let principal = hir::PolyTraitRef {
2577                             bound_generic_params: &[],
2578                             trait_ref: hir::TraitRef { path, hir_ref_id: hir_id },
2579                             span: self.lower_span(span),
2580                         };
2581
2582                         // The original ID is taken by the `PolyTraitRef`,
2583                         // so the `Ty` itself needs a different one.
2584                         hir_id = self.next_id();
2585                         hir::TyKind::TraitObject(
2586                             arena_vec![self; principal],
2587                             self.elided_dyn_bound(span),
2588                             TraitObjectSyntax::None,
2589                         )
2590                     }
2591                     _ => hir::TyKind::Path(hir::QPath::Resolved(None, path)),
2592                 }
2593             }
2594             _ => hir::TyKind::Path(qpath),
2595         };
2596
2597         hir::Ty { hir_id, kind, span: self.lower_span(span) }
2598     }
2599
2600     /// Invoked to create the lifetime argument(s) for an elided trait object
2601     /// bound, like the bound in `Box<dyn Debug>`. This method is not invoked
2602     /// when the bound is written, even if it is written with `'_` like in
2603     /// `Box<dyn Debug + '_>`. In those cases, `lower_lifetime` is invoked.
2604     fn elided_dyn_bound(&mut self, span: Span) -> &'hir hir::Lifetime {
2605         let r = hir::Lifetime {
2606             hir_id: self.next_id(),
2607             span: self.lower_span(span),
2608             name: hir::LifetimeName::ImplicitObjectLifetimeDefault,
2609         };
2610         debug!("elided_dyn_bound: r={:?}", r);
2611         self.arena.alloc(r)
2612     }
2613 }
2614
2615 /// Helper struct for delayed construction of GenericArgs.
2616 struct GenericArgsCtor<'hir> {
2617     args: SmallVec<[hir::GenericArg<'hir>; 4]>,
2618     bindings: &'hir [hir::TypeBinding<'hir>],
2619     parenthesized: bool,
2620     span: Span,
2621 }
2622
2623 impl<'hir> GenericArgsCtor<'hir> {
2624     fn is_empty(&self) -> bool {
2625         self.args.is_empty() && self.bindings.is_empty() && !self.parenthesized
2626     }
2627
2628     fn into_generic_args(self, this: &LoweringContext<'_, 'hir>) -> &'hir hir::GenericArgs<'hir> {
2629         let ga = hir::GenericArgs {
2630             args: this.arena.alloc_from_iter(self.args),
2631             bindings: self.bindings,
2632             parenthesized: self.parenthesized,
2633             span_ext: this.lower_span(self.span),
2634         };
2635         this.arena.alloc(ga)
2636     }
2637 }