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