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