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