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