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