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