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