]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_ast_lowering/src/lib.rs
Merge commit 'f4850f7292efa33759b4f7f9b7621268979e9914' into clippyup
[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_mac_args(&normal.item.args),
915                     tokens: None,
916                 },
917                 tokens: None,
918             })),
919             AttrKind::DocComment(comment_kind, data) => AttrKind::DocComment(comment_kind, data),
920         };
921
922         Attribute { kind, id: attr.id, style: attr.style, span: self.lower_span(attr.span) }
923     }
924
925     fn alias_attrs(&mut self, id: hir::HirId, target_id: hir::HirId) {
926         debug_assert_eq!(id.owner, self.current_hir_id_owner);
927         debug_assert_eq!(target_id.owner, self.current_hir_id_owner);
928         if let Some(&a) = self.attrs.get(&target_id.local_id) {
929             debug_assert!(!a.is_empty());
930             self.attrs.insert(id.local_id, a);
931         }
932     }
933
934     fn lower_mac_args(&self, args: &MacArgs) -> MacArgs {
935         match *args {
936             MacArgs::Empty => MacArgs::Empty,
937             MacArgs::Delimited(dspan, delim, ref tokens) => {
938                 // This is either a non-key-value attribute, or a `macro_rules!` body.
939                 // We either not have any nonterminals present (in the case of an attribute),
940                 // or have tokens available for all nonterminals in the case of a nested
941                 // `macro_rules`: e.g:
942                 //
943                 // ```rust
944                 // macro_rules! outer {
945                 //     ($e:expr) => {
946                 //         macro_rules! inner {
947                 //             () => { $e }
948                 //         }
949                 //     }
950                 // }
951                 // ```
952                 //
953                 // In both cases, we don't want to synthesize any tokens
954                 MacArgs::Delimited(dspan, delim, tokens.flattened())
955             }
956             // This is an inert key-value attribute - it will never be visible to macros
957             // after it gets lowered to HIR. Therefore, we can extract literals to handle
958             // nonterminals in `#[doc]` (e.g. `#[doc = $e]`).
959             MacArgs::Eq(eq_span, MacArgsEq::Ast(ref expr)) => {
960                 // In valid code the value always ends up as a single literal. Otherwise, a dummy
961                 // literal suffices because the error is handled elsewhere.
962                 let lit = if let ExprKind::Lit(token_lit) = expr.kind {
963                     match Lit::from_token_lit(token_lit, expr.span) {
964                         Ok(lit) => lit,
965                         Err(_err) => Lit {
966                             token_lit: token::Lit::new(token::LitKind::Err, kw::Empty, None),
967                             kind: LitKind::Err,
968                             span: DUMMY_SP,
969                         },
970                     }
971                 } else {
972                     Lit {
973                         token_lit: token::Lit::new(token::LitKind::Err, kw::Empty, None),
974                         kind: LitKind::Err,
975                         span: DUMMY_SP,
976                     }
977                 };
978                 MacArgs::Eq(eq_span, MacArgsEq::Hir(lit))
979             }
980             MacArgs::Eq(_, MacArgsEq::Hir(ref lit)) => {
981                 unreachable!("in literal form when lowering mac args eq: {:?}", lit)
982             }
983         }
984     }
985
986     /// Given an associated type constraint like one of these:
987     ///
988     /// ```ignore (illustrative)
989     /// T: Iterator<Item: Debug>
990     ///             ^^^^^^^^^^^
991     /// T: Iterator<Item = Debug>
992     ///             ^^^^^^^^^^^^
993     /// ```
994     ///
995     /// returns a `hir::TypeBinding` representing `Item`.
996     #[instrument(level = "debug", skip(self))]
997     fn lower_assoc_ty_constraint(
998         &mut self,
999         constraint: &AssocConstraint,
1000         itctx: &ImplTraitContext,
1001     ) -> hir::TypeBinding<'hir> {
1002         debug!("lower_assoc_ty_constraint(constraint={:?}, itctx={:?})", constraint, itctx);
1003         // lower generic arguments of identifier in constraint
1004         let gen_args = if let Some(ref gen_args) = constraint.gen_args {
1005             let gen_args_ctor = match gen_args {
1006                 GenericArgs::AngleBracketed(ref data) => {
1007                     self.lower_angle_bracketed_parameter_data(data, ParamMode::Explicit, itctx).0
1008                 }
1009                 GenericArgs::Parenthesized(ref data) => {
1010                     self.emit_bad_parenthesized_trait_in_assoc_ty(data);
1011                     let aba = self.ast_arena.aba.alloc(data.as_angle_bracketed_args());
1012                     self.lower_angle_bracketed_parameter_data(aba, ParamMode::Explicit, itctx).0
1013                 }
1014             };
1015             gen_args_ctor.into_generic_args(self)
1016         } else {
1017             self.arena.alloc(hir::GenericArgs::none())
1018         };
1019         let itctx_tait = &ImplTraitContext::TypeAliasesOpaqueTy;
1020
1021         let kind = match constraint.kind {
1022             AssocConstraintKind::Equality { ref term } => {
1023                 let term = match term {
1024                     Term::Ty(ref ty) => self.lower_ty(ty, itctx).into(),
1025                     Term::Const(ref c) => self.lower_anon_const(c).into(),
1026                 };
1027                 hir::TypeBindingKind::Equality { term }
1028             }
1029             AssocConstraintKind::Bound { ref bounds } => {
1030                 // Piggy-back on the `impl Trait` context to figure out the correct behavior.
1031                 let (desugar_to_impl_trait, itctx) = match itctx {
1032                     // We are in the return position:
1033                     //
1034                     //     fn foo() -> impl Iterator<Item: Debug>
1035                     //
1036                     // so desugar to
1037                     //
1038                     //     fn foo() -> impl Iterator<Item = impl Debug>
1039                     ImplTraitContext::ReturnPositionOpaqueTy { .. }
1040                     | ImplTraitContext::TypeAliasesOpaqueTy { .. } => (true, itctx),
1041
1042                     // We are in the argument position, but within a dyn type:
1043                     //
1044                     //     fn foo(x: dyn Iterator<Item: Debug>)
1045                     //
1046                     // so desugar to
1047                     //
1048                     //     fn foo(x: dyn Iterator<Item = impl Debug>)
1049                     ImplTraitContext::Universal if self.is_in_dyn_type => (true, itctx),
1050
1051                     // In `type Foo = dyn Iterator<Item: Debug>` we desugar to
1052                     // `type Foo = dyn Iterator<Item = impl Debug>` but we have to override the
1053                     // "impl trait context" to permit `impl Debug` in this position (it desugars
1054                     // then to an opaque type).
1055                     //
1056                     // FIXME: this is only needed until `impl Trait` is allowed in type aliases.
1057                     ImplTraitContext::Disallowed(_) if self.is_in_dyn_type => (true, itctx_tait),
1058
1059                     // We are in the parameter position, but not within a dyn type:
1060                     //
1061                     //     fn foo(x: impl Iterator<Item: Debug>)
1062                     //
1063                     // so we leave it as is and this gets expanded in astconv to a bound like
1064                     // `<T as Iterator>::Item: Debug` where `T` is the type parameter for the
1065                     // `impl Iterator`.
1066                     _ => (false, itctx),
1067                 };
1068
1069                 if desugar_to_impl_trait {
1070                     // Desugar `AssocTy: Bounds` into `AssocTy = impl Bounds`. We do this by
1071                     // constructing the HIR for `impl bounds...` and then lowering that.
1072
1073                     let impl_trait_node_id = self.next_node_id();
1074
1075                     self.with_dyn_type_scope(false, |this| {
1076                         let node_id = this.next_node_id();
1077                         let ty = this.ast_arena.tys.alloc(Ty {
1078                             id: node_id,
1079                             kind: TyKind::ImplTrait(impl_trait_node_id, bounds.clone()),
1080                             span: this.lower_span(constraint.span),
1081                             tokens: None,
1082                         });
1083                         let ty = this.lower_ty(ty, itctx);
1084
1085                         hir::TypeBindingKind::Equality { term: ty.into() }
1086                     })
1087                 } else {
1088                     // Desugar `AssocTy: Bounds` into a type binding where the
1089                     // later desugars into a trait predicate.
1090                     let bounds = self.lower_param_bounds(bounds, itctx);
1091
1092                     hir::TypeBindingKind::Constraint { bounds }
1093                 }
1094             }
1095         };
1096
1097         hir::TypeBinding {
1098             hir_id: self.lower_node_id(constraint.id),
1099             ident: self.lower_ident(constraint.ident),
1100             gen_args,
1101             kind,
1102             span: self.lower_span(constraint.span),
1103         }
1104     }
1105
1106     fn emit_bad_parenthesized_trait_in_assoc_ty(&self, data: &ParenthesizedArgs) {
1107         // Suggest removing empty parentheses: "Trait()" -> "Trait"
1108         let sub = if data.inputs.is_empty() {
1109             let parentheses_span =
1110                 data.inputs_span.shrink_to_lo().to(data.inputs_span.shrink_to_hi());
1111             AssocTyParenthesesSub::Empty { parentheses_span }
1112         }
1113         // Suggest replacing parentheses with angle brackets `Trait(params...)` to `Trait<params...>`
1114         else {
1115             // Start of parameters to the 1st argument
1116             let open_param = data.inputs_span.shrink_to_lo().to(data
1117                 .inputs
1118                 .first()
1119                 .unwrap()
1120                 .span
1121                 .shrink_to_lo());
1122             // End of last argument to end of parameters
1123             let close_param =
1124                 data.inputs.last().unwrap().span.shrink_to_hi().to(data.inputs_span.shrink_to_hi());
1125             AssocTyParenthesesSub::NotEmpty { open_param, close_param }
1126         };
1127         self.tcx.sess.emit_err(AssocTyParentheses { span: data.span, sub });
1128     }
1129
1130     #[instrument(level = "debug", skip(self))]
1131     fn lower_generic_arg(
1132         &mut self,
1133         arg: &ast::GenericArg,
1134         itctx: &ImplTraitContext,
1135     ) -> hir::GenericArg<'hir> {
1136         match arg {
1137             ast::GenericArg::Lifetime(lt) => GenericArg::Lifetime(self.lower_lifetime(&lt)),
1138             ast::GenericArg::Type(ty) => {
1139                 match ty.kind {
1140                     TyKind::Infer if self.tcx.features().generic_arg_infer => {
1141                         return GenericArg::Infer(hir::InferArg {
1142                             hir_id: self.lower_node_id(ty.id),
1143                             span: self.lower_span(ty.span),
1144                         });
1145                     }
1146                     // We parse const arguments as path types as we cannot distinguish them during
1147                     // parsing. We try to resolve that ambiguity by attempting resolution in both the
1148                     // type and value namespaces. If we resolved the path in the value namespace, we
1149                     // transform it into a generic const argument.
1150                     TyKind::Path(ref qself, ref path) => {
1151                         if let Some(res) = self
1152                             .resolver
1153                             .get_partial_res(ty.id)
1154                             .and_then(|partial_res| partial_res.full_res())
1155                         {
1156                             if !res.matches_ns(Namespace::TypeNS) {
1157                                 debug!(
1158                                     "lower_generic_arg: Lowering type argument as const argument: {:?}",
1159                                     ty,
1160                                 );
1161
1162                                 // Construct an AnonConst where the expr is the "ty"'s path.
1163
1164                                 let parent_def_id = self.current_hir_id_owner;
1165                                 let node_id = self.next_node_id();
1166
1167                                 // Add a definition for the in-band const def.
1168                                 let def_id = self.create_def(
1169                                     parent_def_id.def_id,
1170                                     node_id,
1171                                     DefPathData::AnonConst,
1172                                 );
1173
1174                                 let span = self.lower_span(ty.span);
1175                                 let path_expr = Expr {
1176                                     id: ty.id,
1177                                     kind: ExprKind::Path(qself.clone(), path.clone()),
1178                                     span,
1179                                     attrs: AttrVec::new(),
1180                                     tokens: None,
1181                                 };
1182
1183                                 let ct = self.with_new_scopes(|this| hir::AnonConst {
1184                                     def_id,
1185                                     hir_id: this.lower_node_id(node_id),
1186                                     body: this.lower_const_body(path_expr.span, Some(&path_expr)),
1187                                 });
1188                                 return GenericArg::Const(ConstArg { value: ct, span });
1189                             }
1190                         }
1191                     }
1192                     _ => {}
1193                 }
1194                 GenericArg::Type(self.lower_ty(&ty, itctx))
1195             }
1196             ast::GenericArg::Const(ct) => GenericArg::Const(ConstArg {
1197                 value: self.lower_anon_const(&ct),
1198                 span: self.lower_span(ct.value.span),
1199             }),
1200         }
1201     }
1202
1203     #[instrument(level = "debug", skip(self))]
1204     fn lower_ty(&mut self, t: &Ty, itctx: &ImplTraitContext) -> &'hir hir::Ty<'hir> {
1205         self.arena.alloc(self.lower_ty_direct(t, itctx))
1206     }
1207
1208     fn lower_path_ty(
1209         &mut self,
1210         t: &Ty,
1211         qself: &Option<ptr::P<QSelf>>,
1212         path: &Path,
1213         param_mode: ParamMode,
1214         itctx: &ImplTraitContext,
1215     ) -> hir::Ty<'hir> {
1216         // Check whether we should interpret this as a bare trait object.
1217         // This check mirrors the one in late resolution.  We only introduce this special case in
1218         // the rare occurrence we need to lower `Fresh` anonymous lifetimes.
1219         // The other cases when a qpath should be opportunistically made a trait object are handled
1220         // by `ty_path`.
1221         if qself.is_none()
1222             && let Some(partial_res) = self.resolver.get_partial_res(t.id)
1223             && let Some(Res::Def(DefKind::Trait | DefKind::TraitAlias, _)) = partial_res.full_res()
1224         {
1225             let (bounds, lifetime_bound) = self.with_dyn_type_scope(true, |this| {
1226                 let poly_trait_ref = this.ast_arena.ptr.alloc(PolyTraitRef {
1227                     bound_generic_params: vec![],
1228                     trait_ref: TraitRef { path: path.clone(), ref_id: t.id },
1229                     span: t.span
1230                 });
1231                 let bound = this.lower_poly_trait_ref(
1232                     poly_trait_ref,
1233                     itctx,
1234                 );
1235                 let bounds = this.arena.alloc_from_iter([bound]);
1236                 let lifetime_bound = this.elided_dyn_bound(t.span);
1237                 (bounds, lifetime_bound)
1238             });
1239             let kind = hir::TyKind::TraitObject(bounds, &lifetime_bound, TraitObjectSyntax::None);
1240             return hir::Ty { kind, span: self.lower_span(t.span), hir_id: self.next_id() };
1241         }
1242
1243         let id = self.lower_node_id(t.id);
1244         let qpath = self.lower_qpath(t.id, qself, path, param_mode, itctx);
1245         self.ty_path(id, t.span, qpath)
1246     }
1247
1248     fn ty(&mut self, span: Span, kind: hir::TyKind<'hir>) -> hir::Ty<'hir> {
1249         hir::Ty { hir_id: self.next_id(), kind, span: self.lower_span(span) }
1250     }
1251
1252     fn ty_tup(&mut self, span: Span, tys: &'hir [hir::Ty<'hir>]) -> hir::Ty<'hir> {
1253         self.ty(span, hir::TyKind::Tup(tys))
1254     }
1255
1256     fn lower_ty_direct(&mut self, t: &Ty, itctx: &ImplTraitContext) -> hir::Ty<'hir> {
1257         let kind = match t.kind {
1258             TyKind::Infer => hir::TyKind::Infer,
1259             TyKind::Err => hir::TyKind::Err,
1260             TyKind::Slice(ref ty) => hir::TyKind::Slice(self.lower_ty(ty, itctx)),
1261             TyKind::Ptr(ref mt) => hir::TyKind::Ptr(self.lower_mt(mt, itctx)),
1262             TyKind::Rptr(ref region, ref mt) => {
1263                 let region = region.unwrap_or_else(|| {
1264                     let id = if let Some(LifetimeRes::ElidedAnchor { start, end }) =
1265                         self.resolver.get_lifetime_res(t.id)
1266                     {
1267                         debug_assert_eq!(start.plus(1), end);
1268                         start
1269                     } else {
1270                         self.next_node_id()
1271                     };
1272                     let span = self.tcx.sess.source_map().start_point(t.span);
1273                     Lifetime { ident: Ident::new(kw::UnderscoreLifetime, span), id }
1274                 });
1275                 let lifetime = self.lower_lifetime(&region);
1276                 hir::TyKind::Rptr(lifetime, self.lower_mt(mt, itctx))
1277             }
1278             TyKind::BareFn(ref f) => {
1279                 let generic_params = self.lower_lifetime_binder(t.id, &f.generic_params);
1280                 hir::TyKind::BareFn(self.arena.alloc(hir::BareFnTy {
1281                     generic_params,
1282                     unsafety: self.lower_unsafety(f.unsafety),
1283                     abi: self.lower_extern(f.ext),
1284                     decl: self.lower_fn_decl(&f.decl, None, t.span, FnDeclKind::Pointer, None),
1285                     param_names: self.lower_fn_params_to_names(&f.decl),
1286                 }))
1287             }
1288             TyKind::Never => hir::TyKind::Never,
1289             TyKind::Tup(ref tys) => hir::TyKind::Tup(
1290                 self.arena.alloc_from_iter(tys.iter().map(|ty| self.lower_ty_direct(ty, itctx))),
1291             ),
1292             TyKind::Paren(ref ty) => {
1293                 return self.lower_ty_direct(ty, itctx);
1294             }
1295             TyKind::Path(ref qself, ref path) => {
1296                 return self.lower_path_ty(t, qself, path, ParamMode::Explicit, itctx);
1297             }
1298             TyKind::ImplicitSelf => {
1299                 let hir_id = self.next_id();
1300                 let res = self.expect_full_res(t.id);
1301                 let res = self.lower_res(res);
1302                 hir::TyKind::Path(hir::QPath::Resolved(
1303                     None,
1304                     self.arena.alloc(hir::Path {
1305                         res,
1306                         segments: arena_vec![self; hir::PathSegment::new(
1307                             Ident::with_dummy_span(kw::SelfUpper),
1308                             hir_id,
1309                             res
1310                         )],
1311                         span: self.lower_span(t.span),
1312                     }),
1313                 ))
1314             }
1315             TyKind::Array(ref ty, ref length) => {
1316                 hir::TyKind::Array(self.lower_ty(ty, itctx), self.lower_array_length(length))
1317             }
1318             TyKind::Typeof(ref expr) => hir::TyKind::Typeof(self.lower_anon_const(expr)),
1319             TyKind::TraitObject(ref bounds, kind) => {
1320                 let mut lifetime_bound = None;
1321                 let (bounds, lifetime_bound) = self.with_dyn_type_scope(true, |this| {
1322                     let bounds =
1323                         this.arena.alloc_from_iter(bounds.iter().filter_map(
1324                             |bound| match *bound {
1325                                 GenericBound::Trait(
1326                                     ref ty,
1327                                     TraitBoundModifier::None | TraitBoundModifier::MaybeConst,
1328                                 ) => Some(this.lower_poly_trait_ref(ty, itctx)),
1329                                 // `~const ?Bound` will cause an error during AST validation
1330                                 // anyways, so treat it like `?Bound` as compilation proceeds.
1331                                 GenericBound::Trait(
1332                                     _,
1333                                     TraitBoundModifier::Maybe | TraitBoundModifier::MaybeConstMaybe,
1334                                 ) => None,
1335                                 GenericBound::Outlives(ref lifetime) => {
1336                                     if lifetime_bound.is_none() {
1337                                         lifetime_bound = Some(this.lower_lifetime(lifetime));
1338                                     }
1339                                     None
1340                                 }
1341                             },
1342                         ));
1343                     let lifetime_bound =
1344                         lifetime_bound.unwrap_or_else(|| this.elided_dyn_bound(t.span));
1345                     (bounds, lifetime_bound)
1346                 });
1347                 hir::TyKind::TraitObject(bounds, lifetime_bound, kind)
1348             }
1349             TyKind::ImplTrait(def_node_id, ref bounds) => {
1350                 let span = t.span;
1351                 match itctx {
1352                     ImplTraitContext::ReturnPositionOpaqueTy { origin, in_trait } => self
1353                         .lower_opaque_impl_trait(
1354                             span,
1355                             *origin,
1356                             def_node_id,
1357                             bounds,
1358                             *in_trait,
1359                             itctx,
1360                         ),
1361                     ImplTraitContext::TypeAliasesOpaqueTy => self.lower_opaque_impl_trait(
1362                         span,
1363                         hir::OpaqueTyOrigin::TyAlias,
1364                         def_node_id,
1365                         bounds,
1366                         false,
1367                         itctx,
1368                     ),
1369                     ImplTraitContext::Universal => {
1370                         self.create_def(
1371                             self.current_hir_id_owner.def_id,
1372                             def_node_id,
1373                             DefPathData::ImplTrait,
1374                         );
1375                         let span = t.span;
1376                         let ident = Ident::from_str_and_span(&pprust::ty_to_string(t), span);
1377                         let (param, bounds, path) =
1378                             self.lower_generic_and_bounds(def_node_id, span, ident, bounds);
1379                         self.impl_trait_defs.push(param);
1380                         if let Some(bounds) = bounds {
1381                             self.impl_trait_bounds.push(bounds);
1382                         }
1383                         path
1384                     }
1385                     ImplTraitContext::Disallowed(
1386                         position @ (ImplTraitPosition::TraitReturn | ImplTraitPosition::ImplReturn),
1387                     ) => {
1388                         self.tcx
1389                             .sess
1390                             .create_feature_err(
1391                                 MisplacedImplTrait {
1392                                     span: t.span,
1393                                     position: DiagnosticArgFromDisplay(&position),
1394                                 },
1395                                 sym::return_position_impl_trait_in_trait,
1396                             )
1397                             .emit();
1398                         hir::TyKind::Err
1399                     }
1400                     ImplTraitContext::Disallowed(position) => {
1401                         self.tcx.sess.emit_err(MisplacedImplTrait {
1402                             span: t.span,
1403                             position: DiagnosticArgFromDisplay(&position),
1404                         });
1405                         hir::TyKind::Err
1406                     }
1407                 }
1408             }
1409             TyKind::MacCall(_) => panic!("`TyKind::MacCall` should have been expanded by now"),
1410             TyKind::CVarArgs => {
1411                 self.tcx.sess.delay_span_bug(
1412                     t.span,
1413                     "`TyKind::CVarArgs` should have been handled elsewhere",
1414                 );
1415                 hir::TyKind::Err
1416             }
1417         };
1418
1419         hir::Ty { kind, span: self.lower_span(t.span), hir_id: self.lower_node_id(t.id) }
1420     }
1421
1422     /// Lowers a `ReturnPositionOpaqueTy` (`-> impl Trait`) or a `TypeAliasesOpaqueTy` (`type F =
1423     /// impl Trait`): this creates the associated Opaque Type (TAIT) definition and then returns a
1424     /// HIR type that references the TAIT.
1425     ///
1426     /// Given a function definition like:
1427     ///
1428     /// ```rust
1429     /// fn test<'a, T: Debug>(x: &'a T) -> impl Debug + 'a {
1430     ///     x
1431     /// }
1432     /// ```
1433     ///
1434     /// we will create a TAIT definition in the HIR like
1435     ///
1436     /// ```
1437     /// type TestReturn<'a, T, 'x> = impl Debug + 'x
1438     /// ```
1439     ///
1440     /// and return a type like `TestReturn<'static, T, 'a>`, so that the function looks like:
1441     ///
1442     /// ```rust
1443     /// fn test<'a, T: Debug>(x: &'a T) -> TestReturn<'static, T, 'a>
1444     /// ```
1445     ///
1446     /// Note the subtlety around type parameters! The new TAIT, `TestReturn`, inherits all the
1447     /// type parameters from the function `test` (this is implemented in the query layer, they aren't
1448     /// added explicitly in the HIR). But this includes all the lifetimes, and we only want to
1449     /// capture the lifetimes that are referenced in the bounds. Therefore, we add *extra* lifetime parameters
1450     /// for the lifetimes that get captured (`'x`, in our example above) and reference those.
1451     #[instrument(level = "debug", skip(self), ret)]
1452     fn lower_opaque_impl_trait(
1453         &mut self,
1454         span: Span,
1455         origin: hir::OpaqueTyOrigin,
1456         opaque_ty_node_id: NodeId,
1457         bounds: &GenericBounds,
1458         in_trait: bool,
1459         itctx: &ImplTraitContext,
1460     ) -> hir::TyKind<'hir> {
1461         // Make sure we know that some funky desugaring has been going on here.
1462         // This is a first: there is code in other places like for loop
1463         // desugaring that explicitly states that we don't want to track that.
1464         // Not tracking it makes lints in rustc and clippy very fragile, as
1465         // frequently opened issues show.
1466         let opaque_ty_span = self.mark_span_with_reason(DesugaringKind::OpaqueTy, span, None);
1467
1468         let opaque_ty_def_id = self.create_def(
1469             self.current_hir_id_owner.def_id,
1470             opaque_ty_node_id,
1471             DefPathData::ImplTrait,
1472         );
1473         debug!(?opaque_ty_def_id);
1474
1475         // Contains the new lifetime definitions created for the TAIT (if any).
1476         let mut collected_lifetimes = Vec::new();
1477
1478         // If this came from a TAIT (as opposed to a function that returns an RPIT), we only want
1479         // to capture the lifetimes that appear in the bounds. So visit the bounds to find out
1480         // exactly which ones those are.
1481         let lifetimes_to_remap = if origin == hir::OpaqueTyOrigin::TyAlias {
1482             // in a TAIT like `type Foo<'a> = impl Foo<'a>`, we don't keep all the lifetime parameters
1483             Vec::new()
1484         } else {
1485             // in fn return position, like the `fn test<'a>() -> impl Debug + 'a` example,
1486             // we only keep the lifetimes that appear in the `impl Debug` itself:
1487             lifetime_collector::lifetimes_in_bounds(&self.resolver, bounds)
1488         };
1489         debug!(?lifetimes_to_remap);
1490
1491         self.with_hir_id_owner(opaque_ty_node_id, |lctx| {
1492             let mut new_remapping = FxHashMap::default();
1493
1494             // If this opaque type is only capturing a subset of the lifetimes (those that appear
1495             // in bounds), then create the new lifetime parameters required and create a mapping
1496             // from the old `'a` (on the function) to the new `'a` (on the opaque type).
1497             collected_lifetimes = lctx.create_lifetime_defs(
1498                 opaque_ty_def_id,
1499                 &lifetimes_to_remap,
1500                 &mut new_remapping,
1501             );
1502             debug!(?collected_lifetimes);
1503             debug!(?new_remapping);
1504
1505             // Install the remapping from old to new (if any):
1506             lctx.with_remapping(new_remapping, |lctx| {
1507                 // This creates HIR lifetime definitions as `hir::GenericParam`, in the given
1508                 // example `type TestReturn<'a, T, 'x> = impl Debug + 'x`, it creates a collection
1509                 // containing `&['x]`.
1510                 let lifetime_defs = lctx.arena.alloc_from_iter(collected_lifetimes.iter().map(
1511                     |&(new_node_id, lifetime)| {
1512                         let hir_id = lctx.lower_node_id(new_node_id);
1513                         debug_assert_ne!(lctx.opt_local_def_id(new_node_id), None);
1514
1515                         let (name, kind) = if lifetime.ident.name == kw::UnderscoreLifetime {
1516                             (hir::ParamName::Fresh, hir::LifetimeParamKind::Elided)
1517                         } else {
1518                             (
1519                                 hir::ParamName::Plain(lifetime.ident),
1520                                 hir::LifetimeParamKind::Explicit,
1521                             )
1522                         };
1523
1524                         hir::GenericParam {
1525                             hir_id,
1526                             def_id: lctx.local_def_id(new_node_id),
1527                             name,
1528                             span: lifetime.ident.span,
1529                             pure_wrt_drop: false,
1530                             kind: hir::GenericParamKind::Lifetime { kind },
1531                             colon_span: None,
1532                         }
1533                     },
1534                 ));
1535                 debug!(?lifetime_defs);
1536
1537                 // Then when we lower the param bounds, references to 'a are remapped to 'a1, so we
1538                 // get back Debug + 'a1, which is suitable for use on the TAIT.
1539                 let hir_bounds = lctx.lower_param_bounds(bounds, itctx);
1540                 debug!(?hir_bounds);
1541
1542                 let opaque_ty_item = hir::OpaqueTy {
1543                     generics: self.arena.alloc(hir::Generics {
1544                         params: lifetime_defs,
1545                         predicates: &[],
1546                         has_where_clause_predicates: false,
1547                         where_clause_span: lctx.lower_span(span),
1548                         span: lctx.lower_span(span),
1549                     }),
1550                     bounds: hir_bounds,
1551                     origin,
1552                     in_trait,
1553                 };
1554                 debug!(?opaque_ty_item);
1555
1556                 lctx.generate_opaque_type(opaque_ty_def_id, opaque_ty_item, span, opaque_ty_span)
1557             })
1558         });
1559
1560         // This creates HIR lifetime arguments as `hir::GenericArg`, in the given example `type
1561         // TestReturn<'a, T, 'x> = impl Debug + 'x`, it creates a collection containing `&['x]`.
1562         let lifetimes =
1563             self.arena.alloc_from_iter(collected_lifetimes.into_iter().map(|(_, lifetime)| {
1564                 let id = self.next_node_id();
1565                 let span = lifetime.ident.span;
1566
1567                 let ident = if lifetime.ident.name == kw::UnderscoreLifetime {
1568                     Ident::with_dummy_span(kw::UnderscoreLifetime)
1569                 } else {
1570                     lifetime.ident
1571                 };
1572
1573                 let l = self.new_named_lifetime(lifetime.id, id, span, ident);
1574                 hir::GenericArg::Lifetime(l)
1575             }));
1576         debug!(?lifetimes);
1577
1578         // `impl Trait` now just becomes `Foo<'a, 'b, ..>`.
1579         hir::TyKind::OpaqueDef(
1580             hir::ItemId { owner_id: hir::OwnerId { def_id: opaque_ty_def_id } },
1581             lifetimes,
1582             in_trait,
1583         )
1584     }
1585
1586     /// Registers a new opaque type with the proper `NodeId`s and
1587     /// returns the lowered node-ID for the opaque type.
1588     fn generate_opaque_type(
1589         &mut self,
1590         opaque_ty_id: LocalDefId,
1591         opaque_ty_item: hir::OpaqueTy<'hir>,
1592         span: Span,
1593         opaque_ty_span: Span,
1594     ) -> hir::OwnerNode<'hir> {
1595         let opaque_ty_item_kind = hir::ItemKind::OpaqueTy(opaque_ty_item);
1596         // Generate an `type Foo = impl Trait;` declaration.
1597         trace!("registering opaque type with id {:#?}", opaque_ty_id);
1598         let opaque_ty_item = hir::Item {
1599             owner_id: hir::OwnerId { def_id: opaque_ty_id },
1600             ident: Ident::empty(),
1601             kind: opaque_ty_item_kind,
1602             vis_span: self.lower_span(span.shrink_to_lo()),
1603             span: self.lower_span(opaque_ty_span),
1604         };
1605         hir::OwnerNode::Item(self.arena.alloc(opaque_ty_item))
1606     }
1607
1608     /// Given a `parent_def_id`, a list of `lifetimes_in_bounds and a `remapping` hash to be
1609     /// filled, this function creates new definitions for `Param` and `Fresh` lifetimes, inserts the
1610     /// new definition, adds it to the remapping with the definition of the given lifetime and
1611     /// returns a list of lifetimes to be lowered afterwards.
1612     fn create_lifetime_defs(
1613         &mut self,
1614         parent_def_id: LocalDefId,
1615         lifetimes_in_bounds: &[Lifetime],
1616         remapping: &mut FxHashMap<LocalDefId, LocalDefId>,
1617     ) -> Vec<(NodeId, Lifetime)> {
1618         let mut result = Vec::new();
1619
1620         for lifetime in lifetimes_in_bounds {
1621             let res = self.resolver.get_lifetime_res(lifetime.id).unwrap_or(LifetimeRes::Error);
1622             debug!(?res);
1623
1624             match res {
1625                 LifetimeRes::Param { param: old_def_id, binder: _ } => {
1626                     if remapping.get(&old_def_id).is_none() {
1627                         let node_id = self.next_node_id();
1628
1629                         let new_def_id = self.create_def(
1630                             parent_def_id,
1631                             node_id,
1632                             DefPathData::LifetimeNs(lifetime.ident.name),
1633                         );
1634                         remapping.insert(old_def_id, new_def_id);
1635
1636                         result.push((node_id, *lifetime));
1637                     }
1638                 }
1639
1640                 LifetimeRes::Fresh { param, binder: _ } => {
1641                     debug_assert_eq!(lifetime.ident.name, kw::UnderscoreLifetime);
1642                     if let Some(old_def_id) = self.orig_opt_local_def_id(param) && remapping.get(&old_def_id).is_none() {
1643                         let node_id = self.next_node_id();
1644
1645                         let new_def_id = self.create_def(
1646                             parent_def_id,
1647                             node_id,
1648                             DefPathData::LifetimeNs(kw::UnderscoreLifetime),
1649                         );
1650                         remapping.insert(old_def_id, new_def_id);
1651
1652                         result.push((node_id, *lifetime));
1653                     }
1654                 }
1655
1656                 LifetimeRes::Static | LifetimeRes::Error => {}
1657
1658                 res => {
1659                     let bug_msg = format!(
1660                         "Unexpected lifetime resolution {:?} for {:?} at {:?}",
1661                         res, lifetime.ident, lifetime.ident.span
1662                     );
1663                     span_bug!(lifetime.ident.span, "{}", bug_msg);
1664                 }
1665             }
1666         }
1667
1668         result
1669     }
1670
1671     fn lower_fn_params_to_names(&mut self, decl: &FnDecl) -> &'hir [Ident] {
1672         // Skip the `...` (`CVarArgs`) trailing arguments from the AST,
1673         // as they are not explicit in HIR/Ty function signatures.
1674         // (instead, the `c_variadic` flag is set to `true`)
1675         let mut inputs = &decl.inputs[..];
1676         if decl.c_variadic() {
1677             inputs = &inputs[..inputs.len() - 1];
1678         }
1679         self.arena.alloc_from_iter(inputs.iter().map(|param| match param.pat.kind {
1680             PatKind::Ident(_, ident, _) => self.lower_ident(ident),
1681             _ => Ident::new(kw::Empty, self.lower_span(param.pat.span)),
1682         }))
1683     }
1684
1685     // Lowers a function declaration.
1686     //
1687     // `decl`: the unlowered (AST) function declaration.
1688     // `fn_def_id`: if `Some`, impl Trait arguments are lowered into generic parameters on the
1689     //      given DefId, otherwise impl Trait is disallowed. Must be `Some` if
1690     //      `make_ret_async` is also `Some`.
1691     // `make_ret_async`: if `Some`, converts `-> T` into `-> impl Future<Output = T>` in the
1692     //      return type. This is used for `async fn` declarations. The `NodeId` is the ID of the
1693     //      return type `impl Trait` item, and the `Span` points to the `async` keyword.
1694     #[instrument(level = "debug", skip(self))]
1695     fn lower_fn_decl(
1696         &mut self,
1697         decl: &FnDecl,
1698         fn_node_id: Option<NodeId>,
1699         fn_span: Span,
1700         kind: FnDeclKind,
1701         make_ret_async: Option<(NodeId, Span)>,
1702     ) -> &'hir hir::FnDecl<'hir> {
1703         let c_variadic = decl.c_variadic();
1704
1705         // Skip the `...` (`CVarArgs`) trailing arguments from the AST,
1706         // as they are not explicit in HIR/Ty function signatures.
1707         // (instead, the `c_variadic` flag is set to `true`)
1708         let mut inputs = &decl.inputs[..];
1709         if c_variadic {
1710             inputs = &inputs[..inputs.len() - 1];
1711         }
1712         let inputs = self.arena.alloc_from_iter(inputs.iter().map(|param| {
1713             if fn_node_id.is_some() {
1714                 self.lower_ty_direct(&param.ty, &ImplTraitContext::Universal)
1715             } else {
1716                 self.lower_ty_direct(
1717                     &param.ty,
1718                     &ImplTraitContext::Disallowed(match kind {
1719                         FnDeclKind::Fn | FnDeclKind::Inherent => {
1720                             unreachable!("fn should allow in-band lifetimes")
1721                         }
1722                         FnDeclKind::ExternFn => ImplTraitPosition::ExternFnParam,
1723                         FnDeclKind::Closure => ImplTraitPosition::ClosureParam,
1724                         FnDeclKind::Pointer => ImplTraitPosition::PointerParam,
1725                         FnDeclKind::Trait => ImplTraitPosition::TraitParam,
1726                         FnDeclKind::Impl => ImplTraitPosition::ImplParam,
1727                     }),
1728                 )
1729             }
1730         }));
1731
1732         let output = if let Some((ret_id, span)) = make_ret_async {
1733             if !kind.async_fn_allowed(self.tcx) {
1734                 match kind {
1735                     FnDeclKind::Trait | FnDeclKind::Impl => {
1736                         self.tcx
1737                             .sess
1738                             .create_feature_err(
1739                                 TraitFnAsync { fn_span, span },
1740                                 sym::async_fn_in_trait,
1741                             )
1742                             .emit();
1743                     }
1744                     _ => {
1745                         self.tcx.sess.emit_err(TraitFnAsync { fn_span, span });
1746                     }
1747                 }
1748             }
1749
1750             self.lower_async_fn_ret_ty(
1751                 &decl.output,
1752                 fn_node_id.expect("`make_ret_async` but no `fn_def_id`"),
1753                 ret_id,
1754                 matches!(kind, FnDeclKind::Trait),
1755             )
1756         } else {
1757             match decl.output {
1758                 FnRetTy::Ty(ref ty) => {
1759                     let mut context = match fn_node_id {
1760                         Some(fn_node_id) if kind.impl_trait_allowed(self.tcx) => {
1761                             let fn_def_id = self.local_def_id(fn_node_id);
1762                             ImplTraitContext::ReturnPositionOpaqueTy {
1763                                 origin: hir::OpaqueTyOrigin::FnReturn(fn_def_id),
1764                                 in_trait: matches!(kind, FnDeclKind::Trait),
1765                             }
1766                         }
1767                         _ => ImplTraitContext::Disallowed(match kind {
1768                             FnDeclKind::Fn | FnDeclKind::Inherent => {
1769                                 unreachable!("fn should allow in-band lifetimes")
1770                             }
1771                             FnDeclKind::ExternFn => ImplTraitPosition::ExternFnReturn,
1772                             FnDeclKind::Closure => ImplTraitPosition::ClosureReturn,
1773                             FnDeclKind::Pointer => ImplTraitPosition::PointerReturn,
1774                             FnDeclKind::Trait => ImplTraitPosition::TraitReturn,
1775                             FnDeclKind::Impl => ImplTraitPosition::ImplReturn,
1776                         }),
1777                     };
1778                     hir::FnRetTy::Return(self.lower_ty(ty, &mut context))
1779                 }
1780                 FnRetTy::Default(span) => hir::FnRetTy::DefaultReturn(self.lower_span(span)),
1781             }
1782         };
1783
1784         self.arena.alloc(hir::FnDecl {
1785             inputs,
1786             output,
1787             c_variadic,
1788             implicit_self: decl.inputs.get(0).map_or(hir::ImplicitSelfKind::None, |arg| {
1789                 let is_mutable_pat = matches!(
1790                     arg.pat.kind,
1791                     PatKind::Ident(hir::BindingAnnotation(_, Mutability::Mut), ..)
1792                 );
1793
1794                 match arg.ty.kind {
1795                     TyKind::ImplicitSelf if is_mutable_pat => hir::ImplicitSelfKind::Mut,
1796                     TyKind::ImplicitSelf => hir::ImplicitSelfKind::Imm,
1797                     // Given we are only considering `ImplicitSelf` types, we needn't consider
1798                     // the case where we have a mutable pattern to a reference as that would
1799                     // no longer be an `ImplicitSelf`.
1800                     TyKind::Rptr(_, ref mt)
1801                         if mt.ty.kind.is_implicit_self() && mt.mutbl == ast::Mutability::Mut =>
1802                     {
1803                         hir::ImplicitSelfKind::MutRef
1804                     }
1805                     TyKind::Rptr(_, ref mt) if mt.ty.kind.is_implicit_self() => {
1806                         hir::ImplicitSelfKind::ImmRef
1807                     }
1808                     _ => hir::ImplicitSelfKind::None,
1809                 }
1810             }),
1811         })
1812     }
1813
1814     // Transforms `-> T` for `async fn` into `-> OpaqueTy { .. }`
1815     // combined with the following definition of `OpaqueTy`:
1816     //
1817     //     type OpaqueTy<generics_from_parent_fn> = impl Future<Output = T>;
1818     //
1819     // `output`: unlowered output type (`T` in `-> T`)
1820     // `fn_def_id`: `DefId` of the parent function (used to create child impl trait definition)
1821     // `opaque_ty_node_id`: `NodeId` of the opaque `impl Trait` type that should be created
1822     #[instrument(level = "debug", skip(self))]
1823     fn lower_async_fn_ret_ty(
1824         &mut self,
1825         output: &FnRetTy,
1826         fn_node_id: NodeId,
1827         opaque_ty_node_id: NodeId,
1828         in_trait: bool,
1829     ) -> hir::FnRetTy<'hir> {
1830         let span = output.span();
1831
1832         let opaque_ty_span = self.mark_span_with_reason(DesugaringKind::Async, span, None);
1833
1834         let opaque_ty_def_id = self.local_def_id(opaque_ty_node_id);
1835         let fn_def_id = self.local_def_id(fn_node_id);
1836
1837         // When we create the opaque type for this async fn, it is going to have
1838         // to capture all the lifetimes involved in the signature (including in the
1839         // return type). This is done by introducing lifetime parameters for:
1840         //
1841         // - all the explicitly declared lifetimes from the impl and function itself;
1842         // - all the elided lifetimes in the fn arguments;
1843         // - all the elided lifetimes in the return type.
1844         //
1845         // So for example in this snippet:
1846         //
1847         // ```rust
1848         // impl<'a> Foo<'a> {
1849         //   async fn bar<'b>(&self, x: &'b Vec<f64>, y: &str) -> &u32 {
1850         //   //               ^ '0                       ^ '1     ^ '2
1851         //   // elided lifetimes used below
1852         //   }
1853         // }
1854         // ```
1855         //
1856         // we would create an opaque type like:
1857         //
1858         // ```
1859         // type Bar<'a, 'b, '0, '1, '2> = impl Future<Output = &'2 u32>;
1860         // ```
1861         //
1862         // and we would then desugar `bar` to the equivalent of:
1863         //
1864         // ```rust
1865         // impl<'a> Foo<'a> {
1866         //   fn bar<'b, '0, '1>(&'0 self, x: &'b Vec<f64>, y: &'1 str) -> Bar<'a, 'b, '0, '1, '_>
1867         // }
1868         // ```
1869         //
1870         // Note that the final parameter to `Bar` is `'_`, not `'2` --
1871         // this is because the elided lifetimes from the return type
1872         // should be figured out using the ordinary elision rules, and
1873         // this desugaring achieves that.
1874
1875         // Calculate all the lifetimes that should be captured
1876         // by the opaque type. This should include all in-scope
1877         // lifetime parameters, including those defined in-band.
1878
1879         // Contains the new lifetime definitions created for the TAIT (if any) generated for the
1880         // return type.
1881         let mut collected_lifetimes = Vec::new();
1882         let mut new_remapping = FxHashMap::default();
1883
1884         let extra_lifetime_params = self.resolver.take_extra_lifetime_params(opaque_ty_node_id);
1885         debug!(?extra_lifetime_params);
1886         for (ident, outer_node_id, outer_res) in extra_lifetime_params {
1887             let outer_def_id = self.orig_local_def_id(outer_node_id);
1888             let inner_node_id = self.next_node_id();
1889
1890             // Add a definition for the in scope lifetime def.
1891             let inner_def_id = self.create_def(
1892                 opaque_ty_def_id,
1893                 inner_node_id,
1894                 DefPathData::LifetimeNs(ident.name),
1895             );
1896             new_remapping.insert(outer_def_id, inner_def_id);
1897
1898             let inner_res = match outer_res {
1899                 // Input lifetime like `'a`:
1900                 LifetimeRes::Param { param, .. } => {
1901                     LifetimeRes::Param { param, binder: fn_node_id }
1902                 }
1903                 // Input lifetime like `'1`:
1904                 LifetimeRes::Fresh { param, .. } => {
1905                     LifetimeRes::Fresh { param, binder: fn_node_id }
1906                 }
1907                 LifetimeRes::Static | LifetimeRes::Error => continue,
1908                 res => {
1909                     panic!(
1910                         "Unexpected lifetime resolution {:?} for {:?} at {:?}",
1911                         res, ident, ident.span
1912                     )
1913                 }
1914             };
1915
1916             let lifetime = Lifetime { id: outer_node_id, ident };
1917             collected_lifetimes.push((inner_node_id, lifetime, Some(inner_res)));
1918         }
1919
1920         debug!(?collected_lifetimes);
1921
1922         // We only want to capture the lifetimes that appear in the bounds. So visit the bounds to
1923         // find out exactly which ones those are.
1924         // in fn return position, like the `fn test<'a>() -> impl Debug + 'a` example,
1925         // we only keep the lifetimes that appear in the `impl Debug` itself:
1926         let lifetimes_to_remap = lifetime_collector::lifetimes_in_ret_ty(&self.resolver, output);
1927         debug!(?lifetimes_to_remap);
1928
1929         self.with_hir_id_owner(opaque_ty_node_id, |this| {
1930             // If this opaque type is only capturing a subset of the lifetimes (those that appear
1931             // in bounds), then create the new lifetime parameters required and create a mapping
1932             // from the old `'a` (on the function) to the new `'a` (on the opaque type).
1933             collected_lifetimes.extend(
1934                 this.create_lifetime_defs(
1935                     opaque_ty_def_id,
1936                     &lifetimes_to_remap,
1937                     &mut new_remapping,
1938                 )
1939                 .into_iter()
1940                 .map(|(new_node_id, lifetime)| (new_node_id, lifetime, None)),
1941             );
1942             debug!(?collected_lifetimes);
1943             debug!(?new_remapping);
1944
1945             // Install the remapping from old to new (if any):
1946             this.with_remapping(new_remapping, |this| {
1947                 // We have to be careful to get elision right here. The
1948                 // idea is that we create a lifetime parameter for each
1949                 // lifetime in the return type.  So, given a return type
1950                 // like `async fn foo(..) -> &[&u32]`, we lower to `impl
1951                 // Future<Output = &'1 [ &'2 u32 ]>`.
1952                 //
1953                 // Then, we will create `fn foo(..) -> Foo<'_, '_>`, and
1954                 // hence the elision takes place at the fn site.
1955                 let future_bound = this.lower_async_fn_output_type_to_future_bound(
1956                     output,
1957                     span,
1958                     if in_trait && !this.tcx.features().return_position_impl_trait_in_trait {
1959                         ImplTraitContext::Disallowed(ImplTraitPosition::TraitReturn)
1960                     } else {
1961                         ImplTraitContext::ReturnPositionOpaqueTy {
1962                             origin: hir::OpaqueTyOrigin::FnReturn(fn_def_id),
1963                             in_trait,
1964                         }
1965                     },
1966                 );
1967
1968                 let generic_params = this.arena.alloc_from_iter(collected_lifetimes.iter().map(
1969                     |&(new_node_id, lifetime, _)| {
1970                         let hir_id = this.lower_node_id(new_node_id);
1971                         debug_assert_ne!(this.opt_local_def_id(new_node_id), None);
1972
1973                         let (name, kind) = if lifetime.ident.name == kw::UnderscoreLifetime {
1974                             (hir::ParamName::Fresh, hir::LifetimeParamKind::Elided)
1975                         } else {
1976                             (
1977                                 hir::ParamName::Plain(lifetime.ident),
1978                                 hir::LifetimeParamKind::Explicit,
1979                             )
1980                         };
1981
1982                         hir::GenericParam {
1983                             hir_id,
1984                             def_id: this.local_def_id(new_node_id),
1985                             name,
1986                             span: lifetime.ident.span,
1987                             pure_wrt_drop: false,
1988                             kind: hir::GenericParamKind::Lifetime { kind },
1989                             colon_span: None,
1990                         }
1991                     },
1992                 ));
1993                 debug!("lower_async_fn_ret_ty: generic_params={:#?}", generic_params);
1994
1995                 let opaque_ty_item = hir::OpaqueTy {
1996                     generics: this.arena.alloc(hir::Generics {
1997                         params: generic_params,
1998                         predicates: &[],
1999                         has_where_clause_predicates: false,
2000                         where_clause_span: this.lower_span(span),
2001                         span: this.lower_span(span),
2002                     }),
2003                     bounds: arena_vec![this; future_bound],
2004                     origin: hir::OpaqueTyOrigin::AsyncFn(fn_def_id),
2005                     in_trait,
2006                 };
2007
2008                 trace!("exist ty from async fn def id: {:#?}", opaque_ty_def_id);
2009                 this.generate_opaque_type(opaque_ty_def_id, opaque_ty_item, span, opaque_ty_span)
2010             })
2011         });
2012
2013         // As documented above, we need to create the lifetime
2014         // arguments to our opaque type. Continuing with our example,
2015         // we're creating the type arguments for the return type:
2016         //
2017         // ```
2018         // Bar<'a, 'b, '0, '1, '_>
2019         // ```
2020         //
2021         // For the "input" lifetime parameters, we wish to create
2022         // references to the parameters themselves, including the
2023         // "implicit" ones created from parameter types (`'a`, `'b`,
2024         // '`0`, `'1`).
2025         //
2026         // For the "output" lifetime parameters, we just want to
2027         // generate `'_`.
2028         let generic_args = self.arena.alloc_from_iter(collected_lifetimes.into_iter().map(
2029             |(_, lifetime, res)| {
2030                 let id = self.next_node_id();
2031                 let span = lifetime.ident.span;
2032
2033                 let ident = if lifetime.ident.name == kw::UnderscoreLifetime {
2034                     Ident::with_dummy_span(kw::UnderscoreLifetime)
2035                 } else {
2036                     lifetime.ident
2037                 };
2038
2039                 let res = res.unwrap_or(
2040                     self.resolver.get_lifetime_res(lifetime.id).unwrap_or(LifetimeRes::Error),
2041                 );
2042                 hir::GenericArg::Lifetime(self.new_named_lifetime_with_res(id, span, ident, res))
2043             },
2044         ));
2045
2046         // Create the `Foo<...>` reference itself. Note that the `type
2047         // Foo = impl Trait` is, internally, created as a child of the
2048         // async fn, so the *type parameters* are inherited.  It's
2049         // only the lifetime parameters that we must supply.
2050         let opaque_ty_ref = hir::TyKind::OpaqueDef(
2051             hir::ItemId { owner_id: hir::OwnerId { def_id: opaque_ty_def_id } },
2052             generic_args,
2053             in_trait,
2054         );
2055         let opaque_ty = self.ty(opaque_ty_span, opaque_ty_ref);
2056         hir::FnRetTy::Return(self.arena.alloc(opaque_ty))
2057     }
2058
2059     /// Transforms `-> T` into `Future<Output = T>`.
2060     fn lower_async_fn_output_type_to_future_bound(
2061         &mut self,
2062         output: &FnRetTy,
2063         span: Span,
2064         mut nested_impl_trait_context: ImplTraitContext,
2065     ) -> hir::GenericBound<'hir> {
2066         // Compute the `T` in `Future<Output = T>` from the return type.
2067         let output_ty = match output {
2068             FnRetTy::Ty(ty) => {
2069                 // Not `OpaqueTyOrigin::AsyncFn`: that's only used for the
2070                 // `impl Future` opaque type that `async fn` implicitly
2071                 // generates.
2072                 self.lower_ty(ty, &mut nested_impl_trait_context)
2073             }
2074             FnRetTy::Default(ret_ty_span) => self.arena.alloc(self.ty_tup(*ret_ty_span, &[])),
2075         };
2076
2077         // "<Output = T>"
2078         let future_args = self.arena.alloc(hir::GenericArgs {
2079             args: &[],
2080             bindings: arena_vec![self; self.output_ty_binding(span, output_ty)],
2081             parenthesized: false,
2082             span_ext: DUMMY_SP,
2083         });
2084
2085         hir::GenericBound::LangItemTrait(
2086             // ::std::future::Future<future_params>
2087             hir::LangItem::Future,
2088             self.lower_span(span),
2089             self.next_id(),
2090             future_args,
2091         )
2092     }
2093
2094     #[instrument(level = "trace", skip(self))]
2095     fn lower_param_bound(
2096         &mut self,
2097         tpb: &GenericBound,
2098         itctx: &ImplTraitContext,
2099     ) -> hir::GenericBound<'hir> {
2100         match tpb {
2101             GenericBound::Trait(p, modifier) => hir::GenericBound::Trait(
2102                 self.lower_poly_trait_ref(p, itctx),
2103                 self.lower_trait_bound_modifier(*modifier),
2104             ),
2105             GenericBound::Outlives(lifetime) => {
2106                 hir::GenericBound::Outlives(self.lower_lifetime(lifetime))
2107             }
2108         }
2109     }
2110
2111     fn lower_lifetime(&mut self, l: &Lifetime) -> &'hir hir::Lifetime {
2112         let span = self.lower_span(l.ident.span);
2113         let ident = self.lower_ident(l.ident);
2114         self.new_named_lifetime(l.id, l.id, span, ident)
2115     }
2116
2117     #[instrument(level = "debug", skip(self))]
2118     fn new_named_lifetime_with_res(
2119         &mut self,
2120         id: NodeId,
2121         span: Span,
2122         ident: Ident,
2123         res: LifetimeRes,
2124     ) -> &'hir hir::Lifetime {
2125         let name = match res {
2126             LifetimeRes::Param { param, .. } => {
2127                 let p_name = ParamName::Plain(ident);
2128                 let param = self.get_remapped_def_id(param);
2129
2130                 hir::LifetimeName::Param(param, p_name)
2131             }
2132             LifetimeRes::Fresh { param, .. } => {
2133                 debug_assert_eq!(ident.name, kw::UnderscoreLifetime);
2134                 let param = self.local_def_id(param);
2135
2136                 hir::LifetimeName::Param(param, ParamName::Fresh)
2137             }
2138             LifetimeRes::Infer => hir::LifetimeName::Infer,
2139             LifetimeRes::Static => hir::LifetimeName::Static,
2140             LifetimeRes::Error => hir::LifetimeName::Error,
2141             res => panic!("Unexpected lifetime resolution {:?} for {:?} at {:?}", res, ident, span),
2142         };
2143
2144         debug!(?name);
2145         self.arena.alloc(hir::Lifetime {
2146             hir_id: self.lower_node_id(id),
2147             span: self.lower_span(span),
2148             name,
2149         })
2150     }
2151
2152     #[instrument(level = "debug", skip(self))]
2153     fn new_named_lifetime(
2154         &mut self,
2155         id: NodeId,
2156         new_id: NodeId,
2157         span: Span,
2158         ident: Ident,
2159     ) -> &'hir hir::Lifetime {
2160         let res = self.resolver.get_lifetime_res(id).unwrap_or(LifetimeRes::Error);
2161         self.new_named_lifetime_with_res(new_id, span, ident, res)
2162     }
2163
2164     fn lower_generic_params_mut<'s>(
2165         &'s mut self,
2166         params: &'s [GenericParam],
2167     ) -> impl Iterator<Item = hir::GenericParam<'hir>> + Captures<'a> + Captures<'s> {
2168         params.iter().map(move |param| self.lower_generic_param(param))
2169     }
2170
2171     fn lower_generic_params(&mut self, params: &[GenericParam]) -> &'hir [hir::GenericParam<'hir>] {
2172         self.arena.alloc_from_iter(self.lower_generic_params_mut(params))
2173     }
2174
2175     #[instrument(level = "trace", skip(self))]
2176     fn lower_generic_param(&mut self, param: &GenericParam) -> hir::GenericParam<'hir> {
2177         let (name, kind) = self.lower_generic_param_kind(param);
2178
2179         let hir_id = self.lower_node_id(param.id);
2180         self.lower_attrs(hir_id, &param.attrs);
2181         hir::GenericParam {
2182             hir_id,
2183             def_id: self.local_def_id(param.id),
2184             name,
2185             span: self.lower_span(param.span()),
2186             pure_wrt_drop: self.tcx.sess.contains_name(&param.attrs, sym::may_dangle),
2187             kind,
2188             colon_span: param.colon_span.map(|s| self.lower_span(s)),
2189         }
2190     }
2191
2192     fn lower_generic_param_kind(
2193         &mut self,
2194         param: &GenericParam,
2195     ) -> (hir::ParamName, hir::GenericParamKind<'hir>) {
2196         match param.kind {
2197             GenericParamKind::Lifetime => {
2198                 // AST resolution emitted an error on those parameters, so we lower them using
2199                 // `ParamName::Error`.
2200                 let param_name =
2201                     if let Some(LifetimeRes::Error) = self.resolver.get_lifetime_res(param.id) {
2202                         ParamName::Error
2203                     } else {
2204                         let ident = self.lower_ident(param.ident);
2205                         ParamName::Plain(ident)
2206                     };
2207                 let kind =
2208                     hir::GenericParamKind::Lifetime { kind: hir::LifetimeParamKind::Explicit };
2209
2210                 (param_name, kind)
2211             }
2212             GenericParamKind::Type { ref default, .. } => {
2213                 let kind = hir::GenericParamKind::Type {
2214                     default: default.as_ref().map(|x| {
2215                         self.lower_ty(x, &ImplTraitContext::Disallowed(ImplTraitPosition::Type))
2216                     }),
2217                     synthetic: false,
2218                 };
2219
2220                 (hir::ParamName::Plain(self.lower_ident(param.ident)), kind)
2221             }
2222             GenericParamKind::Const { ref ty, kw_span: _, ref default } => {
2223                 let ty = self.lower_ty(&ty, &ImplTraitContext::Disallowed(ImplTraitPosition::Type));
2224                 let default = default.as_ref().map(|def| self.lower_anon_const(def));
2225                 (
2226                     hir::ParamName::Plain(self.lower_ident(param.ident)),
2227                     hir::GenericParamKind::Const { ty, default },
2228                 )
2229             }
2230         }
2231     }
2232
2233     fn lower_trait_ref(&mut self, p: &TraitRef, itctx: &ImplTraitContext) -> hir::TraitRef<'hir> {
2234         let path = match self.lower_qpath(p.ref_id, &None, &p.path, ParamMode::Explicit, itctx) {
2235             hir::QPath::Resolved(None, path) => path,
2236             qpath => panic!("lower_trait_ref: unexpected QPath `{:?}`", qpath),
2237         };
2238         hir::TraitRef { path, hir_ref_id: self.lower_node_id(p.ref_id) }
2239     }
2240
2241     #[instrument(level = "debug", skip(self))]
2242     fn lower_poly_trait_ref(
2243         &mut self,
2244         p: &PolyTraitRef,
2245         itctx: &ImplTraitContext,
2246     ) -> hir::PolyTraitRef<'hir> {
2247         let bound_generic_params =
2248             self.lower_lifetime_binder(p.trait_ref.ref_id, &p.bound_generic_params);
2249         let trait_ref = self.lower_trait_ref(&p.trait_ref, itctx);
2250         hir::PolyTraitRef { bound_generic_params, trait_ref, span: self.lower_span(p.span) }
2251     }
2252
2253     fn lower_mt(&mut self, mt: &MutTy, itctx: &ImplTraitContext) -> hir::MutTy<'hir> {
2254         hir::MutTy { ty: self.lower_ty(&mt.ty, itctx), mutbl: mt.mutbl }
2255     }
2256
2257     #[instrument(level = "debug", skip(self), ret)]
2258     fn lower_param_bounds(
2259         &mut self,
2260         bounds: &[GenericBound],
2261         itctx: &ImplTraitContext,
2262     ) -> hir::GenericBounds<'hir> {
2263         self.arena.alloc_from_iter(self.lower_param_bounds_mut(bounds, itctx))
2264     }
2265
2266     fn lower_param_bounds_mut<'s>(
2267         &'s mut self,
2268         bounds: &'s [GenericBound],
2269         itctx: &'s ImplTraitContext,
2270     ) -> impl Iterator<Item = hir::GenericBound<'hir>> + Captures<'s> + Captures<'a> {
2271         bounds.iter().map(move |bound| self.lower_param_bound(bound, itctx))
2272     }
2273
2274     #[instrument(level = "debug", skip(self), ret)]
2275     fn lower_generic_and_bounds(
2276         &mut self,
2277         node_id: NodeId,
2278         span: Span,
2279         ident: Ident,
2280         bounds: &[GenericBound],
2281     ) -> (hir::GenericParam<'hir>, Option<hir::WherePredicate<'hir>>, hir::TyKind<'hir>) {
2282         // Add a definition for the in-band `Param`.
2283         let def_id = self.local_def_id(node_id);
2284
2285         // Set the name to `impl Bound1 + Bound2`.
2286         let param = hir::GenericParam {
2287             hir_id: self.lower_node_id(node_id),
2288             def_id,
2289             name: ParamName::Plain(self.lower_ident(ident)),
2290             pure_wrt_drop: false,
2291             span: self.lower_span(span),
2292             kind: hir::GenericParamKind::Type { default: None, synthetic: true },
2293             colon_span: None,
2294         };
2295
2296         let preds = self.lower_generic_bound_predicate(
2297             ident,
2298             node_id,
2299             &GenericParamKind::Type { default: None },
2300             bounds,
2301             &ImplTraitContext::Universal,
2302             hir::PredicateOrigin::ImplTrait,
2303         );
2304
2305         let hir_id = self.next_id();
2306         let res = Res::Def(DefKind::TyParam, def_id.to_def_id());
2307         let ty = hir::TyKind::Path(hir::QPath::Resolved(
2308             None,
2309             self.arena.alloc(hir::Path {
2310                 span: self.lower_span(span),
2311                 res,
2312                 segments:
2313                     arena_vec![self; hir::PathSegment::new(self.lower_ident(ident), hir_id, res)],
2314             }),
2315         ));
2316
2317         (param, preds, ty)
2318     }
2319
2320     /// Lowers a block directly to an expression, presuming that it
2321     /// has no attributes and is not targeted by a `break`.
2322     fn lower_block_expr(&mut self, b: &Block) -> hir::Expr<'hir> {
2323         let block = self.lower_block(b, false);
2324         self.expr_block(block, AttrVec::new())
2325     }
2326
2327     fn lower_array_length(&mut self, c: &AnonConst) -> hir::ArrayLen {
2328         match c.value.kind {
2329             ExprKind::Underscore => {
2330                 if self.tcx.features().generic_arg_infer {
2331                     hir::ArrayLen::Infer(self.lower_node_id(c.id), c.value.span)
2332                 } else {
2333                     feature_err(
2334                         &self.tcx.sess.parse_sess,
2335                         sym::generic_arg_infer,
2336                         c.value.span,
2337                         "using `_` for array lengths is unstable",
2338                     )
2339                     .stash(c.value.span, StashKey::UnderscoreForArrayLengths);
2340                     hir::ArrayLen::Body(self.lower_anon_const(c))
2341                 }
2342             }
2343             _ => hir::ArrayLen::Body(self.lower_anon_const(c)),
2344         }
2345     }
2346
2347     fn lower_anon_const(&mut self, c: &AnonConst) -> hir::AnonConst {
2348         self.with_new_scopes(|this| hir::AnonConst {
2349             def_id: this.local_def_id(c.id),
2350             hir_id: this.lower_node_id(c.id),
2351             body: this.lower_const_body(c.value.span, Some(&c.value)),
2352         })
2353     }
2354
2355     fn lower_unsafe_source(&mut self, u: UnsafeSource) -> hir::UnsafeSource {
2356         match u {
2357             CompilerGenerated => hir::UnsafeSource::CompilerGenerated,
2358             UserProvided => hir::UnsafeSource::UserProvided,
2359         }
2360     }
2361
2362     fn lower_trait_bound_modifier(&mut self, f: TraitBoundModifier) -> hir::TraitBoundModifier {
2363         match f {
2364             TraitBoundModifier::None => hir::TraitBoundModifier::None,
2365             TraitBoundModifier::MaybeConst => hir::TraitBoundModifier::MaybeConst,
2366
2367             // `MaybeConstMaybe` will cause an error during AST validation, but we need to pick a
2368             // placeholder for compilation to proceed.
2369             TraitBoundModifier::MaybeConstMaybe | TraitBoundModifier::Maybe => {
2370                 hir::TraitBoundModifier::Maybe
2371             }
2372         }
2373     }
2374
2375     // Helper methods for building HIR.
2376
2377     fn stmt(&mut self, span: Span, kind: hir::StmtKind<'hir>) -> hir::Stmt<'hir> {
2378         hir::Stmt { span: self.lower_span(span), kind, hir_id: self.next_id() }
2379     }
2380
2381     fn stmt_expr(&mut self, span: Span, expr: hir::Expr<'hir>) -> hir::Stmt<'hir> {
2382         self.stmt(span, hir::StmtKind::Expr(self.arena.alloc(expr)))
2383     }
2384
2385     fn stmt_let_pat(
2386         &mut self,
2387         attrs: Option<&'hir [Attribute]>,
2388         span: Span,
2389         init: Option<&'hir hir::Expr<'hir>>,
2390         pat: &'hir hir::Pat<'hir>,
2391         source: hir::LocalSource,
2392     ) -> hir::Stmt<'hir> {
2393         let hir_id = self.next_id();
2394         if let Some(a) = attrs {
2395             debug_assert!(!a.is_empty());
2396             self.attrs.insert(hir_id.local_id, a);
2397         }
2398         let local = hir::Local {
2399             hir_id,
2400             init,
2401             pat,
2402             els: None,
2403             source,
2404             span: self.lower_span(span),
2405             ty: None,
2406         };
2407         self.stmt(span, hir::StmtKind::Local(self.arena.alloc(local)))
2408     }
2409
2410     fn block_expr(&mut self, expr: &'hir hir::Expr<'hir>) -> &'hir hir::Block<'hir> {
2411         self.block_all(expr.span, &[], Some(expr))
2412     }
2413
2414     fn block_all(
2415         &mut self,
2416         span: Span,
2417         stmts: &'hir [hir::Stmt<'hir>],
2418         expr: Option<&'hir hir::Expr<'hir>>,
2419     ) -> &'hir hir::Block<'hir> {
2420         let blk = hir::Block {
2421             stmts,
2422             expr,
2423             hir_id: self.next_id(),
2424             rules: hir::BlockCheckMode::DefaultBlock,
2425             span: self.lower_span(span),
2426             targeted_by_break: false,
2427         };
2428         self.arena.alloc(blk)
2429     }
2430
2431     fn pat_cf_continue(&mut self, span: Span, pat: &'hir hir::Pat<'hir>) -> &'hir hir::Pat<'hir> {
2432         let field = self.single_pat_field(span, pat);
2433         self.pat_lang_item_variant(span, hir::LangItem::ControlFlowContinue, field, None)
2434     }
2435
2436     fn pat_cf_break(&mut self, span: Span, pat: &'hir hir::Pat<'hir>) -> &'hir hir::Pat<'hir> {
2437         let field = self.single_pat_field(span, pat);
2438         self.pat_lang_item_variant(span, hir::LangItem::ControlFlowBreak, field, None)
2439     }
2440
2441     fn pat_some(&mut self, span: Span, pat: &'hir hir::Pat<'hir>) -> &'hir hir::Pat<'hir> {
2442         let field = self.single_pat_field(span, pat);
2443         self.pat_lang_item_variant(span, hir::LangItem::OptionSome, field, None)
2444     }
2445
2446     fn pat_none(&mut self, span: Span) -> &'hir hir::Pat<'hir> {
2447         self.pat_lang_item_variant(span, hir::LangItem::OptionNone, &[], None)
2448     }
2449
2450     fn single_pat_field(
2451         &mut self,
2452         span: Span,
2453         pat: &'hir hir::Pat<'hir>,
2454     ) -> &'hir [hir::PatField<'hir>] {
2455         let field = hir::PatField {
2456             hir_id: self.next_id(),
2457             ident: Ident::new(sym::integer(0), self.lower_span(span)),
2458             is_shorthand: false,
2459             pat,
2460             span: self.lower_span(span),
2461         };
2462         arena_vec![self; field]
2463     }
2464
2465     fn pat_lang_item_variant(
2466         &mut self,
2467         span: Span,
2468         lang_item: hir::LangItem,
2469         fields: &'hir [hir::PatField<'hir>],
2470         hir_id: Option<hir::HirId>,
2471     ) -> &'hir hir::Pat<'hir> {
2472         let qpath = hir::QPath::LangItem(lang_item, self.lower_span(span), hir_id);
2473         self.pat(span, hir::PatKind::Struct(qpath, fields, false))
2474     }
2475
2476     fn pat_ident(&mut self, span: Span, ident: Ident) -> (&'hir hir::Pat<'hir>, hir::HirId) {
2477         self.pat_ident_binding_mode(span, ident, hir::BindingAnnotation::NONE)
2478     }
2479
2480     fn pat_ident_mut(&mut self, span: Span, ident: Ident) -> (hir::Pat<'hir>, hir::HirId) {
2481         self.pat_ident_binding_mode_mut(span, ident, hir::BindingAnnotation::NONE)
2482     }
2483
2484     fn pat_ident_binding_mode(
2485         &mut self,
2486         span: Span,
2487         ident: Ident,
2488         bm: hir::BindingAnnotation,
2489     ) -> (&'hir hir::Pat<'hir>, hir::HirId) {
2490         let (pat, hir_id) = self.pat_ident_binding_mode_mut(span, ident, bm);
2491         (self.arena.alloc(pat), hir_id)
2492     }
2493
2494     fn pat_ident_binding_mode_mut(
2495         &mut self,
2496         span: Span,
2497         ident: Ident,
2498         bm: hir::BindingAnnotation,
2499     ) -> (hir::Pat<'hir>, hir::HirId) {
2500         let hir_id = self.next_id();
2501
2502         (
2503             hir::Pat {
2504                 hir_id,
2505                 kind: hir::PatKind::Binding(bm, hir_id, self.lower_ident(ident), None),
2506                 span: self.lower_span(span),
2507                 default_binding_modes: true,
2508             },
2509             hir_id,
2510         )
2511     }
2512
2513     fn pat(&mut self, span: Span, kind: hir::PatKind<'hir>) -> &'hir hir::Pat<'hir> {
2514         self.arena.alloc(hir::Pat {
2515             hir_id: self.next_id(),
2516             kind,
2517             span: self.lower_span(span),
2518             default_binding_modes: true,
2519         })
2520     }
2521
2522     fn pat_without_dbm(&mut self, span: Span, kind: hir::PatKind<'hir>) -> hir::Pat<'hir> {
2523         hir::Pat {
2524             hir_id: self.next_id(),
2525             kind,
2526             span: self.lower_span(span),
2527             default_binding_modes: false,
2528         }
2529     }
2530
2531     fn ty_path(
2532         &mut self,
2533         mut hir_id: hir::HirId,
2534         span: Span,
2535         qpath: hir::QPath<'hir>,
2536     ) -> hir::Ty<'hir> {
2537         let kind = match qpath {
2538             hir::QPath::Resolved(None, path) => {
2539                 // Turn trait object paths into `TyKind::TraitObject` instead.
2540                 match path.res {
2541                     Res::Def(DefKind::Trait | DefKind::TraitAlias, _) => {
2542                         let principal = hir::PolyTraitRef {
2543                             bound_generic_params: &[],
2544                             trait_ref: hir::TraitRef { path, hir_ref_id: hir_id },
2545                             span: self.lower_span(span),
2546                         };
2547
2548                         // The original ID is taken by the `PolyTraitRef`,
2549                         // so the `Ty` itself needs a different one.
2550                         hir_id = self.next_id();
2551                         hir::TyKind::TraitObject(
2552                             arena_vec![self; principal],
2553                             self.elided_dyn_bound(span),
2554                             TraitObjectSyntax::None,
2555                         )
2556                     }
2557                     _ => hir::TyKind::Path(hir::QPath::Resolved(None, path)),
2558                 }
2559             }
2560             _ => hir::TyKind::Path(qpath),
2561         };
2562
2563         hir::Ty { hir_id, kind, span: self.lower_span(span) }
2564     }
2565
2566     /// Invoked to create the lifetime argument(s) for an elided trait object
2567     /// bound, like the bound in `Box<dyn Debug>`. This method is not invoked
2568     /// when the bound is written, even if it is written with `'_` like in
2569     /// `Box<dyn Debug + '_>`. In those cases, `lower_lifetime` is invoked.
2570     fn elided_dyn_bound(&mut self, span: Span) -> &'hir hir::Lifetime {
2571         let r = hir::Lifetime {
2572             hir_id: self.next_id(),
2573             span: self.lower_span(span),
2574             name: hir::LifetimeName::ImplicitObjectLifetimeDefault,
2575         };
2576         debug!("elided_dyn_bound: r={:?}", r);
2577         self.arena.alloc(r)
2578     }
2579 }
2580
2581 /// Helper struct for delayed construction of GenericArgs.
2582 struct GenericArgsCtor<'hir> {
2583     args: SmallVec<[hir::GenericArg<'hir>; 4]>,
2584     bindings: &'hir [hir::TypeBinding<'hir>],
2585     parenthesized: bool,
2586     span: Span,
2587 }
2588
2589 impl<'hir> GenericArgsCtor<'hir> {
2590     fn is_empty(&self) -> bool {
2591         self.args.is_empty() && self.bindings.is_empty() && !self.parenthesized
2592     }
2593
2594     fn into_generic_args(self, this: &LoweringContext<'_, 'hir>) -> &'hir hir::GenericArgs<'hir> {
2595         let ga = hir::GenericArgs {
2596             args: this.arena.alloc_from_iter(self.args),
2597             bindings: self.bindings,
2598             parenthesized: self.parenthesized,
2599             span_ext: this.lower_span(self.span),
2600         };
2601         this.arena.alloc(ga)
2602     }
2603 }