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