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