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