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