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