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