]> git.lizzy.rs Git - rust.git/blob - src/librustc_typeck/check/mod.rs
Auto merge of #61771 - ehuss:update-cargo, r=alexcrichton
[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 mod expr;
78 pub mod method;
79 mod upvar;
80 mod wfcheck;
81 mod cast;
82 mod closure;
83 mod callee;
84 mod compare_method;
85 mod generator_interior;
86 pub mod intrinsic;
87 mod op;
88
89 use crate::astconv::{AstConv, PathSeg};
90 use errors::{Applicability, DiagnosticBuilder, DiagnosticId};
91 use rustc::hir::{self, ExprKind, GenericArg, ItemKind, Node, PatKind, QPath};
92 use rustc::hir::def::{CtorOf, Res, DefKind};
93 use rustc::hir::def_id::{CrateNum, DefId, LOCAL_CRATE};
94 use rustc::hir::intravisit::{self, Visitor, NestedVisitorMap};
95 use rustc::hir::itemlikevisit::ItemLikeVisitor;
96 use crate::middle::lang_items;
97 use crate::namespace::Namespace;
98 use rustc::infer::{self, InferCtxt, InferOk, InferResult};
99 use rustc::infer::canonical::{Canonical, OriginalQueryValues, QueryResponse};
100 use rustc_data_structures::indexed_vec::Idx;
101 use rustc_target::spec::abi::Abi;
102 use rustc::infer::opaque_types::OpaqueTypeDecl;
103 use rustc::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
104 use rustc::infer::unify_key::{ConstVariableOrigin, ConstVariableOriginKind};
105 use rustc::middle::region;
106 use rustc::mir::interpret::{ConstValue, GlobalId};
107 use rustc::traits::{self, ObligationCause, ObligationCauseCode, TraitEngine};
108 use rustc::ty::{
109     self, AdtKind, CanonicalUserType, Ty, TyCtxt, Const, GenericParamDefKind,
110     ToPolyTraitRef, ToPredicate, RegionKind, UserType
111 };
112 use rustc::ty::adjustment::{
113     Adjust, Adjustment, AllowTwoPhase, AutoBorrow, AutoBorrowMutability, PointerCast
114 };
115 use rustc::ty::fold::TypeFoldable;
116 use rustc::ty::query::Providers;
117 use rustc::ty::subst::{UnpackedKind, Subst, InternalSubsts, SubstsRef, UserSelfTy, UserSubsts};
118 use rustc::ty::util::{Representability, IntTypeExt, Discr};
119 use rustc::ty::layout::VariantIdx;
120 use syntax_pos::{self, BytePos, Span, MultiSpan};
121 use syntax_pos::hygiene::CompilerDesugaringKind;
122 use syntax::ast;
123 use syntax::attr;
124 use syntax::feature_gate::{GateIssue, emit_feature_err};
125 use syntax::ptr::P;
126 use syntax::source_map::{DUMMY_SP, original_sp};
127 use syntax::symbol::{kw, sym};
128
129 use std::cell::{Cell, RefCell, Ref, RefMut};
130 use std::collections::hash_map::Entry;
131 use std::cmp;
132 use std::iter;
133 use std::mem::replace;
134 use std::ops::{self, Deref};
135 use std::slice;
136
137 use crate::require_c_abi_if_c_variadic;
138 use crate::session::Session;
139 use crate::session::config::EntryFnType;
140 use crate::TypeAndSubsts;
141 use crate::lint;
142 use crate::util::captures::Captures;
143 use crate::util::common::{ErrorReported, indenter};
144 use crate::util::nodemap::{DefIdMap, DefIdSet, FxHashSet, HirIdMap};
145
146 pub use self::Expectation::*;
147 use self::autoderef::Autoderef;
148 use self::callee::DeferredCallResolution;
149 use self::coercion::{CoerceMany, DynamicCoerceMany};
150 pub use self::compare_method::{compare_impl_method, compare_const_impl};
151 use self::method::{MethodCallee, SelfSource};
152 use self::TupleArgumentsFlag::*;
153
154 /// The type of a local binding, including the revealed type for anon types.
155 #[derive(Copy, Clone)]
156 pub struct LocalTy<'tcx> {
157     decl_ty: Ty<'tcx>,
158     revealed_ty: Ty<'tcx>
159 }
160
161 /// A wrapper for `InferCtxt`'s `in_progress_tables` field.
162 #[derive(Copy, Clone)]
163 struct MaybeInProgressTables<'a, 'tcx: 'a> {
164     maybe_tables: Option<&'a RefCell<ty::TypeckTables<'tcx>>>,
165 }
166
167 impl<'a, 'tcx> MaybeInProgressTables<'a, 'tcx> {
168     fn borrow(self) -> Ref<'a, ty::TypeckTables<'tcx>> {
169         match self.maybe_tables {
170             Some(tables) => tables.borrow(),
171             None => {
172                 bug!("MaybeInProgressTables: inh/fcx.tables.borrow() with no tables")
173             }
174         }
175     }
176
177     fn borrow_mut(self) -> RefMut<'a, ty::TypeckTables<'tcx>> {
178         match self.maybe_tables {
179             Some(tables) => tables.borrow_mut(),
180             None => {
181                 bug!("MaybeInProgressTables: inh/fcx.tables.borrow_mut() with no tables")
182             }
183         }
184     }
185 }
186
187 /// Closures defined within the function. For example:
188 ///
189 ///     fn foo() {
190 ///         bar(move|| { ... })
191 ///     }
192 ///
193 /// Here, the function `foo()` and the closure passed to
194 /// `bar()` will each have their own `FnCtxt`, but they will
195 /// share the inherited fields.
196 pub struct Inherited<'a, 'tcx: 'a> {
197     infcx: InferCtxt<'a, 'tcx>,
198
199     tables: MaybeInProgressTables<'a, 'tcx>,
200
201     locals: RefCell<HirIdMap<LocalTy<'tcx>>>,
202
203     fulfillment_cx: RefCell<Box<dyn TraitEngine<'tcx>>>,
204
205     // Some additional `Sized` obligations badly affect type inference.
206     // These obligations are added in a later stage of typeck.
207     deferred_sized_obligations: RefCell<Vec<(Ty<'tcx>, Span, traits::ObligationCauseCode<'tcx>)>>,
208
209     // When we process a call like `c()` where `c` is a closure type,
210     // we may not have decided yet whether `c` is a `Fn`, `FnMut`, or
211     // `FnOnce` closure. In that case, we defer full resolution of the
212     // call until upvar inference can kick in and make the
213     // decision. We keep these deferred resolutions grouped by the
214     // def-id of the closure, so that once we decide, we can easily go
215     // back and process them.
216     deferred_call_resolutions: RefCell<DefIdMap<Vec<DeferredCallResolution<'tcx>>>>,
217
218     deferred_cast_checks: RefCell<Vec<cast::CastCheck<'tcx>>>,
219
220     deferred_generator_interiors: RefCell<Vec<(hir::BodyId, Ty<'tcx>)>>,
221
222     // Opaque types found in explicit return types and their
223     // associated fresh inference variable. Writeback resolves these
224     // variables to get the concrete type, which can be used to
225     // 'de-opaque' OpaqueTypeDecl, after typeck is done with all functions.
226     opaque_types: RefCell<DefIdMap<OpaqueTypeDecl<'tcx>>>,
227
228     /// Each type parameter has an implicit region bound that
229     /// indicates it must outlive at least the function body (the user
230     /// may specify stronger requirements). This field indicates the
231     /// region of the callee. If it is `None`, then the parameter
232     /// environment is for an item or something where the "callee" is
233     /// not clear.
234     implicit_region_bound: Option<ty::Region<'tcx>>,
235
236     body_id: Option<hir::BodyId>,
237 }
238
239 impl<'a, 'tcx> Deref for Inherited<'a, 'tcx> {
240     type Target = InferCtxt<'a, 'tcx>;
241     fn deref(&self) -> &Self::Target {
242         &self.infcx
243     }
244 }
245
246 /// When type-checking an expression, we propagate downward
247 /// whatever type hint we are able in the form of an `Expectation`.
248 #[derive(Copy, Clone, Debug)]
249 pub enum Expectation<'tcx> {
250     /// We know nothing about what type this expression should have.
251     NoExpectation,
252
253     /// This expression should have the type given (or some subtype).
254     ExpectHasType(Ty<'tcx>),
255
256     /// This expression will be cast to the `Ty`.
257     ExpectCastableToType(Ty<'tcx>),
258
259     /// This rvalue expression will be wrapped in `&` or `Box` and coerced
260     /// to `&Ty` or `Box<Ty>`, respectively. `Ty` is `[A]` or `Trait`.
261     ExpectRvalueLikeUnsized(Ty<'tcx>),
262 }
263
264 impl<'a, 'tcx> Expectation<'tcx> {
265     // Disregard "castable to" expectations because they
266     // can lead us astray. Consider for example `if cond
267     // {22} else {c} as u8` -- if we propagate the
268     // "castable to u8" constraint to 22, it will pick the
269     // type 22u8, which is overly constrained (c might not
270     // be a u8). In effect, the problem is that the
271     // "castable to" expectation is not the tightest thing
272     // we can say, so we want to drop it in this case.
273     // The tightest thing we can say is "must unify with
274     // else branch". Note that in the case of a "has type"
275     // constraint, this limitation does not hold.
276
277     // If the expected type is just a type variable, then don't use
278     // an expected type. Otherwise, we might write parts of the type
279     // when checking the 'then' block which are incompatible with the
280     // 'else' branch.
281     fn adjust_for_branches(&self, fcx: &FnCtxt<'a, 'tcx>) -> Expectation<'tcx> {
282         match *self {
283             ExpectHasType(ety) => {
284                 let ety = fcx.shallow_resolve(ety);
285                 if !ety.is_ty_var() {
286                     ExpectHasType(ety)
287                 } else {
288                     NoExpectation
289                 }
290             }
291             ExpectRvalueLikeUnsized(ety) => {
292                 ExpectRvalueLikeUnsized(ety)
293             }
294             _ => NoExpectation
295         }
296     }
297
298     /// Provides an expectation for an rvalue expression given an *optional*
299     /// hint, which is not required for type safety (the resulting type might
300     /// be checked higher up, as is the case with `&expr` and `box expr`), but
301     /// is useful in determining the concrete type.
302     ///
303     /// The primary use case is where the expected type is a fat pointer,
304     /// like `&[isize]`. For example, consider the following statement:
305     ///
306     ///    let x: &[isize] = &[1, 2, 3];
307     ///
308     /// In this case, the expected type for the `&[1, 2, 3]` expression is
309     /// `&[isize]`. If however we were to say that `[1, 2, 3]` has the
310     /// expectation `ExpectHasType([isize])`, that would be too strong --
311     /// `[1, 2, 3]` does not have the type `[isize]` but rather `[isize; 3]`.
312     /// It is only the `&[1, 2, 3]` expression as a whole that can be coerced
313     /// to the type `&[isize]`. Therefore, we propagate this more limited hint,
314     /// which still is useful, because it informs integer literals and the like.
315     /// See the test case `test/run-pass/coerce-expect-unsized.rs` and #20169
316     /// for examples of where this comes up,.
317     fn rvalue_hint(fcx: &FnCtxt<'a, 'tcx>, ty: Ty<'tcx>) -> Expectation<'tcx> {
318         match fcx.tcx.struct_tail(ty).sty {
319             ty::Slice(_) | ty::Str | ty::Dynamic(..) => {
320                 ExpectRvalueLikeUnsized(ty)
321             }
322             _ => ExpectHasType(ty)
323         }
324     }
325
326     // Resolves `expected` by a single level if it is a variable. If
327     // there is no expected type or resolution is not possible (e.g.,
328     // no constraints yet present), just returns `None`.
329     fn resolve(self, fcx: &FnCtxt<'a, 'tcx>) -> Expectation<'tcx> {
330         match self {
331             NoExpectation => NoExpectation,
332             ExpectCastableToType(t) => {
333                 ExpectCastableToType(fcx.resolve_vars_if_possible(&t))
334             }
335             ExpectHasType(t) => {
336                 ExpectHasType(fcx.resolve_vars_if_possible(&t))
337             }
338             ExpectRvalueLikeUnsized(t) => {
339                 ExpectRvalueLikeUnsized(fcx.resolve_vars_if_possible(&t))
340             }
341         }
342     }
343
344     fn to_option(self, fcx: &FnCtxt<'a, 'tcx>) -> Option<Ty<'tcx>> {
345         match self.resolve(fcx) {
346             NoExpectation => None,
347             ExpectCastableToType(ty) |
348             ExpectHasType(ty) |
349             ExpectRvalueLikeUnsized(ty) => Some(ty),
350         }
351     }
352
353     /// It sometimes happens that we want to turn an expectation into
354     /// a **hard constraint** (i.e., something that must be satisfied
355     /// for the program to type-check). `only_has_type` will return
356     /// such a constraint, if it exists.
357     fn only_has_type(self, fcx: &FnCtxt<'a, 'tcx>) -> Option<Ty<'tcx>> {
358         match self.resolve(fcx) {
359             ExpectHasType(ty) => Some(ty),
360             NoExpectation | ExpectCastableToType(_) | ExpectRvalueLikeUnsized(_) => None,
361         }
362     }
363
364     /// Like `only_has_type`, but instead of returning `None` if no
365     /// hard constraint exists, creates a fresh type variable.
366     fn coercion_target_type(self, fcx: &FnCtxt<'a, 'tcx>, span: Span) -> Ty<'tcx> {
367         self.only_has_type(fcx)
368             .unwrap_or_else(|| {
369                 fcx.next_ty_var(TypeVariableOrigin {
370                     kind: TypeVariableOriginKind::MiscVariable,
371                     span,
372                 })
373             })
374     }
375 }
376
377 #[derive(Copy, Clone, Debug, PartialEq, Eq)]
378 pub enum Needs {
379     MutPlace,
380     None
381 }
382
383 impl Needs {
384     fn maybe_mut_place(m: hir::Mutability) -> Self {
385         match m {
386             hir::MutMutable => Needs::MutPlace,
387             hir::MutImmutable => Needs::None,
388         }
389     }
390 }
391
392 #[derive(Copy, Clone)]
393 pub struct UnsafetyState {
394     pub def: hir::HirId,
395     pub unsafety: hir::Unsafety,
396     pub unsafe_push_count: u32,
397     from_fn: bool
398 }
399
400 impl UnsafetyState {
401     pub fn function(unsafety: hir::Unsafety, def: hir::HirId) -> UnsafetyState {
402         UnsafetyState { def: def, unsafety: unsafety, unsafe_push_count: 0, from_fn: true }
403     }
404
405     pub fn recurse(&mut self, blk: &hir::Block) -> UnsafetyState {
406         match self.unsafety {
407             // If this unsafe, then if the outer function was already marked as
408             // unsafe we shouldn't attribute the unsafe'ness to the block. This
409             // way the block can be warned about instead of ignoring this
410             // extraneous block (functions are never warned about).
411             hir::Unsafety::Unsafe if self.from_fn => *self,
412
413             unsafety => {
414                 let (unsafety, def, count) = match blk.rules {
415                     hir::PushUnsafeBlock(..) =>
416                         (unsafety, blk.hir_id, self.unsafe_push_count.checked_add(1).unwrap()),
417                     hir::PopUnsafeBlock(..) =>
418                         (unsafety, blk.hir_id, self.unsafe_push_count.checked_sub(1).unwrap()),
419                     hir::UnsafeBlock(..) =>
420                         (hir::Unsafety::Unsafe, blk.hir_id, self.unsafe_push_count),
421                     hir::DefaultBlock =>
422                         (unsafety, self.def, self.unsafe_push_count),
423                 };
424                 UnsafetyState{ def,
425                                unsafety,
426                                unsafe_push_count: count,
427                                from_fn: false }
428             }
429         }
430     }
431 }
432
433 #[derive(Debug, Copy, Clone)]
434 pub enum PlaceOp {
435     Deref,
436     Index
437 }
438
439 /// Tracks whether executing a node may exit normally (versus
440 /// return/break/panic, which "diverge", leaving dead code in their
441 /// wake). Tracked semi-automatically (through type variables marked
442 /// as diverging), with some manual adjustments for control-flow
443 /// primitives (approximating a CFG).
444 #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
445 pub enum Diverges {
446     /// Potentially unknown, some cases converge,
447     /// others require a CFG to determine them.
448     Maybe,
449
450     /// Definitely known to diverge and therefore
451     /// not reach the next sibling or its parent.
452     Always,
453
454     /// Same as `Always` but with a reachability
455     /// warning already emitted.
456     WarnedAlways
457 }
458
459 // Convenience impls for combinig `Diverges`.
460
461 impl ops::BitAnd for Diverges {
462     type Output = Self;
463     fn bitand(self, other: Self) -> Self {
464         cmp::min(self, other)
465     }
466 }
467
468 impl ops::BitOr for Diverges {
469     type Output = Self;
470     fn bitor(self, other: Self) -> Self {
471         cmp::max(self, other)
472     }
473 }
474
475 impl ops::BitAndAssign for Diverges {
476     fn bitand_assign(&mut self, other: Self) {
477         *self = *self & other;
478     }
479 }
480
481 impl ops::BitOrAssign for Diverges {
482     fn bitor_assign(&mut self, other: Self) {
483         *self = *self | other;
484     }
485 }
486
487 impl Diverges {
488     fn always(self) -> bool {
489         self >= Diverges::Always
490     }
491 }
492
493 pub struct BreakableCtxt<'tcx> {
494     may_break: bool,
495
496     // this is `null` for loops where break with a value is illegal,
497     // such as `while`, `for`, and `while let`
498     coerce: Option<DynamicCoerceMany<'tcx>>,
499 }
500
501 pub struct EnclosingBreakables<'tcx> {
502     stack: Vec<BreakableCtxt<'tcx>>,
503     by_id: HirIdMap<usize>,
504 }
505
506 impl<'tcx> EnclosingBreakables<'tcx> {
507     fn find_breakable(&mut self, target_id: hir::HirId) -> &mut BreakableCtxt<'tcx> {
508         let ix = *self.by_id.get(&target_id).unwrap_or_else(|| {
509             bug!("could not find enclosing breakable with id {}", target_id);
510         });
511         &mut self.stack[ix]
512     }
513 }
514
515 pub struct FnCtxt<'a, 'tcx: 'a> {
516     body_id: hir::HirId,
517
518     /// The parameter environment used for proving trait obligations
519     /// in this function. This can change when we descend into
520     /// closures (as they bring new things into scope), hence it is
521     /// not part of `Inherited` (as of the time of this writing,
522     /// closures do not yet change the environment, but they will
523     /// eventually).
524     param_env: ty::ParamEnv<'tcx>,
525
526     /// Number of errors that had been reported when we started
527     /// checking this function. On exit, if we find that *more* errors
528     /// have been reported, we will skip regionck and other work that
529     /// expects the types within the function to be consistent.
530     err_count_on_creation: usize,
531
532     ret_coercion: Option<RefCell<DynamicCoerceMany<'tcx>>>,
533     ret_coercion_span: RefCell<Option<Span>>,
534
535     yield_ty: Option<Ty<'tcx>>,
536
537     ps: RefCell<UnsafetyState>,
538
539     /// Whether the last checked node generates a divergence (e.g.,
540     /// `return` will set this to `Always`). In general, when entering
541     /// an expression or other node in the tree, the initial value
542     /// indicates whether prior parts of the containing expression may
543     /// have diverged. It is then typically set to `Maybe` (and the
544     /// old value remembered) for processing the subparts of the
545     /// current expression. As each subpart is processed, they may set
546     /// the flag to `Always`, etc. Finally, at the end, we take the
547     /// result and "union" it with the original value, so that when we
548     /// return the flag indicates if any subpart of the parent
549     /// expression (up to and including this part) has diverged. So,
550     /// if you read it after evaluating a subexpression `X`, the value
551     /// you get indicates whether any subexpression that was
552     /// evaluating up to and including `X` diverged.
553     ///
554     /// We currently use this flag only for diagnostic purposes:
555     ///
556     /// - To warn about unreachable code: if, after processing a
557     ///   sub-expression but before we have applied the effects of the
558     ///   current node, we see that the flag is set to `Always`, we
559     ///   can issue a warning. This corresponds to something like
560     ///   `foo(return)`; we warn on the `foo()` expression. (We then
561     ///   update the flag to `WarnedAlways` to suppress duplicate
562     ///   reports.) Similarly, if we traverse to a fresh statement (or
563     ///   tail expression) from a `Always` setting, we will issue a
564     ///   warning. This corresponds to something like `{return;
565     ///   foo();}` or `{return; 22}`, where we would warn on the
566     ///   `foo()` or `22`.
567     ///
568     /// An expression represents dead code if, after checking it,
569     /// the diverges flag is set to something other than `Maybe`.
570     diverges: Cell<Diverges>,
571
572     /// Whether any child nodes have any type errors.
573     has_errors: Cell<bool>,
574
575     enclosing_breakables: RefCell<EnclosingBreakables<'tcx>>,
576
577     inh: &'a Inherited<'a, 'tcx>,
578 }
579
580 impl<'a, 'tcx> Deref for FnCtxt<'a, 'tcx> {
581     type Target = Inherited<'a, 'tcx>;
582     fn deref(&self) -> &Self::Target {
583         &self.inh
584     }
585 }
586
587 /// Helper type of a temporary returned by `Inherited::build(...)`.
588 /// Necessary because we can't write the following bound:
589 /// `F: for<'b, 'tcx> where 'tcx FnOnce(Inherited<'b, 'tcx>)`.
590 pub struct InheritedBuilder<'tcx> {
591     infcx: infer::InferCtxtBuilder<'tcx>,
592     def_id: DefId,
593 }
594
595 impl Inherited<'_, 'tcx> {
596     pub fn build(tcx: TyCtxt<'tcx>, def_id: DefId) -> InheritedBuilder<'tcx> {
597         let hir_id_root = if def_id.is_local() {
598             let hir_id = tcx.hir().as_local_hir_id(def_id).unwrap();
599             DefId::local(hir_id.owner)
600         } else {
601             def_id
602         };
603
604         InheritedBuilder {
605             infcx: tcx.infer_ctxt().with_fresh_in_progress_tables(hir_id_root),
606             def_id,
607         }
608     }
609 }
610
611 impl<'tcx> InheritedBuilder<'tcx> {
612     fn enter<F, R>(&mut self, f: F) -> R
613     where
614         F: for<'a> FnOnce(Inherited<'a, 'tcx>) -> R,
615     {
616         let def_id = self.def_id;
617         self.infcx.enter(|infcx| f(Inherited::new(infcx, def_id)))
618     }
619 }
620
621 impl Inherited<'a, 'tcx> {
622     fn new(infcx: InferCtxt<'a, 'tcx>, def_id: DefId) -> Self {
623         let tcx = infcx.tcx;
624         let item_id = tcx.hir().as_local_hir_id(def_id);
625         let body_id = item_id.and_then(|id| tcx.hir().maybe_body_owned_by(id));
626         let implicit_region_bound = body_id.map(|body_id| {
627             let body = tcx.hir().body(body_id);
628             tcx.mk_region(ty::ReScope(region::Scope {
629                 id: body.value.hir_id.local_id,
630                 data: region::ScopeData::CallSite
631             }))
632         });
633
634         Inherited {
635             tables: MaybeInProgressTables {
636                 maybe_tables: infcx.in_progress_tables,
637             },
638             infcx,
639             fulfillment_cx: RefCell::new(TraitEngine::new(tcx)),
640             locals: RefCell::new(Default::default()),
641             deferred_sized_obligations: RefCell::new(Vec::new()),
642             deferred_call_resolutions: RefCell::new(Default::default()),
643             deferred_cast_checks: RefCell::new(Vec::new()),
644             deferred_generator_interiors: RefCell::new(Vec::new()),
645             opaque_types: RefCell::new(Default::default()),
646             implicit_region_bound,
647             body_id,
648         }
649     }
650
651     fn register_predicate(&self, obligation: traits::PredicateObligation<'tcx>) {
652         debug!("register_predicate({:?})", obligation);
653         if obligation.has_escaping_bound_vars() {
654             span_bug!(obligation.cause.span, "escaping bound vars in predicate {:?}",
655                       obligation);
656         }
657         self.fulfillment_cx
658             .borrow_mut()
659             .register_predicate_obligation(self, obligation);
660     }
661
662     fn register_predicates<I>(&self, obligations: I)
663         where I: IntoIterator<Item = traits::PredicateObligation<'tcx>>
664     {
665         for obligation in obligations {
666             self.register_predicate(obligation);
667         }
668     }
669
670     fn register_infer_ok_obligations<T>(&self, infer_ok: InferOk<'tcx, T>) -> T {
671         self.register_predicates(infer_ok.obligations);
672         infer_ok.value
673     }
674
675     fn normalize_associated_types_in<T>(&self,
676                                         span: Span,
677                                         body_id: hir::HirId,
678                                         param_env: ty::ParamEnv<'tcx>,
679                                         value: &T) -> T
680         where T : TypeFoldable<'tcx>
681     {
682         let ok = self.partially_normalize_associated_types_in(span, body_id, param_env, value);
683         self.register_infer_ok_obligations(ok)
684     }
685 }
686
687 struct CheckItemTypesVisitor<'tcx> {
688     tcx: TyCtxt<'tcx>,
689 }
690
691 impl ItemLikeVisitor<'tcx> for CheckItemTypesVisitor<'tcx> {
692     fn visit_item(&mut self, i: &'tcx hir::Item) {
693         check_item_type(self.tcx, i);
694     }
695     fn visit_trait_item(&mut self, _: &'tcx hir::TraitItem) { }
696     fn visit_impl_item(&mut self, _: &'tcx hir::ImplItem) { }
697 }
698
699 pub fn check_wf_new<'tcx>(tcx: TyCtxt<'tcx>) -> Result<(), ErrorReported> {
700     tcx.sess.track_errors(|| {
701         let mut visit = wfcheck::CheckTypeWellFormedVisitor::new(tcx);
702         tcx.hir().krate().par_visit_all_item_likes(&mut visit);
703     })
704 }
705
706 fn check_mod_item_types<'tcx>(tcx: TyCtxt<'tcx>, module_def_id: DefId) {
707     tcx.hir().visit_item_likes_in_module(module_def_id, &mut CheckItemTypesVisitor { tcx });
708 }
709
710 fn typeck_item_bodies<'tcx>(tcx: TyCtxt<'tcx>, crate_num: CrateNum) {
711     debug_assert!(crate_num == LOCAL_CRATE);
712     tcx.par_body_owners(|body_owner_def_id| {
713         tcx.ensure().typeck_tables_of(body_owner_def_id);
714     });
715 }
716
717 fn check_item_well_formed<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) {
718     wfcheck::check_item_well_formed(tcx, def_id);
719 }
720
721 fn check_trait_item_well_formed<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) {
722     wfcheck::check_trait_item(tcx, def_id);
723 }
724
725 fn check_impl_item_well_formed<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) {
726     wfcheck::check_impl_item(tcx, def_id);
727 }
728
729 pub fn provide(providers: &mut Providers<'_>) {
730     method::provide(providers);
731     *providers = Providers {
732         typeck_item_bodies,
733         typeck_tables_of,
734         has_typeck_tables,
735         adt_destructor,
736         used_trait_imports,
737         check_item_well_formed,
738         check_trait_item_well_formed,
739         check_impl_item_well_formed,
740         check_mod_item_types,
741         ..*providers
742     };
743 }
744
745 fn adt_destructor<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> Option<ty::Destructor> {
746     tcx.calculate_dtor(def_id, &mut dropck::check_drop_impl)
747 }
748
749 /// If this `DefId` is a "primary tables entry", returns `Some((body_id, decl))`
750 /// with information about it's body-id and fn-decl (if any). Otherwise,
751 /// returns `None`.
752 ///
753 /// If this function returns "some", then `typeck_tables(def_id)` will
754 /// succeed; if it returns `None`, then `typeck_tables(def_id)` may or
755 /// may not succeed. In some cases where this function returns `None`
756 /// (notably closures), `typeck_tables(def_id)` would wind up
757 /// redirecting to the owning function.
758 fn primary_body_of<'tcx>(
759     tcx: TyCtxt<'tcx>,
760     id: hir::HirId,
761 ) -> Option<(hir::BodyId, Option<&'tcx hir::FnDecl>)> {
762     match tcx.hir().get_by_hir_id(id) {
763         Node::Item(item) => {
764             match item.node {
765                 hir::ItemKind::Const(_, body) |
766                 hir::ItemKind::Static(_, _, body) =>
767                     Some((body, None)),
768                 hir::ItemKind::Fn(ref decl, .., body) =>
769                     Some((body, Some(decl))),
770                 _ =>
771                     None,
772             }
773         }
774         Node::TraitItem(item) => {
775             match item.node {
776                 hir::TraitItemKind::Const(_, Some(body)) =>
777                     Some((body, None)),
778                 hir::TraitItemKind::Method(ref sig, hir::TraitMethod::Provided(body)) =>
779                     Some((body, Some(&sig.decl))),
780                 _ =>
781                     None,
782             }
783         }
784         Node::ImplItem(item) => {
785             match item.node {
786                 hir::ImplItemKind::Const(_, body) =>
787                     Some((body, None)),
788                 hir::ImplItemKind::Method(ref sig, body) =>
789                     Some((body, Some(&sig.decl))),
790                 _ =>
791                     None,
792             }
793         }
794         Node::AnonConst(constant) => Some((constant.body, None)),
795         _ => None,
796     }
797 }
798
799 fn has_typeck_tables<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> bool {
800     // Closures' tables come from their outermost function,
801     // as they are part of the same "inference environment".
802     let outer_def_id = tcx.closure_base_def_id(def_id);
803     if outer_def_id != def_id {
804         return tcx.has_typeck_tables(outer_def_id);
805     }
806
807     let id = tcx.hir().as_local_hir_id(def_id).unwrap();
808     primary_body_of(tcx, id).is_some()
809 }
810
811 fn used_trait_imports<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> &'tcx DefIdSet {
812     &*tcx.typeck_tables_of(def_id).used_trait_imports
813 }
814
815 fn typeck_tables_of<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> &'tcx ty::TypeckTables<'tcx> {
816     // Closures' tables come from their outermost function,
817     // as they are part of the same "inference environment".
818     let outer_def_id = tcx.closure_base_def_id(def_id);
819     if outer_def_id != def_id {
820         return tcx.typeck_tables_of(outer_def_id);
821     }
822
823     let id = tcx.hir().as_local_hir_id(def_id).unwrap();
824     let span = tcx.hir().span(id);
825
826     // Figure out what primary body this item has.
827     let (body_id, fn_decl) = primary_body_of(tcx, id).unwrap_or_else(|| {
828         span_bug!(span, "can't type-check body of {:?}", def_id);
829     });
830     let body = tcx.hir().body(body_id);
831
832     let tables = Inherited::build(tcx, def_id).enter(|inh| {
833         let param_env = tcx.param_env(def_id);
834         let fcx = if let Some(decl) = fn_decl {
835             let fn_sig = tcx.fn_sig(def_id);
836
837             check_abi(tcx, span, fn_sig.abi());
838
839             // Compute the fty from point of view of inside the fn.
840             let fn_sig =
841                 tcx.liberate_late_bound_regions(def_id, &fn_sig);
842             let fn_sig =
843                 inh.normalize_associated_types_in(body.value.span,
844                                                   body_id.hir_id,
845                                                   param_env,
846                                                   &fn_sig);
847
848             let fcx = check_fn(&inh, param_env, fn_sig, decl, id, body, None).0;
849             fcx
850         } else {
851             let fcx = FnCtxt::new(&inh, param_env, body.value.hir_id);
852             let expected_type = tcx.type_of(def_id);
853             let expected_type = fcx.normalize_associated_types_in(body.value.span, &expected_type);
854             fcx.require_type_is_sized(expected_type, body.value.span, traits::ConstSized);
855
856             let revealed_ty = if tcx.features().impl_trait_in_bindings {
857                 fcx.instantiate_opaque_types_from_value(
858                     id,
859                     &expected_type
860                 )
861             } else {
862                 expected_type
863             };
864
865             // Gather locals in statics (because of block expressions).
866             GatherLocalsVisitor { fcx: &fcx, parent_id: id, }.visit_body(body);
867
868             fcx.check_expr_coercable_to_type(&body.value, revealed_ty);
869
870             fcx.write_ty(id, revealed_ty);
871
872             fcx
873         };
874
875         // All type checking constraints were added, try to fallback unsolved variables.
876         fcx.select_obligations_where_possible(false);
877         let mut fallback_has_occurred = false;
878         for ty in &fcx.unsolved_variables() {
879             fallback_has_occurred |= fcx.fallback_if_possible(ty);
880         }
881         fcx.select_obligations_where_possible(fallback_has_occurred);
882
883         // Even though coercion casts provide type hints, we check casts after fallback for
884         // backwards compatibility. This makes fallback a stronger type hint than a cast coercion.
885         fcx.check_casts();
886
887         // Closure and generator analysis may run after fallback
888         // because they don't constrain other type variables.
889         fcx.closure_analyze(body);
890         assert!(fcx.deferred_call_resolutions.borrow().is_empty());
891         fcx.resolve_generator_interiors(def_id);
892
893         for (ty, span, code) in fcx.deferred_sized_obligations.borrow_mut().drain(..) {
894             let ty = fcx.normalize_ty(span, ty);
895             fcx.require_type_is_sized(ty, span, code);
896         }
897         fcx.select_all_obligations_or_error();
898
899         if fn_decl.is_some() {
900             fcx.regionck_fn(id, body);
901         } else {
902             fcx.regionck_expr(body);
903         }
904
905         fcx.resolve_type_vars_in_body(body)
906     });
907
908     // Consistency check our TypeckTables instance can hold all ItemLocalIds
909     // it will need to hold.
910     assert_eq!(tables.local_id_root, Some(DefId::local(id.owner)));
911
912     tables
913 }
914
915 fn check_abi<'tcx>(tcx: TyCtxt<'tcx>, span: Span, abi: Abi) {
916     if !tcx.sess.target.target.is_abi_supported(abi) {
917         struct_span_err!(tcx.sess, span, E0570,
918             "The ABI `{}` is not supported for the current target", abi).emit()
919     }
920 }
921
922 struct GatherLocalsVisitor<'a, 'tcx: 'a> {
923     fcx: &'a FnCtxt<'a, 'tcx>,
924     parent_id: hir::HirId,
925 }
926
927 impl<'a, 'tcx> GatherLocalsVisitor<'a, 'tcx> {
928     fn assign(&mut self, span: Span, nid: hir::HirId, ty_opt: Option<LocalTy<'tcx>>) -> Ty<'tcx> {
929         match ty_opt {
930             None => {
931                 // infer the variable's type
932                 let var_ty = self.fcx.next_ty_var(TypeVariableOrigin {
933                     kind: TypeVariableOriginKind::TypeInference,
934                     span,
935                 });
936                 self.fcx.locals.borrow_mut().insert(nid, LocalTy {
937                     decl_ty: var_ty,
938                     revealed_ty: var_ty
939                 });
940                 var_ty
941             }
942             Some(typ) => {
943                 // take type that the user specified
944                 self.fcx.locals.borrow_mut().insert(nid, typ);
945                 typ.revealed_ty
946             }
947         }
948     }
949 }
950
951 impl<'a, 'tcx> Visitor<'tcx> for GatherLocalsVisitor<'a, 'tcx> {
952     fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> {
953         NestedVisitorMap::None
954     }
955
956     // Add explicitly-declared locals.
957     fn visit_local(&mut self, local: &'tcx hir::Local) {
958         let local_ty = match local.ty {
959             Some(ref ty) => {
960                 let o_ty = self.fcx.to_ty(&ty);
961
962                 let revealed_ty = if self.fcx.tcx.features().impl_trait_in_bindings {
963                     self.fcx.instantiate_opaque_types_from_value(
964                         self.parent_id,
965                         &o_ty
966                     )
967                 } else {
968                     o_ty
969                 };
970
971                 let c_ty = self.fcx.inh.infcx.canonicalize_user_type_annotation(
972                     &UserType::Ty(revealed_ty)
973                 );
974                 debug!("visit_local: ty.hir_id={:?} o_ty={:?} revealed_ty={:?} c_ty={:?}",
975                        ty.hir_id, o_ty, revealed_ty, c_ty);
976                 self.fcx.tables.borrow_mut().user_provided_types_mut().insert(ty.hir_id, c_ty);
977
978                 Some(LocalTy { decl_ty: o_ty, revealed_ty })
979             },
980             None => None,
981         };
982         self.assign(local.span, local.hir_id, local_ty);
983
984         debug!("Local variable {:?} is assigned type {}",
985                local.pat,
986                self.fcx.ty_to_string(
987                    self.fcx.locals.borrow().get(&local.hir_id).unwrap().clone().decl_ty));
988         intravisit::walk_local(self, local);
989     }
990
991     // Add pattern bindings.
992     fn visit_pat(&mut self, p: &'tcx hir::Pat) {
993         if let PatKind::Binding(_, _, ident, _) = p.node {
994             let var_ty = self.assign(p.span, p.hir_id, None);
995
996             let node_id = self.fcx.tcx.hir().hir_to_node_id(p.hir_id);
997             if !self.fcx.tcx.features().unsized_locals {
998                 self.fcx.require_type_is_sized(var_ty, p.span,
999                                                traits::VariableType(node_id));
1000             }
1001
1002             debug!("Pattern binding {} is assigned to {} with type {:?}",
1003                    ident,
1004                    self.fcx.ty_to_string(
1005                        self.fcx.locals.borrow().get(&p.hir_id).unwrap().clone().decl_ty),
1006                    var_ty);
1007         }
1008         intravisit::walk_pat(self, p);
1009     }
1010
1011     // Don't descend into the bodies of nested closures
1012     fn visit_fn(
1013         &mut self,
1014         _: intravisit::FnKind<'tcx>,
1015         _: &'tcx hir::FnDecl,
1016         _: hir::BodyId,
1017         _: Span,
1018         _: hir::HirId,
1019     ) { }
1020 }
1021
1022 /// When `check_fn` is invoked on a generator (i.e., a body that
1023 /// includes yield), it returns back some information about the yield
1024 /// points.
1025 struct GeneratorTypes<'tcx> {
1026     /// Type of value that is yielded.
1027     yield_ty: Ty<'tcx>,
1028
1029     /// Types that are captured (see `GeneratorInterior` for more).
1030     interior: Ty<'tcx>,
1031
1032     /// Indicates if the generator is movable or static (immovable).
1033     movability: hir::GeneratorMovability,
1034 }
1035
1036 /// Helper used for fns and closures. Does the grungy work of checking a function
1037 /// body and returns the function context used for that purpose, since in the case of a fn item
1038 /// there is still a bit more to do.
1039 ///
1040 /// * ...
1041 /// * inherited: other fields inherited from the enclosing fn (if any)
1042 fn check_fn<'a, 'tcx>(
1043     inherited: &'a Inherited<'a, 'tcx>,
1044     param_env: ty::ParamEnv<'tcx>,
1045     fn_sig: ty::FnSig<'tcx>,
1046     decl: &'tcx hir::FnDecl,
1047     fn_id: hir::HirId,
1048     body: &'tcx hir::Body,
1049     can_be_generator: Option<hir::GeneratorMovability>,
1050 ) -> (FnCtxt<'a, 'tcx>, Option<GeneratorTypes<'tcx>>) {
1051     let mut fn_sig = fn_sig.clone();
1052
1053     debug!("check_fn(sig={:?}, fn_id={}, param_env={:?})", fn_sig, fn_id, param_env);
1054
1055     // Create the function context.  This is either derived from scratch or,
1056     // in the case of closures, based on the outer context.
1057     let mut fcx = FnCtxt::new(inherited, param_env, body.value.hir_id);
1058     *fcx.ps.borrow_mut() = UnsafetyState::function(fn_sig.unsafety, fn_id);
1059
1060     let declared_ret_ty = fn_sig.output();
1061     fcx.require_type_is_sized(declared_ret_ty, decl.output.span(), traits::SizedReturnType);
1062     let revealed_ret_ty = fcx.instantiate_opaque_types_from_value(fn_id, &declared_ret_ty);
1063     fcx.ret_coercion = Some(RefCell::new(CoerceMany::new(revealed_ret_ty)));
1064     fn_sig = fcx.tcx.mk_fn_sig(
1065         fn_sig.inputs().iter().cloned(),
1066         revealed_ret_ty,
1067         fn_sig.c_variadic,
1068         fn_sig.unsafety,
1069         fn_sig.abi
1070     );
1071
1072     let span = body.value.span;
1073
1074     if body.is_generator && can_be_generator.is_some() {
1075         let yield_ty = fcx.next_ty_var(TypeVariableOrigin {
1076             kind: TypeVariableOriginKind::TypeInference,
1077             span,
1078         });
1079         fcx.require_type_is_sized(yield_ty, span, traits::SizedYieldType);
1080         fcx.yield_ty = Some(yield_ty);
1081     }
1082
1083     let outer_def_id = fcx.tcx.closure_base_def_id(fcx.tcx.hir().local_def_id_from_hir_id(fn_id));
1084     let outer_hir_id = fcx.tcx.hir().as_local_hir_id(outer_def_id).unwrap();
1085     GatherLocalsVisitor { fcx: &fcx, parent_id: outer_hir_id, }.visit_body(body);
1086
1087     // Add formal parameters.
1088     for (arg_ty, arg) in fn_sig.inputs().iter().zip(&body.arguments) {
1089         // Check the pattern.
1090         let binding_mode = ty::BindingMode::BindByValue(hir::Mutability::MutImmutable);
1091         fcx.check_pat_walk(&arg.pat, arg_ty, binding_mode, None);
1092
1093         // Check that argument is Sized.
1094         // The check for a non-trivial pattern is a hack to avoid duplicate warnings
1095         // for simple cases like `fn foo(x: Trait)`,
1096         // where we would error once on the parameter as a whole, and once on the binding `x`.
1097         if arg.pat.simple_ident().is_none() && !fcx.tcx.features().unsized_locals {
1098             fcx.require_type_is_sized(arg_ty, decl.output.span(), traits::SizedArgumentType);
1099         }
1100
1101         fcx.write_ty(arg.hir_id, arg_ty);
1102     }
1103
1104     inherited.tables.borrow_mut().liberated_fn_sigs_mut().insert(fn_id, fn_sig);
1105
1106     fcx.check_return_expr(&body.value);
1107
1108     // We insert the deferred_generator_interiors entry after visiting the body.
1109     // This ensures that all nested generators appear before the entry of this generator.
1110     // resolve_generator_interiors relies on this property.
1111     let gen_ty = if can_be_generator.is_some() && body.is_generator {
1112         let interior = fcx.next_ty_var(TypeVariableOrigin {
1113             kind: TypeVariableOriginKind::MiscVariable,
1114             span,
1115         });
1116         fcx.deferred_generator_interiors.borrow_mut().push((body.id(), interior));
1117         Some(GeneratorTypes {
1118             yield_ty: fcx.yield_ty.unwrap(),
1119             interior,
1120             movability: can_be_generator.unwrap(),
1121         })
1122     } else {
1123         None
1124     };
1125
1126     // Finalize the return check by taking the LUB of the return types
1127     // we saw and assigning it to the expected return type. This isn't
1128     // really expected to fail, since the coercions would have failed
1129     // earlier when trying to find a LUB.
1130     //
1131     // However, the behavior around `!` is sort of complex. In the
1132     // event that the `actual_return_ty` comes back as `!`, that
1133     // indicates that the fn either does not return or "returns" only
1134     // values of type `!`. In this case, if there is an expected
1135     // return type that is *not* `!`, that should be ok. But if the
1136     // return type is being inferred, we want to "fallback" to `!`:
1137     //
1138     //     let x = move || panic!();
1139     //
1140     // To allow for that, I am creating a type variable with diverging
1141     // fallback. This was deemed ever so slightly better than unifying
1142     // the return value with `!` because it allows for the caller to
1143     // make more assumptions about the return type (e.g., they could do
1144     //
1145     //     let y: Option<u32> = Some(x());
1146     //
1147     // which would then cause this return type to become `u32`, not
1148     // `!`).
1149     let coercion = fcx.ret_coercion.take().unwrap().into_inner();
1150     let mut actual_return_ty = coercion.complete(&fcx);
1151     if actual_return_ty.is_never() {
1152         actual_return_ty = fcx.next_diverging_ty_var(
1153             TypeVariableOrigin {
1154                 kind: TypeVariableOriginKind::DivergingFn,
1155                 span,
1156             },
1157         );
1158     }
1159     fcx.demand_suptype(span, revealed_ret_ty, actual_return_ty);
1160
1161     // Check that the main return type implements the termination trait.
1162     if let Some(term_id) = fcx.tcx.lang_items().termination() {
1163         if let Some((def_id, EntryFnType::Main)) = fcx.tcx.entry_fn(LOCAL_CRATE) {
1164             let main_id = fcx.tcx.hir().as_local_hir_id(def_id).unwrap();
1165             if main_id == fn_id {
1166                 let substs = fcx.tcx.mk_substs_trait(declared_ret_ty, &[]);
1167                 let trait_ref = ty::TraitRef::new(term_id, substs);
1168                 let return_ty_span = decl.output.span();
1169                 let cause = traits::ObligationCause::new(
1170                     return_ty_span, fn_id, ObligationCauseCode::MainFunctionType);
1171
1172                 inherited.register_predicate(
1173                     traits::Obligation::new(
1174                         cause, param_env, trait_ref.to_predicate()));
1175             }
1176         }
1177     }
1178
1179     // Check that a function marked as `#[panic_handler]` has signature `fn(&PanicInfo) -> !`
1180     if let Some(panic_impl_did) = fcx.tcx.lang_items().panic_impl() {
1181         if panic_impl_did == fcx.tcx.hir().local_def_id_from_hir_id(fn_id) {
1182             if let Some(panic_info_did) = fcx.tcx.lang_items().panic_info() {
1183                 // at this point we don't care if there are duplicate handlers or if the handler has
1184                 // the wrong signature as this value we'll be used when writing metadata and that
1185                 // only happens if compilation succeeded
1186                 fcx.tcx.sess.has_panic_handler.try_set_same(true);
1187
1188                 if declared_ret_ty.sty != ty::Never {
1189                     fcx.tcx.sess.span_err(
1190                         decl.output.span(),
1191                         "return type should be `!`",
1192                     );
1193                 }
1194
1195                 let inputs = fn_sig.inputs();
1196                 let span = fcx.tcx.hir().span(fn_id);
1197                 if inputs.len() == 1 {
1198                     let arg_is_panic_info = match inputs[0].sty {
1199                         ty::Ref(region, ty, mutbl) => match ty.sty {
1200                             ty::Adt(ref adt, _) => {
1201                                 adt.did == panic_info_did &&
1202                                     mutbl == hir::Mutability::MutImmutable &&
1203                                     *region != RegionKind::ReStatic
1204                             },
1205                             _ => false,
1206                         },
1207                         _ => false,
1208                     };
1209
1210                     if !arg_is_panic_info {
1211                         fcx.tcx.sess.span_err(
1212                             decl.inputs[0].span,
1213                             "argument should be `&PanicInfo`",
1214                         );
1215                     }
1216
1217                     if let Node::Item(item) = fcx.tcx.hir().get_by_hir_id(fn_id) {
1218                         if let ItemKind::Fn(_, _, ref generics, _) = item.node {
1219                             if !generics.params.is_empty() {
1220                                 fcx.tcx.sess.span_err(
1221                                     span,
1222                                     "should have no type parameters",
1223                                 );
1224                             }
1225                         }
1226                     }
1227                 } else {
1228                     let span = fcx.tcx.sess.source_map().def_span(span);
1229                     fcx.tcx.sess.span_err(span, "function should have one argument");
1230                 }
1231             } else {
1232                 fcx.tcx.sess.err("language item required, but not found: `panic_info`");
1233             }
1234         }
1235     }
1236
1237     // Check that a function marked as `#[alloc_error_handler]` has signature `fn(Layout) -> !`
1238     if let Some(alloc_error_handler_did) = fcx.tcx.lang_items().oom() {
1239         if alloc_error_handler_did == fcx.tcx.hir().local_def_id_from_hir_id(fn_id) {
1240             if let Some(alloc_layout_did) = fcx.tcx.lang_items().alloc_layout() {
1241                 if declared_ret_ty.sty != ty::Never {
1242                     fcx.tcx.sess.span_err(
1243                         decl.output.span(),
1244                         "return type should be `!`",
1245                     );
1246                 }
1247
1248                 let inputs = fn_sig.inputs();
1249                 let span = fcx.tcx.hir().span(fn_id);
1250                 if inputs.len() == 1 {
1251                     let arg_is_alloc_layout = match inputs[0].sty {
1252                         ty::Adt(ref adt, _) => {
1253                             adt.did == alloc_layout_did
1254                         },
1255                         _ => false,
1256                     };
1257
1258                     if !arg_is_alloc_layout {
1259                         fcx.tcx.sess.span_err(
1260                             decl.inputs[0].span,
1261                             "argument should be `Layout`",
1262                         );
1263                     }
1264
1265                     if let Node::Item(item) = fcx.tcx.hir().get_by_hir_id(fn_id) {
1266                         if let ItemKind::Fn(_, _, ref generics, _) = item.node {
1267                             if !generics.params.is_empty() {
1268                                 fcx.tcx.sess.span_err(
1269                                     span,
1270                                     "`#[alloc_error_handler]` function should have no type \
1271                                      parameters",
1272                                 );
1273                             }
1274                         }
1275                     }
1276                 } else {
1277                     let span = fcx.tcx.sess.source_map().def_span(span);
1278                     fcx.tcx.sess.span_err(span, "function should have one argument");
1279                 }
1280             } else {
1281                 fcx.tcx.sess.err("language item required, but not found: `alloc_layout`");
1282             }
1283         }
1284     }
1285
1286     (fcx, gen_ty)
1287 }
1288
1289 fn check_struct<'tcx>(tcx: TyCtxt<'tcx>, id: hir::HirId, span: Span) {
1290     let def_id = tcx.hir().local_def_id_from_hir_id(id);
1291     let def = tcx.adt_def(def_id);
1292     def.destructor(tcx); // force the destructor to be evaluated
1293     check_representable(tcx, span, def_id);
1294
1295     if def.repr.simd() {
1296         check_simd(tcx, span, def_id);
1297     }
1298
1299     check_transparent(tcx, span, def_id);
1300     check_packed(tcx, span, def_id);
1301 }
1302
1303 fn check_union<'tcx>(tcx: TyCtxt<'tcx>, id: hir::HirId, span: Span) {
1304     let def_id = tcx.hir().local_def_id_from_hir_id(id);
1305     let def = tcx.adt_def(def_id);
1306     def.destructor(tcx); // force the destructor to be evaluated
1307     check_representable(tcx, span, def_id);
1308     check_transparent(tcx, span, def_id);
1309     check_packed(tcx, span, def_id);
1310 }
1311
1312 fn check_opaque<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, substs: SubstsRef<'tcx>, span: Span) {
1313     if let Err(partially_expanded_type) = tcx.try_expand_impl_trait_type(def_id, substs) {
1314         let mut err = struct_span_err!(
1315             tcx.sess, span, E0720,
1316             "opaque type expands to a recursive type",
1317         );
1318         err.span_label(span, "expands to self-referential type");
1319         if let ty::Opaque(..) = partially_expanded_type.sty {
1320             err.note("type resolves to itself");
1321         } else {
1322             err.note(&format!("expanded type is `{}`", partially_expanded_type));
1323         }
1324         err.emit();
1325     }
1326 }
1327
1328 pub fn check_item_type<'tcx>(tcx: TyCtxt<'tcx>, it: &'tcx hir::Item) {
1329     debug!(
1330         "check_item_type(it.hir_id={}, it.name={})",
1331         it.hir_id,
1332         tcx.def_path_str(tcx.hir().local_def_id_from_hir_id(it.hir_id))
1333     );
1334     let _indenter = indenter();
1335     match it.node {
1336         // Consts can play a role in type-checking, so they are included here.
1337         hir::ItemKind::Static(..) => {
1338             let def_id = tcx.hir().local_def_id_from_hir_id(it.hir_id);
1339             tcx.typeck_tables_of(def_id);
1340             maybe_check_static_with_link_section(tcx, def_id, it.span);
1341         }
1342         hir::ItemKind::Const(..) => {
1343             tcx.typeck_tables_of(tcx.hir().local_def_id_from_hir_id(it.hir_id));
1344         }
1345         hir::ItemKind::Enum(ref enum_definition, _) => {
1346             check_enum(tcx, it.span, &enum_definition.variants, it.hir_id);
1347         }
1348         hir::ItemKind::Fn(..) => {} // entirely within check_item_body
1349         hir::ItemKind::Impl(.., ref impl_item_refs) => {
1350             debug!("ItemKind::Impl {} with id {}", it.ident, it.hir_id);
1351             let impl_def_id = tcx.hir().local_def_id_from_hir_id(it.hir_id);
1352             if let Some(impl_trait_ref) = tcx.impl_trait_ref(impl_def_id) {
1353                 check_impl_items_against_trait(
1354                     tcx,
1355                     it.span,
1356                     impl_def_id,
1357                     impl_trait_ref,
1358                     impl_item_refs,
1359                 );
1360                 let trait_def_id = impl_trait_ref.def_id;
1361                 check_on_unimplemented(tcx, trait_def_id, it);
1362             }
1363         }
1364         hir::ItemKind::Trait(..) => {
1365             let def_id = tcx.hir().local_def_id_from_hir_id(it.hir_id);
1366             check_on_unimplemented(tcx, def_id, it);
1367         }
1368         hir::ItemKind::Struct(..) => {
1369             check_struct(tcx, it.hir_id, it.span);
1370         }
1371         hir::ItemKind::Union(..) => {
1372             check_union(tcx, it.hir_id, it.span);
1373         }
1374         hir::ItemKind::Existential(..) => {
1375             let def_id = tcx.hir().local_def_id_from_hir_id(it.hir_id);
1376
1377             let substs = InternalSubsts::identity_for_item(tcx, def_id);
1378             check_opaque(tcx, def_id, substs, it.span);
1379         }
1380         hir::ItemKind::Ty(..) => {
1381             let def_id = tcx.hir().local_def_id_from_hir_id(it.hir_id);
1382             let pty_ty = tcx.type_of(def_id);
1383             let generics = tcx.generics_of(def_id);
1384             check_bounds_are_used(tcx, &generics, pty_ty);
1385         }
1386         hir::ItemKind::ForeignMod(ref m) => {
1387             check_abi(tcx, it.span, m.abi);
1388
1389             if m.abi == Abi::RustIntrinsic {
1390                 for item in &m.items {
1391                     intrinsic::check_intrinsic_type(tcx, item);
1392                 }
1393             } else if m.abi == Abi::PlatformIntrinsic {
1394                 for item in &m.items {
1395                     intrinsic::check_platform_intrinsic_type(tcx, item);
1396                 }
1397             } else {
1398                 for item in &m.items {
1399                     let generics = tcx.generics_of(tcx.hir().local_def_id_from_hir_id(item.hir_id));
1400                     if generics.params.len() - generics.own_counts().lifetimes != 0 {
1401                         let mut err = struct_span_err!(
1402                             tcx.sess,
1403                             item.span,
1404                             E0044,
1405                             "foreign items may not have type parameters"
1406                         );
1407                         err.span_label(item.span, "can't have type parameters");
1408                         // FIXME: once we start storing spans for type arguments, turn this into a
1409                         // suggestion.
1410                         err.help(
1411                             "use specialization instead of type parameters by replacing them \
1412                              with concrete types like `u32`",
1413                         );
1414                         err.emit();
1415                     }
1416
1417                     if let hir::ForeignItemKind::Fn(ref fn_decl, _, _) = item.node {
1418                         require_c_abi_if_c_variadic(tcx, fn_decl, m.abi, item.span);
1419                     }
1420                 }
1421             }
1422         }
1423         _ => { /* nothing to do */ }
1424     }
1425 }
1426
1427 fn maybe_check_static_with_link_section(tcx: TyCtxt<'_>, id: DefId, span: Span) {
1428     // Only restricted on wasm32 target for now
1429     if !tcx.sess.opts.target_triple.triple().starts_with("wasm32") {
1430         return
1431     }
1432
1433     // If `#[link_section]` is missing, then nothing to verify
1434     let attrs = tcx.codegen_fn_attrs(id);
1435     if attrs.link_section.is_none() {
1436         return
1437     }
1438
1439     // For the wasm32 target statics with #[link_section] are placed into custom
1440     // sections of the final output file, but this isn't link custom sections of
1441     // other executable formats. Namely we can only embed a list of bytes,
1442     // nothing with pointers to anything else or relocations. If any relocation
1443     // show up, reject them here.
1444     let instance = ty::Instance::mono(tcx, id);
1445     let cid = GlobalId {
1446         instance,
1447         promoted: None
1448     };
1449     let param_env = ty::ParamEnv::reveal_all();
1450     if let Ok(static_) = tcx.const_eval(param_env.and(cid)) {
1451         let alloc = if let ConstValue::ByRef(_, allocation) = static_.val {
1452             allocation
1453         } else {
1454             bug!("Matching on non-ByRef static")
1455         };
1456         if alloc.relocations.len() != 0 {
1457             let msg = "statics with a custom `#[link_section]` must be a \
1458                        simple list of bytes on the wasm target with no \
1459                        extra levels of indirection such as references";
1460             tcx.sess.span_err(span, msg);
1461         }
1462     }
1463 }
1464
1465 fn check_on_unimplemented<'tcx>(tcx: TyCtxt<'tcx>, trait_def_id: DefId, item: &hir::Item) {
1466     let item_def_id = tcx.hir().local_def_id_from_hir_id(item.hir_id);
1467     // an error would be reported if this fails.
1468     let _ = traits::OnUnimplementedDirective::of_item(tcx, trait_def_id, item_def_id);
1469 }
1470
1471 fn report_forbidden_specialization<'tcx>(
1472     tcx: TyCtxt<'tcx>,
1473     impl_item: &hir::ImplItem,
1474     parent_impl: DefId,
1475 ) {
1476     let mut err = struct_span_err!(
1477         tcx.sess, impl_item.span, E0520,
1478         "`{}` specializes an item from a parent `impl`, but \
1479          that item is not marked `default`",
1480         impl_item.ident);
1481     err.span_label(impl_item.span, format!("cannot specialize default item `{}`",
1482                                             impl_item.ident));
1483
1484     match tcx.span_of_impl(parent_impl) {
1485         Ok(span) => {
1486             err.span_label(span, "parent `impl` is here");
1487             err.note(&format!("to specialize, `{}` in the parent `impl` must be marked `default`",
1488                               impl_item.ident));
1489         }
1490         Err(cname) => {
1491             err.note(&format!("parent implementation is in crate `{}`", cname));
1492         }
1493     }
1494
1495     err.emit();
1496 }
1497
1498 fn check_specialization_validity<'tcx>(
1499     tcx: TyCtxt<'tcx>,
1500     trait_def: &ty::TraitDef,
1501     trait_item: &ty::AssocItem,
1502     impl_id: DefId,
1503     impl_item: &hir::ImplItem,
1504 ) {
1505     let ancestors = trait_def.ancestors(tcx, impl_id);
1506
1507     let kind = match impl_item.node {
1508         hir::ImplItemKind::Const(..) => ty::AssocKind::Const,
1509         hir::ImplItemKind::Method(..) => ty::AssocKind::Method,
1510         hir::ImplItemKind::Existential(..) => ty::AssocKind::Existential,
1511         hir::ImplItemKind::Type(_) => ty::AssocKind::Type
1512     };
1513
1514     let parent = ancestors.defs(tcx, trait_item.ident, kind, trait_def.def_id).nth(1)
1515         .map(|node_item| node_item.map(|parent| parent.defaultness));
1516
1517     if let Some(parent) = parent {
1518         if tcx.impl_item_is_final(&parent) {
1519             report_forbidden_specialization(tcx, impl_item, parent.node.def_id());
1520         }
1521     }
1522
1523 }
1524
1525 fn check_impl_items_against_trait<'tcx>(
1526     tcx: TyCtxt<'tcx>,
1527     impl_span: Span,
1528     impl_id: DefId,
1529     impl_trait_ref: ty::TraitRef<'tcx>,
1530     impl_item_refs: &[hir::ImplItemRef],
1531 ) {
1532     let impl_span = tcx.sess.source_map().def_span(impl_span);
1533
1534     // If the trait reference itself is erroneous (so the compilation is going
1535     // to fail), skip checking the items here -- the `impl_item` table in `tcx`
1536     // isn't populated for such impls.
1537     if impl_trait_ref.references_error() { return; }
1538
1539     // Locate trait definition and items
1540     let trait_def = tcx.trait_def(impl_trait_ref.def_id);
1541     let mut overridden_associated_type = None;
1542
1543     let impl_items = || impl_item_refs.iter().map(|iiref| tcx.hir().impl_item(iiref.id));
1544
1545     // Check existing impl methods to see if they are both present in trait
1546     // and compatible with trait signature
1547     for impl_item in impl_items() {
1548         let ty_impl_item = tcx.associated_item(
1549             tcx.hir().local_def_id_from_hir_id(impl_item.hir_id));
1550         let ty_trait_item = tcx.associated_items(impl_trait_ref.def_id)
1551             .find(|ac| Namespace::from(&impl_item.node) == Namespace::from(ac.kind) &&
1552                        tcx.hygienic_eq(ty_impl_item.ident, ac.ident, impl_trait_ref.def_id))
1553             .or_else(|| {
1554                 // Not compatible, but needed for the error message
1555                 tcx.associated_items(impl_trait_ref.def_id)
1556                    .find(|ac| tcx.hygienic_eq(ty_impl_item.ident, ac.ident, impl_trait_ref.def_id))
1557             });
1558
1559         // Check that impl definition matches trait definition
1560         if let Some(ty_trait_item) = ty_trait_item {
1561             match impl_item.node {
1562                 hir::ImplItemKind::Const(..) => {
1563                     // Find associated const definition.
1564                     if ty_trait_item.kind == ty::AssocKind::Const {
1565                         compare_const_impl(tcx,
1566                                            &ty_impl_item,
1567                                            impl_item.span,
1568                                            &ty_trait_item,
1569                                            impl_trait_ref);
1570                     } else {
1571                          let mut err = struct_span_err!(tcx.sess, impl_item.span, E0323,
1572                              "item `{}` is an associated const, \
1573                               which doesn't match its trait `{}`",
1574                              ty_impl_item.ident,
1575                              impl_trait_ref);
1576                          err.span_label(impl_item.span, "does not match trait");
1577                          // We can only get the spans from local trait definition
1578                          // Same for E0324 and E0325
1579                          if let Some(trait_span) = tcx.hir().span_if_local(ty_trait_item.def_id) {
1580                             err.span_label(trait_span, "item in trait");
1581                          }
1582                          err.emit()
1583                     }
1584                 }
1585                 hir::ImplItemKind::Method(..) => {
1586                     let trait_span = tcx.hir().span_if_local(ty_trait_item.def_id);
1587                     if ty_trait_item.kind == ty::AssocKind::Method {
1588                         compare_impl_method(tcx,
1589                                             &ty_impl_item,
1590                                             impl_item.span,
1591                                             &ty_trait_item,
1592                                             impl_trait_ref,
1593                                             trait_span);
1594                     } else {
1595                         let mut err = struct_span_err!(tcx.sess, impl_item.span, E0324,
1596                             "item `{}` is an associated method, \
1597                              which doesn't match its trait `{}`",
1598                             ty_impl_item.ident,
1599                             impl_trait_ref);
1600                          err.span_label(impl_item.span, "does not match trait");
1601                          if let Some(trait_span) = tcx.hir().span_if_local(ty_trait_item.def_id) {
1602                             err.span_label(trait_span, "item in trait");
1603                          }
1604                          err.emit()
1605                     }
1606                 }
1607                 hir::ImplItemKind::Existential(..) |
1608                 hir::ImplItemKind::Type(_) => {
1609                     if ty_trait_item.kind == ty::AssocKind::Type {
1610                         if ty_trait_item.defaultness.has_value() {
1611                             overridden_associated_type = Some(impl_item);
1612                         }
1613                     } else {
1614                         let mut err = struct_span_err!(tcx.sess, impl_item.span, E0325,
1615                             "item `{}` is an associated type, \
1616                              which doesn't match its trait `{}`",
1617                             ty_impl_item.ident,
1618                             impl_trait_ref);
1619                          err.span_label(impl_item.span, "does not match trait");
1620                          if let Some(trait_span) = tcx.hir().span_if_local(ty_trait_item.def_id) {
1621                             err.span_label(trait_span, "item in trait");
1622                          }
1623                          err.emit()
1624                     }
1625                 }
1626             }
1627
1628             check_specialization_validity(tcx, trait_def, &ty_trait_item, impl_id, impl_item);
1629         }
1630     }
1631
1632     // Check for missing items from trait
1633     let mut missing_items = Vec::new();
1634     let mut invalidated_items = Vec::new();
1635     let associated_type_overridden = overridden_associated_type.is_some();
1636     for trait_item in tcx.associated_items(impl_trait_ref.def_id) {
1637         let is_implemented = trait_def.ancestors(tcx, impl_id)
1638             .defs(tcx, trait_item.ident, trait_item.kind, impl_trait_ref.def_id)
1639             .next()
1640             .map(|node_item| !node_item.node.is_from_trait())
1641             .unwrap_or(false);
1642
1643         if !is_implemented && !tcx.impl_is_default(impl_id) {
1644             if !trait_item.defaultness.has_value() {
1645                 missing_items.push(trait_item);
1646             } else if associated_type_overridden {
1647                 invalidated_items.push(trait_item.ident);
1648             }
1649         }
1650     }
1651
1652     if !missing_items.is_empty() {
1653         let mut err = struct_span_err!(tcx.sess, impl_span, E0046,
1654             "not all trait items implemented, missing: `{}`",
1655             missing_items.iter()
1656                 .map(|trait_item| trait_item.ident.to_string())
1657                 .collect::<Vec<_>>().join("`, `"));
1658         err.span_label(impl_span, format!("missing `{}` in implementation",
1659                 missing_items.iter()
1660                     .map(|trait_item| trait_item.ident.to_string())
1661                     .collect::<Vec<_>>().join("`, `")));
1662         for trait_item in missing_items {
1663             if let Some(span) = tcx.hir().span_if_local(trait_item.def_id) {
1664                 err.span_label(span, format!("`{}` from trait", trait_item.ident));
1665             } else {
1666                 err.note_trait_signature(trait_item.ident.to_string(),
1667                                          trait_item.signature(tcx));
1668             }
1669         }
1670         err.emit();
1671     }
1672
1673     if !invalidated_items.is_empty() {
1674         let invalidator = overridden_associated_type.unwrap();
1675         span_err!(tcx.sess, invalidator.span, E0399,
1676                   "the following trait items need to be reimplemented \
1677                    as `{}` was overridden: `{}`",
1678                   invalidator.ident,
1679                   invalidated_items.iter()
1680                                    .map(|name| name.to_string())
1681                                    .collect::<Vec<_>>().join("`, `"))
1682     }
1683 }
1684
1685 /// Checks whether a type can be represented in memory. In particular, it
1686 /// identifies types that contain themselves without indirection through a
1687 /// pointer, which would mean their size is unbounded.
1688 fn check_representable<'tcx>(tcx: TyCtxt<'tcx>, sp: Span, item_def_id: DefId) -> bool {
1689     let rty = tcx.type_of(item_def_id);
1690
1691     // Check that it is possible to represent this type. This call identifies
1692     // (1) types that contain themselves and (2) types that contain a different
1693     // recursive type. It is only necessary to throw an error on those that
1694     // contain themselves. For case 2, there must be an inner type that will be
1695     // caught by case 1.
1696     match rty.is_representable(tcx, sp) {
1697         Representability::SelfRecursive(spans) => {
1698             let mut err = tcx.recursive_type_with_infinite_size_error(item_def_id);
1699             for span in spans {
1700                 err.span_label(span, "recursive without indirection");
1701             }
1702             err.emit();
1703             return false
1704         }
1705         Representability::Representable | Representability::ContainsRecursive => (),
1706     }
1707     return true;
1708 }
1709
1710 pub fn check_simd<'tcx>(tcx: TyCtxt<'tcx>, sp: Span, def_id: DefId) {
1711     let t = tcx.type_of(def_id);
1712     if let ty::Adt(def, substs) = t.sty {
1713         if def.is_struct() {
1714             let fields = &def.non_enum_variant().fields;
1715             if fields.is_empty() {
1716                 span_err!(tcx.sess, sp, E0075, "SIMD vector cannot be empty");
1717                 return;
1718             }
1719             let e = fields[0].ty(tcx, substs);
1720             if !fields.iter().all(|f| f.ty(tcx, substs) == e) {
1721                 struct_span_err!(tcx.sess, sp, E0076, "SIMD vector should be homogeneous")
1722                                 .span_label(sp, "SIMD elements must have the same type")
1723                                 .emit();
1724                 return;
1725             }
1726             match e.sty {
1727                 ty::Param(_) => { /* struct<T>(T, T, T, T) is ok */ }
1728                 _ if e.is_machine() => { /* struct(u8, u8, u8, u8) is ok */ }
1729                 _ => {
1730                     span_err!(tcx.sess, sp, E0077,
1731                               "SIMD vector element type should be machine type");
1732                     return;
1733                 }
1734             }
1735         }
1736     }
1737 }
1738
1739 fn check_packed<'tcx>(tcx: TyCtxt<'tcx>, sp: Span, def_id: DefId) {
1740     let repr = tcx.adt_def(def_id).repr;
1741     if repr.packed() {
1742         for attr in tcx.get_attrs(def_id).iter() {
1743             for r in attr::find_repr_attrs(&tcx.sess.parse_sess, attr) {
1744                 if let attr::ReprPacked(pack) = r {
1745                     if pack != repr.pack {
1746                         struct_span_err!(tcx.sess, sp, E0634,
1747                                          "type has conflicting packed representation hints").emit();
1748                     }
1749                 }
1750             }
1751         }
1752         if repr.align > 0 {
1753             struct_span_err!(tcx.sess, sp, E0587,
1754                              "type has conflicting packed and align representation hints").emit();
1755         }
1756         else if check_packed_inner(tcx, def_id, &mut Vec::new()) {
1757             struct_span_err!(tcx.sess, sp, E0588,
1758                 "packed type cannot transitively contain a `[repr(align)]` type").emit();
1759         }
1760     }
1761 }
1762
1763 fn check_packed_inner<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, stack: &mut Vec<DefId>) -> bool {
1764     let t = tcx.type_of(def_id);
1765     if stack.contains(&def_id) {
1766         debug!("check_packed_inner: {:?} is recursive", t);
1767         return false;
1768     }
1769     if let ty::Adt(def, substs) = t.sty {
1770         if def.is_struct() || def.is_union() {
1771             if tcx.adt_def(def.did).repr.align > 0 {
1772                 return true;
1773             }
1774             // push struct def_id before checking fields
1775             stack.push(def_id);
1776             for field in &def.non_enum_variant().fields {
1777                 let f = field.ty(tcx, substs);
1778                 if let ty::Adt(def, _) = f.sty {
1779                     if check_packed_inner(tcx, def.did, stack) {
1780                         return true;
1781                     }
1782                 }
1783             }
1784             // only need to pop if not early out
1785             stack.pop();
1786         }
1787     }
1788     false
1789 }
1790
1791 fn check_transparent<'tcx>(tcx: TyCtxt<'tcx>, sp: Span, def_id: DefId) {
1792     let adt = tcx.adt_def(def_id);
1793     if !adt.repr.transparent() {
1794         return;
1795     }
1796
1797     if adt.is_enum() {
1798         if !tcx.features().transparent_enums {
1799             emit_feature_err(&tcx.sess.parse_sess,
1800                              sym::transparent_enums,
1801                              sp,
1802                              GateIssue::Language,
1803                              "transparent enums are unstable");
1804         }
1805         if adt.variants.len() != 1 {
1806             let variant_spans: Vec<_> = adt.variants.iter().map(|variant| {
1807                 tcx.hir().span_if_local(variant.def_id).unwrap()
1808             }).collect();
1809             let mut err = struct_span_err!(tcx.sess, sp, E0731,
1810                             "transparent enum needs exactly one variant, but has {}",
1811                             adt.variants.len());
1812             if !variant_spans.is_empty() {
1813                 err.span_note(variant_spans, &format!("the following variants exist on `{}`",
1814                                                       tcx.def_path_str(def_id)));
1815             }
1816             err.emit();
1817             if adt.variants.is_empty() {
1818                 // Don't bother checking the fields. No variants (and thus no fields) exist.
1819                 return;
1820             }
1821         }
1822     }
1823
1824     if adt.is_union() && !tcx.features().transparent_unions {
1825         emit_feature_err(&tcx.sess.parse_sess,
1826                          sym::transparent_unions,
1827                          sp,
1828                          GateIssue::Language,
1829                          "transparent unions are unstable");
1830     }
1831
1832     // For each field, figure out if it's known to be a ZST and align(1)
1833     let field_infos = adt.all_fields().map(|field| {
1834         let ty = field.ty(tcx, InternalSubsts::identity_for_item(tcx, field.did));
1835         let param_env = tcx.param_env(field.did);
1836         let layout = tcx.layout_of(param_env.and(ty));
1837         // We are currently checking the type this field came from, so it must be local
1838         let span = tcx.hir().span_if_local(field.did).unwrap();
1839         let zst = layout.map(|layout| layout.is_zst()).unwrap_or(false);
1840         let align1 = layout.map(|layout| layout.align.abi.bytes() == 1).unwrap_or(false);
1841         (span, zst, align1)
1842     });
1843
1844     let non_zst_fields = field_infos.clone().filter(|(_span, zst, _align1)| !*zst);
1845     let non_zst_count = non_zst_fields.clone().count();
1846     if non_zst_count != 1 {
1847         let field_spans: Vec<_> = non_zst_fields.map(|(span, _zst, _align1)| span).collect();
1848
1849         let mut err = struct_span_err!(tcx.sess, sp, E0690,
1850                          "{}transparent {} needs exactly one non-zero-sized field, but has {}",
1851                          if adt.is_enum() { "the variant of a " } else { "" },
1852                          adt.descr(),
1853                          non_zst_count);
1854         if !field_spans.is_empty() {
1855             err.span_note(field_spans,
1856                           &format!("the following non-zero-sized fields exist on `{}`:",
1857                                    tcx.def_path_str(def_id)));
1858         }
1859         err.emit();
1860     }
1861     for (span, zst, align1) in field_infos {
1862         if zst && !align1 {
1863             span_err!(tcx.sess, span, E0691,
1864                       "zero-sized field in transparent {} has alignment larger than 1",
1865                       adt.descr());
1866         }
1867     }
1868 }
1869
1870 #[allow(trivial_numeric_casts)]
1871 pub fn check_enum<'tcx>(tcx: TyCtxt<'tcx>, sp: Span, vs: &'tcx [hir::Variant], id: hir::HirId) {
1872     let def_id = tcx.hir().local_def_id_from_hir_id(id);
1873     let def = tcx.adt_def(def_id);
1874     def.destructor(tcx); // force the destructor to be evaluated
1875
1876     if vs.is_empty() {
1877         let attributes = tcx.get_attrs(def_id);
1878         if let Some(attr) = attr::find_by_name(&attributes, sym::repr) {
1879             struct_span_err!(
1880                 tcx.sess, attr.span, E0084,
1881                 "unsupported representation for zero-variant enum")
1882                 .span_label(sp, "zero-variant enum")
1883                 .emit();
1884         }
1885     }
1886
1887     let repr_type_ty = def.repr.discr_type().to_ty(tcx);
1888     if repr_type_ty == tcx.types.i128 || repr_type_ty == tcx.types.u128 {
1889         if !tcx.features().repr128 {
1890             emit_feature_err(&tcx.sess.parse_sess,
1891                              sym::repr128,
1892                              sp,
1893                              GateIssue::Language,
1894                              "repr with 128-bit type is unstable");
1895         }
1896     }
1897
1898     for v in vs {
1899         if let Some(ref e) = v.node.disr_expr {
1900             tcx.typeck_tables_of(tcx.hir().local_def_id_from_hir_id(e.hir_id));
1901         }
1902     }
1903
1904     let mut disr_vals: Vec<Discr<'tcx>> = Vec::with_capacity(vs.len());
1905     for ((_, discr), v) in def.discriminants(tcx).zip(vs) {
1906         // Check for duplicate discriminant values
1907         if let Some(i) = disr_vals.iter().position(|&x| x.val == discr.val) {
1908             let variant_did = def.variants[VariantIdx::new(i)].def_id;
1909             let variant_i_hir_id = tcx.hir().as_local_hir_id(variant_did).unwrap();
1910             let variant_i = tcx.hir().expect_variant(variant_i_hir_id);
1911             let i_span = match variant_i.node.disr_expr {
1912                 Some(ref expr) => tcx.hir().span(expr.hir_id),
1913                 None => tcx.hir().span(variant_i_hir_id)
1914             };
1915             let span = match v.node.disr_expr {
1916                 Some(ref expr) => tcx.hir().span(expr.hir_id),
1917                 None => v.span
1918             };
1919             struct_span_err!(tcx.sess, span, E0081,
1920                              "discriminant value `{}` already exists", disr_vals[i])
1921                 .span_label(i_span, format!("first use of `{}`", disr_vals[i]))
1922                 .span_label(span , format!("enum already has `{}`", disr_vals[i]))
1923                 .emit();
1924         }
1925         disr_vals.push(discr);
1926     }
1927
1928     check_representable(tcx, sp, def_id);
1929     check_transparent(tcx, sp, def_id);
1930 }
1931
1932 fn report_unexpected_variant_res<'tcx>(tcx: TyCtxt<'tcx>, res: Res, span: Span, qpath: &QPath) {
1933     span_err!(tcx.sess, span, E0533,
1934               "expected unit struct/variant or constant, found {} `{}`",
1935               res.descr(),
1936               hir::print::to_string(tcx.hir(), |s| s.print_qpath(qpath, false)));
1937 }
1938
1939 impl<'a, 'tcx> AstConv<'tcx> for FnCtxt<'a, 'tcx> {
1940     fn tcx<'b>(&'b self) -> TyCtxt<'tcx> {
1941         self.tcx
1942         }
1943
1944     fn get_type_parameter_bounds(&self, _: Span, def_id: DefId)
1945                                  -> &'tcx ty::GenericPredicates<'tcx>
1946     {
1947         let tcx = self.tcx;
1948         let hir_id = tcx.hir().as_local_hir_id(def_id).unwrap();
1949         let item_id = tcx.hir().ty_param_owner(hir_id);
1950         let item_def_id = tcx.hir().local_def_id_from_hir_id(item_id);
1951         let generics = tcx.generics_of(item_def_id);
1952         let index = generics.param_def_id_to_index[&def_id];
1953         tcx.arena.alloc(ty::GenericPredicates {
1954             parent: None,
1955             predicates: self.param_env.caller_bounds.iter().filter_map(|&predicate| {
1956                 match predicate {
1957                     ty::Predicate::Trait(ref data)
1958                     if data.skip_binder().self_ty().is_param(index) => {
1959                         // HACK(eddyb) should get the original `Span`.
1960                         let span = tcx.def_span(def_id);
1961                         Some((predicate, span))
1962                     }
1963                     _ => None
1964                 }
1965             }).collect()
1966         })
1967     }
1968
1969     fn re_infer(
1970         &self,
1971         def: Option<&ty::GenericParamDef>,
1972         span: Span,
1973     ) -> Option<ty::Region<'tcx>> {
1974         let v = match def {
1975             Some(def) => infer::EarlyBoundRegion(span, def.name),
1976             None => infer::MiscVariable(span)
1977         };
1978         Some(self.next_region_var(v))
1979     }
1980
1981     fn ty_infer(&self, param: Option<&ty::GenericParamDef>, span: Span) -> Ty<'tcx> {
1982         if let Some(param) = param {
1983             if let UnpackedKind::Type(ty) = self.var_for_def(span, param).unpack() {
1984                 return ty;
1985             }
1986             unreachable!()
1987         } else {
1988             self.next_ty_var(TypeVariableOrigin {
1989                 kind: TypeVariableOriginKind::TypeInference,
1990                 span,
1991             })
1992         }
1993     }
1994
1995     fn ct_infer(
1996         &self,
1997         ty: Ty<'tcx>,
1998         param: Option<&ty::GenericParamDef>,
1999         span: Span,
2000     ) -> &'tcx Const<'tcx> {
2001         if let Some(param) = param {
2002             if let UnpackedKind::Const(ct) = self.var_for_def(span, param).unpack() {
2003                 return ct;
2004             }
2005             unreachable!()
2006         } else {
2007             self.next_const_var(ty, ConstVariableOrigin {
2008                 kind: ConstVariableOriginKind::ConstInference,
2009                 span,
2010             })
2011         }
2012     }
2013
2014     fn projected_ty_from_poly_trait_ref(&self,
2015                                         span: Span,
2016                                         item_def_id: DefId,
2017                                         poly_trait_ref: ty::PolyTraitRef<'tcx>)
2018                                         -> Ty<'tcx>
2019     {
2020         let (trait_ref, _) = self.replace_bound_vars_with_fresh_vars(
2021             span,
2022             infer::LateBoundRegionConversionTime::AssocTypeProjection(item_def_id),
2023             &poly_trait_ref
2024         );
2025
2026         self.tcx().mk_projection(item_def_id, trait_ref.substs)
2027     }
2028
2029     fn normalize_ty(&self, span: Span, ty: Ty<'tcx>) -> Ty<'tcx> {
2030         if ty.has_escaping_bound_vars() {
2031             ty // FIXME: normalization and escaping regions
2032         } else {
2033             self.normalize_associated_types_in(span, &ty)
2034         }
2035     }
2036
2037     fn set_tainted_by_errors(&self) {
2038         self.infcx.set_tainted_by_errors()
2039     }
2040
2041     fn record_ty(&self, hir_id: hir::HirId, ty: Ty<'tcx>, _span: Span) {
2042         self.write_ty(hir_id, ty)
2043     }
2044 }
2045
2046 /// Controls whether the arguments are tupled. This is used for the call
2047 /// operator.
2048 ///
2049 /// Tupling means that all call-side arguments are packed into a tuple and
2050 /// passed as a single parameter. For example, if tupling is enabled, this
2051 /// function:
2052 ///
2053 ///     fn f(x: (isize, isize))
2054 ///
2055 /// Can be called as:
2056 ///
2057 ///     f(1, 2);
2058 ///
2059 /// Instead of:
2060 ///
2061 ///     f((1, 2));
2062 #[derive(Clone, Eq, PartialEq)]
2063 enum TupleArgumentsFlag {
2064     DontTupleArguments,
2065     TupleArguments,
2066 }
2067
2068 impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
2069     pub fn new(
2070         inh: &'a Inherited<'a, 'tcx>,
2071         param_env: ty::ParamEnv<'tcx>,
2072         body_id: hir::HirId,
2073     ) -> FnCtxt<'a, 'tcx> {
2074         FnCtxt {
2075             body_id,
2076             param_env,
2077             err_count_on_creation: inh.tcx.sess.err_count(),
2078             ret_coercion: None,
2079             ret_coercion_span: RefCell::new(None),
2080             yield_ty: None,
2081             ps: RefCell::new(UnsafetyState::function(hir::Unsafety::Normal,
2082                                                      hir::CRATE_HIR_ID)),
2083             diverges: Cell::new(Diverges::Maybe),
2084             has_errors: Cell::new(false),
2085             enclosing_breakables: RefCell::new(EnclosingBreakables {
2086                 stack: Vec::new(),
2087                 by_id: Default::default(),
2088             }),
2089             inh,
2090         }
2091     }
2092
2093     pub fn sess(&self) -> &Session {
2094         &self.tcx.sess
2095     }
2096
2097     pub fn err_count_since_creation(&self) -> usize {
2098         self.tcx.sess.err_count() - self.err_count_on_creation
2099     }
2100
2101     /// Produces warning on the given node, if the current point in the
2102     /// function is unreachable, and there hasn't been another warning.
2103     fn warn_if_unreachable(&self, id: hir::HirId, span: Span, kind: &str) {
2104         if self.diverges.get() == Diverges::Always &&
2105             // If span arose from a desugaring of `if` then it is the condition itself,
2106             // which diverges, that we are about to lint on. This gives suboptimal diagnostics
2107             // and so we stop here and allow the block of the `if`-expression to be linted instead.
2108             !span.is_compiler_desugaring(CompilerDesugaringKind::IfTemporary) {
2109             self.diverges.set(Diverges::WarnedAlways);
2110
2111             debug!("warn_if_unreachable: id={:?} span={:?} kind={}", id, span, kind);
2112
2113             let msg = format!("unreachable {}", kind);
2114             self.tcx().lint_hir(lint::builtin::UNREACHABLE_CODE, id, span, &msg);
2115         }
2116     }
2117
2118     pub fn cause(&self,
2119                  span: Span,
2120                  code: ObligationCauseCode<'tcx>)
2121                  -> ObligationCause<'tcx> {
2122         ObligationCause::new(span, self.body_id, code)
2123     }
2124
2125     pub fn misc(&self, span: Span) -> ObligationCause<'tcx> {
2126         self.cause(span, ObligationCauseCode::MiscObligation)
2127     }
2128
2129     /// Resolves type variables in `ty` if possible. Unlike the infcx
2130     /// version (resolve_vars_if_possible), this version will
2131     /// also select obligations if it seems useful, in an effort
2132     /// to get more type information.
2133     fn resolve_type_vars_with_obligations(&self, mut ty: Ty<'tcx>) -> Ty<'tcx> {
2134         debug!("resolve_type_vars_with_obligations(ty={:?})", ty);
2135
2136         // No Infer()? Nothing needs doing.
2137         if !ty.has_infer_types() {
2138             debug!("resolve_type_vars_with_obligations: ty={:?}", ty);
2139             return ty;
2140         }
2141
2142         // If `ty` is a type variable, see whether we already know what it is.
2143         ty = self.resolve_vars_if_possible(&ty);
2144         if !ty.has_infer_types() {
2145             debug!("resolve_type_vars_with_obligations: ty={:?}", ty);
2146             return ty;
2147         }
2148
2149         // If not, try resolving pending obligations as much as
2150         // possible. This can help substantially when there are
2151         // indirect dependencies that don't seem worth tracking
2152         // precisely.
2153         self.select_obligations_where_possible(false);
2154         ty = self.resolve_vars_if_possible(&ty);
2155
2156         debug!("resolve_type_vars_with_obligations: ty={:?}", ty);
2157         ty
2158     }
2159
2160     fn record_deferred_call_resolution(
2161         &self,
2162         closure_def_id: DefId,
2163         r: DeferredCallResolution<'tcx>,
2164     ) {
2165         let mut deferred_call_resolutions = self.deferred_call_resolutions.borrow_mut();
2166         deferred_call_resolutions.entry(closure_def_id).or_default().push(r);
2167     }
2168
2169     fn remove_deferred_call_resolutions(
2170         &self,
2171         closure_def_id: DefId,
2172     ) -> Vec<DeferredCallResolution<'tcx>> {
2173         let mut deferred_call_resolutions = self.deferred_call_resolutions.borrow_mut();
2174         deferred_call_resolutions.remove(&closure_def_id).unwrap_or(vec![])
2175     }
2176
2177     pub fn tag(&self) -> String {
2178         format!("{:p}", self)
2179     }
2180
2181     pub fn local_ty(&self, span: Span, nid: hir::HirId) -> LocalTy<'tcx> {
2182         self.locals.borrow().get(&nid).cloned().unwrap_or_else(||
2183             span_bug!(span, "no type for local variable {}",
2184                       self.tcx.hir().node_to_string(nid))
2185         )
2186     }
2187
2188     #[inline]
2189     pub fn write_ty(&self, id: hir::HirId, ty: Ty<'tcx>) {
2190         debug!("write_ty({:?}, {:?}) in fcx {}",
2191                id, self.resolve_vars_if_possible(&ty), self.tag());
2192         self.tables.borrow_mut().node_types_mut().insert(id, ty);
2193
2194         if ty.references_error() {
2195             self.has_errors.set(true);
2196             self.set_tainted_by_errors();
2197         }
2198     }
2199
2200     pub fn write_field_index(&self, hir_id: hir::HirId, index: usize) {
2201         self.tables.borrow_mut().field_indices_mut().insert(hir_id, index);
2202     }
2203
2204     fn write_resolution(&self, hir_id: hir::HirId, r: Result<(DefKind, DefId), ErrorReported>) {
2205         self.tables.borrow_mut().type_dependent_defs_mut().insert(hir_id, r);
2206     }
2207
2208     pub fn write_method_call(&self,
2209                              hir_id: hir::HirId,
2210                              method: MethodCallee<'tcx>) {
2211         debug!("write_method_call(hir_id={:?}, method={:?})", hir_id, method);
2212         self.write_resolution(hir_id, Ok((DefKind::Method, method.def_id)));
2213         self.write_substs(hir_id, method.substs);
2214
2215         // When the method is confirmed, the `method.substs` includes
2216         // parameters from not just the method, but also the impl of
2217         // the method -- in particular, the `Self` type will be fully
2218         // resolved. However, those are not something that the "user
2219         // specified" -- i.e., those types come from the inferred type
2220         // of the receiver, not something the user wrote. So when we
2221         // create the user-substs, we want to replace those earlier
2222         // types with just the types that the user actually wrote --
2223         // that is, those that appear on the *method itself*.
2224         //
2225         // As an example, if the user wrote something like
2226         // `foo.bar::<u32>(...)` -- the `Self` type here will be the
2227         // type of `foo` (possibly adjusted), but we don't want to
2228         // include that. We want just the `[_, u32]` part.
2229         if !method.substs.is_noop() {
2230             let method_generics = self.tcx.generics_of(method.def_id);
2231             if !method_generics.params.is_empty() {
2232                 let user_type_annotation = self.infcx.probe(|_| {
2233                     let user_substs = UserSubsts {
2234                         substs: InternalSubsts::for_item(self.tcx, method.def_id, |param, _| {
2235                             let i = param.index as usize;
2236                             if i < method_generics.parent_count {
2237                                 self.infcx.var_for_def(DUMMY_SP, param)
2238                             } else {
2239                                 method.substs[i]
2240                             }
2241                         }),
2242                         user_self_ty: None, // not relevant here
2243                     };
2244
2245                     self.infcx.canonicalize_user_type_annotation(&UserType::TypeOf(
2246                         method.def_id,
2247                         user_substs,
2248                     ))
2249                 });
2250
2251                 debug!("write_method_call: user_type_annotation={:?}", user_type_annotation);
2252                 self.write_user_type_annotation(hir_id, user_type_annotation);
2253             }
2254         }
2255     }
2256
2257     pub fn write_substs(&self, node_id: hir::HirId, substs: SubstsRef<'tcx>) {
2258         if !substs.is_noop() {
2259             debug!("write_substs({:?}, {:?}) in fcx {}",
2260                    node_id,
2261                    substs,
2262                    self.tag());
2263
2264             self.tables.borrow_mut().node_substs_mut().insert(node_id, substs);
2265         }
2266     }
2267
2268     /// Given the substs that we just converted from the HIR, try to
2269     /// canonicalize them and store them as user-given substitutions
2270     /// (i.e., substitutions that must be respected by the NLL check).
2271     ///
2272     /// This should be invoked **before any unifications have
2273     /// occurred**, so that annotations like `Vec<_>` are preserved
2274     /// properly.
2275     pub fn write_user_type_annotation_from_substs(
2276         &self,
2277         hir_id: hir::HirId,
2278         def_id: DefId,
2279         substs: SubstsRef<'tcx>,
2280         user_self_ty: Option<UserSelfTy<'tcx>>,
2281     ) {
2282         debug!(
2283             "write_user_type_annotation_from_substs: hir_id={:?} def_id={:?} substs={:?} \
2284              user_self_ty={:?} in fcx {}",
2285             hir_id, def_id, substs, user_self_ty, self.tag(),
2286         );
2287
2288         if Self::can_contain_user_lifetime_bounds((substs, user_self_ty)) {
2289             let canonicalized = self.infcx.canonicalize_user_type_annotation(
2290                 &UserType::TypeOf(def_id, UserSubsts {
2291                     substs,
2292                     user_self_ty,
2293                 })
2294             );
2295             debug!("write_user_type_annotation_from_substs: canonicalized={:?}", canonicalized);
2296             self.write_user_type_annotation(hir_id, canonicalized);
2297         }
2298     }
2299
2300     pub fn write_user_type_annotation(
2301         &self,
2302         hir_id: hir::HirId,
2303         canonical_user_type_annotation: CanonicalUserType<'tcx>,
2304     ) {
2305         debug!(
2306             "write_user_type_annotation: hir_id={:?} canonical_user_type_annotation={:?} tag={}",
2307             hir_id, canonical_user_type_annotation, self.tag(),
2308         );
2309
2310         if !canonical_user_type_annotation.is_identity() {
2311             self.tables.borrow_mut().user_provided_types_mut().insert(
2312                 hir_id, canonical_user_type_annotation
2313             );
2314         } else {
2315             debug!("write_user_type_annotation: skipping identity substs");
2316         }
2317     }
2318
2319     pub fn apply_adjustments(&self, expr: &hir::Expr, adj: Vec<Adjustment<'tcx>>) {
2320         debug!("apply_adjustments(expr={:?}, adj={:?})", expr, adj);
2321
2322         if adj.is_empty() {
2323             return;
2324         }
2325
2326         match self.tables.borrow_mut().adjustments_mut().entry(expr.hir_id) {
2327             Entry::Vacant(entry) => { entry.insert(adj); },
2328             Entry::Occupied(mut entry) => {
2329                 debug!(" - composing on top of {:?}", entry.get());
2330                 match (&entry.get()[..], &adj[..]) {
2331                     // Applying any adjustment on top of a NeverToAny
2332                     // is a valid NeverToAny adjustment, because it can't
2333                     // be reached.
2334                     (&[Adjustment { kind: Adjust::NeverToAny, .. }], _) => return,
2335                     (&[
2336                         Adjustment { kind: Adjust::Deref(_), .. },
2337                         Adjustment { kind: Adjust::Borrow(AutoBorrow::Ref(..)), .. },
2338                     ], &[
2339                         Adjustment { kind: Adjust::Deref(_), .. },
2340                         .. // Any following adjustments are allowed.
2341                     ]) => {
2342                         // A reborrow has no effect before a dereference.
2343                     }
2344                     // FIXME: currently we never try to compose autoderefs
2345                     // and ReifyFnPointer/UnsafeFnPointer, but we could.
2346                     _ =>
2347                         bug!("while adjusting {:?}, can't compose {:?} and {:?}",
2348                              expr, entry.get(), adj)
2349                 };
2350                 *entry.get_mut() = adj;
2351             }
2352         }
2353     }
2354
2355     /// Basically whenever we are converting from a type scheme into
2356     /// the fn body space, we always want to normalize associated
2357     /// types as well. This function combines the two.
2358     fn instantiate_type_scheme<T>(&self,
2359                                   span: Span,
2360                                   substs: SubstsRef<'tcx>,
2361                                   value: &T)
2362                                   -> T
2363         where T : TypeFoldable<'tcx>
2364     {
2365         let value = value.subst(self.tcx, substs);
2366         let result = self.normalize_associated_types_in(span, &value);
2367         debug!("instantiate_type_scheme(value={:?}, substs={:?}) = {:?}",
2368                value,
2369                substs,
2370                result);
2371         result
2372     }
2373
2374     /// As `instantiate_type_scheme`, but for the bounds found in a
2375     /// generic type scheme.
2376     fn instantiate_bounds(&self, span: Span, def_id: DefId, substs: SubstsRef<'tcx>)
2377                           -> ty::InstantiatedPredicates<'tcx> {
2378         let bounds = self.tcx.predicates_of(def_id);
2379         let result = bounds.instantiate(self.tcx, substs);
2380         let result = self.normalize_associated_types_in(span, &result);
2381         debug!("instantiate_bounds(bounds={:?}, substs={:?}) = {:?}",
2382                bounds,
2383                substs,
2384                result);
2385         result
2386     }
2387
2388     /// Replaces the opaque types from the given value with type variables,
2389     /// and records the `OpaqueTypeMap` for later use during writeback. See
2390     /// `InferCtxt::instantiate_opaque_types` for more details.
2391     fn instantiate_opaque_types_from_value<T: TypeFoldable<'tcx>>(
2392         &self,
2393         parent_id: hir::HirId,
2394         value: &T,
2395     ) -> T {
2396         let parent_def_id = self.tcx.hir().local_def_id_from_hir_id(parent_id);
2397         debug!("instantiate_opaque_types_from_value(parent_def_id={:?}, value={:?})",
2398                parent_def_id,
2399                value);
2400
2401         let (value, opaque_type_map) = self.register_infer_ok_obligations(
2402             self.instantiate_opaque_types(
2403                 parent_def_id,
2404                 self.body_id,
2405                 self.param_env,
2406                 value,
2407             )
2408         );
2409
2410         let mut opaque_types = self.opaque_types.borrow_mut();
2411         for (ty, decl) in opaque_type_map {
2412             let old_value = opaque_types.insert(ty, decl);
2413             assert!(old_value.is_none(), "instantiated twice: {:?}/{:?}", ty, decl);
2414         }
2415
2416         value
2417     }
2418
2419     fn normalize_associated_types_in<T>(&self, span: Span, value: &T) -> T
2420         where T : TypeFoldable<'tcx>
2421     {
2422         self.inh.normalize_associated_types_in(span, self.body_id, self.param_env, value)
2423     }
2424
2425     fn normalize_associated_types_in_as_infer_ok<T>(&self, span: Span, value: &T)
2426                                                     -> InferOk<'tcx, T>
2427         where T : TypeFoldable<'tcx>
2428     {
2429         self.inh.partially_normalize_associated_types_in(span,
2430                                                          self.body_id,
2431                                                          self.param_env,
2432                                                          value)
2433     }
2434
2435     pub fn require_type_meets(&self,
2436                               ty: Ty<'tcx>,
2437                               span: Span,
2438                               code: traits::ObligationCauseCode<'tcx>,
2439                               def_id: DefId)
2440     {
2441         self.register_bound(
2442             ty,
2443             def_id,
2444             traits::ObligationCause::new(span, self.body_id, code));
2445     }
2446
2447     pub fn require_type_is_sized(&self,
2448                                  ty: Ty<'tcx>,
2449                                  span: Span,
2450                                  code: traits::ObligationCauseCode<'tcx>)
2451     {
2452         let lang_item = self.tcx.require_lang_item(lang_items::SizedTraitLangItem);
2453         self.require_type_meets(ty, span, code, lang_item);
2454     }
2455
2456     pub fn require_type_is_sized_deferred(&self,
2457                                           ty: Ty<'tcx>,
2458                                           span: Span,
2459                                           code: traits::ObligationCauseCode<'tcx>)
2460     {
2461         self.deferred_sized_obligations.borrow_mut().push((ty, span, code));
2462     }
2463
2464     pub fn register_bound(&self,
2465                           ty: Ty<'tcx>,
2466                           def_id: DefId,
2467                           cause: traits::ObligationCause<'tcx>)
2468     {
2469         self.fulfillment_cx.borrow_mut()
2470                            .register_bound(self, self.param_env, ty, def_id, cause);
2471     }
2472
2473     pub fn to_ty(&self, ast_t: &hir::Ty) -> Ty<'tcx> {
2474         let t = AstConv::ast_ty_to_ty(self, ast_t);
2475         self.register_wf_obligation(t, ast_t.span, traits::MiscObligation);
2476         t
2477     }
2478
2479     pub fn to_ty_saving_user_provided_ty(&self, ast_ty: &hir::Ty) -> Ty<'tcx> {
2480         let ty = self.to_ty(ast_ty);
2481         debug!("to_ty_saving_user_provided_ty: ty={:?}", ty);
2482
2483         if Self::can_contain_user_lifetime_bounds(ty) {
2484             let c_ty = self.infcx.canonicalize_response(&UserType::Ty(ty));
2485             debug!("to_ty_saving_user_provided_ty: c_ty={:?}", c_ty);
2486             self.tables.borrow_mut().user_provided_types_mut().insert(ast_ty.hir_id, c_ty);
2487         }
2488
2489         ty
2490     }
2491
2492     /// Returns the `DefId` of the constant parameter that the provided expression is a path to.
2493     pub fn const_param_def_id(&self, hir_c: &hir::AnonConst) -> Option<DefId> {
2494         AstConv::const_param_def_id(self, &self.tcx.hir().body(hir_c.body).value)
2495     }
2496
2497     pub fn to_const(&self, ast_c: &hir::AnonConst, ty: Ty<'tcx>) -> &'tcx ty::Const<'tcx> {
2498         AstConv::ast_const_to_const(self, ast_c, ty)
2499     }
2500
2501     // If the type given by the user has free regions, save it for later, since
2502     // NLL would like to enforce those. Also pass in types that involve
2503     // projections, since those can resolve to `'static` bounds (modulo #54940,
2504     // which hopefully will be fixed by the time you see this comment, dear
2505     // reader, although I have my doubts). Also pass in types with inference
2506     // types, because they may be repeated. Other sorts of things are already
2507     // sufficiently enforced with erased regions. =)
2508     fn can_contain_user_lifetime_bounds<T>(t: T) -> bool
2509     where
2510         T: TypeFoldable<'tcx>
2511     {
2512         t.has_free_regions() || t.has_projections() || t.has_infer_types()
2513     }
2514
2515     pub fn node_ty(&self, id: hir::HirId) -> Ty<'tcx> {
2516         match self.tables.borrow().node_types().get(id) {
2517             Some(&t) => t,
2518             None if self.is_tainted_by_errors() => self.tcx.types.err,
2519             None => {
2520                 bug!("no type for node {}: {} in fcx {}",
2521                      id, self.tcx.hir().node_to_string(id),
2522                      self.tag());
2523             }
2524         }
2525     }
2526
2527     /// Registers an obligation for checking later, during regionck, that the type `ty` must
2528     /// outlive the region `r`.
2529     pub fn register_wf_obligation(&self,
2530                                   ty: Ty<'tcx>,
2531                                   span: Span,
2532                                   code: traits::ObligationCauseCode<'tcx>)
2533     {
2534         // WF obligations never themselves fail, so no real need to give a detailed cause:
2535         let cause = traits::ObligationCause::new(span, self.body_id, code);
2536         self.register_predicate(traits::Obligation::new(cause,
2537                                                         self.param_env,
2538                                                         ty::Predicate::WellFormed(ty)));
2539     }
2540
2541     /// Registers obligations that all types appearing in `substs` are well-formed.
2542     pub fn add_wf_bounds(&self, substs: SubstsRef<'tcx>, expr: &hir::Expr) {
2543         for ty in substs.types() {
2544             self.register_wf_obligation(ty, expr.span, traits::MiscObligation);
2545         }
2546     }
2547
2548     /// Given a fully substituted set of bounds (`generic_bounds`), and the values with which each
2549     /// type/region parameter was instantiated (`substs`), creates and registers suitable
2550     /// trait/region obligations.
2551     ///
2552     /// For example, if there is a function:
2553     ///
2554     /// ```
2555     /// fn foo<'a,T:'a>(...)
2556     /// ```
2557     ///
2558     /// and a reference:
2559     ///
2560     /// ```
2561     /// let f = foo;
2562     /// ```
2563     ///
2564     /// Then we will create a fresh region variable `'$0` and a fresh type variable `$1` for `'a`
2565     /// and `T`. This routine will add a region obligation `$1:'$0` and register it locally.
2566     pub fn add_obligations_for_parameters(&self,
2567                                           cause: traits::ObligationCause<'tcx>,
2568                                           predicates: &ty::InstantiatedPredicates<'tcx>)
2569     {
2570         assert!(!predicates.has_escaping_bound_vars());
2571
2572         debug!("add_obligations_for_parameters(predicates={:?})",
2573                predicates);
2574
2575         for obligation in traits::predicates_for_generics(cause, self.param_env, predicates) {
2576             self.register_predicate(obligation);
2577         }
2578     }
2579
2580     // FIXME(arielb1): use this instead of field.ty everywhere
2581     // Only for fields! Returns <none> for methods>
2582     // Indifferent to privacy flags
2583     pub fn field_ty(&self,
2584                     span: Span,
2585                     field: &'tcx ty::FieldDef,
2586                     substs: SubstsRef<'tcx>)
2587                     -> Ty<'tcx>
2588     {
2589         self.normalize_associated_types_in(span, &field.ty(self.tcx, substs))
2590     }
2591
2592     fn check_casts(&self) {
2593         let mut deferred_cast_checks = self.deferred_cast_checks.borrow_mut();
2594         for cast in deferred_cast_checks.drain(..) {
2595             cast.check(self);
2596         }
2597     }
2598
2599     fn resolve_generator_interiors(&self, def_id: DefId) {
2600         let mut generators = self.deferred_generator_interiors.borrow_mut();
2601         for (body_id, interior) in generators.drain(..) {
2602             self.select_obligations_where_possible(false);
2603             generator_interior::resolve_interior(self, def_id, body_id, interior);
2604         }
2605     }
2606
2607     // Tries to apply a fallback to `ty` if it is an unsolved variable.
2608     // Non-numerics get replaced with ! or () (depending on whether
2609     // feature(never_type) is enabled, unconstrained ints with i32,
2610     // unconstrained floats with f64.
2611     // Fallback becomes very dubious if we have encountered type-checking errors.
2612     // In that case, fallback to Error.
2613     // The return value indicates whether fallback has occurred.
2614     fn fallback_if_possible(&self, ty: Ty<'tcx>) -> bool {
2615         use rustc::ty::error::UnconstrainedNumeric::Neither;
2616         use rustc::ty::error::UnconstrainedNumeric::{UnconstrainedInt, UnconstrainedFloat};
2617
2618         assert!(ty.is_ty_infer());
2619         let fallback = match self.type_is_unconstrained_numeric(ty) {
2620             _ if self.is_tainted_by_errors() => self.tcx().types.err,
2621             UnconstrainedInt => self.tcx.types.i32,
2622             UnconstrainedFloat => self.tcx.types.f64,
2623             Neither if self.type_var_diverges(ty) => self.tcx.mk_diverging_default(),
2624             Neither => return false,
2625         };
2626         debug!("fallback_if_possible: defaulting `{:?}` to `{:?}`", ty, fallback);
2627         self.demand_eqtype(syntax_pos::DUMMY_SP, ty, fallback);
2628         true
2629     }
2630
2631     fn select_all_obligations_or_error(&self) {
2632         debug!("select_all_obligations_or_error");
2633         if let Err(errors) = self.fulfillment_cx.borrow_mut().select_all_or_error(&self) {
2634             self.report_fulfillment_errors(&errors, self.inh.body_id, false);
2635         }
2636     }
2637
2638     /// Select as many obligations as we can at present.
2639     fn select_obligations_where_possible(&self, fallback_has_occurred: bool) {
2640         if let Err(errors) = self.fulfillment_cx.borrow_mut().select_where_possible(self) {
2641             self.report_fulfillment_errors(&errors, self.inh.body_id, fallback_has_occurred);
2642         }
2643     }
2644
2645     /// For the overloaded place expressions (`*x`, `x[3]`), the trait
2646     /// returns a type of `&T`, but the actual type we assign to the
2647     /// *expression* is `T`. So this function just peels off the return
2648     /// type by one layer to yield `T`.
2649     fn make_overloaded_place_return_type(&self,
2650                                           method: MethodCallee<'tcx>)
2651                                           -> ty::TypeAndMut<'tcx>
2652     {
2653         // extract method return type, which will be &T;
2654         let ret_ty = method.sig.output();
2655
2656         // method returns &T, but the type as visible to user is T, so deref
2657         ret_ty.builtin_deref(true).unwrap()
2658     }
2659
2660     fn lookup_indexing(
2661         &self,
2662         expr: &hir::Expr,
2663         base_expr: &'tcx hir::Expr,
2664         base_ty: Ty<'tcx>,
2665         idx_ty: Ty<'tcx>,
2666         needs: Needs,
2667     ) -> Option<(/*index type*/ Ty<'tcx>, /*element type*/ Ty<'tcx>)> {
2668         // FIXME(#18741) -- this is almost but not quite the same as the
2669         // autoderef that normal method probing does. They could likely be
2670         // consolidated.
2671
2672         let mut autoderef = self.autoderef(base_expr.span, base_ty);
2673         let mut result = None;
2674         while result.is_none() && autoderef.next().is_some() {
2675             result = self.try_index_step(expr, base_expr, &autoderef, needs, idx_ty);
2676         }
2677         autoderef.finalize(self);
2678         result
2679     }
2680
2681     /// To type-check `base_expr[index_expr]`, we progressively autoderef
2682     /// (and otherwise adjust) `base_expr`, looking for a type which either
2683     /// supports builtin indexing or overloaded indexing.
2684     /// This loop implements one step in that search; the autoderef loop
2685     /// is implemented by `lookup_indexing`.
2686     fn try_index_step(
2687         &self,
2688         expr: &hir::Expr,
2689         base_expr: &hir::Expr,
2690         autoderef: &Autoderef<'a, 'tcx>,
2691         needs: Needs,
2692         index_ty: Ty<'tcx>,
2693     ) -> Option<(/*index type*/ Ty<'tcx>, /*element type*/ Ty<'tcx>)> {
2694         let adjusted_ty = autoderef.unambiguous_final_ty(self);
2695         debug!("try_index_step(expr={:?}, base_expr={:?}, adjusted_ty={:?}, \
2696                                index_ty={:?})",
2697                expr,
2698                base_expr,
2699                adjusted_ty,
2700                index_ty);
2701
2702         for &unsize in &[false, true] {
2703             let mut self_ty = adjusted_ty;
2704             if unsize {
2705                 // We only unsize arrays here.
2706                 if let ty::Array(element_ty, _) = adjusted_ty.sty {
2707                     self_ty = self.tcx.mk_slice(element_ty);
2708                 } else {
2709                     continue;
2710                 }
2711             }
2712
2713             // If some lookup succeeds, write callee into table and extract index/element
2714             // type from the method signature.
2715             // If some lookup succeeded, install method in table
2716             let input_ty = self.next_ty_var(TypeVariableOrigin {
2717                 kind: TypeVariableOriginKind::AutoDeref,
2718                 span: base_expr.span,
2719             });
2720             let method = self.try_overloaded_place_op(
2721                 expr.span, self_ty, &[input_ty], needs, PlaceOp::Index);
2722
2723             let result = method.map(|ok| {
2724                 debug!("try_index_step: success, using overloaded indexing");
2725                 let method = self.register_infer_ok_obligations(ok);
2726
2727                 let mut adjustments = autoderef.adjust_steps(self, needs);
2728                 if let ty::Ref(region, _, r_mutbl) = method.sig.inputs()[0].sty {
2729                     let mutbl = match r_mutbl {
2730                         hir::MutImmutable => AutoBorrowMutability::Immutable,
2731                         hir::MutMutable => AutoBorrowMutability::Mutable {
2732                             // Indexing can be desugared to a method call,
2733                             // so maybe we could use two-phase here.
2734                             // See the documentation of AllowTwoPhase for why that's
2735                             // not the case today.
2736                             allow_two_phase_borrow: AllowTwoPhase::No,
2737                         }
2738                     };
2739                     adjustments.push(Adjustment {
2740                         kind: Adjust::Borrow(AutoBorrow::Ref(region, mutbl)),
2741                         target: self.tcx.mk_ref(region, ty::TypeAndMut {
2742                             mutbl: r_mutbl,
2743                             ty: adjusted_ty
2744                         })
2745                     });
2746                 }
2747                 if unsize {
2748                     adjustments.push(Adjustment {
2749                         kind: Adjust::Pointer(PointerCast::Unsize),
2750                         target: method.sig.inputs()[0]
2751                     });
2752                 }
2753                 self.apply_adjustments(base_expr, adjustments);
2754
2755                 self.write_method_call(expr.hir_id, method);
2756                 (input_ty, self.make_overloaded_place_return_type(method).ty)
2757             });
2758             if result.is_some() {
2759                 return result;
2760             }
2761         }
2762
2763         None
2764     }
2765
2766     fn resolve_place_op(&self, op: PlaceOp, is_mut: bool) -> (Option<DefId>, ast::Ident) {
2767         let (tr, name) = match (op, is_mut) {
2768             (PlaceOp::Deref, false) => (self.tcx.lang_items().deref_trait(), sym::deref),
2769             (PlaceOp::Deref, true) => (self.tcx.lang_items().deref_mut_trait(), sym::deref_mut),
2770             (PlaceOp::Index, false) => (self.tcx.lang_items().index_trait(), sym::index),
2771             (PlaceOp::Index, true) => (self.tcx.lang_items().index_mut_trait(), sym::index_mut),
2772         };
2773         (tr, ast::Ident::with_empty_ctxt(name))
2774     }
2775
2776     fn try_overloaded_place_op(&self,
2777                                 span: Span,
2778                                 base_ty: Ty<'tcx>,
2779                                 arg_tys: &[Ty<'tcx>],
2780                                 needs: Needs,
2781                                 op: PlaceOp)
2782                                 -> Option<InferOk<'tcx, MethodCallee<'tcx>>>
2783     {
2784         debug!("try_overloaded_place_op({:?},{:?},{:?},{:?})",
2785                span,
2786                base_ty,
2787                needs,
2788                op);
2789
2790         // Try Mut first, if needed.
2791         let (mut_tr, mut_op) = self.resolve_place_op(op, true);
2792         let method = match (needs, mut_tr) {
2793             (Needs::MutPlace, Some(trait_did)) => {
2794                 self.lookup_method_in_trait(span, mut_op, trait_did, base_ty, Some(arg_tys))
2795             }
2796             _ => None,
2797         };
2798
2799         // Otherwise, fall back to the immutable version.
2800         let (imm_tr, imm_op) = self.resolve_place_op(op, false);
2801         let method = match (method, imm_tr) {
2802             (None, Some(trait_did)) => {
2803                 self.lookup_method_in_trait(span, imm_op, trait_did, base_ty, Some(arg_tys))
2804             }
2805             (method, _) => method,
2806         };
2807
2808         method
2809     }
2810
2811     fn check_method_argument_types(
2812         &self,
2813         sp: Span,
2814         expr_sp: Span,
2815         method: Result<MethodCallee<'tcx>, ()>,
2816         args_no_rcvr: &'tcx [hir::Expr],
2817         tuple_arguments: TupleArgumentsFlag,
2818         expected: Expectation<'tcx>,
2819     ) -> Ty<'tcx> {
2820         let has_error = match method {
2821             Ok(method) => {
2822                 method.substs.references_error() || method.sig.references_error()
2823             }
2824             Err(_) => true
2825         };
2826         if has_error {
2827             let err_inputs = self.err_args(args_no_rcvr.len());
2828
2829             let err_inputs = match tuple_arguments {
2830                 DontTupleArguments => err_inputs,
2831                 TupleArguments => vec![self.tcx.intern_tup(&err_inputs[..])],
2832             };
2833
2834             self.check_argument_types(sp, expr_sp, &err_inputs[..], &[], args_no_rcvr,
2835                                       false, tuple_arguments, None);
2836             return self.tcx.types.err;
2837         }
2838
2839         let method = method.unwrap();
2840         // HACK(eddyb) ignore self in the definition (see above).
2841         let expected_arg_tys = self.expected_inputs_for_expected_output(
2842             sp,
2843             expected,
2844             method.sig.output(),
2845             &method.sig.inputs()[1..]
2846         );
2847         self.check_argument_types(sp, expr_sp, &method.sig.inputs()[1..], &expected_arg_tys[..],
2848                                   args_no_rcvr, method.sig.c_variadic, tuple_arguments,
2849                                   self.tcx.hir().span_if_local(method.def_id));
2850         method.sig.output()
2851     }
2852
2853     fn self_type_matches_expected_vid(
2854         &self,
2855         trait_ref: ty::PolyTraitRef<'tcx>,
2856         expected_vid: ty::TyVid,
2857     ) -> bool {
2858         let self_ty = self.shallow_resolve(trait_ref.self_ty());
2859         debug!(
2860             "self_type_matches_expected_vid(trait_ref={:?}, self_ty={:?}, expected_vid={:?})",
2861             trait_ref, self_ty, expected_vid
2862         );
2863         match self_ty.sty {
2864             ty::Infer(ty::TyVar(found_vid)) => {
2865                 // FIXME: consider using `sub_root_var` here so we
2866                 // can see through subtyping.
2867                 let found_vid = self.root_var(found_vid);
2868                 debug!("self_type_matches_expected_vid - found_vid={:?}", found_vid);
2869                 expected_vid == found_vid
2870             }
2871             _ => false
2872         }
2873     }
2874
2875     fn obligations_for_self_ty<'b>(
2876         &'b self,
2877         self_ty: ty::TyVid,
2878     ) -> impl Iterator<Item = (ty::PolyTraitRef<'tcx>, traits::PredicateObligation<'tcx>)>
2879                  + Captures<'tcx>
2880                  + 'b {
2881         // FIXME: consider using `sub_root_var` here so we
2882         // can see through subtyping.
2883         let ty_var_root = self.root_var(self_ty);
2884         debug!("obligations_for_self_ty: self_ty={:?} ty_var_root={:?} pending_obligations={:?}",
2885                self_ty, ty_var_root,
2886                self.fulfillment_cx.borrow().pending_obligations());
2887
2888         self.fulfillment_cx
2889             .borrow()
2890             .pending_obligations()
2891             .into_iter()
2892             .filter_map(move |obligation| match obligation.predicate {
2893                 ty::Predicate::Projection(ref data) =>
2894                     Some((data.to_poly_trait_ref(self.tcx), obligation)),
2895                 ty::Predicate::Trait(ref data) =>
2896                     Some((data.to_poly_trait_ref(), obligation)),
2897                 ty::Predicate::Subtype(..) => None,
2898                 ty::Predicate::RegionOutlives(..) => None,
2899                 ty::Predicate::TypeOutlives(..) => None,
2900                 ty::Predicate::WellFormed(..) => None,
2901                 ty::Predicate::ObjectSafe(..) => None,
2902                 ty::Predicate::ConstEvaluatable(..) => None,
2903                 // N.B., this predicate is created by breaking down a
2904                 // `ClosureType: FnFoo()` predicate, where
2905                 // `ClosureType` represents some `Closure`. It can't
2906                 // possibly be referring to the current closure,
2907                 // because we haven't produced the `Closure` for
2908                 // this closure yet; this is exactly why the other
2909                 // code is looking for a self type of a unresolved
2910                 // inference variable.
2911                 ty::Predicate::ClosureKind(..) => None,
2912             }).filter(move |(tr, _)| self.self_type_matches_expected_vid(*tr, ty_var_root))
2913     }
2914
2915     fn type_var_is_sized(&self, self_ty: ty::TyVid) -> bool {
2916         self.obligations_for_self_ty(self_ty).any(|(tr, _)| {
2917             Some(tr.def_id()) == self.tcx.lang_items().sized_trait()
2918         })
2919     }
2920
2921     /// Generic function that factors out common logic from function calls,
2922     /// method calls and overloaded operators.
2923     fn check_argument_types(
2924         &self,
2925         sp: Span,
2926         expr_sp: Span,
2927         fn_inputs: &[Ty<'tcx>],
2928         expected_arg_tys: &[Ty<'tcx>],
2929         args: &'tcx [hir::Expr],
2930         c_variadic: bool,
2931         tuple_arguments: TupleArgumentsFlag,
2932         def_span: Option<Span>,
2933     ) {
2934         let tcx = self.tcx;
2935
2936         // Grab the argument types, supplying fresh type variables
2937         // if the wrong number of arguments were supplied
2938         let supplied_arg_count = if tuple_arguments == DontTupleArguments {
2939             args.len()
2940         } else {
2941             1
2942         };
2943
2944         // All the input types from the fn signature must outlive the call
2945         // so as to validate implied bounds.
2946         for &fn_input_ty in fn_inputs {
2947             self.register_wf_obligation(fn_input_ty, sp, traits::MiscObligation);
2948         }
2949
2950         let expected_arg_count = fn_inputs.len();
2951
2952         let param_count_error = |expected_count: usize,
2953                                  arg_count: usize,
2954                                  error_code: &str,
2955                                  c_variadic: bool,
2956                                  sugg_unit: bool| {
2957             let mut err = tcx.sess.struct_span_err_with_code(sp,
2958                 &format!("this function takes {}{} but {} {} supplied",
2959                     if c_variadic { "at least " } else { "" },
2960                     potentially_plural_count(expected_count, "parameter"),
2961                     potentially_plural_count(arg_count, "parameter"),
2962                     if arg_count == 1 {"was"} else {"were"}),
2963                 DiagnosticId::Error(error_code.to_owned()));
2964
2965             if let Some(def_s) = def_span.map(|sp| tcx.sess.source_map().def_span(sp)) {
2966                 err.span_label(def_s, "defined here");
2967             }
2968             if sugg_unit {
2969                 let sugg_span = tcx.sess.source_map().end_point(expr_sp);
2970                 // remove closing `)` from the span
2971                 let sugg_span = sugg_span.shrink_to_lo();
2972                 err.span_suggestion(
2973                     sugg_span,
2974                     "expected the unit value `()`; create it with empty parentheses",
2975                     String::from("()"),
2976                     Applicability::MachineApplicable);
2977             } else {
2978                 err.span_label(sp, format!("expected {}{}",
2979                                            if c_variadic { "at least " } else { "" },
2980                                            potentially_plural_count(expected_count, "parameter")));
2981             }
2982             err.emit();
2983         };
2984
2985         let mut expected_arg_tys = expected_arg_tys.to_vec();
2986
2987         let formal_tys = if tuple_arguments == TupleArguments {
2988             let tuple_type = self.structurally_resolved_type(sp, fn_inputs[0]);
2989             match tuple_type.sty {
2990                 ty::Tuple(arg_types) if arg_types.len() != args.len() => {
2991                     param_count_error(arg_types.len(), args.len(), "E0057", false, false);
2992                     expected_arg_tys = vec![];
2993                     self.err_args(args.len())
2994                 }
2995                 ty::Tuple(arg_types) => {
2996                     expected_arg_tys = match expected_arg_tys.get(0) {
2997                         Some(&ty) => match ty.sty {
2998                             ty::Tuple(ref tys) => tys.iter().map(|k| k.expect_ty()).collect(),
2999                             _ => vec![],
3000                         },
3001                         None => vec![],
3002                     };
3003                     arg_types.iter().map(|k| k.expect_ty()).collect()
3004                 }
3005                 _ => {
3006                     span_err!(tcx.sess, sp, E0059,
3007                         "cannot use call notation; the first type parameter \
3008                          for the function trait is neither a tuple nor unit");
3009                     expected_arg_tys = vec![];
3010                     self.err_args(args.len())
3011                 }
3012             }
3013         } else if expected_arg_count == supplied_arg_count {
3014             fn_inputs.to_vec()
3015         } else if c_variadic {
3016             if supplied_arg_count >= expected_arg_count {
3017                 fn_inputs.to_vec()
3018             } else {
3019                 param_count_error(expected_arg_count, supplied_arg_count, "E0060", true, false);
3020                 expected_arg_tys = vec![];
3021                 self.err_args(supplied_arg_count)
3022             }
3023         } else {
3024             // is the missing argument of type `()`?
3025             let sugg_unit = if expected_arg_tys.len() == 1 && supplied_arg_count == 0 {
3026                 self.resolve_vars_if_possible(&expected_arg_tys[0]).is_unit()
3027             } else if fn_inputs.len() == 1 && supplied_arg_count == 0 {
3028                 self.resolve_vars_if_possible(&fn_inputs[0]).is_unit()
3029             } else {
3030                 false
3031             };
3032             param_count_error(expected_arg_count, supplied_arg_count, "E0061", false, sugg_unit);
3033
3034             expected_arg_tys = vec![];
3035             self.err_args(supplied_arg_count)
3036         };
3037
3038         debug!("check_argument_types: formal_tys={:?}",
3039                formal_tys.iter().map(|t| self.ty_to_string(*t)).collect::<Vec<String>>());
3040
3041         // If there is no expectation, expect formal_tys.
3042         let expected_arg_tys = if !expected_arg_tys.is_empty() {
3043             expected_arg_tys
3044         } else {
3045             formal_tys.clone()
3046         };
3047
3048         // Check the arguments.
3049         // We do this in a pretty awful way: first we type-check any arguments
3050         // that are not closures, then we type-check the closures. This is so
3051         // that we have more information about the types of arguments when we
3052         // type-check the functions. This isn't really the right way to do this.
3053         for &check_closures in &[false, true] {
3054             debug!("check_closures={}", check_closures);
3055
3056             // More awful hacks: before we check argument types, try to do
3057             // an "opportunistic" vtable resolution of any trait bounds on
3058             // the call. This helps coercions.
3059             if check_closures {
3060                 self.select_obligations_where_possible(false);
3061             }
3062
3063             // For C-variadic functions, we don't have a declared type for all of
3064             // the arguments hence we only do our usual type checking with
3065             // the arguments who's types we do know.
3066             let t = if c_variadic {
3067                 expected_arg_count
3068             } else if tuple_arguments == TupleArguments {
3069                 args.len()
3070             } else {
3071                 supplied_arg_count
3072             };
3073             for (i, arg) in args.iter().take(t).enumerate() {
3074                 // Warn only for the first loop (the "no closures" one).
3075                 // Closure arguments themselves can't be diverging, but
3076                 // a previous argument can, e.g., `foo(panic!(), || {})`.
3077                 if !check_closures {
3078                     self.warn_if_unreachable(arg.hir_id, arg.span, "expression");
3079                 }
3080
3081                 let is_closure = match arg.node {
3082                     ExprKind::Closure(..) => true,
3083                     _ => false
3084                 };
3085
3086                 if is_closure != check_closures {
3087                     continue;
3088                 }
3089
3090                 debug!("checking the argument");
3091                 let formal_ty = formal_tys[i];
3092
3093                 // The special-cased logic below has three functions:
3094                 // 1. Provide as good of an expected type as possible.
3095                 let expected = Expectation::rvalue_hint(self, expected_arg_tys[i]);
3096
3097                 let checked_ty = self.check_expr_with_expectation(&arg, expected);
3098
3099                 // 2. Coerce to the most detailed type that could be coerced
3100                 //    to, which is `expected_ty` if `rvalue_hint` returns an
3101                 //    `ExpectHasType(expected_ty)`, or the `formal_ty` otherwise.
3102                 let coerce_ty = expected.only_has_type(self).unwrap_or(formal_ty);
3103                 // We're processing function arguments so we definitely want to use
3104                 // two-phase borrows.
3105                 self.demand_coerce(&arg, checked_ty, coerce_ty, AllowTwoPhase::Yes);
3106
3107                 // 3. Relate the expected type and the formal one,
3108                 //    if the expected type was used for the coercion.
3109                 self.demand_suptype(arg.span, formal_ty, coerce_ty);
3110             }
3111         }
3112
3113         // We also need to make sure we at least write the ty of the other
3114         // arguments which we skipped above.
3115         if c_variadic {
3116             fn variadic_error<'tcx>(s: &Session, span: Span, t: Ty<'tcx>, cast_ty: &str) {
3117                 use crate::structured_errors::{VariadicError, StructuredDiagnostic};
3118                 VariadicError::new(s, span, t, cast_ty).diagnostic().emit();
3119             }
3120
3121             for arg in args.iter().skip(expected_arg_count) {
3122                 let arg_ty = self.check_expr(&arg);
3123
3124                 // There are a few types which get autopromoted when passed via varargs
3125                 // in C but we just error out instead and require explicit casts.
3126                 let arg_ty = self.structurally_resolved_type(arg.span, arg_ty);
3127                 match arg_ty.sty {
3128                     ty::Float(ast::FloatTy::F32) => {
3129                         variadic_error(tcx.sess, arg.span, arg_ty, "c_double");
3130                     }
3131                     ty::Int(ast::IntTy::I8) | ty::Int(ast::IntTy::I16) | ty::Bool => {
3132                         variadic_error(tcx.sess, arg.span, arg_ty, "c_int");
3133                     }
3134                     ty::Uint(ast::UintTy::U8) | ty::Uint(ast::UintTy::U16) => {
3135                         variadic_error(tcx.sess, arg.span, arg_ty, "c_uint");
3136                     }
3137                     ty::FnDef(..) => {
3138                         let ptr_ty = self.tcx.mk_fn_ptr(arg_ty.fn_sig(self.tcx));
3139                         let ptr_ty = self.resolve_vars_if_possible(&ptr_ty);
3140                         variadic_error(tcx.sess, arg.span, arg_ty, &ptr_ty.to_string());
3141                     }
3142                     _ => {}
3143                 }
3144             }
3145         }
3146     }
3147
3148     fn err_args(&self, len: usize) -> Vec<Ty<'tcx>> {
3149         vec![self.tcx.types.err; len]
3150     }
3151
3152     // AST fragment checking
3153     fn check_lit(&self,
3154                  lit: &hir::Lit,
3155                  expected: Expectation<'tcx>)
3156                  -> Ty<'tcx>
3157     {
3158         let tcx = self.tcx;
3159
3160         match lit.node {
3161             ast::LitKind::Str(..) => tcx.mk_static_str(),
3162             ast::LitKind::ByteStr(ref v) => {
3163                 tcx.mk_imm_ref(tcx.lifetimes.re_static,
3164                                tcx.mk_array(tcx.types.u8, v.len() as u64))
3165             }
3166             ast::LitKind::Byte(_) => tcx.types.u8,
3167             ast::LitKind::Char(_) => tcx.types.char,
3168             ast::LitKind::Int(_, ast::LitIntType::Signed(t)) => tcx.mk_mach_int(t),
3169             ast::LitKind::Int(_, ast::LitIntType::Unsigned(t)) => tcx.mk_mach_uint(t),
3170             ast::LitKind::Int(_, ast::LitIntType::Unsuffixed) => {
3171                 let opt_ty = expected.to_option(self).and_then(|ty| {
3172                     match ty.sty {
3173                         ty::Int(_) | ty::Uint(_) => Some(ty),
3174                         ty::Char => Some(tcx.types.u8),
3175                         ty::RawPtr(..) => Some(tcx.types.usize),
3176                         ty::FnDef(..) | ty::FnPtr(_) => Some(tcx.types.usize),
3177                         _ => None
3178                     }
3179                 });
3180                 opt_ty.unwrap_or_else(|| self.next_int_var())
3181             }
3182             ast::LitKind::Float(_, t) => tcx.mk_mach_float(t),
3183             ast::LitKind::FloatUnsuffixed(_) => {
3184                 let opt_ty = expected.to_option(self).and_then(|ty| {
3185                     match ty.sty {
3186                         ty::Float(_) => Some(ty),
3187                         _ => None
3188                     }
3189                 });
3190                 opt_ty.unwrap_or_else(|| self.next_float_var())
3191             }
3192             ast::LitKind::Bool(_) => tcx.types.bool,
3193             ast::LitKind::Err(_) => tcx.types.err,
3194         }
3195     }
3196
3197     // Determine the `Self` type, using fresh variables for all variables
3198     // declared on the impl declaration e.g., `impl<A,B> for Vec<(A,B)>`
3199     // would return `($0, $1)` where `$0` and `$1` are freshly instantiated type
3200     // variables.
3201     pub fn impl_self_ty(&self,
3202                         span: Span, // (potential) receiver for this impl
3203                         did: DefId)
3204                         -> TypeAndSubsts<'tcx> {
3205         let ity = self.tcx.type_of(did);
3206         debug!("impl_self_ty: ity={:?}", ity);
3207
3208         let substs = self.fresh_substs_for_item(span, did);
3209         let substd_ty = self.instantiate_type_scheme(span, &substs, &ity);
3210
3211         TypeAndSubsts { substs: substs, ty: substd_ty }
3212     }
3213
3214     /// Unifies the output type with the expected type early, for more coercions
3215     /// and forward type information on the input expressions.
3216     fn expected_inputs_for_expected_output(&self,
3217                                            call_span: Span,
3218                                            expected_ret: Expectation<'tcx>,
3219                                            formal_ret: Ty<'tcx>,
3220                                            formal_args: &[Ty<'tcx>])
3221                                            -> Vec<Ty<'tcx>> {
3222         let formal_ret = self.resolve_type_vars_with_obligations(formal_ret);
3223         let ret_ty = match expected_ret.only_has_type(self) {
3224             Some(ret) => ret,
3225             None => return Vec::new()
3226         };
3227         let expect_args = self.fudge_inference_if_ok(|| {
3228             // Attempt to apply a subtyping relationship between the formal
3229             // return type (likely containing type variables if the function
3230             // is polymorphic) and the expected return type.
3231             // No argument expectations are produced if unification fails.
3232             let origin = self.misc(call_span);
3233             let ures = self.at(&origin, self.param_env).sup(ret_ty, &formal_ret);
3234
3235             // FIXME(#27336) can't use ? here, Try::from_error doesn't default
3236             // to identity so the resulting type is not constrained.
3237             match ures {
3238                 Ok(ok) => {
3239                     // Process any obligations locally as much as
3240                     // we can.  We don't care if some things turn
3241                     // out unconstrained or ambiguous, as we're
3242                     // just trying to get hints here.
3243                     self.save_and_restore_in_snapshot_flag(|_| {
3244                         let mut fulfill = TraitEngine::new(self.tcx);
3245                         for obligation in ok.obligations {
3246                             fulfill.register_predicate_obligation(self, obligation);
3247                         }
3248                         fulfill.select_where_possible(self)
3249                     }).map_err(|_| ())?;
3250                 }
3251                 Err(_) => return Err(()),
3252             }
3253
3254             // Record all the argument types, with the substitutions
3255             // produced from the above subtyping unification.
3256             Ok(formal_args.iter().map(|ty| {
3257                 self.resolve_vars_if_possible(ty)
3258             }).collect())
3259         }).unwrap_or_default();
3260         debug!("expected_inputs_for_expected_output(formal={:?} -> {:?}, expected={:?} -> {:?})",
3261                formal_args, formal_ret,
3262                expect_args, expected_ret);
3263         expect_args
3264     }
3265
3266     pub fn check_struct_path(&self,
3267                              qpath: &QPath,
3268                              hir_id: hir::HirId)
3269                              -> Option<(&'tcx ty::VariantDef,  Ty<'tcx>)> {
3270         let path_span = match *qpath {
3271             QPath::Resolved(_, ref path) => path.span,
3272             QPath::TypeRelative(ref qself, _) => qself.span
3273         };
3274         let (def, ty) = self.finish_resolving_struct_path(qpath, path_span, hir_id);
3275         let variant = match def {
3276             Res::Err => {
3277                 self.set_tainted_by_errors();
3278                 return None;
3279             }
3280             Res::Def(DefKind::Variant, _) => {
3281                 match ty.sty {
3282                     ty::Adt(adt, substs) => {
3283                         Some((adt.variant_of_res(def), adt.did, substs))
3284                     }
3285                     _ => bug!("unexpected type: {:?}", ty)
3286                 }
3287             }
3288             Res::Def(DefKind::Struct, _)
3289             | Res::Def(DefKind::Union, _)
3290             | Res::Def(DefKind::TyAlias, _)
3291             | Res::Def(DefKind::AssocTy, _)
3292             | Res::SelfTy(..) => {
3293                 match ty.sty {
3294                     ty::Adt(adt, substs) if !adt.is_enum() => {
3295                         Some((adt.non_enum_variant(), adt.did, substs))
3296                     }
3297                     _ => None,
3298                 }
3299             }
3300             _ => bug!("unexpected definition: {:?}", def)
3301         };
3302
3303         if let Some((variant, did, substs)) = variant {
3304             debug!("check_struct_path: did={:?} substs={:?}", did, substs);
3305             self.write_user_type_annotation_from_substs(hir_id, did, substs, None);
3306
3307             // Check bounds on type arguments used in the path.
3308             let bounds = self.instantiate_bounds(path_span, did, substs);
3309             let cause = traits::ObligationCause::new(path_span, self.body_id,
3310                                                      traits::ItemObligation(did));
3311             self.add_obligations_for_parameters(cause, &bounds);
3312
3313             Some((variant, ty))
3314         } else {
3315             struct_span_err!(self.tcx.sess, path_span, E0071,
3316                              "expected struct, variant or union type, found {}",
3317                              ty.sort_string(self.tcx))
3318                 .span_label(path_span, "not a struct")
3319                 .emit();
3320             None
3321         }
3322     }
3323
3324     // Finish resolving a path in a struct expression or pattern `S::A { .. }` if necessary.
3325     // The newly resolved definition is written into `type_dependent_defs`.
3326     fn finish_resolving_struct_path(&self,
3327                                     qpath: &QPath,
3328                                     path_span: Span,
3329                                     hir_id: hir::HirId)
3330                                     -> (Res, Ty<'tcx>)
3331     {
3332         match *qpath {
3333             QPath::Resolved(ref maybe_qself, ref path) => {
3334                 let self_ty = maybe_qself.as_ref().map(|qself| self.to_ty(qself));
3335                 let ty = AstConv::res_to_ty(self, self_ty, path, true);
3336                 (path.res, ty)
3337             }
3338             QPath::TypeRelative(ref qself, ref segment) => {
3339                 let ty = self.to_ty(qself);
3340
3341                 let res = if let hir::TyKind::Path(QPath::Resolved(_, ref path)) = qself.node {
3342                     path.res
3343                 } else {
3344                     Res::Err
3345                 };
3346                 let result = AstConv::associated_path_to_ty(
3347                     self,
3348                     hir_id,
3349                     path_span,
3350                     ty,
3351                     res,
3352                     segment,
3353                     true,
3354                 );
3355                 let ty = result.map(|(ty, _, _)| ty).unwrap_or(self.tcx().types.err);
3356                 let result = result.map(|(_, kind, def_id)| (kind, def_id));
3357
3358                 // Write back the new resolution.
3359                 self.write_resolution(hir_id, result);
3360
3361                 (result.map(|(kind, def_id)| Res::Def(kind, def_id)).unwrap_or(Res::Err), ty)
3362             }
3363         }
3364     }
3365
3366     /// Resolves an associated value path into a base type and associated constant, or method
3367     /// resolution. The newly resolved definition is written into `type_dependent_defs`.
3368     pub fn resolve_ty_and_res_ufcs<'b>(&self,
3369                                        qpath: &'b QPath,
3370                                        hir_id: hir::HirId,
3371                                        span: Span)
3372                                        -> (Res, Option<Ty<'tcx>>, &'b [hir::PathSegment])
3373     {
3374         debug!("resolve_ty_and_res_ufcs: qpath={:?} hir_id={:?} span={:?}", qpath, hir_id, span);
3375         let (ty, qself, item_segment) = match *qpath {
3376             QPath::Resolved(ref opt_qself, ref path) => {
3377                 return (path.res,
3378                         opt_qself.as_ref().map(|qself| self.to_ty(qself)),
3379                         &path.segments[..]);
3380             }
3381             QPath::TypeRelative(ref qself, ref segment) => {
3382                 (self.to_ty(qself), qself, segment)
3383             }
3384         };
3385         if let Some(&cached_result) = self.tables.borrow().type_dependent_defs().get(hir_id) {
3386             // Return directly on cache hit. This is useful to avoid doubly reporting
3387             // errors with default match binding modes. See #44614.
3388             let def = cached_result.map(|(kind, def_id)| Res::Def(kind, def_id))
3389                 .unwrap_or(Res::Err);
3390             return (def, Some(ty), slice::from_ref(&**item_segment));
3391         }
3392         let item_name = item_segment.ident;
3393         let result = self.resolve_ufcs(span, item_name, ty, hir_id).or_else(|error| {
3394             let result = match error {
3395                 method::MethodError::PrivateMatch(kind, def_id, _) => Ok((kind, def_id)),
3396                 _ => Err(ErrorReported),
3397             };
3398             if item_name.name != kw::Invalid {
3399                 self.report_method_error(
3400                     span,
3401                     ty,
3402                     item_name,
3403                     SelfSource::QPath(qself),
3404                     error,
3405                     None,
3406                 );
3407             }
3408             result
3409         });
3410
3411         // Write back the new resolution.
3412         self.write_resolution(hir_id, result);
3413         (
3414             result.map(|(kind, def_id)| Res::Def(kind, def_id)).unwrap_or(Res::Err),
3415             Some(ty),
3416             slice::from_ref(&**item_segment),
3417         )
3418     }
3419
3420     pub fn check_decl_initializer(
3421         &self,
3422         local: &'tcx hir::Local,
3423         init: &'tcx hir::Expr,
3424     ) -> Ty<'tcx> {
3425         // FIXME(tschottdorf): `contains_explicit_ref_binding()` must be removed
3426         // for #42640 (default match binding modes).
3427         //
3428         // See #44848.
3429         let ref_bindings = local.pat.contains_explicit_ref_binding();
3430
3431         let local_ty = self.local_ty(init.span, local.hir_id).revealed_ty;
3432         if let Some(m) = ref_bindings {
3433             // Somewhat subtle: if we have a `ref` binding in the pattern,
3434             // we want to avoid introducing coercions for the RHS. This is
3435             // both because it helps preserve sanity and, in the case of
3436             // ref mut, for soundness (issue #23116). In particular, in
3437             // the latter case, we need to be clear that the type of the
3438             // referent for the reference that results is *equal to* the
3439             // type of the place it is referencing, and not some
3440             // supertype thereof.
3441             let init_ty = self.check_expr_with_needs(init, Needs::maybe_mut_place(m));
3442             self.demand_eqtype(init.span, local_ty, init_ty);
3443             init_ty
3444         } else {
3445             self.check_expr_coercable_to_type(init, local_ty)
3446         }
3447     }
3448
3449     pub fn check_decl_local(&self, local: &'tcx hir::Local) {
3450         let t = self.local_ty(local.span, local.hir_id).decl_ty;
3451         self.write_ty(local.hir_id, t);
3452
3453         if let Some(ref init) = local.init {
3454             let init_ty = self.check_decl_initializer(local, &init);
3455             if init_ty.references_error() {
3456                 self.write_ty(local.hir_id, init_ty);
3457             }
3458         }
3459
3460         self.check_pat_walk(
3461             &local.pat,
3462             t,
3463             ty::BindingMode::BindByValue(hir::Mutability::MutImmutable),
3464             None,
3465         );
3466         let pat_ty = self.node_ty(local.pat.hir_id);
3467         if pat_ty.references_error() {
3468             self.write_ty(local.hir_id, pat_ty);
3469         }
3470     }
3471
3472     pub fn check_stmt(&self, stmt: &'tcx hir::Stmt) {
3473         // Don't do all the complex logic below for `DeclItem`.
3474         match stmt.node {
3475             hir::StmtKind::Item(..) => return,
3476             hir::StmtKind::Local(..) | hir::StmtKind::Expr(..) | hir::StmtKind::Semi(..) => {}
3477         }
3478
3479         self.warn_if_unreachable(stmt.hir_id, stmt.span, "statement");
3480
3481         // Hide the outer diverging and `has_errors` flags.
3482         let old_diverges = self.diverges.get();
3483         let old_has_errors = self.has_errors.get();
3484         self.diverges.set(Diverges::Maybe);
3485         self.has_errors.set(false);
3486
3487         match stmt.node {
3488             hir::StmtKind::Local(ref l) => {
3489                 self.check_decl_local(&l);
3490             }
3491             // Ignore for now.
3492             hir::StmtKind::Item(_) => {}
3493             hir::StmtKind::Expr(ref expr) => {
3494                 // Check with expected type of `()`.
3495                 self.check_expr_has_type_or_error(&expr, self.tcx.mk_unit());
3496             }
3497             hir::StmtKind::Semi(ref expr) => {
3498                 self.check_expr(&expr);
3499             }
3500         }
3501
3502         // Combine the diverging and `has_error` flags.
3503         self.diverges.set(self.diverges.get() | old_diverges);
3504         self.has_errors.set(self.has_errors.get() | old_has_errors);
3505     }
3506
3507     pub fn check_block_no_value(&self, blk: &'tcx hir::Block) {
3508         let unit = self.tcx.mk_unit();
3509         let ty = self.check_block_with_expected(blk, ExpectHasType(unit));
3510
3511         // if the block produces a `!` value, that can always be
3512         // (effectively) coerced to unit.
3513         if !ty.is_never() {
3514             self.demand_suptype(blk.span, unit, ty);
3515         }
3516     }
3517
3518     fn check_block_with_expected(
3519         &self,
3520         blk: &'tcx hir::Block,
3521         expected: Expectation<'tcx>,
3522     ) -> Ty<'tcx> {
3523         let prev = {
3524             let mut fcx_ps = self.ps.borrow_mut();
3525             let unsafety_state = fcx_ps.recurse(blk);
3526             replace(&mut *fcx_ps, unsafety_state)
3527         };
3528
3529         // In some cases, blocks have just one exit, but other blocks
3530         // can be targeted by multiple breaks. This can happen both
3531         // with labeled blocks as well as when we desugar
3532         // a `try { ... }` expression.
3533         //
3534         // Example 1:
3535         //
3536         //    'a: { if true { break 'a Err(()); } Ok(()) }
3537         //
3538         // Here we would wind up with two coercions, one from
3539         // `Err(())` and the other from the tail expression
3540         // `Ok(())`. If the tail expression is omitted, that's a
3541         // "forced unit" -- unless the block diverges, in which
3542         // case we can ignore the tail expression (e.g., `'a: {
3543         // break 'a 22; }` would not force the type of the block
3544         // to be `()`).
3545         let tail_expr = blk.expr.as_ref();
3546         let coerce_to_ty = expected.coercion_target_type(self, blk.span);
3547         let coerce = if blk.targeted_by_break {
3548             CoerceMany::new(coerce_to_ty)
3549         } else {
3550             let tail_expr: &[P<hir::Expr>] = match tail_expr {
3551                 Some(e) => slice::from_ref(e),
3552                 None => &[],
3553             };
3554             CoerceMany::with_coercion_sites(coerce_to_ty, tail_expr)
3555         };
3556
3557         let prev_diverges = self.diverges.get();
3558         let ctxt = BreakableCtxt {
3559             coerce: Some(coerce),
3560             may_break: false,
3561         };
3562
3563         let (ctxt, ()) = self.with_breakable_ctxt(blk.hir_id, ctxt, || {
3564             for s in &blk.stmts {
3565                 self.check_stmt(s);
3566             }
3567
3568             // check the tail expression **without** holding the
3569             // `enclosing_breakables` lock below.
3570             let tail_expr_ty = tail_expr.map(|t| self.check_expr_with_expectation(t, expected));
3571
3572             let mut enclosing_breakables = self.enclosing_breakables.borrow_mut();
3573             let ctxt = enclosing_breakables.find_breakable(blk.hir_id);
3574             let coerce = ctxt.coerce.as_mut().unwrap();
3575             if let Some(tail_expr_ty) = tail_expr_ty {
3576                 let tail_expr = tail_expr.unwrap();
3577                 let cause = self.cause(tail_expr.span,
3578                                        ObligationCauseCode::BlockTailExpression(blk.hir_id));
3579                 coerce.coerce(self,
3580                               &cause,
3581                               tail_expr,
3582                               tail_expr_ty);
3583             } else {
3584                 // Subtle: if there is no explicit tail expression,
3585                 // that is typically equivalent to a tail expression
3586                 // of `()` -- except if the block diverges. In that
3587                 // case, there is no value supplied from the tail
3588                 // expression (assuming there are no other breaks,
3589                 // this implies that the type of the block will be
3590                 // `!`).
3591                 //
3592                 // #41425 -- label the implicit `()` as being the
3593                 // "found type" here, rather than the "expected type".
3594                 if !self.diverges.get().always() {
3595                     // #50009 -- Do not point at the entire fn block span, point at the return type
3596                     // span, as it is the cause of the requirement, and
3597                     // `consider_hint_about_removing_semicolon` will point at the last expression
3598                     // if it were a relevant part of the error. This improves usability in editors
3599                     // that highlight errors inline.
3600                     let mut sp = blk.span;
3601                     let mut fn_span = None;
3602                     if let Some((decl, ident)) = self.get_parent_fn_decl(blk.hir_id) {
3603                         let ret_sp = decl.output.span();
3604                         if let Some(block_sp) = self.parent_item_span(blk.hir_id) {
3605                             // HACK: on some cases (`ui/liveness/liveness-issue-2163.rs`) the
3606                             // output would otherwise be incorrect and even misleading. Make sure
3607                             // the span we're aiming at correspond to a `fn` body.
3608                             if block_sp == blk.span {
3609                                 sp = ret_sp;
3610                                 fn_span = Some(ident.span);
3611                             }
3612                         }
3613                     }
3614                     coerce.coerce_forced_unit(self, &self.misc(sp), &mut |err| {
3615                         if let Some(expected_ty) = expected.only_has_type(self) {
3616                             self.consider_hint_about_removing_semicolon(blk, expected_ty, err);
3617                         }
3618                         if let Some(fn_span) = fn_span {
3619                             err.span_label(fn_span, "this function's body doesn't return");
3620                         }
3621                     }, false);
3622                 }
3623             }
3624         });
3625
3626         if ctxt.may_break {
3627             // If we can break from the block, then the block's exit is always reachable
3628             // (... as long as the entry is reachable) - regardless of the tail of the block.
3629             self.diverges.set(prev_diverges);
3630         }
3631
3632         let mut ty = ctxt.coerce.unwrap().complete(self);
3633
3634         if self.has_errors.get() || ty.references_error() {
3635             ty = self.tcx.types.err
3636         }
3637
3638         self.write_ty(blk.hir_id, ty);
3639
3640         *self.ps.borrow_mut() = prev;
3641         ty
3642     }
3643
3644     fn parent_item_span(&self, id: hir::HirId) -> Option<Span> {
3645         let node = self.tcx.hir().get_by_hir_id(self.tcx.hir().get_parent_item(id));
3646         match node {
3647             Node::Item(&hir::Item {
3648                 node: hir::ItemKind::Fn(_, _, _, body_id), ..
3649             }) |
3650             Node::ImplItem(&hir::ImplItem {
3651                 node: hir::ImplItemKind::Method(_, body_id), ..
3652             }) => {
3653                 let body = self.tcx.hir().body(body_id);
3654                 if let ExprKind::Block(block, _) = &body.value.node {
3655                     return Some(block.span);
3656                 }
3657             }
3658             _ => {}
3659         }
3660         None
3661     }
3662
3663     /// Given a function block's `HirId`, returns its `FnDecl` if it exists, or `None` otherwise.
3664     fn get_parent_fn_decl(&self, blk_id: hir::HirId) -> Option<(hir::FnDecl, ast::Ident)> {
3665         let parent = self.tcx.hir().get_by_hir_id(self.tcx.hir().get_parent_item(blk_id));
3666         self.get_node_fn_decl(parent).map(|(fn_decl, ident, _)| (fn_decl, ident))
3667     }
3668
3669     /// Given a function `Node`, return its `FnDecl` if it exists, or `None` otherwise.
3670     fn get_node_fn_decl(&self, node: Node<'_>) -> Option<(hir::FnDecl, ast::Ident, bool)> {
3671         match node {
3672             Node::Item(&hir::Item {
3673                 ident, node: hir::ItemKind::Fn(ref decl, ..), ..
3674             }) => decl.clone().and_then(|decl| {
3675                 // This is less than ideal, it will not suggest a return type span on any
3676                 // method called `main`, regardless of whether it is actually the entry point,
3677                 // but it will still present it as the reason for the expected type.
3678                 Some((decl, ident, ident.name != sym::main))
3679             }),
3680             Node::TraitItem(&hir::TraitItem {
3681                 ident, node: hir::TraitItemKind::Method(hir::MethodSig {
3682                     ref decl, ..
3683                 }, ..), ..
3684             }) => decl.clone().and_then(|decl| Some((decl, ident, true))),
3685             Node::ImplItem(&hir::ImplItem {
3686                 ident, node: hir::ImplItemKind::Method(hir::MethodSig {
3687                     ref decl, ..
3688                 }, ..), ..
3689             }) => decl.clone().and_then(|decl| Some((decl, ident, false))),
3690             _ => None,
3691         }
3692     }
3693
3694     /// Given a `HirId`, return the `FnDecl` of the method it is enclosed by and whether a
3695     /// suggestion can be made, `None` otherwise.
3696     pub fn get_fn_decl(&self, blk_id: hir::HirId) -> Option<(hir::FnDecl, bool)> {
3697         // Get enclosing Fn, if it is a function or a trait method, unless there's a `loop` or
3698         // `while` before reaching it, as block tail returns are not available in them.
3699         self.tcx.hir().get_return_block(blk_id).and_then(|blk_id| {
3700             let parent = self.tcx.hir().get_by_hir_id(blk_id);
3701             self.get_node_fn_decl(parent).map(|(fn_decl, _, is_main)| (fn_decl, is_main))
3702         })
3703     }
3704
3705     /// On implicit return expressions with mismatched types, provides the following suggestions:
3706     ///
3707     /// - Points out the method's return type as the reason for the expected type.
3708     /// - Possible missing semicolon.
3709     /// - Possible missing return type if the return type is the default, and not `fn main()`.
3710     pub fn suggest_mismatched_types_on_tail(
3711         &self,
3712         err: &mut DiagnosticBuilder<'tcx>,
3713         expression: &'tcx hir::Expr,
3714         expected: Ty<'tcx>,
3715         found: Ty<'tcx>,
3716         cause_span: Span,
3717         blk_id: hir::HirId,
3718     ) -> bool {
3719         self.suggest_missing_semicolon(err, expression, expected, cause_span);
3720         let mut pointing_at_return_type = false;
3721         if let Some((fn_decl, can_suggest)) = self.get_fn_decl(blk_id) {
3722             pointing_at_return_type = self.suggest_missing_return_type(
3723                 err, &fn_decl, expected, found, can_suggest);
3724         }
3725         self.suggest_ref_or_into(err, expression, expected, found);
3726         pointing_at_return_type
3727     }
3728
3729     pub fn suggest_ref_or_into(
3730         &self,
3731         err: &mut DiagnosticBuilder<'tcx>,
3732         expr: &hir::Expr,
3733         expected: Ty<'tcx>,
3734         found: Ty<'tcx>,
3735     ) {
3736         if let Some((sp, msg, suggestion)) = self.check_ref(expr, found, expected) {
3737             err.span_suggestion(
3738                 sp,
3739                 msg,
3740                 suggestion,
3741                 Applicability::MachineApplicable,
3742             );
3743         } else if !self.check_for_cast(err, expr, found, expected) {
3744             let is_struct_pat_shorthand_field = self.is_hir_id_from_struct_pattern_shorthand_field(
3745                 expr.hir_id,
3746                 expr.span,
3747             );
3748             let methods = self.get_conversion_methods(expr.span, expected, found);
3749             if let Ok(expr_text) = self.sess().source_map().span_to_snippet(expr.span) {
3750                 let mut suggestions = iter::repeat(&expr_text).zip(methods.iter())
3751                     .filter_map(|(receiver, method)| {
3752                         let method_call = format!(".{}()", method.ident);
3753                         if receiver.ends_with(&method_call) {
3754                             None  // do not suggest code that is already there (#53348)
3755                         } else {
3756                             let method_call_list = [".to_vec()", ".to_string()"];
3757                             let sugg = if receiver.ends_with(".clone()")
3758                                     && method_call_list.contains(&method_call.as_str()) {
3759                                 let max_len = receiver.rfind(".").unwrap();
3760                                 format!("{}{}", &receiver[..max_len], method_call)
3761                             } else {
3762                                 format!("{}{}", receiver, method_call)
3763                             };
3764                             Some(if is_struct_pat_shorthand_field {
3765                                 format!("{}: {}", receiver, sugg)
3766                             } else {
3767                                 sugg
3768                             })
3769                         }
3770                     }).peekable();
3771                 if suggestions.peek().is_some() {
3772                     err.span_suggestions(
3773                         expr.span,
3774                         "try using a conversion method",
3775                         suggestions,
3776                         Applicability::MaybeIncorrect,
3777                     );
3778                 }
3779             }
3780         }
3781     }
3782
3783     /// A common error is to forget to add a semicolon at the end of a block, e.g.,
3784     ///
3785     /// ```
3786     /// fn foo() {
3787     ///     bar_that_returns_u32()
3788     /// }
3789     /// ```
3790     ///
3791     /// This routine checks if the return expression in a block would make sense on its own as a
3792     /// statement and the return type has been left as default or has been specified as `()`. If so,
3793     /// it suggests adding a semicolon.
3794     fn suggest_missing_semicolon(
3795         &self,
3796         err: &mut DiagnosticBuilder<'tcx>,
3797         expression: &'tcx hir::Expr,
3798         expected: Ty<'tcx>,
3799         cause_span: Span,
3800     ) {
3801         if expected.is_unit() {
3802             // `BlockTailExpression` only relevant if the tail expr would be
3803             // useful on its own.
3804             match expression.node {
3805                 ExprKind::Call(..) |
3806                 ExprKind::MethodCall(..) |
3807                 ExprKind::While(..) |
3808                 ExprKind::Loop(..) |
3809                 ExprKind::Match(..) |
3810                 ExprKind::Block(..) => {
3811                     let sp = self.tcx.sess.source_map().next_point(cause_span);
3812                     err.span_suggestion(
3813                         sp,
3814                         "try adding a semicolon",
3815                         ";".to_string(),
3816                         Applicability::MachineApplicable);
3817                 }
3818                 _ => (),
3819             }
3820         }
3821     }
3822
3823     /// A possible error is to forget to add a return type that is needed:
3824     ///
3825     /// ```
3826     /// fn foo() {
3827     ///     bar_that_returns_u32()
3828     /// }
3829     /// ```
3830     ///
3831     /// This routine checks if the return type is left as default, the method is not part of an
3832     /// `impl` block and that it isn't the `main` method. If so, it suggests setting the return
3833     /// type.
3834     fn suggest_missing_return_type(
3835         &self,
3836         err: &mut DiagnosticBuilder<'tcx>,
3837         fn_decl: &hir::FnDecl,
3838         expected: Ty<'tcx>,
3839         found: Ty<'tcx>,
3840         can_suggest: bool,
3841     ) -> bool {
3842         // Only suggest changing the return type for methods that
3843         // haven't set a return type at all (and aren't `fn main()` or an impl).
3844         match (&fn_decl.output, found.is_suggestable(), can_suggest, expected.is_unit()) {
3845             (&hir::FunctionRetTy::DefaultReturn(span), true, true, true) => {
3846                 err.span_suggestion(
3847                     span,
3848                     "try adding a return type",
3849                     format!("-> {} ", self.resolve_type_vars_with_obligations(found)),
3850                     Applicability::MachineApplicable);
3851                 true
3852             }
3853             (&hir::FunctionRetTy::DefaultReturn(span), false, true, true) => {
3854                 err.span_label(span, "possibly return type missing here?");
3855                 true
3856             }
3857             (&hir::FunctionRetTy::DefaultReturn(span), _, false, true) => {
3858                 // `fn main()` must return `()`, do not suggest changing return type
3859                 err.span_label(span, "expected `()` because of default return type");
3860                 true
3861             }
3862             // expectation was caused by something else, not the default return
3863             (&hir::FunctionRetTy::DefaultReturn(_), _, _, false) => false,
3864             (&hir::FunctionRetTy::Return(ref ty), _, _, _) => {
3865                 // Only point to return type if the expected type is the return type, as if they
3866                 // are not, the expectation must have been caused by something else.
3867                 debug!("suggest_missing_return_type: return type {:?} node {:?}", ty, ty.node);
3868                 let sp = ty.span;
3869                 let ty = AstConv::ast_ty_to_ty(self, ty);
3870                 debug!("suggest_missing_return_type: return type {:?}", ty);
3871                 debug!("suggest_missing_return_type: expected type {:?}", ty);
3872                 if ty.sty == expected.sty {
3873                     err.span_label(sp, format!("expected `{}` because of return type",
3874                                                expected));
3875                     return true;
3876                 }
3877                 false
3878             }
3879         }
3880     }
3881
3882     /// A common error is to add an extra semicolon:
3883     ///
3884     /// ```
3885     /// fn foo() -> usize {
3886     ///     22;
3887     /// }
3888     /// ```
3889     ///
3890     /// This routine checks if the final statement in a block is an
3891     /// expression with an explicit semicolon whose type is compatible
3892     /// with `expected_ty`. If so, it suggests removing the semicolon.
3893     fn consider_hint_about_removing_semicolon(
3894         &self,
3895         blk: &'tcx hir::Block,
3896         expected_ty: Ty<'tcx>,
3897         err: &mut DiagnosticBuilder<'_>,
3898     ) {
3899         if let Some(span_semi) = self.could_remove_semicolon(blk, expected_ty) {
3900             err.span_suggestion(
3901                 span_semi,
3902                 "consider removing this semicolon",
3903                 String::new(),
3904                 Applicability::MachineApplicable,
3905             );
3906         }
3907     }
3908
3909     fn could_remove_semicolon(&self, blk: &'tcx hir::Block, expected_ty: Ty<'tcx>) -> Option<Span> {
3910         // Be helpful when the user wrote `{... expr;}` and
3911         // taking the `;` off is enough to fix the error.
3912         let last_stmt = blk.stmts.last()?;
3913         let last_expr = match last_stmt.node {
3914             hir::StmtKind::Semi(ref e) => e,
3915             _ => return None,
3916         };
3917         let last_expr_ty = self.node_ty(last_expr.hir_id);
3918         if self.can_sub(self.param_env, last_expr_ty, expected_ty).is_err() {
3919             return None;
3920         }
3921         let original_span = original_sp(last_stmt.span, blk.span);
3922         Some(original_span.with_lo(original_span.hi() - BytePos(1)))
3923     }
3924
3925     // Rewrite `SelfCtor` to `Ctor`
3926     pub fn rewrite_self_ctor(
3927         &self,
3928         res: Res,
3929         span: Span,
3930     ) -> Result<Res, ErrorReported> {
3931         let tcx = self.tcx;
3932         if let Res::SelfCtor(impl_def_id) = res {
3933             let ty = self.impl_self_ty(span, impl_def_id).ty;
3934             let adt_def = ty.ty_adt_def();
3935
3936             match adt_def {
3937                 Some(adt_def) if adt_def.has_ctor() => {
3938                     let variant = adt_def.non_enum_variant();
3939                     let ctor_def_id = variant.ctor_def_id.unwrap();
3940                     Ok(Res::Def(DefKind::Ctor(CtorOf::Struct, variant.ctor_kind), ctor_def_id))
3941                 }
3942                 _ => {
3943                     let mut err = tcx.sess.struct_span_err(span,
3944                         "the `Self` constructor can only be used with tuple or unit structs");
3945                     if let Some(adt_def) = adt_def {
3946                         match adt_def.adt_kind() {
3947                             AdtKind::Enum => {
3948                                 err.help("did you mean to use one of the enum's variants?");
3949                             },
3950                             AdtKind::Struct |
3951                             AdtKind::Union => {
3952                                 err.span_suggestion(
3953                                     span,
3954                                     "use curly brackets",
3955                                     String::from("Self { /* fields */ }"),
3956                                     Applicability::HasPlaceholders,
3957                                 );
3958                             }
3959                         }
3960                     }
3961                     err.emit();
3962
3963                     Err(ErrorReported)
3964                 }
3965             }
3966         } else {
3967             Ok(res)
3968         }
3969     }
3970
3971     // Instantiates the given path, which must refer to an item with the given
3972     // number of type parameters and type.
3973     pub fn instantiate_value_path(&self,
3974                                   segments: &[hir::PathSegment],
3975                                   self_ty: Option<Ty<'tcx>>,
3976                                   res: Res,
3977                                   span: Span,
3978                                   hir_id: hir::HirId)
3979                                   -> (Ty<'tcx>, Res) {
3980         debug!(
3981             "instantiate_value_path(segments={:?}, self_ty={:?}, res={:?}, hir_id={})",
3982             segments,
3983             self_ty,
3984             res,
3985             hir_id,
3986         );
3987
3988         let tcx = self.tcx;
3989
3990         let res = match self.rewrite_self_ctor(res, span) {
3991             Ok(res) => res,
3992             Err(ErrorReported) => return (tcx.types.err, res),
3993         };
3994         let path_segs = match res {
3995             Res::Local(_) => vec![],
3996             Res::Def(kind, def_id) =>
3997                 AstConv::def_ids_for_value_path_segments(self, segments, self_ty, kind, def_id),
3998             _ => bug!("instantiate_value_path on {:?}", res),
3999         };
4000
4001         let mut user_self_ty = None;
4002         let mut is_alias_variant_ctor = false;
4003         match res {
4004             Res::Def(DefKind::Ctor(CtorOf::Variant, _), _) => {
4005                 if let Some(self_ty) = self_ty {
4006                     let adt_def = self_ty.ty_adt_def().unwrap();
4007                     user_self_ty = Some(UserSelfTy {
4008                         impl_def_id: adt_def.did,
4009                         self_ty,
4010                     });
4011                     is_alias_variant_ctor = true;
4012                 }
4013             }
4014             Res::Def(DefKind::Method, def_id)
4015             | Res::Def(DefKind::AssocConst, def_id) => {
4016                 let container = tcx.associated_item(def_id).container;
4017                 debug!("instantiate_value_path: def_id={:?} container={:?}", def_id, container);
4018                 match container {
4019                     ty::TraitContainer(trait_did) => {
4020                         callee::check_legal_trait_for_method_call(tcx, span, trait_did)
4021                     }
4022                     ty::ImplContainer(impl_def_id) => {
4023                         if segments.len() == 1 {
4024                             // `<T>::assoc` will end up here, and so
4025                             // can `T::assoc`. It this came from an
4026                             // inherent impl, we need to record the
4027                             // `T` for posterity (see `UserSelfTy` for
4028                             // details).
4029                             let self_ty = self_ty.expect("UFCS sugared assoc missing Self");
4030                             user_self_ty = Some(UserSelfTy {
4031                                 impl_def_id,
4032                                 self_ty,
4033                             });
4034                         }
4035                     }
4036                 }
4037             }
4038             _ => {}
4039         }
4040
4041         // Now that we have categorized what space the parameters for each
4042         // segment belong to, let's sort out the parameters that the user
4043         // provided (if any) into their appropriate spaces. We'll also report
4044         // errors if type parameters are provided in an inappropriate place.
4045
4046         let generic_segs: FxHashSet<_> = path_segs.iter().map(|PathSeg(_, index)| index).collect();
4047         let generics_has_err = AstConv::prohibit_generics(
4048                 self, segments.iter().enumerate().filter_map(|(index, seg)| {
4049             if !generic_segs.contains(&index) || is_alias_variant_ctor {
4050                 Some(seg)
4051             } else {
4052                 None
4053             }
4054         }));
4055
4056         if let Res::Local(hid) = res {
4057             let ty = self.local_ty(span, hid).decl_ty;
4058             let ty = self.normalize_associated_types_in(span, &ty);
4059             self.write_ty(hir_id, ty);
4060             return (ty, res);
4061         }
4062
4063         if generics_has_err {
4064             // Don't try to infer type parameters when prohibited generic arguments were given.
4065             user_self_ty = None;
4066         }
4067
4068         // Now we have to compare the types that the user *actually*
4069         // provided against the types that were *expected*. If the user
4070         // did not provide any types, then we want to substitute inference
4071         // variables. If the user provided some types, we may still need
4072         // to add defaults. If the user provided *too many* types, that's
4073         // a problem.
4074
4075         let mut infer_args_for_err = FxHashSet::default();
4076         for &PathSeg(def_id, index) in &path_segs {
4077             let seg = &segments[index];
4078             let generics = tcx.generics_of(def_id);
4079             // Argument-position `impl Trait` is treated as a normal generic
4080             // parameter internally, but we don't allow users to specify the
4081             // parameter's value explicitly, so we have to do some error-
4082             // checking here.
4083             let suppress_errors = AstConv::check_generic_arg_count_for_call(
4084                 tcx,
4085                 span,
4086                 &generics,
4087                 &seg,
4088                 false, // `is_method_call`
4089             );
4090             if suppress_errors {
4091                 infer_args_for_err.insert(index);
4092                 self.set_tainted_by_errors(); // See issue #53251.
4093             }
4094         }
4095
4096         let has_self = path_segs.last().map(|PathSeg(def_id, _)| {
4097             tcx.generics_of(*def_id).has_self
4098         }).unwrap_or(false);
4099
4100         let def_id = res.def_id();
4101
4102         // The things we are substituting into the type should not contain
4103         // escaping late-bound regions, and nor should the base type scheme.
4104         let ty = tcx.type_of(def_id);
4105
4106         let substs = AstConv::create_substs_for_generic_args(
4107             tcx,
4108             def_id,
4109             &[][..],
4110             has_self,
4111             self_ty,
4112             // Provide the generic args, and whether types should be inferred.
4113             |def_id| {
4114                 if let Some(&PathSeg(_, index)) = path_segs.iter().find(|&PathSeg(did, _)| {
4115                     *did == def_id
4116                 }) {
4117                     // If we've encountered an `impl Trait`-related error, we're just
4118                     // going to infer the arguments for better error messages.
4119                     if !infer_args_for_err.contains(&index) {
4120                         // Check whether the user has provided generic arguments.
4121                         if let Some(ref data) = segments[index].args {
4122                             return (Some(data), segments[index].infer_args);
4123                         }
4124                     }
4125                     return (None, segments[index].infer_args);
4126                 }
4127
4128                 (None, true)
4129             },
4130             // Provide substitutions for parameters for which (valid) arguments have been provided.
4131             |param, arg| {
4132                 match (&param.kind, arg) {
4133                     (GenericParamDefKind::Lifetime, GenericArg::Lifetime(lt)) => {
4134                         AstConv::ast_region_to_region(self, lt, Some(param)).into()
4135                     }
4136                     (GenericParamDefKind::Type { .. }, GenericArg::Type(ty)) => {
4137                         self.to_ty(ty).into()
4138                     }
4139                     (GenericParamDefKind::Const, GenericArg::Const(ct)) => {
4140                         self.to_const(&ct.value, self.tcx.type_of(param.def_id)).into()
4141                     }
4142                     _ => unreachable!(),
4143                 }
4144             },
4145             // Provide substitutions for parameters for which arguments are inferred.
4146             |substs, param, infer_args| {
4147                 match param.kind {
4148                     GenericParamDefKind::Lifetime => {
4149                         self.re_infer(Some(param), span).unwrap().into()
4150                     }
4151                     GenericParamDefKind::Type { has_default, .. } => {
4152                         if !infer_args && has_default {
4153                             // If we have a default, then we it doesn't matter that we're not
4154                             // inferring the type arguments: we provide the default where any
4155                             // is missing.
4156                             let default = tcx.type_of(param.def_id);
4157                             self.normalize_ty(
4158                                 span,
4159                                 default.subst_spanned(tcx, substs.unwrap(), Some(span))
4160                             ).into()
4161                         } else {
4162                             // If no type arguments were provided, we have to infer them.
4163                             // This case also occurs as a result of some malformed input, e.g.
4164                             // a lifetime argument being given instead of a type parameter.
4165                             // Using inference instead of `Error` gives better error messages.
4166                             self.var_for_def(span, param)
4167                         }
4168                     }
4169                     GenericParamDefKind::Const => {
4170                         // FIXME(const_generics:defaults)
4171                         // No const parameters were provided, we have to infer them.
4172                         self.var_for_def(span, param)
4173                     }
4174                 }
4175             },
4176         );
4177         assert!(!substs.has_escaping_bound_vars());
4178         assert!(!ty.has_escaping_bound_vars());
4179
4180         // First, store the "user substs" for later.
4181         self.write_user_type_annotation_from_substs(hir_id, def_id, substs, user_self_ty);
4182
4183         // Add all the obligations that are required, substituting and
4184         // normalized appropriately.
4185         let bounds = self.instantiate_bounds(span, def_id, &substs);
4186         self.add_obligations_for_parameters(
4187             traits::ObligationCause::new(span, self.body_id, traits::ItemObligation(def_id)),
4188             &bounds);
4189
4190         // Substitute the values for the type parameters into the type of
4191         // the referenced item.
4192         let ty_substituted = self.instantiate_type_scheme(span, &substs, &ty);
4193
4194         if let Some(UserSelfTy { impl_def_id, self_ty }) = user_self_ty {
4195             // In the case of `Foo<T>::method` and `<Foo<T>>::method`, if `method`
4196             // is inherent, there is no `Self` parameter; instead, the impl needs
4197             // type parameters, which we can infer by unifying the provided `Self`
4198             // with the substituted impl type.
4199             // This also occurs for an enum variant on a type alias.
4200             let ty = tcx.type_of(impl_def_id);
4201
4202             let impl_ty = self.instantiate_type_scheme(span, &substs, &ty);
4203             match self.at(&self.misc(span), self.param_env).sup(impl_ty, self_ty) {
4204                 Ok(ok) => self.register_infer_ok_obligations(ok),
4205                 Err(_) => {
4206                     self.tcx.sess.delay_span_bug(span, &format!(
4207                         "instantiate_value_path: (UFCS) {:?} was a subtype of {:?} but now is not?",
4208                         self_ty,
4209                         impl_ty,
4210                     ));
4211                 }
4212             }
4213         }
4214
4215         self.check_rustc_args_require_const(def_id, hir_id, span);
4216
4217         debug!("instantiate_value_path: type of {:?} is {:?}",
4218                hir_id,
4219                ty_substituted);
4220         self.write_substs(hir_id, substs);
4221
4222         (ty_substituted, res)
4223     }
4224
4225     fn check_rustc_args_require_const(&self,
4226                                       def_id: DefId,
4227                                       hir_id: hir::HirId,
4228                                       span: Span) {
4229         // We're only interested in functions tagged with
4230         // #[rustc_args_required_const], so ignore anything that's not.
4231         if !self.tcx.has_attr(def_id, sym::rustc_args_required_const) {
4232             return
4233         }
4234
4235         // If our calling expression is indeed the function itself, we're good!
4236         // If not, generate an error that this can only be called directly.
4237         if let Node::Expr(expr) = self.tcx.hir().get_by_hir_id(
4238             self.tcx.hir().get_parent_node_by_hir_id(hir_id))
4239         {
4240             if let ExprKind::Call(ref callee, ..) = expr.node {
4241                 if callee.hir_id == hir_id {
4242                     return
4243                 }
4244             }
4245         }
4246
4247         self.tcx.sess.span_err(span, "this function can only be invoked \
4248                                       directly, not through a function pointer");
4249     }
4250
4251     // Resolves `typ` by a single level if `typ` is a type variable.
4252     // If no resolution is possible, then an error is reported.
4253     // Numeric inference variables may be left unresolved.
4254     pub fn structurally_resolved_type(&self, sp: Span, ty: Ty<'tcx>) -> Ty<'tcx> {
4255         let ty = self.resolve_type_vars_with_obligations(ty);
4256         if !ty.is_ty_var() {
4257             ty
4258         } else {
4259             if !self.is_tainted_by_errors() {
4260                 self.need_type_info_err((**self).body_id, sp, ty)
4261                     .note("type must be known at this point")
4262                     .emit();
4263             }
4264             self.demand_suptype(sp, self.tcx.types.err, ty);
4265             self.tcx.types.err
4266         }
4267     }
4268
4269     fn with_breakable_ctxt<F: FnOnce() -> R, R>(
4270         &self,
4271         id: hir::HirId,
4272         ctxt: BreakableCtxt<'tcx>,
4273         f: F,
4274     ) -> (BreakableCtxt<'tcx>, R) {
4275         let index;
4276         {
4277             let mut enclosing_breakables = self.enclosing_breakables.borrow_mut();
4278             index = enclosing_breakables.stack.len();
4279             enclosing_breakables.by_id.insert(id, index);
4280             enclosing_breakables.stack.push(ctxt);
4281         }
4282         let result = f();
4283         let ctxt = {
4284             let mut enclosing_breakables = self.enclosing_breakables.borrow_mut();
4285             debug_assert!(enclosing_breakables.stack.len() == index + 1);
4286             enclosing_breakables.by_id.remove(&id).expect("missing breakable context");
4287             enclosing_breakables.stack.pop().expect("missing breakable context")
4288         };
4289         (ctxt, result)
4290     }
4291
4292     /// Instantiate a QueryResponse in a probe context, without a
4293     /// good ObligationCause.
4294     fn probe_instantiate_query_response(
4295         &self,
4296         span: Span,
4297         original_values: &OriginalQueryValues<'tcx>,
4298         query_result: &Canonical<'tcx, QueryResponse<'tcx, Ty<'tcx>>>,
4299     ) -> InferResult<'tcx, Ty<'tcx>>
4300     {
4301         self.instantiate_query_response_and_region_obligations(
4302             &traits::ObligationCause::misc(span, self.body_id),
4303             self.param_env,
4304             original_values,
4305             query_result)
4306     }
4307
4308     /// Returns `true` if an expression is contained inside the LHS of an assignment expression.
4309     fn expr_in_place(&self, mut expr_id: hir::HirId) -> bool {
4310         let mut contained_in_place = false;
4311
4312         while let hir::Node::Expr(parent_expr) =
4313             self.tcx.hir().get_by_hir_id(self.tcx.hir().get_parent_node_by_hir_id(expr_id))
4314         {
4315             match &parent_expr.node {
4316                 hir::ExprKind::Assign(lhs, ..) | hir::ExprKind::AssignOp(_, lhs, ..) => {
4317                     if lhs.hir_id == expr_id {
4318                         contained_in_place = true;
4319                         break;
4320                     }
4321                 }
4322                 _ => (),
4323             }
4324             expr_id = parent_expr.hir_id;
4325         }
4326
4327         contained_in_place
4328     }
4329 }
4330
4331 pub fn check_bounds_are_used<'tcx>(tcx: TyCtxt<'tcx>, generics: &ty::Generics, ty: Ty<'tcx>) {
4332     let own_counts = generics.own_counts();
4333     debug!(
4334         "check_bounds_are_used(n_tys={}, n_cts={}, ty={:?})",
4335         own_counts.types,
4336         own_counts.consts,
4337         ty
4338     );
4339
4340     if own_counts.types == 0 {
4341         return;
4342     }
4343
4344     // Make a vector of booleans initially false, set to true when used.
4345     let mut types_used = vec![false; own_counts.types];
4346
4347     for leaf_ty in ty.walk() {
4348         if let ty::Param(ty::ParamTy { index, .. }) = leaf_ty.sty {
4349             debug!("Found use of ty param num {}", index);
4350             types_used[index as usize - own_counts.lifetimes] = true;
4351         } else if let ty::Error = leaf_ty.sty {
4352             // If there is already another error, do not emit
4353             // an error for not using a type Parameter.
4354             assert!(tcx.sess.err_count() > 0);
4355             return;
4356         }
4357     }
4358
4359     let types = generics.params.iter().filter(|param| match param.kind {
4360         ty::GenericParamDefKind::Type { .. } => true,
4361         _ => false,
4362     });
4363     for (&used, param) in types_used.iter().zip(types) {
4364         if !used {
4365             let id = tcx.hir().as_local_hir_id(param.def_id).unwrap();
4366             let span = tcx.hir().span(id);
4367             struct_span_err!(tcx.sess, span, E0091, "type parameter `{}` is unused", param.name)
4368                 .span_label(span, "unused type parameter")
4369                 .emit();
4370         }
4371     }
4372 }
4373
4374 fn fatally_break_rust(sess: &Session) {
4375     let handler = sess.diagnostic();
4376     handler.span_bug_no_panic(
4377         MultiSpan::new(),
4378         "It looks like you're trying to break rust; would you like some ICE?",
4379     );
4380     handler.note_without_error("the compiler expectedly panicked. this is a feature.");
4381     handler.note_without_error(
4382         "we would appreciate a joke overview: \
4383         https://github.com/rust-lang/rust/issues/43162#issuecomment-320764675"
4384     );
4385     handler.note_without_error(&format!("rustc {} running on {}",
4386         option_env!("CFG_VERSION").unwrap_or("unknown_version"),
4387         crate::session::config::host_triple(),
4388     ));
4389 }
4390
4391 fn potentially_plural_count(count: usize, word: &str) -> String {
4392     format!("{} {}{}", count, word, if count == 1 { "" } else { "s" })
4393 }