]> git.lizzy.rs Git - rust.git/blob - src/librustc/hir/lowering.rs
184180d67be7b00a6aaaa812fd044e1a3f878526
[rust.git] / src / librustc / hir / lowering.rs
1 // ignore-tidy-filelength
2
3 //! Lowers the AST to the HIR.
4 //!
5 //! Since the AST and HIR are fairly similar, this is mostly a simple procedure,
6 //! much like a fold. Where lowering involves a bit more work things get more
7 //! interesting and there are some invariants you should know about. These mostly
8 //! concern spans and IDs.
9 //!
10 //! Spans are assigned to AST nodes during parsing and then are modified during
11 //! expansion to indicate the origin of a node and the process it went through
12 //! being expanded. IDs are assigned to AST nodes just before lowering.
13 //!
14 //! For the simpler lowering steps, IDs and spans should be preserved. Unlike
15 //! expansion we do not preserve the process of lowering in the spans, so spans
16 //! should not be modified here. When creating a new node (as opposed to
17 //! 'folding' an existing one), then you create a new ID using `next_id()`.
18 //!
19 //! You must ensure that IDs are unique. That means that you should only use the
20 //! ID from an AST node in a single HIR node (you can assume that AST node-IDs
21 //! are unique). Every new node must have a unique ID. Avoid cloning HIR nodes.
22 //! If you do, you must then set the new node's ID to a fresh one.
23 //!
24 //! Spans are used for error messages and for tools to map semantics back to
25 //! source code. It is therefore not as important with spans as IDs to be strict
26 //! about use (you can't break the compiler by screwing up a span). Obviously, a
27 //! HIR node can only have a single span. But multiple nodes can have the same
28 //! span and spans don't need to be kept in order, etc. Where code is preserved
29 //! by lowering, it should have the same span as in the AST. Where HIR nodes are
30 //! new it is probably best to give a span for the whole AST node being lowered.
31 //! All nodes should have real spans, don't use dummy spans. Tools are likely to
32 //! get confused if the spans from leaf AST nodes occur in multiple places
33 //! in the HIR, especially for multiple identifiers.
34
35 mod expr;
36 mod item;
37
38 use crate::dep_graph::DepGraph;
39 use crate::hir::{self, ParamName};
40 use crate::hir::HirVec;
41 use crate::hir::map::{DefKey, DefPathData, Definitions};
42 use crate::hir::def_id::{DefId, DefIndex, CRATE_DEF_INDEX};
43 use crate::hir::def::{Namespace, Res, DefKind, PartialRes, PerNS};
44 use crate::hir::{GenericArg, ConstArg};
45 use crate::hir::ptr::P;
46 use crate::lint::builtin::{self, PARENTHESIZED_PARAMS_IN_TYPES_AND_MODULES,
47                     ELIDED_LIFETIMES_IN_PATHS};
48 use crate::middle::cstore::CrateStore;
49 use crate::session::Session;
50 use crate::session::config::nightly_options;
51 use crate::util::common::FN_OUTPUT_NAME;
52 use crate::util::nodemap::{DefIdMap, NodeMap};
53 use errors::Applicability;
54 use rustc_data_structures::fx::FxHashSet;
55 use rustc_data_structures::indexed_vec::IndexVec;
56 use rustc_data_structures::thin_vec::ThinVec;
57 use rustc_data_structures::sync::Lrc;
58
59 use std::collections::BTreeMap;
60 use std::mem;
61 use smallvec::SmallVec;
62 use syntax::attr;
63 use syntax::ast;
64 use syntax::ptr::P as AstP;
65 use syntax::ast::*;
66 use syntax::errors;
67 use syntax::ext::base::SpecialDerives;
68 use syntax::ext::hygiene::ExpnId;
69 use syntax::print::pprust;
70 use syntax::source_map::{respan, ExpnInfo, ExpnKind, DesugaringKind, Spanned};
71 use syntax::symbol::{kw, sym, Symbol};
72 use syntax::tokenstream::{TokenStream, TokenTree};
73 use syntax::parse::token::{self, Token};
74 use syntax::visit::{self, Visitor};
75 use syntax_pos::{DUMMY_SP, Span};
76
77 const HIR_ID_COUNTER_LOCKED: u32 = 0xFFFFFFFF;
78
79 pub struct LoweringContext<'a> {
80     crate_root: Option<Symbol>,
81
82     /// Used to assign ids to HIR nodes that do not directly correspond to an AST node.
83     sess: &'a Session,
84
85     cstore: &'a dyn CrateStore,
86
87     resolver: &'a mut dyn Resolver,
88
89     /// The items being lowered are collected here.
90     items: BTreeMap<hir::HirId, hir::Item>,
91
92     trait_items: BTreeMap<hir::TraitItemId, hir::TraitItem>,
93     impl_items: BTreeMap<hir::ImplItemId, hir::ImplItem>,
94     bodies: BTreeMap<hir::BodyId, hir::Body>,
95     exported_macros: Vec<hir::MacroDef>,
96     non_exported_macro_attrs: Vec<ast::Attribute>,
97
98     trait_impls: BTreeMap<DefId, Vec<hir::HirId>>,
99
100     modules: BTreeMap<NodeId, hir::ModuleItems>,
101
102     generator_kind: Option<hir::GeneratorKind>,
103
104     /// Used to get the current `fn`'s def span to point to when using `await`
105     /// outside of an `async fn`.
106     current_item: Option<Span>,
107
108     catch_scopes: Vec<NodeId>,
109     loop_scopes: Vec<NodeId>,
110     is_in_loop_condition: bool,
111     is_in_trait_impl: bool,
112     is_in_dyn_type: bool,
113
114     /// What to do when we encounter either an "anonymous lifetime
115     /// reference". The term "anonymous" is meant to encompass both
116     /// `'_` lifetimes as well as fully elided cases where nothing is
117     /// written at all (e.g., `&T` or `std::cell::Ref<T>`).
118     anonymous_lifetime_mode: AnonymousLifetimeMode,
119
120     /// Used to create lifetime definitions from in-band lifetime usages.
121     /// e.g., `fn foo(x: &'x u8) -> &'x u8` to `fn foo<'x>(x: &'x u8) -> &'x u8`
122     /// When a named lifetime is encountered in a function or impl header and
123     /// has not been defined
124     /// (i.e., it doesn't appear in the in_scope_lifetimes list), it is added
125     /// to this list. The results of this list are then added to the list of
126     /// lifetime definitions in the corresponding impl or function generics.
127     lifetimes_to_define: Vec<(Span, ParamName)>,
128
129     /// Whether or not in-band lifetimes are being collected. This is used to
130     /// indicate whether or not we're in a place where new lifetimes will result
131     /// in in-band lifetime definitions, such a function or an impl header,
132     /// including implicit lifetimes from `impl_header_lifetime_elision`.
133     is_collecting_in_band_lifetimes: bool,
134
135     /// Currently in-scope lifetimes defined in impl headers, fn headers, or HRTB.
136     /// When `is_collectin_in_band_lifetimes` is true, each lifetime is checked
137     /// against this list to see if it is already in-scope, or if a definition
138     /// needs to be created for it.
139     in_scope_lifetimes: Vec<ParamName>,
140
141     current_module: NodeId,
142
143     type_def_lifetime_params: DefIdMap<usize>,
144
145     current_hir_id_owner: Vec<(DefIndex, u32)>,
146     item_local_id_counters: NodeMap<u32>,
147     node_id_to_hir_id: IndexVec<NodeId, hir::HirId>,
148
149     allow_try_trait: Option<Lrc<[Symbol]>>,
150     allow_gen_future: Option<Lrc<[Symbol]>>,
151 }
152
153 pub trait Resolver {
154     /// Obtain resolution for a `NodeId` with a single resolution.
155     fn get_partial_res(&mut self, id: NodeId) -> Option<PartialRes>;
156
157     /// Obtain per-namespace resolutions for `use` statement with the given `NoedId`.
158     fn get_import_res(&mut self, id: NodeId) -> PerNS<Option<Res<NodeId>>>;
159
160     /// Obtain resolution for a label with the given `NodeId`.
161     fn get_label_res(&mut self, id: NodeId) -> Option<NodeId>;
162
163     /// We must keep the set of definitions up to date as we add nodes that weren't in the AST.
164     /// This should only return `None` during testing.
165     fn definitions(&mut self) -> &mut Definitions;
166
167     /// Given suffix `["b", "c", "d"]`, creates an AST path for `[::crate_root]::b::c::d` and
168     /// resolves it based on `is_value`.
169     fn resolve_str_path(
170         &mut self,
171         span: Span,
172         crate_root: Option<Symbol>,
173         components: &[Symbol],
174         ns: Namespace,
175     ) -> (ast::Path, Res<NodeId>);
176
177     fn has_derives(&self, node_id: NodeId, derives: SpecialDerives) -> bool;
178 }
179
180 /// Context of `impl Trait` in code, which determines whether it is allowed in an HIR subtree,
181 /// and if so, what meaning it has.
182 #[derive(Debug)]
183 enum ImplTraitContext<'a> {
184     /// Treat `impl Trait` as shorthand for a new universal generic parameter.
185     /// Example: `fn foo(x: impl Debug)`, where `impl Debug` is conceptually
186     /// equivalent to a fresh universal parameter like `fn foo<T: Debug>(x: T)`.
187     ///
188     /// Newly generated parameters should be inserted into the given `Vec`.
189     Universal(&'a mut Vec<hir::GenericParam>),
190
191     /// Treat `impl Trait` as shorthand for a new opaque type.
192     /// Example: `fn foo() -> impl Debug`, where `impl Debug` is conceptually
193     /// equivalent to a new opaque type like `type T = impl Debug; fn foo() -> T`.
194     ///
195     /// We optionally store a `DefId` for the parent item here so we can look up necessary
196     /// information later. It is `None` when no information about the context should be stored
197     /// (e.g., for consts and statics).
198     OpaqueTy(Option<DefId> /* fn def-ID */),
199
200     /// `impl Trait` is not accepted in this position.
201     Disallowed(ImplTraitPosition),
202 }
203
204 /// Position in which `impl Trait` is disallowed.
205 #[derive(Debug, Copy, Clone, PartialEq, Eq)]
206 enum ImplTraitPosition {
207     /// Disallowed in `let` / `const` / `static` bindings.
208     Binding,
209
210     /// All other posiitons.
211     Other,
212 }
213
214 impl<'a> ImplTraitContext<'a> {
215     #[inline]
216     fn disallowed() -> Self {
217         ImplTraitContext::Disallowed(ImplTraitPosition::Other)
218     }
219
220     fn reborrow(&'b mut self) -> ImplTraitContext<'b> {
221         use self::ImplTraitContext::*;
222         match self {
223             Universal(params) => Universal(params),
224             OpaqueTy(fn_def_id) => OpaqueTy(*fn_def_id),
225             Disallowed(pos) => Disallowed(*pos),
226         }
227     }
228 }
229
230 pub fn lower_crate(
231     sess: &Session,
232     cstore: &dyn CrateStore,
233     dep_graph: &DepGraph,
234     krate: &Crate,
235     resolver: &mut dyn Resolver,
236 ) -> hir::Crate {
237     // We're constructing the HIR here; we don't care what we will
238     // read, since we haven't even constructed the *input* to
239     // incr. comp. yet.
240     dep_graph.assert_ignored();
241
242     LoweringContext {
243         crate_root: sess.parse_sess.injected_crate_name.try_get().copied(),
244         sess,
245         cstore,
246         resolver,
247         items: BTreeMap::new(),
248         trait_items: BTreeMap::new(),
249         impl_items: BTreeMap::new(),
250         bodies: BTreeMap::new(),
251         trait_impls: BTreeMap::new(),
252         modules: BTreeMap::new(),
253         exported_macros: Vec::new(),
254         non_exported_macro_attrs: Vec::new(),
255         catch_scopes: Vec::new(),
256         loop_scopes: Vec::new(),
257         is_in_loop_condition: false,
258         is_in_trait_impl: false,
259         is_in_dyn_type: false,
260         anonymous_lifetime_mode: AnonymousLifetimeMode::PassThrough,
261         type_def_lifetime_params: Default::default(),
262         current_module: CRATE_NODE_ID,
263         current_hir_id_owner: vec![(CRATE_DEF_INDEX, 0)],
264         item_local_id_counters: Default::default(),
265         node_id_to_hir_id: IndexVec::new(),
266         generator_kind: None,
267         current_item: None,
268         lifetimes_to_define: Vec::new(),
269         is_collecting_in_band_lifetimes: false,
270         in_scope_lifetimes: Vec::new(),
271         allow_try_trait: Some([sym::try_trait][..].into()),
272         allow_gen_future: Some([sym::gen_future][..].into()),
273     }.lower_crate(krate)
274 }
275
276 #[derive(Copy, Clone, PartialEq)]
277 enum ParamMode {
278     /// Any path in a type context.
279     Explicit,
280     /// Path in a type definition, where the anonymous lifetime `'_` is not allowed.
281     ExplicitNamed,
282     /// The `module::Type` in `module::Type::method` in an expression.
283     Optional,
284 }
285
286 enum ParenthesizedGenericArgs {
287     Ok,
288     Warn,
289     Err,
290 }
291
292 /// What to do when we encounter an **anonymous** lifetime
293 /// reference. Anonymous lifetime references come in two flavors. You
294 /// have implicit, or fully elided, references to lifetimes, like the
295 /// one in `&T` or `Ref<T>`, and you have `'_` lifetimes, like `&'_ T`
296 /// or `Ref<'_, T>`. These often behave the same, but not always:
297 ///
298 /// - certain usages of implicit references are deprecated, like
299 ///   `Ref<T>`, and we sometimes just give hard errors in those cases
300 ///   as well.
301 /// - for object bounds there is a difference: `Box<dyn Foo>` is not
302 ///   the same as `Box<dyn Foo + '_>`.
303 ///
304 /// We describe the effects of the various modes in terms of three cases:
305 ///
306 /// - **Modern** -- includes all uses of `'_`, but also the lifetime arg
307 ///   of a `&` (e.g., the missing lifetime in something like `&T`)
308 /// - **Dyn Bound** -- if you have something like `Box<dyn Foo>`,
309 ///   there is an elided lifetime bound (`Box<dyn Foo + 'X>`). These
310 ///   elided bounds follow special rules. Note that this only covers
311 ///   cases where *nothing* is written; the `'_` in `Box<dyn Foo +
312 ///   '_>` is a case of "modern" elision.
313 /// - **Deprecated** -- this coverse cases like `Ref<T>`, where the lifetime
314 ///   parameter to ref is completely elided. `Ref<'_, T>` would be the modern,
315 ///   non-deprecated equivalent.
316 ///
317 /// Currently, the handling of lifetime elision is somewhat spread out
318 /// between HIR lowering and -- as described below -- the
319 /// `resolve_lifetime` module. Often we "fallthrough" to that code by generating
320 /// an "elided" or "underscore" lifetime name. In the future, we probably want to move
321 /// everything into HIR lowering.
322 #[derive(Copy, Clone)]
323 enum AnonymousLifetimeMode {
324     /// For **Modern** cases, create a new anonymous region parameter
325     /// and reference that.
326     ///
327     /// For **Dyn Bound** cases, pass responsibility to
328     /// `resolve_lifetime` code.
329     ///
330     /// For **Deprecated** cases, report an error.
331     CreateParameter,
332
333     /// Give a hard error when either `&` or `'_` is written. Used to
334     /// rule out things like `where T: Foo<'_>`. Does not imply an
335     /// error on default object bounds (e.g., `Box<dyn Foo>`).
336     ReportError,
337
338     /// Pass responsibility to `resolve_lifetime` code for all cases.
339     PassThrough,
340
341     /// Used in the return types of `async fn` where there exists
342     /// exactly one argument-position elided lifetime.
343     ///
344     /// In `async fn`, we lower the arguments types using the `CreateParameter`
345     /// mode, meaning that non-`dyn` elided lifetimes are assigned a fresh name.
346     /// If any corresponding elided lifetimes appear in the output, we need to
347     /// replace them with references to the fresh name assigned to the corresponding
348     /// elided lifetime in the arguments.
349     ///
350     /// For **Modern cases**, replace the anonymous parameter with a
351     /// reference to a specific freshly-named lifetime that was
352     /// introduced in argument
353     ///
354     /// For **Dyn Bound** cases, pass responsibility to
355     /// `resole_lifetime` code.
356     Replace(LtReplacement),
357 }
358
359 /// The type of elided lifetime replacement to perform on `async fn` return types.
360 #[derive(Copy, Clone)]
361 enum LtReplacement {
362     /// Fresh name introduced by the single non-dyn elided lifetime
363     /// in the arguments of the async fn.
364     Some(ParamName),
365
366     /// There is no single non-dyn elided lifetime because no lifetimes
367     /// appeared in the arguments.
368     NoLifetimes,
369
370     /// There is no single non-dyn elided lifetime because multiple
371     /// lifetimes appeared in the arguments.
372     MultipleLifetimes,
373 }
374
375 /// Calculates the `LtReplacement` to use for elided lifetimes in the return
376 /// type based on the fresh elided lifetimes introduced in argument position.
377 fn get_elided_lt_replacement(arg_position_lifetimes: &[(Span, ParamName)]) -> LtReplacement {
378     match arg_position_lifetimes {
379         [] => LtReplacement::NoLifetimes,
380         [(_span, param)] => LtReplacement::Some(*param),
381         _ => LtReplacement::MultipleLifetimes,
382     }
383 }
384
385 struct ImplTraitTypeIdVisitor<'a> { ids: &'a mut SmallVec<[NodeId; 1]> }
386
387 impl<'a, 'b> Visitor<'a> for ImplTraitTypeIdVisitor<'b> {
388     fn visit_ty(&mut self, ty: &'a Ty) {
389         match ty.node {
390             | TyKind::Typeof(_)
391             | TyKind::BareFn(_)
392             => return,
393
394             TyKind::ImplTrait(id, _) => self.ids.push(id),
395             _ => {},
396         }
397         visit::walk_ty(self, ty);
398     }
399
400     fn visit_path_segment(
401         &mut self,
402         path_span: Span,
403         path_segment: &'v PathSegment,
404     ) {
405         if let Some(ref p) = path_segment.args {
406             if let GenericArgs::Parenthesized(_) = **p {
407                 return;
408             }
409         }
410         visit::walk_path_segment(self, path_span, path_segment)
411     }
412 }
413
414 impl<'a> LoweringContext<'a> {
415     fn lower_crate(mut self, c: &Crate) -> hir::Crate {
416         /// Full-crate AST visitor that inserts into a fresh
417         /// `LoweringContext` any information that may be
418         /// needed from arbitrary locations in the crate,
419         /// e.g., the number of lifetime generic parameters
420         /// declared for every type and trait definition.
421         struct MiscCollector<'tcx, 'interner> {
422             lctx: &'tcx mut LoweringContext<'interner>,
423             hir_id_owner: Option<NodeId>,
424         }
425
426         impl MiscCollector<'_, '_> {
427             fn allocate_use_tree_hir_id_counters(
428                 &mut self,
429                 tree: &UseTree,
430                 owner: DefIndex,
431             ) {
432                 match tree.kind {
433                     UseTreeKind::Simple(_, id1, id2) => {
434                         for &id in &[id1, id2] {
435                             self.lctx.resolver.definitions().create_def_with_parent(
436                                 owner,
437                                 id,
438                                 DefPathData::Misc,
439                                 ExpnId::root(),
440                                 tree.prefix.span,
441                             );
442                             self.lctx.allocate_hir_id_counter(id);
443                         }
444                     }
445                     UseTreeKind::Glob => (),
446                     UseTreeKind::Nested(ref trees) => {
447                         for &(ref use_tree, id) in trees {
448                             let hir_id = self.lctx.allocate_hir_id_counter(id);
449                             self.allocate_use_tree_hir_id_counters(use_tree, hir_id.owner);
450                         }
451                     }
452                 }
453             }
454
455             fn with_hir_id_owner<F, T>(&mut self, owner: Option<NodeId>, f: F) -> T
456             where
457                 F: FnOnce(&mut Self) -> T,
458             {
459                 let old = mem::replace(&mut self.hir_id_owner, owner);
460                 let r = f(self);
461                 self.hir_id_owner = old;
462                 r
463             }
464         }
465
466         impl<'tcx, 'interner> Visitor<'tcx> for MiscCollector<'tcx, 'interner> {
467             fn visit_pat(&mut self, p: &'tcx Pat) {
468                 match p.node {
469                     // Doesn't generate a HIR node
470                     PatKind::Paren(..) | PatKind::Rest => {},
471                     _ => {
472                         if let Some(owner) = self.hir_id_owner {
473                             self.lctx.lower_node_id_with_owner(p.id, owner);
474                         }
475                     }
476                 };
477
478                 visit::walk_pat(self, p)
479             }
480
481             fn visit_item(&mut self, item: &'tcx Item) {
482                 let hir_id = self.lctx.allocate_hir_id_counter(item.id);
483
484                 match item.node {
485                     ItemKind::Struct(_, ref generics)
486                     | ItemKind::Union(_, ref generics)
487                     | ItemKind::Enum(_, ref generics)
488                     | ItemKind::TyAlias(_, ref generics)
489                     | ItemKind::OpaqueTy(_, ref generics)
490                     | ItemKind::Trait(_, _, ref generics, ..) => {
491                         let def_id = self.lctx.resolver.definitions().local_def_id(item.id);
492                         let count = generics
493                             .params
494                             .iter()
495                             .filter(|param| match param.kind {
496                                 ast::GenericParamKind::Lifetime { .. } => true,
497                                 _ => false,
498                             })
499                             .count();
500                         self.lctx.type_def_lifetime_params.insert(def_id, count);
501                     }
502                     ItemKind::Use(ref use_tree) => {
503                         self.allocate_use_tree_hir_id_counters(use_tree, hir_id.owner);
504                     }
505                     _ => {}
506                 }
507
508                 self.with_hir_id_owner(Some(item.id), |this| {
509                     visit::walk_item(this, item);
510                 });
511             }
512
513             fn visit_trait_item(&mut self, item: &'tcx TraitItem) {
514                 self.lctx.allocate_hir_id_counter(item.id);
515
516                 match item.node {
517                     TraitItemKind::Method(_, None) => {
518                         // Ignore patterns in trait methods without bodies
519                         self.with_hir_id_owner(None, |this| {
520                             visit::walk_trait_item(this, item)
521                         });
522                     }
523                     _ => self.with_hir_id_owner(Some(item.id), |this| {
524                         visit::walk_trait_item(this, item);
525                     })
526                 }
527             }
528
529             fn visit_impl_item(&mut self, item: &'tcx ImplItem) {
530                 self.lctx.allocate_hir_id_counter(item.id);
531                 self.with_hir_id_owner(Some(item.id), |this| {
532                     visit::walk_impl_item(this, item);
533                 });
534             }
535
536             fn visit_foreign_item(&mut self, i: &'tcx ForeignItem) {
537                 // Ignore patterns in foreign items
538                 self.with_hir_id_owner(None, |this| {
539                     visit::walk_foreign_item(this, i)
540                 });
541             }
542
543             fn visit_ty(&mut self, t: &'tcx Ty) {
544                 match t.node {
545                     // Mirrors the case in visit::walk_ty
546                     TyKind::BareFn(ref f) => {
547                         walk_list!(
548                             self,
549                             visit_generic_param,
550                             &f.generic_params
551                         );
552                         // Mirrors visit::walk_fn_decl
553                         for argument in &f.decl.inputs {
554                             // We don't lower the ids of argument patterns
555                             self.with_hir_id_owner(None, |this| {
556                                 this.visit_pat(&argument.pat);
557                             });
558                             self.visit_ty(&argument.ty)
559                         }
560                         self.visit_fn_ret_ty(&f.decl.output)
561                     }
562                     _ => visit::walk_ty(self, t),
563                 }
564             }
565         }
566
567         self.lower_node_id(CRATE_NODE_ID);
568         debug_assert!(self.node_id_to_hir_id[CRATE_NODE_ID] == hir::CRATE_HIR_ID);
569
570         visit::walk_crate(&mut MiscCollector { lctx: &mut self, hir_id_owner: None }, c);
571         visit::walk_crate(&mut item::ItemLowerer { lctx: &mut self }, c);
572
573         let module = self.lower_mod(&c.module);
574         let attrs = self.lower_attrs(&c.attrs);
575         let body_ids = body_ids(&self.bodies);
576
577         self.resolver
578             .definitions()
579             .init_node_id_to_hir_id_mapping(self.node_id_to_hir_id);
580
581         hir::Crate {
582             module,
583             attrs,
584             span: c.span,
585             exported_macros: hir::HirVec::from(self.exported_macros),
586             non_exported_macro_attrs: hir::HirVec::from(self.non_exported_macro_attrs),
587             items: self.items,
588             trait_items: self.trait_items,
589             impl_items: self.impl_items,
590             bodies: self.bodies,
591             body_ids,
592             trait_impls: self.trait_impls,
593             modules: self.modules,
594         }
595     }
596
597     fn insert_item(&mut self, item: hir::Item) {
598         let id = item.hir_id;
599         // FIXME: Use `debug_asset-rt`.
600         assert_eq!(id.local_id, hir::ItemLocalId::from_u32(0));
601         self.items.insert(id, item);
602         self.modules.get_mut(&self.current_module).unwrap().items.insert(id);
603     }
604
605     fn allocate_hir_id_counter(&mut self, owner: NodeId) -> hir::HirId {
606         // Set up the counter if needed.
607         self.item_local_id_counters.entry(owner).or_insert(0);
608         // Always allocate the first `HirId` for the owner itself.
609         let lowered = self.lower_node_id_with_owner(owner, owner);
610         debug_assert_eq!(lowered.local_id.as_u32(), 0);
611         lowered
612     }
613
614     fn lower_node_id_generic<F>(&mut self, ast_node_id: NodeId, alloc_hir_id: F) -> hir::HirId
615     where
616         F: FnOnce(&mut Self) -> hir::HirId,
617     {
618         if ast_node_id == DUMMY_NODE_ID {
619             return hir::DUMMY_HIR_ID;
620         }
621
622         let min_size = ast_node_id.as_usize() + 1;
623
624         if min_size > self.node_id_to_hir_id.len() {
625             self.node_id_to_hir_id.resize(min_size, hir::DUMMY_HIR_ID);
626         }
627
628         let existing_hir_id = self.node_id_to_hir_id[ast_node_id];
629
630         if existing_hir_id == hir::DUMMY_HIR_ID {
631             // Generate a new `HirId`.
632             let hir_id = alloc_hir_id(self);
633             self.node_id_to_hir_id[ast_node_id] = hir_id;
634
635             hir_id
636         } else {
637             existing_hir_id
638         }
639     }
640
641     fn with_hir_id_owner<F, T>(&mut self, owner: NodeId, f: F) -> T
642     where
643         F: FnOnce(&mut Self) -> T,
644     {
645         let counter = self.item_local_id_counters
646             .insert(owner, HIR_ID_COUNTER_LOCKED)
647             .unwrap_or_else(|| panic!("no `item_local_id_counters` entry for {:?}", owner));
648         let def_index = self.resolver.definitions().opt_def_index(owner).unwrap();
649         self.current_hir_id_owner.push((def_index, counter));
650         let ret = f(self);
651         let (new_def_index, new_counter) = self.current_hir_id_owner.pop().unwrap();
652
653         debug_assert!(def_index == new_def_index);
654         debug_assert!(new_counter >= counter);
655
656         let prev = self.item_local_id_counters
657             .insert(owner, new_counter)
658             .unwrap();
659         debug_assert!(prev == HIR_ID_COUNTER_LOCKED);
660         ret
661     }
662
663     /// This method allocates a new `HirId` for the given `NodeId` and stores it in
664     /// the `LoweringContext`'s `NodeId => HirId` map.
665     /// Take care not to call this method if the resulting `HirId` is then not
666     /// actually used in the HIR, as that would trigger an assertion in the
667     /// `HirIdValidator` later on, which makes sure that all `NodeId`s got mapped
668     /// properly. Calling the method twice with the same `NodeId` is fine though.
669     fn lower_node_id(&mut self, ast_node_id: NodeId) -> hir::HirId {
670         self.lower_node_id_generic(ast_node_id, |this| {
671             let &mut (def_index, ref mut local_id_counter) =
672                 this.current_hir_id_owner.last_mut().unwrap();
673             let local_id = *local_id_counter;
674             *local_id_counter += 1;
675             hir::HirId {
676                 owner: def_index,
677                 local_id: hir::ItemLocalId::from_u32(local_id),
678             }
679         })
680     }
681
682     fn lower_node_id_with_owner(&mut self, ast_node_id: NodeId, owner: NodeId) -> hir::HirId {
683         self.lower_node_id_generic(ast_node_id, |this| {
684             let local_id_counter = this
685                 .item_local_id_counters
686                 .get_mut(&owner)
687                 .expect("called `lower_node_id_with_owner` before `allocate_hir_id_counter`");
688             let local_id = *local_id_counter;
689
690             // We want to be sure not to modify the counter in the map while it
691             // is also on the stack. Otherwise we'll get lost updates when writing
692             // back from the stack to the map.
693             debug_assert!(local_id != HIR_ID_COUNTER_LOCKED);
694
695             *local_id_counter += 1;
696             let def_index = this
697                 .resolver
698                 .definitions()
699                 .opt_def_index(owner)
700                 .expect("you forgot to call `create_def_with_parent` or are lowering node-IDs \
701                          that do not belong to the current owner");
702
703             hir::HirId {
704                 owner: def_index,
705                 local_id: hir::ItemLocalId::from_u32(local_id),
706             }
707         })
708     }
709
710     fn next_id(&mut self) -> hir::HirId {
711         self.lower_node_id(self.sess.next_node_id())
712     }
713
714     fn lower_res(&mut self, res: Res<NodeId>) -> Res {
715         res.map_id(|id| {
716             self.lower_node_id_generic(id, |_| {
717                 panic!("expected node_id to be lowered already for res {:#?}", res)
718             })
719         })
720     }
721
722     fn expect_full_res(&mut self, id: NodeId) -> Res<NodeId> {
723         self.resolver.get_partial_res(id).map_or(Res::Err, |pr| {
724             if pr.unresolved_segments() != 0 {
725                 bug!("path not fully resolved: {:?}", pr);
726             }
727             pr.base_res()
728         })
729     }
730
731     fn expect_full_res_from_use(&mut self, id: NodeId) -> impl Iterator<Item = Res<NodeId>> {
732         self.resolver.get_import_res(id).present_items()
733     }
734
735     fn diagnostic(&self) -> &errors::Handler {
736         self.sess.diagnostic()
737     }
738
739     /// Reuses the span but adds information like the kind of the desugaring and features that are
740     /// allowed inside this span.
741     fn mark_span_with_reason(
742         &self,
743         reason: DesugaringKind,
744         span: Span,
745         allow_internal_unstable: Option<Lrc<[Symbol]>>,
746     ) -> Span {
747         span.fresh_expansion(ExpnId::root(), ExpnInfo {
748             def_site: span,
749             allow_internal_unstable,
750             ..ExpnInfo::default(ExpnKind::Desugaring(reason), span, self.sess.edition())
751         })
752     }
753
754     fn with_anonymous_lifetime_mode<R>(
755         &mut self,
756         anonymous_lifetime_mode: AnonymousLifetimeMode,
757         op: impl FnOnce(&mut Self) -> R,
758     ) -> R {
759         let old_anonymous_lifetime_mode = self.anonymous_lifetime_mode;
760         self.anonymous_lifetime_mode = anonymous_lifetime_mode;
761         let result = op(self);
762         self.anonymous_lifetime_mode = old_anonymous_lifetime_mode;
763         result
764     }
765
766     /// Creates a new `hir::GenericParam` for every new lifetime and
767     /// type parameter encountered while evaluating `f`. Definitions
768     /// are created with the parent provided. If no `parent_id` is
769     /// provided, no definitions will be returned.
770     ///
771     /// Presuming that in-band lifetimes are enabled, then
772     /// `self.anonymous_lifetime_mode` will be updated to match the
773     /// argument while `f` is running (and restored afterwards).
774     fn collect_in_band_defs<T, F>(
775         &mut self,
776         parent_id: DefId,
777         anonymous_lifetime_mode: AnonymousLifetimeMode,
778         f: F,
779     ) -> (Vec<hir::GenericParam>, T)
780     where
781         F: FnOnce(&mut LoweringContext<'_>) -> (Vec<hir::GenericParam>, T),
782     {
783         assert!(!self.is_collecting_in_band_lifetimes);
784         assert!(self.lifetimes_to_define.is_empty());
785         let old_anonymous_lifetime_mode = self.anonymous_lifetime_mode;
786
787         self.anonymous_lifetime_mode = anonymous_lifetime_mode;
788         self.is_collecting_in_band_lifetimes = true;
789
790         let (in_band_ty_params, res) = f(self);
791
792         self.is_collecting_in_band_lifetimes = false;
793         self.anonymous_lifetime_mode = old_anonymous_lifetime_mode;
794
795         let lifetimes_to_define = self.lifetimes_to_define.split_off(0);
796
797         let params = lifetimes_to_define
798             .into_iter()
799             .map(|(span, hir_name)| self.lifetime_to_generic_param(
800                 span, hir_name, parent_id.index,
801             ))
802             .chain(in_band_ty_params.into_iter())
803             .collect();
804
805         (params, res)
806     }
807
808     /// Converts a lifetime into a new generic parameter.
809     fn lifetime_to_generic_param(
810         &mut self,
811         span: Span,
812         hir_name: ParamName,
813         parent_index: DefIndex,
814     ) -> hir::GenericParam {
815         let node_id = self.sess.next_node_id();
816
817         // Get the name we'll use to make the def-path. Note
818         // that collisions are ok here and this shouldn't
819         // really show up for end-user.
820         let (str_name, kind) = match hir_name {
821             ParamName::Plain(ident) => (
822                 ident.as_interned_str(),
823                 hir::LifetimeParamKind::InBand,
824             ),
825             ParamName::Fresh(_) => (
826                 kw::UnderscoreLifetime.as_interned_str(),
827                 hir::LifetimeParamKind::Elided,
828             ),
829             ParamName::Error => (
830                 kw::UnderscoreLifetime.as_interned_str(),
831                 hir::LifetimeParamKind::Error,
832             ),
833         };
834
835         // Add a definition for the in-band lifetime def.
836         self.resolver.definitions().create_def_with_parent(
837             parent_index,
838             node_id,
839             DefPathData::LifetimeNs(str_name),
840             ExpnId::root(),
841             span,
842         );
843
844         hir::GenericParam {
845             hir_id: self.lower_node_id(node_id),
846             name: hir_name,
847             attrs: hir_vec![],
848             bounds: hir_vec![],
849             span,
850             pure_wrt_drop: false,
851             kind: hir::GenericParamKind::Lifetime { kind }
852         }
853     }
854
855     /// When there is a reference to some lifetime `'a`, and in-band
856     /// lifetimes are enabled, then we want to push that lifetime into
857     /// the vector of names to define later. In that case, it will get
858     /// added to the appropriate generics.
859     fn maybe_collect_in_band_lifetime(&mut self, ident: Ident) {
860         if !self.is_collecting_in_band_lifetimes {
861             return;
862         }
863
864         if !self.sess.features_untracked().in_band_lifetimes {
865             return;
866         }
867
868         if self.in_scope_lifetimes.contains(&ParamName::Plain(ident.modern())) {
869             return;
870         }
871
872         let hir_name = ParamName::Plain(ident);
873
874         if self.lifetimes_to_define.iter()
875                                    .any(|(_, lt_name)| lt_name.modern() == hir_name.modern()) {
876             return;
877         }
878
879         self.lifetimes_to_define.push((ident.span, hir_name));
880     }
881
882     /// When we have either an elided or `'_` lifetime in an impl
883     /// header, we convert it to an in-band lifetime.
884     fn collect_fresh_in_band_lifetime(&mut self, span: Span) -> ParamName {
885         assert!(self.is_collecting_in_band_lifetimes);
886         let index = self.lifetimes_to_define.len();
887         let hir_name = ParamName::Fresh(index);
888         self.lifetimes_to_define.push((span, hir_name));
889         hir_name
890     }
891
892     // Evaluates `f` with the lifetimes in `params` in-scope.
893     // This is used to track which lifetimes have already been defined, and
894     // which are new in-band lifetimes that need to have a definition created
895     // for them.
896     fn with_in_scope_lifetime_defs<T, F>(&mut self, params: &[GenericParam], f: F) -> T
897     where
898         F: FnOnce(&mut LoweringContext<'_>) -> T,
899     {
900         let old_len = self.in_scope_lifetimes.len();
901         let lt_def_names = params.iter().filter_map(|param| match param.kind {
902             GenericParamKind::Lifetime { .. } => Some(ParamName::Plain(param.ident.modern())),
903             _ => None,
904         });
905         self.in_scope_lifetimes.extend(lt_def_names);
906
907         let res = f(self);
908
909         self.in_scope_lifetimes.truncate(old_len);
910         res
911     }
912
913     /// Appends in-band lifetime defs and argument-position `impl
914     /// Trait` defs to the existing set of generics.
915     ///
916     /// Presuming that in-band lifetimes are enabled, then
917     /// `self.anonymous_lifetime_mode` will be updated to match the
918     /// argument while `f` is running (and restored afterwards).
919     fn add_in_band_defs<F, T>(
920         &mut self,
921         generics: &Generics,
922         parent_id: DefId,
923         anonymous_lifetime_mode: AnonymousLifetimeMode,
924         f: F,
925     ) -> (hir::Generics, T)
926     where
927         F: FnOnce(&mut LoweringContext<'_>, &mut Vec<hir::GenericParam>) -> T,
928     {
929         let (in_band_defs, (mut lowered_generics, res)) = self.with_in_scope_lifetime_defs(
930             &generics.params,
931             |this| {
932                 this.collect_in_band_defs(parent_id, anonymous_lifetime_mode, |this| {
933                     let mut params = Vec::new();
934                     // Note: it is necessary to lower generics *before* calling `f`.
935                     // When lowering `async fn`, there's a final step when lowering
936                     // the return type that assumes that all in-scope lifetimes have
937                     // already been added to either `in_scope_lifetimes` or
938                     // `lifetimes_to_define`. If we swapped the order of these two,
939                     // in-band-lifetimes introduced by generics or where-clauses
940                     // wouldn't have been added yet.
941                     let generics = this.lower_generics(
942                         generics,
943                         ImplTraitContext::Universal(&mut params),
944                     );
945                     let res = f(this, &mut params);
946                     (params, (generics, res))
947                 })
948             },
949         );
950
951         let mut lowered_params: Vec<_> = lowered_generics
952             .params
953             .into_iter()
954             .chain(in_band_defs)
955             .collect();
956
957         // FIXME(const_generics): the compiler doesn't always cope with
958         // unsorted generic parameters at the moment, so we make sure
959         // that they're ordered correctly here for now. (When we chain
960         // the `in_band_defs`, we might make the order unsorted.)
961         lowered_params.sort_by_key(|param| {
962             match param.kind {
963                 hir::GenericParamKind::Lifetime { .. } => ParamKindOrd::Lifetime,
964                 hir::GenericParamKind::Type { .. } => ParamKindOrd::Type,
965                 hir::GenericParamKind::Const { .. } => ParamKindOrd::Const,
966             }
967         });
968
969         lowered_generics.params = lowered_params.into();
970
971         (lowered_generics, res)
972     }
973
974     fn with_dyn_type_scope<T, F>(&mut self, in_scope: bool, f: F) -> T
975     where
976         F: FnOnce(&mut LoweringContext<'_>) -> T,
977     {
978         let was_in_dyn_type = self.is_in_dyn_type;
979         self.is_in_dyn_type = in_scope;
980
981         let result = f(self);
982
983         self.is_in_dyn_type = was_in_dyn_type;
984
985         result
986     }
987
988     fn with_new_scopes<T, F>(&mut self, f: F) -> T
989     where
990         F: FnOnce(&mut LoweringContext<'_>) -> T,
991     {
992         let was_in_loop_condition = self.is_in_loop_condition;
993         self.is_in_loop_condition = false;
994
995         let catch_scopes = mem::take(&mut self.catch_scopes);
996         let loop_scopes = mem::take(&mut self.loop_scopes);
997         let ret = f(self);
998         self.catch_scopes = catch_scopes;
999         self.loop_scopes = loop_scopes;
1000
1001         self.is_in_loop_condition = was_in_loop_condition;
1002
1003         ret
1004     }
1005
1006     fn def_key(&mut self, id: DefId) -> DefKey {
1007         if id.is_local() {
1008             self.resolver.definitions().def_key(id.index)
1009         } else {
1010             self.cstore.def_key(id)
1011         }
1012     }
1013
1014     fn lower_attrs_extendable(&mut self, attrs: &[Attribute]) -> Vec<Attribute> {
1015         attrs
1016             .iter()
1017             .map(|a| self.lower_attr(a))
1018             .collect()
1019     }
1020
1021     fn lower_attrs(&mut self, attrs: &[Attribute]) -> hir::HirVec<Attribute> {
1022         self.lower_attrs_extendable(attrs).into()
1023     }
1024
1025     fn lower_attr(&mut self, attr: &Attribute) -> Attribute {
1026         // Note that we explicitly do not walk the path. Since we don't really
1027         // lower attributes (we use the AST version) there is nowhere to keep
1028         // the `HirId`s. We don't actually need HIR version of attributes anyway.
1029         Attribute {
1030             id: attr.id,
1031             style: attr.style,
1032             path: attr.path.clone(),
1033             tokens: self.lower_token_stream(attr.tokens.clone()),
1034             is_sugared_doc: attr.is_sugared_doc,
1035             span: attr.span,
1036         }
1037     }
1038
1039     fn lower_token_stream(&mut self, tokens: TokenStream) -> TokenStream {
1040         tokens
1041             .into_trees()
1042             .flat_map(|tree| self.lower_token_tree(tree).into_trees())
1043             .collect()
1044     }
1045
1046     fn lower_token_tree(&mut self, tree: TokenTree) -> TokenStream {
1047         match tree {
1048             TokenTree::Token(token) => self.lower_token(token),
1049             TokenTree::Delimited(span, delim, tts) => TokenTree::Delimited(
1050                 span,
1051                 delim,
1052                 self.lower_token_stream(tts),
1053             ).into(),
1054         }
1055     }
1056
1057     fn lower_token(&mut self, token: Token) -> TokenStream {
1058         match token.kind {
1059             token::Interpolated(nt) => {
1060                 let tts = nt.to_tokenstream(&self.sess.parse_sess, token.span);
1061                 self.lower_token_stream(tts)
1062             }
1063             _ => TokenTree::Token(token).into(),
1064         }
1065     }
1066
1067     /// Given an associated type constraint like one of these:
1068     ///
1069     /// ```
1070     /// T: Iterator<Item: Debug>
1071     ///             ^^^^^^^^^^^
1072     /// T: Iterator<Item = Debug>
1073     ///             ^^^^^^^^^^^^
1074     /// ```
1075     ///
1076     /// returns a `hir::TypeBinding` representing `Item`.
1077     fn lower_assoc_ty_constraint(&mut self,
1078                                  c: &AssocTyConstraint,
1079                                  itctx: ImplTraitContext<'_>)
1080                                  -> hir::TypeBinding {
1081         debug!("lower_assoc_ty_constraint(constraint={:?}, itctx={:?})", c, itctx);
1082
1083         let kind = match c.kind {
1084             AssocTyConstraintKind::Equality { ref ty } => hir::TypeBindingKind::Equality {
1085                 ty: self.lower_ty(ty, itctx)
1086             },
1087             AssocTyConstraintKind::Bound { ref bounds } => {
1088                 // Piggy-back on the `impl Trait` context to figure out the correct behavior.
1089                 let (desugar_to_impl_trait, itctx) = match itctx {
1090                     // We are in the return position:
1091                     //
1092                     //     fn foo() -> impl Iterator<Item: Debug>
1093                     //
1094                     // so desugar to
1095                     //
1096                     //     fn foo() -> impl Iterator<Item = impl Debug>
1097                     ImplTraitContext::OpaqueTy(_) => (true, itctx),
1098
1099                     // We are in the argument position, but within a dyn type:
1100                     //
1101                     //     fn foo(x: dyn Iterator<Item: Debug>)
1102                     //
1103                     // so desugar to
1104                     //
1105                     //     fn foo(x: dyn Iterator<Item = impl Debug>)
1106                     ImplTraitContext::Universal(_) if self.is_in_dyn_type => (true, itctx),
1107
1108                     // In `type Foo = dyn Iterator<Item: Debug>` we desugar to
1109                     // `type Foo = dyn Iterator<Item = impl Debug>` but we have to override the
1110                     // "impl trait context" to permit `impl Debug` in this position (it desugars
1111                     // then to an opaque type).
1112                     //
1113                     // FIXME: this is only needed until `impl Trait` is allowed in type aliases.
1114                     ImplTraitContext::Disallowed(_) if self.is_in_dyn_type =>
1115                         (true, ImplTraitContext::OpaqueTy(None)),
1116
1117                     // We are in the argument position, but not within a dyn type:
1118                     //
1119                     //     fn foo(x: impl Iterator<Item: Debug>)
1120                     //
1121                     // so we leave it as is and this gets expanded in astconv to a bound like
1122                     // `<T as Iterator>::Item: Debug` where `T` is the type parameter for the
1123                     // `impl Iterator`.
1124                     _ => (false, itctx),
1125                 };
1126
1127                 if desugar_to_impl_trait {
1128                     // Desugar `AssocTy: Bounds` into `AssocTy = impl Bounds`. We do this by
1129                     // constructing the HIR for `impl bounds...` and then lowering that.
1130
1131                     let impl_trait_node_id = self.sess.next_node_id();
1132                     let parent_def_index = self.current_hir_id_owner.last().unwrap().0;
1133                     self.resolver.definitions().create_def_with_parent(
1134                         parent_def_index,
1135                         impl_trait_node_id,
1136                         DefPathData::ImplTrait,
1137                         ExpnId::root(),
1138                         DUMMY_SP
1139                     );
1140
1141                     self.with_dyn_type_scope(false, |this| {
1142                         let ty = this.lower_ty(
1143                             &Ty {
1144                                 id: this.sess.next_node_id(),
1145                                 node: TyKind::ImplTrait(impl_trait_node_id, bounds.clone()),
1146                                 span: DUMMY_SP,
1147                             },
1148                             itctx,
1149                         );
1150
1151                         hir::TypeBindingKind::Equality {
1152                             ty
1153                         }
1154                     })
1155                 } else {
1156                     // Desugar `AssocTy: Bounds` into a type binding where the
1157                     // later desugars into a trait predicate.
1158                     let bounds = self.lower_param_bounds(bounds, itctx);
1159
1160                     hir::TypeBindingKind::Constraint {
1161                         bounds
1162                     }
1163                 }
1164             }
1165         };
1166
1167         hir::TypeBinding {
1168             hir_id: self.lower_node_id(c.id),
1169             ident: c.ident,
1170             kind,
1171             span: c.span,
1172         }
1173     }
1174
1175     fn lower_generic_arg(&mut self,
1176                          arg: &ast::GenericArg,
1177                          itctx: ImplTraitContext<'_>)
1178                          -> hir::GenericArg {
1179         match arg {
1180             ast::GenericArg::Lifetime(lt) => GenericArg::Lifetime(self.lower_lifetime(&lt)),
1181             ast::GenericArg::Type(ty) => GenericArg::Type(self.lower_ty_direct(&ty, itctx)),
1182             ast::GenericArg::Const(ct) => {
1183                 GenericArg::Const(ConstArg {
1184                     value: self.lower_anon_const(&ct),
1185                     span: ct.value.span,
1186                 })
1187             }
1188         }
1189     }
1190
1191     fn lower_ty(&mut self, t: &Ty, itctx: ImplTraitContext<'_>) -> P<hir::Ty> {
1192         P(self.lower_ty_direct(t, itctx))
1193     }
1194
1195     fn lower_path_ty(
1196         &mut self,
1197         t: &Ty,
1198         qself: &Option<QSelf>,
1199         path: &Path,
1200         param_mode: ParamMode,
1201         itctx: ImplTraitContext<'_>
1202     ) -> hir::Ty {
1203         let id = self.lower_node_id(t.id);
1204         let qpath = self.lower_qpath(t.id, qself, path, param_mode, itctx);
1205         let ty = self.ty_path(id, t.span, qpath);
1206         if let hir::TyKind::TraitObject(..) = ty.node {
1207             self.maybe_lint_bare_trait(t.span, t.id, qself.is_none() && path.is_global());
1208         }
1209         ty
1210     }
1211
1212     fn lower_ty_direct(&mut self, t: &Ty, mut itctx: ImplTraitContext<'_>) -> hir::Ty {
1213         let kind = match t.node {
1214             TyKind::Infer => hir::TyKind::Infer,
1215             TyKind::Err => hir::TyKind::Err,
1216             TyKind::Slice(ref ty) => hir::TyKind::Slice(self.lower_ty(ty, itctx)),
1217             TyKind::Ptr(ref mt) => hir::TyKind::Ptr(self.lower_mt(mt, itctx)),
1218             TyKind::Rptr(ref region, ref mt) => {
1219                 let span = self.sess.source_map().next_point(t.span.shrink_to_lo());
1220                 let lifetime = match *region {
1221                     Some(ref lt) => self.lower_lifetime(lt),
1222                     None => self.elided_ref_lifetime(span),
1223                 };
1224                 hir::TyKind::Rptr(lifetime, self.lower_mt(mt, itctx))
1225             }
1226             TyKind::BareFn(ref f) => self.with_in_scope_lifetime_defs(
1227                 &f.generic_params,
1228                 |this| {
1229                     this.with_anonymous_lifetime_mode(
1230                         AnonymousLifetimeMode::PassThrough,
1231                         |this| {
1232                             hir::TyKind::BareFn(P(hir::BareFnTy {
1233                                 generic_params: this.lower_generic_params(
1234                                     &f.generic_params,
1235                                     &NodeMap::default(),
1236                                     ImplTraitContext::disallowed(),
1237                                 ),
1238                                 unsafety: this.lower_unsafety(f.unsafety),
1239                                 abi: f.abi,
1240                                 decl: this.lower_fn_decl(&f.decl, None, false, None),
1241                                 arg_names: this.lower_fn_args_to_names(&f.decl),
1242                             }))
1243                         },
1244                     )
1245                 },
1246             ),
1247             TyKind::Never => hir::TyKind::Never,
1248             TyKind::Tup(ref tys) => {
1249                 hir::TyKind::Tup(tys.iter().map(|ty| {
1250                     self.lower_ty_direct(ty, itctx.reborrow())
1251                 }).collect())
1252             }
1253             TyKind::Paren(ref ty) => {
1254                 return self.lower_ty_direct(ty, itctx);
1255             }
1256             TyKind::Path(ref qself, ref path) => {
1257                 return self.lower_path_ty(t, qself, path, ParamMode::Explicit, itctx);
1258             }
1259             TyKind::ImplicitSelf => {
1260                 let res = self.expect_full_res(t.id);
1261                 let res = self.lower_res(res);
1262                 hir::TyKind::Path(hir::QPath::Resolved(
1263                     None,
1264                     P(hir::Path {
1265                         res,
1266                         segments: hir_vec![hir::PathSegment::from_ident(
1267                             Ident::with_empty_ctxt(kw::SelfUpper)
1268                         )],
1269                         span: t.span,
1270                     }),
1271                 ))
1272             },
1273             TyKind::Array(ref ty, ref length) => {
1274                 hir::TyKind::Array(self.lower_ty(ty, itctx), self.lower_anon_const(length))
1275             }
1276             TyKind::Typeof(ref expr) => {
1277                 hir::TyKind::Typeof(self.lower_anon_const(expr))
1278             }
1279             TyKind::TraitObject(ref bounds, kind) => {
1280                 let mut lifetime_bound = None;
1281                 let (bounds, lifetime_bound) = self.with_dyn_type_scope(true, |this| {
1282                     let bounds = bounds
1283                         .iter()
1284                         .filter_map(|bound| match *bound {
1285                             GenericBound::Trait(ref ty, TraitBoundModifier::None) => {
1286                                 Some(this.lower_poly_trait_ref(ty, itctx.reborrow()))
1287                             }
1288                             GenericBound::Trait(_, TraitBoundModifier::Maybe) => None,
1289                             GenericBound::Outlives(ref lifetime) => {
1290                                 if lifetime_bound.is_none() {
1291                                     lifetime_bound = Some(this.lower_lifetime(lifetime));
1292                                 }
1293                                 None
1294                             }
1295                         })
1296                         .collect();
1297                     let lifetime_bound =
1298                         lifetime_bound.unwrap_or_else(|| this.elided_dyn_bound(t.span));
1299                     (bounds, lifetime_bound)
1300                 });
1301                 if kind != TraitObjectSyntax::Dyn {
1302                     self.maybe_lint_bare_trait(t.span, t.id, false);
1303                 }
1304                 hir::TyKind::TraitObject(bounds, lifetime_bound)
1305             }
1306             TyKind::ImplTrait(def_node_id, ref bounds) => {
1307                 let span = t.span;
1308                 match itctx {
1309                     ImplTraitContext::OpaqueTy(fn_def_id) => {
1310                         self.lower_opaque_impl_trait(
1311                             span, fn_def_id, def_node_id,
1312                             |this| this.lower_param_bounds(bounds, itctx),
1313                         )
1314                     }
1315                     ImplTraitContext::Universal(in_band_ty_params) => {
1316                         // Add a definition for the in-band `Param`.
1317                         let def_index = self
1318                             .resolver
1319                             .definitions()
1320                             .opt_def_index(def_node_id)
1321                             .unwrap();
1322
1323                         let hir_bounds = self.lower_param_bounds(
1324                             bounds,
1325                             ImplTraitContext::Universal(in_band_ty_params),
1326                         );
1327                         // Set the name to `impl Bound1 + Bound2`.
1328                         let ident = Ident::from_str(&pprust::ty_to_string(t)).with_span_pos(span);
1329                         in_band_ty_params.push(hir::GenericParam {
1330                             hir_id: self.lower_node_id(def_node_id),
1331                             name: ParamName::Plain(ident),
1332                             pure_wrt_drop: false,
1333                             attrs: hir_vec![],
1334                             bounds: hir_bounds,
1335                             span,
1336                             kind: hir::GenericParamKind::Type {
1337                                 default: None,
1338                                 synthetic: Some(hir::SyntheticTyParamKind::ImplTrait),
1339                             }
1340                         });
1341
1342                         hir::TyKind::Path(hir::QPath::Resolved(
1343                             None,
1344                             P(hir::Path {
1345                                 span,
1346                                 res: Res::Def(DefKind::TyParam, DefId::local(def_index)),
1347                                 segments: hir_vec![hir::PathSegment::from_ident(ident)],
1348                             }),
1349                         ))
1350                     }
1351                     ImplTraitContext::Disallowed(pos) => {
1352                         let allowed_in = if self.sess.features_untracked()
1353                                                 .impl_trait_in_bindings {
1354                             "bindings or function and inherent method return types"
1355                         } else {
1356                             "function and inherent method return types"
1357                         };
1358                         let mut err = struct_span_err!(
1359                             self.sess,
1360                             t.span,
1361                             E0562,
1362                             "`impl Trait` not allowed outside of {}",
1363                             allowed_in,
1364                         );
1365                         if pos == ImplTraitPosition::Binding &&
1366                             nightly_options::is_nightly_build() {
1367                             help!(err,
1368                                   "add `#![feature(impl_trait_in_bindings)]` to the crate \
1369                                    attributes to enable");
1370                         }
1371                         err.emit();
1372                         hir::TyKind::Err
1373                     }
1374                 }
1375             }
1376             TyKind::Mac(_) => bug!("`TyMac` should have been expanded by now."),
1377             TyKind::CVarArgs => {
1378                 // Create the implicit lifetime of the "spoofed" `VaListImpl`.
1379                 let span = self.sess.source_map().next_point(t.span.shrink_to_lo());
1380                 let lt = self.new_implicit_lifetime(span);
1381                 hir::TyKind::CVarArgs(lt)
1382             },
1383         };
1384
1385         hir::Ty {
1386             node: kind,
1387             span: t.span,
1388             hir_id: self.lower_node_id(t.id),
1389         }
1390     }
1391
1392     fn lower_opaque_impl_trait(
1393         &mut self,
1394         span: Span,
1395         fn_def_id: Option<DefId>,
1396         opaque_ty_node_id: NodeId,
1397         lower_bounds: impl FnOnce(&mut LoweringContext<'_>) -> hir::GenericBounds,
1398     ) -> hir::TyKind {
1399         // Make sure we know that some funky desugaring has been going on here.
1400         // This is a first: there is code in other places like for loop
1401         // desugaring that explicitly states that we don't want to track that.
1402         // Not tracking it makes lints in rustc and clippy very fragile, as
1403         // frequently opened issues show.
1404         let opaque_ty_span = self.mark_span_with_reason(
1405             DesugaringKind::OpaqueTy,
1406             span,
1407             None,
1408         );
1409
1410         let opaque_ty_def_index = self
1411             .resolver
1412             .definitions()
1413             .opt_def_index(opaque_ty_node_id)
1414             .unwrap();
1415
1416         self.allocate_hir_id_counter(opaque_ty_node_id);
1417
1418         let hir_bounds = self.with_hir_id_owner(opaque_ty_node_id, lower_bounds);
1419
1420         let (lifetimes, lifetime_defs) = self.lifetimes_from_impl_trait_bounds(
1421             opaque_ty_node_id,
1422             opaque_ty_def_index,
1423             &hir_bounds,
1424         );
1425
1426         self.with_hir_id_owner(opaque_ty_node_id, |lctx| {
1427             let opaque_ty_item = hir::OpaqueTy {
1428                 generics: hir::Generics {
1429                     params: lifetime_defs,
1430                     where_clause: hir::WhereClause {
1431                         predicates: hir_vec![],
1432                         span,
1433                     },
1434                     span,
1435                 },
1436                 bounds: hir_bounds,
1437                 impl_trait_fn: fn_def_id,
1438                 origin: hir::OpaqueTyOrigin::FnReturn,
1439             };
1440
1441             trace!("exist ty from impl trait def-index: {:#?}", opaque_ty_def_index);
1442             let opaque_ty_id = lctx.generate_opaque_type(
1443                 opaque_ty_node_id,
1444                 opaque_ty_item,
1445                 span,
1446                 opaque_ty_span,
1447             );
1448
1449             // `impl Trait` now just becomes `Foo<'a, 'b, ..>`.
1450             hir::TyKind::Def(hir::ItemId { id: opaque_ty_id }, lifetimes)
1451         })
1452     }
1453
1454     /// Registers a new opaque type with the proper `NodeId`s and
1455     /// returns the lowered node-ID for the opaque type.
1456     fn generate_opaque_type(
1457         &mut self,
1458         opaque_ty_node_id: NodeId,
1459         opaque_ty_item: hir::OpaqueTy,
1460         span: Span,
1461         opaque_ty_span: Span,
1462     ) -> hir::HirId {
1463         let opaque_ty_item_kind = hir::ItemKind::OpaqueTy(opaque_ty_item);
1464         let opaque_ty_id = self.lower_node_id(opaque_ty_node_id);
1465         // Generate an `type Foo = impl Trait;` declaration.
1466         trace!("registering opaque type with id {:#?}", opaque_ty_id);
1467         let opaque_ty_item = hir::Item {
1468             hir_id: opaque_ty_id,
1469             ident: Ident::invalid(),
1470             attrs: Default::default(),
1471             node: opaque_ty_item_kind,
1472             vis: respan(span.shrink_to_lo(), hir::VisibilityKind::Inherited),
1473             span: opaque_ty_span,
1474         };
1475
1476         // Insert the item into the global item list. This usually happens
1477         // automatically for all AST items. But this opaque type item
1478         // does not actually exist in the AST.
1479         self.insert_item(opaque_ty_item);
1480         opaque_ty_id
1481     }
1482
1483     fn lifetimes_from_impl_trait_bounds(
1484         &mut self,
1485         opaque_ty_id: NodeId,
1486         parent_index: DefIndex,
1487         bounds: &hir::GenericBounds,
1488     ) -> (HirVec<hir::GenericArg>, HirVec<hir::GenericParam>) {
1489         // This visitor walks over `impl Trait` bounds and creates defs for all lifetimes that
1490         // appear in the bounds, excluding lifetimes that are created within the bounds.
1491         // E.g., `'a`, `'b`, but not `'c` in `impl for<'c> SomeTrait<'a, 'b, 'c>`.
1492         struct ImplTraitLifetimeCollector<'r, 'a> {
1493             context: &'r mut LoweringContext<'a>,
1494             parent: DefIndex,
1495             opaque_ty_id: NodeId,
1496             collect_elided_lifetimes: bool,
1497             currently_bound_lifetimes: Vec<hir::LifetimeName>,
1498             already_defined_lifetimes: FxHashSet<hir::LifetimeName>,
1499             output_lifetimes: Vec<hir::GenericArg>,
1500             output_lifetime_params: Vec<hir::GenericParam>,
1501         }
1502
1503         impl<'r, 'a, 'v> hir::intravisit::Visitor<'v> for ImplTraitLifetimeCollector<'r, 'a> {
1504             fn nested_visit_map<'this>(
1505                 &'this mut self,
1506             ) -> hir::intravisit::NestedVisitorMap<'this, 'v> {
1507                 hir::intravisit::NestedVisitorMap::None
1508             }
1509
1510             fn visit_generic_args(&mut self, span: Span, parameters: &'v hir::GenericArgs) {
1511                 // Don't collect elided lifetimes used inside of `Fn()` syntax.
1512                 if parameters.parenthesized {
1513                     let old_collect_elided_lifetimes = self.collect_elided_lifetimes;
1514                     self.collect_elided_lifetimes = false;
1515                     hir::intravisit::walk_generic_args(self, span, parameters);
1516                     self.collect_elided_lifetimes = old_collect_elided_lifetimes;
1517                 } else {
1518                     hir::intravisit::walk_generic_args(self, span, parameters);
1519                 }
1520             }
1521
1522             fn visit_ty(&mut self, t: &'v hir::Ty) {
1523                 // Don't collect elided lifetimes used inside of `fn()` syntax.
1524                 if let hir::TyKind::BareFn(_) = t.node {
1525                     let old_collect_elided_lifetimes = self.collect_elided_lifetimes;
1526                     self.collect_elided_lifetimes = false;
1527
1528                     // Record the "stack height" of `for<'a>` lifetime bindings
1529                     // to be able to later fully undo their introduction.
1530                     let old_len = self.currently_bound_lifetimes.len();
1531                     hir::intravisit::walk_ty(self, t);
1532                     self.currently_bound_lifetimes.truncate(old_len);
1533
1534                     self.collect_elided_lifetimes = old_collect_elided_lifetimes;
1535                 } else {
1536                     hir::intravisit::walk_ty(self, t)
1537                 }
1538             }
1539
1540             fn visit_poly_trait_ref(
1541                 &mut self,
1542                 trait_ref: &'v hir::PolyTraitRef,
1543                 modifier: hir::TraitBoundModifier,
1544             ) {
1545                 // Record the "stack height" of `for<'a>` lifetime bindings
1546                 // to be able to later fully undo their introduction.
1547                 let old_len = self.currently_bound_lifetimes.len();
1548                 hir::intravisit::walk_poly_trait_ref(self, trait_ref, modifier);
1549                 self.currently_bound_lifetimes.truncate(old_len);
1550             }
1551
1552             fn visit_generic_param(&mut self, param: &'v hir::GenericParam) {
1553                 // Record the introduction of 'a in `for<'a> ...`.
1554                 if let hir::GenericParamKind::Lifetime { .. } = param.kind {
1555                     // Introduce lifetimes one at a time so that we can handle
1556                     // cases like `fn foo<'d>() -> impl for<'a, 'b: 'a, 'c: 'b + 'd>`.
1557                     let lt_name = hir::LifetimeName::Param(param.name);
1558                     self.currently_bound_lifetimes.push(lt_name);
1559                 }
1560
1561                 hir::intravisit::walk_generic_param(self, param);
1562             }
1563
1564             fn visit_lifetime(&mut self, lifetime: &'v hir::Lifetime) {
1565                 let name = match lifetime.name {
1566                     hir::LifetimeName::Implicit | hir::LifetimeName::Underscore => {
1567                         if self.collect_elided_lifetimes {
1568                             // Use `'_` for both implicit and underscore lifetimes in
1569                             // `type Foo<'_> = impl SomeTrait<'_>;`.
1570                             hir::LifetimeName::Underscore
1571                         } else {
1572                             return;
1573                         }
1574                     }
1575                     hir::LifetimeName::Param(_) => lifetime.name,
1576                     hir::LifetimeName::Error | hir::LifetimeName::Static => return,
1577                 };
1578
1579                 if !self.currently_bound_lifetimes.contains(&name)
1580                     && !self.already_defined_lifetimes.contains(&name) {
1581                     self.already_defined_lifetimes.insert(name);
1582
1583                     self.output_lifetimes.push(hir::GenericArg::Lifetime(hir::Lifetime {
1584                         hir_id: self.context.next_id(),
1585                         span: lifetime.span,
1586                         name,
1587                     }));
1588
1589                     let def_node_id = self.context.sess.next_node_id();
1590                     let hir_id =
1591                         self.context.lower_node_id_with_owner(def_node_id, self.opaque_ty_id);
1592                     self.context.resolver.definitions().create_def_with_parent(
1593                         self.parent,
1594                         def_node_id,
1595                         DefPathData::LifetimeNs(name.ident().as_interned_str()),
1596                         ExpnId::root(),
1597                         lifetime.span);
1598
1599                     let (name, kind) = match name {
1600                         hir::LifetimeName::Underscore => (
1601                             hir::ParamName::Plain(Ident::with_empty_ctxt(kw::UnderscoreLifetime)),
1602                             hir::LifetimeParamKind::Elided,
1603                         ),
1604                         hir::LifetimeName::Param(param_name) => (
1605                             param_name,
1606                             hir::LifetimeParamKind::Explicit,
1607                         ),
1608                         _ => bug!("expected `LifetimeName::Param` or `ParamName::Plain`"),
1609                     };
1610
1611                     self.output_lifetime_params.push(hir::GenericParam {
1612                         hir_id,
1613                         name,
1614                         span: lifetime.span,
1615                         pure_wrt_drop: false,
1616                         attrs: hir_vec![],
1617                         bounds: hir_vec![],
1618                         kind: hir::GenericParamKind::Lifetime { kind }
1619                     });
1620                 }
1621             }
1622         }
1623
1624         let mut lifetime_collector = ImplTraitLifetimeCollector {
1625             context: self,
1626             parent: parent_index,
1627             opaque_ty_id,
1628             collect_elided_lifetimes: true,
1629             currently_bound_lifetimes: Vec::new(),
1630             already_defined_lifetimes: FxHashSet::default(),
1631             output_lifetimes: Vec::new(),
1632             output_lifetime_params: Vec::new(),
1633         };
1634
1635         for bound in bounds {
1636             hir::intravisit::walk_param_bound(&mut lifetime_collector, &bound);
1637         }
1638
1639         (
1640             lifetime_collector.output_lifetimes.into(),
1641             lifetime_collector.output_lifetime_params.into(),
1642         )
1643     }
1644
1645     fn lower_qpath(
1646         &mut self,
1647         id: NodeId,
1648         qself: &Option<QSelf>,
1649         p: &Path,
1650         param_mode: ParamMode,
1651         mut itctx: ImplTraitContext<'_>,
1652     ) -> hir::QPath {
1653         let qself_position = qself.as_ref().map(|q| q.position);
1654         let qself = qself.as_ref().map(|q| self.lower_ty(&q.ty, itctx.reborrow()));
1655
1656         let partial_res = self.resolver
1657             .get_partial_res(id)
1658             .unwrap_or_else(|| PartialRes::new(Res::Err));
1659
1660         let proj_start = p.segments.len() - partial_res.unresolved_segments();
1661         let path = P(hir::Path {
1662             res: self.lower_res(partial_res.base_res()),
1663             segments: p.segments[..proj_start]
1664                 .iter()
1665                 .enumerate()
1666                 .map(|(i, segment)| {
1667                     let param_mode = match (qself_position, param_mode) {
1668                         (Some(j), ParamMode::Optional) if i < j => {
1669                             // This segment is part of the trait path in a
1670                             // qualified path - one of `a`, `b` or `Trait`
1671                             // in `<X as a::b::Trait>::T::U::method`.
1672                             ParamMode::Explicit
1673                         }
1674                         _ => param_mode,
1675                     };
1676
1677                     // Figure out if this is a type/trait segment,
1678                     // which may need lifetime elision performed.
1679                     let parent_def_id = |this: &mut Self, def_id: DefId| DefId {
1680                         krate: def_id.krate,
1681                         index: this.def_key(def_id).parent.expect("missing parent"),
1682                     };
1683                     let type_def_id = match partial_res.base_res() {
1684                         Res::Def(DefKind::AssocTy, def_id) if i + 2 == proj_start => {
1685                             Some(parent_def_id(self, def_id))
1686                         }
1687                         Res::Def(DefKind::Variant, def_id) if i + 1 == proj_start => {
1688                             Some(parent_def_id(self, def_id))
1689                         }
1690                         Res::Def(DefKind::Struct, def_id)
1691                         | Res::Def(DefKind::Union, def_id)
1692                         | Res::Def(DefKind::Enum, def_id)
1693                         | Res::Def(DefKind::TyAlias, def_id)
1694                         | Res::Def(DefKind::Trait, def_id) if i + 1 == proj_start =>
1695                         {
1696                             Some(def_id)
1697                         }
1698                         _ => None,
1699                     };
1700                     let parenthesized_generic_args = match partial_res.base_res() {
1701                         // `a::b::Trait(Args)`
1702                         Res::Def(DefKind::Trait, _)
1703                             if i + 1 == proj_start => ParenthesizedGenericArgs::Ok,
1704                         // `a::b::Trait(Args)::TraitItem`
1705                         Res::Def(DefKind::Method, _)
1706                         | Res::Def(DefKind::AssocConst, _)
1707                         | Res::Def(DefKind::AssocTy, _)
1708                             if i + 2 == proj_start =>
1709                         {
1710                             ParenthesizedGenericArgs::Ok
1711                         }
1712                         // Avoid duplicated errors.
1713                         Res::Err => ParenthesizedGenericArgs::Ok,
1714                         // An error
1715                         Res::Def(DefKind::Struct, _)
1716                         | Res::Def(DefKind::Enum, _)
1717                         | Res::Def(DefKind::Union, _)
1718                         | Res::Def(DefKind::TyAlias, _)
1719                         | Res::Def(DefKind::Variant, _) if i + 1 == proj_start =>
1720                         {
1721                             ParenthesizedGenericArgs::Err
1722                         }
1723                         // A warning for now, for compatibility reasons.
1724                         _ => ParenthesizedGenericArgs::Warn,
1725                     };
1726
1727                     let num_lifetimes = type_def_id.map_or(0, |def_id| {
1728                         if let Some(&n) = self.type_def_lifetime_params.get(&def_id) {
1729                             return n;
1730                         }
1731                         assert!(!def_id.is_local());
1732                         let item_generics =
1733                             self.cstore.item_generics_cloned_untracked(def_id, self.sess);
1734                         let n = item_generics.own_counts().lifetimes;
1735                         self.type_def_lifetime_params.insert(def_id, n);
1736                         n
1737                     });
1738                     self.lower_path_segment(
1739                         p.span,
1740                         segment,
1741                         param_mode,
1742                         num_lifetimes,
1743                         parenthesized_generic_args,
1744                         itctx.reborrow(),
1745                         None,
1746                     )
1747                 })
1748                 .collect(),
1749             span: p.span,
1750         });
1751
1752         // Simple case, either no projections, or only fully-qualified.
1753         // E.g., `std::mem::size_of` or `<I as Iterator>::Item`.
1754         if partial_res.unresolved_segments() == 0 {
1755             return hir::QPath::Resolved(qself, path);
1756         }
1757
1758         // Create the innermost type that we're projecting from.
1759         let mut ty = if path.segments.is_empty() {
1760             // If the base path is empty that means there exists a
1761             // syntactical `Self`, e.g., `&i32` in `<&i32>::clone`.
1762             qself.expect("missing QSelf for <T>::...")
1763         } else {
1764             // Otherwise, the base path is an implicit `Self` type path,
1765             // e.g., `Vec` in `Vec::new` or `<I as Iterator>::Item` in
1766             // `<I as Iterator>::Item::default`.
1767             let new_id = self.next_id();
1768             P(self.ty_path(new_id, p.span, hir::QPath::Resolved(qself, path)))
1769         };
1770
1771         // Anything after the base path are associated "extensions",
1772         // out of which all but the last one are associated types,
1773         // e.g., for `std::vec::Vec::<T>::IntoIter::Item::clone`:
1774         // * base path is `std::vec::Vec<T>`
1775         // * "extensions" are `IntoIter`, `Item` and `clone`
1776         // * type nodes are:
1777         //   1. `std::vec::Vec<T>` (created above)
1778         //   2. `<std::vec::Vec<T>>::IntoIter`
1779         //   3. `<<std::vec::Vec<T>>::IntoIter>::Item`
1780         // * final path is `<<<std::vec::Vec<T>>::IntoIter>::Item>::clone`
1781         for (i, segment) in p.segments.iter().enumerate().skip(proj_start) {
1782             let segment = P(self.lower_path_segment(
1783                 p.span,
1784                 segment,
1785                 param_mode,
1786                 0,
1787                 ParenthesizedGenericArgs::Warn,
1788                 itctx.reborrow(),
1789                 None,
1790             ));
1791             let qpath = hir::QPath::TypeRelative(ty, segment);
1792
1793             // It's finished, return the extension of the right node type.
1794             if i == p.segments.len() - 1 {
1795                 return qpath;
1796             }
1797
1798             // Wrap the associated extension in another type node.
1799             let new_id = self.next_id();
1800             ty = P(self.ty_path(new_id, p.span, qpath));
1801         }
1802
1803         // We should've returned in the for loop above.
1804         span_bug!(
1805             p.span,
1806             "lower_qpath: no final extension segment in {}..{}",
1807             proj_start,
1808             p.segments.len()
1809         )
1810     }
1811
1812     fn lower_path_extra(
1813         &mut self,
1814         res: Res,
1815         p: &Path,
1816         param_mode: ParamMode,
1817         explicit_owner: Option<NodeId>,
1818     ) -> hir::Path {
1819         hir::Path {
1820             res,
1821             segments: p.segments
1822                 .iter()
1823                 .map(|segment| {
1824                     self.lower_path_segment(
1825                         p.span,
1826                         segment,
1827                         param_mode,
1828                         0,
1829                         ParenthesizedGenericArgs::Err,
1830                         ImplTraitContext::disallowed(),
1831                         explicit_owner,
1832                     )
1833                 })
1834                 .collect(),
1835             span: p.span,
1836         }
1837     }
1838
1839     fn lower_path(&mut self, id: NodeId, p: &Path, param_mode: ParamMode) -> hir::Path {
1840         let res = self.expect_full_res(id);
1841         let res = self.lower_res(res);
1842         self.lower_path_extra(res, p, param_mode, None)
1843     }
1844
1845     fn lower_path_segment(
1846         &mut self,
1847         path_span: Span,
1848         segment: &PathSegment,
1849         param_mode: ParamMode,
1850         expected_lifetimes: usize,
1851         parenthesized_generic_args: ParenthesizedGenericArgs,
1852         itctx: ImplTraitContext<'_>,
1853         explicit_owner: Option<NodeId>,
1854     ) -> hir::PathSegment {
1855         let (mut generic_args, infer_args) = if let Some(ref generic_args) = segment.args {
1856             let msg = "parenthesized type parameters may only be used with a `Fn` trait";
1857             match **generic_args {
1858                 GenericArgs::AngleBracketed(ref data) => {
1859                     self.lower_angle_bracketed_parameter_data(data, param_mode, itctx)
1860                 }
1861                 GenericArgs::Parenthesized(ref data) => match parenthesized_generic_args {
1862                     ParenthesizedGenericArgs::Ok => self.lower_parenthesized_parameter_data(data),
1863                     ParenthesizedGenericArgs::Warn => {
1864                         self.sess.buffer_lint(
1865                             PARENTHESIZED_PARAMS_IN_TYPES_AND_MODULES,
1866                             CRATE_NODE_ID,
1867                             data.span,
1868                             msg.into(),
1869                         );
1870                         (hir::GenericArgs::none(), true)
1871                     }
1872                     ParenthesizedGenericArgs::Err => {
1873                         let mut err = struct_span_err!(self.sess, data.span, E0214, "{}", msg);
1874                         err.span_label(data.span, "only `Fn` traits may use parentheses");
1875                         if let Ok(snippet) = self.sess.source_map().span_to_snippet(data.span) {
1876                             // Do not suggest going from `Trait()` to `Trait<>`
1877                             if data.inputs.len() > 0 {
1878                                 err.span_suggestion(
1879                                     data.span,
1880                                     "use angle brackets instead",
1881                                     format!("<{}>", &snippet[1..snippet.len() - 1]),
1882                                     Applicability::MaybeIncorrect,
1883                                 );
1884                             }
1885                         };
1886                         err.emit();
1887                         (
1888                             self.lower_angle_bracketed_parameter_data(
1889                                 &data.as_angle_bracketed_args(),
1890                                 param_mode,
1891                                 itctx
1892                             ).0,
1893                             false,
1894                         )
1895                     }
1896                 },
1897             }
1898         } else {
1899             self.lower_angle_bracketed_parameter_data(&Default::default(), param_mode, itctx)
1900         };
1901
1902         let has_lifetimes = generic_args.args.iter().any(|arg| match arg {
1903             GenericArg::Lifetime(_) => true,
1904             _ => false,
1905         });
1906         let first_generic_span = generic_args.args.iter().map(|a| a.span())
1907             .chain(generic_args.bindings.iter().map(|b| b.span)).next();
1908         if !generic_args.parenthesized && !has_lifetimes {
1909             generic_args.args =
1910                 self.elided_path_lifetimes(path_span, expected_lifetimes)
1911                     .into_iter()
1912                     .map(|lt| GenericArg::Lifetime(lt))
1913                     .chain(generic_args.args.into_iter())
1914                 .collect();
1915             if expected_lifetimes > 0 && param_mode == ParamMode::Explicit {
1916                 let anon_lt_suggestion = vec!["'_"; expected_lifetimes].join(", ");
1917                 let no_non_lt_args = generic_args.args.len() == expected_lifetimes;
1918                 let no_bindings = generic_args.bindings.is_empty();
1919                 let (incl_angl_brckt, insertion_sp, suggestion) = if no_non_lt_args && no_bindings {
1920                     // If there are no (non-implicit) generic args or associated type
1921                     // bindings, our suggestion includes the angle brackets.
1922                     (true, path_span.shrink_to_hi(), format!("<{}>", anon_lt_suggestion))
1923                 } else {
1924                     // Otherwise (sorry, this is kind of gross) we need to infer the
1925                     // place to splice in the `'_, ` from the generics that do exist.
1926                     let first_generic_span = first_generic_span
1927                         .expect("already checked that non-lifetime args or bindings exist");
1928                     (false, first_generic_span.shrink_to_lo(), format!("{}, ", anon_lt_suggestion))
1929                 };
1930                 match self.anonymous_lifetime_mode {
1931                     // In create-parameter mode we error here because we don't want to support
1932                     // deprecated impl elision in new features like impl elision and `async fn`,
1933                     // both of which work using the `CreateParameter` mode:
1934                     //
1935                     //     impl Foo for std::cell::Ref<u32> // note lack of '_
1936                     //     async fn foo(_: std::cell::Ref<u32>) { ... }
1937                     AnonymousLifetimeMode::CreateParameter => {
1938                         let mut err = struct_span_err!(
1939                             self.sess,
1940                             path_span,
1941                             E0726,
1942                             "implicit elided lifetime not allowed here"
1943                         );
1944                         crate::lint::builtin::add_elided_lifetime_in_path_suggestion(
1945                             &self.sess,
1946                             &mut err,
1947                             expected_lifetimes,
1948                             path_span,
1949                             incl_angl_brckt,
1950                             insertion_sp,
1951                             suggestion,
1952                         );
1953                         err.emit();
1954                     }
1955                     AnonymousLifetimeMode::PassThrough |
1956                     AnonymousLifetimeMode::ReportError |
1957                     AnonymousLifetimeMode::Replace(_) => {
1958                         self.sess.buffer_lint_with_diagnostic(
1959                             ELIDED_LIFETIMES_IN_PATHS,
1960                             CRATE_NODE_ID,
1961                             path_span,
1962                             "hidden lifetime parameters in types are deprecated",
1963                             builtin::BuiltinLintDiagnostics::ElidedLifetimesInPaths(
1964                                 expected_lifetimes,
1965                                 path_span,
1966                                 incl_angl_brckt,
1967                                 insertion_sp,
1968                                 suggestion,
1969                             )
1970                         );
1971                     }
1972                 }
1973             }
1974         }
1975
1976         let res = self.expect_full_res(segment.id);
1977         let id = if let Some(owner) = explicit_owner {
1978             self.lower_node_id_with_owner(segment.id, owner)
1979         } else {
1980             self.lower_node_id(segment.id)
1981         };
1982         debug!(
1983             "lower_path_segment: ident={:?} original-id={:?} new-id={:?}",
1984             segment.ident, segment.id, id,
1985         );
1986
1987         hir::PathSegment::new(
1988             segment.ident,
1989             Some(id),
1990             Some(self.lower_res(res)),
1991             generic_args,
1992             infer_args,
1993         )
1994     }
1995
1996     fn lower_angle_bracketed_parameter_data(
1997         &mut self,
1998         data: &AngleBracketedArgs,
1999         param_mode: ParamMode,
2000         mut itctx: ImplTraitContext<'_>,
2001     ) -> (hir::GenericArgs, bool) {
2002         let &AngleBracketedArgs { ref args, ref constraints, .. } = data;
2003         let has_non_lt_args = args.iter().any(|arg| match arg {
2004             ast::GenericArg::Lifetime(_) => false,
2005             ast::GenericArg::Type(_) => true,
2006             ast::GenericArg::Const(_) => true,
2007         });
2008         (
2009             hir::GenericArgs {
2010                 args: args.iter().map(|a| self.lower_generic_arg(a, itctx.reborrow())).collect(),
2011                 bindings: constraints.iter()
2012                     .map(|b| self.lower_assoc_ty_constraint(b, itctx.reborrow()))
2013                     .collect(),
2014                 parenthesized: false,
2015             },
2016             !has_non_lt_args && param_mode == ParamMode::Optional
2017         )
2018     }
2019
2020     fn lower_parenthesized_parameter_data(
2021         &mut self,
2022         data: &ParenthesizedArgs,
2023     ) -> (hir::GenericArgs, bool) {
2024         // Switch to `PassThrough` mode for anonymous lifetimes; this
2025         // means that we permit things like `&Ref<T>`, where `Ref` has
2026         // a hidden lifetime parameter. This is needed for backwards
2027         // compatibility, even in contexts like an impl header where
2028         // we generally don't permit such things (see #51008).
2029         self.with_anonymous_lifetime_mode(
2030             AnonymousLifetimeMode::PassThrough,
2031             |this| {
2032                 let &ParenthesizedArgs { ref inputs, ref output, span } = data;
2033                 let inputs = inputs
2034                     .iter()
2035                     .map(|ty| this.lower_ty_direct(ty, ImplTraitContext::disallowed()))
2036                     .collect();
2037                 let mk_tup = |this: &mut Self, tys, span| {
2038                     hir::Ty { node: hir::TyKind::Tup(tys), hir_id: this.next_id(), span }
2039                 };
2040                 (
2041                     hir::GenericArgs {
2042                         args: hir_vec![GenericArg::Type(mk_tup(this, inputs, span))],
2043                         bindings: hir_vec![
2044                             hir::TypeBinding {
2045                                 hir_id: this.next_id(),
2046                                 ident: Ident::with_empty_ctxt(FN_OUTPUT_NAME),
2047                                 kind: hir::TypeBindingKind::Equality {
2048                                     ty: output
2049                                         .as_ref()
2050                                         .map(|ty| this.lower_ty(
2051                                             &ty,
2052                                             ImplTraitContext::disallowed()
2053                                         ))
2054                                         .unwrap_or_else(||
2055                                             P(mk_tup(this, hir::HirVec::new(), span))
2056                                         ),
2057                                 },
2058                                 span: output.as_ref().map_or(span, |ty| ty.span),
2059                             }
2060                         ],
2061                         parenthesized: true,
2062                     },
2063                     false,
2064                 )
2065             }
2066         )
2067     }
2068
2069     fn lower_local(&mut self, l: &Local) -> (hir::Local, SmallVec<[NodeId; 1]>) {
2070         let mut ids = SmallVec::<[NodeId; 1]>::new();
2071         if self.sess.features_untracked().impl_trait_in_bindings {
2072             if let Some(ref ty) = l.ty {
2073                 let mut visitor = ImplTraitTypeIdVisitor { ids: &mut ids };
2074                 visitor.visit_ty(ty);
2075             }
2076         }
2077         let parent_def_id = DefId::local(self.current_hir_id_owner.last().unwrap().0);
2078         (hir::Local {
2079             hir_id: self.lower_node_id(l.id),
2080             ty: l.ty
2081                 .as_ref()
2082                 .map(|t| self.lower_ty(t,
2083                     if self.sess.features_untracked().impl_trait_in_bindings {
2084                         ImplTraitContext::OpaqueTy(Some(parent_def_id))
2085                     } else {
2086                         ImplTraitContext::Disallowed(ImplTraitPosition::Binding)
2087                     }
2088                 )),
2089             pat: self.lower_pat(&l.pat),
2090             init: l.init.as_ref().map(|e| P(self.lower_expr(e))),
2091             span: l.span,
2092             attrs: l.attrs.clone(),
2093             source: hir::LocalSource::Normal,
2094         }, ids)
2095     }
2096
2097     fn lower_mutability(&mut self, m: Mutability) -> hir::Mutability {
2098         match m {
2099             Mutability::Mutable => hir::MutMutable,
2100             Mutability::Immutable => hir::MutImmutable,
2101         }
2102     }
2103
2104     fn lower_fn_args_to_names(&mut self, decl: &FnDecl) -> hir::HirVec<Ident> {
2105         decl.inputs
2106             .iter()
2107             .map(|arg| match arg.pat.node {
2108                 PatKind::Ident(_, ident, _) => ident,
2109                 _ => Ident::new(kw::Invalid, arg.pat.span),
2110             })
2111             .collect()
2112     }
2113
2114     // Lowers a function declaration.
2115     //
2116     // `decl`: the unlowered (AST) function declaration.
2117     // `fn_def_id`: if `Some`, impl Trait arguments are lowered into generic parameters on the
2118     //      given DefId, otherwise impl Trait is disallowed. Must be `Some` if
2119     //      `make_ret_async` is also `Some`.
2120     // `impl_trait_return_allow`: determines whether `impl Trait` can be used in return position.
2121     //      This guards against trait declarations and implementations where `impl Trait` is
2122     //      disallowed.
2123     // `make_ret_async`: if `Some`, converts `-> T` into `-> impl Future<Output = T>` in the
2124     //      return type. This is used for `async fn` declarations. The `NodeId` is the ID of the
2125     //      return type `impl Trait` item.
2126     fn lower_fn_decl(
2127         &mut self,
2128         decl: &FnDecl,
2129         mut in_band_ty_params: Option<(DefId, &mut Vec<hir::GenericParam>)>,
2130         impl_trait_return_allow: bool,
2131         make_ret_async: Option<NodeId>,
2132     ) -> P<hir::FnDecl> {
2133         let lt_mode = if make_ret_async.is_some() {
2134             // In `async fn`, argument-position elided lifetimes
2135             // must be transformed into fresh generic parameters so that
2136             // they can be applied to the opaque `impl Trait` return type.
2137             AnonymousLifetimeMode::CreateParameter
2138         } else {
2139             self.anonymous_lifetime_mode
2140         };
2141
2142         // Remember how many lifetimes were already around so that we can
2143         // only look at the lifetime parameters introduced by the arguments.
2144         let lifetime_count_before_args = self.lifetimes_to_define.len();
2145         let inputs = self.with_anonymous_lifetime_mode(lt_mode, |this| {
2146             decl.inputs
2147                 .iter()
2148                 .map(|arg| {
2149                     if let Some((_, ibty)) = &mut in_band_ty_params {
2150                         this.lower_ty_direct(&arg.ty, ImplTraitContext::Universal(ibty))
2151                     } else {
2152                         this.lower_ty_direct(&arg.ty, ImplTraitContext::disallowed())
2153                     }
2154                 })
2155                 .collect::<HirVec<_>>()
2156         });
2157
2158         let output = if let Some(ret_id) = make_ret_async {
2159             // Calculate the `LtReplacement` to use for any return-position elided
2160             // lifetimes based on the elided lifetime parameters introduced in the args.
2161             let lt_replacement = get_elided_lt_replacement(
2162                 &self.lifetimes_to_define[lifetime_count_before_args..]
2163             );
2164             self.lower_async_fn_ret_ty(
2165                 &decl.output,
2166                 in_band_ty_params.expect("`make_ret_async` but no `fn_def_id`").0,
2167                 ret_id,
2168                 lt_replacement,
2169             )
2170         } else {
2171             match decl.output {
2172                 FunctionRetTy::Ty(ref ty) => match in_band_ty_params {
2173                     Some((def_id, _)) if impl_trait_return_allow => {
2174                         hir::Return(self.lower_ty(ty,
2175                             ImplTraitContext::OpaqueTy(Some(def_id))
2176                         ))
2177                     }
2178                     _ => {
2179                         hir::Return(self.lower_ty(ty, ImplTraitContext::disallowed()))
2180                     }
2181                 },
2182                 FunctionRetTy::Default(span) => hir::DefaultReturn(span),
2183             }
2184         };
2185
2186         P(hir::FnDecl {
2187             inputs,
2188             output,
2189             c_variadic: decl.c_variadic,
2190             implicit_self: decl.inputs.get(0).map_or(
2191                 hir::ImplicitSelfKind::None,
2192                 |arg| {
2193                     let is_mutable_pat = match arg.pat.node {
2194                         PatKind::Ident(BindingMode::ByValue(mt), _, _) |
2195                         PatKind::Ident(BindingMode::ByRef(mt), _, _) =>
2196                             mt == Mutability::Mutable,
2197                         _ => false,
2198                     };
2199
2200                     match arg.ty.node {
2201                         TyKind::ImplicitSelf if is_mutable_pat => hir::ImplicitSelfKind::Mut,
2202                         TyKind::ImplicitSelf => hir::ImplicitSelfKind::Imm,
2203                         // Given we are only considering `ImplicitSelf` types, we needn't consider
2204                         // the case where we have a mutable pattern to a reference as that would
2205                         // no longer be an `ImplicitSelf`.
2206                         TyKind::Rptr(_, ref mt) if mt.ty.node.is_implicit_self() &&
2207                             mt.mutbl == ast::Mutability::Mutable =>
2208                                 hir::ImplicitSelfKind::MutRef,
2209                         TyKind::Rptr(_, ref mt) if mt.ty.node.is_implicit_self() =>
2210                             hir::ImplicitSelfKind::ImmRef,
2211                         _ => hir::ImplicitSelfKind::None,
2212                     }
2213                 },
2214             ),
2215         })
2216     }
2217
2218     // Transforms `-> T` for `async fn` into `-> OpaqueTy { .. }`
2219     // combined with the following definition of `OpaqueTy`:
2220     //
2221     //     type OpaqueTy<generics_from_parent_fn> = impl Future<Output = T>;
2222     //
2223     // `inputs`: lowered types of arguments to the function (used to collect lifetimes)
2224     // `output`: unlowered output type (`T` in `-> T`)
2225     // `fn_def_id`: `DefId` of the parent function (used to create child impl trait definition)
2226     // `opaque_ty_node_id`: `NodeId` of the opaque `impl Trait` type that should be created
2227     // `elided_lt_replacement`: replacement for elided lifetimes in the return type
2228     fn lower_async_fn_ret_ty(
2229         &mut self,
2230         output: &FunctionRetTy,
2231         fn_def_id: DefId,
2232         opaque_ty_node_id: NodeId,
2233         elided_lt_replacement: LtReplacement,
2234     ) -> hir::FunctionRetTy {
2235         let span = output.span();
2236
2237         let opaque_ty_span = self.mark_span_with_reason(
2238             DesugaringKind::Async,
2239             span,
2240             None,
2241         );
2242
2243         let opaque_ty_def_index = self
2244             .resolver
2245             .definitions()
2246             .opt_def_index(opaque_ty_node_id)
2247             .unwrap();
2248
2249         self.allocate_hir_id_counter(opaque_ty_node_id);
2250
2251         let (opaque_ty_id, lifetime_params) = self.with_hir_id_owner(opaque_ty_node_id, |this| {
2252             let future_bound = this.with_anonymous_lifetime_mode(
2253                 AnonymousLifetimeMode::Replace(elided_lt_replacement),
2254                 |this| this.lower_async_fn_output_type_to_future_bound(
2255                     output,
2256                     fn_def_id,
2257                     span,
2258                 ),
2259             );
2260
2261             // Calculate all the lifetimes that should be captured
2262             // by the opaque type. This should include all in-scope
2263             // lifetime parameters, including those defined in-band.
2264             //
2265             // Note: this must be done after lowering the output type,
2266             // as the output type may introduce new in-band lifetimes.
2267             let lifetime_params: Vec<(Span, ParamName)> =
2268                 this.in_scope_lifetimes
2269                     .iter().cloned()
2270                     .map(|name| (name.ident().span, name))
2271                     .chain(this.lifetimes_to_define.iter().cloned())
2272                     .collect();
2273
2274             debug!("lower_async_fn_ret_ty: in_scope_lifetimes={:#?}", this.in_scope_lifetimes);
2275             debug!("lower_async_fn_ret_ty: lifetimes_to_define={:#?}", this.lifetimes_to_define);
2276             debug!("lower_async_fn_ret_ty: lifetime_params={:#?}", lifetime_params);
2277
2278             let generic_params =
2279                 lifetime_params
2280                     .iter().cloned()
2281                     .map(|(span, hir_name)| {
2282                         this.lifetime_to_generic_param(span, hir_name, opaque_ty_def_index)
2283                     })
2284                     .collect();
2285
2286             let opaque_ty_item = hir::OpaqueTy {
2287                 generics: hir::Generics {
2288                     params: generic_params,
2289                     where_clause: hir::WhereClause {
2290                         predicates: hir_vec![],
2291                         span,
2292                     },
2293                     span,
2294                 },
2295                 bounds: hir_vec![future_bound],
2296                 impl_trait_fn: Some(fn_def_id),
2297                 origin: hir::OpaqueTyOrigin::AsyncFn,
2298             };
2299
2300             trace!("exist ty from async fn def index: {:#?}", opaque_ty_def_index);
2301             let opaque_ty_id = this.generate_opaque_type(
2302                 opaque_ty_node_id,
2303                 opaque_ty_item,
2304                 span,
2305                 opaque_ty_span,
2306             );
2307
2308             (opaque_ty_id, lifetime_params)
2309         });
2310
2311         let generic_args =
2312             lifetime_params
2313                 .iter().cloned()
2314                 .map(|(span, hir_name)| {
2315                     GenericArg::Lifetime(hir::Lifetime {
2316                         hir_id: self.next_id(),
2317                         span,
2318                         name: hir::LifetimeName::Param(hir_name),
2319                     })
2320                 })
2321                 .collect();
2322
2323         let opaque_ty_ref = hir::TyKind::Def(hir::ItemId { id: opaque_ty_id }, generic_args);
2324
2325         hir::FunctionRetTy::Return(P(hir::Ty {
2326             node: opaque_ty_ref,
2327             span,
2328             hir_id: self.next_id(),
2329         }))
2330     }
2331
2332     /// Transforms `-> T` into `Future<Output = T>`
2333     fn lower_async_fn_output_type_to_future_bound(
2334         &mut self,
2335         output: &FunctionRetTy,
2336         fn_def_id: DefId,
2337         span: Span,
2338     ) -> hir::GenericBound {
2339         // Compute the `T` in `Future<Output = T>` from the return type.
2340         let output_ty = match output {
2341             FunctionRetTy::Ty(ty) => {
2342                 self.lower_ty(ty, ImplTraitContext::OpaqueTy(Some(fn_def_id)))
2343             }
2344             FunctionRetTy::Default(ret_ty_span) => {
2345                 P(hir::Ty {
2346                     hir_id: self.next_id(),
2347                     node: hir::TyKind::Tup(hir_vec![]),
2348                     span: *ret_ty_span,
2349                 })
2350             }
2351         };
2352
2353         // "<Output = T>"
2354         let future_params = P(hir::GenericArgs {
2355             args: hir_vec![],
2356             bindings: hir_vec![hir::TypeBinding {
2357                 ident: Ident::with_empty_ctxt(FN_OUTPUT_NAME),
2358                 kind: hir::TypeBindingKind::Equality {
2359                     ty: output_ty,
2360                 },
2361                 hir_id: self.next_id(),
2362                 span,
2363             }],
2364             parenthesized: false,
2365         });
2366
2367         // ::std::future::Future<future_params>
2368         let future_path =
2369             P(self.std_path(span, &[sym::future, sym::Future], Some(future_params), false));
2370
2371         hir::GenericBound::Trait(
2372             hir::PolyTraitRef {
2373                 trait_ref: hir::TraitRef {
2374                     path: future_path,
2375                     hir_ref_id: self.next_id(),
2376                 },
2377                 bound_generic_params: hir_vec![],
2378                 span,
2379             },
2380             hir::TraitBoundModifier::None,
2381         )
2382     }
2383
2384     fn lower_param_bound(
2385         &mut self,
2386         tpb: &GenericBound,
2387         itctx: ImplTraitContext<'_>,
2388     ) -> hir::GenericBound {
2389         match *tpb {
2390             GenericBound::Trait(ref ty, modifier) => {
2391                 hir::GenericBound::Trait(
2392                     self.lower_poly_trait_ref(ty, itctx),
2393                     self.lower_trait_bound_modifier(modifier),
2394                 )
2395             }
2396             GenericBound::Outlives(ref lifetime) => {
2397                 hir::GenericBound::Outlives(self.lower_lifetime(lifetime))
2398             }
2399         }
2400     }
2401
2402     fn lower_lifetime(&mut self, l: &Lifetime) -> hir::Lifetime {
2403         let span = l.ident.span;
2404         match l.ident {
2405             ident if ident.name == kw::StaticLifetime =>
2406                 self.new_named_lifetime(l.id, span, hir::LifetimeName::Static),
2407             ident if ident.name == kw::UnderscoreLifetime =>
2408                 match self.anonymous_lifetime_mode {
2409                     AnonymousLifetimeMode::CreateParameter => {
2410                         let fresh_name = self.collect_fresh_in_band_lifetime(span);
2411                         self.new_named_lifetime(l.id, span, hir::LifetimeName::Param(fresh_name))
2412                     }
2413
2414                     AnonymousLifetimeMode::PassThrough => {
2415                         self.new_named_lifetime(l.id, span, hir::LifetimeName::Underscore)
2416                     }
2417
2418                     AnonymousLifetimeMode::ReportError => self.new_error_lifetime(Some(l.id), span),
2419
2420                     AnonymousLifetimeMode::Replace(replacement) => {
2421                         let hir_id = self.lower_node_id(l.id);
2422                         self.replace_elided_lifetime(hir_id, span, replacement)
2423                     }
2424                 },
2425             ident => {
2426                 self.maybe_collect_in_band_lifetime(ident);
2427                 let param_name = ParamName::Plain(ident);
2428                 self.new_named_lifetime(l.id, span, hir::LifetimeName::Param(param_name))
2429             }
2430         }
2431     }
2432
2433     fn new_named_lifetime(
2434         &mut self,
2435         id: NodeId,
2436         span: Span,
2437         name: hir::LifetimeName,
2438     ) -> hir::Lifetime {
2439         hir::Lifetime {
2440             hir_id: self.lower_node_id(id),
2441             span,
2442             name: name,
2443         }
2444     }
2445
2446     /// Replace a return-position elided lifetime with the elided lifetime
2447     /// from the arguments.
2448     fn replace_elided_lifetime(
2449         &mut self,
2450         hir_id: hir::HirId,
2451         span: Span,
2452         replacement: LtReplacement,
2453     ) -> hir::Lifetime {
2454         let multiple_or_none = match replacement {
2455             LtReplacement::Some(name) => {
2456                 return hir::Lifetime {
2457                     hir_id,
2458                     span,
2459                     name: hir::LifetimeName::Param(name),
2460                 };
2461             }
2462             LtReplacement::MultipleLifetimes => "multiple",
2463             LtReplacement::NoLifetimes => "none",
2464         };
2465
2466         let mut err = crate::middle::resolve_lifetime::report_missing_lifetime_specifiers(
2467             self.sess,
2468             span,
2469             1,
2470         );
2471         err.note(&format!(
2472             "return-position elided lifetimes require exactly one \
2473              input-position elided lifetime, found {}.", multiple_or_none));
2474         err.emit();
2475
2476         hir::Lifetime { hir_id, span, name: hir::LifetimeName::Error }
2477     }
2478
2479     fn lower_generic_params(
2480         &mut self,
2481         params: &[GenericParam],
2482         add_bounds: &NodeMap<Vec<GenericBound>>,
2483         mut itctx: ImplTraitContext<'_>,
2484     ) -> hir::HirVec<hir::GenericParam> {
2485         params.iter().map(|param| {
2486             self.lower_generic_param(param, add_bounds, itctx.reborrow())
2487         }).collect()
2488     }
2489
2490     fn lower_generic_param(&mut self,
2491                            param: &GenericParam,
2492                            add_bounds: &NodeMap<Vec<GenericBound>>,
2493                            mut itctx: ImplTraitContext<'_>)
2494                            -> hir::GenericParam {
2495         let mut bounds = self.with_anonymous_lifetime_mode(
2496             AnonymousLifetimeMode::ReportError,
2497             |this| this.lower_param_bounds(&param.bounds, itctx.reborrow()),
2498         );
2499
2500         let (name, kind) = match param.kind {
2501             GenericParamKind::Lifetime => {
2502                 let was_collecting_in_band = self.is_collecting_in_band_lifetimes;
2503                 self.is_collecting_in_band_lifetimes = false;
2504
2505                 let lt = self.with_anonymous_lifetime_mode(
2506                     AnonymousLifetimeMode::ReportError,
2507                     |this| this.lower_lifetime(&Lifetime { id: param.id, ident: param.ident }),
2508                 );
2509                 let param_name = match lt.name {
2510                     hir::LifetimeName::Param(param_name) => param_name,
2511                     hir::LifetimeName::Implicit
2512                         | hir::LifetimeName::Underscore
2513                         | hir::LifetimeName::Static => hir::ParamName::Plain(lt.name.ident()),
2514                     hir::LifetimeName::Error => ParamName::Error,
2515                 };
2516
2517                 let kind = hir::GenericParamKind::Lifetime {
2518                     kind: hir::LifetimeParamKind::Explicit
2519                 };
2520
2521                 self.is_collecting_in_band_lifetimes = was_collecting_in_band;
2522
2523                 (param_name, kind)
2524             }
2525             GenericParamKind::Type { ref default, .. } => {
2526                 // Don't expose `Self` (recovered "keyword used as ident" parse error).
2527                 // `rustc::ty` expects `Self` to be only used for a trait's `Self`.
2528                 // Instead, use `gensym("Self")` to create a distinct name that looks the same.
2529                 let ident = if param.ident.name == kw::SelfUpper {
2530                     param.ident.gensym()
2531                 } else {
2532                     param.ident
2533                 };
2534
2535                 let add_bounds = add_bounds.get(&param.id).map_or(&[][..], |x| &x);
2536                 if !add_bounds.is_empty() {
2537                     let params = self.lower_param_bounds(add_bounds, itctx.reborrow()).into_iter();
2538                     bounds = bounds.into_iter()
2539                                    .chain(params)
2540                                    .collect();
2541                 }
2542
2543                 let kind = hir::GenericParamKind::Type {
2544                     default: default.as_ref().map(|x| {
2545                         self.lower_ty(x, ImplTraitContext::OpaqueTy(None))
2546                     }),
2547                     synthetic: param.attrs.iter()
2548                                           .filter(|attr| attr.check_name(sym::rustc_synthetic))
2549                                           .map(|_| hir::SyntheticTyParamKind::ImplTrait)
2550                                           .next(),
2551                 };
2552
2553                 (hir::ParamName::Plain(ident), kind)
2554             }
2555             GenericParamKind::Const { ref ty } => {
2556                 (hir::ParamName::Plain(param.ident), hir::GenericParamKind::Const {
2557                     ty: self.lower_ty(&ty, ImplTraitContext::disallowed()),
2558                 })
2559             }
2560         };
2561
2562         hir::GenericParam {
2563             hir_id: self.lower_node_id(param.id),
2564             name,
2565             span: param.ident.span,
2566             pure_wrt_drop: attr::contains_name(&param.attrs, sym::may_dangle),
2567             attrs: self.lower_attrs(&param.attrs),
2568             bounds,
2569             kind,
2570         }
2571     }
2572
2573     fn lower_trait_ref(&mut self, p: &TraitRef, itctx: ImplTraitContext<'_>) -> hir::TraitRef {
2574         let path = match self.lower_qpath(p.ref_id, &None, &p.path, ParamMode::Explicit, itctx) {
2575             hir::QPath::Resolved(None, path) => path,
2576             qpath => bug!("lower_trait_ref: unexpected QPath `{:?}`", qpath),
2577         };
2578         hir::TraitRef {
2579             path,
2580             hir_ref_id: self.lower_node_id(p.ref_id),
2581         }
2582     }
2583
2584     fn lower_poly_trait_ref(
2585         &mut self,
2586         p: &PolyTraitRef,
2587         mut itctx: ImplTraitContext<'_>,
2588     ) -> hir::PolyTraitRef {
2589         let bound_generic_params = self.lower_generic_params(
2590             &p.bound_generic_params,
2591             &NodeMap::default(),
2592             itctx.reborrow(),
2593         );
2594         let trait_ref = self.with_in_scope_lifetime_defs(
2595             &p.bound_generic_params,
2596             |this| this.lower_trait_ref(&p.trait_ref, itctx),
2597         );
2598
2599         hir::PolyTraitRef {
2600             bound_generic_params,
2601             trait_ref,
2602             span: p.span,
2603         }
2604     }
2605
2606     fn lower_mt(&mut self, mt: &MutTy, itctx: ImplTraitContext<'_>) -> hir::MutTy {
2607         hir::MutTy {
2608             ty: self.lower_ty(&mt.ty, itctx),
2609             mutbl: self.lower_mutability(mt.mutbl),
2610         }
2611     }
2612
2613     fn lower_param_bounds(&mut self, bounds: &[GenericBound], mut itctx: ImplTraitContext<'_>)
2614                           -> hir::GenericBounds {
2615         bounds.iter().map(|bound| self.lower_param_bound(bound, itctx.reborrow())).collect()
2616     }
2617
2618     fn lower_block_with_stmts(
2619         &mut self,
2620         b: &Block,
2621         targeted_by_break: bool,
2622         mut stmts: Vec<hir::Stmt>,
2623     ) -> P<hir::Block> {
2624         let mut expr = None;
2625
2626         for (index, stmt) in b.stmts.iter().enumerate() {
2627             if index == b.stmts.len() - 1 {
2628                 if let StmtKind::Expr(ref e) = stmt.node {
2629                     expr = Some(P(self.lower_expr(e)));
2630                 } else {
2631                     stmts.extend(self.lower_stmt(stmt));
2632                 }
2633             } else {
2634                 stmts.extend(self.lower_stmt(stmt));
2635             }
2636         }
2637
2638         P(hir::Block {
2639             hir_id: self.lower_node_id(b.id),
2640             stmts: stmts.into(),
2641             expr,
2642             rules: self.lower_block_check_mode(&b.rules),
2643             span: b.span,
2644             targeted_by_break,
2645         })
2646     }
2647
2648     fn lower_block(&mut self, b: &Block, targeted_by_break: bool) -> P<hir::Block> {
2649         self.lower_block_with_stmts(b, targeted_by_break, vec![])
2650     }
2651
2652     fn lower_pat(&mut self, p: &Pat) -> P<hir::Pat> {
2653         let node = match p.node {
2654             PatKind::Wild => hir::PatKind::Wild,
2655             PatKind::Ident(ref binding_mode, ident, ref sub) => {
2656                 let lower_sub = |this: &mut Self| sub.as_ref().map(|x| this.lower_pat(x));
2657                 self.lower_pat_ident(p, binding_mode, ident, lower_sub)
2658             }
2659             PatKind::Lit(ref e) => hir::PatKind::Lit(P(self.lower_expr(e))),
2660             PatKind::TupleStruct(ref path, ref pats) => {
2661                 let qpath = self.lower_qpath(
2662                     p.id,
2663                     &None,
2664                     path,
2665                     ParamMode::Optional,
2666                     ImplTraitContext::disallowed(),
2667                 );
2668                 let (pats, ddpos) = self.lower_pat_tuple(pats, "tuple struct");
2669                 hir::PatKind::TupleStruct(qpath, pats, ddpos)
2670             }
2671             PatKind::Path(ref qself, ref path) => {
2672                 let qpath = self.lower_qpath(
2673                     p.id,
2674                     qself,
2675                     path,
2676                     ParamMode::Optional,
2677                     ImplTraitContext::disallowed(),
2678                 );
2679                 hir::PatKind::Path(qpath)
2680             }
2681             PatKind::Struct(ref path, ref fields, etc) => {
2682                 let qpath = self.lower_qpath(
2683                     p.id,
2684                     &None,
2685                     path,
2686                     ParamMode::Optional,
2687                     ImplTraitContext::disallowed(),
2688                 );
2689
2690                 let fs = fields
2691                     .iter()
2692                     .map(|f| {
2693                         Spanned {
2694                             span: f.span,
2695                             node: hir::FieldPat {
2696                                 hir_id: self.next_id(),
2697                                 ident: f.node.ident,
2698                                 pat: self.lower_pat(&f.node.pat),
2699                                 is_shorthand: f.node.is_shorthand,
2700                             },
2701                         }
2702                     })
2703                     .collect();
2704                 hir::PatKind::Struct(qpath, fs, etc)
2705             }
2706             PatKind::Tuple(ref pats) => {
2707                 let (pats, ddpos) = self.lower_pat_tuple(pats, "tuple");
2708                 hir::PatKind::Tuple(pats, ddpos)
2709             }
2710             PatKind::Box(ref inner) => hir::PatKind::Box(self.lower_pat(inner)),
2711             PatKind::Ref(ref inner, mutbl) => {
2712                 hir::PatKind::Ref(self.lower_pat(inner), self.lower_mutability(mutbl))
2713             }
2714             PatKind::Range(ref e1, ref e2, Spanned { node: ref end, .. }) => hir::PatKind::Range(
2715                 P(self.lower_expr(e1)),
2716                 P(self.lower_expr(e2)),
2717                 self.lower_range_end(end),
2718             ),
2719             PatKind::Slice(ref pats) => self.lower_pat_slice(pats),
2720             PatKind::Rest => {
2721                 // If we reach here the `..` pattern is not semantically allowed.
2722                 self.ban_illegal_rest_pat(p.span)
2723             }
2724             PatKind::Paren(ref inner) => return self.lower_pat(inner),
2725             PatKind::Mac(_) => panic!("Shouldn't exist here"),
2726         };
2727
2728         self.pat_with_node_id_of(p, node)
2729     }
2730
2731     fn lower_pat_tuple(
2732         &mut self,
2733         pats: &[AstP<Pat>],
2734         ctx: &str,
2735     ) -> (HirVec<P<hir::Pat>>, Option<usize>) {
2736         let mut elems = Vec::with_capacity(pats.len());
2737         let mut rest = None;
2738
2739         let mut iter = pats.iter().enumerate();
2740         while let Some((idx, pat)) = iter.next() {
2741             // Interpret the first `..` pattern as a subtuple pattern.
2742             if pat.is_rest() {
2743                 rest = Some((idx, pat.span));
2744                 break;
2745             }
2746             // It was not a subslice pattern so lower it normally.
2747             elems.push(self.lower_pat(pat));
2748         }
2749
2750         while let Some((_, pat)) = iter.next() {
2751             // There was a previous subtuple pattern; make sure we don't allow more.
2752             if pat.is_rest() {
2753                 self.ban_extra_rest_pat(pat.span, rest.unwrap().1, ctx);
2754             } else {
2755                 elems.push(self.lower_pat(pat));
2756             }
2757         }
2758
2759         (elems.into(), rest.map(|(ddpos, _)| ddpos))
2760     }
2761
2762     fn lower_pat_slice(&mut self, pats: &[AstP<Pat>]) -> hir::PatKind {
2763         let mut before = Vec::new();
2764         let mut after = Vec::new();
2765         let mut slice = None;
2766         let mut prev_rest_span = None;
2767
2768         let mut iter = pats.iter();
2769         while let Some(pat) = iter.next() {
2770             // Interpret the first `((ref mut?)? x @)? ..` pattern as a subslice pattern.
2771             match pat.node {
2772                 PatKind::Rest => {
2773                     prev_rest_span = Some(pat.span);
2774                     slice = Some(self.pat_wild_with_node_id_of(pat));
2775                     break;
2776                 },
2777                 PatKind::Ident(ref bm, ident, Some(ref sub)) if sub.is_rest() => {
2778                     prev_rest_span = Some(sub.span);
2779                     let lower_sub = |this: &mut Self| Some(this.pat_wild_with_node_id_of(sub));
2780                     let node = self.lower_pat_ident(pat, bm, ident, lower_sub);
2781                     slice = Some(self.pat_with_node_id_of(pat, node));
2782                     break;
2783                 },
2784                 _ => {}
2785             }
2786
2787             // It was not a subslice pattern so lower it normally.
2788             before.push(self.lower_pat(pat));
2789         }
2790
2791         while let Some(pat) = iter.next() {
2792             // There was a previous subslice pattern; make sure we don't allow more.
2793             let rest_span = match pat.node {
2794                 PatKind::Rest => Some(pat.span),
2795                 PatKind::Ident(.., Some(ref sub)) if sub.is_rest() => {
2796                     // The `HirValidator` is merciless; add a `_` pattern to avoid ICEs.
2797                     after.push(self.pat_wild_with_node_id_of(pat));
2798                     Some(sub.span)
2799                 },
2800                 _ => None,
2801             };
2802             if let Some(rest_span) = rest_span {
2803                 self.ban_extra_rest_pat(rest_span, prev_rest_span.unwrap(), "slice");
2804             } else {
2805                 after.push(self.lower_pat(pat));
2806             }
2807         }
2808
2809         hir::PatKind::Slice(before.into(), slice, after.into())
2810     }
2811
2812     fn lower_pat_ident(
2813         &mut self,
2814         p: &Pat,
2815         binding_mode: &BindingMode,
2816         ident: Ident,
2817         lower_sub: impl FnOnce(&mut Self) -> Option<P<hir::Pat>>,
2818     ) -> hir::PatKind {
2819         match self.resolver.get_partial_res(p.id).map(|d| d.base_res()) {
2820             // `None` can occur in body-less function signatures
2821             res @ None | res @ Some(Res::Local(_)) => {
2822                 let canonical_id = match res {
2823                     Some(Res::Local(id)) => id,
2824                     _ => p.id,
2825                 };
2826
2827                 hir::PatKind::Binding(
2828                     self.lower_binding_mode(binding_mode),
2829                     self.lower_node_id(canonical_id),
2830                     ident,
2831                     lower_sub(self),
2832                 )
2833             }
2834             Some(res) => hir::PatKind::Path(hir::QPath::Resolved(
2835                 None,
2836                 P(hir::Path {
2837                     span: ident.span,
2838                     res: self.lower_res(res),
2839                     segments: hir_vec![hir::PathSegment::from_ident(ident)],
2840                 }),
2841             )),
2842         }
2843     }
2844
2845     fn pat_wild_with_node_id_of(&mut self, p: &Pat) -> P<hir::Pat> {
2846         self.pat_with_node_id_of(p, hir::PatKind::Wild)
2847     }
2848
2849     /// Construct a `Pat` with the `HirId` of `p.id` lowered.
2850     fn pat_with_node_id_of(&mut self, p: &Pat, node: hir::PatKind) -> P<hir::Pat> {
2851         P(hir::Pat {
2852             hir_id: self.lower_node_id(p.id),
2853             node,
2854             span: p.span,
2855         })
2856     }
2857
2858     /// Emit a friendly error for extra `..` patterns in a tuple/tuple struct/slice pattern.
2859     fn ban_extra_rest_pat(&self, sp: Span, prev_sp: Span, ctx: &str) {
2860         self.diagnostic()
2861             .struct_span_err(sp, &format!("`..` can only be used once per {} pattern", ctx))
2862             .span_label(sp, &format!("can only be used once per {} pattern", ctx))
2863             .span_label(prev_sp, "previously used here")
2864             .emit();
2865     }
2866
2867     /// Used to ban the `..` pattern in places it shouldn't be semantically.
2868     fn ban_illegal_rest_pat(&self, sp: Span) -> hir::PatKind {
2869         self.diagnostic()
2870             .struct_span_err(sp, "`..` patterns are not allowed here")
2871             .note("only allowed in tuple, tuple struct, and slice patterns")
2872             .emit();
2873
2874         // We're not in a list context so `..` can be reasonably treated
2875         // as `_` because it should always be valid and roughly matches the
2876         // intent of `..` (notice that the rest of a single slot is that slot).
2877         hir::PatKind::Wild
2878     }
2879
2880     fn lower_range_end(&mut self, e: &RangeEnd) -> hir::RangeEnd {
2881         match *e {
2882             RangeEnd::Included(_) => hir::RangeEnd::Included,
2883             RangeEnd::Excluded => hir::RangeEnd::Excluded,
2884         }
2885     }
2886
2887     fn lower_anon_const(&mut self, c: &AnonConst) -> hir::AnonConst {
2888         self.with_new_scopes(|this| {
2889             hir::AnonConst {
2890                 hir_id: this.lower_node_id(c.id),
2891                 body: this.lower_const_body(&c.value),
2892             }
2893         })
2894     }
2895
2896     fn lower_stmt(&mut self, s: &Stmt) -> SmallVec<[hir::Stmt; 1]> {
2897         let node = match s.node {
2898             StmtKind::Local(ref l) => {
2899                 let (l, item_ids) = self.lower_local(l);
2900                 let mut ids: SmallVec<[hir::Stmt; 1]> = item_ids
2901                     .into_iter()
2902                     .map(|item_id| {
2903                         let item_id = hir::ItemId { id: self.lower_node_id(item_id) };
2904                         self.stmt(s.span, hir::StmtKind::Item(item_id))
2905                     })
2906                     .collect();
2907                 ids.push({
2908                     hir::Stmt {
2909                         hir_id: self.lower_node_id(s.id),
2910                         node: hir::StmtKind::Local(P(l)),
2911                         span: s.span,
2912                     }
2913                 });
2914                 return ids;
2915             },
2916             StmtKind::Item(ref it) => {
2917                 // Can only use the ID once.
2918                 let mut id = Some(s.id);
2919                 return self.lower_item_id(it)
2920                     .into_iter()
2921                     .map(|item_id| {
2922                         let hir_id = id.take()
2923                           .map(|id| self.lower_node_id(id))
2924                           .unwrap_or_else(|| self.next_id());
2925
2926                         hir::Stmt {
2927                             hir_id,
2928                             node: hir::StmtKind::Item(item_id),
2929                             span: s.span,
2930                         }
2931                     })
2932                     .collect();
2933             }
2934             StmtKind::Expr(ref e) => hir::StmtKind::Expr(P(self.lower_expr(e))),
2935             StmtKind::Semi(ref e) => hir::StmtKind::Semi(P(self.lower_expr(e))),
2936             StmtKind::Mac(..) => panic!("Shouldn't exist here"),
2937         };
2938         smallvec![hir::Stmt {
2939             hir_id: self.lower_node_id(s.id),
2940             node,
2941             span: s.span,
2942         }]
2943     }
2944
2945     fn lower_block_check_mode(&mut self, b: &BlockCheckMode) -> hir::BlockCheckMode {
2946         match *b {
2947             BlockCheckMode::Default => hir::DefaultBlock,
2948             BlockCheckMode::Unsafe(u) => hir::UnsafeBlock(self.lower_unsafe_source(u)),
2949         }
2950     }
2951
2952     fn lower_binding_mode(&mut self, b: &BindingMode) -> hir::BindingAnnotation {
2953         match *b {
2954             BindingMode::ByValue(Mutability::Immutable) => hir::BindingAnnotation::Unannotated,
2955             BindingMode::ByRef(Mutability::Immutable) => hir::BindingAnnotation::Ref,
2956             BindingMode::ByValue(Mutability::Mutable) => hir::BindingAnnotation::Mutable,
2957             BindingMode::ByRef(Mutability::Mutable) => hir::BindingAnnotation::RefMut,
2958         }
2959     }
2960
2961     fn lower_unsafe_source(&mut self, u: UnsafeSource) -> hir::UnsafeSource {
2962         match u {
2963             CompilerGenerated => hir::CompilerGenerated,
2964             UserProvided => hir::UserProvided,
2965         }
2966     }
2967
2968     fn lower_trait_bound_modifier(&mut self, f: TraitBoundModifier) -> hir::TraitBoundModifier {
2969         match f {
2970             TraitBoundModifier::None => hir::TraitBoundModifier::None,
2971             TraitBoundModifier::Maybe => hir::TraitBoundModifier::Maybe,
2972         }
2973     }
2974
2975     // Helper methods for building HIR.
2976
2977     fn stmt(&mut self, span: Span, node: hir::StmtKind) -> hir::Stmt {
2978         hir::Stmt { span, node, hir_id: self.next_id() }
2979     }
2980
2981     fn stmt_expr(&mut self, span: Span, expr: hir::Expr) -> hir::Stmt {
2982         self.stmt(span, hir::StmtKind::Expr(P(expr)))
2983     }
2984
2985     fn stmt_let_pat(
2986         &mut self,
2987         attrs: ThinVec<Attribute>,
2988         span: Span,
2989         init: Option<P<hir::Expr>>,
2990         pat: P<hir::Pat>,
2991         source: hir::LocalSource,
2992     ) -> hir::Stmt {
2993         let local = hir::Local {
2994             attrs,
2995             hir_id: self.next_id(),
2996             init,
2997             pat,
2998             source,
2999             span,
3000             ty: None,
3001         };
3002         self.stmt(span, hir::StmtKind::Local(P(local)))
3003     }
3004
3005     fn block_expr(&mut self, expr: P<hir::Expr>) -> hir::Block {
3006         self.block_all(expr.span, hir::HirVec::new(), Some(expr))
3007     }
3008
3009     fn block_all(
3010         &mut self,
3011         span: Span,
3012         stmts: hir::HirVec<hir::Stmt>,
3013         expr: Option<P<hir::Expr>>,
3014     ) -> hir::Block {
3015         hir::Block {
3016             stmts,
3017             expr,
3018             hir_id: self.next_id(),
3019             rules: hir::DefaultBlock,
3020             span,
3021             targeted_by_break: false,
3022         }
3023     }
3024
3025     /// Constructs a `true` or `false` literal pattern.
3026     fn pat_bool(&mut self, span: Span, val: bool) -> P<hir::Pat> {
3027         let expr = self.expr_bool(span, val);
3028         self.pat(span, hir::PatKind::Lit(P(expr)))
3029     }
3030
3031     fn pat_ok(&mut self, span: Span, pat: P<hir::Pat>) -> P<hir::Pat> {
3032         self.pat_std_enum(span, &[sym::result, sym::Result, sym::Ok], hir_vec![pat])
3033     }
3034
3035     fn pat_err(&mut self, span: Span, pat: P<hir::Pat>) -> P<hir::Pat> {
3036         self.pat_std_enum(span, &[sym::result, sym::Result, sym::Err], hir_vec![pat])
3037     }
3038
3039     fn pat_some(&mut self, span: Span, pat: P<hir::Pat>) -> P<hir::Pat> {
3040         self.pat_std_enum(span, &[sym::option, sym::Option, sym::Some], hir_vec![pat])
3041     }
3042
3043     fn pat_none(&mut self, span: Span) -> P<hir::Pat> {
3044         self.pat_std_enum(span, &[sym::option, sym::Option, sym::None], hir_vec![])
3045     }
3046
3047     fn pat_std_enum(
3048         &mut self,
3049         span: Span,
3050         components: &[Symbol],
3051         subpats: hir::HirVec<P<hir::Pat>>,
3052     ) -> P<hir::Pat> {
3053         let path = self.std_path(span, components, None, true);
3054         let qpath = hir::QPath::Resolved(None, P(path));
3055         let pt = if subpats.is_empty() {
3056             hir::PatKind::Path(qpath)
3057         } else {
3058             hir::PatKind::TupleStruct(qpath, subpats, None)
3059         };
3060         self.pat(span, pt)
3061     }
3062
3063     fn pat_ident(&mut self, span: Span, ident: Ident) -> (P<hir::Pat>, hir::HirId) {
3064         self.pat_ident_binding_mode(span, ident, hir::BindingAnnotation::Unannotated)
3065     }
3066
3067     fn pat_ident_binding_mode(
3068         &mut self,
3069         span: Span,
3070         ident: Ident,
3071         bm: hir::BindingAnnotation,
3072     ) -> (P<hir::Pat>, hir::HirId) {
3073         let hir_id = self.next_id();
3074
3075         (
3076             P(hir::Pat {
3077                 hir_id,
3078                 node: hir::PatKind::Binding(bm, hir_id, ident.with_span_pos(span), None),
3079                 span,
3080             }),
3081             hir_id
3082         )
3083     }
3084
3085     fn pat_wild(&mut self, span: Span) -> P<hir::Pat> {
3086         self.pat(span, hir::PatKind::Wild)
3087     }
3088
3089     fn pat(&mut self, span: Span, pat: hir::PatKind) -> P<hir::Pat> {
3090         P(hir::Pat {
3091             hir_id: self.next_id(),
3092             node: pat,
3093             span,
3094         })
3095     }
3096
3097     /// Given a suffix `["b", "c", "d"]`, returns path `::std::b::c::d` when
3098     /// `fld.cx.use_std`, and `::core::b::c::d` otherwise.
3099     /// The path is also resolved according to `is_value`.
3100     fn std_path(
3101         &mut self,
3102         span: Span,
3103         components: &[Symbol],
3104         params: Option<P<hir::GenericArgs>>,
3105         is_value: bool,
3106     ) -> hir::Path {
3107         let ns = if is_value { Namespace::ValueNS } else { Namespace::TypeNS };
3108         let (path, res) = self.resolver.resolve_str_path(span, self.crate_root, components, ns);
3109
3110         let mut segments: Vec<_> = path.segments.iter().map(|segment| {
3111             let res = self.expect_full_res(segment.id);
3112             hir::PathSegment {
3113                 ident: segment.ident,
3114                 hir_id: Some(self.lower_node_id(segment.id)),
3115                 res: Some(self.lower_res(res)),
3116                 infer_args: true,
3117                 args: None,
3118             }
3119         }).collect();
3120         segments.last_mut().unwrap().args = params;
3121
3122         hir::Path {
3123             span,
3124             res: res.map_id(|_| panic!("unexpected node_id")),
3125             segments: segments.into(),
3126         }
3127     }
3128
3129     fn ty_path(&mut self, mut hir_id: hir::HirId, span: Span, qpath: hir::QPath) -> hir::Ty {
3130         let node = match qpath {
3131             hir::QPath::Resolved(None, path) => {
3132                 // Turn trait object paths into `TyKind::TraitObject` instead.
3133                 match path.res {
3134                     Res::Def(DefKind::Trait, _) | Res::Def(DefKind::TraitAlias, _) => {
3135                         let principal = hir::PolyTraitRef {
3136                             bound_generic_params: hir::HirVec::new(),
3137                             trait_ref: hir::TraitRef {
3138                                 path,
3139                                 hir_ref_id: hir_id,
3140                             },
3141                             span,
3142                         };
3143
3144                         // The original ID is taken by the `PolyTraitRef`,
3145                         // so the `Ty` itself needs a different one.
3146                         hir_id = self.next_id();
3147                         hir::TyKind::TraitObject(hir_vec![principal], self.elided_dyn_bound(span))
3148                     }
3149                     _ => hir::TyKind::Path(hir::QPath::Resolved(None, path)),
3150                 }
3151             }
3152             _ => hir::TyKind::Path(qpath),
3153         };
3154         hir::Ty {
3155             hir_id,
3156             node,
3157             span,
3158         }
3159     }
3160
3161     /// Invoked to create the lifetime argument for a type `&T`
3162     /// with no explicit lifetime.
3163     fn elided_ref_lifetime(&mut self, span: Span) -> hir::Lifetime {
3164         match self.anonymous_lifetime_mode {
3165             // Intercept when we are in an impl header or async fn and introduce an in-band
3166             // lifetime.
3167             // Hence `impl Foo for &u32` becomes `impl<'f> Foo for &'f u32` for some fresh
3168             // `'f`.
3169             AnonymousLifetimeMode::CreateParameter => {
3170                 let fresh_name = self.collect_fresh_in_band_lifetime(span);
3171                 hir::Lifetime {
3172                     hir_id: self.next_id(),
3173                     span,
3174                     name: hir::LifetimeName::Param(fresh_name),
3175                 }
3176             }
3177
3178             AnonymousLifetimeMode::ReportError => self.new_error_lifetime(None, span),
3179
3180             AnonymousLifetimeMode::PassThrough => self.new_implicit_lifetime(span),
3181
3182             AnonymousLifetimeMode::Replace(replacement) => {
3183                 self.new_replacement_lifetime(replacement, span)
3184             }
3185         }
3186     }
3187
3188     /// Report an error on illegal use of `'_` or a `&T` with no explicit lifetime;
3189     /// return a "error lifetime".
3190     fn new_error_lifetime(&mut self, id: Option<NodeId>, span: Span) -> hir::Lifetime {
3191         let (id, msg, label) = match id {
3192             Some(id) => (id, "`'_` cannot be used here", "`'_` is a reserved lifetime name"),
3193
3194             None => (
3195                 self.sess.next_node_id(),
3196                 "`&` without an explicit lifetime name cannot be used here",
3197                 "explicit lifetime name needed here",
3198             ),
3199         };
3200
3201         let mut err = struct_span_err!(
3202             self.sess,
3203             span,
3204             E0637,
3205             "{}",
3206             msg,
3207         );
3208         err.span_label(span, label);
3209         err.emit();
3210
3211         self.new_named_lifetime(id, span, hir::LifetimeName::Error)
3212     }
3213
3214     /// Invoked to create the lifetime argument(s) for a path like
3215     /// `std::cell::Ref<T>`; note that implicit lifetimes in these
3216     /// sorts of cases are deprecated. This may therefore report a warning or an
3217     /// error, depending on the mode.
3218     fn elided_path_lifetimes(&mut self, span: Span, count: usize) -> P<[hir::Lifetime]> {
3219         (0..count)
3220             .map(|_| self.elided_path_lifetime(span))
3221             .collect()
3222     }
3223
3224     fn elided_path_lifetime(&mut self, span: Span) -> hir::Lifetime {
3225         match self.anonymous_lifetime_mode {
3226             AnonymousLifetimeMode::CreateParameter => {
3227                 // We should have emitted E0726 when processing this path above
3228                 self.sess.delay_span_bug(
3229                     span,
3230                     "expected 'implicit elided lifetime not allowed' error",
3231                 );
3232                 let id = self.sess.next_node_id();
3233                 self.new_named_lifetime(id, span, hir::LifetimeName::Error)
3234             }
3235             // This is the normal case.
3236             AnonymousLifetimeMode::PassThrough => self.new_implicit_lifetime(span),
3237
3238             AnonymousLifetimeMode::Replace(replacement) => {
3239                 self.new_replacement_lifetime(replacement, span)
3240             }
3241
3242             AnonymousLifetimeMode::ReportError => self.new_error_lifetime(None, span),
3243         }
3244     }
3245
3246     /// Invoked to create the lifetime argument(s) for an elided trait object
3247     /// bound, like the bound in `Box<dyn Debug>`. This method is not invoked
3248     /// when the bound is written, even if it is written with `'_` like in
3249     /// `Box<dyn Debug + '_>`. In those cases, `lower_lifetime` is invoked.
3250     fn elided_dyn_bound(&mut self, span: Span) -> hir::Lifetime {
3251         match self.anonymous_lifetime_mode {
3252             // NB. We intentionally ignore the create-parameter mode here.
3253             // and instead "pass through" to resolve-lifetimes, which will apply
3254             // the object-lifetime-defaulting rules. Elided object lifetime defaults
3255             // do not act like other elided lifetimes. In other words, given this:
3256             //
3257             //     impl Foo for Box<dyn Debug>
3258             //
3259             // we do not introduce a fresh `'_` to serve as the bound, but instead
3260             // ultimately translate to the equivalent of:
3261             //
3262             //     impl Foo for Box<dyn Debug + 'static>
3263             //
3264             // `resolve_lifetime` has the code to make that happen.
3265             AnonymousLifetimeMode::CreateParameter => {}
3266
3267             AnonymousLifetimeMode::ReportError => {
3268                 // ReportError applies to explicit use of `'_`.
3269             }
3270
3271             // This is the normal case.
3272             AnonymousLifetimeMode::PassThrough => {}
3273
3274             // We don't need to do any replacement here as this lifetime
3275             // doesn't refer to an elided lifetime elsewhere in the function
3276             // signature.
3277             AnonymousLifetimeMode::Replace(_) => {}
3278         }
3279
3280         self.new_implicit_lifetime(span)
3281     }
3282
3283     fn new_replacement_lifetime(
3284         &mut self,
3285         replacement: LtReplacement,
3286         span: Span,
3287     ) -> hir::Lifetime {
3288         let hir_id = self.next_id();
3289         self.replace_elided_lifetime(hir_id, span, replacement)
3290     }
3291
3292     fn new_implicit_lifetime(&mut self, span: Span) -> hir::Lifetime {
3293         hir::Lifetime {
3294             hir_id: self.next_id(),
3295             span,
3296             name: hir::LifetimeName::Implicit,
3297         }
3298     }
3299
3300     fn maybe_lint_bare_trait(&self, span: Span, id: NodeId, is_global: bool) {
3301         // FIXME(davidtwco): This is a hack to detect macros which produce spans of the
3302         // call site which do not have a macro backtrace. See #61963.
3303         let is_macro_callsite = self.sess.source_map()
3304             .span_to_snippet(span)
3305             .map(|snippet| snippet.starts_with("#["))
3306             .unwrap_or(true);
3307         if !is_macro_callsite {
3308             self.sess.buffer_lint_with_diagnostic(
3309                 builtin::BARE_TRAIT_OBJECTS,
3310                 id,
3311                 span,
3312                 "trait objects without an explicit `dyn` are deprecated",
3313                 builtin::BuiltinLintDiagnostics::BareTraitObject(span, is_global),
3314             )
3315         }
3316     }
3317 }
3318
3319 fn body_ids(bodies: &BTreeMap<hir::BodyId, hir::Body>) -> Vec<hir::BodyId> {
3320     // Sorting by span ensures that we get things in order within a
3321     // file, and also puts the files in a sensible order.
3322     let mut body_ids: Vec<_> = bodies.keys().cloned().collect();
3323     body_ids.sort_by_key(|b| bodies[b].value.span);
3324     body_ids
3325 }
3326
3327 /// Checks if the specified expression is a built-in range literal.
3328 /// (See: `LoweringContext::lower_expr()`).
3329 pub fn is_range_literal(sess: &Session, expr: &hir::Expr) -> bool {
3330     use hir::{Path, QPath, ExprKind, TyKind};
3331
3332     // Returns whether the given path represents a (desugared) range,
3333     // either in std or core, i.e. has either a `::std::ops::Range` or
3334     // `::core::ops::Range` prefix.
3335     fn is_range_path(path: &Path) -> bool {
3336         let segs: Vec<_> = path.segments.iter().map(|seg| seg.ident.as_str().to_string()).collect();
3337         let segs: Vec<_> = segs.iter().map(|seg| &**seg).collect();
3338
3339         // "{{root}}" is the equivalent of `::` prefix in `Path`.
3340         if let ["{{root}}", std_core, "ops", range] = segs.as_slice() {
3341             (*std_core == "std" || *std_core == "core") && range.starts_with("Range")
3342         } else {
3343             false
3344         }
3345     };
3346
3347     // Check whether a span corresponding to a range expression is a
3348     // range literal, rather than an explicit struct or `new()` call.
3349     fn is_lit(sess: &Session, span: &Span) -> bool {
3350         let source_map = sess.source_map();
3351         let end_point = source_map.end_point(*span);
3352
3353         if let Ok(end_string) = source_map.span_to_snippet(end_point) {
3354             !(end_string.ends_with("}") || end_string.ends_with(")"))
3355         } else {
3356             false
3357         }
3358     };
3359
3360     match expr.node {
3361         // All built-in range literals but `..=` and `..` desugar to `Struct`s.
3362         ExprKind::Struct(ref qpath, _, _) => {
3363             if let QPath::Resolved(None, ref path) = **qpath {
3364                 return is_range_path(&path) && is_lit(sess, &expr.span);
3365             }
3366         }
3367
3368         // `..` desugars to its struct path.
3369         ExprKind::Path(QPath::Resolved(None, ref path)) => {
3370             return is_range_path(&path) && is_lit(sess, &expr.span);
3371         }
3372
3373         // `..=` desugars into `::std::ops::RangeInclusive::new(...)`.
3374         ExprKind::Call(ref func, _) => {
3375             if let ExprKind::Path(QPath::TypeRelative(ref ty, ref segment)) = func.node {
3376                 if let TyKind::Path(QPath::Resolved(None, ref path)) = ty.node {
3377                     let new_call = segment.ident.as_str() == "new";
3378                     return is_range_path(&path) && is_lit(sess, &expr.span) && new_call;
3379                 }
3380             }
3381         }
3382
3383         _ => {}
3384     }
3385
3386     false
3387 }