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