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