]> git.lizzy.rs Git - rust.git/blob - src/librustc_typeck/check/mod.rs
Auto merge of #58508 - Zoxc:time-crate, r=oli-obk
[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(
1014         &mut self,
1015         _: intravisit::FnKind<'tcx>,
1016         _: &'tcx hir::FnDecl,
1017         _: hir::BodyId,
1018         _: Span,
1019         _: hir::HirId,
1020     ) { }
1021 }
1022
1023 /// When `check_fn` is invoked on a generator (i.e., a body that
1024 /// includes yield), it returns back some information about the yield
1025 /// points.
1026 struct GeneratorTypes<'tcx> {
1027     /// Type of value that is yielded.
1028     yield_ty: Ty<'tcx>,
1029
1030     /// Types that are captured (see `GeneratorInterior` for more).
1031     interior: Ty<'tcx>,
1032
1033     /// Indicates if the generator is movable or static (immovable).
1034     movability: hir::GeneratorMovability,
1035 }
1036
1037 /// Helper used for fns and closures. Does the grungy work of checking a function
1038 /// body and returns the function context used for that purpose, since in the case of a fn item
1039 /// there is still a bit more to do.
1040 ///
1041 /// * ...
1042 /// * inherited: other fields inherited from the enclosing fn (if any)
1043 fn check_fn<'a, 'tcx>(
1044     inherited: &'a Inherited<'a, 'tcx>,
1045     param_env: ty::ParamEnv<'tcx>,
1046     fn_sig: ty::FnSig<'tcx>,
1047     decl: &'tcx hir::FnDecl,
1048     fn_id: hir::HirId,
1049     body: &'tcx hir::Body,
1050     can_be_generator: Option<hir::GeneratorMovability>,
1051 ) -> (FnCtxt<'a, 'tcx>, Option<GeneratorTypes<'tcx>>) {
1052     let mut fn_sig = fn_sig.clone();
1053
1054     debug!("check_fn(sig={:?}, fn_id={}, param_env={:?})", fn_sig, fn_id, param_env);
1055
1056     // Create the function context.  This is either derived from scratch or,
1057     // in the case of closures, based on the outer context.
1058     let mut fcx = FnCtxt::new(inherited, param_env, body.value.hir_id);
1059     *fcx.ps.borrow_mut() = UnsafetyState::function(fn_sig.unsafety, fn_id);
1060
1061     let declared_ret_ty = fn_sig.output();
1062     fcx.require_type_is_sized(declared_ret_ty, decl.output.span(), traits::SizedReturnType);
1063     let revealed_ret_ty = fcx.instantiate_opaque_types_from_value(fn_id, &declared_ret_ty);
1064     fcx.ret_coercion = Some(RefCell::new(CoerceMany::new(revealed_ret_ty)));
1065     fn_sig = fcx.tcx.mk_fn_sig(
1066         fn_sig.inputs().iter().cloned(),
1067         revealed_ret_ty,
1068         fn_sig.c_variadic,
1069         fn_sig.unsafety,
1070         fn_sig.abi
1071     );
1072
1073     let span = body.value.span;
1074
1075     if body.is_generator && can_be_generator.is_some() {
1076         let yield_ty = fcx.next_ty_var(TypeVariableOrigin {
1077             kind: TypeVariableOriginKind::TypeInference,
1078             span,
1079         });
1080         fcx.require_type_is_sized(yield_ty, span, traits::SizedYieldType);
1081         fcx.yield_ty = Some(yield_ty);
1082     }
1083
1084     let outer_def_id = fcx.tcx.closure_base_def_id(fcx.tcx.hir().local_def_id_from_hir_id(fn_id));
1085     let outer_hir_id = fcx.tcx.hir().as_local_hir_id(outer_def_id).unwrap();
1086     GatherLocalsVisitor { fcx: &fcx, parent_id: outer_hir_id, }.visit_body(body);
1087
1088     // Add formal parameters.
1089     for (arg_ty, arg) in fn_sig.inputs().iter().zip(&body.arguments) {
1090         // Check the pattern.
1091         let binding_mode = ty::BindingMode::BindByValue(hir::Mutability::MutImmutable);
1092         fcx.check_pat_walk(&arg.pat, arg_ty, binding_mode, None);
1093
1094         // Check that argument is Sized.
1095         // The check for a non-trivial pattern is a hack to avoid duplicate warnings
1096         // for simple cases like `fn foo(x: Trait)`,
1097         // where we would error once on the parameter as a whole, and once on the binding `x`.
1098         if arg.pat.simple_ident().is_none() && !fcx.tcx.features().unsized_locals {
1099             fcx.require_type_is_sized(arg_ty, decl.output.span(), traits::SizedArgumentType);
1100         }
1101
1102         fcx.write_ty(arg.hir_id, arg_ty);
1103     }
1104
1105     inherited.tables.borrow_mut().liberated_fn_sigs_mut().insert(fn_id, fn_sig);
1106
1107     fcx.check_return_expr(&body.value);
1108
1109     // We insert the deferred_generator_interiors entry after visiting the body.
1110     // This ensures that all nested generators appear before the entry of this generator.
1111     // resolve_generator_interiors relies on this property.
1112     let gen_ty = if can_be_generator.is_some() && body.is_generator {
1113         let interior = fcx.next_ty_var(TypeVariableOrigin {
1114             kind: TypeVariableOriginKind::MiscVariable,
1115             span,
1116         });
1117         fcx.deferred_generator_interiors.borrow_mut().push((body.id(), interior));
1118         Some(GeneratorTypes {
1119             yield_ty: fcx.yield_ty.unwrap(),
1120             interior,
1121             movability: can_be_generator.unwrap(),
1122         })
1123     } else {
1124         None
1125     };
1126
1127     // Finalize the return check by taking the LUB of the return types
1128     // we saw and assigning it to the expected return type. This isn't
1129     // really expected to fail, since the coercions would have failed
1130     // earlier when trying to find a LUB.
1131     //
1132     // However, the behavior around `!` is sort of complex. In the
1133     // event that the `actual_return_ty` comes back as `!`, that
1134     // indicates that the fn either does not return or "returns" only
1135     // values of type `!`. In this case, if there is an expected
1136     // return type that is *not* `!`, that should be ok. But if the
1137     // return type is being inferred, we want to "fallback" to `!`:
1138     //
1139     //     let x = move || panic!();
1140     //
1141     // To allow for that, I am creating a type variable with diverging
1142     // fallback. This was deemed ever so slightly better than unifying
1143     // the return value with `!` because it allows for the caller to
1144     // make more assumptions about the return type (e.g., they could do
1145     //
1146     //     let y: Option<u32> = Some(x());
1147     //
1148     // which would then cause this return type to become `u32`, not
1149     // `!`).
1150     let coercion = fcx.ret_coercion.take().unwrap().into_inner();
1151     let mut actual_return_ty = coercion.complete(&fcx);
1152     if actual_return_ty.is_never() {
1153         actual_return_ty = fcx.next_diverging_ty_var(
1154             TypeVariableOrigin {
1155                 kind: TypeVariableOriginKind::DivergingFn,
1156                 span,
1157             },
1158         );
1159     }
1160     fcx.demand_suptype(span, revealed_ret_ty, actual_return_ty);
1161
1162     // Check that the main return type implements the termination trait.
1163     if let Some(term_id) = fcx.tcx.lang_items().termination() {
1164         if let Some((def_id, EntryFnType::Main)) = fcx.tcx.entry_fn(LOCAL_CRATE) {
1165             let main_id = fcx.tcx.hir().as_local_hir_id(def_id).unwrap();
1166             if main_id == fn_id {
1167                 let substs = fcx.tcx.mk_substs_trait(declared_ret_ty, &[]);
1168                 let trait_ref = ty::TraitRef::new(term_id, substs);
1169                 let return_ty_span = decl.output.span();
1170                 let cause = traits::ObligationCause::new(
1171                     return_ty_span, fn_id, ObligationCauseCode::MainFunctionType);
1172
1173                 inherited.register_predicate(
1174                     traits::Obligation::new(
1175                         cause, param_env, trait_ref.to_predicate()));
1176             }
1177         }
1178     }
1179
1180     // Check that a function marked as `#[panic_handler]` has signature `fn(&PanicInfo) -> !`
1181     if let Some(panic_impl_did) = fcx.tcx.lang_items().panic_impl() {
1182         if panic_impl_did == fcx.tcx.hir().local_def_id_from_hir_id(fn_id) {
1183             if let Some(panic_info_did) = fcx.tcx.lang_items().panic_info() {
1184                 // at this point we don't care if there are duplicate handlers or if the handler has
1185                 // the wrong signature as this value we'll be used when writing metadata and that
1186                 // only happens if compilation succeeded
1187                 fcx.tcx.sess.has_panic_handler.try_set_same(true);
1188
1189                 if declared_ret_ty.sty != ty::Never {
1190                     fcx.tcx.sess.span_err(
1191                         decl.output.span(),
1192                         "return type should be `!`",
1193                     );
1194                 }
1195
1196                 let inputs = fn_sig.inputs();
1197                 let span = fcx.tcx.hir().span_by_hir_id(fn_id);
1198                 if inputs.len() == 1 {
1199                     let arg_is_panic_info = match inputs[0].sty {
1200                         ty::Ref(region, ty, mutbl) => match ty.sty {
1201                             ty::Adt(ref adt, _) => {
1202                                 adt.did == panic_info_did &&
1203                                     mutbl == hir::Mutability::MutImmutable &&
1204                                     *region != RegionKind::ReStatic
1205                             },
1206                             _ => false,
1207                         },
1208                         _ => false,
1209                     };
1210
1211                     if !arg_is_panic_info {
1212                         fcx.tcx.sess.span_err(
1213                             decl.inputs[0].span,
1214                             "argument should be `&PanicInfo`",
1215                         );
1216                     }
1217
1218                     if let Node::Item(item) = fcx.tcx.hir().get_by_hir_id(fn_id) {
1219                         if let ItemKind::Fn(_, _, ref generics, _) = item.node {
1220                             if !generics.params.is_empty() {
1221                                 fcx.tcx.sess.span_err(
1222                                     span,
1223                                     "should have no type parameters",
1224                                 );
1225                             }
1226                         }
1227                     }
1228                 } else {
1229                     let span = fcx.tcx.sess.source_map().def_span(span);
1230                     fcx.tcx.sess.span_err(span, "function should have one argument");
1231                 }
1232             } else {
1233                 fcx.tcx.sess.err("language item required, but not found: `panic_info`");
1234             }
1235         }
1236     }
1237
1238     // Check that a function marked as `#[alloc_error_handler]` has signature `fn(Layout) -> !`
1239     if let Some(alloc_error_handler_did) = fcx.tcx.lang_items().oom() {
1240         if alloc_error_handler_did == fcx.tcx.hir().local_def_id_from_hir_id(fn_id) {
1241             if let Some(alloc_layout_did) = fcx.tcx.lang_items().alloc_layout() {
1242                 if declared_ret_ty.sty != ty::Never {
1243                     fcx.tcx.sess.span_err(
1244                         decl.output.span(),
1245                         "return type should be `!`",
1246                     );
1247                 }
1248
1249                 let inputs = fn_sig.inputs();
1250                 let span = fcx.tcx.hir().span_by_hir_id(fn_id);
1251                 if inputs.len() == 1 {
1252                     let arg_is_alloc_layout = match inputs[0].sty {
1253                         ty::Adt(ref adt, _) => {
1254                             adt.did == alloc_layout_did
1255                         },
1256                         _ => false,
1257                     };
1258
1259                     if !arg_is_alloc_layout {
1260                         fcx.tcx.sess.span_err(
1261                             decl.inputs[0].span,
1262                             "argument should be `Layout`",
1263                         );
1264                     }
1265
1266                     if let Node::Item(item) = fcx.tcx.hir().get_by_hir_id(fn_id) {
1267                         if let ItemKind::Fn(_, _, ref generics, _) = item.node {
1268                             if !generics.params.is_empty() {
1269                                 fcx.tcx.sess.span_err(
1270                                     span,
1271                                     "`#[alloc_error_handler]` function should have no type \
1272                                      parameters",
1273                                 );
1274                             }
1275                         }
1276                     }
1277                 } else {
1278                     let span = fcx.tcx.sess.source_map().def_span(span);
1279                     fcx.tcx.sess.span_err(span, "function should have one argument");
1280                 }
1281             } else {
1282                 fcx.tcx.sess.err("language item required, but not found: `alloc_layout`");
1283             }
1284         }
1285     }
1286
1287     (fcx, gen_ty)
1288 }
1289
1290 fn check_struct<'tcx>(tcx: TyCtxt<'tcx>, id: hir::HirId, span: Span) {
1291     let def_id = tcx.hir().local_def_id_from_hir_id(id);
1292     let def = tcx.adt_def(def_id);
1293     def.destructor(tcx); // force the destructor to be evaluated
1294     check_representable(tcx, span, def_id);
1295
1296     if def.repr.simd() {
1297         check_simd(tcx, span, def_id);
1298     }
1299
1300     check_transparent(tcx, span, def_id);
1301     check_packed(tcx, span, def_id);
1302 }
1303
1304 fn check_union<'tcx>(tcx: TyCtxt<'tcx>, id: hir::HirId, span: Span) {
1305     let def_id = tcx.hir().local_def_id_from_hir_id(id);
1306     let def = tcx.adt_def(def_id);
1307     def.destructor(tcx); // force the destructor to be evaluated
1308     check_representable(tcx, span, def_id);
1309     check_transparent(tcx, span, def_id);
1310     check_packed(tcx, span, def_id);
1311 }
1312
1313 fn check_opaque<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, substs: SubstsRef<'tcx>, span: Span) {
1314     if let Err(partially_expanded_type) = tcx.try_expand_impl_trait_type(def_id, substs) {
1315         let mut err = struct_span_err!(
1316             tcx.sess, span, E0720,
1317             "opaque type expands to a recursive type",
1318         );
1319         err.span_label(span, "expands to self-referential type");
1320         if let ty::Opaque(..) = partially_expanded_type.sty {
1321             err.note("type resolves to itself");
1322         } else {
1323             err.note(&format!("expanded type is `{}`", partially_expanded_type));
1324         }
1325         err.emit();
1326     }
1327 }
1328
1329 pub fn check_item_type<'tcx>(tcx: TyCtxt<'tcx>, it: &'tcx hir::Item) {
1330     debug!(
1331         "check_item_type(it.hir_id={}, it.name={})",
1332         it.hir_id,
1333         tcx.def_path_str(tcx.hir().local_def_id_from_hir_id(it.hir_id))
1334     );
1335     let _indenter = indenter();
1336     match it.node {
1337         // Consts can play a role in type-checking, so they are included here.
1338         hir::ItemKind::Static(..) => {
1339             let def_id = tcx.hir().local_def_id_from_hir_id(it.hir_id);
1340             tcx.typeck_tables_of(def_id);
1341             maybe_check_static_with_link_section(tcx, def_id, it.span);
1342         }
1343         hir::ItemKind::Const(..) => {
1344             tcx.typeck_tables_of(tcx.hir().local_def_id_from_hir_id(it.hir_id));
1345         }
1346         hir::ItemKind::Enum(ref enum_definition, _) => {
1347             check_enum(tcx, it.span, &enum_definition.variants, it.hir_id);
1348         }
1349         hir::ItemKind::Fn(..) => {} // entirely within check_item_body
1350         hir::ItemKind::Impl(.., ref impl_item_refs) => {
1351             debug!("ItemKind::Impl {} with id {}", it.ident, it.hir_id);
1352             let impl_def_id = tcx.hir().local_def_id_from_hir_id(it.hir_id);
1353             if let Some(impl_trait_ref) = tcx.impl_trait_ref(impl_def_id) {
1354                 check_impl_items_against_trait(
1355                     tcx,
1356                     it.span,
1357                     impl_def_id,
1358                     impl_trait_ref,
1359                     impl_item_refs,
1360                 );
1361                 let trait_def_id = impl_trait_ref.def_id;
1362                 check_on_unimplemented(tcx, trait_def_id, it);
1363             }
1364         }
1365         hir::ItemKind::Trait(..) => {
1366             let def_id = tcx.hir().local_def_id_from_hir_id(it.hir_id);
1367             check_on_unimplemented(tcx, def_id, it);
1368         }
1369         hir::ItemKind::Struct(..) => {
1370             check_struct(tcx, it.hir_id, it.span);
1371         }
1372         hir::ItemKind::Union(..) => {
1373             check_union(tcx, it.hir_id, it.span);
1374         }
1375         hir::ItemKind::Existential(..) => {
1376             let def_id = tcx.hir().local_def_id_from_hir_id(it.hir_id);
1377
1378             let substs = InternalSubsts::identity_for_item(tcx, def_id);
1379             check_opaque(tcx, def_id, substs, it.span);
1380         }
1381         hir::ItemKind::Ty(..) => {
1382             let def_id = tcx.hir().local_def_id_from_hir_id(it.hir_id);
1383             let pty_ty = tcx.type_of(def_id);
1384             let generics = tcx.generics_of(def_id);
1385             check_bounds_are_used(tcx, &generics, pty_ty);
1386         }
1387         hir::ItemKind::ForeignMod(ref m) => {
1388             check_abi(tcx, it.span, m.abi);
1389
1390             if m.abi == Abi::RustIntrinsic {
1391                 for item in &m.items {
1392                     intrinsic::check_intrinsic_type(tcx, item);
1393                 }
1394             } else if m.abi == Abi::PlatformIntrinsic {
1395                 for item in &m.items {
1396                     intrinsic::check_platform_intrinsic_type(tcx, item);
1397                 }
1398             } else {
1399                 for item in &m.items {
1400                     let generics = tcx.generics_of(tcx.hir().local_def_id_from_hir_id(item.hir_id));
1401                     if generics.params.len() - generics.own_counts().lifetimes != 0 {
1402                         let mut err = struct_span_err!(
1403                             tcx.sess,
1404                             item.span,
1405                             E0044,
1406                             "foreign items may not have type parameters"
1407                         );
1408                         err.span_label(item.span, "can't have type parameters");
1409                         // FIXME: once we start storing spans for type arguments, turn this into a
1410                         // suggestion.
1411                         err.help(
1412                             "use specialization instead of type parameters by replacing them \
1413                              with concrete types like `u32`",
1414                         );
1415                         err.emit();
1416                     }
1417
1418                     if let hir::ForeignItemKind::Fn(ref fn_decl, _, _) = item.node {
1419                         require_c_abi_if_c_variadic(tcx, fn_decl, m.abi, item.span);
1420                     }
1421                 }
1422             }
1423         }
1424         _ => { /* nothing to do */ }
1425     }
1426 }
1427
1428 fn maybe_check_static_with_link_section(tcx: TyCtxt<'_>, id: DefId, span: Span) {
1429     // Only restricted on wasm32 target for now
1430     if !tcx.sess.opts.target_triple.triple().starts_with("wasm32") {
1431         return
1432     }
1433
1434     // If `#[link_section]` is missing, then nothing to verify
1435     let attrs = tcx.codegen_fn_attrs(id);
1436     if attrs.link_section.is_none() {
1437         return
1438     }
1439
1440     // For the wasm32 target statics with #[link_section] are placed into custom
1441     // sections of the final output file, but this isn't link custom sections of
1442     // other executable formats. Namely we can only embed a list of bytes,
1443     // nothing with pointers to anything else or relocations. If any relocation
1444     // show up, reject them here.
1445     let instance = ty::Instance::mono(tcx, id);
1446     let cid = GlobalId {
1447         instance,
1448         promoted: None
1449     };
1450     let param_env = ty::ParamEnv::reveal_all();
1451     if let Ok(static_) = tcx.const_eval(param_env.and(cid)) {
1452         let alloc = if let ConstValue::ByRef(_, allocation) = static_.val {
1453             allocation
1454         } else {
1455             bug!("Matching on non-ByRef static")
1456         };
1457         if alloc.relocations.len() != 0 {
1458             let msg = "statics with a custom `#[link_section]` must be a \
1459                        simple list of bytes on the wasm target with no \
1460                        extra levels of indirection such as references";
1461             tcx.sess.span_err(span, msg);
1462         }
1463     }
1464 }
1465
1466 fn check_on_unimplemented<'tcx>(tcx: TyCtxt<'tcx>, trait_def_id: DefId, item: &hir::Item) {
1467     let item_def_id = tcx.hir().local_def_id_from_hir_id(item.hir_id);
1468     // an error would be reported if this fails.
1469     let _ = traits::OnUnimplementedDirective::of_item(tcx, trait_def_id, item_def_id);
1470 }
1471
1472 fn report_forbidden_specialization<'tcx>(
1473     tcx: TyCtxt<'tcx>,
1474     impl_item: &hir::ImplItem,
1475     parent_impl: DefId,
1476 ) {
1477     let mut err = struct_span_err!(
1478         tcx.sess, impl_item.span, E0520,
1479         "`{}` specializes an item from a parent `impl`, but \
1480          that item is not marked `default`",
1481         impl_item.ident);
1482     err.span_label(impl_item.span, format!("cannot specialize default item `{}`",
1483                                             impl_item.ident));
1484
1485     match tcx.span_of_impl(parent_impl) {
1486         Ok(span) => {
1487             err.span_label(span, "parent `impl` is here");
1488             err.note(&format!("to specialize, `{}` in the parent `impl` must be marked `default`",
1489                               impl_item.ident));
1490         }
1491         Err(cname) => {
1492             err.note(&format!("parent implementation is in crate `{}`", cname));
1493         }
1494     }
1495
1496     err.emit();
1497 }
1498
1499 fn check_specialization_validity<'tcx>(
1500     tcx: TyCtxt<'tcx>,
1501     trait_def: &ty::TraitDef,
1502     trait_item: &ty::AssocItem,
1503     impl_id: DefId,
1504     impl_item: &hir::ImplItem,
1505 ) {
1506     let ancestors = trait_def.ancestors(tcx, impl_id);
1507
1508     let kind = match impl_item.node {
1509         hir::ImplItemKind::Const(..) => ty::AssocKind::Const,
1510         hir::ImplItemKind::Method(..) => ty::AssocKind::Method,
1511         hir::ImplItemKind::Existential(..) => ty::AssocKind::Existential,
1512         hir::ImplItemKind::Type(_) => ty::AssocKind::Type
1513     };
1514
1515     let parent = ancestors.defs(tcx, trait_item.ident, kind, trait_def.def_id).nth(1)
1516         .map(|node_item| node_item.map(|parent| parent.defaultness));
1517
1518     if let Some(parent) = parent {
1519         if tcx.impl_item_is_final(&parent) {
1520             report_forbidden_specialization(tcx, impl_item, parent.node.def_id());
1521         }
1522     }
1523
1524 }
1525
1526 fn check_impl_items_against_trait<'tcx>(
1527     tcx: TyCtxt<'tcx>,
1528     impl_span: Span,
1529     impl_id: DefId,
1530     impl_trait_ref: ty::TraitRef<'tcx>,
1531     impl_item_refs: &[hir::ImplItemRef],
1532 ) {
1533     let impl_span = tcx.sess.source_map().def_span(impl_span);
1534
1535     // If the trait reference itself is erroneous (so the compilation is going
1536     // to fail), skip checking the items here -- the `impl_item` table in `tcx`
1537     // isn't populated for such impls.
1538     if impl_trait_ref.references_error() { return; }
1539
1540     // Locate trait definition and items
1541     let trait_def = tcx.trait_def(impl_trait_ref.def_id);
1542     let mut overridden_associated_type = None;
1543
1544     let impl_items = || impl_item_refs.iter().map(|iiref| tcx.hir().impl_item(iiref.id));
1545
1546     // Check existing impl methods to see if they are both present in trait
1547     // and compatible with trait signature
1548     for impl_item in impl_items() {
1549         let ty_impl_item = tcx.associated_item(
1550             tcx.hir().local_def_id_from_hir_id(impl_item.hir_id));
1551         let ty_trait_item = tcx.associated_items(impl_trait_ref.def_id)
1552             .find(|ac| Namespace::from(&impl_item.node) == Namespace::from(ac.kind) &&
1553                        tcx.hygienic_eq(ty_impl_item.ident, ac.ident, impl_trait_ref.def_id))
1554             .or_else(|| {
1555                 // Not compatible, but needed for the error message
1556                 tcx.associated_items(impl_trait_ref.def_id)
1557                    .find(|ac| tcx.hygienic_eq(ty_impl_item.ident, ac.ident, impl_trait_ref.def_id))
1558             });
1559
1560         // Check that impl definition matches trait definition
1561         if let Some(ty_trait_item) = ty_trait_item {
1562             match impl_item.node {
1563                 hir::ImplItemKind::Const(..) => {
1564                     // Find associated const definition.
1565                     if ty_trait_item.kind == ty::AssocKind::Const {
1566                         compare_const_impl(tcx,
1567                                            &ty_impl_item,
1568                                            impl_item.span,
1569                                            &ty_trait_item,
1570                                            impl_trait_ref);
1571                     } else {
1572                          let mut err = struct_span_err!(tcx.sess, impl_item.span, E0323,
1573                              "item `{}` is an associated const, \
1574                               which doesn't match its trait `{}`",
1575                              ty_impl_item.ident,
1576                              impl_trait_ref);
1577                          err.span_label(impl_item.span, "does not match trait");
1578                          // We can only get the spans from local trait definition
1579                          // Same for E0324 and E0325
1580                          if let Some(trait_span) = tcx.hir().span_if_local(ty_trait_item.def_id) {
1581                             err.span_label(trait_span, "item in trait");
1582                          }
1583                          err.emit()
1584                     }
1585                 }
1586                 hir::ImplItemKind::Method(..) => {
1587                     let trait_span = tcx.hir().span_if_local(ty_trait_item.def_id);
1588                     if ty_trait_item.kind == ty::AssocKind::Method {
1589                         compare_impl_method(tcx,
1590                                             &ty_impl_item,
1591                                             impl_item.span,
1592                                             &ty_trait_item,
1593                                             impl_trait_ref,
1594                                             trait_span);
1595                     } else {
1596                         let mut err = struct_span_err!(tcx.sess, impl_item.span, E0324,
1597                             "item `{}` is an associated method, \
1598                              which doesn't match its trait `{}`",
1599                             ty_impl_item.ident,
1600                             impl_trait_ref);
1601                          err.span_label(impl_item.span, "does not match trait");
1602                          if let Some(trait_span) = tcx.hir().span_if_local(ty_trait_item.def_id) {
1603                             err.span_label(trait_span, "item in trait");
1604                          }
1605                          err.emit()
1606                     }
1607                 }
1608                 hir::ImplItemKind::Existential(..) |
1609                 hir::ImplItemKind::Type(_) => {
1610                     if ty_trait_item.kind == ty::AssocKind::Type {
1611                         if ty_trait_item.defaultness.has_value() {
1612                             overridden_associated_type = Some(impl_item);
1613                         }
1614                     } else {
1615                         let mut err = struct_span_err!(tcx.sess, impl_item.span, E0325,
1616                             "item `{}` is an associated type, \
1617                              which doesn't match its trait `{}`",
1618                             ty_impl_item.ident,
1619                             impl_trait_ref);
1620                          err.span_label(impl_item.span, "does not match trait");
1621                          if let Some(trait_span) = tcx.hir().span_if_local(ty_trait_item.def_id) {
1622                             err.span_label(trait_span, "item in trait");
1623                          }
1624                          err.emit()
1625                     }
1626                 }
1627             }
1628
1629             check_specialization_validity(tcx, trait_def, &ty_trait_item, impl_id, impl_item);
1630         }
1631     }
1632
1633     // Check for missing items from trait
1634     let mut missing_items = Vec::new();
1635     let mut invalidated_items = Vec::new();
1636     let associated_type_overridden = overridden_associated_type.is_some();
1637     for trait_item in tcx.associated_items(impl_trait_ref.def_id) {
1638         let is_implemented = trait_def.ancestors(tcx, impl_id)
1639             .defs(tcx, trait_item.ident, trait_item.kind, impl_trait_ref.def_id)
1640             .next()
1641             .map(|node_item| !node_item.node.is_from_trait())
1642             .unwrap_or(false);
1643
1644         if !is_implemented && !tcx.impl_is_default(impl_id) {
1645             if !trait_item.defaultness.has_value() {
1646                 missing_items.push(trait_item);
1647             } else if associated_type_overridden {
1648                 invalidated_items.push(trait_item.ident);
1649             }
1650         }
1651     }
1652
1653     if !missing_items.is_empty() {
1654         let mut err = struct_span_err!(tcx.sess, impl_span, E0046,
1655             "not all trait items implemented, missing: `{}`",
1656             missing_items.iter()
1657                 .map(|trait_item| trait_item.ident.to_string())
1658                 .collect::<Vec<_>>().join("`, `"));
1659         err.span_label(impl_span, format!("missing `{}` in implementation",
1660                 missing_items.iter()
1661                     .map(|trait_item| trait_item.ident.to_string())
1662                     .collect::<Vec<_>>().join("`, `")));
1663         for trait_item in missing_items {
1664             if let Some(span) = tcx.hir().span_if_local(trait_item.def_id) {
1665                 err.span_label(span, format!("`{}` from trait", trait_item.ident));
1666             } else {
1667                 err.note_trait_signature(trait_item.ident.to_string(),
1668                                          trait_item.signature(tcx));
1669             }
1670         }
1671         err.emit();
1672     }
1673
1674     if !invalidated_items.is_empty() {
1675         let invalidator = overridden_associated_type.unwrap();
1676         span_err!(tcx.sess, invalidator.span, E0399,
1677                   "the following trait items need to be reimplemented \
1678                    as `{}` was overridden: `{}`",
1679                   invalidator.ident,
1680                   invalidated_items.iter()
1681                                    .map(|name| name.to_string())
1682                                    .collect::<Vec<_>>().join("`, `"))
1683     }
1684 }
1685
1686 /// Checks whether a type can be represented in memory. In particular, it
1687 /// identifies types that contain themselves without indirection through a
1688 /// pointer, which would mean their size is unbounded.
1689 fn check_representable<'tcx>(tcx: TyCtxt<'tcx>, sp: Span, item_def_id: DefId) -> bool {
1690     let rty = tcx.type_of(item_def_id);
1691
1692     // Check that it is possible to represent this type. This call identifies
1693     // (1) types that contain themselves and (2) types that contain a different
1694     // recursive type. It is only necessary to throw an error on those that
1695     // contain themselves. For case 2, there must be an inner type that will be
1696     // caught by case 1.
1697     match rty.is_representable(tcx, sp) {
1698         Representability::SelfRecursive(spans) => {
1699             let mut err = tcx.recursive_type_with_infinite_size_error(item_def_id);
1700             for span in spans {
1701                 err.span_label(span, "recursive without indirection");
1702             }
1703             err.emit();
1704             return false
1705         }
1706         Representability::Representable | Representability::ContainsRecursive => (),
1707     }
1708     return true;
1709 }
1710
1711 pub fn check_simd<'tcx>(tcx: TyCtxt<'tcx>, sp: Span, def_id: DefId) {
1712     let t = tcx.type_of(def_id);
1713     if let ty::Adt(def, substs) = t.sty {
1714         if def.is_struct() {
1715             let fields = &def.non_enum_variant().fields;
1716             if fields.is_empty() {
1717                 span_err!(tcx.sess, sp, E0075, "SIMD vector cannot be empty");
1718                 return;
1719             }
1720             let e = fields[0].ty(tcx, substs);
1721             if !fields.iter().all(|f| f.ty(tcx, substs) == e) {
1722                 struct_span_err!(tcx.sess, sp, E0076, "SIMD vector should be homogeneous")
1723                                 .span_label(sp, "SIMD elements must have the same type")
1724                                 .emit();
1725                 return;
1726             }
1727             match e.sty {
1728                 ty::Param(_) => { /* struct<T>(T, T, T, T) is ok */ }
1729                 _ if e.is_machine() => { /* struct(u8, u8, u8, u8) is ok */ }
1730                 _ => {
1731                     span_err!(tcx.sess, sp, E0077,
1732                               "SIMD vector element type should be machine type");
1733                     return;
1734                 }
1735             }
1736         }
1737     }
1738 }
1739
1740 fn check_packed<'tcx>(tcx: TyCtxt<'tcx>, sp: Span, def_id: DefId) {
1741     let repr = tcx.adt_def(def_id).repr;
1742     if repr.packed() {
1743         for attr in tcx.get_attrs(def_id).iter() {
1744             for r in attr::find_repr_attrs(&tcx.sess.parse_sess, attr) {
1745                 if let attr::ReprPacked(pack) = r {
1746                     if pack != repr.pack {
1747                         struct_span_err!(tcx.sess, sp, E0634,
1748                                          "type has conflicting packed representation hints").emit();
1749                     }
1750                 }
1751             }
1752         }
1753         if repr.align > 0 {
1754             struct_span_err!(tcx.sess, sp, E0587,
1755                              "type has conflicting packed and align representation hints").emit();
1756         }
1757         else if check_packed_inner(tcx, def_id, &mut Vec::new()) {
1758             struct_span_err!(tcx.sess, sp, E0588,
1759                 "packed type cannot transitively contain a `[repr(align)]` type").emit();
1760         }
1761     }
1762 }
1763
1764 fn check_packed_inner<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, stack: &mut Vec<DefId>) -> bool {
1765     let t = tcx.type_of(def_id);
1766     if stack.contains(&def_id) {
1767         debug!("check_packed_inner: {:?} is recursive", t);
1768         return false;
1769     }
1770     if let ty::Adt(def, substs) = t.sty {
1771         if def.is_struct() || def.is_union() {
1772             if tcx.adt_def(def.did).repr.align > 0 {
1773                 return true;
1774             }
1775             // push struct def_id before checking fields
1776             stack.push(def_id);
1777             for field in &def.non_enum_variant().fields {
1778                 let f = field.ty(tcx, substs);
1779                 if let ty::Adt(def, _) = f.sty {
1780                     if check_packed_inner(tcx, def.did, stack) {
1781                         return true;
1782                     }
1783                 }
1784             }
1785             // only need to pop if not early out
1786             stack.pop();
1787         }
1788     }
1789     false
1790 }
1791
1792 fn check_transparent<'tcx>(tcx: TyCtxt<'tcx>, sp: Span, def_id: DefId) {
1793     let adt = tcx.adt_def(def_id);
1794     if !adt.repr.transparent() {
1795         return;
1796     }
1797
1798     if adt.is_enum() {
1799         if !tcx.features().transparent_enums {
1800             emit_feature_err(&tcx.sess.parse_sess,
1801                              sym::transparent_enums,
1802                              sp,
1803                              GateIssue::Language,
1804                              "transparent enums are unstable");
1805         }
1806         if adt.variants.len() != 1 {
1807             let variant_spans: Vec<_> = adt.variants.iter().map(|variant| {
1808                 tcx.hir().span_if_local(variant.def_id).unwrap()
1809             }).collect();
1810             let mut err = struct_span_err!(tcx.sess, sp, E0731,
1811                             "transparent enum needs exactly one variant, but has {}",
1812                             adt.variants.len());
1813             if !variant_spans.is_empty() {
1814                 err.span_note(variant_spans, &format!("the following variants exist on `{}`",
1815                                                       tcx.def_path_str(def_id)));
1816             }
1817             err.emit();
1818             if adt.variants.is_empty() {
1819                 // Don't bother checking the fields. No variants (and thus no fields) exist.
1820                 return;
1821             }
1822         }
1823     }
1824
1825     if adt.is_union() && !tcx.features().transparent_unions {
1826         emit_feature_err(&tcx.sess.parse_sess,
1827                          sym::transparent_unions,
1828                          sp,
1829                          GateIssue::Language,
1830                          "transparent unions are unstable");
1831     }
1832
1833     // For each field, figure out if it's known to be a ZST and align(1)
1834     let field_infos = adt.all_fields().map(|field| {
1835         let ty = field.ty(tcx, InternalSubsts::identity_for_item(tcx, field.did));
1836         let param_env = tcx.param_env(field.did);
1837         let layout = tcx.layout_of(param_env.and(ty));
1838         // We are currently checking the type this field came from, so it must be local
1839         let span = tcx.hir().span_if_local(field.did).unwrap();
1840         let zst = layout.map(|layout| layout.is_zst()).unwrap_or(false);
1841         let align1 = layout.map(|layout| layout.align.abi.bytes() == 1).unwrap_or(false);
1842         (span, zst, align1)
1843     });
1844
1845     let non_zst_fields = field_infos.clone().filter(|(_span, zst, _align1)| !*zst);
1846     let non_zst_count = non_zst_fields.clone().count();
1847     if non_zst_count != 1 {
1848         let field_spans: Vec<_> = non_zst_fields.map(|(span, _zst, _align1)| span).collect();
1849
1850         let mut err = struct_span_err!(tcx.sess, sp, E0690,
1851                          "{}transparent {} needs exactly one non-zero-sized field, but has {}",
1852                          if adt.is_enum() { "the variant of a " } else { "" },
1853                          adt.descr(),
1854                          non_zst_count);
1855         if !field_spans.is_empty() {
1856             err.span_note(field_spans,
1857                           &format!("the following non-zero-sized fields exist on `{}`:",
1858                                    tcx.def_path_str(def_id)));
1859         }
1860         err.emit();
1861     }
1862     for (span, zst, align1) in field_infos {
1863         if zst && !align1 {
1864             span_err!(tcx.sess, span, E0691,
1865                       "zero-sized field in transparent {} has alignment larger than 1",
1866                       adt.descr());
1867         }
1868     }
1869 }
1870
1871 #[allow(trivial_numeric_casts)]
1872 pub fn check_enum<'tcx>(tcx: TyCtxt<'tcx>, sp: Span, vs: &'tcx [hir::Variant], id: hir::HirId) {
1873     let def_id = tcx.hir().local_def_id_from_hir_id(id);
1874     let def = tcx.adt_def(def_id);
1875     def.destructor(tcx); // force the destructor to be evaluated
1876
1877     if vs.is_empty() {
1878         let attributes = tcx.get_attrs(def_id);
1879         if let Some(attr) = attr::find_by_name(&attributes, sym::repr) {
1880             struct_span_err!(
1881                 tcx.sess, attr.span, E0084,
1882                 "unsupported representation for zero-variant enum")
1883                 .span_label(sp, "zero-variant enum")
1884                 .emit();
1885         }
1886     }
1887
1888     let repr_type_ty = def.repr.discr_type().to_ty(tcx);
1889     if repr_type_ty == tcx.types.i128 || repr_type_ty == tcx.types.u128 {
1890         if !tcx.features().repr128 {
1891             emit_feature_err(&tcx.sess.parse_sess,
1892                              sym::repr128,
1893                              sp,
1894                              GateIssue::Language,
1895                              "repr with 128-bit type is unstable");
1896         }
1897     }
1898
1899     for v in vs {
1900         if let Some(ref e) = v.node.disr_expr {
1901             tcx.typeck_tables_of(tcx.hir().local_def_id_from_hir_id(e.hir_id));
1902         }
1903     }
1904
1905     let mut disr_vals: Vec<Discr<'tcx>> = Vec::with_capacity(vs.len());
1906     for ((_, discr), v) in def.discriminants(tcx).zip(vs) {
1907         // Check for duplicate discriminant values
1908         if let Some(i) = disr_vals.iter().position(|&x| x.val == discr.val) {
1909             let variant_did = def.variants[VariantIdx::new(i)].def_id;
1910             let variant_i_hir_id = tcx.hir().as_local_hir_id(variant_did).unwrap();
1911             let variant_i = tcx.hir().expect_variant(variant_i_hir_id);
1912             let i_span = match variant_i.node.disr_expr {
1913                 Some(ref expr) => tcx.hir().span_by_hir_id(expr.hir_id),
1914                 None => tcx.hir().span_by_hir_id(variant_i_hir_id)
1915             };
1916             let span = match v.node.disr_expr {
1917                 Some(ref expr) => tcx.hir().span_by_hir_id(expr.hir_id),
1918                 None => v.span
1919             };
1920             struct_span_err!(tcx.sess, span, E0081,
1921                              "discriminant value `{}` already exists", disr_vals[i])
1922                 .span_label(i_span, format!("first use of `{}`", disr_vals[i]))
1923                 .span_label(span , format!("enum already has `{}`", disr_vals[i]))
1924                 .emit();
1925         }
1926         disr_vals.push(discr);
1927     }
1928
1929     check_representable(tcx, sp, def_id);
1930     check_transparent(tcx, sp, def_id);
1931 }
1932
1933 fn report_unexpected_variant_res<'tcx>(tcx: TyCtxt<'tcx>, res: Res, span: Span, qpath: &QPath) {
1934     span_err!(tcx.sess, span, E0533,
1935               "expected unit struct/variant or constant, found {} `{}`",
1936               res.descr(),
1937               hir::print::to_string(tcx.hir(), |s| s.print_qpath(qpath, false)));
1938 }
1939
1940 impl<'a, 'tcx> AstConv<'tcx> for FnCtxt<'a, 'tcx> {
1941     fn tcx<'b>(&'b self) -> TyCtxt<'tcx> {
1942         self.tcx
1943         }
1944
1945     fn get_type_parameter_bounds(&self, _: Span, def_id: DefId)
1946                                  -> &'tcx ty::GenericPredicates<'tcx>
1947     {
1948         let tcx = self.tcx;
1949         let hir_id = tcx.hir().as_local_hir_id(def_id).unwrap();
1950         let item_id = tcx.hir().ty_param_owner(hir_id);
1951         let item_def_id = tcx.hir().local_def_id_from_hir_id(item_id);
1952         let generics = tcx.generics_of(item_def_id);
1953         let index = generics.param_def_id_to_index[&def_id];
1954         tcx.arena.alloc(ty::GenericPredicates {
1955             parent: None,
1956             predicates: self.param_env.caller_bounds.iter().filter_map(|&predicate| {
1957                 match predicate {
1958                     ty::Predicate::Trait(ref data)
1959                     if data.skip_binder().self_ty().is_param(index) => {
1960                         // HACK(eddyb) should get the original `Span`.
1961                         let span = tcx.def_span(def_id);
1962                         Some((predicate, span))
1963                     }
1964                     _ => None
1965                 }
1966             }).collect()
1967         })
1968     }
1969
1970     fn re_infer(
1971         &self,
1972         def: Option<&ty::GenericParamDef>,
1973         span: Span,
1974     ) -> Option<ty::Region<'tcx>> {
1975         let v = match def {
1976             Some(def) => infer::EarlyBoundRegion(span, def.name),
1977             None => infer::MiscVariable(span)
1978         };
1979         Some(self.next_region_var(v))
1980     }
1981
1982     fn ty_infer(&self, param: Option<&ty::GenericParamDef>, span: Span) -> Ty<'tcx> {
1983         if let Some(param) = param {
1984             if let UnpackedKind::Type(ty) = self.var_for_def(span, param).unpack() {
1985                 return ty;
1986             }
1987             unreachable!()
1988         } else {
1989             self.next_ty_var(TypeVariableOrigin {
1990                 kind: TypeVariableOriginKind::TypeInference,
1991                 span,
1992             })
1993         }
1994     }
1995
1996     fn ct_infer(
1997         &self,
1998         ty: Ty<'tcx>,
1999         param: Option<&ty::GenericParamDef>,
2000         span: Span,
2001     ) -> &'tcx Const<'tcx> {
2002         if let Some(param) = param {
2003             if let UnpackedKind::Const(ct) = self.var_for_def(span, param).unpack() {
2004                 return ct;
2005             }
2006             unreachable!()
2007         } else {
2008             self.next_const_var(ty, ConstVariableOrigin {
2009                 kind: ConstVariableOriginKind::ConstInference,
2010                 span,
2011             })
2012         }
2013     }
2014
2015     fn projected_ty_from_poly_trait_ref(&self,
2016                                         span: Span,
2017                                         item_def_id: DefId,
2018                                         poly_trait_ref: ty::PolyTraitRef<'tcx>)
2019                                         -> Ty<'tcx>
2020     {
2021         let (trait_ref, _) = self.replace_bound_vars_with_fresh_vars(
2022             span,
2023             infer::LateBoundRegionConversionTime::AssocTypeProjection(item_def_id),
2024             &poly_trait_ref
2025         );
2026
2027         self.tcx().mk_projection(item_def_id, trait_ref.substs)
2028     }
2029
2030     fn normalize_ty(&self, span: Span, ty: Ty<'tcx>) -> Ty<'tcx> {
2031         if ty.has_escaping_bound_vars() {
2032             ty // FIXME: normalization and escaping regions
2033         } else {
2034             self.normalize_associated_types_in(span, &ty)
2035         }
2036     }
2037
2038     fn set_tainted_by_errors(&self) {
2039         self.infcx.set_tainted_by_errors()
2040     }
2041
2042     fn record_ty(&self, hir_id: hir::HirId, ty: Ty<'tcx>, _span: Span) {
2043         self.write_ty(hir_id, ty)
2044     }
2045 }
2046
2047 /// Controls whether the arguments are tupled. This is used for the call
2048 /// operator.
2049 ///
2050 /// Tupling means that all call-side arguments are packed into a tuple and
2051 /// passed as a single parameter. For example, if tupling is enabled, this
2052 /// function:
2053 ///
2054 ///     fn f(x: (isize, isize))
2055 ///
2056 /// Can be called as:
2057 ///
2058 ///     f(1, 2);
2059 ///
2060 /// Instead of:
2061 ///
2062 ///     f((1, 2));
2063 #[derive(Clone, Eq, PartialEq)]
2064 enum TupleArgumentsFlag {
2065     DontTupleArguments,
2066     TupleArguments,
2067 }
2068
2069 impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
2070     pub fn new(
2071         inh: &'a Inherited<'a, 'tcx>,
2072         param_env: ty::ParamEnv<'tcx>,
2073         body_id: hir::HirId,
2074     ) -> FnCtxt<'a, 'tcx> {
2075         FnCtxt {
2076             body_id,
2077             param_env,
2078             err_count_on_creation: inh.tcx.sess.err_count(),
2079             ret_coercion: None,
2080             ret_coercion_span: RefCell::new(None),
2081             yield_ty: None,
2082             ps: RefCell::new(UnsafetyState::function(hir::Unsafety::Normal,
2083                                                      hir::CRATE_HIR_ID)),
2084             diverges: Cell::new(Diverges::Maybe),
2085             has_errors: Cell::new(false),
2086             enclosing_breakables: RefCell::new(EnclosingBreakables {
2087                 stack: Vec::new(),
2088                 by_id: Default::default(),
2089             }),
2090             inh,
2091         }
2092     }
2093
2094     pub fn sess(&self) -> &Session {
2095         &self.tcx.sess
2096     }
2097
2098     pub fn err_count_since_creation(&self) -> usize {
2099         self.tcx.sess.err_count() - self.err_count_on_creation
2100     }
2101
2102     /// Produces warning on the given node, if the current point in the
2103     /// function is unreachable, and there hasn't been another warning.
2104     fn warn_if_unreachable(&self, id: hir::HirId, span: Span, kind: &str) {
2105         if self.diverges.get() == Diverges::Always &&
2106             // If span arose from a desugaring of `if` then it is the condition itself,
2107             // which diverges, that we are about to lint on. This gives suboptimal diagnostics
2108             // and so we stop here and allow the block of the `if`-expression to be linted instead.
2109             !span.is_compiler_desugaring(CompilerDesugaringKind::IfTemporary) {
2110             self.diverges.set(Diverges::WarnedAlways);
2111
2112             debug!("warn_if_unreachable: id={:?} span={:?} kind={}", id, span, kind);
2113
2114             let msg = format!("unreachable {}", kind);
2115             self.tcx().lint_hir(lint::builtin::UNREACHABLE_CODE, id, span, &msg);
2116         }
2117     }
2118
2119     pub fn cause(&self,
2120                  span: Span,
2121                  code: ObligationCauseCode<'tcx>)
2122                  -> ObligationCause<'tcx> {
2123         ObligationCause::new(span, self.body_id, code)
2124     }
2125
2126     pub fn misc(&self, span: Span) -> ObligationCause<'tcx> {
2127         self.cause(span, ObligationCauseCode::MiscObligation)
2128     }
2129
2130     /// Resolves type variables in `ty` if possible. Unlike the infcx
2131     /// version (resolve_vars_if_possible), this version will
2132     /// also select obligations if it seems useful, in an effort
2133     /// to get more type information.
2134     fn resolve_type_vars_with_obligations(&self, mut ty: Ty<'tcx>) -> Ty<'tcx> {
2135         debug!("resolve_type_vars_with_obligations(ty={:?})", ty);
2136
2137         // No Infer()? Nothing needs doing.
2138         if !ty.has_infer_types() {
2139             debug!("resolve_type_vars_with_obligations: ty={:?}", ty);
2140             return ty;
2141         }
2142
2143         // If `ty` is a type variable, see whether we already know what it is.
2144         ty = self.resolve_vars_if_possible(&ty);
2145         if !ty.has_infer_types() {
2146             debug!("resolve_type_vars_with_obligations: ty={:?}", ty);
2147             return ty;
2148         }
2149
2150         // If not, try resolving pending obligations as much as
2151         // possible. This can help substantially when there are
2152         // indirect dependencies that don't seem worth tracking
2153         // precisely.
2154         self.select_obligations_where_possible(false);
2155         ty = self.resolve_vars_if_possible(&ty);
2156
2157         debug!("resolve_type_vars_with_obligations: ty={:?}", ty);
2158         ty
2159     }
2160
2161     fn record_deferred_call_resolution(
2162         &self,
2163         closure_def_id: DefId,
2164         r: DeferredCallResolution<'tcx>,
2165     ) {
2166         let mut deferred_call_resolutions = self.deferred_call_resolutions.borrow_mut();
2167         deferred_call_resolutions.entry(closure_def_id).or_default().push(r);
2168     }
2169
2170     fn remove_deferred_call_resolutions(
2171         &self,
2172         closure_def_id: DefId,
2173     ) -> Vec<DeferredCallResolution<'tcx>> {
2174         let mut deferred_call_resolutions = self.deferred_call_resolutions.borrow_mut();
2175         deferred_call_resolutions.remove(&closure_def_id).unwrap_or(vec![])
2176     }
2177
2178     pub fn tag(&self) -> String {
2179         format!("{:p}", self)
2180     }
2181
2182     pub fn local_ty(&self, span: Span, nid: hir::HirId) -> LocalTy<'tcx> {
2183         self.locals.borrow().get(&nid).cloned().unwrap_or_else(||
2184             span_bug!(span, "no type for local variable {}",
2185                       self.tcx.hir().hir_to_string(nid))
2186         )
2187     }
2188
2189     #[inline]
2190     pub fn write_ty(&self, id: hir::HirId, ty: Ty<'tcx>) {
2191         debug!("write_ty({:?}, {:?}) in fcx {}",
2192                id, self.resolve_vars_if_possible(&ty), self.tag());
2193         self.tables.borrow_mut().node_types_mut().insert(id, ty);
2194
2195         if ty.references_error() {
2196             self.has_errors.set(true);
2197             self.set_tainted_by_errors();
2198         }
2199     }
2200
2201     pub fn write_field_index(&self, hir_id: hir::HirId, index: usize) {
2202         self.tables.borrow_mut().field_indices_mut().insert(hir_id, index);
2203     }
2204
2205     fn write_resolution(&self, hir_id: hir::HirId, r: Result<(DefKind, DefId), ErrorReported>) {
2206         self.tables.borrow_mut().type_dependent_defs_mut().insert(hir_id, r);
2207     }
2208
2209     pub fn write_method_call(&self,
2210                              hir_id: hir::HirId,
2211                              method: MethodCallee<'tcx>) {
2212         debug!("write_method_call(hir_id={:?}, method={:?})", hir_id, method);
2213         self.write_resolution(hir_id, Ok((DefKind::Method, method.def_id)));
2214         self.write_substs(hir_id, method.substs);
2215
2216         // When the method is confirmed, the `method.substs` includes
2217         // parameters from not just the method, but also the impl of
2218         // the method -- in particular, the `Self` type will be fully
2219         // resolved. However, those are not something that the "user
2220         // specified" -- i.e., those types come from the inferred type
2221         // of the receiver, not something the user wrote. So when we
2222         // create the user-substs, we want to replace those earlier
2223         // types with just the types that the user actually wrote --
2224         // that is, those that appear on the *method itself*.
2225         //
2226         // As an example, if the user wrote something like
2227         // `foo.bar::<u32>(...)` -- the `Self` type here will be the
2228         // type of `foo` (possibly adjusted), but we don't want to
2229         // include that. We want just the `[_, u32]` part.
2230         if !method.substs.is_noop() {
2231             let method_generics = self.tcx.generics_of(method.def_id);
2232             if !method_generics.params.is_empty() {
2233                 let user_type_annotation = self.infcx.probe(|_| {
2234                     let user_substs = UserSubsts {
2235                         substs: InternalSubsts::for_item(self.tcx, method.def_id, |param, _| {
2236                             let i = param.index as usize;
2237                             if i < method_generics.parent_count {
2238                                 self.infcx.var_for_def(DUMMY_SP, param)
2239                             } else {
2240                                 method.substs[i]
2241                             }
2242                         }),
2243                         user_self_ty: None, // not relevant here
2244                     };
2245
2246                     self.infcx.canonicalize_user_type_annotation(&UserType::TypeOf(
2247                         method.def_id,
2248                         user_substs,
2249                     ))
2250                 });
2251
2252                 debug!("write_method_call: user_type_annotation={:?}", user_type_annotation);
2253                 self.write_user_type_annotation(hir_id, user_type_annotation);
2254             }
2255         }
2256     }
2257
2258     pub fn write_substs(&self, node_id: hir::HirId, substs: SubstsRef<'tcx>) {
2259         if !substs.is_noop() {
2260             debug!("write_substs({:?}, {:?}) in fcx {}",
2261                    node_id,
2262                    substs,
2263                    self.tag());
2264
2265             self.tables.borrow_mut().node_substs_mut().insert(node_id, substs);
2266         }
2267     }
2268
2269     /// Given the substs that we just converted from the HIR, try to
2270     /// canonicalize them and store them as user-given substitutions
2271     /// (i.e., substitutions that must be respected by the NLL check).
2272     ///
2273     /// This should be invoked **before any unifications have
2274     /// occurred**, so that annotations like `Vec<_>` are preserved
2275     /// properly.
2276     pub fn write_user_type_annotation_from_substs(
2277         &self,
2278         hir_id: hir::HirId,
2279         def_id: DefId,
2280         substs: SubstsRef<'tcx>,
2281         user_self_ty: Option<UserSelfTy<'tcx>>,
2282     ) {
2283         debug!(
2284             "write_user_type_annotation_from_substs: hir_id={:?} def_id={:?} substs={:?} \
2285              user_self_ty={:?} in fcx {}",
2286             hir_id, def_id, substs, user_self_ty, self.tag(),
2287         );
2288
2289         if Self::can_contain_user_lifetime_bounds((substs, user_self_ty)) {
2290             let canonicalized = self.infcx.canonicalize_user_type_annotation(
2291                 &UserType::TypeOf(def_id, UserSubsts {
2292                     substs,
2293                     user_self_ty,
2294                 })
2295             );
2296             debug!("write_user_type_annotation_from_substs: canonicalized={:?}", canonicalized);
2297             self.write_user_type_annotation(hir_id, canonicalized);
2298         }
2299     }
2300
2301     pub fn write_user_type_annotation(
2302         &self,
2303         hir_id: hir::HirId,
2304         canonical_user_type_annotation: CanonicalUserType<'tcx>,
2305     ) {
2306         debug!(
2307             "write_user_type_annotation: hir_id={:?} canonical_user_type_annotation={:?} tag={}",
2308             hir_id, canonical_user_type_annotation, self.tag(),
2309         );
2310
2311         if !canonical_user_type_annotation.is_identity() {
2312             self.tables.borrow_mut().user_provided_types_mut().insert(
2313                 hir_id, canonical_user_type_annotation
2314             );
2315         } else {
2316             debug!("write_user_type_annotation: skipping identity substs");
2317         }
2318     }
2319
2320     pub fn apply_adjustments(&self, expr: &hir::Expr, adj: Vec<Adjustment<'tcx>>) {
2321         debug!("apply_adjustments(expr={:?}, adj={:?})", expr, adj);
2322
2323         if adj.is_empty() {
2324             return;
2325         }
2326
2327         match self.tables.borrow_mut().adjustments_mut().entry(expr.hir_id) {
2328             Entry::Vacant(entry) => { entry.insert(adj); },
2329             Entry::Occupied(mut entry) => {
2330                 debug!(" - composing on top of {:?}", entry.get());
2331                 match (&entry.get()[..], &adj[..]) {
2332                     // Applying any adjustment on top of a NeverToAny
2333                     // is a valid NeverToAny adjustment, because it can't
2334                     // be reached.
2335                     (&[Adjustment { kind: Adjust::NeverToAny, .. }], _) => return,
2336                     (&[
2337                         Adjustment { kind: Adjust::Deref(_), .. },
2338                         Adjustment { kind: Adjust::Borrow(AutoBorrow::Ref(..)), .. },
2339                     ], &[
2340                         Adjustment { kind: Adjust::Deref(_), .. },
2341                         .. // Any following adjustments are allowed.
2342                     ]) => {
2343                         // A reborrow has no effect before a dereference.
2344                     }
2345                     // FIXME: currently we never try to compose autoderefs
2346                     // and ReifyFnPointer/UnsafeFnPointer, but we could.
2347                     _ =>
2348                         bug!("while adjusting {:?}, can't compose {:?} and {:?}",
2349                              expr, entry.get(), adj)
2350                 };
2351                 *entry.get_mut() = adj;
2352             }
2353         }
2354     }
2355
2356     /// Basically whenever we are converting from a type scheme into
2357     /// the fn body space, we always want to normalize associated
2358     /// types as well. This function combines the two.
2359     fn instantiate_type_scheme<T>(&self,
2360                                   span: Span,
2361                                   substs: SubstsRef<'tcx>,
2362                                   value: &T)
2363                                   -> T
2364         where T : TypeFoldable<'tcx>
2365     {
2366         let value = value.subst(self.tcx, substs);
2367         let result = self.normalize_associated_types_in(span, &value);
2368         debug!("instantiate_type_scheme(value={:?}, substs={:?}) = {:?}",
2369                value,
2370                substs,
2371                result);
2372         result
2373     }
2374
2375     /// As `instantiate_type_scheme`, but for the bounds found in a
2376     /// generic type scheme.
2377     fn instantiate_bounds(&self, span: Span, def_id: DefId, substs: SubstsRef<'tcx>)
2378                           -> ty::InstantiatedPredicates<'tcx> {
2379         let bounds = self.tcx.predicates_of(def_id);
2380         let result = bounds.instantiate(self.tcx, substs);
2381         let result = self.normalize_associated_types_in(span, &result);
2382         debug!("instantiate_bounds(bounds={:?}, substs={:?}) = {:?}",
2383                bounds,
2384                substs,
2385                result);
2386         result
2387     }
2388
2389     /// Replaces the opaque types from the given value with type variables,
2390     /// and records the `OpaqueTypeMap` for later use during writeback. See
2391     /// `InferCtxt::instantiate_opaque_types` for more details.
2392     fn instantiate_opaque_types_from_value<T: TypeFoldable<'tcx>>(
2393         &self,
2394         parent_id: hir::HirId,
2395         value: &T,
2396     ) -> T {
2397         let parent_def_id = self.tcx.hir().local_def_id_from_hir_id(parent_id);
2398         debug!("instantiate_opaque_types_from_value(parent_def_id={:?}, value={:?})",
2399                parent_def_id,
2400                value);
2401
2402         let (value, opaque_type_map) = self.register_infer_ok_obligations(
2403             self.instantiate_opaque_types(
2404                 parent_def_id,
2405                 self.body_id,
2406                 self.param_env,
2407                 value,
2408             )
2409         );
2410
2411         let mut opaque_types = self.opaque_types.borrow_mut();
2412         for (ty, decl) in opaque_type_map {
2413             let old_value = opaque_types.insert(ty, decl);
2414             assert!(old_value.is_none(), "instantiated twice: {:?}/{:?}", ty, decl);
2415         }
2416
2417         value
2418     }
2419
2420     fn normalize_associated_types_in<T>(&self, span: Span, value: &T) -> T
2421         where T : TypeFoldable<'tcx>
2422     {
2423         self.inh.normalize_associated_types_in(span, self.body_id, self.param_env, value)
2424     }
2425
2426     fn normalize_associated_types_in_as_infer_ok<T>(&self, span: Span, value: &T)
2427                                                     -> InferOk<'tcx, T>
2428         where T : TypeFoldable<'tcx>
2429     {
2430         self.inh.partially_normalize_associated_types_in(span,
2431                                                          self.body_id,
2432                                                          self.param_env,
2433                                                          value)
2434     }
2435
2436     pub fn require_type_meets(&self,
2437                               ty: Ty<'tcx>,
2438                               span: Span,
2439                               code: traits::ObligationCauseCode<'tcx>,
2440                               def_id: DefId)
2441     {
2442         self.register_bound(
2443             ty,
2444             def_id,
2445             traits::ObligationCause::new(span, self.body_id, code));
2446     }
2447
2448     pub fn require_type_is_sized(&self,
2449                                  ty: Ty<'tcx>,
2450                                  span: Span,
2451                                  code: traits::ObligationCauseCode<'tcx>)
2452     {
2453         let lang_item = self.tcx.require_lang_item(lang_items::SizedTraitLangItem);
2454         self.require_type_meets(ty, span, code, lang_item);
2455     }
2456
2457     pub fn require_type_is_sized_deferred(&self,
2458                                           ty: Ty<'tcx>,
2459                                           span: Span,
2460                                           code: traits::ObligationCauseCode<'tcx>)
2461     {
2462         self.deferred_sized_obligations.borrow_mut().push((ty, span, code));
2463     }
2464
2465     pub fn register_bound(&self,
2466                           ty: Ty<'tcx>,
2467                           def_id: DefId,
2468                           cause: traits::ObligationCause<'tcx>)
2469     {
2470         self.fulfillment_cx.borrow_mut()
2471                            .register_bound(self, self.param_env, ty, def_id, cause);
2472     }
2473
2474     pub fn to_ty(&self, ast_t: &hir::Ty) -> Ty<'tcx> {
2475         let t = AstConv::ast_ty_to_ty(self, ast_t);
2476         self.register_wf_obligation(t, ast_t.span, traits::MiscObligation);
2477         t
2478     }
2479
2480     pub fn to_ty_saving_user_provided_ty(&self, ast_ty: &hir::Ty) -> Ty<'tcx> {
2481         let ty = self.to_ty(ast_ty);
2482         debug!("to_ty_saving_user_provided_ty: ty={:?}", ty);
2483
2484         if Self::can_contain_user_lifetime_bounds(ty) {
2485             let c_ty = self.infcx.canonicalize_response(&UserType::Ty(ty));
2486             debug!("to_ty_saving_user_provided_ty: c_ty={:?}", c_ty);
2487             self.tables.borrow_mut().user_provided_types_mut().insert(ast_ty.hir_id, c_ty);
2488         }
2489
2490         ty
2491     }
2492
2493     /// Returns the `DefId` of the constant parameter that the provided expression is a path to.
2494     pub fn const_param_def_id(&self, hir_c: &hir::AnonConst) -> Option<DefId> {
2495         AstConv::const_param_def_id(self, &self.tcx.hir().body(hir_c.body).value)
2496     }
2497
2498     pub fn to_const(&self, ast_c: &hir::AnonConst, ty: Ty<'tcx>) -> &'tcx ty::Const<'tcx> {
2499         AstConv::ast_const_to_const(self, ast_c, ty)
2500     }
2501
2502     // If the type given by the user has free regions, save it for later, since
2503     // NLL would like to enforce those. Also pass in types that involve
2504     // projections, since those can resolve to `'static` bounds (modulo #54940,
2505     // which hopefully will be fixed by the time you see this comment, dear
2506     // reader, although I have my doubts). Also pass in types with inference
2507     // types, because they may be repeated. Other sorts of things are already
2508     // sufficiently enforced with erased regions. =)
2509     fn can_contain_user_lifetime_bounds<T>(t: T) -> bool
2510     where
2511         T: TypeFoldable<'tcx>
2512     {
2513         t.has_free_regions() || t.has_projections() || t.has_infer_types()
2514     }
2515
2516     pub fn node_ty(&self, id: hir::HirId) -> Ty<'tcx> {
2517         match self.tables.borrow().node_types().get(id) {
2518             Some(&t) => t,
2519             None if self.is_tainted_by_errors() => self.tcx.types.err,
2520             None => {
2521                 let node_id = self.tcx.hir().hir_to_node_id(id);
2522                 bug!("no type for node {}: {} in fcx {}",
2523                      node_id, self.tcx.hir().node_to_string(node_id),
2524                      self.tag());
2525             }
2526         }
2527     }
2528
2529     /// Registers an obligation for checking later, during regionck, that the type `ty` must
2530     /// outlive the region `r`.
2531     pub fn register_wf_obligation(&self,
2532                                   ty: Ty<'tcx>,
2533                                   span: Span,
2534                                   code: traits::ObligationCauseCode<'tcx>)
2535     {
2536         // WF obligations never themselves fail, so no real need to give a detailed cause:
2537         let cause = traits::ObligationCause::new(span, self.body_id, code);
2538         self.register_predicate(traits::Obligation::new(cause,
2539                                                         self.param_env,
2540                                                         ty::Predicate::WellFormed(ty)));
2541     }
2542
2543     /// Registers obligations that all types appearing in `substs` are well-formed.
2544     pub fn add_wf_bounds(&self, substs: SubstsRef<'tcx>, expr: &hir::Expr) {
2545         for ty in substs.types() {
2546             self.register_wf_obligation(ty, expr.span, traits::MiscObligation);
2547         }
2548     }
2549
2550     /// Given a fully substituted set of bounds (`generic_bounds`), and the values with which each
2551     /// type/region parameter was instantiated (`substs`), creates and registers suitable
2552     /// trait/region obligations.
2553     ///
2554     /// For example, if there is a function:
2555     ///
2556     /// ```
2557     /// fn foo<'a,T:'a>(...)
2558     /// ```
2559     ///
2560     /// and a reference:
2561     ///
2562     /// ```
2563     /// let f = foo;
2564     /// ```
2565     ///
2566     /// Then we will create a fresh region variable `'$0` and a fresh type variable `$1` for `'a`
2567     /// and `T`. This routine will add a region obligation `$1:'$0` and register it locally.
2568     pub fn add_obligations_for_parameters(&self,
2569                                           cause: traits::ObligationCause<'tcx>,
2570                                           predicates: &ty::InstantiatedPredicates<'tcx>)
2571     {
2572         assert!(!predicates.has_escaping_bound_vars());
2573
2574         debug!("add_obligations_for_parameters(predicates={:?})",
2575                predicates);
2576
2577         for obligation in traits::predicates_for_generics(cause, self.param_env, predicates) {
2578             self.register_predicate(obligation);
2579         }
2580     }
2581
2582     // FIXME(arielb1): use this instead of field.ty everywhere
2583     // Only for fields! Returns <none> for methods>
2584     // Indifferent to privacy flags
2585     pub fn field_ty(&self,
2586                     span: Span,
2587                     field: &'tcx ty::FieldDef,
2588                     substs: SubstsRef<'tcx>)
2589                     -> Ty<'tcx>
2590     {
2591         self.normalize_associated_types_in(span, &field.ty(self.tcx, substs))
2592     }
2593
2594     fn check_casts(&self) {
2595         let mut deferred_cast_checks = self.deferred_cast_checks.borrow_mut();
2596         for cast in deferred_cast_checks.drain(..) {
2597             cast.check(self);
2598         }
2599     }
2600
2601     fn resolve_generator_interiors(&self, def_id: DefId) {
2602         let mut generators = self.deferred_generator_interiors.borrow_mut();
2603         for (body_id, interior) in generators.drain(..) {
2604             self.select_obligations_where_possible(false);
2605             generator_interior::resolve_interior(self, def_id, body_id, interior);
2606         }
2607     }
2608
2609     // Tries to apply a fallback to `ty` if it is an unsolved variable.
2610     // Non-numerics get replaced with ! or () (depending on whether
2611     // feature(never_type) is enabled, unconstrained ints with i32,
2612     // unconstrained floats with f64.
2613     // Fallback becomes very dubious if we have encountered type-checking errors.
2614     // In that case, fallback to Error.
2615     // The return value indicates whether fallback has occurred.
2616     fn fallback_if_possible(&self, ty: Ty<'tcx>) -> bool {
2617         use rustc::ty::error::UnconstrainedNumeric::Neither;
2618         use rustc::ty::error::UnconstrainedNumeric::{UnconstrainedInt, UnconstrainedFloat};
2619
2620         assert!(ty.is_ty_infer());
2621         let fallback = match self.type_is_unconstrained_numeric(ty) {
2622             _ if self.is_tainted_by_errors() => self.tcx().types.err,
2623             UnconstrainedInt => self.tcx.types.i32,
2624             UnconstrainedFloat => self.tcx.types.f64,
2625             Neither if self.type_var_diverges(ty) => self.tcx.mk_diverging_default(),
2626             Neither => return false,
2627         };
2628         debug!("fallback_if_possible: defaulting `{:?}` to `{:?}`", ty, fallback);
2629         self.demand_eqtype(syntax_pos::DUMMY_SP, ty, fallback);
2630         true
2631     }
2632
2633     fn select_all_obligations_or_error(&self) {
2634         debug!("select_all_obligations_or_error");
2635         if let Err(errors) = self.fulfillment_cx.borrow_mut().select_all_or_error(&self) {
2636             self.report_fulfillment_errors(&errors, self.inh.body_id, false);
2637         }
2638     }
2639
2640     /// Select as many obligations as we can at present.
2641     fn select_obligations_where_possible(&self, fallback_has_occurred: bool) {
2642         if let Err(errors) = self.fulfillment_cx.borrow_mut().select_where_possible(self) {
2643             self.report_fulfillment_errors(&errors, self.inh.body_id, fallback_has_occurred);
2644         }
2645     }
2646
2647     /// For the overloaded place expressions (`*x`, `x[3]`), the trait
2648     /// returns a type of `&T`, but the actual type we assign to the
2649     /// *expression* is `T`. So this function just peels off the return
2650     /// type by one layer to yield `T`.
2651     fn make_overloaded_place_return_type(&self,
2652                                           method: MethodCallee<'tcx>)
2653                                           -> ty::TypeAndMut<'tcx>
2654     {
2655         // extract method return type, which will be &T;
2656         let ret_ty = method.sig.output();
2657
2658         // method returns &T, but the type as visible to user is T, so deref
2659         ret_ty.builtin_deref(true).unwrap()
2660     }
2661
2662     fn lookup_indexing(
2663         &self,
2664         expr: &hir::Expr,
2665         base_expr: &'tcx hir::Expr,
2666         base_ty: Ty<'tcx>,
2667         idx_ty: Ty<'tcx>,
2668         needs: Needs,
2669     ) -> Option<(/*index type*/ Ty<'tcx>, /*element type*/ Ty<'tcx>)> {
2670         // FIXME(#18741) -- this is almost but not quite the same as the
2671         // autoderef that normal method probing does. They could likely be
2672         // consolidated.
2673
2674         let mut autoderef = self.autoderef(base_expr.span, base_ty);
2675         let mut result = None;
2676         while result.is_none() && autoderef.next().is_some() {
2677             result = self.try_index_step(expr, base_expr, &autoderef, needs, idx_ty);
2678         }
2679         autoderef.finalize(self);
2680         result
2681     }
2682
2683     /// To type-check `base_expr[index_expr]`, we progressively autoderef
2684     /// (and otherwise adjust) `base_expr`, looking for a type which either
2685     /// supports builtin indexing or overloaded indexing.
2686     /// This loop implements one step in that search; the autoderef loop
2687     /// is implemented by `lookup_indexing`.
2688     fn try_index_step(
2689         &self,
2690         expr: &hir::Expr,
2691         base_expr: &hir::Expr,
2692         autoderef: &Autoderef<'a, 'tcx>,
2693         needs: Needs,
2694         index_ty: Ty<'tcx>,
2695     ) -> Option<(/*index type*/ Ty<'tcx>, /*element type*/ Ty<'tcx>)> {
2696         let adjusted_ty = autoderef.unambiguous_final_ty(self);
2697         debug!("try_index_step(expr={:?}, base_expr={:?}, adjusted_ty={:?}, \
2698                                index_ty={:?})",
2699                expr,
2700                base_expr,
2701                adjusted_ty,
2702                index_ty);
2703
2704         for &unsize in &[false, true] {
2705             let mut self_ty = adjusted_ty;
2706             if unsize {
2707                 // We only unsize arrays here.
2708                 if let ty::Array(element_ty, _) = adjusted_ty.sty {
2709                     self_ty = self.tcx.mk_slice(element_ty);
2710                 } else {
2711                     continue;
2712                 }
2713             }
2714
2715             // If some lookup succeeds, write callee into table and extract index/element
2716             // type from the method signature.
2717             // If some lookup succeeded, install method in table
2718             let input_ty = self.next_ty_var(TypeVariableOrigin {
2719                 kind: TypeVariableOriginKind::AutoDeref,
2720                 span: base_expr.span,
2721             });
2722             let method = self.try_overloaded_place_op(
2723                 expr.span, self_ty, &[input_ty], needs, PlaceOp::Index);
2724
2725             let result = method.map(|ok| {
2726                 debug!("try_index_step: success, using overloaded indexing");
2727                 let method = self.register_infer_ok_obligations(ok);
2728
2729                 let mut adjustments = autoderef.adjust_steps(self, needs);
2730                 if let ty::Ref(region, _, r_mutbl) = method.sig.inputs()[0].sty {
2731                     let mutbl = match r_mutbl {
2732                         hir::MutImmutable => AutoBorrowMutability::Immutable,
2733                         hir::MutMutable => AutoBorrowMutability::Mutable {
2734                             // Indexing can be desugared to a method call,
2735                             // so maybe we could use two-phase here.
2736                             // See the documentation of AllowTwoPhase for why that's
2737                             // not the case today.
2738                             allow_two_phase_borrow: AllowTwoPhase::No,
2739                         }
2740                     };
2741                     adjustments.push(Adjustment {
2742                         kind: Adjust::Borrow(AutoBorrow::Ref(region, mutbl)),
2743                         target: self.tcx.mk_ref(region, ty::TypeAndMut {
2744                             mutbl: r_mutbl,
2745                             ty: adjusted_ty
2746                         })
2747                     });
2748                 }
2749                 if unsize {
2750                     adjustments.push(Adjustment {
2751                         kind: Adjust::Pointer(PointerCast::Unsize),
2752                         target: method.sig.inputs()[0]
2753                     });
2754                 }
2755                 self.apply_adjustments(base_expr, adjustments);
2756
2757                 self.write_method_call(expr.hir_id, method);
2758                 (input_ty, self.make_overloaded_place_return_type(method).ty)
2759             });
2760             if result.is_some() {
2761                 return result;
2762             }
2763         }
2764
2765         None
2766     }
2767
2768     fn resolve_place_op(&self, op: PlaceOp, is_mut: bool) -> (Option<DefId>, ast::Ident) {
2769         let (tr, name) = match (op, is_mut) {
2770             (PlaceOp::Deref, false) => (self.tcx.lang_items().deref_trait(), sym::deref),
2771             (PlaceOp::Deref, true) => (self.tcx.lang_items().deref_mut_trait(), sym::deref_mut),
2772             (PlaceOp::Index, false) => (self.tcx.lang_items().index_trait(), sym::index),
2773             (PlaceOp::Index, true) => (self.tcx.lang_items().index_mut_trait(), sym::index_mut),
2774         };
2775         (tr, ast::Ident::with_empty_ctxt(name))
2776     }
2777
2778     fn try_overloaded_place_op(&self,
2779                                 span: Span,
2780                                 base_ty: Ty<'tcx>,
2781                                 arg_tys: &[Ty<'tcx>],
2782                                 needs: Needs,
2783                                 op: PlaceOp)
2784                                 -> Option<InferOk<'tcx, MethodCallee<'tcx>>>
2785     {
2786         debug!("try_overloaded_place_op({:?},{:?},{:?},{:?})",
2787                span,
2788                base_ty,
2789                needs,
2790                op);
2791
2792         // Try Mut first, if needed.
2793         let (mut_tr, mut_op) = self.resolve_place_op(op, true);
2794         let method = match (needs, mut_tr) {
2795             (Needs::MutPlace, Some(trait_did)) => {
2796                 self.lookup_method_in_trait(span, mut_op, trait_did, base_ty, Some(arg_tys))
2797             }
2798             _ => None,
2799         };
2800
2801         // Otherwise, fall back to the immutable version.
2802         let (imm_tr, imm_op) = self.resolve_place_op(op, false);
2803         let method = match (method, imm_tr) {
2804             (None, Some(trait_did)) => {
2805                 self.lookup_method_in_trait(span, imm_op, trait_did, base_ty, Some(arg_tys))
2806             }
2807             (method, _) => method,
2808         };
2809
2810         method
2811     }
2812
2813     fn check_method_argument_types(
2814         &self,
2815         sp: Span,
2816         expr_sp: Span,
2817         method: Result<MethodCallee<'tcx>, ()>,
2818         args_no_rcvr: &'tcx [hir::Expr],
2819         tuple_arguments: TupleArgumentsFlag,
2820         expected: Expectation<'tcx>,
2821     ) -> Ty<'tcx> {
2822         let has_error = match method {
2823             Ok(method) => {
2824                 method.substs.references_error() || method.sig.references_error()
2825             }
2826             Err(_) => true
2827         };
2828         if has_error {
2829             let err_inputs = self.err_args(args_no_rcvr.len());
2830
2831             let err_inputs = match tuple_arguments {
2832                 DontTupleArguments => err_inputs,
2833                 TupleArguments => vec![self.tcx.intern_tup(&err_inputs[..])],
2834             };
2835
2836             self.check_argument_types(sp, expr_sp, &err_inputs[..], &[], args_no_rcvr,
2837                                       false, tuple_arguments, None);
2838             return self.tcx.types.err;
2839         }
2840
2841         let method = method.unwrap();
2842         // HACK(eddyb) ignore self in the definition (see above).
2843         let expected_arg_tys = self.expected_inputs_for_expected_output(
2844             sp,
2845             expected,
2846             method.sig.output(),
2847             &method.sig.inputs()[1..]
2848         );
2849         self.check_argument_types(sp, expr_sp, &method.sig.inputs()[1..], &expected_arg_tys[..],
2850                                   args_no_rcvr, method.sig.c_variadic, tuple_arguments,
2851                                   self.tcx.hir().span_if_local(method.def_id));
2852         method.sig.output()
2853     }
2854
2855     fn self_type_matches_expected_vid(
2856         &self,
2857         trait_ref: ty::PolyTraitRef<'tcx>,
2858         expected_vid: ty::TyVid,
2859     ) -> bool {
2860         let self_ty = self.shallow_resolve(trait_ref.self_ty());
2861         debug!(
2862             "self_type_matches_expected_vid(trait_ref={:?}, self_ty={:?}, expected_vid={:?})",
2863             trait_ref, self_ty, expected_vid
2864         );
2865         match self_ty.sty {
2866             ty::Infer(ty::TyVar(found_vid)) => {
2867                 // FIXME: consider using `sub_root_var` here so we
2868                 // can see through subtyping.
2869                 let found_vid = self.root_var(found_vid);
2870                 debug!("self_type_matches_expected_vid - found_vid={:?}", found_vid);
2871                 expected_vid == found_vid
2872             }
2873             _ => false
2874         }
2875     }
2876
2877     fn obligations_for_self_ty<'b>(
2878         &'b self,
2879         self_ty: ty::TyVid,
2880     ) -> impl Iterator<Item = (ty::PolyTraitRef<'tcx>, traits::PredicateObligation<'tcx>)>
2881                  + Captures<'tcx>
2882                  + 'b {
2883         // FIXME: consider using `sub_root_var` here so we
2884         // can see through subtyping.
2885         let ty_var_root = self.root_var(self_ty);
2886         debug!("obligations_for_self_ty: self_ty={:?} ty_var_root={:?} pending_obligations={:?}",
2887                self_ty, ty_var_root,
2888                self.fulfillment_cx.borrow().pending_obligations());
2889
2890         self.fulfillment_cx
2891             .borrow()
2892             .pending_obligations()
2893             .into_iter()
2894             .filter_map(move |obligation| match obligation.predicate {
2895                 ty::Predicate::Projection(ref data) =>
2896                     Some((data.to_poly_trait_ref(self.tcx), obligation)),
2897                 ty::Predicate::Trait(ref data) =>
2898                     Some((data.to_poly_trait_ref(), obligation)),
2899                 ty::Predicate::Subtype(..) => None,
2900                 ty::Predicate::RegionOutlives(..) => None,
2901                 ty::Predicate::TypeOutlives(..) => None,
2902                 ty::Predicate::WellFormed(..) => None,
2903                 ty::Predicate::ObjectSafe(..) => None,
2904                 ty::Predicate::ConstEvaluatable(..) => None,
2905                 // N.B., this predicate is created by breaking down a
2906                 // `ClosureType: FnFoo()` predicate, where
2907                 // `ClosureType` represents some `Closure`. It can't
2908                 // possibly be referring to the current closure,
2909                 // because we haven't produced the `Closure` for
2910                 // this closure yet; this is exactly why the other
2911                 // code is looking for a self type of a unresolved
2912                 // inference variable.
2913                 ty::Predicate::ClosureKind(..) => None,
2914             }).filter(move |(tr, _)| self.self_type_matches_expected_vid(*tr, ty_var_root))
2915     }
2916
2917     fn type_var_is_sized(&self, self_ty: ty::TyVid) -> bool {
2918         self.obligations_for_self_ty(self_ty).any(|(tr, _)| {
2919             Some(tr.def_id()) == self.tcx.lang_items().sized_trait()
2920         })
2921     }
2922
2923     /// Generic function that factors out common logic from function calls,
2924     /// method calls and overloaded operators.
2925     fn check_argument_types(
2926         &self,
2927         sp: Span,
2928         expr_sp: Span,
2929         fn_inputs: &[Ty<'tcx>],
2930         expected_arg_tys: &[Ty<'tcx>],
2931         args: &'tcx [hir::Expr],
2932         c_variadic: bool,
2933         tuple_arguments: TupleArgumentsFlag,
2934         def_span: Option<Span>,
2935     ) {
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, expr: &'tcx hir::Expr, expected: Ty<'tcx>) {
3200         let ty = self.check_expr_with_hint(expr, expected);
3201         self.demand_eqtype(expr.span, expected, ty);
3202     }
3203
3204     pub fn check_expr_has_type_or_error(
3205         &self,
3206         expr: &'tcx hir::Expr,
3207         expected: Ty<'tcx>,
3208     ) -> Ty<'tcx> {
3209         self.check_expr_meets_expectation_or_error(expr, ExpectHasType(expected))
3210     }
3211
3212     fn check_expr_meets_expectation_or_error(
3213         &self,
3214         expr: &'tcx hir::Expr,
3215         expected: Expectation<'tcx>,
3216     ) -> Ty<'tcx> {
3217         let expected_ty = expected.to_option(&self).unwrap_or(self.tcx.types.bool);
3218         let mut ty = self.check_expr_with_expectation(expr, expected);
3219
3220         // While we don't allow *arbitrary* coercions here, we *do* allow
3221         // coercions from ! to `expected`.
3222         if ty.is_never() {
3223             assert!(!self.tables.borrow().adjustments().contains_key(expr.hir_id),
3224                     "expression with never type wound up being adjusted");
3225             let adj_ty = self.next_diverging_ty_var(
3226                 TypeVariableOrigin {
3227                     kind: TypeVariableOriginKind::AdjustmentType,
3228                     span: expr.span,
3229                 },
3230             );
3231             self.apply_adjustments(expr, vec![Adjustment {
3232                 kind: Adjust::NeverToAny,
3233                 target: adj_ty
3234             }]);
3235             ty = adj_ty;
3236         }
3237
3238         if let Some(mut err) = self.demand_suptype_diag(expr.span, expected_ty, ty) {
3239             let expr = match &expr.node {
3240                 ExprKind::DropTemps(expr) => expr,
3241                 _ => expr,
3242             };
3243             // Error possibly reported in `check_assign` so avoid emitting error again.
3244             err.emit_unless(self.is_assign_to_bool(expr, expected_ty));
3245         }
3246         ty
3247     }
3248
3249     fn check_expr_coercable_to_type(&self, expr: &'tcx hir::Expr, 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, expr: &'tcx hir::Expr, expected: Ty<'tcx>) -> Ty<'tcx> {
3256         self.check_expr_with_expectation(expr, ExpectHasType(expected))
3257     }
3258
3259     fn check_expr_with_expectation(
3260         &self,
3261         expr: &'tcx hir::Expr,
3262         expected: Expectation<'tcx>,
3263     ) -> 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(
3346         &self,
3347         expr: &'tcx hir::Expr,
3348         segment: &hir::PathSegment,
3349         span: Span,
3350         args: &'tcx [hir::Expr],
3351         expected: Expectation<'tcx>,
3352         needs: Needs,
3353     ) -> Ty<'tcx> {
3354         let rcvr = &args[0];
3355         let rcvr_t = self.check_expr_with_needs(&rcvr, needs);
3356         // no need to check for bot/err -- callee does that
3357         let rcvr_t = self.structurally_resolved_type(args[0].span, rcvr_t);
3358
3359         let method = match self.lookup_method(rcvr_t,
3360                                               segment,
3361                                               span,
3362                                               expr,
3363                                               rcvr) {
3364             Ok(method) => {
3365                 self.write_method_call(expr.hir_id, method);
3366                 Ok(method)
3367             }
3368             Err(error) => {
3369                 if segment.ident.name != kw::Invalid {
3370                     self.report_method_error(span,
3371                                              rcvr_t,
3372                                              segment.ident,
3373                                              SelfSource::MethodCall(rcvr),
3374                                              error,
3375                                              Some(args));
3376                 }
3377                 Err(())
3378             }
3379         };
3380
3381         // Call the generic checker.
3382         self.check_method_argument_types(span,
3383                                          expr.span,
3384                                          method,
3385                                          &args[1..],
3386                                          DontTupleArguments,
3387                                          expected)
3388     }
3389
3390     fn check_return_expr(&self, return_expr: &'tcx hir::Expr) {
3391         let ret_coercion =
3392             self.ret_coercion
3393                 .as_ref()
3394                 .unwrap_or_else(|| span_bug!(return_expr.span,
3395                                              "check_return_expr called outside fn body"));
3396
3397         let ret_ty = ret_coercion.borrow().expected_ty();
3398         let return_expr_ty = self.check_expr_with_hint(return_expr, ret_ty.clone());
3399         ret_coercion.borrow_mut()
3400                     .coerce(self,
3401                             &self.cause(return_expr.span,
3402                                         ObligationCauseCode::ReturnType(return_expr.hir_id)),
3403                             return_expr,
3404                             return_expr_ty);
3405     }
3406
3407     // Check field access expressions
3408     fn check_field(
3409         &self,
3410         expr: &'tcx hir::Expr,
3411         needs: Needs,
3412         base: &'tcx hir::Expr,
3413         field: ast::Ident,
3414     ) -> Ty<'tcx> {
3415         let expr_t = self.check_expr_with_needs(base, needs);
3416         let expr_t = self.structurally_resolved_type(base.span,
3417                                                      expr_t);
3418         let mut private_candidate = None;
3419         let mut autoderef = self.autoderef(expr.span, expr_t);
3420         while let Some((base_t, _)) = autoderef.next() {
3421             match base_t.sty {
3422                 ty::Adt(base_def, substs) if !base_def.is_enum() => {
3423                     debug!("struct named {:?}",  base_t);
3424                     let (ident, def_scope) =
3425                         self.tcx.adjust_ident_and_get_scope(field, base_def.did, self.body_id);
3426                     let fields = &base_def.non_enum_variant().fields;
3427                     if let Some(index) = fields.iter().position(|f| f.ident.modern() == ident) {
3428                         let field = &fields[index];
3429                         let field_ty = self.field_ty(expr.span, field, substs);
3430                         // Save the index of all fields regardless of their visibility in case
3431                         // of error recovery.
3432                         self.write_field_index(expr.hir_id, index);
3433                         if field.vis.is_accessible_from(def_scope, self.tcx) {
3434                             let adjustments = autoderef.adjust_steps(self, needs);
3435                             self.apply_adjustments(base, adjustments);
3436                             autoderef.finalize(self);
3437
3438                             self.tcx.check_stability(field.did, Some(expr.hir_id), expr.span);
3439                             return field_ty;
3440                         }
3441                         private_candidate = Some((base_def.did, field_ty));
3442                     }
3443                 }
3444                 ty::Tuple(ref tys) => {
3445                     let fstr = field.as_str();
3446                     if let Ok(index) = fstr.parse::<usize>() {
3447                         if fstr == index.to_string() {
3448                             if let Some(field_ty) = tys.get(index) {
3449                                 let adjustments = autoderef.adjust_steps(self, needs);
3450                                 self.apply_adjustments(base, adjustments);
3451                                 autoderef.finalize(self);
3452
3453                                 self.write_field_index(expr.hir_id, index);
3454                                 return field_ty.expect_ty();
3455                             }
3456                         }
3457                     }
3458                 }
3459                 _ => {}
3460             }
3461         }
3462         autoderef.unambiguous_final_ty(self);
3463
3464         if let Some((did, field_ty)) = private_candidate {
3465             let struct_path = self.tcx().def_path_str(did);
3466             let mut err = struct_span_err!(self.tcx().sess, expr.span, E0616,
3467                                            "field `{}` of struct `{}` is private",
3468                                            field, struct_path);
3469             // Also check if an accessible method exists, which is often what is meant.
3470             if self.method_exists(field, expr_t, expr.hir_id, false)
3471                 && !self.expr_in_place(expr.hir_id)
3472             {
3473                 self.suggest_method_call(
3474                     &mut err,
3475                     &format!("a method `{}` also exists, call it with parentheses", field),
3476                     field,
3477                     expr_t,
3478                     expr.hir_id,
3479                 );
3480             }
3481             err.emit();
3482             field_ty
3483         } else if field.name == kw::Invalid {
3484             self.tcx().types.err
3485         } else if self.method_exists(field, expr_t, expr.hir_id, true) {
3486             let mut err = type_error_struct!(self.tcx().sess, field.span, expr_t, E0615,
3487                                "attempted to take value of method `{}` on type `{}`",
3488                                field, expr_t);
3489
3490             if !self.expr_in_place(expr.hir_id) {
3491                 self.suggest_method_call(
3492                     &mut err,
3493                     "use parentheses to call the method",
3494                     field,
3495                     expr_t,
3496                     expr.hir_id
3497                 );
3498             } else {
3499                 err.help("methods are immutable and cannot be assigned to");
3500             }
3501
3502             err.emit();
3503             self.tcx().types.err
3504         } else {
3505             if !expr_t.is_primitive_ty() {
3506                 let mut err = self.no_such_field_err(field.span, field, expr_t);
3507
3508                 match expr_t.sty {
3509                     ty::Adt(def, _) if !def.is_enum() => {
3510                         if let Some(suggested_field_name) =
3511                             Self::suggest_field_name(def.non_enum_variant(),
3512                                                      &field.as_str(), vec![]) {
3513                                 err.span_suggestion(
3514                                     field.span,
3515                                     "a field with a similar name exists",
3516                                     suggested_field_name.to_string(),
3517                                     Applicability::MaybeIncorrect,
3518                                 );
3519                             } else {
3520                                 err.span_label(field.span, "unknown field");
3521                                 let struct_variant_def = def.non_enum_variant();
3522                                 let field_names = self.available_field_names(struct_variant_def);
3523                                 if !field_names.is_empty() {
3524                                     err.note(&format!("available fields are: {}",
3525                                                       self.name_series_display(field_names)));
3526                                 }
3527                             };
3528                     }
3529                     ty::Array(_, len) => {
3530                         if let (Some(len), Ok(user_index)) = (
3531                             len.assert_usize(self.tcx),
3532                             field.as_str().parse::<u64>()
3533                         ) {
3534                             let base = self.tcx.sess.source_map()
3535                                 .span_to_snippet(base.span)
3536                                 .unwrap_or_else(|_|
3537                                     self.tcx.hir().hir_to_pretty_string(base.hir_id));
3538                             let help = "instead of using tuple indexing, use array indexing";
3539                             let suggestion = format!("{}[{}]", base, field);
3540                             let applicability = if len < user_index {
3541                                 Applicability::MachineApplicable
3542                             } else {
3543                                 Applicability::MaybeIncorrect
3544                             };
3545                             err.span_suggestion(
3546                                 expr.span, help, suggestion, applicability
3547                             );
3548                         }
3549                     }
3550                     ty::RawPtr(..) => {
3551                         let base = self.tcx.sess.source_map()
3552                             .span_to_snippet(base.span)
3553                             .unwrap_or_else(|_| self.tcx.hir().hir_to_pretty_string(base.hir_id));
3554                         let msg = format!("`{}` is a raw pointer; try dereferencing it", base);
3555                         let suggestion = format!("(*{}).{}", base, field);
3556                         err.span_suggestion(
3557                             expr.span,
3558                             &msg,
3559                             suggestion,
3560                             Applicability::MaybeIncorrect,
3561                         );
3562                     }
3563                     _ => {}
3564                 }
3565                 err
3566             } else {
3567                 type_error_struct!(self.tcx().sess, field.span, expr_t, E0610,
3568                                    "`{}` is a primitive type and therefore doesn't have fields",
3569                                    expr_t)
3570             }.emit();
3571             self.tcx().types.err
3572         }
3573     }
3574
3575     // Return an hint about the closest match in field names
3576     fn suggest_field_name(variant: &'tcx ty::VariantDef,
3577                           field: &str,
3578                           skip: Vec<LocalInternedString>)
3579                           -> Option<Symbol> {
3580         let names = variant.fields.iter().filter_map(|field| {
3581             // ignore already set fields and private fields from non-local crates
3582             if skip.iter().any(|x| *x == field.ident.as_str()) ||
3583                (!variant.def_id.is_local() && field.vis != Visibility::Public)
3584             {
3585                 None
3586             } else {
3587                 Some(&field.ident.name)
3588             }
3589         });
3590
3591         find_best_match_for_name(names, field, None)
3592     }
3593
3594     fn available_field_names(&self, variant: &'tcx ty::VariantDef) -> Vec<ast::Name> {
3595         variant.fields.iter().filter(|field| {
3596             let def_scope =
3597                 self.tcx.adjust_ident_and_get_scope(field.ident, variant.def_id, self.body_id).1;
3598             field.vis.is_accessible_from(def_scope, self.tcx)
3599         })
3600         .map(|field| field.ident.name)
3601         .collect()
3602     }
3603
3604     fn name_series_display(&self, names: Vec<ast::Name>) -> String {
3605         // dynamic limit, to never omit just one field
3606         let limit = if names.len() == 6 { 6 } else { 5 };
3607         let mut display = names.iter().take(limit)
3608             .map(|n| format!("`{}`", n)).collect::<Vec<_>>().join(", ");
3609         if names.len() > limit {
3610             display = format!("{} ... and {} others", display, names.len() - limit);
3611         }
3612         display
3613     }
3614
3615     fn no_such_field_err<T: Display>(&self, span: Span, field: T, expr_t: &ty::TyS<'_>)
3616         -> DiagnosticBuilder<'_> {
3617         type_error_struct!(self.tcx().sess, span, expr_t, E0609,
3618                            "no field `{}` on type `{}`",
3619                            field, expr_t)
3620     }
3621
3622     fn report_unknown_field(
3623         &self,
3624         ty: Ty<'tcx>,
3625         variant: &'tcx ty::VariantDef,
3626         field: &hir::Field,
3627         skip_fields: &[hir::Field],
3628         kind_name: &str,
3629     ) {
3630         if variant.recovered {
3631             return;
3632         }
3633         let mut err = self.type_error_struct_with_diag(
3634             field.ident.span,
3635             |actual| match ty.sty {
3636                 ty::Adt(adt, ..) if adt.is_enum() => {
3637                     struct_span_err!(self.tcx.sess, field.ident.span, E0559,
3638                                      "{} `{}::{}` has no field named `{}`",
3639                                      kind_name, actual, variant.ident, field.ident)
3640                 }
3641                 _ => {
3642                     struct_span_err!(self.tcx.sess, field.ident.span, E0560,
3643                                      "{} `{}` has no field named `{}`",
3644                                      kind_name, actual, field.ident)
3645                 }
3646             },
3647             ty);
3648         // prevent all specified fields from being suggested
3649         let skip_fields = skip_fields.iter().map(|ref x| x.ident.as_str());
3650         if let Some(field_name) = Self::suggest_field_name(variant,
3651                                                            &field.ident.as_str(),
3652                                                            skip_fields.collect()) {
3653             err.span_suggestion(
3654                 field.ident.span,
3655                 "a field with a similar name exists",
3656                 field_name.to_string(),
3657                 Applicability::MaybeIncorrect,
3658             );
3659         } else {
3660             match ty.sty {
3661                 ty::Adt(adt, ..) => {
3662                     if adt.is_enum() {
3663                         err.span_label(field.ident.span,
3664                                        format!("`{}::{}` does not have this field",
3665                                                ty, variant.ident));
3666                     } else {
3667                         err.span_label(field.ident.span,
3668                                        format!("`{}` does not have this field", ty));
3669                     }
3670                     let available_field_names = self.available_field_names(variant);
3671                     if !available_field_names.is_empty() {
3672                         err.note(&format!("available fields are: {}",
3673                                           self.name_series_display(available_field_names)));
3674                     }
3675                 }
3676                 _ => bug!("non-ADT passed to report_unknown_field")
3677             }
3678         };
3679         err.emit();
3680     }
3681
3682     fn check_expr_struct_fields(
3683         &self,
3684         adt_ty: Ty<'tcx>,
3685         expected: Expectation<'tcx>,
3686         expr_id: hir::HirId,
3687         span: Span,
3688         variant: &'tcx ty::VariantDef,
3689         ast_fields: &'tcx [hir::Field],
3690         check_completeness: bool,
3691     ) -> bool {
3692         let tcx = self.tcx;
3693
3694         let adt_ty_hint =
3695             self.expected_inputs_for_expected_output(span, expected, adt_ty, &[adt_ty])
3696                 .get(0).cloned().unwrap_or(adt_ty);
3697         // re-link the regions that EIfEO can erase.
3698         self.demand_eqtype(span, adt_ty_hint, adt_ty);
3699
3700         let (substs, adt_kind, kind_name) = match &adt_ty.sty {
3701             &ty::Adt(adt, substs) => {
3702                 (substs, adt.adt_kind(), adt.variant_descr())
3703             }
3704             _ => span_bug!(span, "non-ADT passed to check_expr_struct_fields")
3705         };
3706
3707         let mut remaining_fields = variant.fields.iter().enumerate().map(|(i, field)|
3708             (field.ident.modern(), (i, field))
3709         ).collect::<FxHashMap<_, _>>();
3710
3711         let mut seen_fields = FxHashMap::default();
3712
3713         let mut error_happened = false;
3714
3715         // Type-check each field.
3716         for field in ast_fields {
3717             let ident = tcx.adjust_ident(field.ident, variant.def_id);
3718             let field_type = if let Some((i, v_field)) = remaining_fields.remove(&ident) {
3719                 seen_fields.insert(ident, field.span);
3720                 self.write_field_index(field.hir_id, i);
3721
3722                 // We don't look at stability attributes on
3723                 // struct-like enums (yet...), but it's definitely not
3724                 // a bug to have constructed one.
3725                 if adt_kind != AdtKind::Enum {
3726                     tcx.check_stability(v_field.did, Some(expr_id), field.span);
3727                 }
3728
3729                 self.field_ty(field.span, v_field, substs)
3730             } else {
3731                 error_happened = true;
3732                 if let Some(prev_span) = seen_fields.get(&ident) {
3733                     let mut err = struct_span_err!(self.tcx.sess,
3734                                                    field.ident.span,
3735                                                    E0062,
3736                                                    "field `{}` specified more than once",
3737                                                    ident);
3738
3739                     err.span_label(field.ident.span, "used more than once");
3740                     err.span_label(*prev_span, format!("first use of `{}`", ident));
3741
3742                     err.emit();
3743                 } else {
3744                     self.report_unknown_field(adt_ty, variant, field, ast_fields, kind_name);
3745                 }
3746
3747                 tcx.types.err
3748             };
3749
3750             // Make sure to give a type to the field even if there's
3751             // an error, so we can continue type-checking.
3752             self.check_expr_coercable_to_type(&field.expr, field_type);
3753         }
3754
3755         // Make sure the programmer specified correct number of fields.
3756         if kind_name == "union" {
3757             if ast_fields.len() != 1 {
3758                 tcx.sess.span_err(span, "union expressions should have exactly one field");
3759             }
3760         } else if check_completeness && !error_happened && !remaining_fields.is_empty() {
3761             let len = remaining_fields.len();
3762
3763             let mut displayable_field_names = remaining_fields
3764                                               .keys()
3765                                               .map(|ident| ident.as_str())
3766                                               .collect::<Vec<_>>();
3767
3768             displayable_field_names.sort();
3769
3770             let truncated_fields_error = if len <= 3 {
3771                 String::new()
3772             } else {
3773                 format!(" and {} other field{}", (len - 3), if len - 3 == 1 {""} else {"s"})
3774             };
3775
3776             let remaining_fields_names = displayable_field_names.iter().take(3)
3777                                         .map(|n| format!("`{}`", n))
3778                                         .collect::<Vec<_>>()
3779                                         .join(", ");
3780
3781             struct_span_err!(tcx.sess, span, E0063,
3782                              "missing field{} {}{} in initializer of `{}`",
3783                              if remaining_fields.len() == 1 { "" } else { "s" },
3784                              remaining_fields_names,
3785                              truncated_fields_error,
3786                              adt_ty)
3787                 .span_label(span, format!("missing {}{}",
3788                                           remaining_fields_names,
3789                                           truncated_fields_error))
3790                 .emit();
3791         }
3792         error_happened
3793     }
3794
3795     fn check_struct_fields_on_error(
3796         &self,
3797         fields: &'tcx [hir::Field],
3798         base_expr: &'tcx Option<P<hir::Expr>>,
3799     ) {
3800         for field in fields {
3801             self.check_expr(&field.expr);
3802         }
3803         if let Some(ref base) = *base_expr {
3804             self.check_expr(&base);
3805         }
3806     }
3807
3808     pub fn check_struct_path(&self,
3809                              qpath: &QPath,
3810                              hir_id: hir::HirId)
3811                              -> Option<(&'tcx ty::VariantDef,  Ty<'tcx>)> {
3812         let path_span = match *qpath {
3813             QPath::Resolved(_, ref path) => path.span,
3814             QPath::TypeRelative(ref qself, _) => qself.span
3815         };
3816         let (def, ty) = self.finish_resolving_struct_path(qpath, path_span, hir_id);
3817         let variant = match def {
3818             Res::Err => {
3819                 self.set_tainted_by_errors();
3820                 return None;
3821             }
3822             Res::Def(DefKind::Variant, _) => {
3823                 match ty.sty {
3824                     ty::Adt(adt, substs) => {
3825                         Some((adt.variant_of_res(def), adt.did, substs))
3826                     }
3827                     _ => bug!("unexpected type: {:?}", ty)
3828                 }
3829             }
3830             Res::Def(DefKind::Struct, _)
3831             | Res::Def(DefKind::Union, _)
3832             | Res::Def(DefKind::TyAlias, _)
3833             | Res::Def(DefKind::AssocTy, _)
3834             | Res::SelfTy(..) => {
3835                 match ty.sty {
3836                     ty::Adt(adt, substs) if !adt.is_enum() => {
3837                         Some((adt.non_enum_variant(), adt.did, substs))
3838                     }
3839                     _ => None,
3840                 }
3841             }
3842             _ => bug!("unexpected definition: {:?}", def)
3843         };
3844
3845         if let Some((variant, did, substs)) = variant {
3846             debug!("check_struct_path: did={:?} substs={:?}", did, substs);
3847             self.write_user_type_annotation_from_substs(hir_id, did, substs, None);
3848
3849             // Check bounds on type arguments used in the path.
3850             let bounds = self.instantiate_bounds(path_span, did, substs);
3851             let cause = traits::ObligationCause::new(path_span, self.body_id,
3852                                                      traits::ItemObligation(did));
3853             self.add_obligations_for_parameters(cause, &bounds);
3854
3855             Some((variant, ty))
3856         } else {
3857             struct_span_err!(self.tcx.sess, path_span, E0071,
3858                              "expected struct, variant or union type, found {}",
3859                              ty.sort_string(self.tcx))
3860                 .span_label(path_span, "not a struct")
3861                 .emit();
3862             None
3863         }
3864     }
3865
3866     fn check_expr_struct(
3867         &self,
3868         expr: &hir::Expr,
3869         expected: Expectation<'tcx>,
3870         qpath: &QPath,
3871         fields: &'tcx [hir::Field],
3872         base_expr: &'tcx Option<P<hir::Expr>>,
3873     ) -> Ty<'tcx> {
3874         // Find the relevant variant
3875         let (variant, adt_ty) =
3876             if let Some(variant_ty) = self.check_struct_path(qpath, expr.hir_id) {
3877                 variant_ty
3878             } else {
3879                 self.check_struct_fields_on_error(fields, base_expr);
3880                 return self.tcx.types.err;
3881             };
3882
3883         let path_span = match *qpath {
3884             QPath::Resolved(_, ref path) => path.span,
3885             QPath::TypeRelative(ref qself, _) => qself.span
3886         };
3887
3888         // Prohibit struct expressions when non-exhaustive flag is set.
3889         let adt = adt_ty.ty_adt_def().expect("`check_struct_path` returned non-ADT type");
3890         if !adt.did.is_local() && variant.is_field_list_non_exhaustive() {
3891             span_err!(self.tcx.sess, expr.span, E0639,
3892                       "cannot create non-exhaustive {} using struct expression",
3893                       adt.variant_descr());
3894         }
3895
3896         let error_happened = self.check_expr_struct_fields(adt_ty, expected, expr.hir_id, path_span,
3897                                                            variant, fields, base_expr.is_none());
3898         if let &Some(ref base_expr) = base_expr {
3899             // If check_expr_struct_fields hit an error, do not attempt to populate
3900             // the fields with the base_expr. This could cause us to hit errors later
3901             // when certain fields are assumed to exist that in fact do not.
3902             if !error_happened {
3903                 self.check_expr_has_type_or_error(base_expr, adt_ty);
3904                 match adt_ty.sty {
3905                     ty::Adt(adt, substs) if adt.is_struct() => {
3906                         let fru_field_types = adt.non_enum_variant().fields.iter().map(|f| {
3907                             self.normalize_associated_types_in(expr.span, &f.ty(self.tcx, substs))
3908                         }).collect();
3909
3910                         self.tables
3911                             .borrow_mut()
3912                             .fru_field_types_mut()
3913                             .insert(expr.hir_id, fru_field_types);
3914                     }
3915                     _ => {
3916                         span_err!(self.tcx.sess, base_expr.span, E0436,
3917                                   "functional record update syntax requires a struct");
3918                     }
3919                 }
3920             }
3921         }
3922         self.require_type_is_sized(adt_ty, expr.span, traits::StructInitializerSized);
3923         adt_ty
3924     }
3925
3926
3927     /// Invariant:
3928     /// If an expression has any sub-expressions that result in a type error,
3929     /// inspecting that expression's type with `ty.references_error()` will return
3930     /// true. Likewise, if an expression is known to diverge, inspecting its
3931     /// type with `ty::type_is_bot` will return true (n.b.: since Rust is
3932     /// strict, _|_ can appear in the type of an expression that does not,
3933     /// itself, diverge: for example, fn() -> _|_.)
3934     /// Note that inspecting a type's structure *directly* may expose the fact
3935     /// that there are actually multiple representations for `Error`, so avoid
3936     /// that when err needs to be handled differently.
3937     fn check_expr_with_expectation_and_needs(
3938         &self,
3939         expr: &'tcx hir::Expr,
3940         expected: Expectation<'tcx>,
3941         needs: Needs,
3942     ) -> Ty<'tcx> {
3943         debug!(">> type-checking: expr={:?} expected={:?}",
3944                expr, expected);
3945
3946         // Warn for expressions after diverging siblings.
3947         self.warn_if_unreachable(expr.hir_id, expr.span, "expression");
3948
3949         // Hide the outer diverging and has_errors flags.
3950         let old_diverges = self.diverges.get();
3951         let old_has_errors = self.has_errors.get();
3952         self.diverges.set(Diverges::Maybe);
3953         self.has_errors.set(false);
3954
3955         let ty = self.check_expr_kind(expr, expected, needs);
3956
3957         // Warn for non-block expressions with diverging children.
3958         match expr.node {
3959             ExprKind::Block(..) |
3960             ExprKind::Loop(..) | ExprKind::While(..) |
3961             ExprKind::Match(..) => {}
3962
3963             _ => self.warn_if_unreachable(expr.hir_id, expr.span, "expression")
3964         }
3965
3966         // Any expression that produces a value of type `!` must have diverged
3967         if ty.is_never() {
3968             self.diverges.set(self.diverges.get() | Diverges::Always);
3969         }
3970
3971         // Record the type, which applies it effects.
3972         // We need to do this after the warning above, so that
3973         // we don't warn for the diverging expression itself.
3974         self.write_ty(expr.hir_id, ty);
3975
3976         // Combine the diverging and has_error flags.
3977         self.diverges.set(self.diverges.get() | old_diverges);
3978         self.has_errors.set(self.has_errors.get() | old_has_errors);
3979
3980         debug!("type of {} is...", self.tcx.hir().hir_to_string(expr.hir_id));
3981         debug!("... {:?}, expected is {:?}", ty, expected);
3982
3983         ty
3984     }
3985
3986     fn check_expr_kind(
3987         &self,
3988         expr: &'tcx hir::Expr,
3989         expected: Expectation<'tcx>,
3990         needs: Needs,
3991     ) -> Ty<'tcx> {
3992         debug!(
3993             "check_expr_kind(expr={:?}, expected={:?}, needs={:?})",
3994             expr,
3995             expected,
3996             needs,
3997         );
3998
3999         let tcx = self.tcx;
4000         let id = expr.hir_id;
4001         match expr.node {
4002             ExprKind::Box(ref subexpr) => {
4003                 let expected_inner = expected.to_option(self).map_or(NoExpectation, |ty| {
4004                     match ty.sty {
4005                         ty::Adt(def, _) if def.is_box()
4006                             => Expectation::rvalue_hint(self, ty.boxed_ty()),
4007                         _ => NoExpectation
4008                     }
4009                 });
4010                 let referent_ty = self.check_expr_with_expectation(subexpr, expected_inner);
4011                 tcx.mk_box(referent_ty)
4012             }
4013
4014             ExprKind::Lit(ref lit) => {
4015                 self.check_lit(&lit, expected)
4016             }
4017             ExprKind::Binary(op, ref lhs, ref rhs) => {
4018                 self.check_binop(expr, op, lhs, rhs)
4019             }
4020             ExprKind::AssignOp(op, ref lhs, ref rhs) => {
4021                 self.check_binop_assign(expr, op, lhs, rhs)
4022             }
4023             ExprKind::Unary(unop, ref oprnd) => {
4024                 let expected_inner = match unop {
4025                     hir::UnNot | hir::UnNeg => {
4026                         expected
4027                     }
4028                     hir::UnDeref => {
4029                         NoExpectation
4030                     }
4031                 };
4032                 let needs = match unop {
4033                     hir::UnDeref => needs,
4034                     _ => Needs::None
4035                 };
4036                 let mut oprnd_t = self.check_expr_with_expectation_and_needs(&oprnd,
4037                                                                              expected_inner,
4038                                                                              needs);
4039
4040                 if !oprnd_t.references_error() {
4041                     oprnd_t = self.structurally_resolved_type(expr.span, oprnd_t);
4042                     match unop {
4043                         hir::UnDeref => {
4044                             if let Some(mt) = oprnd_t.builtin_deref(true) {
4045                                 oprnd_t = mt.ty;
4046                             } else if let Some(ok) = self.try_overloaded_deref(
4047                                     expr.span, oprnd_t, needs) {
4048                                 let method = self.register_infer_ok_obligations(ok);
4049                                 if let ty::Ref(region, _, mutbl) = method.sig.inputs()[0].sty {
4050                                     let mutbl = match mutbl {
4051                                         hir::MutImmutable => AutoBorrowMutability::Immutable,
4052                                         hir::MutMutable => AutoBorrowMutability::Mutable {
4053                                             // (It shouldn't actually matter for unary ops whether
4054                                             // we enable two-phase borrows or not, since a unary
4055                                             // op has no additional operands.)
4056                                             allow_two_phase_borrow: AllowTwoPhase::No,
4057                                         }
4058                                     };
4059                                     self.apply_adjustments(oprnd, vec![Adjustment {
4060                                         kind: Adjust::Borrow(AutoBorrow::Ref(region, mutbl)),
4061                                         target: method.sig.inputs()[0]
4062                                     }]);
4063                                 }
4064                                 oprnd_t = self.make_overloaded_place_return_type(method).ty;
4065                                 self.write_method_call(expr.hir_id, method);
4066                             } else {
4067                                 let mut err = type_error_struct!(
4068                                     tcx.sess,
4069                                     expr.span,
4070                                     oprnd_t,
4071                                     E0614,
4072                                     "type `{}` cannot be dereferenced",
4073                                     oprnd_t,
4074                                 );
4075                                 let sp = tcx.sess.source_map().start_point(expr.span);
4076                                 if let Some(sp) = tcx.sess.parse_sess.ambiguous_block_expr_parse
4077                                     .borrow().get(&sp)
4078                                 {
4079                                     tcx.sess.parse_sess.expr_parentheses_needed(
4080                                         &mut err,
4081                                         *sp,
4082                                         None,
4083                                     );
4084                                 }
4085                                 err.emit();
4086                                 oprnd_t = tcx.types.err;
4087                             }
4088                         }
4089                         hir::UnNot => {
4090                             let result = self.check_user_unop(expr, oprnd_t, unop);
4091                             // If it's builtin, we can reuse the type, this helps inference.
4092                             if !(oprnd_t.is_integral() || oprnd_t.sty == ty::Bool) {
4093                                 oprnd_t = result;
4094                             }
4095                         }
4096                         hir::UnNeg => {
4097                             let result = self.check_user_unop(expr, oprnd_t, unop);
4098                             // If it's builtin, we can reuse the type, this helps inference.
4099                             if !oprnd_t.is_numeric() {
4100                                 oprnd_t = result;
4101                             }
4102                         }
4103                     }
4104                 }
4105                 oprnd_t
4106             }
4107             ExprKind::AddrOf(mutbl, ref oprnd) => {
4108                 let hint = expected.only_has_type(self).map_or(NoExpectation, |ty| {
4109                     match ty.sty {
4110                         ty::Ref(_, ty, _) | ty::RawPtr(ty::TypeAndMut { ty, .. }) => {
4111                             if oprnd.is_place_expr() {
4112                                 // Places may legitimately have unsized types.
4113                                 // For example, dereferences of a fat pointer and
4114                                 // the last field of a struct can be unsized.
4115                                 ExpectHasType(ty)
4116                             } else {
4117                                 Expectation::rvalue_hint(self, ty)
4118                             }
4119                         }
4120                         _ => NoExpectation
4121                     }
4122                 });
4123                 let needs = Needs::maybe_mut_place(mutbl);
4124                 let ty = self.check_expr_with_expectation_and_needs(&oprnd, hint, needs);
4125
4126                 let tm = ty::TypeAndMut { ty: ty, mutbl: mutbl };
4127                 if tm.ty.references_error() {
4128                     tcx.types.err
4129                 } else {
4130                     // Note: at this point, we cannot say what the best lifetime
4131                     // is to use for resulting pointer.  We want to use the
4132                     // shortest lifetime possible so as to avoid spurious borrowck
4133                     // errors.  Moreover, the longest lifetime will depend on the
4134                     // precise details of the value whose address is being taken
4135                     // (and how long it is valid), which we don't know yet until type
4136                     // inference is complete.
4137                     //
4138                     // Therefore, here we simply generate a region variable.  The
4139                     // region inferencer will then select the ultimate value.
4140                     // Finally, borrowck is charged with guaranteeing that the
4141                     // value whose address was taken can actually be made to live
4142                     // as long as it needs to live.
4143                     let region = self.next_region_var(infer::AddrOfRegion(expr.span));
4144                     tcx.mk_ref(region, tm)
4145                 }
4146             }
4147             ExprKind::Path(ref qpath) => {
4148                 let (res, opt_ty, segs) = self.resolve_ty_and_res_ufcs(qpath, expr.hir_id,
4149                     expr.span);
4150                 let ty = match res {
4151                     Res::Err => {
4152                         self.set_tainted_by_errors();
4153                         tcx.types.err
4154                     }
4155                     Res::Def(DefKind::Ctor(_, CtorKind::Fictive), _) => {
4156                         report_unexpected_variant_res(tcx, res, expr.span, qpath);
4157                         tcx.types.err
4158                     }
4159                     _ => self.instantiate_value_path(segs, opt_ty, res, expr.span, id).0,
4160                 };
4161
4162                 if let ty::FnDef(..) = ty.sty {
4163                     let fn_sig = ty.fn_sig(tcx);
4164                     if !tcx.features().unsized_locals {
4165                         // We want to remove some Sized bounds from std functions,
4166                         // but don't want to expose the removal to stable Rust.
4167                         // i.e., we don't want to allow
4168                         //
4169                         // ```rust
4170                         // drop as fn(str);
4171                         // ```
4172                         //
4173                         // to work in stable even if the Sized bound on `drop` is relaxed.
4174                         for i in 0..fn_sig.inputs().skip_binder().len() {
4175                             // We just want to check sizedness, so instead of introducing
4176                             // placeholder lifetimes with probing, we just replace higher lifetimes
4177                             // with fresh vars.
4178                             let input = self.replace_bound_vars_with_fresh_vars(
4179                                 expr.span,
4180                                 infer::LateBoundRegionConversionTime::FnCall,
4181                                 &fn_sig.input(i)).0;
4182                             self.require_type_is_sized_deferred(input, expr.span,
4183                                                                 traits::SizedArgumentType);
4184                         }
4185                     }
4186                     // Here we want to prevent struct constructors from returning unsized types.
4187                     // There were two cases this happened: fn pointer coercion in stable
4188                     // and usual function call in presense of unsized_locals.
4189                     // Also, as we just want to check sizedness, instead of introducing
4190                     // placeholder lifetimes with probing, we just replace higher lifetimes
4191                     // with fresh vars.
4192                     let output = self.replace_bound_vars_with_fresh_vars(
4193                         expr.span,
4194                         infer::LateBoundRegionConversionTime::FnCall,
4195                         &fn_sig.output()).0;
4196                     self.require_type_is_sized_deferred(output, expr.span, traits::SizedReturnType);
4197                 }
4198
4199                 // We always require that the type provided as the value for
4200                 // a type parameter outlives the moment of instantiation.
4201                 let substs = self.tables.borrow().node_substs(expr.hir_id);
4202                 self.add_wf_bounds(substs, expr);
4203
4204                 ty
4205             }
4206             ExprKind::InlineAsm(_, ref outputs, ref inputs) => {
4207                 for expr in outputs.iter().chain(inputs.iter()) {
4208                     self.check_expr(expr);
4209                 }
4210                 tcx.mk_unit()
4211             }
4212             ExprKind::Break(destination, ref expr_opt) => {
4213                 if let Ok(target_id) = destination.target_id {
4214                     let (e_ty, cause);
4215                     if let Some(ref e) = *expr_opt {
4216                         // If this is a break with a value, we need to type-check
4217                         // the expression. Get an expected type from the loop context.
4218                         let opt_coerce_to = {
4219                             let mut enclosing_breakables = self.enclosing_breakables.borrow_mut();
4220                             enclosing_breakables.find_breakable(target_id)
4221                                                 .coerce
4222                                                 .as_ref()
4223                                                 .map(|coerce| coerce.expected_ty())
4224                         };
4225
4226                         // If the loop context is not a `loop { }`, then break with
4227                         // a value is illegal, and `opt_coerce_to` will be `None`.
4228                         // Just set expectation to error in that case.
4229                         let coerce_to = opt_coerce_to.unwrap_or(tcx.types.err);
4230
4231                         // Recurse without `enclosing_breakables` borrowed.
4232                         e_ty = self.check_expr_with_hint(e, coerce_to);
4233                         cause = self.misc(e.span);
4234                     } else {
4235                         // Otherwise, this is a break *without* a value. That's
4236                         // always legal, and is equivalent to `break ()`.
4237                         e_ty = tcx.mk_unit();
4238                         cause = self.misc(expr.span);
4239                     }
4240
4241                     // Now that we have type-checked `expr_opt`, borrow
4242                     // the `enclosing_loops` field and let's coerce the
4243                     // type of `expr_opt` into what is expected.
4244                     let mut enclosing_breakables = self.enclosing_breakables.borrow_mut();
4245                     let ctxt = enclosing_breakables.find_breakable(target_id);
4246                     if let Some(ref mut coerce) = ctxt.coerce {
4247                         if let Some(ref e) = *expr_opt {
4248                             coerce.coerce(self, &cause, e, e_ty);
4249                         } else {
4250                             assert!(e_ty.is_unit());
4251                             coerce.coerce_forced_unit(self, &cause, &mut |_| (), true);
4252                         }
4253                     } else {
4254                         // If `ctxt.coerce` is `None`, we can just ignore
4255                         // the type of the expresison.  This is because
4256                         // either this was a break *without* a value, in
4257                         // which case it is always a legal type (`()`), or
4258                         // else an error would have been flagged by the
4259                         // `loops` pass for using break with an expression
4260                         // where you are not supposed to.
4261                         assert!(expr_opt.is_none() || self.tcx.sess.err_count() > 0);
4262                     }
4263
4264                     ctxt.may_break = true;
4265
4266                     // the type of a `break` is always `!`, since it diverges
4267                     tcx.types.never
4268                 } else {
4269                     // Otherwise, we failed to find the enclosing loop;
4270                     // this can only happen if the `break` was not
4271                     // inside a loop at all, which is caught by the
4272                     // loop-checking pass.
4273                     if self.tcx.sess.err_count() == 0 {
4274                         self.tcx.sess.delay_span_bug(expr.span,
4275                             "break was outside loop, but no error was emitted");
4276                     }
4277
4278                     // We still need to assign a type to the inner expression to
4279                     // prevent the ICE in #43162.
4280                     if let Some(ref e) = *expr_opt {
4281                         self.check_expr_with_hint(e, tcx.types.err);
4282
4283                         // ... except when we try to 'break rust;'.
4284                         // ICE this expression in particular (see #43162).
4285                         if let ExprKind::Path(QPath::Resolved(_, ref path)) = e.node {
4286                             if path.segments.len() == 1 &&
4287                                path.segments[0].ident.name == sym::rust {
4288                                 fatally_break_rust(self.tcx.sess);
4289                             }
4290                         }
4291                     }
4292                     // There was an error; make type-check fail.
4293                     tcx.types.err
4294                 }
4295
4296             }
4297             ExprKind::Continue(destination) => {
4298                 if destination.target_id.is_ok() {
4299                     tcx.types.never
4300                 } else {
4301                     // There was an error; make type-check fail.
4302                     tcx.types.err
4303                 }
4304             }
4305             ExprKind::Ret(ref expr_opt) => {
4306                 if self.ret_coercion.is_none() {
4307                     struct_span_err!(self.tcx.sess, expr.span, E0572,
4308                                      "return statement outside of function body").emit();
4309                 } else if let Some(ref e) = *expr_opt {
4310                     if self.ret_coercion_span.borrow().is_none() {
4311                         *self.ret_coercion_span.borrow_mut() = Some(e.span);
4312                     }
4313                     self.check_return_expr(e);
4314                 } else {
4315                     let mut coercion = self.ret_coercion.as_ref().unwrap().borrow_mut();
4316                     if self.ret_coercion_span.borrow().is_none() {
4317                         *self.ret_coercion_span.borrow_mut() = Some(expr.span);
4318                     }
4319                     let cause = self.cause(expr.span, ObligationCauseCode::ReturnNoExpression);
4320                     if let Some((fn_decl, _)) = self.get_fn_decl(expr.hir_id) {
4321                         coercion.coerce_forced_unit(
4322                             self,
4323                             &cause,
4324                             &mut |db| {
4325                                 db.span_label(
4326                                     fn_decl.output.span(),
4327                                     format!(
4328                                         "expected `{}` because of this return type",
4329                                         fn_decl.output,
4330                                     ),
4331                                 );
4332                             },
4333                             true,
4334                         );
4335                     } else {
4336                         coercion.coerce_forced_unit(self, &cause, &mut |_| (), true);
4337                     }
4338                 }
4339                 tcx.types.never
4340             }
4341             ExprKind::Assign(ref lhs, ref rhs) => {
4342                 self.check_assign(expr, expected, lhs, rhs)
4343             }
4344             ExprKind::While(ref cond, ref body, _) => {
4345                 let ctxt = BreakableCtxt {
4346                     // cannot use break with a value from a while loop
4347                     coerce: None,
4348                     may_break: false,  // Will get updated if/when we find a `break`.
4349                 };
4350
4351                 let (ctxt, ()) = self.with_breakable_ctxt(expr.hir_id, ctxt, || {
4352                     self.check_expr_has_type_or_error(&cond, tcx.types.bool);
4353                     let cond_diverging = self.diverges.get();
4354                     self.check_block_no_value(&body);
4355
4356                     // We may never reach the body so it diverging means nothing.
4357                     self.diverges.set(cond_diverging);
4358                 });
4359
4360                 if ctxt.may_break {
4361                     // No way to know whether it's diverging because
4362                     // of a `break` or an outer `break` or `return`.
4363                     self.diverges.set(Diverges::Maybe);
4364                 }
4365
4366                 self.tcx.mk_unit()
4367             }
4368             ExprKind::Loop(ref body, _, source) => {
4369                 let coerce = match source {
4370                     // you can only use break with a value from a normal `loop { }`
4371                     hir::LoopSource::Loop => {
4372                         let coerce_to = expected.coercion_target_type(self, body.span);
4373                         Some(CoerceMany::new(coerce_to))
4374                     }
4375
4376                     hir::LoopSource::WhileLet |
4377                     hir::LoopSource::ForLoop => {
4378                         None
4379                     }
4380                 };
4381
4382                 let ctxt = BreakableCtxt {
4383                     coerce,
4384                     may_break: false, // Will get updated if/when we find a `break`.
4385                 };
4386
4387                 let (ctxt, ()) = self.with_breakable_ctxt(expr.hir_id, ctxt, || {
4388                     self.check_block_no_value(&body);
4389                 });
4390
4391                 if ctxt.may_break {
4392                     // No way to know whether it's diverging because
4393                     // of a `break` or an outer `break` or `return`.
4394                     self.diverges.set(Diverges::Maybe);
4395                 }
4396
4397                 // If we permit break with a value, then result type is
4398                 // the LUB of the breaks (possibly ! if none); else, it
4399                 // is nil. This makes sense because infinite loops
4400                 // (which would have type !) are only possible iff we
4401                 // permit break with a value [1].
4402                 if ctxt.coerce.is_none() && !ctxt.may_break {
4403                     // [1]
4404                     self.tcx.sess.delay_span_bug(body.span, "no coercion, but loop may not break");
4405                 }
4406                 ctxt.coerce.map(|c| c.complete(self)).unwrap_or_else(|| self.tcx.mk_unit())
4407             }
4408             ExprKind::Match(ref discrim, ref arms, match_src) => {
4409                 self.check_match(expr, &discrim, arms, expected, match_src)
4410             }
4411             ExprKind::Closure(capture, ref decl, body_id, _, gen) => {
4412                 self.check_expr_closure(expr, capture, &decl, body_id, gen, expected)
4413             }
4414             ExprKind::Block(ref body, _) => {
4415                 self.check_block_with_expected(&body, expected)
4416             }
4417             ExprKind::Call(ref callee, ref args) => {
4418                 self.check_call(expr, &callee, args, expected)
4419             }
4420             ExprKind::MethodCall(ref segment, span, ref args) => {
4421                 self.check_method_call(expr, segment, span, args, expected, needs)
4422             }
4423             ExprKind::Cast(ref e, ref t) => {
4424                 // Find the type of `e`. Supply hints based on the type we are casting to,
4425                 // if appropriate.
4426                 let t_cast = self.to_ty_saving_user_provided_ty(t);
4427                 let t_cast = self.resolve_vars_if_possible(&t_cast);
4428                 let t_expr = self.check_expr_with_expectation(e, ExpectCastableToType(t_cast));
4429                 let t_cast = self.resolve_vars_if_possible(&t_cast);
4430
4431                 // Eagerly check for some obvious errors.
4432                 if t_expr.references_error() || t_cast.references_error() {
4433                     tcx.types.err
4434                 } else {
4435                     // Defer other checks until we're done type checking.
4436                     let mut deferred_cast_checks = self.deferred_cast_checks.borrow_mut();
4437                     match cast::CastCheck::new(self, e, t_expr, t_cast, t.span, expr.span) {
4438                         Ok(cast_check) => {
4439                             deferred_cast_checks.push(cast_check);
4440                             t_cast
4441                         }
4442                         Err(ErrorReported) => {
4443                             tcx.types.err
4444                         }
4445                     }
4446                 }
4447             }
4448             ExprKind::Type(ref e, ref t) => {
4449                 let ty = self.to_ty_saving_user_provided_ty(&t);
4450                 self.check_expr_eq_type(&e, ty);
4451                 ty
4452             }
4453             ExprKind::DropTemps(ref e) => {
4454                 self.check_expr_with_expectation(e, expected)
4455             }
4456             ExprKind::Array(ref args) => {
4457                 let uty = expected.to_option(self).and_then(|uty| {
4458                     match uty.sty {
4459                         ty::Array(ty, _) | ty::Slice(ty) => Some(ty),
4460                         _ => None
4461                     }
4462                 });
4463
4464                 let element_ty = if !args.is_empty() {
4465                     let coerce_to = uty.unwrap_or_else(|| {
4466                         self.next_ty_var(TypeVariableOrigin {
4467                             kind: TypeVariableOriginKind::TypeInference,
4468                             span: expr.span,
4469                         })
4470                     });
4471                     let mut coerce = CoerceMany::with_coercion_sites(coerce_to, args);
4472                     assert_eq!(self.diverges.get(), Diverges::Maybe);
4473                     for e in args {
4474                         let e_ty = self.check_expr_with_hint(e, coerce_to);
4475                         let cause = self.misc(e.span);
4476                         coerce.coerce(self, &cause, e, e_ty);
4477                     }
4478                     coerce.complete(self)
4479                 } else {
4480                     self.next_ty_var(TypeVariableOrigin {
4481                         kind: TypeVariableOriginKind::TypeInference,
4482                         span: expr.span,
4483                     })
4484                 };
4485                 tcx.mk_array(element_ty, args.len() as u64)
4486             }
4487             ExprKind::Repeat(ref element, ref count) => {
4488                 let count_def_id = tcx.hir().local_def_id_from_hir_id(count.hir_id);
4489                 let count = if self.const_param_def_id(count).is_some() {
4490                     Ok(self.to_const(count, self.tcx.type_of(count_def_id)))
4491                 } else {
4492                     let param_env = ty::ParamEnv::empty();
4493                     let substs = InternalSubsts::identity_for_item(tcx.global_tcx(), count_def_id);
4494                     let instance = ty::Instance::resolve(
4495                         tcx.global_tcx(),
4496                         param_env,
4497                         count_def_id,
4498                         substs,
4499                     ).unwrap();
4500                     let global_id = GlobalId {
4501                         instance,
4502                         promoted: None
4503                     };
4504
4505                     tcx.const_eval(param_env.and(global_id))
4506                 };
4507
4508                 let uty = match expected {
4509                     ExpectHasType(uty) => {
4510                         match uty.sty {
4511                             ty::Array(ty, _) | ty::Slice(ty) => Some(ty),
4512                             _ => None
4513                         }
4514                     }
4515                     _ => None
4516                 };
4517
4518                 let (element_ty, t) = match uty {
4519                     Some(uty) => {
4520                         self.check_expr_coercable_to_type(&element, uty);
4521                         (uty, uty)
4522                     }
4523                     None => {
4524                         let ty = self.next_ty_var(TypeVariableOrigin {
4525                             kind: TypeVariableOriginKind::MiscVariable,
4526                             span: element.span,
4527                         });
4528                         let element_ty = self.check_expr_has_type_or_error(&element, ty);
4529                         (element_ty, ty)
4530                     }
4531                 };
4532
4533                 if let Ok(count) = count {
4534                     let zero_or_one = count.assert_usize(tcx).map_or(false, |count| count <= 1);
4535                     if !zero_or_one {
4536                         // For [foo, ..n] where n > 1, `foo` must have
4537                         // Copy type:
4538                         let lang_item = self.tcx.require_lang_item(lang_items::CopyTraitLangItem);
4539                         self.require_type_meets(t, expr.span, traits::RepeatVec, lang_item);
4540                     }
4541                 }
4542
4543                 if element_ty.references_error() {
4544                     tcx.types.err
4545                 } else if let Ok(count) = count {
4546                     tcx.mk_ty(ty::Array(t, count))
4547                 } else {
4548                     tcx.types.err
4549                 }
4550             }
4551             ExprKind::Tup(ref elts) => {
4552                 let flds = expected.only_has_type(self).and_then(|ty| {
4553                     let ty = self.resolve_type_vars_with_obligations(ty);
4554                     match ty.sty {
4555                         ty::Tuple(ref flds) => Some(&flds[..]),
4556                         _ => None
4557                     }
4558                 });
4559
4560                 let elt_ts_iter = elts.iter().enumerate().map(|(i, e)| {
4561                     let t = match flds {
4562                         Some(ref fs) if i < fs.len() => {
4563                             let ety = fs[i].expect_ty();
4564                             self.check_expr_coercable_to_type(&e, ety);
4565                             ety
4566                         }
4567                         _ => {
4568                             self.check_expr_with_expectation(&e, NoExpectation)
4569                         }
4570                     };
4571                     t
4572                 });
4573                 let tuple = tcx.mk_tup(elt_ts_iter);
4574                 if tuple.references_error() {
4575                     tcx.types.err
4576                 } else {
4577                     self.require_type_is_sized(tuple, expr.span, traits::TupleInitializerSized);
4578                     tuple
4579                 }
4580             }
4581             ExprKind::Struct(ref qpath, ref fields, ref base_expr) => {
4582                 self.check_expr_struct(expr, expected, qpath, fields, base_expr)
4583             }
4584             ExprKind::Field(ref base, field) => {
4585                 self.check_field(expr, needs, &base, field)
4586             }
4587             ExprKind::Index(ref base, ref idx) => {
4588                 let base_t = self.check_expr_with_needs(&base, needs);
4589                 let idx_t = self.check_expr(&idx);
4590
4591                 if base_t.references_error() {
4592                     base_t
4593                 } else if idx_t.references_error() {
4594                     idx_t
4595                 } else {
4596                     let base_t = self.structurally_resolved_type(base.span, base_t);
4597                     match self.lookup_indexing(expr, base, base_t, idx_t, needs) {
4598                         Some((index_ty, element_ty)) => {
4599                             // two-phase not needed because index_ty is never mutable
4600                             self.demand_coerce(idx, idx_t, index_ty, AllowTwoPhase::No);
4601                             element_ty
4602                         }
4603                         None => {
4604                             let mut err =
4605                                 type_error_struct!(tcx.sess, expr.span, base_t, E0608,
4606                                                    "cannot index into a value of type `{}`",
4607                                                    base_t);
4608                             // Try to give some advice about indexing tuples.
4609                             if let ty::Tuple(..) = base_t.sty {
4610                                 let mut needs_note = true;
4611                                 // If the index is an integer, we can show the actual
4612                                 // fixed expression:
4613                                 if let ExprKind::Lit(ref lit) = idx.node {
4614                                     if let ast::LitKind::Int(i,
4615                                             ast::LitIntType::Unsuffixed) = lit.node {
4616                                         let snip = tcx.sess.source_map().span_to_snippet(base.span);
4617                                         if let Ok(snip) = snip {
4618                                             err.span_suggestion(
4619                                                 expr.span,
4620                                                 "to access tuple elements, use",
4621                                                 format!("{}.{}", snip, i),
4622                                                 Applicability::MachineApplicable,
4623                                             );
4624                                             needs_note = false;
4625                                         }
4626                                     }
4627                                 }
4628                                 if needs_note {
4629                                     err.help("to access tuple elements, use tuple indexing \
4630                                               syntax (e.g., `tuple.0`)");
4631                                 }
4632                             }
4633                             err.emit();
4634                             self.tcx.types.err
4635                         }
4636                     }
4637                 }
4638             }
4639             ExprKind::Yield(ref value) => {
4640                 match self.yield_ty {
4641                     Some(ty) => {
4642                         self.check_expr_coercable_to_type(&value, ty);
4643                     }
4644                     None => {
4645                         struct_span_err!(self.tcx.sess, expr.span, E0627,
4646                                          "yield statement outside of generator literal").emit();
4647                     }
4648                 }
4649                 tcx.mk_unit()
4650             }
4651             hir::ExprKind::Err => {
4652                 tcx.types.err
4653             }
4654         }
4655     }
4656
4657     /// Type check assignment expression `expr` of form `lhs = rhs`.
4658     /// The expected type is `()` and is passsed to the function for the purposes of diagnostics.
4659     fn check_assign(
4660         &self,
4661         expr: &'tcx hir::Expr,
4662         expected: Expectation<'tcx>,
4663         lhs: &'tcx hir::Expr,
4664         rhs: &'tcx hir::Expr,
4665     ) -> Ty<'tcx> {
4666         let lhs_ty = self.check_expr_with_needs(&lhs, Needs::MutPlace);
4667         let rhs_ty = self.check_expr_coercable_to_type(&rhs, lhs_ty);
4668
4669         let expected_ty = expected.coercion_target_type(self, expr.span);
4670         if expected_ty == self.tcx.types.bool {
4671             // The expected type is `bool` but this will result in `()` so we can reasonably
4672             // say that the user intended to write `lhs == rhs` instead of `lhs = rhs`.
4673             // The likely cause of this is `if foo = bar { .. }`.
4674             let actual_ty = self.tcx.mk_unit();
4675             let mut err = self.demand_suptype_diag(expr.span, expected_ty, actual_ty).unwrap();
4676             let msg = "try comparing for equality";
4677             let left = self.tcx.sess.source_map().span_to_snippet(lhs.span);
4678             let right = self.tcx.sess.source_map().span_to_snippet(rhs.span);
4679             if let (Ok(left), Ok(right)) = (left, right) {
4680                 let help = format!("{} == {}", left, right);
4681                 err.span_suggestion(expr.span, msg, help, Applicability::MaybeIncorrect);
4682             } else {
4683                 err.help(msg);
4684             }
4685             err.emit();
4686         } else if !lhs.is_place_expr() {
4687             struct_span_err!(self.tcx.sess, expr.span, E0070,
4688                                 "invalid left-hand side expression")
4689                 .span_label(expr.span, "left-hand of expression not valid")
4690                 .emit();
4691         }
4692
4693         self.require_type_is_sized(lhs_ty, lhs.span, traits::AssignmentLhsSized);
4694
4695         if lhs_ty.references_error() || rhs_ty.references_error() {
4696             self.tcx.types.err
4697         } else {
4698             self.tcx.mk_unit()
4699         }
4700     }
4701
4702     // Finish resolving a path in a struct expression or pattern `S::A { .. }` if necessary.
4703     // The newly resolved definition is written into `type_dependent_defs`.
4704     fn finish_resolving_struct_path(&self,
4705                                     qpath: &QPath,
4706                                     path_span: Span,
4707                                     hir_id: hir::HirId)
4708                                     -> (Res, Ty<'tcx>)
4709     {
4710         match *qpath {
4711             QPath::Resolved(ref maybe_qself, ref path) => {
4712                 let self_ty = maybe_qself.as_ref().map(|qself| self.to_ty(qself));
4713                 let ty = AstConv::res_to_ty(self, self_ty, path, true);
4714                 (path.res, ty)
4715             }
4716             QPath::TypeRelative(ref qself, ref segment) => {
4717                 let ty = self.to_ty(qself);
4718
4719                 let res = if let hir::TyKind::Path(QPath::Resolved(_, ref path)) = qself.node {
4720                     path.res
4721                 } else {
4722                     Res::Err
4723                 };
4724                 let result = AstConv::associated_path_to_ty(
4725                     self,
4726                     hir_id,
4727                     path_span,
4728                     ty,
4729                     res,
4730                     segment,
4731                     true,
4732                 );
4733                 let ty = result.map(|(ty, _, _)| ty).unwrap_or(self.tcx().types.err);
4734                 let result = result.map(|(_, kind, def_id)| (kind, def_id));
4735
4736                 // Write back the new resolution.
4737                 self.write_resolution(hir_id, result);
4738
4739                 (result.map(|(kind, def_id)| Res::Def(kind, def_id)).unwrap_or(Res::Err), ty)
4740             }
4741         }
4742     }
4743
4744     /// Resolves an associated value path into a base type and associated constant, or method
4745     /// resolution. The newly resolved definition is written into `type_dependent_defs`.
4746     pub fn resolve_ty_and_res_ufcs<'b>(&self,
4747                                        qpath: &'b QPath,
4748                                        hir_id: hir::HirId,
4749                                        span: Span)
4750                                        -> (Res, Option<Ty<'tcx>>, &'b [hir::PathSegment])
4751     {
4752         debug!("resolve_ty_and_res_ufcs: qpath={:?} hir_id={:?} span={:?}", qpath, hir_id, span);
4753         let (ty, qself, item_segment) = match *qpath {
4754             QPath::Resolved(ref opt_qself, ref path) => {
4755                 return (path.res,
4756                         opt_qself.as_ref().map(|qself| self.to_ty(qself)),
4757                         &path.segments[..]);
4758             }
4759             QPath::TypeRelative(ref qself, ref segment) => {
4760                 (self.to_ty(qself), qself, segment)
4761             }
4762         };
4763         if let Some(&cached_result) = self.tables.borrow().type_dependent_defs().get(hir_id) {
4764             // Return directly on cache hit. This is useful to avoid doubly reporting
4765             // errors with default match binding modes. See #44614.
4766             let def = cached_result.map(|(kind, def_id)| Res::Def(kind, def_id))
4767                 .unwrap_or(Res::Err);
4768             return (def, Some(ty), slice::from_ref(&**item_segment));
4769         }
4770         let item_name = item_segment.ident;
4771         let result = self.resolve_ufcs(span, item_name, ty, hir_id).or_else(|error| {
4772             let result = match error {
4773                 method::MethodError::PrivateMatch(kind, def_id, _) => Ok((kind, def_id)),
4774                 _ => Err(ErrorReported),
4775             };
4776             if item_name.name != kw::Invalid {
4777                 self.report_method_error(
4778                     span,
4779                     ty,
4780                     item_name,
4781                     SelfSource::QPath(qself),
4782                     error,
4783                     None,
4784                 );
4785             }
4786             result
4787         });
4788
4789         // Write back the new resolution.
4790         self.write_resolution(hir_id, result);
4791         (
4792             result.map(|(kind, def_id)| Res::Def(kind, def_id)).unwrap_or(Res::Err),
4793             Some(ty),
4794             slice::from_ref(&**item_segment),
4795         )
4796     }
4797
4798     pub fn check_decl_initializer(
4799         &self,
4800         local: &'tcx hir::Local,
4801         init: &'tcx hir::Expr,
4802     ) -> Ty<'tcx> {
4803         // FIXME(tschottdorf): `contains_explicit_ref_binding()` must be removed
4804         // for #42640 (default match binding modes).
4805         //
4806         // See #44848.
4807         let ref_bindings = local.pat.contains_explicit_ref_binding();
4808
4809         let local_ty = self.local_ty(init.span, local.hir_id).revealed_ty;
4810         if let Some(m) = ref_bindings {
4811             // Somewhat subtle: if we have a `ref` binding in the pattern,
4812             // we want to avoid introducing coercions for the RHS. This is
4813             // both because it helps preserve sanity and, in the case of
4814             // ref mut, for soundness (issue #23116). In particular, in
4815             // the latter case, we need to be clear that the type of the
4816             // referent for the reference that results is *equal to* the
4817             // type of the place it is referencing, and not some
4818             // supertype thereof.
4819             let init_ty = self.check_expr_with_needs(init, Needs::maybe_mut_place(m));
4820             self.demand_eqtype(init.span, local_ty, init_ty);
4821             init_ty
4822         } else {
4823             self.check_expr_coercable_to_type(init, local_ty)
4824         }
4825     }
4826
4827     pub fn check_decl_local(&self, local: &'tcx hir::Local) {
4828         let t = self.local_ty(local.span, local.hir_id).decl_ty;
4829         self.write_ty(local.hir_id, t);
4830
4831         if let Some(ref init) = local.init {
4832             let init_ty = self.check_decl_initializer(local, &init);
4833             if init_ty.references_error() {
4834                 self.write_ty(local.hir_id, init_ty);
4835             }
4836         }
4837
4838         self.check_pat_walk(
4839             &local.pat,
4840             t,
4841             ty::BindingMode::BindByValue(hir::Mutability::MutImmutable),
4842             None,
4843         );
4844         let pat_ty = self.node_ty(local.pat.hir_id);
4845         if pat_ty.references_error() {
4846             self.write_ty(local.hir_id, pat_ty);
4847         }
4848     }
4849
4850     pub fn check_stmt(&self, stmt: &'tcx hir::Stmt) {
4851         // Don't do all the complex logic below for `DeclItem`.
4852         match stmt.node {
4853             hir::StmtKind::Item(..) => return,
4854             hir::StmtKind::Local(..) | hir::StmtKind::Expr(..) | hir::StmtKind::Semi(..) => {}
4855         }
4856
4857         self.warn_if_unreachable(stmt.hir_id, stmt.span, "statement");
4858
4859         // Hide the outer diverging and `has_errors` flags.
4860         let old_diverges = self.diverges.get();
4861         let old_has_errors = self.has_errors.get();
4862         self.diverges.set(Diverges::Maybe);
4863         self.has_errors.set(false);
4864
4865         match stmt.node {
4866             hir::StmtKind::Local(ref l) => {
4867                 self.check_decl_local(&l);
4868             }
4869             // Ignore for now.
4870             hir::StmtKind::Item(_) => {}
4871             hir::StmtKind::Expr(ref expr) => {
4872                 // Check with expected type of `()`.
4873                 self.check_expr_has_type_or_error(&expr, self.tcx.mk_unit());
4874             }
4875             hir::StmtKind::Semi(ref expr) => {
4876                 self.check_expr(&expr);
4877             }
4878         }
4879
4880         // Combine the diverging and `has_error` flags.
4881         self.diverges.set(self.diverges.get() | old_diverges);
4882         self.has_errors.set(self.has_errors.get() | old_has_errors);
4883     }
4884
4885     pub fn check_block_no_value(&self, blk: &'tcx hir::Block) {
4886         let unit = self.tcx.mk_unit();
4887         let ty = self.check_block_with_expected(blk, ExpectHasType(unit));
4888
4889         // if the block produces a `!` value, that can always be
4890         // (effectively) coerced to unit.
4891         if !ty.is_never() {
4892             self.demand_suptype(blk.span, unit, ty);
4893         }
4894     }
4895
4896     fn check_block_with_expected(
4897         &self,
4898         blk: &'tcx hir::Block,
4899         expected: Expectation<'tcx>,
4900     ) -> Ty<'tcx> {
4901         let prev = {
4902             let mut fcx_ps = self.ps.borrow_mut();
4903             let unsafety_state = fcx_ps.recurse(blk);
4904             replace(&mut *fcx_ps, unsafety_state)
4905         };
4906
4907         // In some cases, blocks have just one exit, but other blocks
4908         // can be targeted by multiple breaks. This can happen both
4909         // with labeled blocks as well as when we desugar
4910         // a `try { ... }` expression.
4911         //
4912         // Example 1:
4913         //
4914         //    'a: { if true { break 'a Err(()); } Ok(()) }
4915         //
4916         // Here we would wind up with two coercions, one from
4917         // `Err(())` and the other from the tail expression
4918         // `Ok(())`. If the tail expression is omitted, that's a
4919         // "forced unit" -- unless the block diverges, in which
4920         // case we can ignore the tail expression (e.g., `'a: {
4921         // break 'a 22; }` would not force the type of the block
4922         // to be `()`).
4923         let tail_expr = blk.expr.as_ref();
4924         let coerce_to_ty = expected.coercion_target_type(self, blk.span);
4925         let coerce = if blk.targeted_by_break {
4926             CoerceMany::new(coerce_to_ty)
4927         } else {
4928             let tail_expr: &[P<hir::Expr>] = match tail_expr {
4929                 Some(e) => slice::from_ref(e),
4930                 None => &[],
4931             };
4932             CoerceMany::with_coercion_sites(coerce_to_ty, tail_expr)
4933         };
4934
4935         let prev_diverges = self.diverges.get();
4936         let ctxt = BreakableCtxt {
4937             coerce: Some(coerce),
4938             may_break: false,
4939         };
4940
4941         let (ctxt, ()) = self.with_breakable_ctxt(blk.hir_id, ctxt, || {
4942             for s in &blk.stmts {
4943                 self.check_stmt(s);
4944             }
4945
4946             // check the tail expression **without** holding the
4947             // `enclosing_breakables` lock below.
4948             let tail_expr_ty = tail_expr.map(|t| self.check_expr_with_expectation(t, expected));
4949
4950             let mut enclosing_breakables = self.enclosing_breakables.borrow_mut();
4951             let ctxt = enclosing_breakables.find_breakable(blk.hir_id);
4952             let coerce = ctxt.coerce.as_mut().unwrap();
4953             if let Some(tail_expr_ty) = tail_expr_ty {
4954                 let tail_expr = tail_expr.unwrap();
4955                 let cause = self.cause(tail_expr.span,
4956                                        ObligationCauseCode::BlockTailExpression(blk.hir_id));
4957                 coerce.coerce(self,
4958                               &cause,
4959                               tail_expr,
4960                               tail_expr_ty);
4961             } else {
4962                 // Subtle: if there is no explicit tail expression,
4963                 // that is typically equivalent to a tail expression
4964                 // of `()` -- except if the block diverges. In that
4965                 // case, there is no value supplied from the tail
4966                 // expression (assuming there are no other breaks,
4967                 // this implies that the type of the block will be
4968                 // `!`).
4969                 //
4970                 // #41425 -- label the implicit `()` as being the
4971                 // "found type" here, rather than the "expected type".
4972                 if !self.diverges.get().always() {
4973                     // #50009 -- Do not point at the entire fn block span, point at the return type
4974                     // span, as it is the cause of the requirement, and
4975                     // `consider_hint_about_removing_semicolon` will point at the last expression
4976                     // if it were a relevant part of the error. This improves usability in editors
4977                     // that highlight errors inline.
4978                     let mut sp = blk.span;
4979                     let mut fn_span = None;
4980                     if let Some((decl, ident)) = self.get_parent_fn_decl(blk.hir_id) {
4981                         let ret_sp = decl.output.span();
4982                         if let Some(block_sp) = self.parent_item_span(blk.hir_id) {
4983                             // HACK: on some cases (`ui/liveness/liveness-issue-2163.rs`) the
4984                             // output would otherwise be incorrect and even misleading. Make sure
4985                             // the span we're aiming at correspond to a `fn` body.
4986                             if block_sp == blk.span {
4987                                 sp = ret_sp;
4988                                 fn_span = Some(ident.span);
4989                             }
4990                         }
4991                     }
4992                     coerce.coerce_forced_unit(self, &self.misc(sp), &mut |err| {
4993                         if let Some(expected_ty) = expected.only_has_type(self) {
4994                             self.consider_hint_about_removing_semicolon(blk, expected_ty, err);
4995                         }
4996                         if let Some(fn_span) = fn_span {
4997                             err.span_label(fn_span, "this function's body doesn't return");
4998                         }
4999                     }, false);
5000                 }
5001             }
5002         });
5003
5004         if ctxt.may_break {
5005             // If we can break from the block, then the block's exit is always reachable
5006             // (... as long as the entry is reachable) - regardless of the tail of the block.
5007             self.diverges.set(prev_diverges);
5008         }
5009
5010         let mut ty = ctxt.coerce.unwrap().complete(self);
5011
5012         if self.has_errors.get() || ty.references_error() {
5013             ty = self.tcx.types.err
5014         }
5015
5016         self.write_ty(blk.hir_id, ty);
5017
5018         *self.ps.borrow_mut() = prev;
5019         ty
5020     }
5021
5022     fn parent_item_span(&self, id: hir::HirId) -> Option<Span> {
5023         let node = self.tcx.hir().get_by_hir_id(self.tcx.hir().get_parent_item(id));
5024         match node {
5025             Node::Item(&hir::Item {
5026                 node: hir::ItemKind::Fn(_, _, _, body_id), ..
5027             }) |
5028             Node::ImplItem(&hir::ImplItem {
5029                 node: hir::ImplItemKind::Method(_, body_id), ..
5030             }) => {
5031                 let body = self.tcx.hir().body(body_id);
5032                 if let ExprKind::Block(block, _) = &body.value.node {
5033                     return Some(block.span);
5034                 }
5035             }
5036             _ => {}
5037         }
5038         None
5039     }
5040
5041     /// Given a function block's `HirId`, returns its `FnDecl` if it exists, or `None` otherwise.
5042     fn get_parent_fn_decl(&self, blk_id: hir::HirId) -> Option<(hir::FnDecl, ast::Ident)> {
5043         let parent = self.tcx.hir().get_by_hir_id(self.tcx.hir().get_parent_item(blk_id));
5044         self.get_node_fn_decl(parent).map(|(fn_decl, ident, _)| (fn_decl, ident))
5045     }
5046
5047     /// Given a function `Node`, return its `FnDecl` if it exists, or `None` otherwise.
5048     fn get_node_fn_decl(&self, node: Node<'_>) -> Option<(hir::FnDecl, ast::Ident, bool)> {
5049         match node {
5050             Node::Item(&hir::Item {
5051                 ident, node: hir::ItemKind::Fn(ref decl, ..), ..
5052             }) => decl.clone().and_then(|decl| {
5053                 // This is less than ideal, it will not suggest a return type span on any
5054                 // method called `main`, regardless of whether it is actually the entry point,
5055                 // but it will still present it as the reason for the expected type.
5056                 Some((decl, ident, ident.name != sym::main))
5057             }),
5058             Node::TraitItem(&hir::TraitItem {
5059                 ident, node: hir::TraitItemKind::Method(hir::MethodSig {
5060                     ref decl, ..
5061                 }, ..), ..
5062             }) => decl.clone().and_then(|decl| Some((decl, ident, true))),
5063             Node::ImplItem(&hir::ImplItem {
5064                 ident, node: hir::ImplItemKind::Method(hir::MethodSig {
5065                     ref decl, ..
5066                 }, ..), ..
5067             }) => decl.clone().and_then(|decl| Some((decl, ident, false))),
5068             _ => None,
5069         }
5070     }
5071
5072     /// Given a `HirId`, return the `FnDecl` of the method it is enclosed by and whether a
5073     /// suggestion can be made, `None` otherwise.
5074     pub fn get_fn_decl(&self, blk_id: hir::HirId) -> Option<(hir::FnDecl, bool)> {
5075         // Get enclosing Fn, if it is a function or a trait method, unless there's a `loop` or
5076         // `while` before reaching it, as block tail returns are not available in them.
5077         self.tcx.hir().get_return_block(blk_id).and_then(|blk_id| {
5078             let parent = self.tcx.hir().get_by_hir_id(blk_id);
5079             self.get_node_fn_decl(parent).map(|(fn_decl, _, is_main)| (fn_decl, is_main))
5080         })
5081     }
5082
5083     /// On implicit return expressions with mismatched types, provides the following suggestions:
5084     ///
5085     /// - Points out the method's return type as the reason for the expected type.
5086     /// - Possible missing semicolon.
5087     /// - Possible missing return type if the return type is the default, and not `fn main()`.
5088     pub fn suggest_mismatched_types_on_tail(
5089         &self,
5090         err: &mut DiagnosticBuilder<'tcx>,
5091         expression: &'tcx hir::Expr,
5092         expected: Ty<'tcx>,
5093         found: Ty<'tcx>,
5094         cause_span: Span,
5095         blk_id: hir::HirId,
5096     ) -> bool {
5097         self.suggest_missing_semicolon(err, expression, expected, cause_span);
5098         let mut pointing_at_return_type = false;
5099         if let Some((fn_decl, can_suggest)) = self.get_fn_decl(blk_id) {
5100             pointing_at_return_type = self.suggest_missing_return_type(
5101                 err, &fn_decl, expected, found, can_suggest);
5102         }
5103         self.suggest_ref_or_into(err, expression, expected, found);
5104         pointing_at_return_type
5105     }
5106
5107     pub fn suggest_ref_or_into(
5108         &self,
5109         err: &mut DiagnosticBuilder<'tcx>,
5110         expr: &hir::Expr,
5111         expected: Ty<'tcx>,
5112         found: Ty<'tcx>,
5113     ) {
5114         if let Some((sp, msg, suggestion)) = self.check_ref(expr, found, expected) {
5115             err.span_suggestion(
5116                 sp,
5117                 msg,
5118                 suggestion,
5119                 Applicability::MachineApplicable,
5120             );
5121         } else if !self.check_for_cast(err, expr, found, expected) {
5122             let is_struct_pat_shorthand_field = self.is_hir_id_from_struct_pattern_shorthand_field(
5123                 expr.hir_id,
5124                 expr.span,
5125             );
5126             let methods = self.get_conversion_methods(expr.span, expected, found);
5127             if let Ok(expr_text) = self.sess().source_map().span_to_snippet(expr.span) {
5128                 let mut suggestions = iter::repeat(&expr_text).zip(methods.iter())
5129                     .filter_map(|(receiver, method)| {
5130                         let method_call = format!(".{}()", method.ident);
5131                         if receiver.ends_with(&method_call) {
5132                             None  // do not suggest code that is already there (#53348)
5133                         } else {
5134                             let method_call_list = [".to_vec()", ".to_string()"];
5135                             let sugg = if receiver.ends_with(".clone()")
5136                                     && method_call_list.contains(&method_call.as_str()) {
5137                                 let max_len = receiver.rfind(".").unwrap();
5138                                 format!("{}{}", &receiver[..max_len], method_call)
5139                             } else {
5140                                 format!("{}{}", receiver, method_call)
5141                             };
5142                             Some(if is_struct_pat_shorthand_field {
5143                                 format!("{}: {}", receiver, sugg)
5144                             } else {
5145                                 sugg
5146                             })
5147                         }
5148                     }).peekable();
5149                 if suggestions.peek().is_some() {
5150                     err.span_suggestions(
5151                         expr.span,
5152                         "try using a conversion method",
5153                         suggestions,
5154                         Applicability::MaybeIncorrect,
5155                     );
5156                 }
5157             }
5158         }
5159     }
5160
5161     /// A common error is to forget to add a semicolon at the end of a block, e.g.,
5162     ///
5163     /// ```
5164     /// fn foo() {
5165     ///     bar_that_returns_u32()
5166     /// }
5167     /// ```
5168     ///
5169     /// This routine checks if the return expression in a block would make sense on its own as a
5170     /// statement and the return type has been left as default or has been specified as `()`. If so,
5171     /// it suggests adding a semicolon.
5172     fn suggest_missing_semicolon(
5173         &self,
5174         err: &mut DiagnosticBuilder<'tcx>,
5175         expression: &'tcx hir::Expr,
5176         expected: Ty<'tcx>,
5177         cause_span: Span,
5178     ) {
5179         if expected.is_unit() {
5180             // `BlockTailExpression` only relevant if the tail expr would be
5181             // useful on its own.
5182             match expression.node {
5183                 ExprKind::Call(..) |
5184                 ExprKind::MethodCall(..) |
5185                 ExprKind::While(..) |
5186                 ExprKind::Loop(..) |
5187                 ExprKind::Match(..) |
5188                 ExprKind::Block(..) => {
5189                     let sp = self.tcx.sess.source_map().next_point(cause_span);
5190                     err.span_suggestion(
5191                         sp,
5192                         "try adding a semicolon",
5193                         ";".to_string(),
5194                         Applicability::MachineApplicable);
5195                 }
5196                 _ => (),
5197             }
5198         }
5199     }
5200
5201     /// A possible error is to forget to add a return type that is needed:
5202     ///
5203     /// ```
5204     /// fn foo() {
5205     ///     bar_that_returns_u32()
5206     /// }
5207     /// ```
5208     ///
5209     /// This routine checks if the return type is left as default, the method is not part of an
5210     /// `impl` block and that it isn't the `main` method. If so, it suggests setting the return
5211     /// type.
5212     fn suggest_missing_return_type(
5213         &self,
5214         err: &mut DiagnosticBuilder<'tcx>,
5215         fn_decl: &hir::FnDecl,
5216         expected: Ty<'tcx>,
5217         found: Ty<'tcx>,
5218         can_suggest: bool,
5219     ) -> bool {
5220         // Only suggest changing the return type for methods that
5221         // haven't set a return type at all (and aren't `fn main()` or an impl).
5222         match (&fn_decl.output, found.is_suggestable(), can_suggest, expected.is_unit()) {
5223             (&hir::FunctionRetTy::DefaultReturn(span), true, true, true) => {
5224                 err.span_suggestion(
5225                     span,
5226                     "try adding a return type",
5227                     format!("-> {} ", self.resolve_type_vars_with_obligations(found)),
5228                     Applicability::MachineApplicable);
5229                 true
5230             }
5231             (&hir::FunctionRetTy::DefaultReturn(span), false, true, true) => {
5232                 err.span_label(span, "possibly return type missing here?");
5233                 true
5234             }
5235             (&hir::FunctionRetTy::DefaultReturn(span), _, false, true) => {
5236                 // `fn main()` must return `()`, do not suggest changing return type
5237                 err.span_label(span, "expected `()` because of default return type");
5238                 true
5239             }
5240             // expectation was caused by something else, not the default return
5241             (&hir::FunctionRetTy::DefaultReturn(_), _, _, false) => false,
5242             (&hir::FunctionRetTy::Return(ref ty), _, _, _) => {
5243                 // Only point to return type if the expected type is the return type, as if they
5244                 // are not, the expectation must have been caused by something else.
5245                 debug!("suggest_missing_return_type: return type {:?} node {:?}", ty, ty.node);
5246                 let sp = ty.span;
5247                 let ty = AstConv::ast_ty_to_ty(self, ty);
5248                 debug!("suggest_missing_return_type: return type {:?}", ty);
5249                 debug!("suggest_missing_return_type: expected type {:?}", ty);
5250                 if ty.sty == expected.sty {
5251                     err.span_label(sp, format!("expected `{}` because of return type",
5252                                                expected));
5253                     return true;
5254                 }
5255                 false
5256             }
5257         }
5258     }
5259
5260     /// A common error is to add an extra semicolon:
5261     ///
5262     /// ```
5263     /// fn foo() -> usize {
5264     ///     22;
5265     /// }
5266     /// ```
5267     ///
5268     /// This routine checks if the final statement in a block is an
5269     /// expression with an explicit semicolon whose type is compatible
5270     /// with `expected_ty`. If so, it suggests removing the semicolon.
5271     fn consider_hint_about_removing_semicolon(
5272         &self,
5273         blk: &'tcx hir::Block,
5274         expected_ty: Ty<'tcx>,
5275         err: &mut DiagnosticBuilder<'_>,
5276     ) {
5277         if let Some(span_semi) = self.could_remove_semicolon(blk, expected_ty) {
5278             err.span_suggestion(
5279                 span_semi,
5280                 "consider removing this semicolon",
5281                 String::new(),
5282                 Applicability::MachineApplicable,
5283             );
5284         }
5285     }
5286
5287     fn could_remove_semicolon(&self, blk: &'tcx hir::Block, expected_ty: Ty<'tcx>) -> Option<Span> {
5288         // Be helpful when the user wrote `{... expr;}` and
5289         // taking the `;` off is enough to fix the error.
5290         let last_stmt = blk.stmts.last()?;
5291         let last_expr = match last_stmt.node {
5292             hir::StmtKind::Semi(ref e) => e,
5293             _ => return None,
5294         };
5295         let last_expr_ty = self.node_ty(last_expr.hir_id);
5296         if self.can_sub(self.param_env, last_expr_ty, expected_ty).is_err() {
5297             return None;
5298         }
5299         let original_span = original_sp(last_stmt.span, blk.span);
5300         Some(original_span.with_lo(original_span.hi() - BytePos(1)))
5301     }
5302
5303     // Rewrite `SelfCtor` to `Ctor`
5304     pub fn rewrite_self_ctor(
5305         &self,
5306         res: Res,
5307         span: Span,
5308     ) -> Result<Res, ErrorReported> {
5309         let tcx = self.tcx;
5310         if let Res::SelfCtor(impl_def_id) = res {
5311             let ty = self.impl_self_ty(span, impl_def_id).ty;
5312             let adt_def = ty.ty_adt_def();
5313
5314             match adt_def {
5315                 Some(adt_def) if adt_def.has_ctor() => {
5316                     let variant = adt_def.non_enum_variant();
5317                     let ctor_def_id = variant.ctor_def_id.unwrap();
5318                     Ok(Res::Def(DefKind::Ctor(CtorOf::Struct, variant.ctor_kind), ctor_def_id))
5319                 }
5320                 _ => {
5321                     let mut err = tcx.sess.struct_span_err(span,
5322                         "the `Self` constructor can only be used with tuple or unit structs");
5323                     if let Some(adt_def) = adt_def {
5324                         match adt_def.adt_kind() {
5325                             AdtKind::Enum => {
5326                                 err.help("did you mean to use one of the enum's variants?");
5327                             },
5328                             AdtKind::Struct |
5329                             AdtKind::Union => {
5330                                 err.span_suggestion(
5331                                     span,
5332                                     "use curly brackets",
5333                                     String::from("Self { /* fields */ }"),
5334                                     Applicability::HasPlaceholders,
5335                                 );
5336                             }
5337                         }
5338                     }
5339                     err.emit();
5340
5341                     Err(ErrorReported)
5342                 }
5343             }
5344         } else {
5345             Ok(res)
5346         }
5347     }
5348
5349     // Instantiates the given path, which must refer to an item with the given
5350     // number of type parameters and type.
5351     pub fn instantiate_value_path(&self,
5352                                   segments: &[hir::PathSegment],
5353                                   self_ty: Option<Ty<'tcx>>,
5354                                   res: Res,
5355                                   span: Span,
5356                                   hir_id: hir::HirId)
5357                                   -> (Ty<'tcx>, Res) {
5358         debug!(
5359             "instantiate_value_path(segments={:?}, self_ty={:?}, res={:?}, hir_id={})",
5360             segments,
5361             self_ty,
5362             res,
5363             hir_id,
5364         );
5365
5366         let tcx = self.tcx;
5367
5368         let res = match self.rewrite_self_ctor(res, span) {
5369             Ok(res) => res,
5370             Err(ErrorReported) => return (tcx.types.err, res),
5371         };
5372         let path_segs = match res {
5373             Res::Local(_) => vec![],
5374             Res::Def(kind, def_id) =>
5375                 AstConv::def_ids_for_value_path_segments(self, segments, self_ty, kind, def_id),
5376             _ => bug!("instantiate_value_path on {:?}", res),
5377         };
5378
5379         let mut user_self_ty = None;
5380         let mut is_alias_variant_ctor = false;
5381         match res {
5382             Res::Def(DefKind::Ctor(CtorOf::Variant, _), _) => {
5383                 if let Some(self_ty) = self_ty {
5384                     let adt_def = self_ty.ty_adt_def().unwrap();
5385                     user_self_ty = Some(UserSelfTy {
5386                         impl_def_id: adt_def.did,
5387                         self_ty,
5388                     });
5389                     is_alias_variant_ctor = true;
5390                 }
5391             }
5392             Res::Def(DefKind::Method, def_id)
5393             | Res::Def(DefKind::AssocConst, def_id) => {
5394                 let container = tcx.associated_item(def_id).container;
5395                 debug!("instantiate_value_path: def_id={:?} container={:?}", def_id, container);
5396                 match container {
5397                     ty::TraitContainer(trait_did) => {
5398                         callee::check_legal_trait_for_method_call(tcx, span, trait_did)
5399                     }
5400                     ty::ImplContainer(impl_def_id) => {
5401                         if segments.len() == 1 {
5402                             // `<T>::assoc` will end up here, and so
5403                             // can `T::assoc`. It this came from an
5404                             // inherent impl, we need to record the
5405                             // `T` for posterity (see `UserSelfTy` for
5406                             // details).
5407                             let self_ty = self_ty.expect("UFCS sugared assoc missing Self");
5408                             user_self_ty = Some(UserSelfTy {
5409                                 impl_def_id,
5410                                 self_ty,
5411                             });
5412                         }
5413                     }
5414                 }
5415             }
5416             _ => {}
5417         }
5418
5419         // Now that we have categorized what space the parameters for each
5420         // segment belong to, let's sort out the parameters that the user
5421         // provided (if any) into their appropriate spaces. We'll also report
5422         // errors if type parameters are provided in an inappropriate place.
5423
5424         let generic_segs: FxHashSet<_> = path_segs.iter().map(|PathSeg(_, index)| index).collect();
5425         let generics_has_err = AstConv::prohibit_generics(
5426                 self, segments.iter().enumerate().filter_map(|(index, seg)| {
5427             if !generic_segs.contains(&index) || is_alias_variant_ctor {
5428                 Some(seg)
5429             } else {
5430                 None
5431             }
5432         }));
5433
5434         if let Res::Local(hid) = res {
5435             let ty = self.local_ty(span, hid).decl_ty;
5436             let ty = self.normalize_associated_types_in(span, &ty);
5437             self.write_ty(hir_id, ty);
5438             return (ty, res);
5439         }
5440
5441         if generics_has_err {
5442             // Don't try to infer type parameters when prohibited generic arguments were given.
5443             user_self_ty = None;
5444         }
5445
5446         // Now we have to compare the types that the user *actually*
5447         // provided against the types that were *expected*. If the user
5448         // did not provide any types, then we want to substitute inference
5449         // variables. If the user provided some types, we may still need
5450         // to add defaults. If the user provided *too many* types, that's
5451         // a problem.
5452
5453         let mut infer_args_for_err = FxHashSet::default();
5454         for &PathSeg(def_id, index) in &path_segs {
5455             let seg = &segments[index];
5456             let generics = tcx.generics_of(def_id);
5457             // Argument-position `impl Trait` is treated as a normal generic
5458             // parameter internally, but we don't allow users to specify the
5459             // parameter's value explicitly, so we have to do some error-
5460             // checking here.
5461             let suppress_errors = AstConv::check_generic_arg_count_for_call(
5462                 tcx,
5463                 span,
5464                 &generics,
5465                 &seg,
5466                 false, // `is_method_call`
5467             );
5468             if suppress_errors {
5469                 infer_args_for_err.insert(index);
5470                 self.set_tainted_by_errors(); // See issue #53251.
5471             }
5472         }
5473
5474         let has_self = path_segs.last().map(|PathSeg(def_id, _)| {
5475             tcx.generics_of(*def_id).has_self
5476         }).unwrap_or(false);
5477
5478         let def_id = res.def_id();
5479
5480         // The things we are substituting into the type should not contain
5481         // escaping late-bound regions, and nor should the base type scheme.
5482         let ty = tcx.type_of(def_id);
5483
5484         let substs = AstConv::create_substs_for_generic_args(
5485             tcx,
5486             def_id,
5487             &[][..],
5488             has_self,
5489             self_ty,
5490             // Provide the generic args, and whether types should be inferred.
5491             |def_id| {
5492                 if let Some(&PathSeg(_, index)) = path_segs.iter().find(|&PathSeg(did, _)| {
5493                     *did == def_id
5494                 }) {
5495                     // If we've encountered an `impl Trait`-related error, we're just
5496                     // going to infer the arguments for better error messages.
5497                     if !infer_args_for_err.contains(&index) {
5498                         // Check whether the user has provided generic arguments.
5499                         if let Some(ref data) = segments[index].args {
5500                             return (Some(data), segments[index].infer_args);
5501                         }
5502                     }
5503                     return (None, segments[index].infer_args);
5504                 }
5505
5506                 (None, true)
5507             },
5508             // Provide substitutions for parameters for which (valid) arguments have been provided.
5509             |param, arg| {
5510                 match (&param.kind, arg) {
5511                     (GenericParamDefKind::Lifetime, GenericArg::Lifetime(lt)) => {
5512                         AstConv::ast_region_to_region(self, lt, Some(param)).into()
5513                     }
5514                     (GenericParamDefKind::Type { .. }, GenericArg::Type(ty)) => {
5515                         self.to_ty(ty).into()
5516                     }
5517                     (GenericParamDefKind::Const, GenericArg::Const(ct)) => {
5518                         self.to_const(&ct.value, self.tcx.type_of(param.def_id)).into()
5519                     }
5520                     _ => unreachable!(),
5521                 }
5522             },
5523             // Provide substitutions for parameters for which arguments are inferred.
5524             |substs, param, infer_args| {
5525                 match param.kind {
5526                     GenericParamDefKind::Lifetime => {
5527                         self.re_infer(Some(param), span).unwrap().into()
5528                     }
5529                     GenericParamDefKind::Type { has_default, .. } => {
5530                         if !infer_args && has_default {
5531                             // If we have a default, then we it doesn't matter that we're not
5532                             // inferring the type arguments: we provide the default where any
5533                             // is missing.
5534                             let default = tcx.type_of(param.def_id);
5535                             self.normalize_ty(
5536                                 span,
5537                                 default.subst_spanned(tcx, substs.unwrap(), Some(span))
5538                             ).into()
5539                         } else {
5540                             // If no type arguments were provided, we have to infer them.
5541                             // This case also occurs as a result of some malformed input, e.g.
5542                             // a lifetime argument being given instead of a type parameter.
5543                             // Using inference instead of `Error` gives better error messages.
5544                             self.var_for_def(span, param)
5545                         }
5546                     }
5547                     GenericParamDefKind::Const => {
5548                         // FIXME(const_generics:defaults)
5549                         // No const parameters were provided, we have to infer them.
5550                         self.var_for_def(span, param)
5551                     }
5552                 }
5553             },
5554         );
5555         assert!(!substs.has_escaping_bound_vars());
5556         assert!(!ty.has_escaping_bound_vars());
5557
5558         // First, store the "user substs" for later.
5559         self.write_user_type_annotation_from_substs(hir_id, def_id, substs, user_self_ty);
5560
5561         // Add all the obligations that are required, substituting and
5562         // normalized appropriately.
5563         let bounds = self.instantiate_bounds(span, def_id, &substs);
5564         self.add_obligations_for_parameters(
5565             traits::ObligationCause::new(span, self.body_id, traits::ItemObligation(def_id)),
5566             &bounds);
5567
5568         // Substitute the values for the type parameters into the type of
5569         // the referenced item.
5570         let ty_substituted = self.instantiate_type_scheme(span, &substs, &ty);
5571
5572         if let Some(UserSelfTy { impl_def_id, self_ty }) = user_self_ty {
5573             // In the case of `Foo<T>::method` and `<Foo<T>>::method`, if `method`
5574             // is inherent, there is no `Self` parameter; instead, the impl needs
5575             // type parameters, which we can infer by unifying the provided `Self`
5576             // with the substituted impl type.
5577             // This also occurs for an enum variant on a type alias.
5578             let ty = tcx.type_of(impl_def_id);
5579
5580             let impl_ty = self.instantiate_type_scheme(span, &substs, &ty);
5581             match self.at(&self.misc(span), self.param_env).sup(impl_ty, self_ty) {
5582                 Ok(ok) => self.register_infer_ok_obligations(ok),
5583                 Err(_) => {
5584                     self.tcx.sess.delay_span_bug(span, &format!(
5585                         "instantiate_value_path: (UFCS) {:?} was a subtype of {:?} but now is not?",
5586                         self_ty,
5587                         impl_ty,
5588                     ));
5589                 }
5590             }
5591         }
5592
5593         self.check_rustc_args_require_const(def_id, hir_id, span);
5594
5595         debug!("instantiate_value_path: type of {:?} is {:?}",
5596                hir_id,
5597                ty_substituted);
5598         self.write_substs(hir_id, substs);
5599
5600         (ty_substituted, res)
5601     }
5602
5603     fn check_rustc_args_require_const(&self,
5604                                       def_id: DefId,
5605                                       hir_id: hir::HirId,
5606                                       span: Span) {
5607         // We're only interested in functions tagged with
5608         // #[rustc_args_required_const], so ignore anything that's not.
5609         if !self.tcx.has_attr(def_id, sym::rustc_args_required_const) {
5610             return
5611         }
5612
5613         // If our calling expression is indeed the function itself, we're good!
5614         // If not, generate an error that this can only be called directly.
5615         if let Node::Expr(expr) = self.tcx.hir().get_by_hir_id(
5616             self.tcx.hir().get_parent_node_by_hir_id(hir_id))
5617         {
5618             if let ExprKind::Call(ref callee, ..) = expr.node {
5619                 if callee.hir_id == hir_id {
5620                     return
5621                 }
5622             }
5623         }
5624
5625         self.tcx.sess.span_err(span, "this function can only be invoked \
5626                                       directly, not through a function pointer");
5627     }
5628
5629     // Resolves `typ` by a single level if `typ` is a type variable.
5630     // If no resolution is possible, then an error is reported.
5631     // Numeric inference variables may be left unresolved.
5632     pub fn structurally_resolved_type(&self, sp: Span, ty: Ty<'tcx>) -> Ty<'tcx> {
5633         let ty = self.resolve_type_vars_with_obligations(ty);
5634         if !ty.is_ty_var() {
5635             ty
5636         } else {
5637             if !self.is_tainted_by_errors() {
5638                 self.need_type_info_err((**self).body_id, sp, ty)
5639                     .note("type must be known at this point")
5640                     .emit();
5641             }
5642             self.demand_suptype(sp, self.tcx.types.err, ty);
5643             self.tcx.types.err
5644         }
5645     }
5646
5647     fn with_breakable_ctxt<F: FnOnce() -> R, R>(
5648         &self,
5649         id: hir::HirId,
5650         ctxt: BreakableCtxt<'tcx>,
5651         f: F,
5652     ) -> (BreakableCtxt<'tcx>, R) {
5653         let index;
5654         {
5655             let mut enclosing_breakables = self.enclosing_breakables.borrow_mut();
5656             index = enclosing_breakables.stack.len();
5657             enclosing_breakables.by_id.insert(id, index);
5658             enclosing_breakables.stack.push(ctxt);
5659         }
5660         let result = f();
5661         let ctxt = {
5662             let mut enclosing_breakables = self.enclosing_breakables.borrow_mut();
5663             debug_assert!(enclosing_breakables.stack.len() == index + 1);
5664             enclosing_breakables.by_id.remove(&id).expect("missing breakable context");
5665             enclosing_breakables.stack.pop().expect("missing breakable context")
5666         };
5667         (ctxt, result)
5668     }
5669
5670     /// Instantiate a QueryResponse in a probe context, without a
5671     /// good ObligationCause.
5672     fn probe_instantiate_query_response(
5673         &self,
5674         span: Span,
5675         original_values: &OriginalQueryValues<'tcx>,
5676         query_result: &Canonical<'tcx, QueryResponse<'tcx, Ty<'tcx>>>,
5677     ) -> InferResult<'tcx, Ty<'tcx>>
5678     {
5679         self.instantiate_query_response_and_region_obligations(
5680             &traits::ObligationCause::misc(span, self.body_id),
5681             self.param_env,
5682             original_values,
5683             query_result)
5684     }
5685
5686     /// Returns `true` if an expression is contained inside the LHS of an assignment expression.
5687     fn expr_in_place(&self, mut expr_id: hir::HirId) -> bool {
5688         let mut contained_in_place = false;
5689
5690         while let hir::Node::Expr(parent_expr) =
5691             self.tcx.hir().get_by_hir_id(self.tcx.hir().get_parent_node_by_hir_id(expr_id))
5692         {
5693             match &parent_expr.node {
5694                 hir::ExprKind::Assign(lhs, ..) | hir::ExprKind::AssignOp(_, lhs, ..) => {
5695                     if lhs.hir_id == expr_id {
5696                         contained_in_place = true;
5697                         break;
5698                     }
5699                 }
5700                 _ => (),
5701             }
5702             expr_id = parent_expr.hir_id;
5703         }
5704
5705         contained_in_place
5706     }
5707 }
5708
5709 pub fn check_bounds_are_used<'tcx>(tcx: TyCtxt<'tcx>, generics: &ty::Generics, ty: Ty<'tcx>) {
5710     let own_counts = generics.own_counts();
5711     debug!(
5712         "check_bounds_are_used(n_tys={}, n_cts={}, ty={:?})",
5713         own_counts.types,
5714         own_counts.consts,
5715         ty
5716     );
5717
5718     if own_counts.types == 0 {
5719         return;
5720     }
5721
5722     // Make a vector of booleans initially false, set to true when used.
5723     let mut types_used = vec![false; own_counts.types];
5724
5725     for leaf_ty in ty.walk() {
5726         if let ty::Param(ty::ParamTy { index, .. }) = leaf_ty.sty {
5727             debug!("Found use of ty param num {}", index);
5728             types_used[index as usize - own_counts.lifetimes] = true;
5729         } else if let ty::Error = leaf_ty.sty {
5730             // If there is already another error, do not emit
5731             // an error for not using a type Parameter.
5732             assert!(tcx.sess.err_count() > 0);
5733             return;
5734         }
5735     }
5736
5737     let types = generics.params.iter().filter(|param| match param.kind {
5738         ty::GenericParamDefKind::Type { .. } => true,
5739         _ => false,
5740     });
5741     for (&used, param) in types_used.iter().zip(types) {
5742         if !used {
5743             let id = tcx.hir().as_local_hir_id(param.def_id).unwrap();
5744             let span = tcx.hir().span_by_hir_id(id);
5745             struct_span_err!(tcx.sess, span, E0091, "type parameter `{}` is unused", param.name)
5746                 .span_label(span, "unused type parameter")
5747                 .emit();
5748         }
5749     }
5750 }
5751
5752 fn fatally_break_rust(sess: &Session) {
5753     let handler = sess.diagnostic();
5754     handler.span_bug_no_panic(
5755         MultiSpan::new(),
5756         "It looks like you're trying to break rust; would you like some ICE?",
5757     );
5758     handler.note_without_error("the compiler expectedly panicked. this is a feature.");
5759     handler.note_without_error(
5760         "we would appreciate a joke overview: \
5761         https://github.com/rust-lang/rust/issues/43162#issuecomment-320764675"
5762     );
5763     handler.note_without_error(&format!("rustc {} running on {}",
5764         option_env!("CFG_VERSION").unwrap_or("unknown_version"),
5765         crate::session::config::host_triple(),
5766     ));
5767 }
5768
5769 fn potentially_plural_count(count: usize, word: &str) -> String {
5770     format!("{} {}{}", count, word, if count == 1 { "" } else { "s" })
5771 }