]> git.lizzy.rs Git - rust.git/blob - src/librustc_typeck/check/mod.rs
Rollup merge of #64842 - pnkfelix:fix-issue-61631-self-in-type-param-default, r=alexreg
[rust.git] / src / librustc_typeck / check / mod.rs
1 // ignore-tidy-filelength
2
3 /*!
4
5 # typeck: check phase
6
7 Within the check phase of type check, we check each item one at a time
8 (bodies of function expressions are checked as part of the containing
9 function). Inference is used to supply types wherever they are unknown.
10
11 By far the most complex case is checking the body of a function. This
12 can be broken down into several distinct phases:
13
14 - gather: creates type variables to represent the type of each local
15   variable and pattern binding.
16
17 - main: the main pass does the lion's share of the work: it
18   determines the types of all expressions, resolves
19   methods, checks for most invalid conditions, and so forth.  In
20   some cases, where a type is unknown, it may create a type or region
21   variable and use that as the type of an expression.
22
23   In the process of checking, various constraints will be placed on
24   these type variables through the subtyping relationships requested
25   through the `demand` module.  The `infer` module is in charge
26   of resolving those constraints.
27
28 - regionck: after main is complete, the regionck pass goes over all
29   types looking for regions and making sure that they did not escape
30   into places they are not in scope.  This may also influence the
31   final assignments of the various region variables if there is some
32   flexibility.
33
34 - vtable: find and records the impls to use for each trait bound that
35   appears on a type parameter.
36
37 - writeback: writes the final types within a function body, replacing
38   type variables with their final inferred types.  These final types
39   are written into the `tcx.node_types` table, which should *never* contain
40   any reference to a type variable.
41
42 ## Intermediate types
43
44 While type checking a function, the intermediate types for the
45 expressions, blocks, and so forth contained within the function are
46 stored in `fcx.node_types` and `fcx.node_substs`.  These types
47 may contain unresolved type variables.  After type checking is
48 complete, the functions in the writeback module are used to take the
49 types from this table, resolve them, and then write them into their
50 permanent home in the type context `tcx`.
51
52 This means that during inferencing you should use `fcx.write_ty()`
53 and `fcx.expr_ty()` / `fcx.node_ty()` to write/obtain the types of
54 nodes within the function.
55
56 The types of top-level items, which never contain unbound type
57 variables, are stored directly into the `tcx` tables.
58
59 N.B., a type variable is not the same thing as a type parameter.  A
60 type variable is rather an "instance" of a type parameter: that is,
61 given a generic function `fn foo<T>(t: T)`: while checking the
62 function `foo`, the type `ty_param(0)` refers to the type `T`, which
63 is treated in abstract.  When `foo()` is called, however, `T` will be
64 substituted for a fresh type variable `N`.  This variable will
65 eventually be resolved to some concrete type (which might itself be
66 type parameter).
67
68 */
69
70 mod autoderef;
71 pub mod dropck;
72 pub mod _match;
73 mod pat;
74 pub mod writeback;
75 mod regionck;
76 pub mod coercion;
77 pub mod demand;
78 mod expr;
79 pub mod method;
80 mod upvar;
81 mod wfcheck;
82 mod cast;
83 mod closure;
84 mod callee;
85 mod compare_method;
86 mod generator_interior;
87 pub mod intrinsic;
88 mod op;
89
90 use crate::astconv::{AstConv, PathSeg};
91 use errors::{Applicability, DiagnosticBuilder, DiagnosticId, pluralise};
92 use rustc::hir::{self, ExprKind, GenericArg, ItemKind, Node, PatKind, QPath};
93 use rustc::hir::def::{CtorOf, Res, DefKind};
94 use rustc::hir::def_id::{CrateNum, DefId, LOCAL_CRATE};
95 use rustc::hir::intravisit::{self, Visitor, NestedVisitorMap};
96 use rustc::hir::itemlikevisit::ItemLikeVisitor;
97 use rustc::hir::ptr::P;
98 use crate::middle::lang_items;
99 use crate::namespace::Namespace;
100 use rustc::infer::{self, InferCtxt, InferOk, InferResult};
101 use rustc::infer::canonical::{Canonical, OriginalQueryValues, QueryResponse};
102 use rustc_index::vec::Idx;
103 use rustc_target::spec::abi::Abi;
104 use rustc::infer::opaque_types::OpaqueTypeDecl;
105 use rustc::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
106 use rustc::infer::unify_key::{ConstVariableOrigin, ConstVariableOriginKind};
107 use rustc::middle::region;
108 use rustc::mir::interpret::{ConstValue, GlobalId};
109 use rustc::traits::{self, ObligationCause, ObligationCauseCode, TraitEngine};
110 use rustc::ty::{
111     self, AdtKind, CanonicalUserType, Ty, TyCtxt, Const, GenericParamDefKind,
112     ToPolyTraitRef, ToPredicate, RegionKind, UserType
113 };
114 use rustc::ty::adjustment::{
115     Adjust, Adjustment, AllowTwoPhase, AutoBorrow, AutoBorrowMutability, PointerCast
116 };
117 use rustc::ty::fold::TypeFoldable;
118 use rustc::ty::query::Providers;
119 use rustc::ty::subst::{
120     GenericArgKind, Subst, InternalSubsts, SubstsRef, UserSelfTy, UserSubsts,
121 };
122 use rustc::ty::util::{Representability, IntTypeExt, Discr};
123 use rustc::ty::layout::VariantIdx;
124 use syntax_pos::{self, BytePos, Span, MultiSpan};
125 use syntax_pos::hygiene::DesugaringKind;
126 use syntax::ast;
127 use syntax::attr;
128 use syntax::feature_gate::{GateIssue, emit_feature_err};
129 use syntax::source_map::{DUMMY_SP, original_sp};
130 use syntax::symbol::{kw, sym};
131 use syntax::util::parser::ExprPrecedence;
132
133 use std::cell::{Cell, RefCell, Ref, RefMut};
134 use std::collections::hash_map::Entry;
135 use std::cmp;
136 use std::iter;
137 use std::mem::replace;
138 use std::ops::{self, Deref};
139 use std::slice;
140
141 use crate::require_c_abi_if_c_variadic;
142 use crate::session::Session;
143 use crate::session::config::EntryFnType;
144 use crate::TypeAndSubsts;
145 use crate::lint;
146 use crate::util::captures::Captures;
147 use crate::util::common::{ErrorReported, indenter};
148 use crate::util::nodemap::{DefIdMap, DefIdSet, FxHashSet, HirIdMap};
149
150 pub use self::Expectation::*;
151 use self::autoderef::Autoderef;
152 use self::callee::DeferredCallResolution;
153 use self::coercion::{CoerceMany, DynamicCoerceMany};
154 pub use self::compare_method::{compare_impl_method, compare_const_impl};
155 use self::method::{MethodCallee, SelfSource};
156 use self::TupleArgumentsFlag::*;
157
158 /// The type of a local binding, including the revealed type for anon types.
159 #[derive(Copy, Clone, Debug)]
160 pub struct LocalTy<'tcx> {
161     decl_ty: Ty<'tcx>,
162     revealed_ty: Ty<'tcx>
163 }
164
165 /// A wrapper for `InferCtxt`'s `in_progress_tables` field.
166 #[derive(Copy, Clone)]
167 struct MaybeInProgressTables<'a, 'tcx> {
168     maybe_tables: Option<&'a RefCell<ty::TypeckTables<'tcx>>>,
169 }
170
171 impl<'a, 'tcx> MaybeInProgressTables<'a, 'tcx> {
172     fn borrow(self) -> Ref<'a, ty::TypeckTables<'tcx>> {
173         match self.maybe_tables {
174             Some(tables) => tables.borrow(),
175             None => {
176                 bug!("MaybeInProgressTables: inh/fcx.tables.borrow() with no tables")
177             }
178         }
179     }
180
181     fn borrow_mut(self) -> RefMut<'a, ty::TypeckTables<'tcx>> {
182         match self.maybe_tables {
183             Some(tables) => tables.borrow_mut(),
184             None => {
185                 bug!("MaybeInProgressTables: inh/fcx.tables.borrow_mut() with no tables")
186             }
187         }
188     }
189 }
190
191 /// Closures defined within the function. For example:
192 ///
193 ///     fn foo() {
194 ///         bar(move|| { ... })
195 ///     }
196 ///
197 /// Here, the function `foo()` and the closure passed to
198 /// `bar()` will each have their own `FnCtxt`, but they will
199 /// share the inherited fields.
200 pub struct Inherited<'a, 'tcx> {
201     infcx: InferCtxt<'a, 'tcx>,
202
203     tables: MaybeInProgressTables<'a, 'tcx>,
204
205     locals: RefCell<HirIdMap<LocalTy<'tcx>>>,
206
207     fulfillment_cx: RefCell<Box<dyn TraitEngine<'tcx>>>,
208
209     // Some additional `Sized` obligations badly affect type inference.
210     // These obligations are added in a later stage of typeck.
211     deferred_sized_obligations: RefCell<Vec<(Ty<'tcx>, Span, traits::ObligationCauseCode<'tcx>)>>,
212
213     // When we process a call like `c()` where `c` is a closure type,
214     // we may not have decided yet whether `c` is a `Fn`, `FnMut`, or
215     // `FnOnce` closure. In that case, we defer full resolution of the
216     // call until upvar inference can kick in and make the
217     // decision. We keep these deferred resolutions grouped by the
218     // def-id of the closure, so that once we decide, we can easily go
219     // back and process them.
220     deferred_call_resolutions: RefCell<DefIdMap<Vec<DeferredCallResolution<'tcx>>>>,
221
222     deferred_cast_checks: RefCell<Vec<cast::CastCheck<'tcx>>>,
223
224     deferred_generator_interiors: RefCell<Vec<(hir::BodyId, Ty<'tcx>, hir::GeneratorKind)>>,
225
226     // Opaque types found in explicit return types and their
227     // associated fresh inference variable. Writeback resolves these
228     // variables to get the concrete type, which can be used to
229     // 'de-opaque' OpaqueTypeDecl, after typeck is done with all functions.
230     opaque_types: RefCell<DefIdMap<OpaqueTypeDecl<'tcx>>>,
231
232     /// Each type parameter has an implicit region bound that
233     /// indicates it must outlive at least the function body (the user
234     /// may specify stronger requirements). This field indicates the
235     /// region of the callee. If it is `None`, then the parameter
236     /// environment is for an item or something where the "callee" is
237     /// not clear.
238     implicit_region_bound: Option<ty::Region<'tcx>>,
239
240     body_id: Option<hir::BodyId>,
241 }
242
243 impl<'a, 'tcx> Deref for Inherited<'a, 'tcx> {
244     type Target = InferCtxt<'a, 'tcx>;
245     fn deref(&self) -> &Self::Target {
246         &self.infcx
247     }
248 }
249
250 /// When type-checking an expression, we propagate downward
251 /// whatever type hint we are able in the form of an `Expectation`.
252 #[derive(Copy, Clone, Debug)]
253 pub enum Expectation<'tcx> {
254     /// We know nothing about what type this expression should have.
255     NoExpectation,
256
257     /// This expression should have the type given (or some subtype).
258     ExpectHasType(Ty<'tcx>),
259
260     /// This expression will be cast to the `Ty`.
261     ExpectCastableToType(Ty<'tcx>),
262
263     /// This rvalue expression will be wrapped in `&` or `Box` and coerced
264     /// to `&Ty` or `Box<Ty>`, respectively. `Ty` is `[A]` or `Trait`.
265     ExpectRvalueLikeUnsized(Ty<'tcx>),
266 }
267
268 impl<'a, 'tcx> Expectation<'tcx> {
269     // Disregard "castable to" expectations because they
270     // can lead us astray. Consider for example `if cond
271     // {22} else {c} as u8` -- if we propagate the
272     // "castable to u8" constraint to 22, it will pick the
273     // type 22u8, which is overly constrained (c might not
274     // be a u8). In effect, the problem is that the
275     // "castable to" expectation is not the tightest thing
276     // we can say, so we want to drop it in this case.
277     // The tightest thing we can say is "must unify with
278     // else branch". Note that in the case of a "has type"
279     // constraint, this limitation does not hold.
280
281     // If the expected type is just a type variable, then don't use
282     // an expected type. Otherwise, we might write parts of the type
283     // when checking the 'then' block which are incompatible with the
284     // 'else' branch.
285     fn adjust_for_branches(&self, fcx: &FnCtxt<'a, 'tcx>) -> Expectation<'tcx> {
286         match *self {
287             ExpectHasType(ety) => {
288                 let ety = fcx.shallow_resolve(ety);
289                 if !ety.is_ty_var() {
290                     ExpectHasType(ety)
291                 } else {
292                     NoExpectation
293                 }
294             }
295             ExpectRvalueLikeUnsized(ety) => {
296                 ExpectRvalueLikeUnsized(ety)
297             }
298             _ => NoExpectation
299         }
300     }
301
302     /// Provides an expectation for an rvalue expression given an *optional*
303     /// hint, which is not required for type safety (the resulting type might
304     /// be checked higher up, as is the case with `&expr` and `box expr`), but
305     /// is useful in determining the concrete type.
306     ///
307     /// The primary use case is where the expected type is a fat pointer,
308     /// like `&[isize]`. For example, consider the following statement:
309     ///
310     ///    let x: &[isize] = &[1, 2, 3];
311     ///
312     /// In this case, the expected type for the `&[1, 2, 3]` expression is
313     /// `&[isize]`. If however we were to say that `[1, 2, 3]` has the
314     /// expectation `ExpectHasType([isize])`, that would be too strong --
315     /// `[1, 2, 3]` does not have the type `[isize]` but rather `[isize; 3]`.
316     /// It is only the `&[1, 2, 3]` expression as a whole that can be coerced
317     /// to the type `&[isize]`. Therefore, we propagate this more limited hint,
318     /// which still is useful, because it informs integer literals and the like.
319     /// See the test case `test/ui/coerce-expect-unsized.rs` and #20169
320     /// for examples of where this comes up,.
321     fn rvalue_hint(fcx: &FnCtxt<'a, 'tcx>, ty: Ty<'tcx>) -> Expectation<'tcx> {
322         match fcx.tcx.struct_tail_without_normalization(ty).kind {
323             ty::Slice(_) | ty::Str | ty::Dynamic(..) => {
324                 ExpectRvalueLikeUnsized(ty)
325             }
326             _ => ExpectHasType(ty)
327         }
328     }
329
330     // Resolves `expected` by a single level if it is a variable. If
331     // there is no expected type or resolution is not possible (e.g.,
332     // no constraints yet present), just returns `None`.
333     fn resolve(self, fcx: &FnCtxt<'a, 'tcx>) -> Expectation<'tcx> {
334         match self {
335             NoExpectation => NoExpectation,
336             ExpectCastableToType(t) => {
337                 ExpectCastableToType(fcx.resolve_vars_if_possible(&t))
338             }
339             ExpectHasType(t) => {
340                 ExpectHasType(fcx.resolve_vars_if_possible(&t))
341             }
342             ExpectRvalueLikeUnsized(t) => {
343                 ExpectRvalueLikeUnsized(fcx.resolve_vars_if_possible(&t))
344             }
345         }
346     }
347
348     fn to_option(self, fcx: &FnCtxt<'a, 'tcx>) -> Option<Ty<'tcx>> {
349         match self.resolve(fcx) {
350             NoExpectation => None,
351             ExpectCastableToType(ty) |
352             ExpectHasType(ty) |
353             ExpectRvalueLikeUnsized(ty) => Some(ty),
354         }
355     }
356
357     /// It sometimes happens that we want to turn an expectation into
358     /// a **hard constraint** (i.e., something that must be satisfied
359     /// for the program to type-check). `only_has_type` will return
360     /// such a constraint, if it exists.
361     fn only_has_type(self, fcx: &FnCtxt<'a, 'tcx>) -> Option<Ty<'tcx>> {
362         match self.resolve(fcx) {
363             ExpectHasType(ty) => Some(ty),
364             NoExpectation | ExpectCastableToType(_) | ExpectRvalueLikeUnsized(_) => None,
365         }
366     }
367
368     /// Like `only_has_type`, but instead of returning `None` if no
369     /// hard constraint exists, creates a fresh type variable.
370     fn coercion_target_type(self, fcx: &FnCtxt<'a, 'tcx>, span: Span) -> Ty<'tcx> {
371         self.only_has_type(fcx)
372             .unwrap_or_else(|| {
373                 fcx.next_ty_var(TypeVariableOrigin {
374                     kind: TypeVariableOriginKind::MiscVariable,
375                     span,
376                 })
377             })
378     }
379 }
380
381 #[derive(Copy, Clone, Debug, PartialEq, Eq)]
382 pub enum Needs {
383     MutPlace,
384     None
385 }
386
387 impl Needs {
388     fn maybe_mut_place(m: hir::Mutability) -> Self {
389         match m {
390             hir::MutMutable => Needs::MutPlace,
391             hir::MutImmutable => Needs::None,
392         }
393     }
394 }
395
396 #[derive(Copy, Clone)]
397 pub struct UnsafetyState {
398     pub def: hir::HirId,
399     pub unsafety: hir::Unsafety,
400     pub unsafe_push_count: u32,
401     from_fn: bool
402 }
403
404 impl UnsafetyState {
405     pub fn function(unsafety: hir::Unsafety, def: hir::HirId) -> UnsafetyState {
406         UnsafetyState { def, unsafety, unsafe_push_count: 0, from_fn: true }
407     }
408
409     pub fn recurse(&mut self, blk: &hir::Block) -> UnsafetyState {
410         match self.unsafety {
411             // If this unsafe, then if the outer function was already marked as
412             // unsafe we shouldn't attribute the unsafe'ness to the block. This
413             // way the block can be warned about instead of ignoring this
414             // extraneous block (functions are never warned about).
415             hir::Unsafety::Unsafe if self.from_fn => *self,
416
417             unsafety => {
418                 let (unsafety, def, count) = match blk.rules {
419                     hir::PushUnsafeBlock(..) =>
420                         (unsafety, blk.hir_id, self.unsafe_push_count.checked_add(1).unwrap()),
421                     hir::PopUnsafeBlock(..) =>
422                         (unsafety, blk.hir_id, self.unsafe_push_count.checked_sub(1).unwrap()),
423                     hir::UnsafeBlock(..) =>
424                         (hir::Unsafety::Unsafe, blk.hir_id, self.unsafe_push_count),
425                     hir::DefaultBlock =>
426                         (unsafety, self.def, self.unsafe_push_count),
427                 };
428                 UnsafetyState{ def,
429                                unsafety,
430                                unsafe_push_count: count,
431                                from_fn: false }
432             }
433         }
434     }
435 }
436
437 #[derive(Debug, Copy, Clone)]
438 pub enum PlaceOp {
439     Deref,
440     Index
441 }
442
443 /// Tracks whether executing a node may exit normally (versus
444 /// return/break/panic, which "diverge", leaving dead code in their
445 /// wake). Tracked semi-automatically (through type variables marked
446 /// as diverging), with some manual adjustments for control-flow
447 /// primitives (approximating a CFG).
448 #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
449 pub enum Diverges {
450     /// Potentially unknown, some cases converge,
451     /// others require a CFG to determine them.
452     Maybe,
453
454     /// Definitely known to diverge and therefore
455     /// not reach the next sibling or its parent.
456     Always {
457         /// The `Span` points to the expression
458         /// that caused us to diverge
459         /// (e.g. `return`, `break`, etc).
460         span: Span,
461         /// In some cases (e.g. a `match` expression
462         /// where all arms diverge), we may be
463         /// able to provide a more informative
464         /// message to the user.
465         /// If this is `None`, a default messsage
466         /// will be generated, which is suitable
467         /// for most cases.
468         custom_note: Option<&'static str>
469     },
470
471     /// Same as `Always` but with a reachability
472     /// warning already emitted.
473     WarnedAlways
474 }
475
476 // Convenience impls for combining `Diverges`.
477
478 impl ops::BitAnd for Diverges {
479     type Output = Self;
480     fn bitand(self, other: Self) -> Self {
481         cmp::min(self, other)
482     }
483 }
484
485 impl ops::BitOr for Diverges {
486     type Output = Self;
487     fn bitor(self, other: Self) -> Self {
488         cmp::max(self, other)
489     }
490 }
491
492 impl ops::BitAndAssign for Diverges {
493     fn bitand_assign(&mut self, other: Self) {
494         *self = *self & other;
495     }
496 }
497
498 impl ops::BitOrAssign for Diverges {
499     fn bitor_assign(&mut self, other: Self) {
500         *self = *self | other;
501     }
502 }
503
504 impl Diverges {
505     /// Creates a `Diverges::Always` with the provided `span` and the default note message.
506     fn always(span: Span) -> Diverges {
507         Diverges::Always {
508             span,
509             custom_note: None
510         }
511     }
512
513     fn is_always(self) -> bool {
514         // Enum comparison ignores the
515         // contents of fields, so we just
516         // fill them in with garbage here.
517         self >= Diverges::Always {
518             span: DUMMY_SP,
519             custom_note: None
520         }
521     }
522 }
523
524 pub struct BreakableCtxt<'tcx> {
525     may_break: bool,
526
527     // this is `null` for loops where break with a value is illegal,
528     // such as `while`, `for`, and `while let`
529     coerce: Option<DynamicCoerceMany<'tcx>>,
530 }
531
532 pub struct EnclosingBreakables<'tcx> {
533     stack: Vec<BreakableCtxt<'tcx>>,
534     by_id: HirIdMap<usize>,
535 }
536
537 impl<'tcx> EnclosingBreakables<'tcx> {
538     fn find_breakable(&mut self, target_id: hir::HirId) -> &mut BreakableCtxt<'tcx> {
539         let ix = *self.by_id.get(&target_id).unwrap_or_else(|| {
540             bug!("could not find enclosing breakable with id {}", target_id);
541         });
542         &mut self.stack[ix]
543     }
544 }
545
546 pub struct FnCtxt<'a, 'tcx> {
547     body_id: hir::HirId,
548
549     /// The parameter environment used for proving trait obligations
550     /// in this function. This can change when we descend into
551     /// closures (as they bring new things into scope), hence it is
552     /// not part of `Inherited` (as of the time of this writing,
553     /// closures do not yet change the environment, but they will
554     /// eventually).
555     param_env: ty::ParamEnv<'tcx>,
556
557     /// Number of errors that had been reported when we started
558     /// checking this function. On exit, if we find that *more* errors
559     /// have been reported, we will skip regionck and other work that
560     /// expects the types within the function to be consistent.
561     // FIXME(matthewjasper) This should not exist, and it's not correct
562     // if type checking is run in parallel.
563     err_count_on_creation: usize,
564
565     /// If `Some`, this stores coercion information for returned
566     /// expressions. If `None`, this is in a context where return is
567     /// inappropriate, such as a const expression.
568     ///
569     /// This is a `RefCell<DynamicCoerceMany>`, which means that we
570     /// can track all the return expressions and then use them to
571     /// compute a useful coercion from the set, similar to a match
572     /// expression or other branching context. You can use methods
573     /// like `expected_ty` to access the declared return type (if
574     /// any).
575     ret_coercion: Option<RefCell<DynamicCoerceMany<'tcx>>>,
576
577     /// First span of a return site that we find. Used in error messages.
578     ret_coercion_span: RefCell<Option<Span>>,
579
580     yield_ty: Option<Ty<'tcx>>,
581
582     ps: RefCell<UnsafetyState>,
583
584     /// Whether the last checked node generates a divergence (e.g.,
585     /// `return` will set this to `Always`). In general, when entering
586     /// an expression or other node in the tree, the initial value
587     /// indicates whether prior parts of the containing expression may
588     /// have diverged. It is then typically set to `Maybe` (and the
589     /// old value remembered) for processing the subparts of the
590     /// current expression. As each subpart is processed, they may set
591     /// the flag to `Always`, etc. Finally, at the end, we take the
592     /// result and "union" it with the original value, so that when we
593     /// return the flag indicates if any subpart of the parent
594     /// expression (up to and including this part) has diverged. So,
595     /// if you read it after evaluating a subexpression `X`, the value
596     /// you get indicates whether any subexpression that was
597     /// evaluating up to and including `X` diverged.
598     ///
599     /// We currently use this flag only for diagnostic purposes:
600     ///
601     /// - To warn about unreachable code: if, after processing a
602     ///   sub-expression but before we have applied the effects of the
603     ///   current node, we see that the flag is set to `Always`, we
604     ///   can issue a warning. This corresponds to something like
605     ///   `foo(return)`; we warn on the `foo()` expression. (We then
606     ///   update the flag to `WarnedAlways` to suppress duplicate
607     ///   reports.) Similarly, if we traverse to a fresh statement (or
608     ///   tail expression) from a `Always` setting, we will issue a
609     ///   warning. This corresponds to something like `{return;
610     ///   foo();}` or `{return; 22}`, where we would warn on the
611     ///   `foo()` or `22`.
612     ///
613     /// An expression represents dead code if, after checking it,
614     /// the diverges flag is set to something other than `Maybe`.
615     diverges: Cell<Diverges>,
616
617     /// Whether any child nodes have any type errors.
618     has_errors: Cell<bool>,
619
620     enclosing_breakables: RefCell<EnclosingBreakables<'tcx>>,
621
622     inh: &'a Inherited<'a, 'tcx>,
623 }
624
625 impl<'a, 'tcx> Deref for FnCtxt<'a, 'tcx> {
626     type Target = Inherited<'a, 'tcx>;
627     fn deref(&self) -> &Self::Target {
628         &self.inh
629     }
630 }
631
632 /// Helper type of a temporary returned by `Inherited::build(...)`.
633 /// Necessary because we can't write the following bound:
634 /// `F: for<'b, 'tcx> where 'tcx FnOnce(Inherited<'b, 'tcx>)`.
635 pub struct InheritedBuilder<'tcx> {
636     infcx: infer::InferCtxtBuilder<'tcx>,
637     def_id: DefId,
638 }
639
640 impl Inherited<'_, 'tcx> {
641     pub fn build(tcx: TyCtxt<'tcx>, def_id: DefId) -> InheritedBuilder<'tcx> {
642         let hir_id_root = if def_id.is_local() {
643             let hir_id = tcx.hir().as_local_hir_id(def_id).unwrap();
644             DefId::local(hir_id.owner)
645         } else {
646             def_id
647         };
648
649         InheritedBuilder {
650             infcx: tcx.infer_ctxt().with_fresh_in_progress_tables(hir_id_root),
651             def_id,
652         }
653     }
654 }
655
656 impl<'tcx> InheritedBuilder<'tcx> {
657     fn enter<F, R>(&mut self, f: F) -> R
658     where
659         F: for<'a> FnOnce(Inherited<'a, 'tcx>) -> R,
660     {
661         let def_id = self.def_id;
662         self.infcx.enter(|infcx| f(Inherited::new(infcx, def_id)))
663     }
664 }
665
666 impl Inherited<'a, 'tcx> {
667     fn new(infcx: InferCtxt<'a, 'tcx>, def_id: DefId) -> Self {
668         let tcx = infcx.tcx;
669         let item_id = tcx.hir().as_local_hir_id(def_id);
670         let body_id = item_id.and_then(|id| tcx.hir().maybe_body_owned_by(id));
671         let implicit_region_bound = body_id.map(|body_id| {
672             let body = tcx.hir().body(body_id);
673             tcx.mk_region(ty::ReScope(region::Scope {
674                 id: body.value.hir_id.local_id,
675                 data: region::ScopeData::CallSite
676             }))
677         });
678
679         Inherited {
680             tables: MaybeInProgressTables {
681                 maybe_tables: infcx.in_progress_tables,
682             },
683             infcx,
684             fulfillment_cx: RefCell::new(TraitEngine::new(tcx)),
685             locals: RefCell::new(Default::default()),
686             deferred_sized_obligations: RefCell::new(Vec::new()),
687             deferred_call_resolutions: RefCell::new(Default::default()),
688             deferred_cast_checks: RefCell::new(Vec::new()),
689             deferred_generator_interiors: RefCell::new(Vec::new()),
690             opaque_types: RefCell::new(Default::default()),
691             implicit_region_bound,
692             body_id,
693         }
694     }
695
696     fn register_predicate(&self, obligation: traits::PredicateObligation<'tcx>) {
697         debug!("register_predicate({:?})", obligation);
698         if obligation.has_escaping_bound_vars() {
699             span_bug!(obligation.cause.span, "escaping bound vars in predicate {:?}",
700                       obligation);
701         }
702         self.fulfillment_cx
703             .borrow_mut()
704             .register_predicate_obligation(self, obligation);
705     }
706
707     fn register_predicates<I>(&self, obligations: I)
708         where I: IntoIterator<Item = traits::PredicateObligation<'tcx>>
709     {
710         for obligation in obligations {
711             self.register_predicate(obligation);
712         }
713     }
714
715     fn register_infer_ok_obligations<T>(&self, infer_ok: InferOk<'tcx, T>) -> T {
716         self.register_predicates(infer_ok.obligations);
717         infer_ok.value
718     }
719
720     fn normalize_associated_types_in<T>(&self,
721                                         span: Span,
722                                         body_id: hir::HirId,
723                                         param_env: ty::ParamEnv<'tcx>,
724                                         value: &T) -> T
725         where T : TypeFoldable<'tcx>
726     {
727         let ok = self.partially_normalize_associated_types_in(span, body_id, param_env, value);
728         self.register_infer_ok_obligations(ok)
729     }
730 }
731
732 struct CheckItemTypesVisitor<'tcx> {
733     tcx: TyCtxt<'tcx>,
734 }
735
736 impl ItemLikeVisitor<'tcx> for CheckItemTypesVisitor<'tcx> {
737     fn visit_item(&mut self, i: &'tcx hir::Item) {
738         check_item_type(self.tcx, i);
739     }
740     fn visit_trait_item(&mut self, _: &'tcx hir::TraitItem) { }
741     fn visit_impl_item(&mut self, _: &'tcx hir::ImplItem) { }
742 }
743
744 pub fn check_wf_new(tcx: TyCtxt<'_>) {
745     let mut visit = wfcheck::CheckTypeWellFormedVisitor::new(tcx);
746     tcx.hir().krate().par_visit_all_item_likes(&mut visit);
747 }
748
749 fn check_mod_item_types(tcx: TyCtxt<'_>, module_def_id: DefId) {
750     tcx.hir().visit_item_likes_in_module(module_def_id, &mut CheckItemTypesVisitor { tcx });
751 }
752
753 fn typeck_item_bodies(tcx: TyCtxt<'_>, crate_num: CrateNum) {
754     debug_assert!(crate_num == LOCAL_CRATE);
755     tcx.par_body_owners(|body_owner_def_id| {
756         tcx.ensure().typeck_tables_of(body_owner_def_id);
757     });
758 }
759
760 fn check_item_well_formed(tcx: TyCtxt<'_>, def_id: DefId) {
761     wfcheck::check_item_well_formed(tcx, def_id);
762 }
763
764 fn check_trait_item_well_formed(tcx: TyCtxt<'_>, def_id: DefId) {
765     wfcheck::check_trait_item(tcx, def_id);
766 }
767
768 fn check_impl_item_well_formed(tcx: TyCtxt<'_>, def_id: DefId) {
769     wfcheck::check_impl_item(tcx, def_id);
770 }
771
772 pub fn provide(providers: &mut Providers<'_>) {
773     method::provide(providers);
774     *providers = Providers {
775         typeck_item_bodies,
776         typeck_tables_of,
777         has_typeck_tables,
778         adt_destructor,
779         used_trait_imports,
780         check_item_well_formed,
781         check_trait_item_well_formed,
782         check_impl_item_well_formed,
783         check_mod_item_types,
784         ..*providers
785     };
786 }
787
788 fn adt_destructor(tcx: TyCtxt<'_>, def_id: DefId) -> Option<ty::Destructor> {
789     tcx.calculate_dtor(def_id, &mut dropck::check_drop_impl)
790 }
791
792 /// If this `DefId` is a "primary tables entry", returns
793 /// `Some((body_id, header, decl))` with information about
794 /// it's body-id, fn-header and fn-decl (if any). Otherwise,
795 /// returns `None`.
796 ///
797 /// If this function returns `Some`, then `typeck_tables(def_id)` will
798 /// succeed; if it returns `None`, then `typeck_tables(def_id)` may or
799 /// may not succeed. In some cases where this function returns `None`
800 /// (notably closures), `typeck_tables(def_id)` would wind up
801 /// redirecting to the owning function.
802 fn primary_body_of(
803     tcx: TyCtxt<'_>,
804     id: hir::HirId,
805 ) -> Option<(hir::BodyId, Option<&hir::Ty>, Option<&hir::FnHeader>, Option<&hir::FnDecl>)> {
806     match tcx.hir().get(id) {
807         Node::Item(item) => {
808             match item.kind {
809                 hir::ItemKind::Const(ref ty, body) |
810                 hir::ItemKind::Static(ref ty, _, body) =>
811                     Some((body, Some(ty), None, None)),
812                 hir::ItemKind::Fn(ref decl, ref header, .., body) =>
813                     Some((body, None, Some(header), Some(decl))),
814                 _ =>
815                     None,
816             }
817         }
818         Node::TraitItem(item) => {
819             match item.kind {
820                 hir::TraitItemKind::Const(ref ty, Some(body)) =>
821                     Some((body, Some(ty), None, None)),
822                 hir::TraitItemKind::Method(ref sig, hir::TraitMethod::Provided(body)) =>
823                     Some((body, None, Some(&sig.header), Some(&sig.decl))),
824                 _ =>
825                     None,
826             }
827         }
828         Node::ImplItem(item) => {
829             match item.kind {
830                 hir::ImplItemKind::Const(ref ty, body) =>
831                     Some((body, Some(ty), None, None)),
832                 hir::ImplItemKind::Method(ref sig, body) =>
833                     Some((body, None, Some(&sig.header), Some(&sig.decl))),
834                 _ =>
835                     None,
836             }
837         }
838         Node::AnonConst(constant) => Some((constant.body, None, None, None)),
839         _ => None,
840     }
841 }
842
843 fn has_typeck_tables(tcx: TyCtxt<'_>, def_id: DefId) -> bool {
844     // Closures' tables come from their outermost function,
845     // as they are part of the same "inference environment".
846     let outer_def_id = tcx.closure_base_def_id(def_id);
847     if outer_def_id != def_id {
848         return tcx.has_typeck_tables(outer_def_id);
849     }
850
851     let id = tcx.hir().as_local_hir_id(def_id).unwrap();
852     primary_body_of(tcx, id).is_some()
853 }
854
855 fn used_trait_imports(tcx: TyCtxt<'_>, def_id: DefId) -> &DefIdSet {
856     &*tcx.typeck_tables_of(def_id).used_trait_imports
857 }
858
859 fn typeck_tables_of(tcx: TyCtxt<'_>, def_id: DefId) -> &ty::TypeckTables<'_> {
860     // Closures' tables come from their outermost function,
861     // as they are part of the same "inference environment".
862     let outer_def_id = tcx.closure_base_def_id(def_id);
863     if outer_def_id != def_id {
864         return tcx.typeck_tables_of(outer_def_id);
865     }
866
867     let id = tcx.hir().as_local_hir_id(def_id).unwrap();
868     let span = tcx.hir().span(id);
869
870     // Figure out what primary body this item has.
871     let (body_id, body_ty, fn_header, fn_decl) = primary_body_of(tcx, id)
872         .unwrap_or_else(|| {
873             span_bug!(span, "can't type-check body of {:?}", def_id);
874         });
875     let body = tcx.hir().body(body_id);
876
877     let tables = Inherited::build(tcx, def_id).enter(|inh| {
878         let param_env = tcx.param_env(def_id);
879         let fcx = if let (Some(header), Some(decl)) = (fn_header, fn_decl) {
880             let fn_sig = if crate::collect::get_infer_ret_ty(&decl.output).is_some() {
881                 let fcx = FnCtxt::new(&inh, param_env, body.value.hir_id);
882                 AstConv::ty_of_fn(&fcx, header.unsafety, header.abi, decl)
883             } else {
884                 tcx.fn_sig(def_id)
885             };
886
887             check_abi(tcx, span, fn_sig.abi());
888
889             // Compute the fty from point of view of inside the fn.
890             let fn_sig =
891                 tcx.liberate_late_bound_regions(def_id, &fn_sig);
892             let fn_sig =
893                 inh.normalize_associated_types_in(body.value.span,
894                                                   body_id.hir_id,
895                                                   param_env,
896                                                   &fn_sig);
897
898             let fcx = check_fn(&inh, param_env, fn_sig, decl, id, body, None).0;
899             fcx
900         } else {
901             let fcx = FnCtxt::new(&inh, param_env, body.value.hir_id);
902             let expected_type = body_ty.and_then(|ty| match ty.kind {
903                 hir::TyKind::Infer => Some(AstConv::ast_ty_to_ty(&fcx, ty)),
904                 _ => None
905             }).unwrap_or_else(|| tcx.type_of(def_id));
906             let expected_type = fcx.normalize_associated_types_in(body.value.span, &expected_type);
907             fcx.require_type_is_sized(expected_type, body.value.span, traits::ConstSized);
908
909             let revealed_ty = if tcx.features().impl_trait_in_bindings {
910                 fcx.instantiate_opaque_types_from_value(
911                     id,
912                     &expected_type,
913                     body.value.span,
914                 )
915             } else {
916                 expected_type
917             };
918
919             // Gather locals in statics (because of block expressions).
920             GatherLocalsVisitor { fcx: &fcx, parent_id: id, }.visit_body(body);
921
922             fcx.check_expr_coercable_to_type(&body.value, revealed_ty);
923
924             fcx.write_ty(id, revealed_ty);
925
926             fcx
927         };
928
929         // All type checking constraints were added, try to fallback unsolved variables.
930         fcx.select_obligations_where_possible(false, |_| {});
931         let mut fallback_has_occurred = false;
932         for ty in &fcx.unsolved_variables() {
933             fallback_has_occurred |= fcx.fallback_if_possible(ty);
934         }
935         fcx.select_obligations_where_possible(fallback_has_occurred, |_| {});
936
937         // Even though coercion casts provide type hints, we check casts after fallback for
938         // backwards compatibility. This makes fallback a stronger type hint than a cast coercion.
939         fcx.check_casts();
940
941         // Closure and generator analysis may run after fallback
942         // because they don't constrain other type variables.
943         fcx.closure_analyze(body);
944         assert!(fcx.deferred_call_resolutions.borrow().is_empty());
945         fcx.resolve_generator_interiors(def_id);
946
947         for (ty, span, code) in fcx.deferred_sized_obligations.borrow_mut().drain(..) {
948             let ty = fcx.normalize_ty(span, ty);
949             fcx.require_type_is_sized(ty, span, code);
950         }
951         fcx.select_all_obligations_or_error();
952
953         if fn_decl.is_some() {
954             fcx.regionck_fn(id, body);
955         } else {
956             fcx.regionck_expr(body);
957         }
958
959         fcx.resolve_type_vars_in_body(body)
960     });
961
962     // Consistency check our TypeckTables instance can hold all ItemLocalIds
963     // it will need to hold.
964     assert_eq!(tables.local_id_root, Some(DefId::local(id.owner)));
965
966     tables
967 }
968
969 fn check_abi(tcx: TyCtxt<'_>, span: Span, abi: Abi) {
970     if !tcx.sess.target.target.is_abi_supported(abi) {
971         struct_span_err!(tcx.sess, span, E0570,
972             "The ABI `{}` is not supported for the current target", abi).emit()
973     }
974 }
975
976 struct GatherLocalsVisitor<'a, 'tcx> {
977     fcx: &'a FnCtxt<'a, 'tcx>,
978     parent_id: hir::HirId,
979 }
980
981 impl<'a, 'tcx> GatherLocalsVisitor<'a, 'tcx> {
982     fn assign(&mut self, span: Span, nid: hir::HirId, ty_opt: Option<LocalTy<'tcx>>) -> Ty<'tcx> {
983         match ty_opt {
984             None => {
985                 // infer the variable's type
986                 let var_ty = self.fcx.next_ty_var(TypeVariableOrigin {
987                     kind: TypeVariableOriginKind::TypeInference,
988                     span,
989                 });
990                 self.fcx.locals.borrow_mut().insert(nid, LocalTy {
991                     decl_ty: var_ty,
992                     revealed_ty: var_ty
993                 });
994                 var_ty
995             }
996             Some(typ) => {
997                 // take type that the user specified
998                 self.fcx.locals.borrow_mut().insert(nid, typ);
999                 typ.revealed_ty
1000             }
1001         }
1002     }
1003 }
1004
1005 impl<'a, 'tcx> Visitor<'tcx> for GatherLocalsVisitor<'a, 'tcx> {
1006     fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> {
1007         NestedVisitorMap::None
1008     }
1009
1010     // Add explicitly-declared locals.
1011     fn visit_local(&mut self, local: &'tcx hir::Local) {
1012         let local_ty = match local.ty {
1013             Some(ref ty) => {
1014                 let o_ty = self.fcx.to_ty(&ty);
1015
1016                 let revealed_ty = if self.fcx.tcx.features().impl_trait_in_bindings {
1017                     self.fcx.instantiate_opaque_types_from_value(
1018                         self.parent_id,
1019                         &o_ty,
1020                         ty.span,
1021                     )
1022                 } else {
1023                     o_ty
1024                 };
1025
1026                 let c_ty = self.fcx.inh.infcx.canonicalize_user_type_annotation(
1027                     &UserType::Ty(revealed_ty)
1028                 );
1029                 debug!("visit_local: ty.hir_id={:?} o_ty={:?} revealed_ty={:?} c_ty={:?}",
1030                        ty.hir_id, o_ty, revealed_ty, c_ty);
1031                 self.fcx.tables.borrow_mut().user_provided_types_mut().insert(ty.hir_id, c_ty);
1032
1033                 Some(LocalTy { decl_ty: o_ty, revealed_ty })
1034             },
1035             None => None,
1036         };
1037         self.assign(local.span, local.hir_id, local_ty);
1038
1039         debug!("local variable {:?} is assigned type {}",
1040                local.pat,
1041                self.fcx.ty_to_string(
1042                    self.fcx.locals.borrow().get(&local.hir_id).unwrap().clone().decl_ty));
1043         intravisit::walk_local(self, local);
1044     }
1045
1046     // Add pattern bindings.
1047     fn visit_pat(&mut self, p: &'tcx hir::Pat) {
1048         if let PatKind::Binding(_, _, ident, _) = p.kind {
1049             let var_ty = self.assign(p.span, p.hir_id, None);
1050
1051             if !self.fcx.tcx.features().unsized_locals {
1052                 self.fcx.require_type_is_sized(var_ty, p.span,
1053                                                traits::VariableType(p.hir_id));
1054             }
1055
1056             debug!("pattern binding {} is assigned to {} with type {:?}",
1057                    ident,
1058                    self.fcx.ty_to_string(
1059                        self.fcx.locals.borrow().get(&p.hir_id).unwrap().clone().decl_ty),
1060                    var_ty);
1061         }
1062         intravisit::walk_pat(self, p);
1063     }
1064
1065     // Don't descend into the bodies of nested closures
1066     fn visit_fn(
1067         &mut self,
1068         _: intravisit::FnKind<'tcx>,
1069         _: &'tcx hir::FnDecl,
1070         _: hir::BodyId,
1071         _: Span,
1072         _: hir::HirId,
1073     ) { }
1074 }
1075
1076 /// When `check_fn` is invoked on a generator (i.e., a body that
1077 /// includes yield), it returns back some information about the yield
1078 /// points.
1079 struct GeneratorTypes<'tcx> {
1080     /// Type of value that is yielded.
1081     yield_ty: Ty<'tcx>,
1082
1083     /// Types that are captured (see `GeneratorInterior` for more).
1084     interior: Ty<'tcx>,
1085
1086     /// Indicates if the generator is movable or static (immovable).
1087     movability: hir::GeneratorMovability,
1088 }
1089
1090 /// Helper used for fns and closures. Does the grungy work of checking a function
1091 /// body and returns the function context used for that purpose, since in the case of a fn item
1092 /// there is still a bit more to do.
1093 ///
1094 /// * ...
1095 /// * inherited: other fields inherited from the enclosing fn (if any)
1096 fn check_fn<'a, 'tcx>(
1097     inherited: &'a Inherited<'a, 'tcx>,
1098     param_env: ty::ParamEnv<'tcx>,
1099     fn_sig: ty::FnSig<'tcx>,
1100     decl: &'tcx hir::FnDecl,
1101     fn_id: hir::HirId,
1102     body: &'tcx hir::Body,
1103     can_be_generator: Option<hir::GeneratorMovability>,
1104 ) -> (FnCtxt<'a, 'tcx>, Option<GeneratorTypes<'tcx>>) {
1105     let mut fn_sig = fn_sig.clone();
1106
1107     debug!("check_fn(sig={:?}, fn_id={}, param_env={:?})", fn_sig, fn_id, param_env);
1108
1109     // Create the function context.  This is either derived from scratch or,
1110     // in the case of closures, based on the outer context.
1111     let mut fcx = FnCtxt::new(inherited, param_env, body.value.hir_id);
1112     *fcx.ps.borrow_mut() = UnsafetyState::function(fn_sig.unsafety, fn_id);
1113
1114     let declared_ret_ty = fn_sig.output();
1115     fcx.require_type_is_sized(declared_ret_ty, decl.output.span(), traits::SizedReturnType);
1116     let revealed_ret_ty = fcx.instantiate_opaque_types_from_value(
1117         fn_id,
1118         &declared_ret_ty,
1119         decl.output.span(),
1120     );
1121     debug!("check_fn: declared_ret_ty: {}, revealed_ret_ty: {}", declared_ret_ty, revealed_ret_ty);
1122     fcx.ret_coercion = Some(RefCell::new(CoerceMany::new(revealed_ret_ty)));
1123     fn_sig = fcx.tcx.mk_fn_sig(
1124         fn_sig.inputs().iter().cloned(),
1125         revealed_ret_ty,
1126         fn_sig.c_variadic,
1127         fn_sig.unsafety,
1128         fn_sig.abi
1129     );
1130
1131     let span = body.value.span;
1132
1133     fn_maybe_err(fcx.tcx, span, fn_sig.abi);
1134
1135     if body.generator_kind.is_some() && can_be_generator.is_some() {
1136         let yield_ty = fcx.next_ty_var(TypeVariableOrigin {
1137             kind: TypeVariableOriginKind::TypeInference,
1138             span,
1139         });
1140         fcx.require_type_is_sized(yield_ty, span, traits::SizedYieldType);
1141         fcx.yield_ty = Some(yield_ty);
1142     }
1143
1144     let outer_def_id = fcx.tcx.closure_base_def_id(fcx.tcx.hir().local_def_id(fn_id));
1145     let outer_hir_id = fcx.tcx.hir().as_local_hir_id(outer_def_id).unwrap();
1146     GatherLocalsVisitor { fcx: &fcx, parent_id: outer_hir_id, }.visit_body(body);
1147
1148     // C-variadic fns also have a `VaList` input that's not listed in `fn_sig`
1149     // (as it's created inside the body itself, not passed in from outside).
1150     let maybe_va_list = if fn_sig.c_variadic {
1151         let va_list_did = fcx.tcx.require_lang_item(
1152             lang_items::VaListTypeLangItem,
1153             Some(body.params.last().unwrap().span),
1154         );
1155         let region = fcx.tcx.mk_region(ty::ReScope(region::Scope {
1156             id: body.value.hir_id.local_id,
1157             data: region::ScopeData::CallSite
1158         }));
1159
1160         Some(fcx.tcx.type_of(va_list_did).subst(fcx.tcx, &[region.into()]))
1161     } else {
1162         None
1163     };
1164
1165     // Add formal parameters.
1166     for (param_ty, param) in
1167         fn_sig.inputs().iter().copied()
1168             .chain(maybe_va_list)
1169             .zip(&body.params)
1170     {
1171         // Check the pattern.
1172         fcx.check_pat_top(&param.pat, param_ty, None);
1173
1174         // Check that argument is Sized.
1175         // The check for a non-trivial pattern is a hack to avoid duplicate warnings
1176         // for simple cases like `fn foo(x: Trait)`,
1177         // where we would error once on the parameter as a whole, and once on the binding `x`.
1178         if param.pat.simple_ident().is_none() && !fcx.tcx.features().unsized_locals {
1179             fcx.require_type_is_sized(param_ty, decl.output.span(), traits::SizedArgumentType);
1180         }
1181
1182         fcx.write_ty(param.hir_id, param_ty);
1183     }
1184
1185     inherited.tables.borrow_mut().liberated_fn_sigs_mut().insert(fn_id, fn_sig);
1186
1187     fcx.check_return_expr(&body.value);
1188
1189     // We insert the deferred_generator_interiors entry after visiting the body.
1190     // This ensures that all nested generators appear before the entry of this generator.
1191     // resolve_generator_interiors relies on this property.
1192     let gen_ty = if let (Some(_), Some(gen_kind)) = (can_be_generator, body.generator_kind) {
1193         let interior = fcx.next_ty_var(TypeVariableOrigin {
1194             kind: TypeVariableOriginKind::MiscVariable,
1195             span,
1196         });
1197         fcx.deferred_generator_interiors.borrow_mut().push((body.id(), interior, gen_kind));
1198         Some(GeneratorTypes {
1199             yield_ty: fcx.yield_ty.unwrap(),
1200             interior,
1201             movability: can_be_generator.unwrap(),
1202         })
1203     } else {
1204         None
1205     };
1206
1207     // Finalize the return check by taking the LUB of the return types
1208     // we saw and assigning it to the expected return type. This isn't
1209     // really expected to fail, since the coercions would have failed
1210     // earlier when trying to find a LUB.
1211     //
1212     // However, the behavior around `!` is sort of complex. In the
1213     // event that the `actual_return_ty` comes back as `!`, that
1214     // indicates that the fn either does not return or "returns" only
1215     // values of type `!`. In this case, if there is an expected
1216     // return type that is *not* `!`, that should be ok. But if the
1217     // return type is being inferred, we want to "fallback" to `!`:
1218     //
1219     //     let x = move || panic!();
1220     //
1221     // To allow for that, I am creating a type variable with diverging
1222     // fallback. This was deemed ever so slightly better than unifying
1223     // the return value with `!` because it allows for the caller to
1224     // make more assumptions about the return type (e.g., they could do
1225     //
1226     //     let y: Option<u32> = Some(x());
1227     //
1228     // which would then cause this return type to become `u32`, not
1229     // `!`).
1230     let coercion = fcx.ret_coercion.take().unwrap().into_inner();
1231     let mut actual_return_ty = coercion.complete(&fcx);
1232     if actual_return_ty.is_never() {
1233         actual_return_ty = fcx.next_diverging_ty_var(
1234             TypeVariableOrigin {
1235                 kind: TypeVariableOriginKind::DivergingFn,
1236                 span,
1237             },
1238         );
1239     }
1240     fcx.demand_suptype(span, revealed_ret_ty, actual_return_ty);
1241
1242     // Check that the main return type implements the termination trait.
1243     if let Some(term_id) = fcx.tcx.lang_items().termination() {
1244         if let Some((def_id, EntryFnType::Main)) = fcx.tcx.entry_fn(LOCAL_CRATE) {
1245             let main_id = fcx.tcx.hir().as_local_hir_id(def_id).unwrap();
1246             if main_id == fn_id {
1247                 let substs = fcx.tcx.mk_substs_trait(declared_ret_ty, &[]);
1248                 let trait_ref = ty::TraitRef::new(term_id, substs);
1249                 let return_ty_span = decl.output.span();
1250                 let cause = traits::ObligationCause::new(
1251                     return_ty_span, fn_id, ObligationCauseCode::MainFunctionType);
1252
1253                 inherited.register_predicate(
1254                     traits::Obligation::new(
1255                         cause, param_env, trait_ref.to_predicate()));
1256             }
1257         }
1258     }
1259
1260     // Check that a function marked as `#[panic_handler]` has signature `fn(&PanicInfo) -> !`
1261     if let Some(panic_impl_did) = fcx.tcx.lang_items().panic_impl() {
1262         if panic_impl_did == fcx.tcx.hir().local_def_id(fn_id) {
1263             if let Some(panic_info_did) = fcx.tcx.lang_items().panic_info() {
1264                 // at this point we don't care if there are duplicate handlers or if the handler has
1265                 // the wrong signature as this value we'll be used when writing metadata and that
1266                 // only happens if compilation succeeded
1267                 fcx.tcx.sess.has_panic_handler.try_set_same(true);
1268
1269                 if declared_ret_ty.kind != ty::Never {
1270                     fcx.tcx.sess.span_err(
1271                         decl.output.span(),
1272                         "return type should be `!`",
1273                     );
1274                 }
1275
1276                 let inputs = fn_sig.inputs();
1277                 let span = fcx.tcx.hir().span(fn_id);
1278                 if inputs.len() == 1 {
1279                     let arg_is_panic_info = match inputs[0].kind {
1280                         ty::Ref(region, ty, mutbl) => match ty.kind {
1281                             ty::Adt(ref adt, _) => {
1282                                 adt.did == panic_info_did &&
1283                                     mutbl == hir::Mutability::MutImmutable &&
1284                                     *region != RegionKind::ReStatic
1285                             },
1286                             _ => false,
1287                         },
1288                         _ => false,
1289                     };
1290
1291                     if !arg_is_panic_info {
1292                         fcx.tcx.sess.span_err(
1293                             decl.inputs[0].span,
1294                             "argument should be `&PanicInfo`",
1295                         );
1296                     }
1297
1298                     if let Node::Item(item) = fcx.tcx.hir().get(fn_id) {
1299                         if let ItemKind::Fn(_, _, ref generics, _) = item.kind {
1300                             if !generics.params.is_empty() {
1301                                 fcx.tcx.sess.span_err(
1302                                     span,
1303                                     "should have no type parameters",
1304                                 );
1305                             }
1306                         }
1307                     }
1308                 } else {
1309                     let span = fcx.tcx.sess.source_map().def_span(span);
1310                     fcx.tcx.sess.span_err(span, "function should have one argument");
1311                 }
1312             } else {
1313                 fcx.tcx.sess.err("language item required, but not found: `panic_info`");
1314             }
1315         }
1316     }
1317
1318     // Check that a function marked as `#[alloc_error_handler]` has signature `fn(Layout) -> !`
1319     if let Some(alloc_error_handler_did) = fcx.tcx.lang_items().oom() {
1320         if alloc_error_handler_did == fcx.tcx.hir().local_def_id(fn_id) {
1321             if let Some(alloc_layout_did) = fcx.tcx.lang_items().alloc_layout() {
1322                 if declared_ret_ty.kind != ty::Never {
1323                     fcx.tcx.sess.span_err(
1324                         decl.output.span(),
1325                         "return type should be `!`",
1326                     );
1327                 }
1328
1329                 let inputs = fn_sig.inputs();
1330                 let span = fcx.tcx.hir().span(fn_id);
1331                 if inputs.len() == 1 {
1332                     let arg_is_alloc_layout = match inputs[0].kind {
1333                         ty::Adt(ref adt, _) => {
1334                             adt.did == alloc_layout_did
1335                         },
1336                         _ => false,
1337                     };
1338
1339                     if !arg_is_alloc_layout {
1340                         fcx.tcx.sess.span_err(
1341                             decl.inputs[0].span,
1342                             "argument should be `Layout`",
1343                         );
1344                     }
1345
1346                     if let Node::Item(item) = fcx.tcx.hir().get(fn_id) {
1347                         if let ItemKind::Fn(_, _, ref generics, _) = item.kind {
1348                             if !generics.params.is_empty() {
1349                                 fcx.tcx.sess.span_err(
1350                                     span,
1351                                     "`#[alloc_error_handler]` function should have no type \
1352                                      parameters",
1353                                 );
1354                             }
1355                         }
1356                     }
1357                 } else {
1358                     let span = fcx.tcx.sess.source_map().def_span(span);
1359                     fcx.tcx.sess.span_err(span, "function should have one argument");
1360                 }
1361             } else {
1362                 fcx.tcx.sess.err("language item required, but not found: `alloc_layout`");
1363             }
1364         }
1365     }
1366
1367     (fcx, gen_ty)
1368 }
1369
1370 fn check_struct(tcx: TyCtxt<'_>, id: hir::HirId, span: Span) {
1371     let def_id = tcx.hir().local_def_id(id);
1372     let def = tcx.adt_def(def_id);
1373     def.destructor(tcx); // force the destructor to be evaluated
1374     check_representable(tcx, span, def_id);
1375
1376     if def.repr.simd() {
1377         check_simd(tcx, span, def_id);
1378     }
1379
1380     check_transparent(tcx, span, def_id);
1381     check_packed(tcx, span, def_id);
1382 }
1383
1384 fn check_union(tcx: TyCtxt<'_>, id: hir::HirId, span: Span) {
1385     let def_id = tcx.hir().local_def_id(id);
1386     let def = tcx.adt_def(def_id);
1387     def.destructor(tcx); // force the destructor to be evaluated
1388     check_representable(tcx, span, def_id);
1389     check_transparent(tcx, span, def_id);
1390     check_packed(tcx, span, def_id);
1391 }
1392
1393 /// Checks that an opaque type does not contain cycles and does not use `Self` or `T::Foo`
1394 /// projections that would result in "inheriting lifetimes".
1395 fn check_opaque<'tcx>(
1396     tcx: TyCtxt<'tcx>,
1397     def_id: DefId,
1398     substs: SubstsRef<'tcx>,
1399     span: Span,
1400     origin: &hir::OpaqueTyOrigin,
1401 ) {
1402     check_opaque_for_inheriting_lifetimes(tcx, def_id, span);
1403     check_opaque_for_cycles(tcx, def_id, substs, span, origin);
1404 }
1405
1406 /// Checks that an opaque type does not use `Self` or `T::Foo` projections that would result
1407 /// in "inheriting lifetimes".
1408 fn check_opaque_for_inheriting_lifetimes(
1409     tcx: TyCtxt<'tcx>,
1410     def_id: DefId,
1411     span: Span,
1412 ) {
1413     let item = tcx.hir().expect_item(
1414         tcx.hir().as_local_hir_id(def_id).expect("opaque type is not local"));
1415     debug!("check_opaque_for_inheriting_lifetimes: def_id={:?} span={:?} item={:?}",
1416            def_id, span, item);
1417
1418     #[derive(Debug)]
1419     struct ProhibitOpaqueVisitor<'tcx> {
1420         opaque_identity_ty: Ty<'tcx>,
1421         generics: &'tcx ty::Generics,
1422     };
1423
1424     impl<'tcx> ty::fold::TypeVisitor<'tcx> for ProhibitOpaqueVisitor<'tcx> {
1425         fn visit_ty(&mut self, t: Ty<'tcx>) -> bool {
1426             debug!("check_opaque_for_inheriting_lifetimes: (visit_ty) t={:?}", t);
1427             if t == self.opaque_identity_ty { false } else { t.super_visit_with(self) }
1428         }
1429
1430         fn visit_region(&mut self, r: ty::Region<'tcx>) -> bool {
1431             debug!("check_opaque_for_inheriting_lifetimes: (visit_region) r={:?}", r);
1432             if let RegionKind::ReEarlyBound(ty::EarlyBoundRegion { index, .. }) = r {
1433                 return *index < self.generics.parent_count as u32;
1434             }
1435
1436             r.super_visit_with(self)
1437         }
1438     }
1439
1440     let prohibit_opaque = match item.kind {
1441         ItemKind::OpaqueTy(hir::OpaqueTy { origin: hir::OpaqueTyOrigin::AsyncFn, .. }) |
1442         ItemKind::OpaqueTy(hir::OpaqueTy { origin: hir::OpaqueTyOrigin::FnReturn, .. }) => {
1443             let mut visitor = ProhibitOpaqueVisitor {
1444                 opaque_identity_ty: tcx.mk_opaque(
1445                     def_id, InternalSubsts::identity_for_item(tcx, def_id)),
1446                 generics: tcx.generics_of(def_id),
1447             };
1448             debug!("check_opaque_for_inheriting_lifetimes: visitor={:?}", visitor);
1449
1450             tcx.predicates_of(def_id).predicates.iter().any(
1451                 |(predicate, _)| predicate.visit_with(&mut visitor))
1452         },
1453         _ => false,
1454     };
1455
1456     debug!("check_opaque_for_inheriting_lifetimes: prohibit_opaque={:?}", prohibit_opaque);
1457     if prohibit_opaque {
1458         let is_async = match item.kind {
1459             ItemKind::OpaqueTy(hir::OpaqueTy { origin, .. }) => match origin {
1460                 hir::OpaqueTyOrigin::AsyncFn => true,
1461                 _ => false,
1462             },
1463             _ => unreachable!(),
1464         };
1465
1466         tcx.sess.span_err(span, &format!(
1467             "`{}` return type cannot contain a projection or `Self` that references lifetimes from \
1468              a parent scope",
1469             if is_async { "async fn" } else { "impl Trait" },
1470         ));
1471     }
1472 }
1473
1474 /// Checks that an opaque type does not contain cycles.
1475 fn check_opaque_for_cycles<'tcx>(
1476     tcx: TyCtxt<'tcx>,
1477     def_id: DefId,
1478     substs: SubstsRef<'tcx>,
1479     span: Span,
1480     origin: &hir::OpaqueTyOrigin,
1481 ) {
1482     if let Err(partially_expanded_type) = tcx.try_expand_impl_trait_type(def_id, substs) {
1483         if let hir::OpaqueTyOrigin::AsyncFn = origin {
1484             struct_span_err!(
1485                 tcx.sess, span, E0733,
1486                 "recursion in an `async fn` requires boxing",
1487             )
1488             .span_label(span, "recursive `async fn`")
1489             .note("a recursive `async fn` must be rewritten to return a boxed `dyn Future`.")
1490             .emit();
1491         } else {
1492             let mut err = struct_span_err!(
1493                 tcx.sess, span, E0720,
1494                 "opaque type expands to a recursive type",
1495             );
1496             err.span_label(span, "expands to a recursive type");
1497             if let ty::Opaque(..) = partially_expanded_type.kind {
1498                 err.note("type resolves to itself");
1499             } else {
1500                 err.note(&format!("expanded type is `{}`", partially_expanded_type));
1501             }
1502             err.emit();
1503         }
1504     }
1505 }
1506
1507 // Forbid defining intrinsics in Rust code,
1508 // as they must always be defined by the compiler.
1509 fn fn_maybe_err(tcx: TyCtxt<'_>, sp: Span, abi: Abi) {
1510     if let Abi::RustIntrinsic | Abi::PlatformIntrinsic = abi {
1511         tcx.sess.span_err(sp, "intrinsic must be in `extern \"rust-intrinsic\" { ... }` block");
1512     }
1513 }
1514
1515 pub fn check_item_type<'tcx>(tcx: TyCtxt<'tcx>, it: &'tcx hir::Item) {
1516     debug!(
1517         "check_item_type(it.hir_id={}, it.name={})",
1518         it.hir_id,
1519         tcx.def_path_str(tcx.hir().local_def_id(it.hir_id))
1520     );
1521     let _indenter = indenter();
1522     match it.kind {
1523         // Consts can play a role in type-checking, so they are included here.
1524         hir::ItemKind::Static(..) => {
1525             let def_id = tcx.hir().local_def_id(it.hir_id);
1526             tcx.typeck_tables_of(def_id);
1527             maybe_check_static_with_link_section(tcx, def_id, it.span);
1528         }
1529         hir::ItemKind::Const(..) => {
1530             tcx.typeck_tables_of(tcx.hir().local_def_id(it.hir_id));
1531         }
1532         hir::ItemKind::Enum(ref enum_definition, _) => {
1533             check_enum(tcx, it.span, &enum_definition.variants, it.hir_id);
1534         }
1535         hir::ItemKind::Fn(..) => {} // entirely within check_item_body
1536         hir::ItemKind::Impl(.., ref impl_item_refs) => {
1537             debug!("ItemKind::Impl {} with id {}", it.ident, it.hir_id);
1538             let impl_def_id = tcx.hir().local_def_id(it.hir_id);
1539             if let Some(impl_trait_ref) = tcx.impl_trait_ref(impl_def_id) {
1540                 check_impl_items_against_trait(
1541                     tcx,
1542                     it.span,
1543                     impl_def_id,
1544                     impl_trait_ref,
1545                     impl_item_refs,
1546                 );
1547                 let trait_def_id = impl_trait_ref.def_id;
1548                 check_on_unimplemented(tcx, trait_def_id, it);
1549             }
1550         }
1551         hir::ItemKind::Trait(_, _, _, _, ref items) => {
1552             let def_id = tcx.hir().local_def_id(it.hir_id);
1553             check_on_unimplemented(tcx, def_id, it);
1554
1555             for item in items.iter() {
1556                 let item = tcx.hir().trait_item(item.id);
1557                 if let hir::TraitItemKind::Method(sig, _) = &item.kind {
1558                     let abi = sig.header.abi;
1559                     fn_maybe_err(tcx, item.ident.span, abi);
1560                 }
1561             }
1562         }
1563         hir::ItemKind::Struct(..) => {
1564             check_struct(tcx, it.hir_id, it.span);
1565         }
1566         hir::ItemKind::Union(..) => {
1567             check_union(tcx, it.hir_id, it.span);
1568         }
1569         hir::ItemKind::OpaqueTy(hir::OpaqueTy{origin, ..}) => {
1570             let def_id = tcx.hir().local_def_id(it.hir_id);
1571
1572             let substs = InternalSubsts::identity_for_item(tcx, def_id);
1573             check_opaque(tcx, def_id, substs, it.span, &origin);
1574         }
1575         hir::ItemKind::TyAlias(..) => {
1576             let def_id = tcx.hir().local_def_id(it.hir_id);
1577             let pty_ty = tcx.type_of(def_id);
1578             let generics = tcx.generics_of(def_id);
1579             check_bounds_are_used(tcx, &generics, pty_ty);
1580         }
1581         hir::ItemKind::ForeignMod(ref m) => {
1582             check_abi(tcx, it.span, m.abi);
1583
1584             if m.abi == Abi::RustIntrinsic {
1585                 for item in &m.items {
1586                     intrinsic::check_intrinsic_type(tcx, item);
1587                 }
1588             } else if m.abi == Abi::PlatformIntrinsic {
1589                 for item in &m.items {
1590                     intrinsic::check_platform_intrinsic_type(tcx, item);
1591                 }
1592             } else {
1593                 for item in &m.items {
1594                     let generics = tcx.generics_of(tcx.hir().local_def_id(item.hir_id));
1595                     let own_counts = generics.own_counts();
1596                     if generics.params.len() - own_counts.lifetimes != 0 {
1597                         let (kinds, kinds_pl, egs) = match (own_counts.types, own_counts.consts) {
1598                             (_, 0) => ("type", "types", Some("u32")),
1599                             // We don't specify an example value, because we can't generate
1600                             // a valid value for any type.
1601                             (0, _) => ("const", "consts", None),
1602                             _ => ("type or const", "types or consts", None),
1603                         };
1604                         struct_span_err!(
1605                             tcx.sess,
1606                             item.span,
1607                             E0044,
1608                             "foreign items may not have {} parameters",
1609                             kinds,
1610                         ).span_label(
1611                             item.span,
1612                             &format!("can't have {} parameters", kinds),
1613                         ).help(
1614                             // FIXME: once we start storing spans for type arguments, turn this
1615                             // into a suggestion.
1616                             &format!(
1617                                 "replace the {} parameters with concrete {}{}",
1618                                 kinds,
1619                                 kinds_pl,
1620                                 egs.map(|egs| format!(" like `{}`", egs)).unwrap_or_default(),
1621                             ),
1622                         ).emit();
1623                     }
1624
1625                     if let hir::ForeignItemKind::Fn(ref fn_decl, _, _) = item.kind {
1626                         require_c_abi_if_c_variadic(tcx, fn_decl, m.abi, item.span);
1627                     }
1628                 }
1629             }
1630         }
1631         _ => { /* nothing to do */ }
1632     }
1633 }
1634
1635 fn maybe_check_static_with_link_section(tcx: TyCtxt<'_>, id: DefId, span: Span) {
1636     // Only restricted on wasm32 target for now
1637     if !tcx.sess.opts.target_triple.triple().starts_with("wasm32") {
1638         return
1639     }
1640
1641     // If `#[link_section]` is missing, then nothing to verify
1642     let attrs = tcx.codegen_fn_attrs(id);
1643     if attrs.link_section.is_none() {
1644         return
1645     }
1646
1647     // For the wasm32 target statics with `#[link_section]` are placed into custom
1648     // sections of the final output file, but this isn't link custom sections of
1649     // other executable formats. Namely we can only embed a list of bytes,
1650     // nothing with pointers to anything else or relocations. If any relocation
1651     // show up, reject them here.
1652     // `#[link_section]` may contain arbitrary, or even undefined bytes, but it is
1653     // the consumer's responsibility to ensure all bytes that have been read
1654     // have defined values.
1655     let instance = ty::Instance::mono(tcx, id);
1656     let cid = GlobalId {
1657         instance,
1658         promoted: None
1659     };
1660     let param_env = ty::ParamEnv::reveal_all();
1661     if let Ok(static_) = tcx.const_eval(param_env.and(cid)) {
1662         let alloc = if let ConstValue::ByRef { alloc, .. } = static_.val {
1663             alloc
1664         } else {
1665             bug!("Matching on non-ByRef static")
1666         };
1667         if alloc.relocations().len() != 0 {
1668             let msg = "statics with a custom `#[link_section]` must be a \
1669                        simple list of bytes on the wasm target with no \
1670                        extra levels of indirection such as references";
1671             tcx.sess.span_err(span, msg);
1672         }
1673     }
1674 }
1675
1676 fn check_on_unimplemented(tcx: TyCtxt<'_>, trait_def_id: DefId, item: &hir::Item) {
1677     let item_def_id = tcx.hir().local_def_id(item.hir_id);
1678     // an error would be reported if this fails.
1679     let _ = traits::OnUnimplementedDirective::of_item(tcx, trait_def_id, item_def_id);
1680 }
1681
1682 fn report_forbidden_specialization(
1683     tcx: TyCtxt<'_>,
1684     impl_item: &hir::ImplItem,
1685     parent_impl: DefId,
1686 ) {
1687     let mut err = struct_span_err!(
1688         tcx.sess, impl_item.span, E0520,
1689         "`{}` specializes an item from a parent `impl`, but \
1690          that item is not marked `default`",
1691         impl_item.ident);
1692     err.span_label(impl_item.span, format!("cannot specialize default item `{}`",
1693                                             impl_item.ident));
1694
1695     match tcx.span_of_impl(parent_impl) {
1696         Ok(span) => {
1697             err.span_label(span, "parent `impl` is here");
1698             err.note(&format!("to specialize, `{}` in the parent `impl` must be marked `default`",
1699                               impl_item.ident));
1700         }
1701         Err(cname) => {
1702             err.note(&format!("parent implementation is in crate `{}`", cname));
1703         }
1704     }
1705
1706     err.emit();
1707 }
1708
1709 fn check_specialization_validity<'tcx>(
1710     tcx: TyCtxt<'tcx>,
1711     trait_def: &ty::TraitDef,
1712     trait_item: &ty::AssocItem,
1713     impl_id: DefId,
1714     impl_item: &hir::ImplItem,
1715 ) {
1716     let ancestors = trait_def.ancestors(tcx, impl_id);
1717
1718     let kind = match impl_item.kind {
1719         hir::ImplItemKind::Const(..) => ty::AssocKind::Const,
1720         hir::ImplItemKind::Method(..) => ty::AssocKind::Method,
1721         hir::ImplItemKind::OpaqueTy(..) => ty::AssocKind::OpaqueTy,
1722         hir::ImplItemKind::TyAlias(_) => ty::AssocKind::Type,
1723     };
1724
1725     let parent = ancestors.defs(tcx, trait_item.ident, kind, trait_def.def_id).nth(1)
1726         .map(|node_item| node_item.map(|parent| parent.defaultness));
1727
1728     if let Some(parent) = parent {
1729         if tcx.impl_item_is_final(&parent) {
1730             report_forbidden_specialization(tcx, impl_item, parent.node.def_id());
1731         }
1732     }
1733
1734 }
1735
1736 fn check_impl_items_against_trait<'tcx>(
1737     tcx: TyCtxt<'tcx>,
1738     impl_span: Span,
1739     impl_id: DefId,
1740     impl_trait_ref: ty::TraitRef<'tcx>,
1741     impl_item_refs: &[hir::ImplItemRef],
1742 ) {
1743     let impl_span = tcx.sess.source_map().def_span(impl_span);
1744
1745     // If the trait reference itself is erroneous (so the compilation is going
1746     // to fail), skip checking the items here -- the `impl_item` table in `tcx`
1747     // isn't populated for such impls.
1748     if impl_trait_ref.references_error() { return; }
1749
1750     // Locate trait definition and items
1751     let trait_def = tcx.trait_def(impl_trait_ref.def_id);
1752     let mut overridden_associated_type = None;
1753
1754     let impl_items = || impl_item_refs.iter().map(|iiref| tcx.hir().impl_item(iiref.id));
1755
1756     // Check existing impl methods to see if they are both present in trait
1757     // and compatible with trait signature
1758     for impl_item in impl_items() {
1759         let ty_impl_item = tcx.associated_item(
1760             tcx.hir().local_def_id(impl_item.hir_id));
1761         let ty_trait_item = tcx.associated_items(impl_trait_ref.def_id)
1762             .find(|ac| Namespace::from(&impl_item.kind) == Namespace::from(ac.kind) &&
1763                        tcx.hygienic_eq(ty_impl_item.ident, ac.ident, impl_trait_ref.def_id))
1764             .or_else(|| {
1765                 // Not compatible, but needed for the error message
1766                 tcx.associated_items(impl_trait_ref.def_id)
1767                    .find(|ac| tcx.hygienic_eq(ty_impl_item.ident, ac.ident, impl_trait_ref.def_id))
1768             });
1769
1770         // Check that impl definition matches trait definition
1771         if let Some(ty_trait_item) = ty_trait_item {
1772             match impl_item.kind {
1773                 hir::ImplItemKind::Const(..) => {
1774                     // Find associated const definition.
1775                     if ty_trait_item.kind == ty::AssocKind::Const {
1776                         compare_const_impl(tcx,
1777                                            &ty_impl_item,
1778                                            impl_item.span,
1779                                            &ty_trait_item,
1780                                            impl_trait_ref);
1781                     } else {
1782                          let mut err = struct_span_err!(tcx.sess, impl_item.span, E0323,
1783                              "item `{}` is an associated const, \
1784                               which doesn't match its trait `{}`",
1785                              ty_impl_item.ident,
1786                              impl_trait_ref);
1787                          err.span_label(impl_item.span, "does not match trait");
1788                          // We can only get the spans from local trait definition
1789                          // Same for E0324 and E0325
1790                          if let Some(trait_span) = tcx.hir().span_if_local(ty_trait_item.def_id) {
1791                             err.span_label(trait_span, "item in trait");
1792                          }
1793                          err.emit()
1794                     }
1795                 }
1796                 hir::ImplItemKind::Method(..) => {
1797                     let trait_span = tcx.hir().span_if_local(ty_trait_item.def_id);
1798                     if ty_trait_item.kind == ty::AssocKind::Method {
1799                         compare_impl_method(tcx,
1800                                             &ty_impl_item,
1801                                             impl_item.span,
1802                                             &ty_trait_item,
1803                                             impl_trait_ref,
1804                                             trait_span);
1805                     } else {
1806                         let mut err = struct_span_err!(tcx.sess, impl_item.span, E0324,
1807                             "item `{}` is an associated method, \
1808                              which doesn't match its trait `{}`",
1809                             ty_impl_item.ident,
1810                             impl_trait_ref);
1811                          err.span_label(impl_item.span, "does not match trait");
1812                          if let Some(trait_span) = tcx.hir().span_if_local(ty_trait_item.def_id) {
1813                             err.span_label(trait_span, "item in trait");
1814                          }
1815                          err.emit()
1816                     }
1817                 }
1818                 hir::ImplItemKind::OpaqueTy(..) |
1819                 hir::ImplItemKind::TyAlias(_) => {
1820                     if ty_trait_item.kind == ty::AssocKind::Type {
1821                         if ty_trait_item.defaultness.has_value() {
1822                             overridden_associated_type = Some(impl_item);
1823                         }
1824                     } else {
1825                         let mut err = struct_span_err!(tcx.sess, impl_item.span, E0325,
1826                             "item `{}` is an associated type, \
1827                              which doesn't match its trait `{}`",
1828                             ty_impl_item.ident,
1829                             impl_trait_ref);
1830                          err.span_label(impl_item.span, "does not match trait");
1831                          if let Some(trait_span) = tcx.hir().span_if_local(ty_trait_item.def_id) {
1832                             err.span_label(trait_span, "item in trait");
1833                          }
1834                          err.emit()
1835                     }
1836                 }
1837             }
1838
1839             check_specialization_validity(tcx, trait_def, &ty_trait_item, impl_id, impl_item);
1840         }
1841     }
1842
1843     // Check for missing items from trait
1844     let mut missing_items = Vec::new();
1845     let mut invalidated_items = Vec::new();
1846     let associated_type_overridden = overridden_associated_type.is_some();
1847     for trait_item in tcx.associated_items(impl_trait_ref.def_id) {
1848         let is_implemented = trait_def.ancestors(tcx, impl_id)
1849             .defs(tcx, trait_item.ident, trait_item.kind, impl_trait_ref.def_id)
1850             .next()
1851             .map(|node_item| !node_item.node.is_from_trait())
1852             .unwrap_or(false);
1853
1854         if !is_implemented && !tcx.impl_is_default(impl_id) {
1855             if !trait_item.defaultness.has_value() {
1856                 missing_items.push(trait_item);
1857             } else if associated_type_overridden {
1858                 invalidated_items.push(trait_item.ident);
1859             }
1860         }
1861     }
1862
1863     if !missing_items.is_empty() {
1864         let mut err = struct_span_err!(tcx.sess, impl_span, E0046,
1865             "not all trait items implemented, missing: `{}`",
1866             missing_items.iter()
1867                 .map(|trait_item| trait_item.ident.to_string())
1868                 .collect::<Vec<_>>().join("`, `"));
1869         err.span_label(impl_span, format!("missing `{}` in implementation",
1870                 missing_items.iter()
1871                     .map(|trait_item| trait_item.ident.to_string())
1872                     .collect::<Vec<_>>().join("`, `")));
1873         for trait_item in missing_items {
1874             if let Some(span) = tcx.hir().span_if_local(trait_item.def_id) {
1875                 err.span_label(span, format!("`{}` from trait", trait_item.ident));
1876             } else {
1877                 err.note_trait_signature(trait_item.ident.to_string(),
1878                                          trait_item.signature(tcx));
1879             }
1880         }
1881         err.emit();
1882     }
1883
1884     if !invalidated_items.is_empty() {
1885         let invalidator = overridden_associated_type.unwrap();
1886         span_err!(tcx.sess, invalidator.span, E0399,
1887                   "the following trait items need to be reimplemented \
1888                    as `{}` was overridden: `{}`",
1889                   invalidator.ident,
1890                   invalidated_items.iter()
1891                                    .map(|name| name.to_string())
1892                                    .collect::<Vec<_>>().join("`, `"))
1893     }
1894 }
1895
1896 /// Checks whether a type can be represented in memory. In particular, it
1897 /// identifies types that contain themselves without indirection through a
1898 /// pointer, which would mean their size is unbounded.
1899 fn check_representable(tcx: TyCtxt<'_>, sp: Span, item_def_id: DefId) -> bool {
1900     let rty = tcx.type_of(item_def_id);
1901
1902     // Check that it is possible to represent this type. This call identifies
1903     // (1) types that contain themselves and (2) types that contain a different
1904     // recursive type. It is only necessary to throw an error on those that
1905     // contain themselves. For case 2, there must be an inner type that will be
1906     // caught by case 1.
1907     match rty.is_representable(tcx, sp) {
1908         Representability::SelfRecursive(spans) => {
1909             let mut err = tcx.recursive_type_with_infinite_size_error(item_def_id);
1910             for span in spans {
1911                 err.span_label(span, "recursive without indirection");
1912             }
1913             err.emit();
1914             return false
1915         }
1916         Representability::Representable | Representability::ContainsRecursive => (),
1917     }
1918     return true;
1919 }
1920
1921 pub fn check_simd(tcx: TyCtxt<'_>, sp: Span, def_id: DefId) {
1922     let t = tcx.type_of(def_id);
1923     if let ty::Adt(def, substs) = t.kind {
1924         if def.is_struct() {
1925             let fields = &def.non_enum_variant().fields;
1926             if fields.is_empty() {
1927                 span_err!(tcx.sess, sp, E0075, "SIMD vector cannot be empty");
1928                 return;
1929             }
1930             let e = fields[0].ty(tcx, substs);
1931             if !fields.iter().all(|f| f.ty(tcx, substs) == e) {
1932                 struct_span_err!(tcx.sess, sp, E0076, "SIMD vector should be homogeneous")
1933                                 .span_label(sp, "SIMD elements must have the same type")
1934                                 .emit();
1935                 return;
1936             }
1937             match e.kind {
1938                 ty::Param(_) => { /* struct<T>(T, T, T, T) is ok */ }
1939                 _ if e.is_machine() => { /* struct(u8, u8, u8, u8) is ok */ }
1940                 _ => {
1941                     span_err!(tcx.sess, sp, E0077,
1942                               "SIMD vector element type should be machine type");
1943                     return;
1944                 }
1945             }
1946         }
1947     }
1948 }
1949
1950 fn check_packed(tcx: TyCtxt<'_>, sp: Span, def_id: DefId) {
1951     let repr = tcx.adt_def(def_id).repr;
1952     if repr.packed() {
1953         for attr in tcx.get_attrs(def_id).iter() {
1954             for r in attr::find_repr_attrs(&tcx.sess.parse_sess, attr) {
1955                 if let attr::ReprPacked(pack) = r {
1956                     if let Some(repr_pack) = repr.pack {
1957                         if pack as u64 != repr_pack.bytes() {
1958                             struct_span_err!(
1959                                 tcx.sess, sp, E0634,
1960                                 "type has conflicting packed representation hints"
1961                             ).emit();
1962                         }
1963                     }
1964                 }
1965             }
1966         }
1967         if repr.align.is_some() {
1968             struct_span_err!(tcx.sess, sp, E0587,
1969                              "type has conflicting packed and align representation hints").emit();
1970         }
1971         else if check_packed_inner(tcx, def_id, &mut Vec::new()) {
1972             struct_span_err!(tcx.sess, sp, E0588,
1973                 "packed type cannot transitively contain a `[repr(align)]` type").emit();
1974         }
1975     }
1976 }
1977
1978 fn check_packed_inner(tcx: TyCtxt<'_>, def_id: DefId, stack: &mut Vec<DefId>) -> bool {
1979     let t = tcx.type_of(def_id);
1980     if stack.contains(&def_id) {
1981         debug!("check_packed_inner: {:?} is recursive", t);
1982         return false;
1983     }
1984     if let ty::Adt(def, substs) = t.kind {
1985         if def.is_struct() || def.is_union() {
1986             if tcx.adt_def(def.did).repr.align.is_some() {
1987                 return true;
1988             }
1989             // push struct def_id before checking fields
1990             stack.push(def_id);
1991             for field in &def.non_enum_variant().fields {
1992                 let f = field.ty(tcx, substs);
1993                 if let ty::Adt(def, _) = f.kind {
1994                     if check_packed_inner(tcx, def.did, stack) {
1995                         return true;
1996                     }
1997                 }
1998             }
1999             // only need to pop if not early out
2000             stack.pop();
2001         }
2002     }
2003     false
2004 }
2005
2006 /// Emit an error when encountering more or less than one variant in a transparent enum.
2007 fn bad_variant_count<'tcx>(tcx: TyCtxt<'tcx>, adt: &'tcx ty::AdtDef, sp: Span, did: DefId) {
2008     let variant_spans: Vec<_> = adt.variants.iter().map(|variant| {
2009         tcx.hir().span_if_local(variant.def_id).unwrap()
2010     }).collect();
2011     let msg = format!(
2012         "needs exactly one variant, but has {}",
2013         adt.variants.len(),
2014     );
2015     let mut err = struct_span_err!(tcx.sess, sp, E0731, "transparent enum {}", msg);
2016     err.span_label(sp, &msg);
2017     if let &[ref start @ .., ref end] = &variant_spans[..] {
2018         for variant_span in start {
2019             err.span_label(*variant_span, "");
2020         }
2021         err.span_label(*end, &format!("too many variants in `{}`", tcx.def_path_str(did)));
2022     }
2023     err.emit();
2024 }
2025
2026 /// Emit an error when encountering more or less than one non-zero-sized field in a transparent
2027 /// enum.
2028 fn bad_non_zero_sized_fields<'tcx>(
2029     tcx: TyCtxt<'tcx>,
2030     adt: &'tcx ty::AdtDef,
2031     field_count: usize,
2032     field_spans: impl Iterator<Item = Span>,
2033     sp: Span,
2034 ) {
2035     let msg = format!("needs exactly one non-zero-sized field, but has {}", field_count);
2036     let mut err = struct_span_err!(
2037         tcx.sess,
2038         sp,
2039         E0690,
2040         "{}transparent {} {}",
2041         if adt.is_enum() { "the variant of a " } else { "" },
2042         adt.descr(),
2043         msg,
2044     );
2045     err.span_label(sp, &msg);
2046     for sp in field_spans {
2047         err.span_label(sp, "this field is non-zero-sized");
2048     }
2049     err.emit();
2050 }
2051
2052 fn check_transparent(tcx: TyCtxt<'_>, sp: Span, def_id: DefId) {
2053     let adt = tcx.adt_def(def_id);
2054     if !adt.repr.transparent() {
2055         return;
2056     }
2057     let sp = tcx.sess.source_map().def_span(sp);
2058
2059     if adt.is_enum() {
2060         if !tcx.features().transparent_enums {
2061             emit_feature_err(
2062                 &tcx.sess.parse_sess,
2063                 sym::transparent_enums,
2064                 sp,
2065                 GateIssue::Language,
2066                 "transparent enums are unstable",
2067             );
2068         }
2069         if adt.variants.len() != 1 {
2070             bad_variant_count(tcx, adt, sp, def_id);
2071             if adt.variants.is_empty() {
2072                 // Don't bother checking the fields. No variants (and thus no fields) exist.
2073                 return;
2074             }
2075         }
2076     }
2077
2078     if adt.is_union() && !tcx.features().transparent_unions {
2079         emit_feature_err(&tcx.sess.parse_sess,
2080                          sym::transparent_unions,
2081                          sp,
2082                          GateIssue::Language,
2083                          "transparent unions are unstable");
2084     }
2085
2086     // For each field, figure out if it's known to be a ZST and align(1)
2087     let field_infos = adt.all_fields().map(|field| {
2088         let ty = field.ty(tcx, InternalSubsts::identity_for_item(tcx, field.did));
2089         let param_env = tcx.param_env(field.did);
2090         let layout = tcx.layout_of(param_env.and(ty));
2091         // We are currently checking the type this field came from, so it must be local
2092         let span = tcx.hir().span_if_local(field.did).unwrap();
2093         let zst = layout.map(|layout| layout.is_zst()).unwrap_or(false);
2094         let align1 = layout.map(|layout| layout.align.abi.bytes() == 1).unwrap_or(false);
2095         (span, zst, align1)
2096     });
2097
2098     let non_zst_fields = field_infos.clone().filter_map(|(span, zst, _align1)| if !zst {
2099         Some(span)
2100     } else {
2101         None
2102     });
2103     let non_zst_count = non_zst_fields.clone().count();
2104     if non_zst_count != 1 {
2105         bad_non_zero_sized_fields(tcx, adt, non_zst_count, non_zst_fields, sp);
2106     }
2107     for (span, zst, align1) in field_infos {
2108         if zst && !align1 {
2109             struct_span_err!(
2110                 tcx.sess,
2111                 span,
2112                 E0691,
2113                 "zero-sized field in transparent {} has alignment larger than 1",
2114                 adt.descr(),
2115             ).span_label(span, "has alignment larger than 1").emit();
2116         }
2117     }
2118 }
2119
2120 #[allow(trivial_numeric_casts)]
2121 pub fn check_enum<'tcx>(tcx: TyCtxt<'tcx>, sp: Span, vs: &'tcx [hir::Variant], id: hir::HirId) {
2122     let def_id = tcx.hir().local_def_id(id);
2123     let def = tcx.adt_def(def_id);
2124     def.destructor(tcx); // force the destructor to be evaluated
2125
2126     if vs.is_empty() {
2127         let attributes = tcx.get_attrs(def_id);
2128         if let Some(attr) = attr::find_by_name(&attributes, sym::repr) {
2129             struct_span_err!(
2130                 tcx.sess, attr.span, E0084,
2131                 "unsupported representation for zero-variant enum")
2132                 .span_label(sp, "zero-variant enum")
2133                 .emit();
2134         }
2135     }
2136
2137     let repr_type_ty = def.repr.discr_type().to_ty(tcx);
2138     if repr_type_ty == tcx.types.i128 || repr_type_ty == tcx.types.u128 {
2139         if !tcx.features().repr128 {
2140             emit_feature_err(&tcx.sess.parse_sess,
2141                              sym::repr128,
2142                              sp,
2143                              GateIssue::Language,
2144                              "repr with 128-bit type is unstable");
2145         }
2146     }
2147
2148     for v in vs {
2149         if let Some(ref e) = v.disr_expr {
2150             tcx.typeck_tables_of(tcx.hir().local_def_id(e.hir_id));
2151         }
2152     }
2153
2154     if tcx.adt_def(def_id).repr.int.is_none() && tcx.features().arbitrary_enum_discriminant {
2155         let is_unit =
2156             |var: &hir::Variant| match var.data {
2157                 hir::VariantData::Unit(..) => true,
2158                 _ => false
2159             };
2160
2161         let has_disr = |var: &hir::Variant| var.disr_expr.is_some();
2162         let has_non_units = vs.iter().any(|var| !is_unit(var));
2163         let disr_units = vs.iter().any(|var| is_unit(&var) && has_disr(&var));
2164         let disr_non_unit = vs.iter().any(|var| !is_unit(&var) && has_disr(&var));
2165
2166         if disr_non_unit || (disr_units && has_non_units) {
2167             let mut err = struct_span_err!(tcx.sess, sp, E0732,
2168                                            "`#[repr(inttype)]` must be specified");
2169             err.emit();
2170         }
2171     }
2172
2173     let mut disr_vals: Vec<Discr<'tcx>> = Vec::with_capacity(vs.len());
2174     for ((_, discr), v) in def.discriminants(tcx).zip(vs) {
2175         // Check for duplicate discriminant values
2176         if let Some(i) = disr_vals.iter().position(|&x| x.val == discr.val) {
2177             let variant_did = def.variants[VariantIdx::new(i)].def_id;
2178             let variant_i_hir_id = tcx.hir().as_local_hir_id(variant_did).unwrap();
2179             let variant_i = tcx.hir().expect_variant(variant_i_hir_id);
2180             let i_span = match variant_i.disr_expr {
2181                 Some(ref expr) => tcx.hir().span(expr.hir_id),
2182                 None => tcx.hir().span(variant_i_hir_id)
2183             };
2184             let span = match v.disr_expr {
2185                 Some(ref expr) => tcx.hir().span(expr.hir_id),
2186                 None => v.span
2187             };
2188             struct_span_err!(tcx.sess, span, E0081,
2189                              "discriminant value `{}` already exists", disr_vals[i])
2190                 .span_label(i_span, format!("first use of `{}`", disr_vals[i]))
2191                 .span_label(span , format!("enum already has `{}`", disr_vals[i]))
2192                 .emit();
2193         }
2194         disr_vals.push(discr);
2195     }
2196
2197     check_representable(tcx, sp, def_id);
2198     check_transparent(tcx, sp, def_id);
2199 }
2200
2201 fn report_unexpected_variant_res(tcx: TyCtxt<'_>, res: Res, span: Span, qpath: &QPath) {
2202     span_err!(tcx.sess, span, E0533,
2203               "expected unit struct/variant or constant, found {} `{}`",
2204               res.descr(),
2205               hir::print::to_string(tcx.hir(), |s| s.print_qpath(qpath, false)));
2206 }
2207
2208 impl<'a, 'tcx> AstConv<'tcx> for FnCtxt<'a, 'tcx> {
2209     fn tcx<'b>(&'b self) -> TyCtxt<'tcx> {
2210         self.tcx
2211     }
2212
2213     fn get_type_parameter_bounds(&self, _: Span, def_id: DefId)
2214                                  -> &'tcx ty::GenericPredicates<'tcx>
2215     {
2216         let tcx = self.tcx;
2217         let hir_id = tcx.hir().as_local_hir_id(def_id).unwrap();
2218         let item_id = tcx.hir().ty_param_owner(hir_id);
2219         let item_def_id = tcx.hir().local_def_id(item_id);
2220         let generics = tcx.generics_of(item_def_id);
2221         let index = generics.param_def_id_to_index[&def_id];
2222         tcx.arena.alloc(ty::GenericPredicates {
2223             parent: None,
2224             predicates: self.param_env.caller_bounds.iter().filter_map(|&predicate| {
2225                 match predicate {
2226                     ty::Predicate::Trait(ref data)
2227                     if data.skip_binder().self_ty().is_param(index) => {
2228                         // HACK(eddyb) should get the original `Span`.
2229                         let span = tcx.def_span(def_id);
2230                         Some((predicate, span))
2231                     }
2232                     _ => None
2233                 }
2234             }).collect()
2235         })
2236     }
2237
2238     fn re_infer(
2239         &self,
2240         def: Option<&ty::GenericParamDef>,
2241         span: Span,
2242     ) -> Option<ty::Region<'tcx>> {
2243         let v = match def {
2244             Some(def) => infer::EarlyBoundRegion(span, def.name),
2245             None => infer::MiscVariable(span)
2246         };
2247         Some(self.next_region_var(v))
2248     }
2249
2250     fn ty_infer(&self, param: Option<&ty::GenericParamDef>, span: Span) -> Ty<'tcx> {
2251         if let Some(param) = param {
2252             if let GenericArgKind::Type(ty) = self.var_for_def(span, param).unpack() {
2253                 return ty;
2254             }
2255             unreachable!()
2256         } else {
2257             self.next_ty_var(TypeVariableOrigin {
2258                 kind: TypeVariableOriginKind::TypeInference,
2259                 span,
2260             })
2261         }
2262     }
2263
2264     fn ct_infer(
2265         &self,
2266         ty: Ty<'tcx>,
2267         param: Option<&ty::GenericParamDef>,
2268         span: Span,
2269     ) -> &'tcx Const<'tcx> {
2270         if let Some(param) = param {
2271             if let GenericArgKind::Const(ct) = self.var_for_def(span, param).unpack() {
2272                 return ct;
2273             }
2274             unreachable!()
2275         } else {
2276             self.next_const_var(ty, ConstVariableOrigin {
2277                 kind: ConstVariableOriginKind::ConstInference,
2278                 span,
2279             })
2280         }
2281     }
2282
2283     fn projected_ty_from_poly_trait_ref(&self,
2284                                         span: Span,
2285                                         item_def_id: DefId,
2286                                         poly_trait_ref: ty::PolyTraitRef<'tcx>)
2287                                         -> Ty<'tcx>
2288     {
2289         let (trait_ref, _) = self.replace_bound_vars_with_fresh_vars(
2290             span,
2291             infer::LateBoundRegionConversionTime::AssocTypeProjection(item_def_id),
2292             &poly_trait_ref
2293         );
2294
2295         self.tcx().mk_projection(item_def_id, trait_ref.substs)
2296     }
2297
2298     fn normalize_ty(&self, span: Span, ty: Ty<'tcx>) -> Ty<'tcx> {
2299         if ty.has_escaping_bound_vars() {
2300             ty // FIXME: normalization and escaping regions
2301         } else {
2302             self.normalize_associated_types_in(span, &ty)
2303         }
2304     }
2305
2306     fn set_tainted_by_errors(&self) {
2307         self.infcx.set_tainted_by_errors()
2308     }
2309
2310     fn record_ty(&self, hir_id: hir::HirId, ty: Ty<'tcx>, _span: Span) {
2311         self.write_ty(hir_id, ty)
2312     }
2313 }
2314
2315 /// Controls whether the arguments are tupled. This is used for the call
2316 /// operator.
2317 ///
2318 /// Tupling means that all call-side arguments are packed into a tuple and
2319 /// passed as a single parameter. For example, if tupling is enabled, this
2320 /// function:
2321 ///
2322 ///     fn f(x: (isize, isize))
2323 ///
2324 /// Can be called as:
2325 ///
2326 ///     f(1, 2);
2327 ///
2328 /// Instead of:
2329 ///
2330 ///     f((1, 2));
2331 #[derive(Clone, Eq, PartialEq)]
2332 enum TupleArgumentsFlag {
2333     DontTupleArguments,
2334     TupleArguments,
2335 }
2336
2337 impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
2338     pub fn new(
2339         inh: &'a Inherited<'a, 'tcx>,
2340         param_env: ty::ParamEnv<'tcx>,
2341         body_id: hir::HirId,
2342     ) -> FnCtxt<'a, 'tcx> {
2343         FnCtxt {
2344             body_id,
2345             param_env,
2346             err_count_on_creation: inh.tcx.sess.err_count(),
2347             ret_coercion: None,
2348             ret_coercion_span: RefCell::new(None),
2349             yield_ty: None,
2350             ps: RefCell::new(UnsafetyState::function(hir::Unsafety::Normal,
2351                                                      hir::CRATE_HIR_ID)),
2352             diverges: Cell::new(Diverges::Maybe),
2353             has_errors: Cell::new(false),
2354             enclosing_breakables: RefCell::new(EnclosingBreakables {
2355                 stack: Vec::new(),
2356                 by_id: Default::default(),
2357             }),
2358             inh,
2359         }
2360     }
2361
2362     pub fn sess(&self) -> &Session {
2363         &self.tcx.sess
2364     }
2365
2366     pub fn errors_reported_since_creation(&self) -> bool {
2367         self.tcx.sess.err_count() > self.err_count_on_creation
2368     }
2369
2370     /// Produces warning on the given node, if the current point in the
2371     /// function is unreachable, and there hasn't been another warning.
2372     fn warn_if_unreachable(&self, id: hir::HirId, span: Span, kind: &str) {
2373         // FIXME: Combine these two 'if' expressions into one once
2374         // let chains are implemented
2375         if let Diverges::Always { span: orig_span, custom_note } = self.diverges.get() {
2376             // If span arose from a desugaring of `if` or `while`, then it is the condition itself,
2377             // which diverges, that we are about to lint on. This gives suboptimal diagnostics.
2378             // Instead, stop here so that the `if`- or `while`-expression's block is linted instead.
2379             if !span.is_desugaring(DesugaringKind::CondTemporary) &&
2380                 !span.is_desugaring(DesugaringKind::Async) &&
2381                 !orig_span.is_desugaring(DesugaringKind::Await)
2382             {
2383                 self.diverges.set(Diverges::WarnedAlways);
2384
2385                 debug!("warn_if_unreachable: id={:?} span={:?} kind={}", id, span, kind);
2386
2387                 let msg = format!("unreachable {}", kind);
2388                 self.tcx().struct_span_lint_hir(lint::builtin::UNREACHABLE_CODE, id, span, &msg)
2389                     .span_label(span, &msg)
2390                     .span_label(
2391                         orig_span,
2392                         custom_note.unwrap_or("any code following this expression is unreachable"),
2393                     )
2394                     .emit();
2395             }
2396         }
2397     }
2398
2399     pub fn cause(&self,
2400                  span: Span,
2401                  code: ObligationCauseCode<'tcx>)
2402                  -> ObligationCause<'tcx> {
2403         ObligationCause::new(span, self.body_id, code)
2404     }
2405
2406     pub fn misc(&self, span: Span) -> ObligationCause<'tcx> {
2407         self.cause(span, ObligationCauseCode::MiscObligation)
2408     }
2409
2410     /// Resolves type variables in `ty` if possible. Unlike the infcx
2411     /// version (resolve_vars_if_possible), this version will
2412     /// also select obligations if it seems useful, in an effort
2413     /// to get more type information.
2414     fn resolve_type_vars_with_obligations(&self, mut ty: Ty<'tcx>) -> Ty<'tcx> {
2415         debug!("resolve_type_vars_with_obligations(ty={:?})", ty);
2416
2417         // No Infer()? Nothing needs doing.
2418         if !ty.has_infer_types() {
2419             debug!("resolve_type_vars_with_obligations: ty={:?}", ty);
2420             return ty;
2421         }
2422
2423         // If `ty` is a type variable, see whether we already know what it is.
2424         ty = self.resolve_vars_if_possible(&ty);
2425         if !ty.has_infer_types() {
2426             debug!("resolve_type_vars_with_obligations: ty={:?}", ty);
2427             return ty;
2428         }
2429
2430         // If not, try resolving pending obligations as much as
2431         // possible. This can help substantially when there are
2432         // indirect dependencies that don't seem worth tracking
2433         // precisely.
2434         self.select_obligations_where_possible(false, |_| {});
2435         ty = self.resolve_vars_if_possible(&ty);
2436
2437         debug!("resolve_type_vars_with_obligations: ty={:?}", ty);
2438         ty
2439     }
2440
2441     fn record_deferred_call_resolution(
2442         &self,
2443         closure_def_id: DefId,
2444         r: DeferredCallResolution<'tcx>,
2445     ) {
2446         let mut deferred_call_resolutions = self.deferred_call_resolutions.borrow_mut();
2447         deferred_call_resolutions.entry(closure_def_id).or_default().push(r);
2448     }
2449
2450     fn remove_deferred_call_resolutions(
2451         &self,
2452         closure_def_id: DefId,
2453     ) -> Vec<DeferredCallResolution<'tcx>> {
2454         let mut deferred_call_resolutions = self.deferred_call_resolutions.borrow_mut();
2455         deferred_call_resolutions.remove(&closure_def_id).unwrap_or(vec![])
2456     }
2457
2458     pub fn tag(&self) -> String {
2459         format!("{:p}", self)
2460     }
2461
2462     pub fn local_ty(&self, span: Span, nid: hir::HirId) -> LocalTy<'tcx> {
2463         self.locals.borrow().get(&nid).cloned().unwrap_or_else(||
2464             span_bug!(span, "no type for local variable {}",
2465                       self.tcx.hir().node_to_string(nid))
2466         )
2467     }
2468
2469     #[inline]
2470     pub fn write_ty(&self, id: hir::HirId, ty: Ty<'tcx>) {
2471         debug!("write_ty({:?}, {:?}) in fcx {}",
2472                id, self.resolve_vars_if_possible(&ty), self.tag());
2473         self.tables.borrow_mut().node_types_mut().insert(id, ty);
2474
2475         if ty.references_error() {
2476             self.has_errors.set(true);
2477             self.set_tainted_by_errors();
2478         }
2479     }
2480
2481     pub fn write_field_index(&self, hir_id: hir::HirId, index: usize) {
2482         self.tables.borrow_mut().field_indices_mut().insert(hir_id, index);
2483     }
2484
2485     fn write_resolution(&self, hir_id: hir::HirId, r: Result<(DefKind, DefId), ErrorReported>) {
2486         self.tables.borrow_mut().type_dependent_defs_mut().insert(hir_id, r);
2487     }
2488
2489     pub fn write_method_call(&self,
2490                              hir_id: hir::HirId,
2491                              method: MethodCallee<'tcx>) {
2492         debug!("write_method_call(hir_id={:?}, method={:?})", hir_id, method);
2493         self.write_resolution(hir_id, Ok((DefKind::Method, method.def_id)));
2494         self.write_substs(hir_id, method.substs);
2495
2496         // When the method is confirmed, the `method.substs` includes
2497         // parameters from not just the method, but also the impl of
2498         // the method -- in particular, the `Self` type will be fully
2499         // resolved. However, those are not something that the "user
2500         // specified" -- i.e., those types come from the inferred type
2501         // of the receiver, not something the user wrote. So when we
2502         // create the user-substs, we want to replace those earlier
2503         // types with just the types that the user actually wrote --
2504         // that is, those that appear on the *method itself*.
2505         //
2506         // As an example, if the user wrote something like
2507         // `foo.bar::<u32>(...)` -- the `Self` type here will be the
2508         // type of `foo` (possibly adjusted), but we don't want to
2509         // include that. We want just the `[_, u32]` part.
2510         if !method.substs.is_noop() {
2511             let method_generics = self.tcx.generics_of(method.def_id);
2512             if !method_generics.params.is_empty() {
2513                 let user_type_annotation = self.infcx.probe(|_| {
2514                     let user_substs = UserSubsts {
2515                         substs: InternalSubsts::for_item(self.tcx, method.def_id, |param, _| {
2516                             let i = param.index as usize;
2517                             if i < method_generics.parent_count {
2518                                 self.infcx.var_for_def(DUMMY_SP, param)
2519                             } else {
2520                                 method.substs[i]
2521                             }
2522                         }),
2523                         user_self_ty: None, // not relevant here
2524                     };
2525
2526                     self.infcx.canonicalize_user_type_annotation(&UserType::TypeOf(
2527                         method.def_id,
2528                         user_substs,
2529                     ))
2530                 });
2531
2532                 debug!("write_method_call: user_type_annotation={:?}", user_type_annotation);
2533                 self.write_user_type_annotation(hir_id, user_type_annotation);
2534             }
2535         }
2536     }
2537
2538     pub fn write_substs(&self, node_id: hir::HirId, substs: SubstsRef<'tcx>) {
2539         if !substs.is_noop() {
2540             debug!("write_substs({:?}, {:?}) in fcx {}",
2541                    node_id,
2542                    substs,
2543                    self.tag());
2544
2545             self.tables.borrow_mut().node_substs_mut().insert(node_id, substs);
2546         }
2547     }
2548
2549     /// Given the substs that we just converted from the HIR, try to
2550     /// canonicalize them and store them as user-given substitutions
2551     /// (i.e., substitutions that must be respected by the NLL check).
2552     ///
2553     /// This should be invoked **before any unifications have
2554     /// occurred**, so that annotations like `Vec<_>` are preserved
2555     /// properly.
2556     pub fn write_user_type_annotation_from_substs(
2557         &self,
2558         hir_id: hir::HirId,
2559         def_id: DefId,
2560         substs: SubstsRef<'tcx>,
2561         user_self_ty: Option<UserSelfTy<'tcx>>,
2562     ) {
2563         debug!(
2564             "write_user_type_annotation_from_substs: hir_id={:?} def_id={:?} substs={:?} \
2565              user_self_ty={:?} in fcx {}",
2566             hir_id, def_id, substs, user_self_ty, self.tag(),
2567         );
2568
2569         if Self::can_contain_user_lifetime_bounds((substs, user_self_ty)) {
2570             let canonicalized = self.infcx.canonicalize_user_type_annotation(
2571                 &UserType::TypeOf(def_id, UserSubsts {
2572                     substs,
2573                     user_self_ty,
2574                 })
2575             );
2576             debug!("write_user_type_annotation_from_substs: canonicalized={:?}", canonicalized);
2577             self.write_user_type_annotation(hir_id, canonicalized);
2578         }
2579     }
2580
2581     pub fn write_user_type_annotation(
2582         &self,
2583         hir_id: hir::HirId,
2584         canonical_user_type_annotation: CanonicalUserType<'tcx>,
2585     ) {
2586         debug!(
2587             "write_user_type_annotation: hir_id={:?} canonical_user_type_annotation={:?} tag={}",
2588             hir_id, canonical_user_type_annotation, self.tag(),
2589         );
2590
2591         if !canonical_user_type_annotation.is_identity() {
2592             self.tables.borrow_mut().user_provided_types_mut().insert(
2593                 hir_id, canonical_user_type_annotation
2594             );
2595         } else {
2596             debug!("write_user_type_annotation: skipping identity substs");
2597         }
2598     }
2599
2600     pub fn apply_adjustments(&self, expr: &hir::Expr, adj: Vec<Adjustment<'tcx>>) {
2601         debug!("apply_adjustments(expr={:?}, adj={:?})", expr, adj);
2602
2603         if adj.is_empty() {
2604             return;
2605         }
2606
2607         match self.tables.borrow_mut().adjustments_mut().entry(expr.hir_id) {
2608             Entry::Vacant(entry) => { entry.insert(adj); },
2609             Entry::Occupied(mut entry) => {
2610                 debug!(" - composing on top of {:?}", entry.get());
2611                 match (&entry.get()[..], &adj[..]) {
2612                     // Applying any adjustment on top of a NeverToAny
2613                     // is a valid NeverToAny adjustment, because it can't
2614                     // be reached.
2615                     (&[Adjustment { kind: Adjust::NeverToAny, .. }], _) => return,
2616                     (&[
2617                         Adjustment { kind: Adjust::Deref(_), .. },
2618                         Adjustment { kind: Adjust::Borrow(AutoBorrow::Ref(..)), .. },
2619                     ], &[
2620                         Adjustment { kind: Adjust::Deref(_), .. },
2621                         .. // Any following adjustments are allowed.
2622                     ]) => {
2623                         // A reborrow has no effect before a dereference.
2624                     }
2625                     // FIXME: currently we never try to compose autoderefs
2626                     // and ReifyFnPointer/UnsafeFnPointer, but we could.
2627                     _ =>
2628                         bug!("while adjusting {:?}, can't compose {:?} and {:?}",
2629                              expr, entry.get(), adj)
2630                 };
2631                 *entry.get_mut() = adj;
2632             }
2633         }
2634     }
2635
2636     /// Basically whenever we are converting from a type scheme into
2637     /// the fn body space, we always want to normalize associated
2638     /// types as well. This function combines the two.
2639     fn instantiate_type_scheme<T>(&self,
2640                                   span: Span,
2641                                   substs: SubstsRef<'tcx>,
2642                                   value: &T)
2643                                   -> T
2644         where T : TypeFoldable<'tcx>
2645     {
2646         let value = value.subst(self.tcx, substs);
2647         let result = self.normalize_associated_types_in(span, &value);
2648         debug!("instantiate_type_scheme(value={:?}, substs={:?}) = {:?}",
2649                value,
2650                substs,
2651                result);
2652         result
2653     }
2654
2655     /// As `instantiate_type_scheme`, but for the bounds found in a
2656     /// generic type scheme.
2657     fn instantiate_bounds(
2658         &self,
2659         span: Span,
2660         def_id: DefId,
2661         substs: SubstsRef<'tcx>,
2662     ) -> (ty::InstantiatedPredicates<'tcx>, Vec<Span>) {
2663         let bounds = self.tcx.predicates_of(def_id);
2664         let spans: Vec<Span> = bounds.predicates.iter().map(|(_, span)| *span).collect();
2665         let result = bounds.instantiate(self.tcx, substs);
2666         let result = self.normalize_associated_types_in(span, &result);
2667         debug!(
2668             "instantiate_bounds(bounds={:?}, substs={:?}) = {:?}, {:?}",
2669                bounds,
2670                substs,
2671             result,
2672             spans,
2673         );
2674         (result, spans)
2675     }
2676
2677     /// Replaces the opaque types from the given value with type variables,
2678     /// and records the `OpaqueTypeMap` for later use during writeback. See
2679     /// `InferCtxt::instantiate_opaque_types` for more details.
2680     fn instantiate_opaque_types_from_value<T: TypeFoldable<'tcx>>(
2681         &self,
2682         parent_id: hir::HirId,
2683         value: &T,
2684         value_span: Span,
2685     ) -> T {
2686         let parent_def_id = self.tcx.hir().local_def_id(parent_id);
2687         debug!("instantiate_opaque_types_from_value(parent_def_id={:?}, value={:?})",
2688                parent_def_id,
2689                value);
2690
2691         let (value, opaque_type_map) = self.register_infer_ok_obligations(
2692             self.instantiate_opaque_types(
2693                 parent_def_id,
2694                 self.body_id,
2695                 self.param_env,
2696                 value,
2697                 value_span,
2698             )
2699         );
2700
2701         let mut opaque_types = self.opaque_types.borrow_mut();
2702         for (ty, decl) in opaque_type_map {
2703             let old_value = opaque_types.insert(ty, decl);
2704             assert!(old_value.is_none(), "instantiated twice: {:?}/{:?}", ty, decl);
2705         }
2706
2707         value
2708     }
2709
2710     fn normalize_associated_types_in<T>(&self, span: Span, value: &T) -> T
2711         where T : TypeFoldable<'tcx>
2712     {
2713         self.inh.normalize_associated_types_in(span, self.body_id, self.param_env, value)
2714     }
2715
2716     fn normalize_associated_types_in_as_infer_ok<T>(&self, span: Span, value: &T)
2717                                                     -> InferOk<'tcx, T>
2718         where T : TypeFoldable<'tcx>
2719     {
2720         self.inh.partially_normalize_associated_types_in(span,
2721                                                          self.body_id,
2722                                                          self.param_env,
2723                                                          value)
2724     }
2725
2726     pub fn require_type_meets(&self,
2727                               ty: Ty<'tcx>,
2728                               span: Span,
2729                               code: traits::ObligationCauseCode<'tcx>,
2730                               def_id: DefId)
2731     {
2732         self.register_bound(
2733             ty,
2734             def_id,
2735             traits::ObligationCause::new(span, self.body_id, code));
2736     }
2737
2738     pub fn require_type_is_sized(
2739         &self,
2740         ty: Ty<'tcx>,
2741         span: Span,
2742         code: traits::ObligationCauseCode<'tcx>,
2743     ) {
2744         if !ty.references_error() {
2745             let lang_item = self.tcx.require_lang_item(lang_items::SizedTraitLangItem, None);
2746             self.require_type_meets(ty, span, code, lang_item);
2747         }
2748     }
2749
2750     pub fn require_type_is_sized_deferred(
2751         &self,
2752         ty: Ty<'tcx>,
2753         span: Span,
2754         code: traits::ObligationCauseCode<'tcx>,
2755     ) {
2756         if !ty.references_error() {
2757             self.deferred_sized_obligations.borrow_mut().push((ty, span, code));
2758         }
2759     }
2760
2761     pub fn register_bound(
2762         &self,
2763         ty: Ty<'tcx>,
2764         def_id: DefId,
2765         cause: traits::ObligationCause<'tcx>,
2766     ) {
2767         if !ty.references_error() {
2768             self.fulfillment_cx.borrow_mut()
2769                 .register_bound(self, self.param_env, ty, def_id, cause);
2770         }
2771     }
2772
2773     pub fn to_ty(&self, ast_t: &hir::Ty) -> Ty<'tcx> {
2774         let t = AstConv::ast_ty_to_ty(self, ast_t);
2775         self.register_wf_obligation(t, ast_t.span, traits::MiscObligation);
2776         t
2777     }
2778
2779     pub fn to_ty_saving_user_provided_ty(&self, ast_ty: &hir::Ty) -> Ty<'tcx> {
2780         let ty = self.to_ty(ast_ty);
2781         debug!("to_ty_saving_user_provided_ty: ty={:?}", ty);
2782
2783         if Self::can_contain_user_lifetime_bounds(ty) {
2784             let c_ty = self.infcx.canonicalize_response(&UserType::Ty(ty));
2785             debug!("to_ty_saving_user_provided_ty: c_ty={:?}", c_ty);
2786             self.tables.borrow_mut().user_provided_types_mut().insert(ast_ty.hir_id, c_ty);
2787         }
2788
2789         ty
2790     }
2791
2792     /// Returns the `DefId` of the constant parameter that the provided expression is a path to.
2793     pub fn const_param_def_id(&self, hir_c: &hir::AnonConst) -> Option<DefId> {
2794         AstConv::const_param_def_id(self, &self.tcx.hir().body(hir_c.body).value)
2795     }
2796
2797     pub fn to_const(&self, ast_c: &hir::AnonConst, ty: Ty<'tcx>) -> &'tcx ty::Const<'tcx> {
2798         AstConv::ast_const_to_const(self, ast_c, ty)
2799     }
2800
2801     // If the type given by the user has free regions, save it for later, since
2802     // NLL would like to enforce those. Also pass in types that involve
2803     // projections, since those can resolve to `'static` bounds (modulo #54940,
2804     // which hopefully will be fixed by the time you see this comment, dear
2805     // reader, although I have my doubts). Also pass in types with inference
2806     // types, because they may be repeated. Other sorts of things are already
2807     // sufficiently enforced with erased regions. =)
2808     fn can_contain_user_lifetime_bounds<T>(t: T) -> bool
2809     where
2810         T: TypeFoldable<'tcx>
2811     {
2812         t.has_free_regions() || t.has_projections() || t.has_infer_types()
2813     }
2814
2815     pub fn node_ty(&self, id: hir::HirId) -> Ty<'tcx> {
2816         match self.tables.borrow().node_types().get(id) {
2817             Some(&t) => t,
2818             None if self.is_tainted_by_errors() => self.tcx.types.err,
2819             None => {
2820                 bug!("no type for node {}: {} in fcx {}",
2821                      id, self.tcx.hir().node_to_string(id),
2822                      self.tag());
2823             }
2824         }
2825     }
2826
2827     /// Registers an obligation for checking later, during regionck, that the type `ty` must
2828     /// outlive the region `r`.
2829     pub fn register_wf_obligation(
2830         &self,
2831         ty: Ty<'tcx>,
2832         span: Span,
2833         code: traits::ObligationCauseCode<'tcx>,
2834     ) {
2835         // WF obligations never themselves fail, so no real need to give a detailed cause:
2836         let cause = traits::ObligationCause::new(span, self.body_id, code);
2837         self.register_predicate(
2838             traits::Obligation::new(cause, self.param_env, ty::Predicate::WellFormed(ty)),
2839         );
2840     }
2841
2842     /// Registers obligations that all types appearing in `substs` are well-formed.
2843     pub fn add_wf_bounds(&self, substs: SubstsRef<'tcx>, expr: &hir::Expr) {
2844         for ty in substs.types() {
2845             if !ty.references_error() {
2846                 self.register_wf_obligation(ty, expr.span, traits::MiscObligation);
2847             }
2848         }
2849     }
2850
2851     /// Given a fully substituted set of bounds (`generic_bounds`), and the values with which each
2852     /// type/region parameter was instantiated (`substs`), creates and registers suitable
2853     /// trait/region obligations.
2854     ///
2855     /// For example, if there is a function:
2856     ///
2857     /// ```
2858     /// fn foo<'a,T:'a>(...)
2859     /// ```
2860     ///
2861     /// and a reference:
2862     ///
2863     /// ```
2864     /// let f = foo;
2865     /// ```
2866     ///
2867     /// Then we will create a fresh region variable `'$0` and a fresh type variable `$1` for `'a`
2868     /// and `T`. This routine will add a region obligation `$1:'$0` and register it locally.
2869     pub fn add_obligations_for_parameters(&self,
2870                                           cause: traits::ObligationCause<'tcx>,
2871                                           predicates: &ty::InstantiatedPredicates<'tcx>)
2872     {
2873         assert!(!predicates.has_escaping_bound_vars());
2874
2875         debug!("add_obligations_for_parameters(predicates={:?})",
2876                predicates);
2877
2878         for obligation in traits::predicates_for_generics(cause, self.param_env, predicates) {
2879             self.register_predicate(obligation);
2880         }
2881     }
2882
2883     // FIXME(arielb1): use this instead of field.ty everywhere
2884     // Only for fields! Returns <none> for methods>
2885     // Indifferent to privacy flags
2886     pub fn field_ty(
2887         &self,
2888         span: Span,
2889         field: &'tcx ty::FieldDef,
2890         substs: SubstsRef<'tcx>,
2891     ) -> Ty<'tcx> {
2892         self.normalize_associated_types_in(span, &field.ty(self.tcx, substs))
2893     }
2894
2895     fn check_casts(&self) {
2896         let mut deferred_cast_checks = self.deferred_cast_checks.borrow_mut();
2897         for cast in deferred_cast_checks.drain(..) {
2898             cast.check(self);
2899         }
2900     }
2901
2902     fn resolve_generator_interiors(&self, def_id: DefId) {
2903         let mut generators = self.deferred_generator_interiors.borrow_mut();
2904         for (body_id, interior, kind) in generators.drain(..) {
2905             self.select_obligations_where_possible(false, |_| {});
2906             generator_interior::resolve_interior(self, def_id, body_id, interior, kind);
2907         }
2908     }
2909
2910     // Tries to apply a fallback to `ty` if it is an unsolved variable.
2911     // Non-numerics get replaced with ! or () (depending on whether
2912     // feature(never_type) is enabled, unconstrained ints with i32,
2913     // unconstrained floats with f64.
2914     // Fallback becomes very dubious if we have encountered type-checking errors.
2915     // In that case, fallback to Error.
2916     // The return value indicates whether fallback has occurred.
2917     fn fallback_if_possible(&self, ty: Ty<'tcx>) -> bool {
2918         use rustc::ty::error::UnconstrainedNumeric::Neither;
2919         use rustc::ty::error::UnconstrainedNumeric::{UnconstrainedInt, UnconstrainedFloat};
2920
2921         assert!(ty.is_ty_infer());
2922         let fallback = match self.type_is_unconstrained_numeric(ty) {
2923             _ if self.is_tainted_by_errors() => self.tcx().types.err,
2924             UnconstrainedInt => self.tcx.types.i32,
2925             UnconstrainedFloat => self.tcx.types.f64,
2926             Neither if self.type_var_diverges(ty) => self.tcx.mk_diverging_default(),
2927             Neither => return false,
2928         };
2929         debug!("fallback_if_possible: defaulting `{:?}` to `{:?}`", ty, fallback);
2930         self.demand_eqtype(syntax_pos::DUMMY_SP, ty, fallback);
2931         true
2932     }
2933
2934     fn select_all_obligations_or_error(&self) {
2935         debug!("select_all_obligations_or_error");
2936         if let Err(errors) = self.fulfillment_cx.borrow_mut().select_all_or_error(&self) {
2937             self.report_fulfillment_errors(&errors, self.inh.body_id, false);
2938         }
2939     }
2940
2941     /// Select as many obligations as we can at present.
2942     fn select_obligations_where_possible(
2943         &self,
2944         fallback_has_occurred: bool,
2945         mutate_fullfillment_errors: impl Fn(&mut Vec<traits::FulfillmentError<'tcx>>),
2946     ) {
2947         if let Err(mut errors) = self.fulfillment_cx.borrow_mut().select_where_possible(self) {
2948             mutate_fullfillment_errors(&mut errors);
2949             self.report_fulfillment_errors(&errors, self.inh.body_id, fallback_has_occurred);
2950         }
2951     }
2952
2953     /// For the overloaded place expressions (`*x`, `x[3]`), the trait
2954     /// returns a type of `&T`, but the actual type we assign to the
2955     /// *expression* is `T`. So this function just peels off the return
2956     /// type by one layer to yield `T`.
2957     fn make_overloaded_place_return_type(&self,
2958                                           method: MethodCallee<'tcx>)
2959                                           -> ty::TypeAndMut<'tcx>
2960     {
2961         // extract method return type, which will be &T;
2962         let ret_ty = method.sig.output();
2963
2964         // method returns &T, but the type as visible to user is T, so deref
2965         ret_ty.builtin_deref(true).unwrap()
2966     }
2967
2968     fn lookup_indexing(
2969         &self,
2970         expr: &hir::Expr,
2971         base_expr: &'tcx hir::Expr,
2972         base_ty: Ty<'tcx>,
2973         idx_ty: Ty<'tcx>,
2974         needs: Needs,
2975     ) -> Option<(/*index type*/ Ty<'tcx>, /*element type*/ Ty<'tcx>)> {
2976         // FIXME(#18741) -- this is almost but not quite the same as the
2977         // autoderef that normal method probing does. They could likely be
2978         // consolidated.
2979
2980         let mut autoderef = self.autoderef(base_expr.span, base_ty);
2981         let mut result = None;
2982         while result.is_none() && autoderef.next().is_some() {
2983             result = self.try_index_step(expr, base_expr, &autoderef, needs, idx_ty);
2984         }
2985         autoderef.finalize(self);
2986         result
2987     }
2988
2989     /// To type-check `base_expr[index_expr]`, we progressively autoderef
2990     /// (and otherwise adjust) `base_expr`, looking for a type which either
2991     /// supports builtin indexing or overloaded indexing.
2992     /// This loop implements one step in that search; the autoderef loop
2993     /// is implemented by `lookup_indexing`.
2994     fn try_index_step(
2995         &self,
2996         expr: &hir::Expr,
2997         base_expr: &hir::Expr,
2998         autoderef: &Autoderef<'a, 'tcx>,
2999         needs: Needs,
3000         index_ty: Ty<'tcx>,
3001     ) -> Option<(/*index type*/ Ty<'tcx>, /*element type*/ Ty<'tcx>)> {
3002         let adjusted_ty = autoderef.unambiguous_final_ty(self);
3003         debug!("try_index_step(expr={:?}, base_expr={:?}, adjusted_ty={:?}, \
3004                                index_ty={:?})",
3005                expr,
3006                base_expr,
3007                adjusted_ty,
3008                index_ty);
3009
3010         for &unsize in &[false, true] {
3011             let mut self_ty = adjusted_ty;
3012             if unsize {
3013                 // We only unsize arrays here.
3014                 if let ty::Array(element_ty, _) = adjusted_ty.kind {
3015                     self_ty = self.tcx.mk_slice(element_ty);
3016                 } else {
3017                     continue;
3018                 }
3019             }
3020
3021             // If some lookup succeeds, write callee into table and extract index/element
3022             // type from the method signature.
3023             // If some lookup succeeded, install method in table
3024             let input_ty = self.next_ty_var(TypeVariableOrigin {
3025                 kind: TypeVariableOriginKind::AutoDeref,
3026                 span: base_expr.span,
3027             });
3028             let method = self.try_overloaded_place_op(
3029                 expr.span, self_ty, &[input_ty], needs, PlaceOp::Index);
3030
3031             let result = method.map(|ok| {
3032                 debug!("try_index_step: success, using overloaded indexing");
3033                 let method = self.register_infer_ok_obligations(ok);
3034
3035                 let mut adjustments = autoderef.adjust_steps(self, needs);
3036                 if let ty::Ref(region, _, r_mutbl) = method.sig.inputs()[0].kind {
3037                     let mutbl = match r_mutbl {
3038                         hir::MutImmutable => AutoBorrowMutability::Immutable,
3039                         hir::MutMutable => AutoBorrowMutability::Mutable {
3040                             // Indexing can be desugared to a method call,
3041                             // so maybe we could use two-phase here.
3042                             // See the documentation of AllowTwoPhase for why that's
3043                             // not the case today.
3044                             allow_two_phase_borrow: AllowTwoPhase::No,
3045                         }
3046                     };
3047                     adjustments.push(Adjustment {
3048                         kind: Adjust::Borrow(AutoBorrow::Ref(region, mutbl)),
3049                         target: self.tcx.mk_ref(region, ty::TypeAndMut {
3050                             mutbl: r_mutbl,
3051                             ty: adjusted_ty
3052                         })
3053                     });
3054                 }
3055                 if unsize {
3056                     adjustments.push(Adjustment {
3057                         kind: Adjust::Pointer(PointerCast::Unsize),
3058                         target: method.sig.inputs()[0]
3059                     });
3060                 }
3061                 self.apply_adjustments(base_expr, adjustments);
3062
3063                 self.write_method_call(expr.hir_id, method);
3064                 (input_ty, self.make_overloaded_place_return_type(method).ty)
3065             });
3066             if result.is_some() {
3067                 return result;
3068             }
3069         }
3070
3071         None
3072     }
3073
3074     fn resolve_place_op(&self, op: PlaceOp, is_mut: bool) -> (Option<DefId>, ast::Ident) {
3075         let (tr, name) = match (op, is_mut) {
3076             (PlaceOp::Deref, false) => (self.tcx.lang_items().deref_trait(), sym::deref),
3077             (PlaceOp::Deref, true) => (self.tcx.lang_items().deref_mut_trait(), sym::deref_mut),
3078             (PlaceOp::Index, false) => (self.tcx.lang_items().index_trait(), sym::index),
3079             (PlaceOp::Index, true) => (self.tcx.lang_items().index_mut_trait(), sym::index_mut),
3080         };
3081         (tr, ast::Ident::with_dummy_span(name))
3082     }
3083
3084     fn try_overloaded_place_op(&self,
3085                                 span: Span,
3086                                 base_ty: Ty<'tcx>,
3087                                 arg_tys: &[Ty<'tcx>],
3088                                 needs: Needs,
3089                                 op: PlaceOp)
3090                                 -> Option<InferOk<'tcx, MethodCallee<'tcx>>>
3091     {
3092         debug!("try_overloaded_place_op({:?},{:?},{:?},{:?})",
3093                span,
3094                base_ty,
3095                needs,
3096                op);
3097
3098         // Try Mut first, if needed.
3099         let (mut_tr, mut_op) = self.resolve_place_op(op, true);
3100         let method = match (needs, mut_tr) {
3101             (Needs::MutPlace, Some(trait_did)) => {
3102                 self.lookup_method_in_trait(span, mut_op, trait_did, base_ty, Some(arg_tys))
3103             }
3104             _ => None,
3105         };
3106
3107         // Otherwise, fall back to the immutable version.
3108         let (imm_tr, imm_op) = self.resolve_place_op(op, false);
3109         let method = match (method, imm_tr) {
3110             (None, Some(trait_did)) => {
3111                 self.lookup_method_in_trait(span, imm_op, trait_did, base_ty, Some(arg_tys))
3112             }
3113             (method, _) => method,
3114         };
3115
3116         method
3117     }
3118
3119     fn check_method_argument_types(
3120         &self,
3121         sp: Span,
3122         expr: &'tcx hir::Expr,
3123         method: Result<MethodCallee<'tcx>, ()>,
3124         args_no_rcvr: &'tcx [hir::Expr],
3125         tuple_arguments: TupleArgumentsFlag,
3126         expected: Expectation<'tcx>,
3127     ) -> Ty<'tcx> {
3128
3129         let has_error = match method {
3130             Ok(method) => {
3131                 method.substs.references_error() || method.sig.references_error()
3132             }
3133             Err(_) => true
3134         };
3135         if has_error {
3136             let err_inputs = self.err_args(args_no_rcvr.len());
3137
3138             let err_inputs = match tuple_arguments {
3139                 DontTupleArguments => err_inputs,
3140                 TupleArguments => vec![self.tcx.intern_tup(&err_inputs[..])],
3141             };
3142
3143             self.check_argument_types(
3144                 sp,
3145                 expr,
3146                 &err_inputs[..],
3147                 &[],
3148                 args_no_rcvr,
3149                 false,
3150                 tuple_arguments,
3151                 None,
3152             );
3153             return self.tcx.types.err;
3154         }
3155
3156         let method = method.unwrap();
3157         // HACK(eddyb) ignore self in the definition (see above).
3158         let expected_arg_tys = self.expected_inputs_for_expected_output(
3159             sp,
3160             expected,
3161             method.sig.output(),
3162             &method.sig.inputs()[1..]
3163         );
3164         self.check_argument_types(
3165             sp,
3166             expr,
3167             &method.sig.inputs()[1..],
3168             &expected_arg_tys[..],
3169             args_no_rcvr,
3170             method.sig.c_variadic,
3171             tuple_arguments,
3172             self.tcx.hir().span_if_local(method.def_id),
3173         );
3174         method.sig.output()
3175     }
3176
3177     fn self_type_matches_expected_vid(
3178         &self,
3179         trait_ref: ty::PolyTraitRef<'tcx>,
3180         expected_vid: ty::TyVid,
3181     ) -> bool {
3182         let self_ty = self.shallow_resolve(trait_ref.self_ty());
3183         debug!(
3184             "self_type_matches_expected_vid(trait_ref={:?}, self_ty={:?}, expected_vid={:?})",
3185             trait_ref, self_ty, expected_vid
3186         );
3187         match self_ty.kind {
3188             ty::Infer(ty::TyVar(found_vid)) => {
3189                 // FIXME: consider using `sub_root_var` here so we
3190                 // can see through subtyping.
3191                 let found_vid = self.root_var(found_vid);
3192                 debug!("self_type_matches_expected_vid - found_vid={:?}", found_vid);
3193                 expected_vid == found_vid
3194             }
3195             _ => false
3196         }
3197     }
3198
3199     fn obligations_for_self_ty<'b>(
3200         &'b self,
3201         self_ty: ty::TyVid,
3202     ) -> impl Iterator<Item = (ty::PolyTraitRef<'tcx>, traits::PredicateObligation<'tcx>)>
3203                  + Captures<'tcx>
3204                  + 'b {
3205         // FIXME: consider using `sub_root_var` here so we
3206         // can see through subtyping.
3207         let ty_var_root = self.root_var(self_ty);
3208         debug!("obligations_for_self_ty: self_ty={:?} ty_var_root={:?} pending_obligations={:?}",
3209                self_ty, ty_var_root,
3210                self.fulfillment_cx.borrow().pending_obligations());
3211
3212         self.fulfillment_cx
3213             .borrow()
3214             .pending_obligations()
3215             .into_iter()
3216             .filter_map(move |obligation| match obligation.predicate {
3217                 ty::Predicate::Projection(ref data) =>
3218                     Some((data.to_poly_trait_ref(self.tcx), obligation)),
3219                 ty::Predicate::Trait(ref data) =>
3220                     Some((data.to_poly_trait_ref(), obligation)),
3221                 ty::Predicate::Subtype(..) => None,
3222                 ty::Predicate::RegionOutlives(..) => None,
3223                 ty::Predicate::TypeOutlives(..) => None,
3224                 ty::Predicate::WellFormed(..) => None,
3225                 ty::Predicate::ObjectSafe(..) => None,
3226                 ty::Predicate::ConstEvaluatable(..) => None,
3227                 // N.B., this predicate is created by breaking down a
3228                 // `ClosureType: FnFoo()` predicate, where
3229                 // `ClosureType` represents some `Closure`. It can't
3230                 // possibly be referring to the current closure,
3231                 // because we haven't produced the `Closure` for
3232                 // this closure yet; this is exactly why the other
3233                 // code is looking for a self type of a unresolved
3234                 // inference variable.
3235                 ty::Predicate::ClosureKind(..) => None,
3236             }).filter(move |(tr, _)| self.self_type_matches_expected_vid(*tr, ty_var_root))
3237     }
3238
3239     fn type_var_is_sized(&self, self_ty: ty::TyVid) -> bool {
3240         self.obligations_for_self_ty(self_ty).any(|(tr, _)| {
3241             Some(tr.def_id()) == self.tcx.lang_items().sized_trait()
3242         })
3243     }
3244
3245     /// Generic function that factors out common logic from function calls,
3246     /// method calls and overloaded operators.
3247     fn check_argument_types(
3248         &self,
3249         sp: Span,
3250         expr: &'tcx hir::Expr,
3251         fn_inputs: &[Ty<'tcx>],
3252         expected_arg_tys: &[Ty<'tcx>],
3253         args: &'tcx [hir::Expr],
3254         c_variadic: bool,
3255         tuple_arguments: TupleArgumentsFlag,
3256         def_span: Option<Span>,
3257     ) {
3258         let tcx = self.tcx;
3259         // Grab the argument types, supplying fresh type variables
3260         // if the wrong number of arguments were supplied
3261         let supplied_arg_count = if tuple_arguments == DontTupleArguments {
3262             args.len()
3263         } else {
3264             1
3265         };
3266
3267         // All the input types from the fn signature must outlive the call
3268         // so as to validate implied bounds.
3269         for (fn_input_ty, arg_expr) in fn_inputs.iter().zip(args.iter()) {
3270             self.register_wf_obligation(fn_input_ty, arg_expr.span, traits::MiscObligation);
3271         }
3272
3273         let expected_arg_count = fn_inputs.len();
3274
3275         let param_count_error = |expected_count: usize,
3276                                  arg_count: usize,
3277                                  error_code: &str,
3278                                  c_variadic: bool,
3279                                  sugg_unit: bool| {
3280             let mut err = tcx.sess.struct_span_err_with_code(sp,
3281                 &format!("this function takes {}{} but {} {} supplied",
3282                     if c_variadic { "at least " } else { "" },
3283                     potentially_plural_count(expected_count, "parameter"),
3284                     potentially_plural_count(arg_count, "parameter"),
3285                     if arg_count == 1 {"was"} else {"were"}),
3286                 DiagnosticId::Error(error_code.to_owned()));
3287
3288             if let Some(def_s) = def_span.map(|sp| tcx.sess.source_map().def_span(sp)) {
3289                 err.span_label(def_s, "defined here");
3290             }
3291             if sugg_unit {
3292                 let sugg_span = tcx.sess.source_map().end_point(expr.span);
3293                 // remove closing `)` from the span
3294                 let sugg_span = sugg_span.shrink_to_lo();
3295                 err.span_suggestion(
3296                     sugg_span,
3297                     "expected the unit value `()`; create it with empty parentheses",
3298                     String::from("()"),
3299                     Applicability::MachineApplicable);
3300             } else {
3301                 err.span_label(sp, format!("expected {}{}",
3302                                            if c_variadic { "at least " } else { "" },
3303                                            potentially_plural_count(expected_count, "parameter")));
3304             }
3305             err.emit();
3306         };
3307
3308         let mut expected_arg_tys = expected_arg_tys.to_vec();
3309
3310         let formal_tys = if tuple_arguments == TupleArguments {
3311             let tuple_type = self.structurally_resolved_type(sp, fn_inputs[0]);
3312             match tuple_type.kind {
3313                 ty::Tuple(arg_types) if arg_types.len() != args.len() => {
3314                     param_count_error(arg_types.len(), args.len(), "E0057", false, false);
3315                     expected_arg_tys = vec![];
3316                     self.err_args(args.len())
3317                 }
3318                 ty::Tuple(arg_types) => {
3319                     expected_arg_tys = match expected_arg_tys.get(0) {
3320                         Some(&ty) => match ty.kind {
3321                             ty::Tuple(ref tys) => tys.iter().map(|k| k.expect_ty()).collect(),
3322                             _ => vec![],
3323                         },
3324                         None => vec![],
3325                     };
3326                     arg_types.iter().map(|k| k.expect_ty()).collect()
3327                 }
3328                 _ => {
3329                     span_err!(tcx.sess, sp, E0059,
3330                         "cannot use call notation; the first type parameter \
3331                          for the function trait is neither a tuple nor unit");
3332                     expected_arg_tys = vec![];
3333                     self.err_args(args.len())
3334                 }
3335             }
3336         } else if expected_arg_count == supplied_arg_count {
3337             fn_inputs.to_vec()
3338         } else if c_variadic {
3339             if supplied_arg_count >= expected_arg_count {
3340                 fn_inputs.to_vec()
3341             } else {
3342                 param_count_error(expected_arg_count, supplied_arg_count, "E0060", true, false);
3343                 expected_arg_tys = vec![];
3344                 self.err_args(supplied_arg_count)
3345             }
3346         } else {
3347             // is the missing argument of type `()`?
3348             let sugg_unit = if expected_arg_tys.len() == 1 && supplied_arg_count == 0 {
3349                 self.resolve_vars_if_possible(&expected_arg_tys[0]).is_unit()
3350             } else if fn_inputs.len() == 1 && supplied_arg_count == 0 {
3351                 self.resolve_vars_if_possible(&fn_inputs[0]).is_unit()
3352             } else {
3353                 false
3354             };
3355             param_count_error(expected_arg_count, supplied_arg_count, "E0061", false, sugg_unit);
3356
3357             expected_arg_tys = vec![];
3358             self.err_args(supplied_arg_count)
3359         };
3360
3361         debug!("check_argument_types: formal_tys={:?}",
3362                formal_tys.iter().map(|t| self.ty_to_string(*t)).collect::<Vec<String>>());
3363
3364         // If there is no expectation, expect formal_tys.
3365         let expected_arg_tys = if !expected_arg_tys.is_empty() {
3366             expected_arg_tys
3367         } else {
3368             formal_tys.clone()
3369         };
3370
3371         let mut final_arg_types: Vec<(usize, Ty<'_>)> = vec![];
3372
3373         // Check the arguments.
3374         // We do this in a pretty awful way: first we type-check any arguments
3375         // that are not closures, then we type-check the closures. This is so
3376         // that we have more information about the types of arguments when we
3377         // type-check the functions. This isn't really the right way to do this.
3378         for &check_closures in &[false, true] {
3379             debug!("check_closures={}", check_closures);
3380
3381             // More awful hacks: before we check argument types, try to do
3382             // an "opportunistic" vtable resolution of any trait bounds on
3383             // the call. This helps coercions.
3384             if check_closures {
3385                 self.select_obligations_where_possible(false, |errors| {
3386                     self.point_at_type_arg_instead_of_call_if_possible(errors, expr);
3387                     self.point_at_arg_instead_of_call_if_possible(
3388                         errors,
3389                         &final_arg_types[..],
3390                         sp,
3391                         &args,
3392                     );
3393                 })
3394             }
3395
3396             // For C-variadic functions, we don't have a declared type for all of
3397             // the arguments hence we only do our usual type checking with
3398             // the arguments who's types we do know.
3399             let t = if c_variadic {
3400                 expected_arg_count
3401             } else if tuple_arguments == TupleArguments {
3402                 args.len()
3403             } else {
3404                 supplied_arg_count
3405             };
3406             for (i, arg) in args.iter().take(t).enumerate() {
3407                 // Warn only for the first loop (the "no closures" one).
3408                 // Closure arguments themselves can't be diverging, but
3409                 // a previous argument can, e.g., `foo(panic!(), || {})`.
3410                 if !check_closures {
3411                     self.warn_if_unreachable(arg.hir_id, arg.span, "expression");
3412                 }
3413
3414                 let is_closure = match arg.kind {
3415                     ExprKind::Closure(..) => true,
3416                     _ => false
3417                 };
3418
3419                 if is_closure != check_closures {
3420                     continue;
3421                 }
3422
3423                 debug!("checking the argument");
3424                 let formal_ty = formal_tys[i];
3425
3426                 // The special-cased logic below has three functions:
3427                 // 1. Provide as good of an expected type as possible.
3428                 let expected = Expectation::rvalue_hint(self, expected_arg_tys[i]);
3429
3430                 let checked_ty = self.check_expr_with_expectation(&arg, expected);
3431
3432                 // 2. Coerce to the most detailed type that could be coerced
3433                 //    to, which is `expected_ty` if `rvalue_hint` returns an
3434                 //    `ExpectHasType(expected_ty)`, or the `formal_ty` otherwise.
3435                 let coerce_ty = expected.only_has_type(self).unwrap_or(formal_ty);
3436                 // We're processing function arguments so we definitely want to use
3437                 // two-phase borrows.
3438                 self.demand_coerce(&arg, checked_ty, coerce_ty, AllowTwoPhase::Yes);
3439                 final_arg_types.push((i, coerce_ty));
3440
3441                 // 3. Relate the expected type and the formal one,
3442                 //    if the expected type was used for the coercion.
3443                 self.demand_suptype(arg.span, formal_ty, coerce_ty);
3444             }
3445         }
3446
3447         // We also need to make sure we at least write the ty of the other
3448         // arguments which we skipped above.
3449         if c_variadic {
3450             fn variadic_error<'tcx>(s: &Session, span: Span, t: Ty<'tcx>, cast_ty: &str) {
3451                 use crate::structured_errors::{VariadicError, StructuredDiagnostic};
3452                 VariadicError::new(s, span, t, cast_ty).diagnostic().emit();
3453             }
3454
3455             for arg in args.iter().skip(expected_arg_count) {
3456                 let arg_ty = self.check_expr(&arg);
3457
3458                 // There are a few types which get autopromoted when passed via varargs
3459                 // in C but we just error out instead and require explicit casts.
3460                 let arg_ty = self.structurally_resolved_type(arg.span, arg_ty);
3461                 match arg_ty.kind {
3462                     ty::Float(ast::FloatTy::F32) => {
3463                         variadic_error(tcx.sess, arg.span, arg_ty, "c_double");
3464                     }
3465                     ty::Int(ast::IntTy::I8) | ty::Int(ast::IntTy::I16) | ty::Bool => {
3466                         variadic_error(tcx.sess, arg.span, arg_ty, "c_int");
3467                     }
3468                     ty::Uint(ast::UintTy::U8) | ty::Uint(ast::UintTy::U16) => {
3469                         variadic_error(tcx.sess, arg.span, arg_ty, "c_uint");
3470                     }
3471                     ty::FnDef(..) => {
3472                         let ptr_ty = self.tcx.mk_fn_ptr(arg_ty.fn_sig(self.tcx));
3473                         let ptr_ty = self.resolve_vars_if_possible(&ptr_ty);
3474                         variadic_error(tcx.sess, arg.span, arg_ty, &ptr_ty.to_string());
3475                     }
3476                     _ => {}
3477                 }
3478             }
3479         }
3480     }
3481
3482     fn err_args(&self, len: usize) -> Vec<Ty<'tcx>> {
3483         vec![self.tcx.types.err; len]
3484     }
3485
3486     /// Given a vec of evaluated `FullfillmentError`s and an `fn` call argument expressions, we
3487     /// walk the resolved types for each argument to see if any of the `FullfillmentError`s
3488     /// reference a type argument. If they do, and there's only *one* argument that does, we point
3489     /// at the corresponding argument's expression span instead of the `fn` call path span.
3490     fn point_at_arg_instead_of_call_if_possible(
3491         &self,
3492         errors: &mut Vec<traits::FulfillmentError<'_>>,
3493         final_arg_types: &[(usize, Ty<'tcx>)],
3494         call_sp: Span,
3495         args: &'tcx [hir::Expr],
3496     ) {
3497         if !call_sp.desugaring_kind().is_some() {
3498             // We *do not* do this for desugared call spans to keep good diagnostics when involving
3499             // the `?` operator.
3500             for error in errors {
3501                 if let ty::Predicate::Trait(predicate) = error.obligation.predicate {
3502                     // Collect the argument position for all arguments that could have caused this
3503                     // `FullfillmentError`.
3504                     let mut referenced_in = final_arg_types.iter()
3505                         .flat_map(|(i, ty)| {
3506                             let ty = self.resolve_vars_if_possible(ty);
3507                             // We walk the argument type because the argument's type could have
3508                             // been `Option<T>`, but the `FullfillmentError` references `T`.
3509                             ty.walk()
3510                                 .filter(|&ty| ty == predicate.skip_binder().self_ty())
3511                                 .map(move |_| *i)
3512                         });
3513                     if let (Some(ref_in), None) = (referenced_in.next(), referenced_in.next()) {
3514                         // We make sure that only *one* argument matches the obligation failure
3515                         // and thet the obligation's span to its expression's.
3516                         error.obligation.cause.span = args[ref_in].span;
3517                         error.points_at_arg_span = true;
3518                     }
3519                 }
3520             }
3521         }
3522     }
3523
3524     /// Given a vec of evaluated `FullfillmentError`s and an `fn` call expression, we walk the
3525     /// `PathSegment`s and resolve their type parameters to see if any of the `FullfillmentError`s
3526     /// were caused by them. If they were, we point at the corresponding type argument's span
3527     /// instead of the `fn` call path span.
3528     fn point_at_type_arg_instead_of_call_if_possible(
3529         &self,
3530         errors: &mut Vec<traits::FulfillmentError<'_>>,
3531         call_expr: &'tcx hir::Expr,
3532     ) {
3533         if let hir::ExprKind::Call(path, _) = &call_expr.kind {
3534             if let hir::ExprKind::Path(qpath) = &path.kind {
3535                 if let hir::QPath::Resolved(_, path) = &qpath {
3536                     for error in errors {
3537                         if let ty::Predicate::Trait(predicate) = error.obligation.predicate {
3538                             // If any of the type arguments in this path segment caused the
3539                             // `FullfillmentError`, point at its span (#61860).
3540                             for arg in path.segments.iter()
3541                                 .filter_map(|seg| seg.args.as_ref())
3542                                 .flat_map(|a| a.args.iter())
3543                             {
3544                                 if let hir::GenericArg::Type(hir_ty) = &arg {
3545                                     if let hir::TyKind::Path(
3546                                         hir::QPath::TypeRelative(..),
3547                                     ) = &hir_ty.kind {
3548                                         // Avoid ICE with associated types. As this is best
3549                                         // effort only, it's ok to ignore the case. It
3550                                         // would trigger in `is_send::<T::AssocType>();`
3551                                         // from `typeck-default-trait-impl-assoc-type.rs`.
3552                                     } else {
3553                                         let ty = AstConv::ast_ty_to_ty(self, hir_ty);
3554                                         let ty = self.resolve_vars_if_possible(&ty);
3555                                         if ty == predicate.skip_binder().self_ty() {
3556                                             error.obligation.cause.span = hir_ty.span;
3557                                         }
3558                                     }
3559                                 }
3560                             }
3561                         }
3562                     }
3563                 }
3564             }
3565         }
3566     }
3567
3568     // AST fragment checking
3569     fn check_lit(&self,
3570                  lit: &hir::Lit,
3571                  expected: Expectation<'tcx>)
3572                  -> Ty<'tcx>
3573     {
3574         let tcx = self.tcx;
3575
3576         match lit.node {
3577             ast::LitKind::Str(..) => tcx.mk_static_str(),
3578             ast::LitKind::ByteStr(ref v) => {
3579                 tcx.mk_imm_ref(tcx.lifetimes.re_static,
3580                                tcx.mk_array(tcx.types.u8, v.len() as u64))
3581             }
3582             ast::LitKind::Byte(_) => tcx.types.u8,
3583             ast::LitKind::Char(_) => tcx.types.char,
3584             ast::LitKind::Int(_, ast::LitIntType::Signed(t)) => tcx.mk_mach_int(t),
3585             ast::LitKind::Int(_, ast::LitIntType::Unsigned(t)) => tcx.mk_mach_uint(t),
3586             ast::LitKind::Int(_, ast::LitIntType::Unsuffixed) => {
3587                 let opt_ty = expected.to_option(self).and_then(|ty| {
3588                     match ty.kind {
3589                         ty::Int(_) | ty::Uint(_) => Some(ty),
3590                         ty::Char => Some(tcx.types.u8),
3591                         ty::RawPtr(..) => Some(tcx.types.usize),
3592                         ty::FnDef(..) | ty::FnPtr(_) => Some(tcx.types.usize),
3593                         _ => None
3594                     }
3595                 });
3596                 opt_ty.unwrap_or_else(|| self.next_int_var())
3597             }
3598             ast::LitKind::Float(_, t) => tcx.mk_mach_float(t),
3599             ast::LitKind::FloatUnsuffixed(_) => {
3600                 let opt_ty = expected.to_option(self).and_then(|ty| {
3601                     match ty.kind {
3602                         ty::Float(_) => Some(ty),
3603                         _ => None
3604                     }
3605                 });
3606                 opt_ty.unwrap_or_else(|| self.next_float_var())
3607             }
3608             ast::LitKind::Bool(_) => tcx.types.bool,
3609             ast::LitKind::Err(_) => tcx.types.err,
3610         }
3611     }
3612
3613     // Determine the `Self` type, using fresh variables for all variables
3614     // declared on the impl declaration e.g., `impl<A,B> for Vec<(A,B)>`
3615     // would return `($0, $1)` where `$0` and `$1` are freshly instantiated type
3616     // variables.
3617     pub fn impl_self_ty(&self,
3618                         span: Span, // (potential) receiver for this impl
3619                         did: DefId)
3620                         -> TypeAndSubsts<'tcx> {
3621         let ity = self.tcx.type_of(did);
3622         debug!("impl_self_ty: ity={:?}", ity);
3623
3624         let substs = self.fresh_substs_for_item(span, did);
3625         let substd_ty = self.instantiate_type_scheme(span, &substs, &ity);
3626
3627         TypeAndSubsts { substs: substs, ty: substd_ty }
3628     }
3629
3630     /// Unifies the output type with the expected type early, for more coercions
3631     /// and forward type information on the input expressions.
3632     fn expected_inputs_for_expected_output(&self,
3633                                            call_span: Span,
3634                                            expected_ret: Expectation<'tcx>,
3635                                            formal_ret: Ty<'tcx>,
3636                                            formal_args: &[Ty<'tcx>])
3637                                            -> Vec<Ty<'tcx>> {
3638         let formal_ret = self.resolve_type_vars_with_obligations(formal_ret);
3639         let ret_ty = match expected_ret.only_has_type(self) {
3640             Some(ret) => ret,
3641             None => return Vec::new()
3642         };
3643         let expect_args = self.fudge_inference_if_ok(|| {
3644             // Attempt to apply a subtyping relationship between the formal
3645             // return type (likely containing type variables if the function
3646             // is polymorphic) and the expected return type.
3647             // No argument expectations are produced if unification fails.
3648             let origin = self.misc(call_span);
3649             let ures = self.at(&origin, self.param_env).sup(ret_ty, &formal_ret);
3650
3651             // FIXME(#27336) can't use ? here, Try::from_error doesn't default
3652             // to identity so the resulting type is not constrained.
3653             match ures {
3654                 Ok(ok) => {
3655                     // Process any obligations locally as much as
3656                     // we can.  We don't care if some things turn
3657                     // out unconstrained or ambiguous, as we're
3658                     // just trying to get hints here.
3659                     self.save_and_restore_in_snapshot_flag(|_| {
3660                         let mut fulfill = TraitEngine::new(self.tcx);
3661                         for obligation in ok.obligations {
3662                             fulfill.register_predicate_obligation(self, obligation);
3663                         }
3664                         fulfill.select_where_possible(self)
3665                     }).map_err(|_| ())?;
3666                 }
3667                 Err(_) => return Err(()),
3668             }
3669
3670             // Record all the argument types, with the substitutions
3671             // produced from the above subtyping unification.
3672             Ok(formal_args.iter().map(|ty| {
3673                 self.resolve_vars_if_possible(ty)
3674             }).collect())
3675         }).unwrap_or_default();
3676         debug!("expected_inputs_for_expected_output(formal={:?} -> {:?}, expected={:?} -> {:?})",
3677                formal_args, formal_ret,
3678                expect_args, expected_ret);
3679         expect_args
3680     }
3681
3682     pub fn check_struct_path(&self,
3683                              qpath: &QPath,
3684                              hir_id: hir::HirId)
3685                              -> Option<(&'tcx ty::VariantDef,  Ty<'tcx>)> {
3686         let path_span = match *qpath {
3687             QPath::Resolved(_, ref path) => path.span,
3688             QPath::TypeRelative(ref qself, _) => qself.span
3689         };
3690         let (def, ty) = self.finish_resolving_struct_path(qpath, path_span, hir_id);
3691         let variant = match def {
3692             Res::Err => {
3693                 self.set_tainted_by_errors();
3694                 return None;
3695             }
3696             Res::Def(DefKind::Variant, _) => {
3697                 match ty.kind {
3698                     ty::Adt(adt, substs) => {
3699                         Some((adt.variant_of_res(def), adt.did, substs))
3700                     }
3701                     _ => bug!("unexpected type: {:?}", ty)
3702                 }
3703             }
3704             Res::Def(DefKind::Struct, _)
3705             | Res::Def(DefKind::Union, _)
3706             | Res::Def(DefKind::TyAlias, _)
3707             | Res::Def(DefKind::AssocTy, _)
3708             | Res::SelfTy(..) => {
3709                 match ty.kind {
3710                     ty::Adt(adt, substs) if !adt.is_enum() => {
3711                         Some((adt.non_enum_variant(), adt.did, substs))
3712                     }
3713                     _ => None,
3714                 }
3715             }
3716             _ => bug!("unexpected definition: {:?}", def)
3717         };
3718
3719         if let Some((variant, did, substs)) = variant {
3720             debug!("check_struct_path: did={:?} substs={:?}", did, substs);
3721             self.write_user_type_annotation_from_substs(hir_id, did, substs, None);
3722
3723             // Check bounds on type arguments used in the path.
3724             let (bounds, _) = self.instantiate_bounds(path_span, did, substs);
3725             let cause = traits::ObligationCause::new(
3726                 path_span,
3727                 self.body_id,
3728                 traits::ItemObligation(did),
3729             );
3730             self.add_obligations_for_parameters(cause, &bounds);
3731
3732             Some((variant, ty))
3733         } else {
3734             struct_span_err!(self.tcx.sess, path_span, E0071,
3735                              "expected struct, variant or union type, found {}",
3736                              ty.sort_string(self.tcx))
3737                 .span_label(path_span, "not a struct")
3738                 .emit();
3739             None
3740         }
3741     }
3742
3743     // Finish resolving a path in a struct expression or pattern `S::A { .. }` if necessary.
3744     // The newly resolved definition is written into `type_dependent_defs`.
3745     fn finish_resolving_struct_path(&self,
3746                                     qpath: &QPath,
3747                                     path_span: Span,
3748                                     hir_id: hir::HirId)
3749                                     -> (Res, Ty<'tcx>)
3750     {
3751         match *qpath {
3752             QPath::Resolved(ref maybe_qself, ref path) => {
3753                 let self_ty = maybe_qself.as_ref().map(|qself| self.to_ty(qself));
3754                 let ty = AstConv::res_to_ty(self, self_ty, path, true);
3755                 (path.res, ty)
3756             }
3757             QPath::TypeRelative(ref qself, ref segment) => {
3758                 let ty = self.to_ty(qself);
3759
3760                 let res = if let hir::TyKind::Path(QPath::Resolved(_, ref path)) = qself.kind {
3761                     path.res
3762                 } else {
3763                     Res::Err
3764                 };
3765                 let result = AstConv::associated_path_to_ty(
3766                     self,
3767                     hir_id,
3768                     path_span,
3769                     ty,
3770                     res,
3771                     segment,
3772                     true,
3773                 );
3774                 let ty = result.map(|(ty, _, _)| ty).unwrap_or(self.tcx().types.err);
3775                 let result = result.map(|(_, kind, def_id)| (kind, def_id));
3776
3777                 // Write back the new resolution.
3778                 self.write_resolution(hir_id, result);
3779
3780                 (result.map(|(kind, def_id)| Res::Def(kind, def_id)).unwrap_or(Res::Err), ty)
3781             }
3782         }
3783     }
3784
3785     /// Resolves an associated value path into a base type and associated constant, or method
3786     /// resolution. The newly resolved definition is written into `type_dependent_defs`.
3787     pub fn resolve_ty_and_res_ufcs<'b>(&self,
3788                                        qpath: &'b QPath,
3789                                        hir_id: hir::HirId,
3790                                        span: Span)
3791                                        -> (Res, Option<Ty<'tcx>>, &'b [hir::PathSegment])
3792     {
3793         debug!("resolve_ty_and_res_ufcs: qpath={:?} hir_id={:?} span={:?}", qpath, hir_id, span);
3794         let (ty, qself, item_segment) = match *qpath {
3795             QPath::Resolved(ref opt_qself, ref path) => {
3796                 return (path.res,
3797                         opt_qself.as_ref().map(|qself| self.to_ty(qself)),
3798                         &path.segments[..]);
3799             }
3800             QPath::TypeRelative(ref qself, ref segment) => {
3801                 (self.to_ty(qself), qself, segment)
3802             }
3803         };
3804         if let Some(&cached_result) = self.tables.borrow().type_dependent_defs().get(hir_id) {
3805             // Return directly on cache hit. This is useful to avoid doubly reporting
3806             // errors with default match binding modes. See #44614.
3807             let def = cached_result.map(|(kind, def_id)| Res::Def(kind, def_id))
3808                 .unwrap_or(Res::Err);
3809             return (def, Some(ty), slice::from_ref(&**item_segment));
3810         }
3811         let item_name = item_segment.ident;
3812         let result = self.resolve_ufcs(span, item_name, ty, hir_id).or_else(|error| {
3813             let result = match error {
3814                 method::MethodError::PrivateMatch(kind, def_id, _) => Ok((kind, def_id)),
3815                 _ => Err(ErrorReported),
3816             };
3817             if item_name.name != kw::Invalid {
3818                 self.report_method_error(
3819                     span,
3820                     ty,
3821                     item_name,
3822                     SelfSource::QPath(qself),
3823                     error,
3824                     None,
3825                 ).map(|mut e| e.emit());
3826             }
3827             result
3828         });
3829
3830         // Write back the new resolution.
3831         self.write_resolution(hir_id, result);
3832         (
3833             result.map(|(kind, def_id)| Res::Def(kind, def_id)).unwrap_or(Res::Err),
3834             Some(ty),
3835             slice::from_ref(&**item_segment),
3836         )
3837     }
3838
3839     pub fn check_decl_initializer(
3840         &self,
3841         local: &'tcx hir::Local,
3842         init: &'tcx hir::Expr,
3843     ) -> Ty<'tcx> {
3844         // FIXME(tschottdorf): `contains_explicit_ref_binding()` must be removed
3845         // for #42640 (default match binding modes).
3846         //
3847         // See #44848.
3848         let ref_bindings = local.pat.contains_explicit_ref_binding();
3849
3850         let local_ty = self.local_ty(init.span, local.hir_id).revealed_ty;
3851         if let Some(m) = ref_bindings {
3852             // Somewhat subtle: if we have a `ref` binding in the pattern,
3853             // we want to avoid introducing coercions for the RHS. This is
3854             // both because it helps preserve sanity and, in the case of
3855             // ref mut, for soundness (issue #23116). In particular, in
3856             // the latter case, we need to be clear that the type of the
3857             // referent for the reference that results is *equal to* the
3858             // type of the place it is referencing, and not some
3859             // supertype thereof.
3860             let init_ty = self.check_expr_with_needs(init, Needs::maybe_mut_place(m));
3861             self.demand_eqtype(init.span, local_ty, init_ty);
3862             init_ty
3863         } else {
3864             self.check_expr_coercable_to_type(init, local_ty)
3865         }
3866     }
3867
3868     pub fn check_decl_local(&self, local: &'tcx hir::Local) {
3869         let t = self.local_ty(local.span, local.hir_id).decl_ty;
3870         self.write_ty(local.hir_id, t);
3871
3872         if let Some(ref init) = local.init {
3873             let init_ty = self.check_decl_initializer(local, &init);
3874             self.overwrite_local_ty_if_err(local, t, init_ty);
3875         }
3876
3877         self.check_pat_top(&local.pat, t, None);
3878         let pat_ty = self.node_ty(local.pat.hir_id);
3879         self.overwrite_local_ty_if_err(local, t, pat_ty);
3880     }
3881
3882     fn overwrite_local_ty_if_err(&self, local: &'tcx hir::Local, decl_ty: Ty<'tcx>, ty: Ty<'tcx>) {
3883         if ty.references_error() {
3884             // Override the types everywhere with `types.err` to avoid knock down errors.
3885             self.write_ty(local.hir_id, ty);
3886             self.write_ty(local.pat.hir_id, ty);
3887             let local_ty = LocalTy {
3888                 decl_ty,
3889                 revealed_ty: ty,
3890             };
3891             self.locals.borrow_mut().insert(local.hir_id, local_ty);
3892             self.locals.borrow_mut().insert(local.pat.hir_id, local_ty);
3893         }
3894     }
3895
3896     fn suggest_semicolon_at_end(&self, span: Span, err: &mut DiagnosticBuilder<'_>) {
3897         err.span_suggestion_short(
3898             span.shrink_to_hi(),
3899             "consider using a semicolon here",
3900             ";".to_string(),
3901             Applicability::MachineApplicable,
3902         );
3903     }
3904
3905     pub fn check_stmt(&self, stmt: &'tcx hir::Stmt) {
3906         // Don't do all the complex logic below for `DeclItem`.
3907         match stmt.kind {
3908             hir::StmtKind::Item(..) => return,
3909             hir::StmtKind::Local(..) | hir::StmtKind::Expr(..) | hir::StmtKind::Semi(..) => {}
3910         }
3911
3912         self.warn_if_unreachable(stmt.hir_id, stmt.span, "statement");
3913
3914         // Hide the outer diverging and `has_errors` flags.
3915         let old_diverges = self.diverges.get();
3916         let old_has_errors = self.has_errors.get();
3917         self.diverges.set(Diverges::Maybe);
3918         self.has_errors.set(false);
3919
3920         match stmt.kind {
3921             hir::StmtKind::Local(ref l) => {
3922                 self.check_decl_local(&l);
3923             }
3924             // Ignore for now.
3925             hir::StmtKind::Item(_) => {}
3926             hir::StmtKind::Expr(ref expr) => {
3927                 // Check with expected type of `()`.
3928
3929                 self.check_expr_has_type_or_error(&expr, self.tcx.mk_unit(), |err| {
3930                     self.suggest_semicolon_at_end(expr.span, err);
3931                 });
3932             }
3933             hir::StmtKind::Semi(ref expr) => {
3934                 self.check_expr(&expr);
3935             }
3936         }
3937
3938         // Combine the diverging and `has_error` flags.
3939         self.diverges.set(self.diverges.get() | old_diverges);
3940         self.has_errors.set(self.has_errors.get() | old_has_errors);
3941     }
3942
3943     pub fn check_block_no_value(&self, blk: &'tcx hir::Block) {
3944         let unit = self.tcx.mk_unit();
3945         let ty = self.check_block_with_expected(blk, ExpectHasType(unit));
3946
3947         // if the block produces a `!` value, that can always be
3948         // (effectively) coerced to unit.
3949         if !ty.is_never() {
3950             self.demand_suptype(blk.span, unit, ty);
3951         }
3952     }
3953
3954     /// If `expr` is a `match` expression that has only one non-`!` arm, use that arm's tail
3955     /// expression's `Span`, otherwise return `expr.span`. This is done to give better errors
3956     /// when given code like the following:
3957     /// ```text
3958     /// if false { return 0i32; } else { 1u32 }
3959     /// //                               ^^^^ point at this instead of the whole `if` expression
3960     /// ```
3961     fn get_expr_coercion_span(&self, expr: &hir::Expr) -> syntax_pos::Span {
3962         if let hir::ExprKind::Match(_, arms, _) = &expr.kind {
3963             let arm_spans: Vec<Span> = arms.iter().filter_map(|arm| {
3964                 self.in_progress_tables
3965                     .and_then(|tables| tables.borrow().node_type_opt(arm.body.hir_id))
3966                     .and_then(|arm_ty| {
3967                         if arm_ty.is_never() {
3968                             None
3969                         } else {
3970                             Some(match &arm.body.kind {
3971                                 // Point at the tail expression when possible.
3972                                 hir::ExprKind::Block(block, _) => block.expr
3973                                     .as_ref()
3974                                     .map(|e| e.span)
3975                                     .unwrap_or(block.span),
3976                                 _ => arm.body.span,
3977                             })
3978                         }
3979                     })
3980             }).collect();
3981             if arm_spans.len() == 1 {
3982                 return arm_spans[0];
3983             }
3984         }
3985         expr.span
3986     }
3987
3988     fn check_block_with_expected(
3989         &self,
3990         blk: &'tcx hir::Block,
3991         expected: Expectation<'tcx>,
3992     ) -> Ty<'tcx> {
3993         let prev = {
3994             let mut fcx_ps = self.ps.borrow_mut();
3995             let unsafety_state = fcx_ps.recurse(blk);
3996             replace(&mut *fcx_ps, unsafety_state)
3997         };
3998
3999         // In some cases, blocks have just one exit, but other blocks
4000         // can be targeted by multiple breaks. This can happen both
4001         // with labeled blocks as well as when we desugar
4002         // a `try { ... }` expression.
4003         //
4004         // Example 1:
4005         //
4006         //    'a: { if true { break 'a Err(()); } Ok(()) }
4007         //
4008         // Here we would wind up with two coercions, one from
4009         // `Err(())` and the other from the tail expression
4010         // `Ok(())`. If the tail expression is omitted, that's a
4011         // "forced unit" -- unless the block diverges, in which
4012         // case we can ignore the tail expression (e.g., `'a: {
4013         // break 'a 22; }` would not force the type of the block
4014         // to be `()`).
4015         let tail_expr = blk.expr.as_ref();
4016         let coerce_to_ty = expected.coercion_target_type(self, blk.span);
4017         let coerce = if blk.targeted_by_break {
4018             CoerceMany::new(coerce_to_ty)
4019         } else {
4020             let tail_expr: &[P<hir::Expr>] = match tail_expr {
4021                 Some(e) => slice::from_ref(e),
4022                 None => &[],
4023             };
4024             CoerceMany::with_coercion_sites(coerce_to_ty, tail_expr)
4025         };
4026
4027         let prev_diverges = self.diverges.get();
4028         let ctxt = BreakableCtxt {
4029             coerce: Some(coerce),
4030             may_break: false,
4031         };
4032
4033         let (ctxt, ()) = self.with_breakable_ctxt(blk.hir_id, ctxt, || {
4034             for s in &blk.stmts {
4035                 self.check_stmt(s);
4036             }
4037
4038             // check the tail expression **without** holding the
4039             // `enclosing_breakables` lock below.
4040             let tail_expr_ty = tail_expr.map(|t| self.check_expr_with_expectation(t, expected));
4041
4042             let mut enclosing_breakables = self.enclosing_breakables.borrow_mut();
4043             let ctxt = enclosing_breakables.find_breakable(blk.hir_id);
4044             let coerce = ctxt.coerce.as_mut().unwrap();
4045             if let Some(tail_expr_ty) = tail_expr_ty {
4046                 let tail_expr = tail_expr.unwrap();
4047                 let span = self.get_expr_coercion_span(tail_expr);
4048                 let cause = self.cause(span, ObligationCauseCode::BlockTailExpression(blk.hir_id));
4049                 coerce.coerce(self, &cause, tail_expr, tail_expr_ty);
4050             } else {
4051                 // Subtle: if there is no explicit tail expression,
4052                 // that is typically equivalent to a tail expression
4053                 // of `()` -- except if the block diverges. In that
4054                 // case, there is no value supplied from the tail
4055                 // expression (assuming there are no other breaks,
4056                 // this implies that the type of the block will be
4057                 // `!`).
4058                 //
4059                 // #41425 -- label the implicit `()` as being the
4060                 // "found type" here, rather than the "expected type".
4061                 if !self.diverges.get().is_always() {
4062                     // #50009 -- Do not point at the entire fn block span, point at the return type
4063                     // span, as it is the cause of the requirement, and
4064                     // `consider_hint_about_removing_semicolon` will point at the last expression
4065                     // if it were a relevant part of the error. This improves usability in editors
4066                     // that highlight errors inline.
4067                     let mut sp = blk.span;
4068                     let mut fn_span = None;
4069                     if let Some((decl, ident)) = self.get_parent_fn_decl(blk.hir_id) {
4070                         let ret_sp = decl.output.span();
4071                         if let Some(block_sp) = self.parent_item_span(blk.hir_id) {
4072                             // HACK: on some cases (`ui/liveness/liveness-issue-2163.rs`) the
4073                             // output would otherwise be incorrect and even misleading. Make sure
4074                             // the span we're aiming at correspond to a `fn` body.
4075                             if block_sp == blk.span {
4076                                 sp = ret_sp;
4077                                 fn_span = Some(ident.span);
4078                             }
4079                         }
4080                     }
4081                     coerce.coerce_forced_unit(self, &self.misc(sp), &mut |err| {
4082                         if let Some(expected_ty) = expected.only_has_type(self) {
4083                             self.consider_hint_about_removing_semicolon(blk, expected_ty, err);
4084                         }
4085                         if let Some(fn_span) = fn_span {
4086                             err.span_label(
4087                                 fn_span,
4088                                 "implicitly returns `()` as its body has no tail or `return` \
4089                                  expression",
4090                             );
4091                         }
4092                     }, false);
4093                 }
4094             }
4095         });
4096
4097         if ctxt.may_break {
4098             // If we can break from the block, then the block's exit is always reachable
4099             // (... as long as the entry is reachable) - regardless of the tail of the block.
4100             self.diverges.set(prev_diverges);
4101         }
4102
4103         let mut ty = ctxt.coerce.unwrap().complete(self);
4104
4105         if self.has_errors.get() || ty.references_error() {
4106             ty = self.tcx.types.err
4107         }
4108
4109         self.write_ty(blk.hir_id, ty);
4110
4111         *self.ps.borrow_mut() = prev;
4112         ty
4113     }
4114
4115     fn parent_item_span(&self, id: hir::HirId) -> Option<Span> {
4116         let node = self.tcx.hir().get(self.tcx.hir().get_parent_item(id));
4117         match node {
4118             Node::Item(&hir::Item {
4119                 kind: hir::ItemKind::Fn(_, _, _, body_id), ..
4120             }) |
4121             Node::ImplItem(&hir::ImplItem {
4122                 kind: hir::ImplItemKind::Method(_, body_id), ..
4123             }) => {
4124                 let body = self.tcx.hir().body(body_id);
4125                 if let ExprKind::Block(block, _) = &body.value.kind {
4126                     return Some(block.span);
4127                 }
4128             }
4129             _ => {}
4130         }
4131         None
4132     }
4133
4134     /// Given a function block's `HirId`, returns its `FnDecl` if it exists, or `None` otherwise.
4135     fn get_parent_fn_decl(&self, blk_id: hir::HirId) -> Option<(&'tcx hir::FnDecl, ast::Ident)> {
4136         let parent = self.tcx.hir().get(self.tcx.hir().get_parent_item(blk_id));
4137         self.get_node_fn_decl(parent).map(|(fn_decl, ident, _)| (fn_decl, ident))
4138     }
4139
4140     /// Given a function `Node`, return its `FnDecl` if it exists, or `None` otherwise.
4141     fn get_node_fn_decl(&self, node: Node<'tcx>) -> Option<(&'tcx hir::FnDecl, ast::Ident, bool)> {
4142         match node {
4143             Node::Item(&hir::Item {
4144                 ident, kind: hir::ItemKind::Fn(ref decl, ..), ..
4145             }) => {
4146                 // This is less than ideal, it will not suggest a return type span on any
4147                 // method called `main`, regardless of whether it is actually the entry point,
4148                 // but it will still present it as the reason for the expected type.
4149                 Some((decl, ident, ident.name != sym::main))
4150             }
4151             Node::TraitItem(&hir::TraitItem {
4152                 ident, kind: hir::TraitItemKind::Method(hir::MethodSig {
4153                     ref decl, ..
4154                 }, ..), ..
4155             }) => Some((decl, ident, true)),
4156             Node::ImplItem(&hir::ImplItem {
4157                 ident, kind: hir::ImplItemKind::Method(hir::MethodSig {
4158                     ref decl, ..
4159                 }, ..), ..
4160             }) => Some((decl, ident, false)),
4161             _ => None,
4162         }
4163     }
4164
4165     /// Given a `HirId`, return the `FnDecl` of the method it is enclosed by and whether a
4166     /// suggestion can be made, `None` otherwise.
4167     pub fn get_fn_decl(&self, blk_id: hir::HirId) -> Option<(&'tcx hir::FnDecl, bool)> {
4168         // Get enclosing Fn, if it is a function or a trait method, unless there's a `loop` or
4169         // `while` before reaching it, as block tail returns are not available in them.
4170         self.tcx.hir().get_return_block(blk_id).and_then(|blk_id| {
4171             let parent = self.tcx.hir().get(blk_id);
4172             self.get_node_fn_decl(parent).map(|(fn_decl, _, is_main)| (fn_decl, is_main))
4173         })
4174     }
4175
4176     /// On implicit return expressions with mismatched types, provides the following suggestions:
4177     ///
4178     /// - Points out the method's return type as the reason for the expected type.
4179     /// - Possible missing semicolon.
4180     /// - Possible missing return type if the return type is the default, and not `fn main()`.
4181     pub fn suggest_mismatched_types_on_tail(
4182         &self,
4183         err: &mut DiagnosticBuilder<'tcx>,
4184         expression: &'tcx hir::Expr,
4185         expected: Ty<'tcx>,
4186         found: Ty<'tcx>,
4187         cause_span: Span,
4188         blk_id: hir::HirId,
4189     ) -> bool {
4190         self.suggest_missing_semicolon(err, expression, expected, cause_span);
4191         let mut pointing_at_return_type = false;
4192         if let Some((fn_decl, can_suggest)) = self.get_fn_decl(blk_id) {
4193             pointing_at_return_type = self.suggest_missing_return_type(
4194                 err, &fn_decl, expected, found, can_suggest);
4195         }
4196         self.suggest_ref_or_into(err, expression, expected, found);
4197         self.suggest_boxing_when_appropriate(err, expression, expected, found);
4198         pointing_at_return_type
4199     }
4200
4201     /// When encountering an fn-like ctor that needs to unify with a value, check whether calling
4202     /// the ctor would successfully solve the type mismatch and if so, suggest it:
4203     /// ```
4204     /// fn foo(x: usize) -> usize { x }
4205     /// let x: usize = foo;  // suggest calling the `foo` function: `foo(42)`
4206     /// ```
4207     fn suggest_fn_call(
4208         &self,
4209         err: &mut DiagnosticBuilder<'tcx>,
4210         expr: &hir::Expr,
4211         expected: Ty<'tcx>,
4212         found: Ty<'tcx>,
4213     ) -> bool {
4214         let hir = self.tcx.hir();
4215         let (def_id, sig) = match found.kind {
4216             ty::FnDef(def_id, _) => (def_id, found.fn_sig(self.tcx)),
4217             ty::Closure(def_id, substs) => {
4218                 // We don't use `closure_sig` to account for malformed closures like
4219                 // `|_: [_; continue]| {}` and instead we don't suggest anything.
4220                 let closure_sig_ty = substs.closure_sig_ty(def_id, self.tcx);
4221                 (def_id, match closure_sig_ty.kind {
4222                     ty::FnPtr(sig) => sig,
4223                     _ => return false,
4224                 })
4225             }
4226             _ => return false,
4227         };
4228
4229         let sig = self
4230             .replace_bound_vars_with_fresh_vars(expr.span, infer::FnCall, &sig)
4231             .0;
4232         let sig = self.normalize_associated_types_in(expr.span, &sig);
4233         if self.can_coerce(sig.output(), expected) {
4234             let (mut sugg_call, applicability) = if sig.inputs().is_empty() {
4235                 (String::new(), Applicability::MachineApplicable)
4236             } else {
4237                 ("...".to_string(), Applicability::HasPlaceholders)
4238             };
4239             let mut msg = "call this function";
4240             match hir.get_if_local(def_id) {
4241                 Some(Node::Item(hir::Item {
4242                     kind: ItemKind::Fn(.., body_id),
4243                     ..
4244                 })) |
4245                 Some(Node::ImplItem(hir::ImplItem {
4246                     kind: hir::ImplItemKind::Method(_, body_id),
4247                     ..
4248                 })) |
4249                 Some(Node::TraitItem(hir::TraitItem {
4250                     kind: hir::TraitItemKind::Method(.., hir::TraitMethod::Provided(body_id)),
4251                     ..
4252                 })) => {
4253                     let body = hir.body(*body_id);
4254                     sugg_call = body.params.iter()
4255                         .map(|param| match &param.pat.kind {
4256                             hir::PatKind::Binding(_, _, ident, None)
4257                             if ident.name != kw::SelfLower => ident.to_string(),
4258                             _ => "_".to_string(),
4259                         }).collect::<Vec<_>>().join(", ");
4260                 }
4261                 Some(Node::Expr(hir::Expr {
4262                     kind: ExprKind::Closure(_, _, body_id, closure_span, _),
4263                     span: full_closure_span,
4264                     ..
4265                 })) => {
4266                     if *full_closure_span == expr.span {
4267                         return false;
4268                     }
4269                     err.span_label(*closure_span, "closure defined here");
4270                     msg = "call this closure";
4271                     let body = hir.body(*body_id);
4272                     sugg_call = body.params.iter()
4273                         .map(|param| match &param.pat.kind {
4274                             hir::PatKind::Binding(_, _, ident, None)
4275                             if ident.name != kw::SelfLower => ident.to_string(),
4276                             _ => "_".to_string(),
4277                         }).collect::<Vec<_>>().join(", ");
4278                 }
4279                 Some(Node::Ctor(hir::VariantData::Tuple(fields, _))) => {
4280                     sugg_call = fields.iter().map(|_| "_").collect::<Vec<_>>().join(", ");
4281                     match hir.as_local_hir_id(def_id).and_then(|hir_id| hir.def_kind(hir_id)) {
4282                         Some(hir::def::DefKind::Ctor(hir::def::CtorOf::Variant, _)) => {
4283                             msg = "instantiate this tuple variant";
4284                         }
4285                         Some(hir::def::DefKind::Ctor(hir::def::CtorOf::Struct, _)) => {
4286                             msg = "instantiate this tuple struct";
4287                         }
4288                         _ => {}
4289                     }
4290                 }
4291                 Some(Node::ForeignItem(hir::ForeignItem {
4292                     kind: hir::ForeignItemKind::Fn(_, idents, _),
4293                     ..
4294                 })) |
4295                 Some(Node::TraitItem(hir::TraitItem {
4296                     kind: hir::TraitItemKind::Method(.., hir::TraitMethod::Required(idents)),
4297                     ..
4298                 })) => sugg_call = idents.iter()
4299                         .map(|ident| if ident.name != kw::SelfLower {
4300                             ident.to_string()
4301                         } else {
4302                             "_".to_string()
4303                         }).collect::<Vec<_>>()
4304                         .join(", "),
4305                 _ => {}
4306             }
4307             if let Ok(code) = self.sess().source_map().span_to_snippet(expr.span) {
4308                 err.span_suggestion(
4309                     expr.span,
4310                     &format!("use parentheses to {}", msg),
4311                     format!("{}({})", code, sugg_call),
4312                     applicability,
4313                 );
4314                 return true;
4315             }
4316         }
4317         false
4318     }
4319
4320     pub fn suggest_ref_or_into(
4321         &self,
4322         err: &mut DiagnosticBuilder<'tcx>,
4323         expr: &hir::Expr,
4324         expected: Ty<'tcx>,
4325         found: Ty<'tcx>,
4326     ) {
4327         if let Some((sp, msg, suggestion)) = self.check_ref(expr, found, expected) {
4328             err.span_suggestion(
4329                 sp,
4330                 msg,
4331                 suggestion,
4332                 Applicability::MachineApplicable,
4333             );
4334         } else if let (ty::FnDef(def_id, ..), true) = (
4335             &found.kind,
4336             self.suggest_fn_call(err, expr, expected, found),
4337         ) {
4338             if let Some(sp) = self.tcx.hir().span_if_local(*def_id) {
4339                 let sp = self.sess().source_map().def_span(sp);
4340                 err.span_label(sp, &format!("{} defined here", found));
4341             }
4342         } else if !self.check_for_cast(err, expr, found, expected) {
4343             let is_struct_pat_shorthand_field = self.is_hir_id_from_struct_pattern_shorthand_field(
4344                 expr.hir_id,
4345                 expr.span,
4346             );
4347             let methods = self.get_conversion_methods(expr.span, expected, found);
4348             if let Ok(expr_text) = self.sess().source_map().span_to_snippet(expr.span) {
4349                 let mut suggestions = iter::repeat(&expr_text).zip(methods.iter())
4350                     .filter_map(|(receiver, method)| {
4351                         let method_call = format!(".{}()", method.ident);
4352                         if receiver.ends_with(&method_call) {
4353                             None  // do not suggest code that is already there (#53348)
4354                         } else {
4355                             let method_call_list = [".to_vec()", ".to_string()"];
4356                             let sugg = if receiver.ends_with(".clone()")
4357                                     && method_call_list.contains(&method_call.as_str()) {
4358                                 let max_len = receiver.rfind(".").unwrap();
4359                                 format!("{}{}", &receiver[..max_len], method_call)
4360                             } else {
4361                                 if expr.precedence().order() < ExprPrecedence::MethodCall.order() {
4362                                     format!("({}){}", receiver, method_call)
4363                                 } else {
4364                                     format!("{}{}", receiver, method_call)
4365                                 }
4366                             };
4367                             Some(if is_struct_pat_shorthand_field {
4368                                 format!("{}: {}", receiver, sugg)
4369                             } else {
4370                                 sugg
4371                             })
4372                         }
4373                     }).peekable();
4374                 if suggestions.peek().is_some() {
4375                     err.span_suggestions(
4376                         expr.span,
4377                         "try using a conversion method",
4378                         suggestions,
4379                         Applicability::MaybeIncorrect,
4380                     );
4381                 }
4382             }
4383         }
4384     }
4385
4386     /// When encountering the expected boxed value allocated in the stack, suggest allocating it
4387     /// in the heap by calling `Box::new()`.
4388     fn suggest_boxing_when_appropriate(
4389         &self,
4390         err: &mut DiagnosticBuilder<'tcx>,
4391         expr: &hir::Expr,
4392         expected: Ty<'tcx>,
4393         found: Ty<'tcx>,
4394     ) {
4395         if self.tcx.hir().is_const_context(expr.hir_id) {
4396             // Do not suggest `Box::new` in const context.
4397             return;
4398         }
4399         if !expected.is_box() || found.is_box() {
4400             return;
4401         }
4402         let boxed_found = self.tcx.mk_box(found);
4403         if let (true, Ok(snippet)) = (
4404             self.can_coerce(boxed_found, expected),
4405             self.sess().source_map().span_to_snippet(expr.span),
4406         ) {
4407             err.span_suggestion(
4408                 expr.span,
4409                 "store this in the heap by calling `Box::new`",
4410                 format!("Box::new({})", snippet),
4411                 Applicability::MachineApplicable,
4412             );
4413             err.note("for more on the distinction between the stack and the \
4414                         heap, read https://doc.rust-lang.org/book/ch15-01-box.html, \
4415                         https://doc.rust-lang.org/rust-by-example/std/box.html, and \
4416                         https://doc.rust-lang.org/std/boxed/index.html");
4417         }
4418     }
4419
4420
4421     /// A common error is to forget to add a semicolon at the end of a block, e.g.,
4422     ///
4423     /// ```
4424     /// fn foo() {
4425     ///     bar_that_returns_u32()
4426     /// }
4427     /// ```
4428     ///
4429     /// This routine checks if the return expression in a block would make sense on its own as a
4430     /// statement and the return type has been left as default or has been specified as `()`. If so,
4431     /// it suggests adding a semicolon.
4432     fn suggest_missing_semicolon(
4433         &self,
4434         err: &mut DiagnosticBuilder<'tcx>,
4435         expression: &'tcx hir::Expr,
4436         expected: Ty<'tcx>,
4437         cause_span: Span,
4438     ) {
4439         if expected.is_unit() {
4440             // `BlockTailExpression` only relevant if the tail expr would be
4441             // useful on its own.
4442             match expression.kind {
4443                 ExprKind::Call(..) |
4444                 ExprKind::MethodCall(..) |
4445                 ExprKind::Loop(..) |
4446                 ExprKind::Match(..) |
4447                 ExprKind::Block(..) => {
4448                     let sp = self.tcx.sess.source_map().next_point(cause_span);
4449                     err.span_suggestion(
4450                         sp,
4451                         "try adding a semicolon",
4452                         ";".to_string(),
4453                         Applicability::MachineApplicable);
4454                 }
4455                 _ => (),
4456             }
4457         }
4458     }
4459
4460     /// A possible error is to forget to add a return type that is needed:
4461     ///
4462     /// ```
4463     /// fn foo() {
4464     ///     bar_that_returns_u32()
4465     /// }
4466     /// ```
4467     ///
4468     /// This routine checks if the return type is left as default, the method is not part of an
4469     /// `impl` block and that it isn't the `main` method. If so, it suggests setting the return
4470     /// type.
4471     fn suggest_missing_return_type(
4472         &self,
4473         err: &mut DiagnosticBuilder<'tcx>,
4474         fn_decl: &hir::FnDecl,
4475         expected: Ty<'tcx>,
4476         found: Ty<'tcx>,
4477         can_suggest: bool,
4478     ) -> bool {
4479         // Only suggest changing the return type for methods that
4480         // haven't set a return type at all (and aren't `fn main()` or an impl).
4481         match (&fn_decl.output, found.is_suggestable(), can_suggest, expected.is_unit()) {
4482             (&hir::FunctionRetTy::DefaultReturn(span), true, true, true) => {
4483                 err.span_suggestion(
4484                     span,
4485                     "try adding a return type",
4486                     format!("-> {} ", self.resolve_type_vars_with_obligations(found)),
4487                     Applicability::MachineApplicable);
4488                 true
4489             }
4490             (&hir::FunctionRetTy::DefaultReturn(span), false, true, true) => {
4491                 err.span_label(span, "possibly return type missing here?");
4492                 true
4493             }
4494             (&hir::FunctionRetTy::DefaultReturn(span), _, false, true) => {
4495                 // `fn main()` must return `()`, do not suggest changing return type
4496                 err.span_label(span, "expected `()` because of default return type");
4497                 true
4498             }
4499             // expectation was caused by something else, not the default return
4500             (&hir::FunctionRetTy::DefaultReturn(_), _, _, false) => false,
4501             (&hir::FunctionRetTy::Return(ref ty), _, _, _) => {
4502                 // Only point to return type if the expected type is the return type, as if they
4503                 // are not, the expectation must have been caused by something else.
4504                 debug!("suggest_missing_return_type: return type {:?} node {:?}", ty, ty.kind);
4505                 let sp = ty.span;
4506                 let ty = AstConv::ast_ty_to_ty(self, ty);
4507                 debug!("suggest_missing_return_type: return type {:?}", ty);
4508                 debug!("suggest_missing_return_type: expected type {:?}", ty);
4509                 if ty.kind == expected.kind {
4510                     err.span_label(sp, format!("expected `{}` because of return type",
4511                                                expected));
4512                     return true;
4513                 }
4514                 false
4515             }
4516         }
4517     }
4518
4519     /// A possible error is to forget to add `.await` when using futures:
4520     ///
4521     /// ```
4522     /// async fn make_u32() -> u32 {
4523     ///     22
4524     /// }
4525     ///
4526     /// fn take_u32(x: u32) {}
4527     ///
4528     /// async fn foo() {
4529     ///     let x = make_u32();
4530     ///     take_u32(x);
4531     /// }
4532     /// ```
4533     ///
4534     /// This routine checks if the found type `T` implements `Future<Output=U>` where `U` is the
4535     /// expected type. If this is the case, and we are inside of an async body, it suggests adding
4536     /// `.await` to the tail of the expression.
4537     fn suggest_missing_await(
4538         &self,
4539         err: &mut DiagnosticBuilder<'tcx>,
4540         expr: &hir::Expr,
4541         expected: Ty<'tcx>,
4542         found: Ty<'tcx>,
4543     ) {
4544         // `.await` is not permitted outside of `async` bodies, so don't bother to suggest if the
4545         // body isn't `async`.
4546         let item_id = self.tcx().hir().get_parent_node(self.body_id);
4547         if let Some(body_id) = self.tcx().hir().maybe_body_owned_by(item_id) {
4548             let body = self.tcx().hir().body(body_id);
4549             if let Some(hir::GeneratorKind::Async(_)) = body.generator_kind {
4550                 let sp = expr.span;
4551                 // Check for `Future` implementations by constructing a predicate to
4552                 // prove: `<T as Future>::Output == U`
4553                 let future_trait = self.tcx.lang_items().future_trait().unwrap();
4554                 let item_def_id = self.tcx.associated_items(future_trait).next().unwrap().def_id;
4555                 let predicate = ty::Predicate::Projection(ty::Binder::bind(ty::ProjectionPredicate {
4556                     // `<T as Future>::Output`
4557                     projection_ty: ty::ProjectionTy {
4558                         // `T`
4559                         substs: self.tcx.mk_substs_trait(
4560                             found,
4561                             self.fresh_substs_for_item(sp, item_def_id)
4562                         ),
4563                         // `Future::Output`
4564                         item_def_id,
4565                     },
4566                     ty: expected,
4567                 }));
4568                 let obligation = traits::Obligation::new(self.misc(sp), self.param_env, predicate);
4569                 if self.infcx.predicate_may_hold(&obligation) {
4570                     if let Ok(code) = self.sess().source_map().span_to_snippet(sp) {
4571                         err.span_suggestion(
4572                             sp,
4573                             "consider using `.await` here",
4574                             format!("{}.await", code),
4575                             Applicability::MaybeIncorrect,
4576                         );
4577                     }
4578                 }
4579             }
4580         }
4581     }
4582
4583     /// A common error is to add an extra semicolon:
4584     ///
4585     /// ```
4586     /// fn foo() -> usize {
4587     ///     22;
4588     /// }
4589     /// ```
4590     ///
4591     /// This routine checks if the final statement in a block is an
4592     /// expression with an explicit semicolon whose type is compatible
4593     /// with `expected_ty`. If so, it suggests removing the semicolon.
4594     fn consider_hint_about_removing_semicolon(
4595         &self,
4596         blk: &'tcx hir::Block,
4597         expected_ty: Ty<'tcx>,
4598         err: &mut DiagnosticBuilder<'_>,
4599     ) {
4600         if let Some(span_semi) = self.could_remove_semicolon(blk, expected_ty) {
4601             err.span_suggestion(
4602                 span_semi,
4603                 "consider removing this semicolon",
4604                 String::new(),
4605                 Applicability::MachineApplicable,
4606             );
4607         }
4608     }
4609
4610     fn could_remove_semicolon(&self, blk: &'tcx hir::Block, expected_ty: Ty<'tcx>) -> Option<Span> {
4611         // Be helpful when the user wrote `{... expr;}` and
4612         // taking the `;` off is enough to fix the error.
4613         let last_stmt = blk.stmts.last()?;
4614         let last_expr = match last_stmt.kind {
4615             hir::StmtKind::Semi(ref e) => e,
4616             _ => return None,
4617         };
4618         let last_expr_ty = self.node_ty(last_expr.hir_id);
4619         if self.can_sub(self.param_env, last_expr_ty, expected_ty).is_err() {
4620             return None;
4621         }
4622         let original_span = original_sp(last_stmt.span, blk.span);
4623         Some(original_span.with_lo(original_span.hi() - BytePos(1)))
4624     }
4625
4626     // Instantiates the given path, which must refer to an item with the given
4627     // number of type parameters and type.
4628     pub fn instantiate_value_path(&self,
4629                                   segments: &[hir::PathSegment],
4630                                   self_ty: Option<Ty<'tcx>>,
4631                                   res: Res,
4632                                   span: Span,
4633                                   hir_id: hir::HirId)
4634                                   -> (Ty<'tcx>, Res) {
4635         debug!(
4636             "instantiate_value_path(segments={:?}, self_ty={:?}, res={:?}, hir_id={})",
4637             segments,
4638             self_ty,
4639             res,
4640             hir_id,
4641         );
4642
4643         let tcx = self.tcx;
4644
4645         let path_segs = match res {
4646             Res::Local(_) | Res::SelfCtor(_) => vec![],
4647             Res::Def(kind, def_id) =>
4648                 AstConv::def_ids_for_value_path_segments(self, segments, self_ty, kind, def_id),
4649             _ => bug!("instantiate_value_path on {:?}", res),
4650         };
4651
4652         let mut user_self_ty = None;
4653         let mut is_alias_variant_ctor = false;
4654         match res {
4655             Res::Def(DefKind::Ctor(CtorOf::Variant, _), _) => {
4656                 if let Some(self_ty) = self_ty {
4657                     let adt_def = self_ty.ty_adt_def().unwrap();
4658                     user_self_ty = Some(UserSelfTy {
4659                         impl_def_id: adt_def.did,
4660                         self_ty,
4661                     });
4662                     is_alias_variant_ctor = true;
4663                 }
4664             }
4665             Res::Def(DefKind::Method, def_id)
4666             | Res::Def(DefKind::AssocConst, def_id) => {
4667                 let container = tcx.associated_item(def_id).container;
4668                 debug!("instantiate_value_path: def_id={:?} container={:?}", def_id, container);
4669                 match container {
4670                     ty::TraitContainer(trait_did) => {
4671                         callee::check_legal_trait_for_method_call(tcx, span, trait_did)
4672                     }
4673                     ty::ImplContainer(impl_def_id) => {
4674                         if segments.len() == 1 {
4675                             // `<T>::assoc` will end up here, and so
4676                             // can `T::assoc`. It this came from an
4677                             // inherent impl, we need to record the
4678                             // `T` for posterity (see `UserSelfTy` for
4679                             // details).
4680                             let self_ty = self_ty.expect("UFCS sugared assoc missing Self");
4681                             user_self_ty = Some(UserSelfTy {
4682                                 impl_def_id,
4683                                 self_ty,
4684                             });
4685                         }
4686                     }
4687                 }
4688             }
4689             _ => {}
4690         }
4691
4692         // Now that we have categorized what space the parameters for each
4693         // segment belong to, let's sort out the parameters that the user
4694         // provided (if any) into their appropriate spaces. We'll also report
4695         // errors if type parameters are provided in an inappropriate place.
4696
4697         let generic_segs: FxHashSet<_> = path_segs.iter().map(|PathSeg(_, index)| index).collect();
4698         let generics_has_err = AstConv::prohibit_generics(
4699                 self, segments.iter().enumerate().filter_map(|(index, seg)| {
4700             if !generic_segs.contains(&index) || is_alias_variant_ctor {
4701                 Some(seg)
4702             } else {
4703                 None
4704             }
4705         }));
4706
4707         if let Res::Local(hid) = res {
4708             let ty = self.local_ty(span, hid).decl_ty;
4709             let ty = self.normalize_associated_types_in(span, &ty);
4710             self.write_ty(hir_id, ty);
4711             return (ty, res);
4712         }
4713
4714         if generics_has_err {
4715             // Don't try to infer type parameters when prohibited generic arguments were given.
4716             user_self_ty = None;
4717         }
4718
4719         // Now we have to compare the types that the user *actually*
4720         // provided against the types that were *expected*. If the user
4721         // did not provide any types, then we want to substitute inference
4722         // variables. If the user provided some types, we may still need
4723         // to add defaults. If the user provided *too many* types, that's
4724         // a problem.
4725
4726         let mut infer_args_for_err = FxHashSet::default();
4727         for &PathSeg(def_id, index) in &path_segs {
4728             let seg = &segments[index];
4729             let generics = tcx.generics_of(def_id);
4730             // Argument-position `impl Trait` is treated as a normal generic
4731             // parameter internally, but we don't allow users to specify the
4732             // parameter's value explicitly, so we have to do some error-
4733             // checking here.
4734             let suppress_errors = AstConv::check_generic_arg_count_for_call(
4735                 tcx,
4736                 span,
4737                 &generics,
4738                 &seg,
4739                 false, // `is_method_call`
4740             );
4741             if suppress_errors {
4742                 infer_args_for_err.insert(index);
4743                 self.set_tainted_by_errors(); // See issue #53251.
4744             }
4745         }
4746
4747         let has_self = path_segs.last().map(|PathSeg(def_id, _)| {
4748             tcx.generics_of(*def_id).has_self
4749         }).unwrap_or(false);
4750
4751         let (res, self_ctor_substs) = if let Res::SelfCtor(impl_def_id) = res {
4752             let ty = self.impl_self_ty(span, impl_def_id).ty;
4753             let adt_def = ty.ty_adt_def();
4754
4755             match ty.kind {
4756                 ty::Adt(adt_def, substs) if adt_def.has_ctor() => {
4757                     let variant = adt_def.non_enum_variant();
4758                     let ctor_def_id = variant.ctor_def_id.unwrap();
4759                     (
4760                         Res::Def(DefKind::Ctor(CtorOf::Struct, variant.ctor_kind), ctor_def_id),
4761                         Some(substs),
4762                     )
4763                 }
4764                 _ => {
4765                     let mut err = tcx.sess.struct_span_err(span,
4766                         "the `Self` constructor can only be used with tuple or unit structs");
4767                     if let Some(adt_def) = adt_def {
4768                         match adt_def.adt_kind() {
4769                             AdtKind::Enum => {
4770                                 err.help("did you mean to use one of the enum's variants?");
4771                             },
4772                             AdtKind::Struct |
4773                             AdtKind::Union => {
4774                                 err.span_suggestion(
4775                                     span,
4776                                     "use curly brackets",
4777                                     String::from("Self { /* fields */ }"),
4778                                     Applicability::HasPlaceholders,
4779                                 );
4780                             }
4781                         }
4782                     }
4783                     err.emit();
4784
4785                     return (tcx.types.err, res)
4786                 }
4787             }
4788         } else {
4789             (res, None)
4790         };
4791         let def_id = res.def_id();
4792
4793         // The things we are substituting into the type should not contain
4794         // escaping late-bound regions, and nor should the base type scheme.
4795         let ty = tcx.type_of(def_id);
4796
4797         let substs = self_ctor_substs.unwrap_or_else(|| AstConv::create_substs_for_generic_args(
4798             tcx,
4799             def_id,
4800             &[][..],
4801             has_self,
4802             self_ty,
4803             // Provide the generic args, and whether types should be inferred.
4804             |def_id| {
4805                 if let Some(&PathSeg(_, index)) = path_segs.iter().find(|&PathSeg(did, _)| {
4806                     *did == def_id
4807                 }) {
4808                     // If we've encountered an `impl Trait`-related error, we're just
4809                     // going to infer the arguments for better error messages.
4810                     if !infer_args_for_err.contains(&index) {
4811                         // Check whether the user has provided generic arguments.
4812                         if let Some(ref data) = segments[index].args {
4813                             return (Some(data), segments[index].infer_args);
4814                         }
4815                     }
4816                     return (None, segments[index].infer_args);
4817                 }
4818
4819                 (None, true)
4820             },
4821             // Provide substitutions for parameters for which (valid) arguments have been provided.
4822             |param, arg| {
4823                 match (&param.kind, arg) {
4824                     (GenericParamDefKind::Lifetime, GenericArg::Lifetime(lt)) => {
4825                         AstConv::ast_region_to_region(self, lt, Some(param)).into()
4826                     }
4827                     (GenericParamDefKind::Type { .. }, GenericArg::Type(ty)) => {
4828                         self.to_ty(ty).into()
4829                     }
4830                     (GenericParamDefKind::Const, GenericArg::Const(ct)) => {
4831                         self.to_const(&ct.value, self.tcx.type_of(param.def_id)).into()
4832                     }
4833                     _ => unreachable!(),
4834                 }
4835             },
4836             // Provide substitutions for parameters for which arguments are inferred.
4837             |substs, param, infer_args| {
4838                 match param.kind {
4839                     GenericParamDefKind::Lifetime => {
4840                         self.re_infer(Some(param), span).unwrap().into()
4841                     }
4842                     GenericParamDefKind::Type { has_default, .. } => {
4843                         if !infer_args && has_default {
4844                             // If we have a default, then we it doesn't matter that we're not
4845                             // inferring the type arguments: we provide the default where any
4846                             // is missing.
4847                             let default = tcx.type_of(param.def_id);
4848                             self.normalize_ty(
4849                                 span,
4850                                 default.subst_spanned(tcx, substs.unwrap(), Some(span))
4851                             ).into()
4852                         } else {
4853                             // If no type arguments were provided, we have to infer them.
4854                             // This case also occurs as a result of some malformed input, e.g.
4855                             // a lifetime argument being given instead of a type parameter.
4856                             // Using inference instead of `Error` gives better error messages.
4857                             self.var_for_def(span, param)
4858                         }
4859                     }
4860                     GenericParamDefKind::Const => {
4861                         // FIXME(const_generics:defaults)
4862                         // No const parameters were provided, we have to infer them.
4863                         self.var_for_def(span, param)
4864                     }
4865                 }
4866             },
4867         ));
4868         assert!(!substs.has_escaping_bound_vars());
4869         assert!(!ty.has_escaping_bound_vars());
4870
4871         // First, store the "user substs" for later.
4872         self.write_user_type_annotation_from_substs(hir_id, def_id, substs, user_self_ty);
4873
4874         self.add_required_obligations(span, def_id, &substs);
4875
4876         // Substitute the values for the type parameters into the type of
4877         // the referenced item.
4878         let ty_substituted = self.instantiate_type_scheme(span, &substs, &ty);
4879
4880         if let Some(UserSelfTy { impl_def_id, self_ty }) = user_self_ty {
4881             // In the case of `Foo<T>::method` and `<Foo<T>>::method`, if `method`
4882             // is inherent, there is no `Self` parameter; instead, the impl needs
4883             // type parameters, which we can infer by unifying the provided `Self`
4884             // with the substituted impl type.
4885             // This also occurs for an enum variant on a type alias.
4886             let ty = tcx.type_of(impl_def_id);
4887
4888             let impl_ty = self.instantiate_type_scheme(span, &substs, &ty);
4889             match self.at(&self.misc(span), self.param_env).sup(impl_ty, self_ty) {
4890                 Ok(ok) => self.register_infer_ok_obligations(ok),
4891                 Err(_) => {
4892                     self.tcx.sess.delay_span_bug(span, &format!(
4893                         "instantiate_value_path: (UFCS) {:?} was a subtype of {:?} but now is not?",
4894                         self_ty,
4895                         impl_ty,
4896                     ));
4897                 }
4898             }
4899         }
4900
4901         self.check_rustc_args_require_const(def_id, hir_id, span);
4902
4903         debug!("instantiate_value_path: type of {:?} is {:?}",
4904                hir_id,
4905                ty_substituted);
4906         self.write_substs(hir_id, substs);
4907
4908         (ty_substituted, res)
4909     }
4910
4911     /// Add all the obligations that are required, substituting and normalized appropriately.
4912     fn add_required_obligations(&self, span: Span, def_id: DefId, substs: &SubstsRef<'tcx>) {
4913         let (bounds, spans) = self.instantiate_bounds(span, def_id, &substs);
4914
4915         for (i, mut obligation) in traits::predicates_for_generics(
4916             traits::ObligationCause::new(
4917                 span,
4918                 self.body_id,
4919                 traits::ItemObligation(def_id),
4920             ),
4921             self.param_env,
4922             &bounds,
4923         ).into_iter().enumerate() {
4924             // This makes the error point at the bound, but we want to point at the argument
4925             if let Some(span) = spans.get(i) {
4926                 obligation.cause.code = traits::BindingObligation(def_id, *span);
4927             }
4928             self.register_predicate(obligation);
4929         }
4930     }
4931
4932     fn check_rustc_args_require_const(&self,
4933                                       def_id: DefId,
4934                                       hir_id: hir::HirId,
4935                                       span: Span) {
4936         // We're only interested in functions tagged with
4937         // #[rustc_args_required_const], so ignore anything that's not.
4938         if !self.tcx.has_attr(def_id, sym::rustc_args_required_const) {
4939             return
4940         }
4941
4942         // If our calling expression is indeed the function itself, we're good!
4943         // If not, generate an error that this can only be called directly.
4944         if let Node::Expr(expr) = self.tcx.hir().get(
4945             self.tcx.hir().get_parent_node(hir_id))
4946         {
4947             if let ExprKind::Call(ref callee, ..) = expr.kind {
4948                 if callee.hir_id == hir_id {
4949                     return
4950                 }
4951             }
4952         }
4953
4954         self.tcx.sess.span_err(span, "this function can only be invoked \
4955                                       directly, not through a function pointer");
4956     }
4957
4958     // Resolves `typ` by a single level if `typ` is a type variable.
4959     // If no resolution is possible, then an error is reported.
4960     // Numeric inference variables may be left unresolved.
4961     pub fn structurally_resolved_type(&self, sp: Span, ty: Ty<'tcx>) -> Ty<'tcx> {
4962         let ty = self.resolve_type_vars_with_obligations(ty);
4963         if !ty.is_ty_var() {
4964             ty
4965         } else {
4966             if !self.is_tainted_by_errors() {
4967                 self.need_type_info_err((**self).body_id, sp, ty)
4968                     .note("type must be known at this point")
4969                     .emit();
4970             }
4971             self.demand_suptype(sp, self.tcx.types.err, ty);
4972             self.tcx.types.err
4973         }
4974     }
4975
4976     fn with_breakable_ctxt<F: FnOnce() -> R, R>(
4977         &self,
4978         id: hir::HirId,
4979         ctxt: BreakableCtxt<'tcx>,
4980         f: F,
4981     ) -> (BreakableCtxt<'tcx>, R) {
4982         let index;
4983         {
4984             let mut enclosing_breakables = self.enclosing_breakables.borrow_mut();
4985             index = enclosing_breakables.stack.len();
4986             enclosing_breakables.by_id.insert(id, index);
4987             enclosing_breakables.stack.push(ctxt);
4988         }
4989         let result = f();
4990         let ctxt = {
4991             let mut enclosing_breakables = self.enclosing_breakables.borrow_mut();
4992             debug_assert!(enclosing_breakables.stack.len() == index + 1);
4993             enclosing_breakables.by_id.remove(&id).expect("missing breakable context");
4994             enclosing_breakables.stack.pop().expect("missing breakable context")
4995         };
4996         (ctxt, result)
4997     }
4998
4999     /// Instantiate a QueryResponse in a probe context, without a
5000     /// good ObligationCause.
5001     fn probe_instantiate_query_response(
5002         &self,
5003         span: Span,
5004         original_values: &OriginalQueryValues<'tcx>,
5005         query_result: &Canonical<'tcx, QueryResponse<'tcx, Ty<'tcx>>>,
5006     ) -> InferResult<'tcx, Ty<'tcx>>
5007     {
5008         self.instantiate_query_response_and_region_obligations(
5009             &traits::ObligationCause::misc(span, self.body_id),
5010             self.param_env,
5011             original_values,
5012             query_result)
5013     }
5014
5015     /// Returns `true` if an expression is contained inside the LHS of an assignment expression.
5016     fn expr_in_place(&self, mut expr_id: hir::HirId) -> bool {
5017         let mut contained_in_place = false;
5018
5019         while let hir::Node::Expr(parent_expr) =
5020             self.tcx.hir().get(self.tcx.hir().get_parent_node(expr_id))
5021         {
5022             match &parent_expr.kind {
5023                 hir::ExprKind::Assign(lhs, ..) | hir::ExprKind::AssignOp(_, lhs, ..) => {
5024                     if lhs.hir_id == expr_id {
5025                         contained_in_place = true;
5026                         break;
5027                     }
5028                 }
5029                 _ => (),
5030             }
5031             expr_id = parent_expr.hir_id;
5032         }
5033
5034         contained_in_place
5035     }
5036 }
5037
5038 pub fn check_bounds_are_used<'tcx>(tcx: TyCtxt<'tcx>, generics: &ty::Generics, ty: Ty<'tcx>) {
5039     let own_counts = generics.own_counts();
5040     debug!(
5041         "check_bounds_are_used(n_tys={}, n_cts={}, ty={:?})",
5042         own_counts.types,
5043         own_counts.consts,
5044         ty
5045     );
5046
5047     if own_counts.types == 0 {
5048         return;
5049     }
5050
5051     // Make a vector of booleans initially `false`; set to `true` when used.
5052     let mut types_used = vec![false; own_counts.types];
5053
5054     for leaf_ty in ty.walk() {
5055         if let ty::Param(ty::ParamTy { index, .. }) = leaf_ty.kind {
5056             debug!("found use of ty param num {}", index);
5057             types_used[index as usize - own_counts.lifetimes] = true;
5058         } else if let ty::Error = leaf_ty.kind {
5059             // If there is already another error, do not emit
5060             // an error for not using a type parameter.
5061             assert!(tcx.sess.has_errors());
5062             return;
5063         }
5064     }
5065
5066     let types = generics.params.iter().filter(|param| match param.kind {
5067         ty::GenericParamDefKind::Type { .. } => true,
5068         _ => false,
5069     });
5070     for (&used, param) in types_used.iter().zip(types) {
5071         if !used {
5072             let id = tcx.hir().as_local_hir_id(param.def_id).unwrap();
5073             let span = tcx.hir().span(id);
5074             struct_span_err!(tcx.sess, span, E0091, "type parameter `{}` is unused", param.name)
5075                 .span_label(span, "unused type parameter")
5076                 .emit();
5077         }
5078     }
5079 }
5080
5081 fn fatally_break_rust(sess: &Session) {
5082     let handler = sess.diagnostic();
5083     handler.span_bug_no_panic(
5084         MultiSpan::new(),
5085         "It looks like you're trying to break rust; would you like some ICE?",
5086     );
5087     handler.note_without_error("the compiler expectedly panicked. this is a feature.");
5088     handler.note_without_error(
5089         "we would appreciate a joke overview: \
5090         https://github.com/rust-lang/rust/issues/43162#issuecomment-320764675"
5091     );
5092     handler.note_without_error(&format!("rustc {} running on {}",
5093         option_env!("CFG_VERSION").unwrap_or("unknown_version"),
5094         crate::session::config::host_triple(),
5095     ));
5096 }
5097
5098 fn potentially_plural_count(count: usize, word: &str) -> String {
5099     format!("{} {}{}", count, word, pluralise!(count))
5100 }