]> git.lizzy.rs Git - rust.git/blob - src/librustc_typeck/check/mod.rs
Rollup merge of #65678 - JohnTitor:add-e0728-explanation, r=GuilliaumeGomez
[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: Span, item_def_id: DefId) -> bool {
1397     let item_type = tcx.type_of(item_def_id);
1398     if let ty::Adt(def, substs) = item_type.kind {
1399         assert!(def.is_union());
1400         let fields = &def.non_enum_variant().fields;
1401         for field in fields {
1402             let field_ty = field.ty(tcx, substs);
1403             // We are currently checking the type this field came from, so it must be local.
1404             let field_span = tcx.hir().span_if_local(field.did).unwrap();
1405             let param_env = tcx.param_env(field.did);
1406             if field_ty.needs_drop(tcx, param_env) {
1407                 struct_span_err!(tcx.sess, field_span, E0740,
1408                                     "unions may not contain fields that need dropping")
1409                             .span_note(field_span,
1410                                         "`std::mem::ManuallyDrop` can be used to wrap the type")
1411                             .emit();
1412                 return false;
1413             }
1414         }
1415     } else {
1416         span_bug!(span, "unions must be ty::Adt, but got {:?}", item_type.kind);
1417     }
1418     return true;
1419 }
1420
1421 /// Checks that an opaque type does not contain cycles and does not use `Self` or `T::Foo`
1422 /// projections that would result in "inheriting lifetimes".
1423 fn check_opaque<'tcx>(
1424     tcx: TyCtxt<'tcx>,
1425     def_id: DefId,
1426     substs: SubstsRef<'tcx>,
1427     span: Span,
1428     origin: &hir::OpaqueTyOrigin,
1429 ) {
1430     check_opaque_for_inheriting_lifetimes(tcx, def_id, span);
1431     check_opaque_for_cycles(tcx, def_id, substs, span, origin);
1432 }
1433
1434 /// Checks that an opaque type does not use `Self` or `T::Foo` projections that would result
1435 /// in "inheriting lifetimes".
1436 fn check_opaque_for_inheriting_lifetimes(
1437     tcx: TyCtxt<'tcx>,
1438     def_id: DefId,
1439     span: Span,
1440 ) {
1441     let item = tcx.hir().expect_item(
1442         tcx.hir().as_local_hir_id(def_id).expect("opaque type is not local"));
1443     debug!("check_opaque_for_inheriting_lifetimes: def_id={:?} span={:?} item={:?}",
1444            def_id, span, item);
1445
1446     #[derive(Debug)]
1447     struct ProhibitOpaqueVisitor<'tcx> {
1448         opaque_identity_ty: Ty<'tcx>,
1449         generics: &'tcx ty::Generics,
1450     };
1451
1452     impl<'tcx> ty::fold::TypeVisitor<'tcx> for ProhibitOpaqueVisitor<'tcx> {
1453         fn visit_ty(&mut self, t: Ty<'tcx>) -> bool {
1454             debug!("check_opaque_for_inheriting_lifetimes: (visit_ty) t={:?}", t);
1455             if t == self.opaque_identity_ty { false } else { t.super_visit_with(self) }
1456         }
1457
1458         fn visit_region(&mut self, r: ty::Region<'tcx>) -> bool {
1459             debug!("check_opaque_for_inheriting_lifetimes: (visit_region) r={:?}", r);
1460             if let RegionKind::ReEarlyBound(ty::EarlyBoundRegion { index, .. }) = r {
1461                 return *index < self.generics.parent_count as u32;
1462             }
1463
1464             r.super_visit_with(self)
1465         }
1466     }
1467
1468     let prohibit_opaque = match item.kind {
1469         ItemKind::OpaqueTy(hir::OpaqueTy { origin: hir::OpaqueTyOrigin::AsyncFn, .. }) |
1470         ItemKind::OpaqueTy(hir::OpaqueTy { origin: hir::OpaqueTyOrigin::FnReturn, .. }) => {
1471             let mut visitor = ProhibitOpaqueVisitor {
1472                 opaque_identity_ty: tcx.mk_opaque(
1473                     def_id, InternalSubsts::identity_for_item(tcx, def_id)),
1474                 generics: tcx.generics_of(def_id),
1475             };
1476             debug!("check_opaque_for_inheriting_lifetimes: visitor={:?}", visitor);
1477
1478             tcx.predicates_of(def_id).predicates.iter().any(
1479                 |(predicate, _)| predicate.visit_with(&mut visitor))
1480         },
1481         _ => false,
1482     };
1483
1484     debug!("check_opaque_for_inheriting_lifetimes: prohibit_opaque={:?}", prohibit_opaque);
1485     if prohibit_opaque {
1486         let is_async = match item.kind {
1487             ItemKind::OpaqueTy(hir::OpaqueTy { origin, .. }) => match origin {
1488                 hir::OpaqueTyOrigin::AsyncFn => true,
1489                 _ => false,
1490             },
1491             _ => unreachable!(),
1492         };
1493
1494         tcx.sess.span_err(span, &format!(
1495             "`{}` return type cannot contain a projection or `Self` that references lifetimes from \
1496              a parent scope",
1497             if is_async { "async fn" } else { "impl Trait" },
1498         ));
1499     }
1500 }
1501
1502 /// Checks that an opaque type does not contain cycles.
1503 fn check_opaque_for_cycles<'tcx>(
1504     tcx: TyCtxt<'tcx>,
1505     def_id: DefId,
1506     substs: SubstsRef<'tcx>,
1507     span: Span,
1508     origin: &hir::OpaqueTyOrigin,
1509 ) {
1510     if let Err(partially_expanded_type) = tcx.try_expand_impl_trait_type(def_id, substs) {
1511         if let hir::OpaqueTyOrigin::AsyncFn = origin {
1512             struct_span_err!(
1513                 tcx.sess, span, E0733,
1514                 "recursion in an `async fn` requires boxing",
1515             )
1516             .span_label(span, "recursive `async fn`")
1517             .note("a recursive `async fn` must be rewritten to return a boxed `dyn Future`.")
1518             .emit();
1519         } else {
1520             let mut err = struct_span_err!(
1521                 tcx.sess, span, E0720,
1522                 "opaque type expands to a recursive type",
1523             );
1524             err.span_label(span, "expands to a recursive type");
1525             if let ty::Opaque(..) = partially_expanded_type.kind {
1526                 err.note("type resolves to itself");
1527             } else {
1528                 err.note(&format!("expanded type is `{}`", partially_expanded_type));
1529             }
1530             err.emit();
1531         }
1532     }
1533 }
1534
1535 // Forbid defining intrinsics in Rust code,
1536 // as they must always be defined by the compiler.
1537 fn fn_maybe_err(tcx: TyCtxt<'_>, sp: Span, abi: Abi) {
1538     if let Abi::RustIntrinsic | Abi::PlatformIntrinsic = abi {
1539         tcx.sess.span_err(sp, "intrinsic must be in `extern \"rust-intrinsic\" { ... }` block");
1540     }
1541 }
1542
1543 pub fn check_item_type<'tcx>(tcx: TyCtxt<'tcx>, it: &'tcx hir::Item) {
1544     debug!(
1545         "check_item_type(it.hir_id={}, it.name={})",
1546         it.hir_id,
1547         tcx.def_path_str(tcx.hir().local_def_id(it.hir_id))
1548     );
1549     let _indenter = indenter();
1550     match it.kind {
1551         // Consts can play a role in type-checking, so they are included here.
1552         hir::ItemKind::Static(..) => {
1553             let def_id = tcx.hir().local_def_id(it.hir_id);
1554             tcx.typeck_tables_of(def_id);
1555             maybe_check_static_with_link_section(tcx, def_id, it.span);
1556         }
1557         hir::ItemKind::Const(..) => {
1558             tcx.typeck_tables_of(tcx.hir().local_def_id(it.hir_id));
1559         }
1560         hir::ItemKind::Enum(ref enum_definition, _) => {
1561             check_enum(tcx, it.span, &enum_definition.variants, it.hir_id);
1562         }
1563         hir::ItemKind::Fn(..) => {} // entirely within check_item_body
1564         hir::ItemKind::Impl(.., ref impl_item_refs) => {
1565             debug!("ItemKind::Impl {} with id {}", it.ident, it.hir_id);
1566             let impl_def_id = tcx.hir().local_def_id(it.hir_id);
1567             if let Some(impl_trait_ref) = tcx.impl_trait_ref(impl_def_id) {
1568                 check_impl_items_against_trait(
1569                     tcx,
1570                     it.span,
1571                     impl_def_id,
1572                     impl_trait_ref,
1573                     impl_item_refs,
1574                 );
1575                 let trait_def_id = impl_trait_ref.def_id;
1576                 check_on_unimplemented(tcx, trait_def_id, it);
1577             }
1578         }
1579         hir::ItemKind::Trait(_, _, _, _, ref items) => {
1580             let def_id = tcx.hir().local_def_id(it.hir_id);
1581             check_on_unimplemented(tcx, def_id, it);
1582
1583             for item in items.iter() {
1584                 let item = tcx.hir().trait_item(item.id);
1585                 if let hir::TraitItemKind::Method(sig, _) = &item.kind {
1586                     let abi = sig.header.abi;
1587                     fn_maybe_err(tcx, item.ident.span, abi);
1588                 }
1589             }
1590         }
1591         hir::ItemKind::Struct(..) => {
1592             check_struct(tcx, it.hir_id, it.span);
1593         }
1594         hir::ItemKind::Union(..) => {
1595             check_union(tcx, it.hir_id, it.span);
1596         }
1597         hir::ItemKind::OpaqueTy(hir::OpaqueTy{origin, ..}) => {
1598             let def_id = tcx.hir().local_def_id(it.hir_id);
1599
1600             let substs = InternalSubsts::identity_for_item(tcx, def_id);
1601             check_opaque(tcx, def_id, substs, it.span, &origin);
1602         }
1603         hir::ItemKind::TyAlias(..) => {
1604             let def_id = tcx.hir().local_def_id(it.hir_id);
1605             let pty_ty = tcx.type_of(def_id);
1606             let generics = tcx.generics_of(def_id);
1607             check_bounds_are_used(tcx, &generics, pty_ty);
1608         }
1609         hir::ItemKind::ForeignMod(ref m) => {
1610             check_abi(tcx, it.span, m.abi);
1611
1612             if m.abi == Abi::RustIntrinsic {
1613                 for item in &m.items {
1614                     intrinsic::check_intrinsic_type(tcx, item);
1615                 }
1616             } else if m.abi == Abi::PlatformIntrinsic {
1617                 for item in &m.items {
1618                     intrinsic::check_platform_intrinsic_type(tcx, item);
1619                 }
1620             } else {
1621                 for item in &m.items {
1622                     let generics = tcx.generics_of(tcx.hir().local_def_id(item.hir_id));
1623                     let own_counts = generics.own_counts();
1624                     if generics.params.len() - own_counts.lifetimes != 0 {
1625                         let (kinds, kinds_pl, egs) = match (own_counts.types, own_counts.consts) {
1626                             (_, 0) => ("type", "types", Some("u32")),
1627                             // We don't specify an example value, because we can't generate
1628                             // a valid value for any type.
1629                             (0, _) => ("const", "consts", None),
1630                             _ => ("type or const", "types or consts", None),
1631                         };
1632                         struct_span_err!(
1633                             tcx.sess,
1634                             item.span,
1635                             E0044,
1636                             "foreign items may not have {} parameters",
1637                             kinds,
1638                         ).span_label(
1639                             item.span,
1640                             &format!("can't have {} parameters", kinds),
1641                         ).help(
1642                             // FIXME: once we start storing spans for type arguments, turn this
1643                             // into a suggestion.
1644                             &format!(
1645                                 "replace the {} parameters with concrete {}{}",
1646                                 kinds,
1647                                 kinds_pl,
1648                                 egs.map(|egs| format!(" like `{}`", egs)).unwrap_or_default(),
1649                             ),
1650                         ).emit();
1651                     }
1652
1653                     if let hir::ForeignItemKind::Fn(ref fn_decl, _, _) = item.kind {
1654                         require_c_abi_if_c_variadic(tcx, fn_decl, m.abi, item.span);
1655                     }
1656                 }
1657             }
1658         }
1659         _ => { /* nothing to do */ }
1660     }
1661 }
1662
1663 fn maybe_check_static_with_link_section(tcx: TyCtxt<'_>, id: DefId, span: Span) {
1664     // Only restricted on wasm32 target for now
1665     if !tcx.sess.opts.target_triple.triple().starts_with("wasm32") {
1666         return
1667     }
1668
1669     // If `#[link_section]` is missing, then nothing to verify
1670     let attrs = tcx.codegen_fn_attrs(id);
1671     if attrs.link_section.is_none() {
1672         return
1673     }
1674
1675     // For the wasm32 target statics with `#[link_section]` are placed into custom
1676     // sections of the final output file, but this isn't link custom sections of
1677     // other executable formats. Namely we can only embed a list of bytes,
1678     // nothing with pointers to anything else or relocations. If any relocation
1679     // show up, reject them here.
1680     // `#[link_section]` may contain arbitrary, or even undefined bytes, but it is
1681     // the consumer's responsibility to ensure all bytes that have been read
1682     // have defined values.
1683     let instance = ty::Instance::mono(tcx, id);
1684     let cid = GlobalId {
1685         instance,
1686         promoted: None
1687     };
1688     let param_env = ty::ParamEnv::reveal_all();
1689     if let Ok(static_) = tcx.const_eval(param_env.and(cid)) {
1690         let alloc = if let ConstValue::ByRef { alloc, .. } = static_.val {
1691             alloc
1692         } else {
1693             bug!("Matching on non-ByRef static")
1694         };
1695         if alloc.relocations().len() != 0 {
1696             let msg = "statics with a custom `#[link_section]` must be a \
1697                        simple list of bytes on the wasm target with no \
1698                        extra levels of indirection such as references";
1699             tcx.sess.span_err(span, msg);
1700         }
1701     }
1702 }
1703
1704 fn check_on_unimplemented(tcx: TyCtxt<'_>, trait_def_id: DefId, item: &hir::Item) {
1705     let item_def_id = tcx.hir().local_def_id(item.hir_id);
1706     // an error would be reported if this fails.
1707     let _ = traits::OnUnimplementedDirective::of_item(tcx, trait_def_id, item_def_id);
1708 }
1709
1710 fn report_forbidden_specialization(
1711     tcx: TyCtxt<'_>,
1712     impl_item: &hir::ImplItem,
1713     parent_impl: DefId,
1714 ) {
1715     let mut err = struct_span_err!(
1716         tcx.sess, impl_item.span, E0520,
1717         "`{}` specializes an item from a parent `impl`, but \
1718          that item is not marked `default`",
1719         impl_item.ident);
1720     err.span_label(impl_item.span, format!("cannot specialize default item `{}`",
1721                                             impl_item.ident));
1722
1723     match tcx.span_of_impl(parent_impl) {
1724         Ok(span) => {
1725             err.span_label(span, "parent `impl` is here");
1726             err.note(&format!("to specialize, `{}` in the parent `impl` must be marked `default`",
1727                               impl_item.ident));
1728         }
1729         Err(cname) => {
1730             err.note(&format!("parent implementation is in crate `{}`", cname));
1731         }
1732     }
1733
1734     err.emit();
1735 }
1736
1737 fn check_specialization_validity<'tcx>(
1738     tcx: TyCtxt<'tcx>,
1739     trait_def: &ty::TraitDef,
1740     trait_item: &ty::AssocItem,
1741     impl_id: DefId,
1742     impl_item: &hir::ImplItem,
1743 ) {
1744     let kind = match impl_item.kind {
1745         hir::ImplItemKind::Const(..) => ty::AssocKind::Const,
1746         hir::ImplItemKind::Method(..) => ty::AssocKind::Method,
1747         hir::ImplItemKind::OpaqueTy(..) => ty::AssocKind::OpaqueTy,
1748         hir::ImplItemKind::TyAlias(_) => ty::AssocKind::Type,
1749     };
1750
1751     let mut ancestor_impls = trait_def.ancestors(tcx, impl_id)
1752         .skip(1)
1753         .filter_map(|parent| {
1754             if parent.is_from_trait() {
1755                 None
1756             } else {
1757                 Some((parent, parent.item(tcx, trait_item.ident, kind, trait_def.def_id)))
1758             }
1759         })
1760         .peekable();
1761
1762     if ancestor_impls.peek().is_none() {
1763         // No parent, nothing to specialize.
1764         return;
1765     }
1766
1767     let opt_result = ancestor_impls.find_map(|(parent_impl, parent_item)| {
1768         match parent_item {
1769             // Parent impl exists, and contains the parent item we're trying to specialize, but
1770             // doesn't mark it `default`.
1771             Some(parent_item) if tcx.impl_item_is_final(&parent_item) => {
1772                 Some(Err(parent_impl.def_id()))
1773             }
1774
1775             // Parent impl contains item and makes it specializable.
1776             Some(_) => {
1777                 Some(Ok(()))
1778             }
1779
1780             // Parent impl doesn't mention the item. This means it's inherited from the
1781             // grandparent. In that case, if parent is a `default impl`, inherited items use the
1782             // "defaultness" from the grandparent, else they are final.
1783             None => if tcx.impl_is_default(parent_impl.def_id()) {
1784                 None
1785             } else {
1786                 Some(Err(parent_impl.def_id()))
1787             }
1788         }
1789     });
1790
1791     // If `opt_result` is `None`, we have only encoutered `default impl`s that don't contain the
1792     // item. This is allowed, the item isn't actually getting specialized here.
1793     let result = opt_result.unwrap_or(Ok(()));
1794
1795     if let Err(parent_impl) = result {
1796         report_forbidden_specialization(tcx, impl_item, parent_impl);
1797     }
1798 }
1799
1800 fn check_impl_items_against_trait<'tcx>(
1801     tcx: TyCtxt<'tcx>,
1802     impl_span: Span,
1803     impl_id: DefId,
1804     impl_trait_ref: ty::TraitRef<'tcx>,
1805     impl_item_refs: &[hir::ImplItemRef],
1806 ) {
1807     let impl_span = tcx.sess.source_map().def_span(impl_span);
1808
1809     // If the trait reference itself is erroneous (so the compilation is going
1810     // to fail), skip checking the items here -- the `impl_item` table in `tcx`
1811     // isn't populated for such impls.
1812     if impl_trait_ref.references_error() { return; }
1813
1814     // Locate trait definition and items
1815     let trait_def = tcx.trait_def(impl_trait_ref.def_id);
1816     let mut overridden_associated_type = None;
1817
1818     let impl_items = || impl_item_refs.iter().map(|iiref| tcx.hir().impl_item(iiref.id));
1819
1820     // Check existing impl methods to see if they are both present in trait
1821     // and compatible with trait signature
1822     for impl_item in impl_items() {
1823         let ty_impl_item = tcx.associated_item(
1824             tcx.hir().local_def_id(impl_item.hir_id));
1825         let ty_trait_item = tcx.associated_items(impl_trait_ref.def_id)
1826             .find(|ac| Namespace::from(&impl_item.kind) == Namespace::from(ac.kind) &&
1827                        tcx.hygienic_eq(ty_impl_item.ident, ac.ident, impl_trait_ref.def_id))
1828             .or_else(|| {
1829                 // Not compatible, but needed for the error message
1830                 tcx.associated_items(impl_trait_ref.def_id)
1831                    .find(|ac| tcx.hygienic_eq(ty_impl_item.ident, ac.ident, impl_trait_ref.def_id))
1832             });
1833
1834         // Check that impl definition matches trait definition
1835         if let Some(ty_trait_item) = ty_trait_item {
1836             match impl_item.kind {
1837                 hir::ImplItemKind::Const(..) => {
1838                     // Find associated const definition.
1839                     if ty_trait_item.kind == ty::AssocKind::Const {
1840                         compare_const_impl(tcx,
1841                                            &ty_impl_item,
1842                                            impl_item.span,
1843                                            &ty_trait_item,
1844                                            impl_trait_ref);
1845                     } else {
1846                          let mut err = struct_span_err!(tcx.sess, impl_item.span, E0323,
1847                              "item `{}` is an associated const, \
1848                               which doesn't match its trait `{}`",
1849                              ty_impl_item.ident,
1850                              impl_trait_ref);
1851                          err.span_label(impl_item.span, "does not match trait");
1852                          // We can only get the spans from local trait definition
1853                          // Same for E0324 and E0325
1854                          if let Some(trait_span) = tcx.hir().span_if_local(ty_trait_item.def_id) {
1855                             err.span_label(trait_span, "item in trait");
1856                          }
1857                          err.emit()
1858                     }
1859                 }
1860                 hir::ImplItemKind::Method(..) => {
1861                     let trait_span = tcx.hir().span_if_local(ty_trait_item.def_id);
1862                     if ty_trait_item.kind == ty::AssocKind::Method {
1863                         compare_impl_method(tcx,
1864                                             &ty_impl_item,
1865                                             impl_item.span,
1866                                             &ty_trait_item,
1867                                             impl_trait_ref,
1868                                             trait_span);
1869                     } else {
1870                         let mut err = struct_span_err!(tcx.sess, impl_item.span, E0324,
1871                             "item `{}` is an associated method, \
1872                              which doesn't match its trait `{}`",
1873                             ty_impl_item.ident,
1874                             impl_trait_ref);
1875                          err.span_label(impl_item.span, "does not match trait");
1876                          if let Some(trait_span) = tcx.hir().span_if_local(ty_trait_item.def_id) {
1877                             err.span_label(trait_span, "item in trait");
1878                          }
1879                          err.emit()
1880                     }
1881                 }
1882                 hir::ImplItemKind::OpaqueTy(..) |
1883                 hir::ImplItemKind::TyAlias(_) => {
1884                     if ty_trait_item.kind == ty::AssocKind::Type {
1885                         if ty_trait_item.defaultness.has_value() {
1886                             overridden_associated_type = Some(impl_item);
1887                         }
1888                     } else {
1889                         let mut err = struct_span_err!(tcx.sess, impl_item.span, E0325,
1890                             "item `{}` is an associated type, \
1891                              which doesn't match its trait `{}`",
1892                             ty_impl_item.ident,
1893                             impl_trait_ref);
1894                          err.span_label(impl_item.span, "does not match trait");
1895                          if let Some(trait_span) = tcx.hir().span_if_local(ty_trait_item.def_id) {
1896                             err.span_label(trait_span, "item in trait");
1897                          }
1898                          err.emit()
1899                     }
1900                 }
1901             }
1902
1903             check_specialization_validity(tcx, trait_def, &ty_trait_item, impl_id, impl_item);
1904         }
1905     }
1906
1907     // Check for missing items from trait
1908     let mut missing_items = Vec::new();
1909     let mut invalidated_items = Vec::new();
1910     let associated_type_overridden = overridden_associated_type.is_some();
1911     for trait_item in tcx.associated_items(impl_trait_ref.def_id) {
1912         let is_implemented = trait_def.ancestors(tcx, impl_id)
1913             .leaf_def(tcx, trait_item.ident, trait_item.kind)
1914             .map(|node_item| !node_item.node.is_from_trait())
1915             .unwrap_or(false);
1916
1917         if !is_implemented && !tcx.impl_is_default(impl_id) {
1918             if !trait_item.defaultness.has_value() {
1919                 missing_items.push(trait_item);
1920             } else if associated_type_overridden {
1921                 invalidated_items.push(trait_item.ident);
1922             }
1923         }
1924     }
1925
1926     if !missing_items.is_empty() {
1927         let mut err = struct_span_err!(tcx.sess, impl_span, E0046,
1928             "not all trait items implemented, missing: `{}`",
1929             missing_items.iter()
1930                 .map(|trait_item| trait_item.ident.to_string())
1931                 .collect::<Vec<_>>().join("`, `"));
1932         err.span_label(impl_span, format!("missing `{}` in implementation",
1933                 missing_items.iter()
1934                     .map(|trait_item| trait_item.ident.to_string())
1935                     .collect::<Vec<_>>().join("`, `")));
1936         for trait_item in missing_items {
1937             if let Some(span) = tcx.hir().span_if_local(trait_item.def_id) {
1938                 err.span_label(span, format!("`{}` from trait", trait_item.ident));
1939             } else {
1940                 err.note_trait_signature(trait_item.ident.to_string(),
1941                                          trait_item.signature(tcx));
1942             }
1943         }
1944         err.emit();
1945     }
1946
1947     if !invalidated_items.is_empty() {
1948         let invalidator = overridden_associated_type.unwrap();
1949         span_err!(tcx.sess, invalidator.span, E0399,
1950                   "the following trait items need to be reimplemented \
1951                    as `{}` was overridden: `{}`",
1952                   invalidator.ident,
1953                   invalidated_items.iter()
1954                                    .map(|name| name.to_string())
1955                                    .collect::<Vec<_>>().join("`, `"))
1956     }
1957 }
1958
1959 /// Checks whether a type can be represented in memory. In particular, it
1960 /// identifies types that contain themselves without indirection through a
1961 /// pointer, which would mean their size is unbounded.
1962 fn check_representable(tcx: TyCtxt<'_>, sp: Span, item_def_id: DefId) -> bool {
1963     let rty = tcx.type_of(item_def_id);
1964
1965     // Check that it is possible to represent this type. This call identifies
1966     // (1) types that contain themselves and (2) types that contain a different
1967     // recursive type. It is only necessary to throw an error on those that
1968     // contain themselves. For case 2, there must be an inner type that will be
1969     // caught by case 1.
1970     match rty.is_representable(tcx, sp) {
1971         Representability::SelfRecursive(spans) => {
1972             let mut err = tcx.recursive_type_with_infinite_size_error(item_def_id);
1973             for span in spans {
1974                 err.span_label(span, "recursive without indirection");
1975             }
1976             err.emit();
1977             return false
1978         }
1979         Representability::Representable | Representability::ContainsRecursive => (),
1980     }
1981     return true;
1982 }
1983
1984 pub fn check_simd(tcx: TyCtxt<'_>, sp: Span, def_id: DefId) {
1985     let t = tcx.type_of(def_id);
1986     if let ty::Adt(def, substs) = t.kind {
1987         if def.is_struct() {
1988             let fields = &def.non_enum_variant().fields;
1989             if fields.is_empty() {
1990                 span_err!(tcx.sess, sp, E0075, "SIMD vector cannot be empty");
1991                 return;
1992             }
1993             let e = fields[0].ty(tcx, substs);
1994             if !fields.iter().all(|f| f.ty(tcx, substs) == e) {
1995                 struct_span_err!(tcx.sess, sp, E0076, "SIMD vector should be homogeneous")
1996                                 .span_label(sp, "SIMD elements must have the same type")
1997                                 .emit();
1998                 return;
1999             }
2000             match e.kind {
2001                 ty::Param(_) => { /* struct<T>(T, T, T, T) is ok */ }
2002                 _ if e.is_machine() => { /* struct(u8, u8, u8, u8) is ok */ }
2003                 _ => {
2004                     span_err!(tcx.sess, sp, E0077,
2005                               "SIMD vector element type should be machine type");
2006                     return;
2007                 }
2008             }
2009         }
2010     }
2011 }
2012
2013 fn check_packed(tcx: TyCtxt<'_>, sp: Span, def_id: DefId) {
2014     let repr = tcx.adt_def(def_id).repr;
2015     if repr.packed() {
2016         for attr in tcx.get_attrs(def_id).iter() {
2017             for r in attr::find_repr_attrs(&tcx.sess.parse_sess, attr) {
2018                 if let attr::ReprPacked(pack) = r {
2019                     if let Some(repr_pack) = repr.pack {
2020                         if pack as u64 != repr_pack.bytes() {
2021                             struct_span_err!(
2022                                 tcx.sess, sp, E0634,
2023                                 "type has conflicting packed representation hints"
2024                             ).emit();
2025                         }
2026                     }
2027                 }
2028             }
2029         }
2030         if repr.align.is_some() {
2031             struct_span_err!(tcx.sess, sp, E0587,
2032                              "type has conflicting packed and align representation hints").emit();
2033         }
2034         else if check_packed_inner(tcx, def_id, &mut Vec::new()) {
2035             struct_span_err!(tcx.sess, sp, E0588,
2036                 "packed type cannot transitively contain a `[repr(align)]` type").emit();
2037         }
2038     }
2039 }
2040
2041 fn check_packed_inner(tcx: TyCtxt<'_>, def_id: DefId, stack: &mut Vec<DefId>) -> bool {
2042     let t = tcx.type_of(def_id);
2043     if stack.contains(&def_id) {
2044         debug!("check_packed_inner: {:?} is recursive", t);
2045         return false;
2046     }
2047     if let ty::Adt(def, substs) = t.kind {
2048         if def.is_struct() || def.is_union() {
2049             if tcx.adt_def(def.did).repr.align.is_some() {
2050                 return true;
2051             }
2052             // push struct def_id before checking fields
2053             stack.push(def_id);
2054             for field in &def.non_enum_variant().fields {
2055                 let f = field.ty(tcx, substs);
2056                 if let ty::Adt(def, _) = f.kind {
2057                     if check_packed_inner(tcx, def.did, stack) {
2058                         return true;
2059                     }
2060                 }
2061             }
2062             // only need to pop if not early out
2063             stack.pop();
2064         }
2065     }
2066     false
2067 }
2068
2069 /// Emit an error when encountering more or less than one variant in a transparent enum.
2070 fn bad_variant_count<'tcx>(tcx: TyCtxt<'tcx>, adt: &'tcx ty::AdtDef, sp: Span, did: DefId) {
2071     let variant_spans: Vec<_> = adt.variants.iter().map(|variant| {
2072         tcx.hir().span_if_local(variant.def_id).unwrap()
2073     }).collect();
2074     let msg = format!(
2075         "needs exactly one variant, but has {}",
2076         adt.variants.len(),
2077     );
2078     let mut err = struct_span_err!(tcx.sess, sp, E0731, "transparent enum {}", msg);
2079     err.span_label(sp, &msg);
2080     if let &[ref start @ .., ref end] = &variant_spans[..] {
2081         for variant_span in start {
2082             err.span_label(*variant_span, "");
2083         }
2084         err.span_label(*end, &format!("too many variants in `{}`", tcx.def_path_str(did)));
2085     }
2086     err.emit();
2087 }
2088
2089 /// Emit an error when encountering more or less than one non-zero-sized field in a transparent
2090 /// enum.
2091 fn bad_non_zero_sized_fields<'tcx>(
2092     tcx: TyCtxt<'tcx>,
2093     adt: &'tcx ty::AdtDef,
2094     field_count: usize,
2095     field_spans: impl Iterator<Item = Span>,
2096     sp: Span,
2097 ) {
2098     let msg = format!("needs exactly one non-zero-sized field, but has {}", field_count);
2099     let mut err = struct_span_err!(
2100         tcx.sess,
2101         sp,
2102         E0690,
2103         "{}transparent {} {}",
2104         if adt.is_enum() { "the variant of a " } else { "" },
2105         adt.descr(),
2106         msg,
2107     );
2108     err.span_label(sp, &msg);
2109     for sp in field_spans {
2110         err.span_label(sp, "this field is non-zero-sized");
2111     }
2112     err.emit();
2113 }
2114
2115 fn check_transparent(tcx: TyCtxt<'_>, sp: Span, def_id: DefId) {
2116     let adt = tcx.adt_def(def_id);
2117     if !adt.repr.transparent() {
2118         return;
2119     }
2120     let sp = tcx.sess.source_map().def_span(sp);
2121
2122     if adt.is_enum() {
2123         if !tcx.features().transparent_enums {
2124             emit_feature_err(
2125                 &tcx.sess.parse_sess,
2126                 sym::transparent_enums,
2127                 sp,
2128                 GateIssue::Language,
2129                 "transparent enums are unstable",
2130             );
2131         }
2132         if adt.variants.len() != 1 {
2133             bad_variant_count(tcx, adt, sp, def_id);
2134             if adt.variants.is_empty() {
2135                 // Don't bother checking the fields. No variants (and thus no fields) exist.
2136                 return;
2137             }
2138         }
2139     }
2140
2141     if adt.is_union() && !tcx.features().transparent_unions {
2142         emit_feature_err(&tcx.sess.parse_sess,
2143                          sym::transparent_unions,
2144                          sp,
2145                          GateIssue::Language,
2146                          "transparent unions are unstable");
2147     }
2148
2149     // For each field, figure out if it's known to be a ZST and align(1)
2150     let field_infos = adt.all_fields().map(|field| {
2151         let ty = field.ty(tcx, InternalSubsts::identity_for_item(tcx, field.did));
2152         let param_env = tcx.param_env(field.did);
2153         let layout = tcx.layout_of(param_env.and(ty));
2154         // We are currently checking the type this field came from, so it must be local
2155         let span = tcx.hir().span_if_local(field.did).unwrap();
2156         let zst = layout.map(|layout| layout.is_zst()).unwrap_or(false);
2157         let align1 = layout.map(|layout| layout.align.abi.bytes() == 1).unwrap_or(false);
2158         (span, zst, align1)
2159     });
2160
2161     let non_zst_fields = field_infos.clone().filter_map(|(span, zst, _align1)| if !zst {
2162         Some(span)
2163     } else {
2164         None
2165     });
2166     let non_zst_count = non_zst_fields.clone().count();
2167     if non_zst_count != 1 {
2168         bad_non_zero_sized_fields(tcx, adt, non_zst_count, non_zst_fields, sp);
2169     }
2170     for (span, zst, align1) in field_infos {
2171         if zst && !align1 {
2172             struct_span_err!(
2173                 tcx.sess,
2174                 span,
2175                 E0691,
2176                 "zero-sized field in transparent {} has alignment larger than 1",
2177                 adt.descr(),
2178             ).span_label(span, "has alignment larger than 1").emit();
2179         }
2180     }
2181 }
2182
2183 #[allow(trivial_numeric_casts)]
2184 pub fn check_enum<'tcx>(tcx: TyCtxt<'tcx>, sp: Span, vs: &'tcx [hir::Variant], id: hir::HirId) {
2185     let def_id = tcx.hir().local_def_id(id);
2186     let def = tcx.adt_def(def_id);
2187     def.destructor(tcx); // force the destructor to be evaluated
2188
2189     if vs.is_empty() {
2190         let attributes = tcx.get_attrs(def_id);
2191         if let Some(attr) = attr::find_by_name(&attributes, sym::repr) {
2192             struct_span_err!(
2193                 tcx.sess, attr.span, E0084,
2194                 "unsupported representation for zero-variant enum")
2195                 .span_label(sp, "zero-variant enum")
2196                 .emit();
2197         }
2198     }
2199
2200     let repr_type_ty = def.repr.discr_type().to_ty(tcx);
2201     if repr_type_ty == tcx.types.i128 || repr_type_ty == tcx.types.u128 {
2202         if !tcx.features().repr128 {
2203             emit_feature_err(&tcx.sess.parse_sess,
2204                              sym::repr128,
2205                              sp,
2206                              GateIssue::Language,
2207                              "repr with 128-bit type is unstable");
2208         }
2209     }
2210
2211     for v in vs {
2212         if let Some(ref e) = v.disr_expr {
2213             tcx.typeck_tables_of(tcx.hir().local_def_id(e.hir_id));
2214         }
2215     }
2216
2217     if tcx.adt_def(def_id).repr.int.is_none() && tcx.features().arbitrary_enum_discriminant {
2218         let is_unit =
2219             |var: &hir::Variant| match var.data {
2220                 hir::VariantData::Unit(..) => true,
2221                 _ => false
2222             };
2223
2224         let has_disr = |var: &hir::Variant| var.disr_expr.is_some();
2225         let has_non_units = vs.iter().any(|var| !is_unit(var));
2226         let disr_units = vs.iter().any(|var| is_unit(&var) && has_disr(&var));
2227         let disr_non_unit = vs.iter().any(|var| !is_unit(&var) && has_disr(&var));
2228
2229         if disr_non_unit || (disr_units && has_non_units) {
2230             let mut err = struct_span_err!(tcx.sess, sp, E0732,
2231                                            "`#[repr(inttype)]` must be specified");
2232             err.emit();
2233         }
2234     }
2235
2236     let mut disr_vals: Vec<Discr<'tcx>> = Vec::with_capacity(vs.len());
2237     for ((_, discr), v) in def.discriminants(tcx).zip(vs) {
2238         // Check for duplicate discriminant values
2239         if let Some(i) = disr_vals.iter().position(|&x| x.val == discr.val) {
2240             let variant_did = def.variants[VariantIdx::new(i)].def_id;
2241             let variant_i_hir_id = tcx.hir().as_local_hir_id(variant_did).unwrap();
2242             let variant_i = tcx.hir().expect_variant(variant_i_hir_id);
2243             let i_span = match variant_i.disr_expr {
2244                 Some(ref expr) => tcx.hir().span(expr.hir_id),
2245                 None => tcx.hir().span(variant_i_hir_id)
2246             };
2247             let span = match v.disr_expr {
2248                 Some(ref expr) => tcx.hir().span(expr.hir_id),
2249                 None => v.span
2250             };
2251             struct_span_err!(tcx.sess, span, E0081,
2252                              "discriminant value `{}` already exists", disr_vals[i])
2253                 .span_label(i_span, format!("first use of `{}`", disr_vals[i]))
2254                 .span_label(span , format!("enum already has `{}`", disr_vals[i]))
2255                 .emit();
2256         }
2257         disr_vals.push(discr);
2258     }
2259
2260     check_representable(tcx, sp, def_id);
2261     check_transparent(tcx, sp, def_id);
2262 }
2263
2264 fn report_unexpected_variant_res(tcx: TyCtxt<'_>, res: Res, span: Span, qpath: &QPath) {
2265     span_err!(tcx.sess, span, E0533,
2266               "expected unit struct/variant or constant, found {} `{}`",
2267               res.descr(),
2268               hir::print::to_string(tcx.hir(), |s| s.print_qpath(qpath, false)));
2269 }
2270
2271 impl<'a, 'tcx> AstConv<'tcx> for FnCtxt<'a, 'tcx> {
2272     fn tcx<'b>(&'b self) -> TyCtxt<'tcx> {
2273         self.tcx
2274     }
2275
2276     fn get_type_parameter_bounds(&self, _: Span, def_id: DefId) -> ty::GenericPredicates<'tcx> {
2277         let tcx = self.tcx;
2278         let hir_id = tcx.hir().as_local_hir_id(def_id).unwrap();
2279         let item_id = tcx.hir().ty_param_owner(hir_id);
2280         let item_def_id = tcx.hir().local_def_id(item_id);
2281         let generics = tcx.generics_of(item_def_id);
2282         let index = generics.param_def_id_to_index[&def_id];
2283         ty::GenericPredicates {
2284             parent: None,
2285             predicates: tcx.arena.alloc_from_iter(
2286                 self.param_env.caller_bounds.iter().filter_map(|&predicate| match predicate {
2287                     ty::Predicate::Trait(ref data)
2288                     if data.skip_binder().self_ty().is_param(index) => {
2289                         // HACK(eddyb) should get the original `Span`.
2290                         let span = tcx.def_span(def_id);
2291                         Some((predicate, span))
2292                     }
2293                     _ => None
2294                 }),
2295             ),
2296         }
2297     }
2298
2299     fn re_infer(
2300         &self,
2301         def: Option<&ty::GenericParamDef>,
2302         span: Span,
2303     ) -> Option<ty::Region<'tcx>> {
2304         let v = match def {
2305             Some(def) => infer::EarlyBoundRegion(span, def.name),
2306             None => infer::MiscVariable(span)
2307         };
2308         Some(self.next_region_var(v))
2309     }
2310
2311     fn ty_infer(&self, param: Option<&ty::GenericParamDef>, span: Span) -> Ty<'tcx> {
2312         if let Some(param) = param {
2313             if let GenericArgKind::Type(ty) = self.var_for_def(span, param).unpack() {
2314                 return ty;
2315             }
2316             unreachable!()
2317         } else {
2318             self.next_ty_var(TypeVariableOrigin {
2319                 kind: TypeVariableOriginKind::TypeInference,
2320                 span,
2321             })
2322         }
2323     }
2324
2325     fn ct_infer(
2326         &self,
2327         ty: Ty<'tcx>,
2328         param: Option<&ty::GenericParamDef>,
2329         span: Span,
2330     ) -> &'tcx Const<'tcx> {
2331         if let Some(param) = param {
2332             if let GenericArgKind::Const(ct) = self.var_for_def(span, param).unpack() {
2333                 return ct;
2334             }
2335             unreachable!()
2336         } else {
2337             self.next_const_var(ty, ConstVariableOrigin {
2338                 kind: ConstVariableOriginKind::ConstInference,
2339                 span,
2340             })
2341         }
2342     }
2343
2344     fn projected_ty_from_poly_trait_ref(&self,
2345                                         span: Span,
2346                                         item_def_id: DefId,
2347                                         poly_trait_ref: ty::PolyTraitRef<'tcx>)
2348                                         -> Ty<'tcx>
2349     {
2350         let (trait_ref, _) = self.replace_bound_vars_with_fresh_vars(
2351             span,
2352             infer::LateBoundRegionConversionTime::AssocTypeProjection(item_def_id),
2353             &poly_trait_ref
2354         );
2355
2356         self.tcx().mk_projection(item_def_id, trait_ref.substs)
2357     }
2358
2359     fn normalize_ty(&self, span: Span, ty: Ty<'tcx>) -> Ty<'tcx> {
2360         if ty.has_escaping_bound_vars() {
2361             ty // FIXME: normalization and escaping regions
2362         } else {
2363             self.normalize_associated_types_in(span, &ty)
2364         }
2365     }
2366
2367     fn set_tainted_by_errors(&self) {
2368         self.infcx.set_tainted_by_errors()
2369     }
2370
2371     fn record_ty(&self, hir_id: hir::HirId, ty: Ty<'tcx>, _span: Span) {
2372         self.write_ty(hir_id, ty)
2373     }
2374 }
2375
2376 /// Controls whether the arguments are tupled. This is used for the call
2377 /// operator.
2378 ///
2379 /// Tupling means that all call-side arguments are packed into a tuple and
2380 /// passed as a single parameter. For example, if tupling is enabled, this
2381 /// function:
2382 ///
2383 ///     fn f(x: (isize, isize))
2384 ///
2385 /// Can be called as:
2386 ///
2387 ///     f(1, 2);
2388 ///
2389 /// Instead of:
2390 ///
2391 ///     f((1, 2));
2392 #[derive(Clone, Eq, PartialEq)]
2393 enum TupleArgumentsFlag {
2394     DontTupleArguments,
2395     TupleArguments,
2396 }
2397
2398 impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
2399     pub fn new(
2400         inh: &'a Inherited<'a, 'tcx>,
2401         param_env: ty::ParamEnv<'tcx>,
2402         body_id: hir::HirId,
2403     ) -> FnCtxt<'a, 'tcx> {
2404         FnCtxt {
2405             body_id,
2406             param_env,
2407             err_count_on_creation: inh.tcx.sess.err_count(),
2408             ret_coercion: None,
2409             ret_coercion_span: RefCell::new(None),
2410             yield_ty: None,
2411             ps: RefCell::new(UnsafetyState::function(hir::Unsafety::Normal,
2412                                                      hir::CRATE_HIR_ID)),
2413             diverges: Cell::new(Diverges::Maybe),
2414             has_errors: Cell::new(false),
2415             enclosing_breakables: RefCell::new(EnclosingBreakables {
2416                 stack: Vec::new(),
2417                 by_id: Default::default(),
2418             }),
2419             inh,
2420         }
2421     }
2422
2423     pub fn sess(&self) -> &Session {
2424         &self.tcx.sess
2425     }
2426
2427     pub fn errors_reported_since_creation(&self) -> bool {
2428         self.tcx.sess.err_count() > self.err_count_on_creation
2429     }
2430
2431     /// Produces warning on the given node, if the current point in the
2432     /// function is unreachable, and there hasn't been another warning.
2433     fn warn_if_unreachable(&self, id: hir::HirId, span: Span, kind: &str) {
2434         // FIXME: Combine these two 'if' expressions into one once
2435         // let chains are implemented
2436         if let Diverges::Always { span: orig_span, custom_note } = self.diverges.get() {
2437             // If span arose from a desugaring of `if` or `while`, then it is the condition itself,
2438             // which diverges, that we are about to lint on. This gives suboptimal diagnostics.
2439             // Instead, stop here so that the `if`- or `while`-expression's block is linted instead.
2440             if !span.is_desugaring(DesugaringKind::CondTemporary) &&
2441                 !span.is_desugaring(DesugaringKind::Async) &&
2442                 !orig_span.is_desugaring(DesugaringKind::Await)
2443             {
2444                 self.diverges.set(Diverges::WarnedAlways);
2445
2446                 debug!("warn_if_unreachable: id={:?} span={:?} kind={}", id, span, kind);
2447
2448                 let msg = format!("unreachable {}", kind);
2449                 self.tcx().struct_span_lint_hir(lint::builtin::UNREACHABLE_CODE, id, span, &msg)
2450                     .span_label(span, &msg)
2451                     .span_label(
2452                         orig_span,
2453                         custom_note.unwrap_or("any code following this expression is unreachable"),
2454                     )
2455                     .emit();
2456             }
2457         }
2458     }
2459
2460     pub fn cause(&self,
2461                  span: Span,
2462                  code: ObligationCauseCode<'tcx>)
2463                  -> ObligationCause<'tcx> {
2464         ObligationCause::new(span, self.body_id, code)
2465     }
2466
2467     pub fn misc(&self, span: Span) -> ObligationCause<'tcx> {
2468         self.cause(span, ObligationCauseCode::MiscObligation)
2469     }
2470
2471     /// Resolves type and const variables in `ty` if possible. Unlike the infcx
2472     /// version (resolve_vars_if_possible), this version will
2473     /// also select obligations if it seems useful, in an effort
2474     /// to get more type information.
2475     fn resolve_vars_with_obligations(&self, mut ty: Ty<'tcx>) -> Ty<'tcx> {
2476         debug!("resolve_vars_with_obligations(ty={:?})", ty);
2477
2478         // No Infer()? Nothing needs doing.
2479         if !ty.has_infer_types() && !ty.has_infer_consts() {
2480             debug!("resolve_vars_with_obligations: ty={:?}", ty);
2481             return ty;
2482         }
2483
2484         // If `ty` is a type variable, see whether we already know what it is.
2485         ty = self.resolve_vars_if_possible(&ty);
2486         if !ty.has_infer_types() && !ty.has_infer_consts()  {
2487             debug!("resolve_vars_with_obligations: ty={:?}", ty);
2488             return ty;
2489         }
2490
2491         // If not, try resolving pending obligations as much as
2492         // possible. This can help substantially when there are
2493         // indirect dependencies that don't seem worth tracking
2494         // precisely.
2495         self.select_obligations_where_possible(false, |_| {});
2496         ty = self.resolve_vars_if_possible(&ty);
2497
2498         debug!("resolve_vars_with_obligations: ty={:?}", ty);
2499         ty
2500     }
2501
2502     fn record_deferred_call_resolution(
2503         &self,
2504         closure_def_id: DefId,
2505         r: DeferredCallResolution<'tcx>,
2506     ) {
2507         let mut deferred_call_resolutions = self.deferred_call_resolutions.borrow_mut();
2508         deferred_call_resolutions.entry(closure_def_id).or_default().push(r);
2509     }
2510
2511     fn remove_deferred_call_resolutions(
2512         &self,
2513         closure_def_id: DefId,
2514     ) -> Vec<DeferredCallResolution<'tcx>> {
2515         let mut deferred_call_resolutions = self.deferred_call_resolutions.borrow_mut();
2516         deferred_call_resolutions.remove(&closure_def_id).unwrap_or(vec![])
2517     }
2518
2519     pub fn tag(&self) -> String {
2520         format!("{:p}", self)
2521     }
2522
2523     pub fn local_ty(&self, span: Span, nid: hir::HirId) -> LocalTy<'tcx> {
2524         self.locals.borrow().get(&nid).cloned().unwrap_or_else(||
2525             span_bug!(span, "no type for local variable {}",
2526                       self.tcx.hir().node_to_string(nid))
2527         )
2528     }
2529
2530     #[inline]
2531     pub fn write_ty(&self, id: hir::HirId, ty: Ty<'tcx>) {
2532         debug!("write_ty({:?}, {:?}) in fcx {}",
2533                id, self.resolve_vars_if_possible(&ty), self.tag());
2534         self.tables.borrow_mut().node_types_mut().insert(id, ty);
2535
2536         if ty.references_error() {
2537             self.has_errors.set(true);
2538             self.set_tainted_by_errors();
2539         }
2540     }
2541
2542     pub fn write_field_index(&self, hir_id: hir::HirId, index: usize) {
2543         self.tables.borrow_mut().field_indices_mut().insert(hir_id, index);
2544     }
2545
2546     fn write_resolution(&self, hir_id: hir::HirId, r: Result<(DefKind, DefId), ErrorReported>) {
2547         self.tables.borrow_mut().type_dependent_defs_mut().insert(hir_id, r);
2548     }
2549
2550     pub fn write_method_call(&self,
2551                              hir_id: hir::HirId,
2552                              method: MethodCallee<'tcx>) {
2553         debug!("write_method_call(hir_id={:?}, method={:?})", hir_id, method);
2554         self.write_resolution(hir_id, Ok((DefKind::Method, method.def_id)));
2555         self.write_substs(hir_id, method.substs);
2556
2557         // When the method is confirmed, the `method.substs` includes
2558         // parameters from not just the method, but also the impl of
2559         // the method -- in particular, the `Self` type will be fully
2560         // resolved. However, those are not something that the "user
2561         // specified" -- i.e., those types come from the inferred type
2562         // of the receiver, not something the user wrote. So when we
2563         // create the user-substs, we want to replace those earlier
2564         // types with just the types that the user actually wrote --
2565         // that is, those that appear on the *method itself*.
2566         //
2567         // As an example, if the user wrote something like
2568         // `foo.bar::<u32>(...)` -- the `Self` type here will be the
2569         // type of `foo` (possibly adjusted), but we don't want to
2570         // include that. We want just the `[_, u32]` part.
2571         if !method.substs.is_noop() {
2572             let method_generics = self.tcx.generics_of(method.def_id);
2573             if !method_generics.params.is_empty() {
2574                 let user_type_annotation = self.infcx.probe(|_| {
2575                     let user_substs = UserSubsts {
2576                         substs: InternalSubsts::for_item(self.tcx, method.def_id, |param, _| {
2577                             let i = param.index as usize;
2578                             if i < method_generics.parent_count {
2579                                 self.infcx.var_for_def(DUMMY_SP, param)
2580                             } else {
2581                                 method.substs[i]
2582                             }
2583                         }),
2584                         user_self_ty: None, // not relevant here
2585                     };
2586
2587                     self.infcx.canonicalize_user_type_annotation(&UserType::TypeOf(
2588                         method.def_id,
2589                         user_substs,
2590                     ))
2591                 });
2592
2593                 debug!("write_method_call: user_type_annotation={:?}", user_type_annotation);
2594                 self.write_user_type_annotation(hir_id, user_type_annotation);
2595             }
2596         }
2597     }
2598
2599     pub fn write_substs(&self, node_id: hir::HirId, substs: SubstsRef<'tcx>) {
2600         if !substs.is_noop() {
2601             debug!("write_substs({:?}, {:?}) in fcx {}",
2602                    node_id,
2603                    substs,
2604                    self.tag());
2605
2606             self.tables.borrow_mut().node_substs_mut().insert(node_id, substs);
2607         }
2608     }
2609
2610     /// Given the substs that we just converted from the HIR, try to
2611     /// canonicalize them and store them as user-given substitutions
2612     /// (i.e., substitutions that must be respected by the NLL check).
2613     ///
2614     /// This should be invoked **before any unifications have
2615     /// occurred**, so that annotations like `Vec<_>` are preserved
2616     /// properly.
2617     pub fn write_user_type_annotation_from_substs(
2618         &self,
2619         hir_id: hir::HirId,
2620         def_id: DefId,
2621         substs: SubstsRef<'tcx>,
2622         user_self_ty: Option<UserSelfTy<'tcx>>,
2623     ) {
2624         debug!(
2625             "write_user_type_annotation_from_substs: hir_id={:?} def_id={:?} substs={:?} \
2626              user_self_ty={:?} in fcx {}",
2627             hir_id, def_id, substs, user_self_ty, self.tag(),
2628         );
2629
2630         if Self::can_contain_user_lifetime_bounds((substs, user_self_ty)) {
2631             let canonicalized = self.infcx.canonicalize_user_type_annotation(
2632                 &UserType::TypeOf(def_id, UserSubsts {
2633                     substs,
2634                     user_self_ty,
2635                 })
2636             );
2637             debug!("write_user_type_annotation_from_substs: canonicalized={:?}", canonicalized);
2638             self.write_user_type_annotation(hir_id, canonicalized);
2639         }
2640     }
2641
2642     pub fn write_user_type_annotation(
2643         &self,
2644         hir_id: hir::HirId,
2645         canonical_user_type_annotation: CanonicalUserType<'tcx>,
2646     ) {
2647         debug!(
2648             "write_user_type_annotation: hir_id={:?} canonical_user_type_annotation={:?} tag={}",
2649             hir_id, canonical_user_type_annotation, self.tag(),
2650         );
2651
2652         if !canonical_user_type_annotation.is_identity() {
2653             self.tables.borrow_mut().user_provided_types_mut().insert(
2654                 hir_id, canonical_user_type_annotation
2655             );
2656         } else {
2657             debug!("write_user_type_annotation: skipping identity substs");
2658         }
2659     }
2660
2661     pub fn apply_adjustments(&self, expr: &hir::Expr, adj: Vec<Adjustment<'tcx>>) {
2662         debug!("apply_adjustments(expr={:?}, adj={:?})", expr, adj);
2663
2664         if adj.is_empty() {
2665             return;
2666         }
2667
2668         match self.tables.borrow_mut().adjustments_mut().entry(expr.hir_id) {
2669             Entry::Vacant(entry) => { entry.insert(adj); },
2670             Entry::Occupied(mut entry) => {
2671                 debug!(" - composing on top of {:?}", entry.get());
2672                 match (&entry.get()[..], &adj[..]) {
2673                     // Applying any adjustment on top of a NeverToAny
2674                     // is a valid NeverToAny adjustment, because it can't
2675                     // be reached.
2676                     (&[Adjustment { kind: Adjust::NeverToAny, .. }], _) => return,
2677                     (&[
2678                         Adjustment { kind: Adjust::Deref(_), .. },
2679                         Adjustment { kind: Adjust::Borrow(AutoBorrow::Ref(..)), .. },
2680                     ], &[
2681                         Adjustment { kind: Adjust::Deref(_), .. },
2682                         .. // Any following adjustments are allowed.
2683                     ]) => {
2684                         // A reborrow has no effect before a dereference.
2685                     }
2686                     // FIXME: currently we never try to compose autoderefs
2687                     // and ReifyFnPointer/UnsafeFnPointer, but we could.
2688                     _ =>
2689                         bug!("while adjusting {:?}, can't compose {:?} and {:?}",
2690                              expr, entry.get(), adj)
2691                 };
2692                 *entry.get_mut() = adj;
2693             }
2694         }
2695     }
2696
2697     /// Basically whenever we are converting from a type scheme into
2698     /// the fn body space, we always want to normalize associated
2699     /// types as well. This function combines the two.
2700     fn instantiate_type_scheme<T>(&self,
2701                                   span: Span,
2702                                   substs: SubstsRef<'tcx>,
2703                                   value: &T)
2704                                   -> T
2705         where T : TypeFoldable<'tcx>
2706     {
2707         let value = value.subst(self.tcx, substs);
2708         let result = self.normalize_associated_types_in(span, &value);
2709         debug!("instantiate_type_scheme(value={:?}, substs={:?}) = {:?}",
2710                value,
2711                substs,
2712                result);
2713         result
2714     }
2715
2716     /// As `instantiate_type_scheme`, but for the bounds found in a
2717     /// generic type scheme.
2718     fn instantiate_bounds(
2719         &self,
2720         span: Span,
2721         def_id: DefId,
2722         substs: SubstsRef<'tcx>,
2723     ) -> (ty::InstantiatedPredicates<'tcx>, Vec<Span>) {
2724         let bounds = self.tcx.predicates_of(def_id);
2725         let spans: Vec<Span> = bounds.predicates.iter().map(|(_, span)| *span).collect();
2726         let result = bounds.instantiate(self.tcx, substs);
2727         let result = self.normalize_associated_types_in(span, &result);
2728         debug!(
2729             "instantiate_bounds(bounds={:?}, substs={:?}) = {:?}, {:?}",
2730                bounds,
2731                substs,
2732             result,
2733             spans,
2734         );
2735         (result, spans)
2736     }
2737
2738     /// Replaces the opaque types from the given value with type variables,
2739     /// and records the `OpaqueTypeMap` for later use during writeback. See
2740     /// `InferCtxt::instantiate_opaque_types` for more details.
2741     fn instantiate_opaque_types_from_value<T: TypeFoldable<'tcx>>(
2742         &self,
2743         parent_id: hir::HirId,
2744         value: &T,
2745         value_span: Span,
2746     ) -> T {
2747         let parent_def_id = self.tcx.hir().local_def_id(parent_id);
2748         debug!("instantiate_opaque_types_from_value(parent_def_id={:?}, value={:?})",
2749                parent_def_id,
2750                value);
2751
2752         let (value, opaque_type_map) = self.register_infer_ok_obligations(
2753             self.instantiate_opaque_types(
2754                 parent_def_id,
2755                 self.body_id,
2756                 self.param_env,
2757                 value,
2758                 value_span,
2759             )
2760         );
2761
2762         let mut opaque_types = self.opaque_types.borrow_mut();
2763         for (ty, decl) in opaque_type_map {
2764             let old_value = opaque_types.insert(ty, decl);
2765             assert!(old_value.is_none(), "instantiated twice: {:?}/{:?}", ty, decl);
2766         }
2767
2768         value
2769     }
2770
2771     fn normalize_associated_types_in<T>(&self, span: Span, value: &T) -> T
2772         where T : TypeFoldable<'tcx>
2773     {
2774         self.inh.normalize_associated_types_in(span, self.body_id, self.param_env, value)
2775     }
2776
2777     fn normalize_associated_types_in_as_infer_ok<T>(&self, span: Span, value: &T)
2778                                                     -> InferOk<'tcx, T>
2779         where T : TypeFoldable<'tcx>
2780     {
2781         self.inh.partially_normalize_associated_types_in(span,
2782                                                          self.body_id,
2783                                                          self.param_env,
2784                                                          value)
2785     }
2786
2787     pub fn require_type_meets(&self,
2788                               ty: Ty<'tcx>,
2789                               span: Span,
2790                               code: traits::ObligationCauseCode<'tcx>,
2791                               def_id: DefId)
2792     {
2793         self.register_bound(
2794             ty,
2795             def_id,
2796             traits::ObligationCause::new(span, self.body_id, code));
2797     }
2798
2799     pub fn require_type_is_sized(
2800         &self,
2801         ty: Ty<'tcx>,
2802         span: Span,
2803         code: traits::ObligationCauseCode<'tcx>,
2804     ) {
2805         if !ty.references_error() {
2806             let lang_item = self.tcx.require_lang_item(lang_items::SizedTraitLangItem, None);
2807             self.require_type_meets(ty, span, code, lang_item);
2808         }
2809     }
2810
2811     pub fn require_type_is_sized_deferred(
2812         &self,
2813         ty: Ty<'tcx>,
2814         span: Span,
2815         code: traits::ObligationCauseCode<'tcx>,
2816     ) {
2817         if !ty.references_error() {
2818             self.deferred_sized_obligations.borrow_mut().push((ty, span, code));
2819         }
2820     }
2821
2822     pub fn register_bound(
2823         &self,
2824         ty: Ty<'tcx>,
2825         def_id: DefId,
2826         cause: traits::ObligationCause<'tcx>,
2827     ) {
2828         if !ty.references_error() {
2829             self.fulfillment_cx.borrow_mut()
2830                 .register_bound(self, self.param_env, ty, def_id, cause);
2831         }
2832     }
2833
2834     pub fn to_ty(&self, ast_t: &hir::Ty) -> Ty<'tcx> {
2835         let t = AstConv::ast_ty_to_ty(self, ast_t);
2836         self.register_wf_obligation(t, ast_t.span, traits::MiscObligation);
2837         t
2838     }
2839
2840     pub fn to_ty_saving_user_provided_ty(&self, ast_ty: &hir::Ty) -> Ty<'tcx> {
2841         let ty = self.to_ty(ast_ty);
2842         debug!("to_ty_saving_user_provided_ty: ty={:?}", ty);
2843
2844         if Self::can_contain_user_lifetime_bounds(ty) {
2845             let c_ty = self.infcx.canonicalize_response(&UserType::Ty(ty));
2846             debug!("to_ty_saving_user_provided_ty: c_ty={:?}", c_ty);
2847             self.tables.borrow_mut().user_provided_types_mut().insert(ast_ty.hir_id, c_ty);
2848         }
2849
2850         ty
2851     }
2852
2853     /// Returns the `DefId` of the constant parameter that the provided expression is a path to.
2854     pub fn const_param_def_id(&self, hir_c: &hir::AnonConst) -> Option<DefId> {
2855         AstConv::const_param_def_id(self, &self.tcx.hir().body(hir_c.body).value)
2856     }
2857
2858     pub fn to_const(&self, ast_c: &hir::AnonConst, ty: Ty<'tcx>) -> &'tcx ty::Const<'tcx> {
2859         AstConv::ast_const_to_const(self, ast_c, ty)
2860     }
2861
2862     // If the type given by the user has free regions, save it for later, since
2863     // NLL would like to enforce those. Also pass in types that involve
2864     // projections, since those can resolve to `'static` bounds (modulo #54940,
2865     // which hopefully will be fixed by the time you see this comment, dear
2866     // reader, although I have my doubts). Also pass in types with inference
2867     // types, because they may be repeated. Other sorts of things are already
2868     // sufficiently enforced with erased regions. =)
2869     fn can_contain_user_lifetime_bounds<T>(t: T) -> bool
2870     where
2871         T: TypeFoldable<'tcx>
2872     {
2873         t.has_free_regions() || t.has_projections() || t.has_infer_types()
2874     }
2875
2876     pub fn node_ty(&self, id: hir::HirId) -> Ty<'tcx> {
2877         match self.tables.borrow().node_types().get(id) {
2878             Some(&t) => t,
2879             None if self.is_tainted_by_errors() => self.tcx.types.err,
2880             None => {
2881                 bug!("no type for node {}: {} in fcx {}",
2882                      id, self.tcx.hir().node_to_string(id),
2883                      self.tag());
2884             }
2885         }
2886     }
2887
2888     /// Registers an obligation for checking later, during regionck, that the type `ty` must
2889     /// outlive the region `r`.
2890     pub fn register_wf_obligation(
2891         &self,
2892         ty: Ty<'tcx>,
2893         span: Span,
2894         code: traits::ObligationCauseCode<'tcx>,
2895     ) {
2896         // WF obligations never themselves fail, so no real need to give a detailed cause:
2897         let cause = traits::ObligationCause::new(span, self.body_id, code);
2898         self.register_predicate(
2899             traits::Obligation::new(cause, self.param_env, ty::Predicate::WellFormed(ty)),
2900         );
2901     }
2902
2903     /// Registers obligations that all types appearing in `substs` are well-formed.
2904     pub fn add_wf_bounds(&self, substs: SubstsRef<'tcx>, expr: &hir::Expr) {
2905         for ty in substs.types() {
2906             if !ty.references_error() {
2907                 self.register_wf_obligation(ty, expr.span, traits::MiscObligation);
2908             }
2909         }
2910     }
2911
2912     /// Given a fully substituted set of bounds (`generic_bounds`), and the values with which each
2913     /// type/region parameter was instantiated (`substs`), creates and registers suitable
2914     /// trait/region obligations.
2915     ///
2916     /// For example, if there is a function:
2917     ///
2918     /// ```
2919     /// fn foo<'a,T:'a>(...)
2920     /// ```
2921     ///
2922     /// and a reference:
2923     ///
2924     /// ```
2925     /// let f = foo;
2926     /// ```
2927     ///
2928     /// Then we will create a fresh region variable `'$0` and a fresh type variable `$1` for `'a`
2929     /// and `T`. This routine will add a region obligation `$1:'$0` and register it locally.
2930     pub fn add_obligations_for_parameters(&self,
2931                                           cause: traits::ObligationCause<'tcx>,
2932                                           predicates: &ty::InstantiatedPredicates<'tcx>)
2933     {
2934         assert!(!predicates.has_escaping_bound_vars());
2935
2936         debug!("add_obligations_for_parameters(predicates={:?})",
2937                predicates);
2938
2939         for obligation in traits::predicates_for_generics(cause, self.param_env, predicates) {
2940             self.register_predicate(obligation);
2941         }
2942     }
2943
2944     // FIXME(arielb1): use this instead of field.ty everywhere
2945     // Only for fields! Returns <none> for methods>
2946     // Indifferent to privacy flags
2947     pub fn field_ty(
2948         &self,
2949         span: Span,
2950         field: &'tcx ty::FieldDef,
2951         substs: SubstsRef<'tcx>,
2952     ) -> Ty<'tcx> {
2953         self.normalize_associated_types_in(span, &field.ty(self.tcx, substs))
2954     }
2955
2956     fn check_casts(&self) {
2957         let mut deferred_cast_checks = self.deferred_cast_checks.borrow_mut();
2958         for cast in deferred_cast_checks.drain(..) {
2959             cast.check(self);
2960         }
2961     }
2962
2963     fn resolve_generator_interiors(&self, def_id: DefId) {
2964         let mut generators = self.deferred_generator_interiors.borrow_mut();
2965         for (body_id, interior, kind) in generators.drain(..) {
2966             self.select_obligations_where_possible(false, |_| {});
2967             generator_interior::resolve_interior(self, def_id, body_id, interior, kind);
2968         }
2969     }
2970
2971     // Tries to apply a fallback to `ty` if it is an unsolved variable.
2972     // Non-numerics get replaced with ! or () (depending on whether
2973     // feature(never_type) is enabled, unconstrained ints with i32,
2974     // unconstrained floats with f64.
2975     // Fallback becomes very dubious if we have encountered type-checking errors.
2976     // In that case, fallback to Error.
2977     // The return value indicates whether fallback has occurred.
2978     fn fallback_if_possible(&self, ty: Ty<'tcx>) -> bool {
2979         use rustc::ty::error::UnconstrainedNumeric::Neither;
2980         use rustc::ty::error::UnconstrainedNumeric::{UnconstrainedInt, UnconstrainedFloat};
2981
2982         assert!(ty.is_ty_infer());
2983         let fallback = match self.type_is_unconstrained_numeric(ty) {
2984             _ if self.is_tainted_by_errors() => self.tcx().types.err,
2985             UnconstrainedInt => self.tcx.types.i32,
2986             UnconstrainedFloat => self.tcx.types.f64,
2987             Neither if self.type_var_diverges(ty) => self.tcx.mk_diverging_default(),
2988             Neither => return false,
2989         };
2990         debug!("fallback_if_possible: defaulting `{:?}` to `{:?}`", ty, fallback);
2991         self.demand_eqtype(syntax_pos::DUMMY_SP, ty, fallback);
2992         true
2993     }
2994
2995     fn select_all_obligations_or_error(&self) {
2996         debug!("select_all_obligations_or_error");
2997         if let Err(errors) = self.fulfillment_cx.borrow_mut().select_all_or_error(&self) {
2998             self.report_fulfillment_errors(&errors, self.inh.body_id, false);
2999         }
3000     }
3001
3002     /// Select as many obligations as we can at present.
3003     fn select_obligations_where_possible(
3004         &self,
3005         fallback_has_occurred: bool,
3006         mutate_fullfillment_errors: impl Fn(&mut Vec<traits::FulfillmentError<'tcx>>),
3007     ) {
3008         if let Err(mut errors) = self.fulfillment_cx.borrow_mut().select_where_possible(self) {
3009             mutate_fullfillment_errors(&mut errors);
3010             self.report_fulfillment_errors(&errors, self.inh.body_id, fallback_has_occurred);
3011         }
3012     }
3013
3014     /// For the overloaded place expressions (`*x`, `x[3]`), the trait
3015     /// returns a type of `&T`, but the actual type we assign to the
3016     /// *expression* is `T`. So this function just peels off the return
3017     /// type by one layer to yield `T`.
3018     fn make_overloaded_place_return_type(&self,
3019                                           method: MethodCallee<'tcx>)
3020                                           -> ty::TypeAndMut<'tcx>
3021     {
3022         // extract method return type, which will be &T;
3023         let ret_ty = method.sig.output();
3024
3025         // method returns &T, but the type as visible to user is T, so deref
3026         ret_ty.builtin_deref(true).unwrap()
3027     }
3028
3029     fn lookup_indexing(
3030         &self,
3031         expr: &hir::Expr,
3032         base_expr: &'tcx hir::Expr,
3033         base_ty: Ty<'tcx>,
3034         idx_ty: Ty<'tcx>,
3035         needs: Needs,
3036     ) -> Option<(/*index type*/ Ty<'tcx>, /*element type*/ Ty<'tcx>)> {
3037         // FIXME(#18741) -- this is almost but not quite the same as the
3038         // autoderef that normal method probing does. They could likely be
3039         // consolidated.
3040
3041         let mut autoderef = self.autoderef(base_expr.span, base_ty);
3042         let mut result = None;
3043         while result.is_none() && autoderef.next().is_some() {
3044             result = self.try_index_step(expr, base_expr, &autoderef, needs, idx_ty);
3045         }
3046         autoderef.finalize(self);
3047         result
3048     }
3049
3050     /// To type-check `base_expr[index_expr]`, we progressively autoderef
3051     /// (and otherwise adjust) `base_expr`, looking for a type which either
3052     /// supports builtin indexing or overloaded indexing.
3053     /// This loop implements one step in that search; the autoderef loop
3054     /// is implemented by `lookup_indexing`.
3055     fn try_index_step(
3056         &self,
3057         expr: &hir::Expr,
3058         base_expr: &hir::Expr,
3059         autoderef: &Autoderef<'a, 'tcx>,
3060         needs: Needs,
3061         index_ty: Ty<'tcx>,
3062     ) -> Option<(/*index type*/ Ty<'tcx>, /*element type*/ Ty<'tcx>)> {
3063         let adjusted_ty = autoderef.unambiguous_final_ty(self);
3064         debug!("try_index_step(expr={:?}, base_expr={:?}, adjusted_ty={:?}, \
3065                                index_ty={:?})",
3066                expr,
3067                base_expr,
3068                adjusted_ty,
3069                index_ty);
3070
3071         for &unsize in &[false, true] {
3072             let mut self_ty = adjusted_ty;
3073             if unsize {
3074                 // We only unsize arrays here.
3075                 if let ty::Array(element_ty, _) = adjusted_ty.kind {
3076                     self_ty = self.tcx.mk_slice(element_ty);
3077                 } else {
3078                     continue;
3079                 }
3080             }
3081
3082             // If some lookup succeeds, write callee into table and extract index/element
3083             // type from the method signature.
3084             // If some lookup succeeded, install method in table
3085             let input_ty = self.next_ty_var(TypeVariableOrigin {
3086                 kind: TypeVariableOriginKind::AutoDeref,
3087                 span: base_expr.span,
3088             });
3089             let method = self.try_overloaded_place_op(
3090                 expr.span, self_ty, &[input_ty], needs, PlaceOp::Index);
3091
3092             let result = method.map(|ok| {
3093                 debug!("try_index_step: success, using overloaded indexing");
3094                 let method = self.register_infer_ok_obligations(ok);
3095
3096                 let mut adjustments = autoderef.adjust_steps(self, needs);
3097                 if let ty::Ref(region, _, r_mutbl) = method.sig.inputs()[0].kind {
3098                     let mutbl = match r_mutbl {
3099                         hir::MutImmutable => AutoBorrowMutability::Immutable,
3100                         hir::MutMutable => AutoBorrowMutability::Mutable {
3101                             // Indexing can be desugared to a method call,
3102                             // so maybe we could use two-phase here.
3103                             // See the documentation of AllowTwoPhase for why that's
3104                             // not the case today.
3105                             allow_two_phase_borrow: AllowTwoPhase::No,
3106                         }
3107                     };
3108                     adjustments.push(Adjustment {
3109                         kind: Adjust::Borrow(AutoBorrow::Ref(region, mutbl)),
3110                         target: self.tcx.mk_ref(region, ty::TypeAndMut {
3111                             mutbl: r_mutbl,
3112                             ty: adjusted_ty
3113                         })
3114                     });
3115                 }
3116                 if unsize {
3117                     adjustments.push(Adjustment {
3118                         kind: Adjust::Pointer(PointerCast::Unsize),
3119                         target: method.sig.inputs()[0]
3120                     });
3121                 }
3122                 self.apply_adjustments(base_expr, adjustments);
3123
3124                 self.write_method_call(expr.hir_id, method);
3125                 (input_ty, self.make_overloaded_place_return_type(method).ty)
3126             });
3127             if result.is_some() {
3128                 return result;
3129             }
3130         }
3131
3132         None
3133     }
3134
3135     fn resolve_place_op(&self, op: PlaceOp, is_mut: bool) -> (Option<DefId>, ast::Ident) {
3136         let (tr, name) = match (op, is_mut) {
3137             (PlaceOp::Deref, false) => (self.tcx.lang_items().deref_trait(), sym::deref),
3138             (PlaceOp::Deref, true) => (self.tcx.lang_items().deref_mut_trait(), sym::deref_mut),
3139             (PlaceOp::Index, false) => (self.tcx.lang_items().index_trait(), sym::index),
3140             (PlaceOp::Index, true) => (self.tcx.lang_items().index_mut_trait(), sym::index_mut),
3141         };
3142         (tr, ast::Ident::with_dummy_span(name))
3143     }
3144
3145     fn try_overloaded_place_op(&self,
3146                                 span: Span,
3147                                 base_ty: Ty<'tcx>,
3148                                 arg_tys: &[Ty<'tcx>],
3149                                 needs: Needs,
3150                                 op: PlaceOp)
3151                                 -> Option<InferOk<'tcx, MethodCallee<'tcx>>>
3152     {
3153         debug!("try_overloaded_place_op({:?},{:?},{:?},{:?})",
3154                span,
3155                base_ty,
3156                needs,
3157                op);
3158
3159         // Try Mut first, if needed.
3160         let (mut_tr, mut_op) = self.resolve_place_op(op, true);
3161         let method = match (needs, mut_tr) {
3162             (Needs::MutPlace, Some(trait_did)) => {
3163                 self.lookup_method_in_trait(span, mut_op, trait_did, base_ty, Some(arg_tys))
3164             }
3165             _ => None,
3166         };
3167
3168         // Otherwise, fall back to the immutable version.
3169         let (imm_tr, imm_op) = self.resolve_place_op(op, false);
3170         let method = match (method, imm_tr) {
3171             (None, Some(trait_did)) => {
3172                 self.lookup_method_in_trait(span, imm_op, trait_did, base_ty, Some(arg_tys))
3173             }
3174             (method, _) => method,
3175         };
3176
3177         method
3178     }
3179
3180     fn check_method_argument_types(
3181         &self,
3182         sp: Span,
3183         expr: &'tcx hir::Expr,
3184         method: Result<MethodCallee<'tcx>, ()>,
3185         args_no_rcvr: &'tcx [hir::Expr],
3186         tuple_arguments: TupleArgumentsFlag,
3187         expected: Expectation<'tcx>,
3188     ) -> Ty<'tcx> {
3189
3190         let has_error = match method {
3191             Ok(method) => {
3192                 method.substs.references_error() || method.sig.references_error()
3193             }
3194             Err(_) => true
3195         };
3196         if has_error {
3197             let err_inputs = self.err_args(args_no_rcvr.len());
3198
3199             let err_inputs = match tuple_arguments {
3200                 DontTupleArguments => err_inputs,
3201                 TupleArguments => vec![self.tcx.intern_tup(&err_inputs[..])],
3202             };
3203
3204             self.check_argument_types(
3205                 sp,
3206                 expr,
3207                 &err_inputs[..],
3208                 &[],
3209                 args_no_rcvr,
3210                 false,
3211                 tuple_arguments,
3212                 None,
3213             );
3214             return self.tcx.types.err;
3215         }
3216
3217         let method = method.unwrap();
3218         // HACK(eddyb) ignore self in the definition (see above).
3219         let expected_arg_tys = self.expected_inputs_for_expected_output(
3220             sp,
3221             expected,
3222             method.sig.output(),
3223             &method.sig.inputs()[1..]
3224         );
3225         self.check_argument_types(
3226             sp,
3227             expr,
3228             &method.sig.inputs()[1..],
3229             &expected_arg_tys[..],
3230             args_no_rcvr,
3231             method.sig.c_variadic,
3232             tuple_arguments,
3233             self.tcx.hir().span_if_local(method.def_id),
3234         );
3235         method.sig.output()
3236     }
3237
3238     fn self_type_matches_expected_vid(
3239         &self,
3240         trait_ref: ty::PolyTraitRef<'tcx>,
3241         expected_vid: ty::TyVid,
3242     ) -> bool {
3243         let self_ty = self.shallow_resolve(trait_ref.self_ty());
3244         debug!(
3245             "self_type_matches_expected_vid(trait_ref={:?}, self_ty={:?}, expected_vid={:?})",
3246             trait_ref, self_ty, expected_vid
3247         );
3248         match self_ty.kind {
3249             ty::Infer(ty::TyVar(found_vid)) => {
3250                 // FIXME: consider using `sub_root_var` here so we
3251                 // can see through subtyping.
3252                 let found_vid = self.root_var(found_vid);
3253                 debug!("self_type_matches_expected_vid - found_vid={:?}", found_vid);
3254                 expected_vid == found_vid
3255             }
3256             _ => false
3257         }
3258     }
3259
3260     fn obligations_for_self_ty<'b>(
3261         &'b self,
3262         self_ty: ty::TyVid,
3263     ) -> impl Iterator<Item = (ty::PolyTraitRef<'tcx>, traits::PredicateObligation<'tcx>)>
3264                  + Captures<'tcx>
3265                  + 'b {
3266         // FIXME: consider using `sub_root_var` here so we
3267         // can see through subtyping.
3268         let ty_var_root = self.root_var(self_ty);
3269         debug!("obligations_for_self_ty: self_ty={:?} ty_var_root={:?} pending_obligations={:?}",
3270                self_ty, ty_var_root,
3271                self.fulfillment_cx.borrow().pending_obligations());
3272
3273         self.fulfillment_cx
3274             .borrow()
3275             .pending_obligations()
3276             .into_iter()
3277             .filter_map(move |obligation| match obligation.predicate {
3278                 ty::Predicate::Projection(ref data) =>
3279                     Some((data.to_poly_trait_ref(self.tcx), obligation)),
3280                 ty::Predicate::Trait(ref data) =>
3281                     Some((data.to_poly_trait_ref(), obligation)),
3282                 ty::Predicate::Subtype(..) => None,
3283                 ty::Predicate::RegionOutlives(..) => None,
3284                 ty::Predicate::TypeOutlives(..) => None,
3285                 ty::Predicate::WellFormed(..) => None,
3286                 ty::Predicate::ObjectSafe(..) => None,
3287                 ty::Predicate::ConstEvaluatable(..) => None,
3288                 // N.B., this predicate is created by breaking down a
3289                 // `ClosureType: FnFoo()` predicate, where
3290                 // `ClosureType` represents some `Closure`. It can't
3291                 // possibly be referring to the current closure,
3292                 // because we haven't produced the `Closure` for
3293                 // this closure yet; this is exactly why the other
3294                 // code is looking for a self type of a unresolved
3295                 // inference variable.
3296                 ty::Predicate::ClosureKind(..) => None,
3297             }).filter(move |(tr, _)| self.self_type_matches_expected_vid(*tr, ty_var_root))
3298     }
3299
3300     fn type_var_is_sized(&self, self_ty: ty::TyVid) -> bool {
3301         self.obligations_for_self_ty(self_ty).any(|(tr, _)| {
3302             Some(tr.def_id()) == self.tcx.lang_items().sized_trait()
3303         })
3304     }
3305
3306     /// Generic function that factors out common logic from function calls,
3307     /// method calls and overloaded operators.
3308     fn check_argument_types(
3309         &self,
3310         sp: Span,
3311         expr: &'tcx hir::Expr,
3312         fn_inputs: &[Ty<'tcx>],
3313         expected_arg_tys: &[Ty<'tcx>],
3314         args: &'tcx [hir::Expr],
3315         c_variadic: bool,
3316         tuple_arguments: TupleArgumentsFlag,
3317         def_span: Option<Span>,
3318     ) {
3319         let tcx = self.tcx;
3320         // Grab the argument types, supplying fresh type variables
3321         // if the wrong number of arguments were supplied
3322         let supplied_arg_count = if tuple_arguments == DontTupleArguments {
3323             args.len()
3324         } else {
3325             1
3326         };
3327
3328         // All the input types from the fn signature must outlive the call
3329         // so as to validate implied bounds.
3330         for (fn_input_ty, arg_expr) in fn_inputs.iter().zip(args.iter()) {
3331             self.register_wf_obligation(fn_input_ty, arg_expr.span, traits::MiscObligation);
3332         }
3333
3334         let expected_arg_count = fn_inputs.len();
3335
3336         let param_count_error = |expected_count: usize,
3337                                  arg_count: usize,
3338                                  error_code: &str,
3339                                  c_variadic: bool,
3340                                  sugg_unit: bool| {
3341             let mut err = tcx.sess.struct_span_err_with_code(sp,
3342                 &format!("this function takes {}{} but {} {} supplied",
3343                     if c_variadic { "at least " } else { "" },
3344                     potentially_plural_count(expected_count, "parameter"),
3345                     potentially_plural_count(arg_count, "parameter"),
3346                     if arg_count == 1 {"was"} else {"were"}),
3347                 DiagnosticId::Error(error_code.to_owned()));
3348
3349             if let Some(def_s) = def_span.map(|sp| tcx.sess.source_map().def_span(sp)) {
3350                 err.span_label(def_s, "defined here");
3351             }
3352             if sugg_unit {
3353                 let sugg_span = tcx.sess.source_map().end_point(expr.span);
3354                 // remove closing `)` from the span
3355                 let sugg_span = sugg_span.shrink_to_lo();
3356                 err.span_suggestion(
3357                     sugg_span,
3358                     "expected the unit value `()`; create it with empty parentheses",
3359                     String::from("()"),
3360                     Applicability::MachineApplicable);
3361             } else {
3362                 err.span_label(sp, format!("expected {}{}",
3363                                            if c_variadic { "at least " } else { "" },
3364                                            potentially_plural_count(expected_count, "parameter")));
3365             }
3366             err.emit();
3367         };
3368
3369         let mut expected_arg_tys = expected_arg_tys.to_vec();
3370
3371         let formal_tys = if tuple_arguments == TupleArguments {
3372             let tuple_type = self.structurally_resolved_type(sp, fn_inputs[0]);
3373             match tuple_type.kind {
3374                 ty::Tuple(arg_types) if arg_types.len() != args.len() => {
3375                     param_count_error(arg_types.len(), args.len(), "E0057", false, false);
3376                     expected_arg_tys = vec![];
3377                     self.err_args(args.len())
3378                 }
3379                 ty::Tuple(arg_types) => {
3380                     expected_arg_tys = match expected_arg_tys.get(0) {
3381                         Some(&ty) => match ty.kind {
3382                             ty::Tuple(ref tys) => tys.iter().map(|k| k.expect_ty()).collect(),
3383                             _ => vec![],
3384                         },
3385                         None => vec![],
3386                     };
3387                     arg_types.iter().map(|k| k.expect_ty()).collect()
3388                 }
3389                 _ => {
3390                     span_err!(tcx.sess, sp, E0059,
3391                         "cannot use call notation; the first type parameter \
3392                          for the function trait is neither a tuple nor unit");
3393                     expected_arg_tys = vec![];
3394                     self.err_args(args.len())
3395                 }
3396             }
3397         } else if expected_arg_count == supplied_arg_count {
3398             fn_inputs.to_vec()
3399         } else if c_variadic {
3400             if supplied_arg_count >= expected_arg_count {
3401                 fn_inputs.to_vec()
3402             } else {
3403                 param_count_error(expected_arg_count, supplied_arg_count, "E0060", true, false);
3404                 expected_arg_tys = vec![];
3405                 self.err_args(supplied_arg_count)
3406             }
3407         } else {
3408             // is the missing argument of type `()`?
3409             let sugg_unit = if expected_arg_tys.len() == 1 && supplied_arg_count == 0 {
3410                 self.resolve_vars_if_possible(&expected_arg_tys[0]).is_unit()
3411             } else if fn_inputs.len() == 1 && supplied_arg_count == 0 {
3412                 self.resolve_vars_if_possible(&fn_inputs[0]).is_unit()
3413             } else {
3414                 false
3415             };
3416             param_count_error(expected_arg_count, supplied_arg_count, "E0061", false, sugg_unit);
3417
3418             expected_arg_tys = vec![];
3419             self.err_args(supplied_arg_count)
3420         };
3421
3422         debug!("check_argument_types: formal_tys={:?}",
3423                formal_tys.iter().map(|t| self.ty_to_string(*t)).collect::<Vec<String>>());
3424
3425         // If there is no expectation, expect formal_tys.
3426         let expected_arg_tys = if !expected_arg_tys.is_empty() {
3427             expected_arg_tys
3428         } else {
3429             formal_tys.clone()
3430         };
3431
3432         let mut final_arg_types: Vec<(usize, Ty<'_>)> = vec![];
3433
3434         // Check the arguments.
3435         // We do this in a pretty awful way: first we type-check any arguments
3436         // that are not closures, then we type-check the closures. This is so
3437         // that we have more information about the types of arguments when we
3438         // type-check the functions. This isn't really the right way to do this.
3439         for &check_closures in &[false, true] {
3440             debug!("check_closures={}", check_closures);
3441
3442             // More awful hacks: before we check argument types, try to do
3443             // an "opportunistic" vtable resolution of any trait bounds on
3444             // the call. This helps coercions.
3445             if check_closures {
3446                 self.select_obligations_where_possible(false, |errors| {
3447                     self.point_at_type_arg_instead_of_call_if_possible(errors, expr);
3448                     self.point_at_arg_instead_of_call_if_possible(
3449                         errors,
3450                         &final_arg_types[..],
3451                         sp,
3452                         &args,
3453                     );
3454                 })
3455             }
3456
3457             // For C-variadic functions, we don't have a declared type for all of
3458             // the arguments hence we only do our usual type checking with
3459             // the arguments who's types we do know.
3460             let t = if c_variadic {
3461                 expected_arg_count
3462             } else if tuple_arguments == TupleArguments {
3463                 args.len()
3464             } else {
3465                 supplied_arg_count
3466             };
3467             for (i, arg) in args.iter().take(t).enumerate() {
3468                 // Warn only for the first loop (the "no closures" one).
3469                 // Closure arguments themselves can't be diverging, but
3470                 // a previous argument can, e.g., `foo(panic!(), || {})`.
3471                 if !check_closures {
3472                     self.warn_if_unreachable(arg.hir_id, arg.span, "expression");
3473                 }
3474
3475                 let is_closure = match arg.kind {
3476                     ExprKind::Closure(..) => true,
3477                     _ => false
3478                 };
3479
3480                 if is_closure != check_closures {
3481                     continue;
3482                 }
3483
3484                 debug!("checking the argument");
3485                 let formal_ty = formal_tys[i];
3486
3487                 // The special-cased logic below has three functions:
3488                 // 1. Provide as good of an expected type as possible.
3489                 let expected = Expectation::rvalue_hint(self, expected_arg_tys[i]);
3490
3491                 let checked_ty = self.check_expr_with_expectation(&arg, expected);
3492
3493                 // 2. Coerce to the most detailed type that could be coerced
3494                 //    to, which is `expected_ty` if `rvalue_hint` returns an
3495                 //    `ExpectHasType(expected_ty)`, or the `formal_ty` otherwise.
3496                 let coerce_ty = expected.only_has_type(self).unwrap_or(formal_ty);
3497                 // We're processing function arguments so we definitely want to use
3498                 // two-phase borrows.
3499                 self.demand_coerce(&arg, checked_ty, coerce_ty, AllowTwoPhase::Yes);
3500                 final_arg_types.push((i, coerce_ty));
3501
3502                 // 3. Relate the expected type and the formal one,
3503                 //    if the expected type was used for the coercion.
3504                 self.demand_suptype(arg.span, formal_ty, coerce_ty);
3505             }
3506         }
3507
3508         // We also need to make sure we at least write the ty of the other
3509         // arguments which we skipped above.
3510         if c_variadic {
3511             fn variadic_error<'tcx>(s: &Session, span: Span, t: Ty<'tcx>, cast_ty: &str) {
3512                 use crate::structured_errors::{VariadicError, StructuredDiagnostic};
3513                 VariadicError::new(s, span, t, cast_ty).diagnostic().emit();
3514             }
3515
3516             for arg in args.iter().skip(expected_arg_count) {
3517                 let arg_ty = self.check_expr(&arg);
3518
3519                 // There are a few types which get autopromoted when passed via varargs
3520                 // in C but we just error out instead and require explicit casts.
3521                 let arg_ty = self.structurally_resolved_type(arg.span, arg_ty);
3522                 match arg_ty.kind {
3523                     ty::Float(ast::FloatTy::F32) => {
3524                         variadic_error(tcx.sess, arg.span, arg_ty, "c_double");
3525                     }
3526                     ty::Int(ast::IntTy::I8) | ty::Int(ast::IntTy::I16) | ty::Bool => {
3527                         variadic_error(tcx.sess, arg.span, arg_ty, "c_int");
3528                     }
3529                     ty::Uint(ast::UintTy::U8) | ty::Uint(ast::UintTy::U16) => {
3530                         variadic_error(tcx.sess, arg.span, arg_ty, "c_uint");
3531                     }
3532                     ty::FnDef(..) => {
3533                         let ptr_ty = self.tcx.mk_fn_ptr(arg_ty.fn_sig(self.tcx));
3534                         let ptr_ty = self.resolve_vars_if_possible(&ptr_ty);
3535                         variadic_error(tcx.sess, arg.span, arg_ty, &ptr_ty.to_string());
3536                     }
3537                     _ => {}
3538                 }
3539             }
3540         }
3541     }
3542
3543     fn err_args(&self, len: usize) -> Vec<Ty<'tcx>> {
3544         vec![self.tcx.types.err; len]
3545     }
3546
3547     /// Given a vec of evaluated `FullfillmentError`s and an `fn` call argument expressions, we
3548     /// walk the resolved types for each argument to see if any of the `FullfillmentError`s
3549     /// reference a type argument. If they do, and there's only *one* argument that does, we point
3550     /// at the corresponding argument's expression span instead of the `fn` call path span.
3551     fn point_at_arg_instead_of_call_if_possible(
3552         &self,
3553         errors: &mut Vec<traits::FulfillmentError<'_>>,
3554         final_arg_types: &[(usize, Ty<'tcx>)],
3555         call_sp: Span,
3556         args: &'tcx [hir::Expr],
3557     ) {
3558         if !call_sp.desugaring_kind().is_some() {
3559             // We *do not* do this for desugared call spans to keep good diagnostics when involving
3560             // the `?` operator.
3561             for error in errors {
3562                 if let ty::Predicate::Trait(predicate) = error.obligation.predicate {
3563                     // Collect the argument position for all arguments that could have caused this
3564                     // `FullfillmentError`.
3565                     let mut referenced_in = final_arg_types.iter()
3566                         .flat_map(|(i, ty)| {
3567                             let ty = self.resolve_vars_if_possible(ty);
3568                             // We walk the argument type because the argument's type could have
3569                             // been `Option<T>`, but the `FullfillmentError` references `T`.
3570                             ty.walk()
3571                                 .filter(|&ty| ty == predicate.skip_binder().self_ty())
3572                                 .map(move |_| *i)
3573                         });
3574                     if let (Some(ref_in), None) = (referenced_in.next(), referenced_in.next()) {
3575                         // We make sure that only *one* argument matches the obligation failure
3576                         // and thet the obligation's span to its expression's.
3577                         error.obligation.cause.span = args[ref_in].span;
3578                         error.points_at_arg_span = true;
3579                     }
3580                 }
3581             }
3582         }
3583     }
3584
3585     /// Given a vec of evaluated `FullfillmentError`s and an `fn` call expression, we walk the
3586     /// `PathSegment`s and resolve their type parameters to see if any of the `FullfillmentError`s
3587     /// were caused by them. If they were, we point at the corresponding type argument's span
3588     /// instead of the `fn` call path span.
3589     fn point_at_type_arg_instead_of_call_if_possible(
3590         &self,
3591         errors: &mut Vec<traits::FulfillmentError<'_>>,
3592         call_expr: &'tcx hir::Expr,
3593     ) {
3594         if let hir::ExprKind::Call(path, _) = &call_expr.kind {
3595             if let hir::ExprKind::Path(qpath) = &path.kind {
3596                 if let hir::QPath::Resolved(_, path) = &qpath {
3597                     for error in errors {
3598                         if let ty::Predicate::Trait(predicate) = error.obligation.predicate {
3599                             // If any of the type arguments in this path segment caused the
3600                             // `FullfillmentError`, point at its span (#61860).
3601                             for arg in path.segments.iter()
3602                                 .filter_map(|seg| seg.args.as_ref())
3603                                 .flat_map(|a| a.args.iter())
3604                             {
3605                                 if let hir::GenericArg::Type(hir_ty) = &arg {
3606                                     if let hir::TyKind::Path(
3607                                         hir::QPath::TypeRelative(..),
3608                                     ) = &hir_ty.kind {
3609                                         // Avoid ICE with associated types. As this is best
3610                                         // effort only, it's ok to ignore the case. It
3611                                         // would trigger in `is_send::<T::AssocType>();`
3612                                         // from `typeck-default-trait-impl-assoc-type.rs`.
3613                                     } else {
3614                                         let ty = AstConv::ast_ty_to_ty(self, hir_ty);
3615                                         let ty = self.resolve_vars_if_possible(&ty);
3616                                         if ty == predicate.skip_binder().self_ty() {
3617                                             error.obligation.cause.span = hir_ty.span;
3618                                         }
3619                                     }
3620                                 }
3621                             }
3622                         }
3623                     }
3624                 }
3625             }
3626         }
3627     }
3628
3629     // AST fragment checking
3630     fn check_lit(&self,
3631                  lit: &hir::Lit,
3632                  expected: Expectation<'tcx>)
3633                  -> Ty<'tcx>
3634     {
3635         let tcx = self.tcx;
3636
3637         match lit.node {
3638             ast::LitKind::Str(..) => tcx.mk_static_str(),
3639             ast::LitKind::ByteStr(ref v) => {
3640                 tcx.mk_imm_ref(tcx.lifetimes.re_static,
3641                                tcx.mk_array(tcx.types.u8, v.len() as u64))
3642             }
3643             ast::LitKind::Byte(_) => tcx.types.u8,
3644             ast::LitKind::Char(_) => tcx.types.char,
3645             ast::LitKind::Int(_, ast::LitIntType::Signed(t)) => tcx.mk_mach_int(t),
3646             ast::LitKind::Int(_, ast::LitIntType::Unsigned(t)) => tcx.mk_mach_uint(t),
3647             ast::LitKind::Int(_, ast::LitIntType::Unsuffixed) => {
3648                 let opt_ty = expected.to_option(self).and_then(|ty| {
3649                     match ty.kind {
3650                         ty::Int(_) | ty::Uint(_) => Some(ty),
3651                         ty::Char => Some(tcx.types.u8),
3652                         ty::RawPtr(..) => Some(tcx.types.usize),
3653                         ty::FnDef(..) | ty::FnPtr(_) => Some(tcx.types.usize),
3654                         _ => None
3655                     }
3656                 });
3657                 opt_ty.unwrap_or_else(|| self.next_int_var())
3658             }
3659             ast::LitKind::Float(_, t) => tcx.mk_mach_float(t),
3660             ast::LitKind::FloatUnsuffixed(_) => {
3661                 let opt_ty = expected.to_option(self).and_then(|ty| {
3662                     match ty.kind {
3663                         ty::Float(_) => Some(ty),
3664                         _ => None
3665                     }
3666                 });
3667                 opt_ty.unwrap_or_else(|| self.next_float_var())
3668             }
3669             ast::LitKind::Bool(_) => tcx.types.bool,
3670             ast::LitKind::Err(_) => tcx.types.err,
3671         }
3672     }
3673
3674     // Determine the `Self` type, using fresh variables for all variables
3675     // declared on the impl declaration e.g., `impl<A,B> for Vec<(A,B)>`
3676     // would return `($0, $1)` where `$0` and `$1` are freshly instantiated type
3677     // variables.
3678     pub fn impl_self_ty(&self,
3679                         span: Span, // (potential) receiver for this impl
3680                         did: DefId)
3681                         -> TypeAndSubsts<'tcx> {
3682         let ity = self.tcx.type_of(did);
3683         debug!("impl_self_ty: ity={:?}", ity);
3684
3685         let substs = self.fresh_substs_for_item(span, did);
3686         let substd_ty = self.instantiate_type_scheme(span, &substs, &ity);
3687
3688         TypeAndSubsts { substs: substs, ty: substd_ty }
3689     }
3690
3691     /// Unifies the output type with the expected type early, for more coercions
3692     /// and forward type information on the input expressions.
3693     fn expected_inputs_for_expected_output(&self,
3694                                            call_span: Span,
3695                                            expected_ret: Expectation<'tcx>,
3696                                            formal_ret: Ty<'tcx>,
3697                                            formal_args: &[Ty<'tcx>])
3698                                            -> Vec<Ty<'tcx>> {
3699         let formal_ret = self.resolve_vars_with_obligations(formal_ret);
3700         let ret_ty = match expected_ret.only_has_type(self) {
3701             Some(ret) => ret,
3702             None => return Vec::new()
3703         };
3704         let expect_args = self.fudge_inference_if_ok(|| {
3705             // Attempt to apply a subtyping relationship between the formal
3706             // return type (likely containing type variables if the function
3707             // is polymorphic) and the expected return type.
3708             // No argument expectations are produced if unification fails.
3709             let origin = self.misc(call_span);
3710             let ures = self.at(&origin, self.param_env).sup(ret_ty, &formal_ret);
3711
3712             // FIXME(#27336) can't use ? here, Try::from_error doesn't default
3713             // to identity so the resulting type is not constrained.
3714             match ures {
3715                 Ok(ok) => {
3716                     // Process any obligations locally as much as
3717                     // we can.  We don't care if some things turn
3718                     // out unconstrained or ambiguous, as we're
3719                     // just trying to get hints here.
3720                     self.save_and_restore_in_snapshot_flag(|_| {
3721                         let mut fulfill = TraitEngine::new(self.tcx);
3722                         for obligation in ok.obligations {
3723                             fulfill.register_predicate_obligation(self, obligation);
3724                         }
3725                         fulfill.select_where_possible(self)
3726                     }).map_err(|_| ())?;
3727                 }
3728                 Err(_) => return Err(()),
3729             }
3730
3731             // Record all the argument types, with the substitutions
3732             // produced from the above subtyping unification.
3733             Ok(formal_args.iter().map(|ty| {
3734                 self.resolve_vars_if_possible(ty)
3735             }).collect())
3736         }).unwrap_or_default();
3737         debug!("expected_inputs_for_expected_output(formal={:?} -> {:?}, expected={:?} -> {:?})",
3738                formal_args, formal_ret,
3739                expect_args, expected_ret);
3740         expect_args
3741     }
3742
3743     pub fn check_struct_path(&self,
3744                              qpath: &QPath,
3745                              hir_id: hir::HirId)
3746                              -> Option<(&'tcx ty::VariantDef,  Ty<'tcx>)> {
3747         let path_span = match *qpath {
3748             QPath::Resolved(_, ref path) => path.span,
3749             QPath::TypeRelative(ref qself, _) => qself.span
3750         };
3751         let (def, ty) = self.finish_resolving_struct_path(qpath, path_span, hir_id);
3752         let variant = match def {
3753             Res::Err => {
3754                 self.set_tainted_by_errors();
3755                 return None;
3756             }
3757             Res::Def(DefKind::Variant, _) => {
3758                 match ty.kind {
3759                     ty::Adt(adt, substs) => {
3760                         Some((adt.variant_of_res(def), adt.did, substs))
3761                     }
3762                     _ => bug!("unexpected type: {:?}", ty)
3763                 }
3764             }
3765             Res::Def(DefKind::Struct, _)
3766             | Res::Def(DefKind::Union, _)
3767             | Res::Def(DefKind::TyAlias, _)
3768             | Res::Def(DefKind::AssocTy, _)
3769             | Res::SelfTy(..) => {
3770                 match ty.kind {
3771                     ty::Adt(adt, substs) if !adt.is_enum() => {
3772                         Some((adt.non_enum_variant(), adt.did, substs))
3773                     }
3774                     _ => None,
3775                 }
3776             }
3777             _ => bug!("unexpected definition: {:?}", def)
3778         };
3779
3780         if let Some((variant, did, substs)) = variant {
3781             debug!("check_struct_path: did={:?} substs={:?}", did, substs);
3782             self.write_user_type_annotation_from_substs(hir_id, did, substs, None);
3783
3784             // Check bounds on type arguments used in the path.
3785             let (bounds, _) = self.instantiate_bounds(path_span, did, substs);
3786             let cause = traits::ObligationCause::new(
3787                 path_span,
3788                 self.body_id,
3789                 traits::ItemObligation(did),
3790             );
3791             self.add_obligations_for_parameters(cause, &bounds);
3792
3793             Some((variant, ty))
3794         } else {
3795             struct_span_err!(self.tcx.sess, path_span, E0071,
3796                              "expected struct, variant or union type, found {}",
3797                              ty.sort_string(self.tcx))
3798                 .span_label(path_span, "not a struct")
3799                 .emit();
3800             None
3801         }
3802     }
3803
3804     // Finish resolving a path in a struct expression or pattern `S::A { .. }` if necessary.
3805     // The newly resolved definition is written into `type_dependent_defs`.
3806     fn finish_resolving_struct_path(&self,
3807                                     qpath: &QPath,
3808                                     path_span: Span,
3809                                     hir_id: hir::HirId)
3810                                     -> (Res, Ty<'tcx>)
3811     {
3812         match *qpath {
3813             QPath::Resolved(ref maybe_qself, ref path) => {
3814                 let self_ty = maybe_qself.as_ref().map(|qself| self.to_ty(qself));
3815                 let ty = AstConv::res_to_ty(self, self_ty, path, true);
3816                 (path.res, ty)
3817             }
3818             QPath::TypeRelative(ref qself, ref segment) => {
3819                 let ty = self.to_ty(qself);
3820
3821                 let res = if let hir::TyKind::Path(QPath::Resolved(_, ref path)) = qself.kind {
3822                     path.res
3823                 } else {
3824                     Res::Err
3825                 };
3826                 let result = AstConv::associated_path_to_ty(
3827                     self,
3828                     hir_id,
3829                     path_span,
3830                     ty,
3831                     res,
3832                     segment,
3833                     true,
3834                 );
3835                 let ty = result.map(|(ty, _, _)| ty).unwrap_or(self.tcx().types.err);
3836                 let result = result.map(|(_, kind, def_id)| (kind, def_id));
3837
3838                 // Write back the new resolution.
3839                 self.write_resolution(hir_id, result);
3840
3841                 (result.map(|(kind, def_id)| Res::Def(kind, def_id)).unwrap_or(Res::Err), ty)
3842             }
3843         }
3844     }
3845
3846     /// Resolves an associated value path into a base type and associated constant, or method
3847     /// resolution. The newly resolved definition is written into `type_dependent_defs`.
3848     pub fn resolve_ty_and_res_ufcs<'b>(&self,
3849                                        qpath: &'b QPath,
3850                                        hir_id: hir::HirId,
3851                                        span: Span)
3852                                        -> (Res, Option<Ty<'tcx>>, &'b [hir::PathSegment])
3853     {
3854         debug!("resolve_ty_and_res_ufcs: qpath={:?} hir_id={:?} span={:?}", qpath, hir_id, span);
3855         let (ty, qself, item_segment) = match *qpath {
3856             QPath::Resolved(ref opt_qself, ref path) => {
3857                 return (path.res,
3858                         opt_qself.as_ref().map(|qself| self.to_ty(qself)),
3859                         &path.segments[..]);
3860             }
3861             QPath::TypeRelative(ref qself, ref segment) => {
3862                 (self.to_ty(qself), qself, segment)
3863             }
3864         };
3865         if let Some(&cached_result) = self.tables.borrow().type_dependent_defs().get(hir_id) {
3866             // Return directly on cache hit. This is useful to avoid doubly reporting
3867             // errors with default match binding modes. See #44614.
3868             let def = cached_result.map(|(kind, def_id)| Res::Def(kind, def_id))
3869                 .unwrap_or(Res::Err);
3870             return (def, Some(ty), slice::from_ref(&**item_segment));
3871         }
3872         let item_name = item_segment.ident;
3873         let result = self.resolve_ufcs(span, item_name, ty, hir_id).or_else(|error| {
3874             let result = match error {
3875                 method::MethodError::PrivateMatch(kind, def_id, _) => Ok((kind, def_id)),
3876                 _ => Err(ErrorReported),
3877             };
3878             if item_name.name != kw::Invalid {
3879                 self.report_method_error(
3880                     span,
3881                     ty,
3882                     item_name,
3883                     SelfSource::QPath(qself),
3884                     error,
3885                     None,
3886                 ).map(|mut e| e.emit());
3887             }
3888             result
3889         });
3890
3891         // Write back the new resolution.
3892         self.write_resolution(hir_id, result);
3893         (
3894             result.map(|(kind, def_id)| Res::Def(kind, def_id)).unwrap_or(Res::Err),
3895             Some(ty),
3896             slice::from_ref(&**item_segment),
3897         )
3898     }
3899
3900     pub fn check_decl_initializer(
3901         &self,
3902         local: &'tcx hir::Local,
3903         init: &'tcx hir::Expr,
3904     ) -> Ty<'tcx> {
3905         // FIXME(tschottdorf): `contains_explicit_ref_binding()` must be removed
3906         // for #42640 (default match binding modes).
3907         //
3908         // See #44848.
3909         let ref_bindings = local.pat.contains_explicit_ref_binding();
3910
3911         let local_ty = self.local_ty(init.span, local.hir_id).revealed_ty;
3912         if let Some(m) = ref_bindings {
3913             // Somewhat subtle: if we have a `ref` binding in the pattern,
3914             // we want to avoid introducing coercions for the RHS. This is
3915             // both because it helps preserve sanity and, in the case of
3916             // ref mut, for soundness (issue #23116). In particular, in
3917             // the latter case, we need to be clear that the type of the
3918             // referent for the reference that results is *equal to* the
3919             // type of the place it is referencing, and not some
3920             // supertype thereof.
3921             let init_ty = self.check_expr_with_needs(init, Needs::maybe_mut_place(m));
3922             self.demand_eqtype(init.span, local_ty, init_ty);
3923             init_ty
3924         } else {
3925             self.check_expr_coercable_to_type(init, local_ty)
3926         }
3927     }
3928
3929     pub fn check_decl_local(&self, local: &'tcx hir::Local) {
3930         let t = self.local_ty(local.span, local.hir_id).decl_ty;
3931         self.write_ty(local.hir_id, t);
3932
3933         if let Some(ref init) = local.init {
3934             let init_ty = self.check_decl_initializer(local, &init);
3935             self.overwrite_local_ty_if_err(local, t, init_ty);
3936         }
3937
3938         self.check_pat_top(&local.pat, t, None);
3939         let pat_ty = self.node_ty(local.pat.hir_id);
3940         self.overwrite_local_ty_if_err(local, t, pat_ty);
3941     }
3942
3943     fn overwrite_local_ty_if_err(&self, local: &'tcx hir::Local, decl_ty: Ty<'tcx>, ty: Ty<'tcx>) {
3944         if ty.references_error() {
3945             // Override the types everywhere with `types.err` to avoid knock down errors.
3946             self.write_ty(local.hir_id, ty);
3947             self.write_ty(local.pat.hir_id, ty);
3948             let local_ty = LocalTy {
3949                 decl_ty,
3950                 revealed_ty: ty,
3951             };
3952             self.locals.borrow_mut().insert(local.hir_id, local_ty);
3953             self.locals.borrow_mut().insert(local.pat.hir_id, local_ty);
3954         }
3955     }
3956
3957     fn suggest_semicolon_at_end(&self, span: Span, err: &mut DiagnosticBuilder<'_>) {
3958         err.span_suggestion_short(
3959             span.shrink_to_hi(),
3960             "consider using a semicolon here",
3961             ";".to_string(),
3962             Applicability::MachineApplicable,
3963         );
3964     }
3965
3966     pub fn check_stmt(&self, stmt: &'tcx hir::Stmt) {
3967         // Don't do all the complex logic below for `DeclItem`.
3968         match stmt.kind {
3969             hir::StmtKind::Item(..) => return,
3970             hir::StmtKind::Local(..) | hir::StmtKind::Expr(..) | hir::StmtKind::Semi(..) => {}
3971         }
3972
3973         self.warn_if_unreachable(stmt.hir_id, stmt.span, "statement");
3974
3975         // Hide the outer diverging and `has_errors` flags.
3976         let old_diverges = self.diverges.get();
3977         let old_has_errors = self.has_errors.get();
3978         self.diverges.set(Diverges::Maybe);
3979         self.has_errors.set(false);
3980
3981         match stmt.kind {
3982             hir::StmtKind::Local(ref l) => {
3983                 self.check_decl_local(&l);
3984             }
3985             // Ignore for now.
3986             hir::StmtKind::Item(_) => {}
3987             hir::StmtKind::Expr(ref expr) => {
3988                 // Check with expected type of `()`.
3989
3990                 self.check_expr_has_type_or_error(&expr, self.tcx.mk_unit(), |err| {
3991                     self.suggest_semicolon_at_end(expr.span, err);
3992                 });
3993             }
3994             hir::StmtKind::Semi(ref expr) => {
3995                 self.check_expr(&expr);
3996             }
3997         }
3998
3999         // Combine the diverging and `has_error` flags.
4000         self.diverges.set(self.diverges.get() | old_diverges);
4001         self.has_errors.set(self.has_errors.get() | old_has_errors);
4002     }
4003
4004     pub fn check_block_no_value(&self, blk: &'tcx hir::Block) {
4005         let unit = self.tcx.mk_unit();
4006         let ty = self.check_block_with_expected(blk, ExpectHasType(unit));
4007
4008         // if the block produces a `!` value, that can always be
4009         // (effectively) coerced to unit.
4010         if !ty.is_never() {
4011             self.demand_suptype(blk.span, unit, ty);
4012         }
4013     }
4014
4015     /// If `expr` is a `match` expression that has only one non-`!` arm, use that arm's tail
4016     /// expression's `Span`, otherwise return `expr.span`. This is done to give better errors
4017     /// when given code like the following:
4018     /// ```text
4019     /// if false { return 0i32; } else { 1u32 }
4020     /// //                               ^^^^ point at this instead of the whole `if` expression
4021     /// ```
4022     fn get_expr_coercion_span(&self, expr: &hir::Expr) -> syntax_pos::Span {
4023         if let hir::ExprKind::Match(_, arms, _) = &expr.kind {
4024             let arm_spans: Vec<Span> = arms.iter().filter_map(|arm| {
4025                 self.in_progress_tables
4026                     .and_then(|tables| tables.borrow().node_type_opt(arm.body.hir_id))
4027                     .and_then(|arm_ty| {
4028                         if arm_ty.is_never() {
4029                             None
4030                         } else {
4031                             Some(match &arm.body.kind {
4032                                 // Point at the tail expression when possible.
4033                                 hir::ExprKind::Block(block, _) => block.expr
4034                                     .as_ref()
4035                                     .map(|e| e.span)
4036                                     .unwrap_or(block.span),
4037                                 _ => arm.body.span,
4038                             })
4039                         }
4040                     })
4041             }).collect();
4042             if arm_spans.len() == 1 {
4043                 return arm_spans[0];
4044             }
4045         }
4046         expr.span
4047     }
4048
4049     fn check_block_with_expected(
4050         &self,
4051         blk: &'tcx hir::Block,
4052         expected: Expectation<'tcx>,
4053     ) -> Ty<'tcx> {
4054         let prev = {
4055             let mut fcx_ps = self.ps.borrow_mut();
4056             let unsafety_state = fcx_ps.recurse(blk);
4057             replace(&mut *fcx_ps, unsafety_state)
4058         };
4059
4060         // In some cases, blocks have just one exit, but other blocks
4061         // can be targeted by multiple breaks. This can happen both
4062         // with labeled blocks as well as when we desugar
4063         // a `try { ... }` expression.
4064         //
4065         // Example 1:
4066         //
4067         //    'a: { if true { break 'a Err(()); } Ok(()) }
4068         //
4069         // Here we would wind up with two coercions, one from
4070         // `Err(())` and the other from the tail expression
4071         // `Ok(())`. If the tail expression is omitted, that's a
4072         // "forced unit" -- unless the block diverges, in which
4073         // case we can ignore the tail expression (e.g., `'a: {
4074         // break 'a 22; }` would not force the type of the block
4075         // to be `()`).
4076         let tail_expr = blk.expr.as_ref();
4077         let coerce_to_ty = expected.coercion_target_type(self, blk.span);
4078         let coerce = if blk.targeted_by_break {
4079             CoerceMany::new(coerce_to_ty)
4080         } else {
4081             let tail_expr: &[P<hir::Expr>] = match tail_expr {
4082                 Some(e) => slice::from_ref(e),
4083                 None => &[],
4084             };
4085             CoerceMany::with_coercion_sites(coerce_to_ty, tail_expr)
4086         };
4087
4088         let prev_diverges = self.diverges.get();
4089         let ctxt = BreakableCtxt {
4090             coerce: Some(coerce),
4091             may_break: false,
4092         };
4093
4094         let (ctxt, ()) = self.with_breakable_ctxt(blk.hir_id, ctxt, || {
4095             for s in &blk.stmts {
4096                 self.check_stmt(s);
4097             }
4098
4099             // check the tail expression **without** holding the
4100             // `enclosing_breakables` lock below.
4101             let tail_expr_ty = tail_expr.map(|t| self.check_expr_with_expectation(t, expected));
4102
4103             let mut enclosing_breakables = self.enclosing_breakables.borrow_mut();
4104             let ctxt = enclosing_breakables.find_breakable(blk.hir_id);
4105             let coerce = ctxt.coerce.as_mut().unwrap();
4106             if let Some(tail_expr_ty) = tail_expr_ty {
4107                 let tail_expr = tail_expr.unwrap();
4108                 let span = self.get_expr_coercion_span(tail_expr);
4109                 let cause = self.cause(span, ObligationCauseCode::BlockTailExpression(blk.hir_id));
4110                 coerce.coerce(self, &cause, tail_expr, tail_expr_ty);
4111             } else {
4112                 // Subtle: if there is no explicit tail expression,
4113                 // that is typically equivalent to a tail expression
4114                 // of `()` -- except if the block diverges. In that
4115                 // case, there is no value supplied from the tail
4116                 // expression (assuming there are no other breaks,
4117                 // this implies that the type of the block will be
4118                 // `!`).
4119                 //
4120                 // #41425 -- label the implicit `()` as being the
4121                 // "found type" here, rather than the "expected type".
4122                 if !self.diverges.get().is_always() {
4123                     // #50009 -- Do not point at the entire fn block span, point at the return type
4124                     // span, as it is the cause of the requirement, and
4125                     // `consider_hint_about_removing_semicolon` will point at the last expression
4126                     // if it were a relevant part of the error. This improves usability in editors
4127                     // that highlight errors inline.
4128                     let mut sp = blk.span;
4129                     let mut fn_span = None;
4130                     if let Some((decl, ident)) = self.get_parent_fn_decl(blk.hir_id) {
4131                         let ret_sp = decl.output.span();
4132                         if let Some(block_sp) = self.parent_item_span(blk.hir_id) {
4133                             // HACK: on some cases (`ui/liveness/liveness-issue-2163.rs`) the
4134                             // output would otherwise be incorrect and even misleading. Make sure
4135                             // the span we're aiming at correspond to a `fn` body.
4136                             if block_sp == blk.span {
4137                                 sp = ret_sp;
4138                                 fn_span = Some(ident.span);
4139                             }
4140                         }
4141                     }
4142                     coerce.coerce_forced_unit(self, &self.misc(sp), &mut |err| {
4143                         if let Some(expected_ty) = expected.only_has_type(self) {
4144                             self.consider_hint_about_removing_semicolon(blk, expected_ty, err);
4145                         }
4146                         if let Some(fn_span) = fn_span {
4147                             err.span_label(
4148                                 fn_span,
4149                                 "implicitly returns `()` as its body has no tail or `return` \
4150                                  expression",
4151                             );
4152                         }
4153                     }, false);
4154                 }
4155             }
4156         });
4157
4158         if ctxt.may_break {
4159             // If we can break from the block, then the block's exit is always reachable
4160             // (... as long as the entry is reachable) - regardless of the tail of the block.
4161             self.diverges.set(prev_diverges);
4162         }
4163
4164         let mut ty = ctxt.coerce.unwrap().complete(self);
4165
4166         if self.has_errors.get() || ty.references_error() {
4167             ty = self.tcx.types.err
4168         }
4169
4170         self.write_ty(blk.hir_id, ty);
4171
4172         *self.ps.borrow_mut() = prev;
4173         ty
4174     }
4175
4176     fn parent_item_span(&self, id: hir::HirId) -> Option<Span> {
4177         let node = self.tcx.hir().get(self.tcx.hir().get_parent_item(id));
4178         match node {
4179             Node::Item(&hir::Item {
4180                 kind: hir::ItemKind::Fn(_, _, _, body_id), ..
4181             }) |
4182             Node::ImplItem(&hir::ImplItem {
4183                 kind: hir::ImplItemKind::Method(_, body_id), ..
4184             }) => {
4185                 let body = self.tcx.hir().body(body_id);
4186                 if let ExprKind::Block(block, _) = &body.value.kind {
4187                     return Some(block.span);
4188                 }
4189             }
4190             _ => {}
4191         }
4192         None
4193     }
4194
4195     /// Given a function block's `HirId`, returns its `FnDecl` if it exists, or `None` otherwise.
4196     fn get_parent_fn_decl(&self, blk_id: hir::HirId) -> Option<(&'tcx hir::FnDecl, ast::Ident)> {
4197         let parent = self.tcx.hir().get(self.tcx.hir().get_parent_item(blk_id));
4198         self.get_node_fn_decl(parent).map(|(fn_decl, ident, _)| (fn_decl, ident))
4199     }
4200
4201     /// Given a function `Node`, return its `FnDecl` if it exists, or `None` otherwise.
4202     fn get_node_fn_decl(&self, node: Node<'tcx>) -> Option<(&'tcx hir::FnDecl, ast::Ident, bool)> {
4203         match node {
4204             Node::Item(&hir::Item {
4205                 ident, kind: hir::ItemKind::Fn(ref decl, ..), ..
4206             }) => {
4207                 // This is less than ideal, it will not suggest a return type span on any
4208                 // method called `main`, regardless of whether it is actually the entry point,
4209                 // but it will still present it as the reason for the expected type.
4210                 Some((decl, ident, ident.name != sym::main))
4211             }
4212             Node::TraitItem(&hir::TraitItem {
4213                 ident, kind: hir::TraitItemKind::Method(hir::MethodSig {
4214                     ref decl, ..
4215                 }, ..), ..
4216             }) => Some((decl, ident, true)),
4217             Node::ImplItem(&hir::ImplItem {
4218                 ident, kind: hir::ImplItemKind::Method(hir::MethodSig {
4219                     ref decl, ..
4220                 }, ..), ..
4221             }) => Some((decl, ident, false)),
4222             _ => None,
4223         }
4224     }
4225
4226     /// Given a `HirId`, return the `FnDecl` of the method it is enclosed by and whether a
4227     /// suggestion can be made, `None` otherwise.
4228     pub fn get_fn_decl(&self, blk_id: hir::HirId) -> Option<(&'tcx hir::FnDecl, bool)> {
4229         // Get enclosing Fn, if it is a function or a trait method, unless there's a `loop` or
4230         // `while` before reaching it, as block tail returns are not available in them.
4231         self.tcx.hir().get_return_block(blk_id).and_then(|blk_id| {
4232             let parent = self.tcx.hir().get(blk_id);
4233             self.get_node_fn_decl(parent).map(|(fn_decl, _, is_main)| (fn_decl, is_main))
4234         })
4235     }
4236
4237     /// On implicit return expressions with mismatched types, provides the following suggestions:
4238     ///
4239     /// - Points out the method's return type as the reason for the expected type.
4240     /// - Possible missing semicolon.
4241     /// - Possible missing return type if the return type is the default, and not `fn main()`.
4242     pub fn suggest_mismatched_types_on_tail(
4243         &self,
4244         err: &mut DiagnosticBuilder<'tcx>,
4245         expr: &'tcx hir::Expr,
4246         expected: Ty<'tcx>,
4247         found: Ty<'tcx>,
4248         cause_span: Span,
4249         blk_id: hir::HirId,
4250     ) -> bool {
4251         let expr = expr.peel_drop_temps();
4252         self.suggest_missing_semicolon(err, expr, expected, cause_span);
4253         let mut pointing_at_return_type = false;
4254         if let Some((fn_decl, can_suggest)) = self.get_fn_decl(blk_id) {
4255             pointing_at_return_type = self.suggest_missing_return_type(
4256                 err, &fn_decl, expected, found, can_suggest);
4257         }
4258         self.suggest_ref_or_into(err, expr, expected, found);
4259         self.suggest_boxing_when_appropriate(err, expr, expected, found);
4260         pointing_at_return_type
4261     }
4262
4263     /// When encountering an fn-like ctor that needs to unify with a value, check whether calling
4264     /// the ctor would successfully solve the type mismatch and if so, suggest it:
4265     /// ```
4266     /// fn foo(x: usize) -> usize { x }
4267     /// let x: usize = foo;  // suggest calling the `foo` function: `foo(42)`
4268     /// ```
4269     fn suggest_fn_call(
4270         &self,
4271         err: &mut DiagnosticBuilder<'tcx>,
4272         expr: &hir::Expr,
4273         expected: Ty<'tcx>,
4274         found: Ty<'tcx>,
4275     ) -> bool {
4276         let hir = self.tcx.hir();
4277         let (def_id, sig) = match found.kind {
4278             ty::FnDef(def_id, _) => (def_id, found.fn_sig(self.tcx)),
4279             ty::Closure(def_id, substs) => {
4280                 // We don't use `closure_sig` to account for malformed closures like
4281                 // `|_: [_; continue]| {}` and instead we don't suggest anything.
4282                 let closure_sig_ty = substs.as_closure().sig_ty(def_id, self.tcx);
4283                 (def_id, match closure_sig_ty.kind {
4284                     ty::FnPtr(sig) => sig,
4285                     _ => return false,
4286                 })
4287             }
4288             _ => return false,
4289         };
4290
4291         let sig = self
4292             .replace_bound_vars_with_fresh_vars(expr.span, infer::FnCall, &sig)
4293             .0;
4294         let sig = self.normalize_associated_types_in(expr.span, &sig);
4295         if self.can_coerce(sig.output(), expected) {
4296             let (mut sugg_call, applicability) = if sig.inputs().is_empty() {
4297                 (String::new(), Applicability::MachineApplicable)
4298             } else {
4299                 ("...".to_string(), Applicability::HasPlaceholders)
4300             };
4301             let mut msg = "call this function";
4302             match hir.get_if_local(def_id) {
4303                 Some(Node::Item(hir::Item {
4304                     kind: ItemKind::Fn(.., body_id),
4305                     ..
4306                 })) |
4307                 Some(Node::ImplItem(hir::ImplItem {
4308                     kind: hir::ImplItemKind::Method(_, body_id),
4309                     ..
4310                 })) |
4311                 Some(Node::TraitItem(hir::TraitItem {
4312                     kind: hir::TraitItemKind::Method(.., hir::TraitMethod::Provided(body_id)),
4313                     ..
4314                 })) => {
4315                     let body = hir.body(*body_id);
4316                     sugg_call = body.params.iter()
4317                         .map(|param| match &param.pat.kind {
4318                             hir::PatKind::Binding(_, _, ident, None)
4319                             if ident.name != kw::SelfLower => ident.to_string(),
4320                             _ => "_".to_string(),
4321                         }).collect::<Vec<_>>().join(", ");
4322                 }
4323                 Some(Node::Expr(hir::Expr {
4324                     kind: ExprKind::Closure(_, _, body_id, closure_span, _),
4325                     span: full_closure_span,
4326                     ..
4327                 })) => {
4328                     if *full_closure_span == expr.span {
4329                         return false;
4330                     }
4331                     err.span_label(*closure_span, "closure defined here");
4332                     msg = "call this closure";
4333                     let body = hir.body(*body_id);
4334                     sugg_call = body.params.iter()
4335                         .map(|param| match &param.pat.kind {
4336                             hir::PatKind::Binding(_, _, ident, None)
4337                             if ident.name != kw::SelfLower => ident.to_string(),
4338                             _ => "_".to_string(),
4339                         }).collect::<Vec<_>>().join(", ");
4340                 }
4341                 Some(Node::Ctor(hir::VariantData::Tuple(fields, _))) => {
4342                     sugg_call = fields.iter().map(|_| "_").collect::<Vec<_>>().join(", ");
4343                     match hir.as_local_hir_id(def_id).and_then(|hir_id| hir.def_kind(hir_id)) {
4344                         Some(hir::def::DefKind::Ctor(hir::def::CtorOf::Variant, _)) => {
4345                             msg = "instantiate this tuple variant";
4346                         }
4347                         Some(hir::def::DefKind::Ctor(hir::def::CtorOf::Struct, _)) => {
4348                             msg = "instantiate this tuple struct";
4349                         }
4350                         _ => {}
4351                     }
4352                 }
4353                 Some(Node::ForeignItem(hir::ForeignItem {
4354                     kind: hir::ForeignItemKind::Fn(_, idents, _),
4355                     ..
4356                 })) |
4357                 Some(Node::TraitItem(hir::TraitItem {
4358                     kind: hir::TraitItemKind::Method(.., hir::TraitMethod::Required(idents)),
4359                     ..
4360                 })) => sugg_call = idents.iter()
4361                         .map(|ident| if ident.name != kw::SelfLower {
4362                             ident.to_string()
4363                         } else {
4364                             "_".to_string()
4365                         }).collect::<Vec<_>>()
4366                         .join(", "),
4367                 _ => {}
4368             }
4369             if let Ok(code) = self.sess().source_map().span_to_snippet(expr.span) {
4370                 err.span_suggestion(
4371                     expr.span,
4372                     &format!("use parentheses to {}", msg),
4373                     format!("{}({})", code, sugg_call),
4374                     applicability,
4375                 );
4376                 return true;
4377             }
4378         }
4379         false
4380     }
4381
4382     pub fn suggest_ref_or_into(
4383         &self,
4384         err: &mut DiagnosticBuilder<'tcx>,
4385         expr: &hir::Expr,
4386         expected: Ty<'tcx>,
4387         found: Ty<'tcx>,
4388     ) {
4389         if let Some((sp, msg, suggestion)) = self.check_ref(expr, found, expected) {
4390             err.span_suggestion(
4391                 sp,
4392                 msg,
4393                 suggestion,
4394                 Applicability::MachineApplicable,
4395             );
4396         } else if let (ty::FnDef(def_id, ..), true) = (
4397             &found.kind,
4398             self.suggest_fn_call(err, expr, expected, found),
4399         ) {
4400             if let Some(sp) = self.tcx.hir().span_if_local(*def_id) {
4401                 let sp = self.sess().source_map().def_span(sp);
4402                 err.span_label(sp, &format!("{} defined here", found));
4403             }
4404         } else if !self.check_for_cast(err, expr, found, expected) {
4405             let is_struct_pat_shorthand_field = self.is_hir_id_from_struct_pattern_shorthand_field(
4406                 expr.hir_id,
4407                 expr.span,
4408             );
4409             let methods = self.get_conversion_methods(expr.span, expected, found);
4410             if let Ok(expr_text) = self.sess().source_map().span_to_snippet(expr.span) {
4411                 let mut suggestions = iter::repeat(&expr_text).zip(methods.iter())
4412                     .filter_map(|(receiver, method)| {
4413                         let method_call = format!(".{}()", method.ident);
4414                         if receiver.ends_with(&method_call) {
4415                             None  // do not suggest code that is already there (#53348)
4416                         } else {
4417                             let method_call_list = [".to_vec()", ".to_string()"];
4418                             let sugg = if receiver.ends_with(".clone()")
4419                                     && method_call_list.contains(&method_call.as_str()) {
4420                                 let max_len = receiver.rfind(".").unwrap();
4421                                 format!("{}{}", &receiver[..max_len], method_call)
4422                             } else {
4423                                 if expr.precedence().order() < ExprPrecedence::MethodCall.order() {
4424                                     format!("({}){}", receiver, method_call)
4425                                 } else {
4426                                     format!("{}{}", receiver, method_call)
4427                                 }
4428                             };
4429                             Some(if is_struct_pat_shorthand_field {
4430                                 format!("{}: {}", receiver, sugg)
4431                             } else {
4432                                 sugg
4433                             })
4434                         }
4435                     }).peekable();
4436                 if suggestions.peek().is_some() {
4437                     err.span_suggestions(
4438                         expr.span,
4439                         "try using a conversion method",
4440                         suggestions,
4441                         Applicability::MaybeIncorrect,
4442                     );
4443                 }
4444             }
4445         }
4446     }
4447
4448     /// When encountering the expected boxed value allocated in the stack, suggest allocating it
4449     /// in the heap by calling `Box::new()`.
4450     fn suggest_boxing_when_appropriate(
4451         &self,
4452         err: &mut DiagnosticBuilder<'tcx>,
4453         expr: &hir::Expr,
4454         expected: Ty<'tcx>,
4455         found: Ty<'tcx>,
4456     ) {
4457         if self.tcx.hir().is_const_context(expr.hir_id) {
4458             // Do not suggest `Box::new` in const context.
4459             return;
4460         }
4461         if !expected.is_box() || found.is_box() {
4462             return;
4463         }
4464         let boxed_found = self.tcx.mk_box(found);
4465         if let (true, Ok(snippet)) = (
4466             self.can_coerce(boxed_found, expected),
4467             self.sess().source_map().span_to_snippet(expr.span),
4468         ) {
4469             err.span_suggestion(
4470                 expr.span,
4471                 "store this in the heap by calling `Box::new`",
4472                 format!("Box::new({})", snippet),
4473                 Applicability::MachineApplicable,
4474             );
4475             err.note("for more on the distinction between the stack and the \
4476                         heap, read https://doc.rust-lang.org/book/ch15-01-box.html, \
4477                         https://doc.rust-lang.org/rust-by-example/std/box.html, and \
4478                         https://doc.rust-lang.org/std/boxed/index.html");
4479         }
4480     }
4481
4482
4483     /// A common error is to forget to add a semicolon at the end of a block, e.g.,
4484     ///
4485     /// ```
4486     /// fn foo() {
4487     ///     bar_that_returns_u32()
4488     /// }
4489     /// ```
4490     ///
4491     /// This routine checks if the return expression in a block would make sense on its own as a
4492     /// statement and the return type has been left as default or has been specified as `()`. If so,
4493     /// it suggests adding a semicolon.
4494     fn suggest_missing_semicolon(
4495         &self,
4496         err: &mut DiagnosticBuilder<'tcx>,
4497         expression: &'tcx hir::Expr,
4498         expected: Ty<'tcx>,
4499         cause_span: Span,
4500     ) {
4501         if expected.is_unit() {
4502             // `BlockTailExpression` only relevant if the tail expr would be
4503             // useful on its own.
4504             match expression.kind {
4505                 ExprKind::Call(..) |
4506                 ExprKind::MethodCall(..) |
4507                 ExprKind::Loop(..) |
4508                 ExprKind::Match(..) |
4509                 ExprKind::Block(..) => {
4510                     let sp = self.tcx.sess.source_map().next_point(cause_span);
4511                     err.span_suggestion(
4512                         sp,
4513                         "try adding a semicolon",
4514                         ";".to_string(),
4515                         Applicability::MachineApplicable);
4516                 }
4517                 _ => (),
4518             }
4519         }
4520     }
4521
4522     /// A possible error is to forget to add a return type that is needed:
4523     ///
4524     /// ```
4525     /// fn foo() {
4526     ///     bar_that_returns_u32()
4527     /// }
4528     /// ```
4529     ///
4530     /// This routine checks if the return type is left as default, the method is not part of an
4531     /// `impl` block and that it isn't the `main` method. If so, it suggests setting the return
4532     /// type.
4533     fn suggest_missing_return_type(
4534         &self,
4535         err: &mut DiagnosticBuilder<'tcx>,
4536         fn_decl: &hir::FnDecl,
4537         expected: Ty<'tcx>,
4538         found: Ty<'tcx>,
4539         can_suggest: bool,
4540     ) -> bool {
4541         // Only suggest changing the return type for methods that
4542         // haven't set a return type at all (and aren't `fn main()` or an impl).
4543         match (&fn_decl.output, found.is_suggestable(), can_suggest, expected.is_unit()) {
4544             (&hir::FunctionRetTy::DefaultReturn(span), true, true, true) => {
4545                 err.span_suggestion(
4546                     span,
4547                     "try adding a return type",
4548                     format!("-> {} ", self.resolve_vars_with_obligations(found)),
4549                     Applicability::MachineApplicable);
4550                 true
4551             }
4552             (&hir::FunctionRetTy::DefaultReturn(span), false, true, true) => {
4553                 err.span_label(span, "possibly return type missing here?");
4554                 true
4555             }
4556             (&hir::FunctionRetTy::DefaultReturn(span), _, false, true) => {
4557                 // `fn main()` must return `()`, do not suggest changing return type
4558                 err.span_label(span, "expected `()` because of default return type");
4559                 true
4560             }
4561             // expectation was caused by something else, not the default return
4562             (&hir::FunctionRetTy::DefaultReturn(_), _, _, false) => false,
4563             (&hir::FunctionRetTy::Return(ref ty), _, _, _) => {
4564                 // Only point to return type if the expected type is the return type, as if they
4565                 // are not, the expectation must have been caused by something else.
4566                 debug!("suggest_missing_return_type: return type {:?} node {:?}", ty, ty.kind);
4567                 let sp = ty.span;
4568                 let ty = AstConv::ast_ty_to_ty(self, ty);
4569                 debug!("suggest_missing_return_type: return type {:?}", ty);
4570                 debug!("suggest_missing_return_type: expected type {:?}", ty);
4571                 if ty.kind == expected.kind {
4572                     err.span_label(sp, format!("expected `{}` because of return type",
4573                                                expected));
4574                     return true;
4575                 }
4576                 false
4577             }
4578         }
4579     }
4580
4581     /// A possible error is to forget to add `.await` when using futures:
4582     ///
4583     /// ```
4584     /// async fn make_u32() -> u32 {
4585     ///     22
4586     /// }
4587     ///
4588     /// fn take_u32(x: u32) {}
4589     ///
4590     /// async fn foo() {
4591     ///     let x = make_u32();
4592     ///     take_u32(x);
4593     /// }
4594     /// ```
4595     ///
4596     /// This routine checks if the found type `T` implements `Future<Output=U>` where `U` is the
4597     /// expected type. If this is the case, and we are inside of an async body, it suggests adding
4598     /// `.await` to the tail of the expression.
4599     fn suggest_missing_await(
4600         &self,
4601         err: &mut DiagnosticBuilder<'tcx>,
4602         expr: &hir::Expr,
4603         expected: Ty<'tcx>,
4604         found: Ty<'tcx>,
4605     ) {
4606         // `.await` is not permitted outside of `async` bodies, so don't bother to suggest if the
4607         // body isn't `async`.
4608         let item_id = self.tcx().hir().get_parent_node(self.body_id);
4609         if let Some(body_id) = self.tcx().hir().maybe_body_owned_by(item_id) {
4610             let body = self.tcx().hir().body(body_id);
4611             if let Some(hir::GeneratorKind::Async(_)) = body.generator_kind {
4612                 let sp = expr.span;
4613                 // Check for `Future` implementations by constructing a predicate to
4614                 // prove: `<T as Future>::Output == U`
4615                 let future_trait = self.tcx.lang_items().future_trait().unwrap();
4616                 let item_def_id = self.tcx.associated_items(future_trait).next().unwrap().def_id;
4617                 let predicate = ty::Predicate::Projection(ty::Binder::bind(ty::ProjectionPredicate {
4618                     // `<T as Future>::Output`
4619                     projection_ty: ty::ProjectionTy {
4620                         // `T`
4621                         substs: self.tcx.mk_substs_trait(
4622                             found,
4623                             self.fresh_substs_for_item(sp, item_def_id)
4624                         ),
4625                         // `Future::Output`
4626                         item_def_id,
4627                     },
4628                     ty: expected,
4629                 }));
4630                 let obligation = traits::Obligation::new(self.misc(sp), self.param_env, predicate);
4631                 if self.infcx.predicate_may_hold(&obligation) {
4632                     if let Ok(code) = self.sess().source_map().span_to_snippet(sp) {
4633                         err.span_suggestion(
4634                             sp,
4635                             "consider using `.await` here",
4636                             format!("{}.await", code),
4637                             Applicability::MaybeIncorrect,
4638                         );
4639                     }
4640                 }
4641             }
4642         }
4643     }
4644
4645     /// A common error is to add an extra semicolon:
4646     ///
4647     /// ```
4648     /// fn foo() -> usize {
4649     ///     22;
4650     /// }
4651     /// ```
4652     ///
4653     /// This routine checks if the final statement in a block is an
4654     /// expression with an explicit semicolon whose type is compatible
4655     /// with `expected_ty`. If so, it suggests removing the semicolon.
4656     fn consider_hint_about_removing_semicolon(
4657         &self,
4658         blk: &'tcx hir::Block,
4659         expected_ty: Ty<'tcx>,
4660         err: &mut DiagnosticBuilder<'_>,
4661     ) {
4662         if let Some(span_semi) = self.could_remove_semicolon(blk, expected_ty) {
4663             err.span_suggestion(
4664                 span_semi,
4665                 "consider removing this semicolon",
4666                 String::new(),
4667                 Applicability::MachineApplicable,
4668             );
4669         }
4670     }
4671
4672     fn could_remove_semicolon(&self, blk: &'tcx hir::Block, expected_ty: Ty<'tcx>) -> Option<Span> {
4673         // Be helpful when the user wrote `{... expr;}` and
4674         // taking the `;` off is enough to fix the error.
4675         let last_stmt = blk.stmts.last()?;
4676         let last_expr = match last_stmt.kind {
4677             hir::StmtKind::Semi(ref e) => e,
4678             _ => return None,
4679         };
4680         let last_expr_ty = self.node_ty(last_expr.hir_id);
4681         if self.can_sub(self.param_env, last_expr_ty, expected_ty).is_err() {
4682             return None;
4683         }
4684         let original_span = original_sp(last_stmt.span, blk.span);
4685         Some(original_span.with_lo(original_span.hi() - BytePos(1)))
4686     }
4687
4688     // Instantiates the given path, which must refer to an item with the given
4689     // number of type parameters and type.
4690     pub fn instantiate_value_path(&self,
4691                                   segments: &[hir::PathSegment],
4692                                   self_ty: Option<Ty<'tcx>>,
4693                                   res: Res,
4694                                   span: Span,
4695                                   hir_id: hir::HirId)
4696                                   -> (Ty<'tcx>, Res) {
4697         debug!(
4698             "instantiate_value_path(segments={:?}, self_ty={:?}, res={:?}, hir_id={})",
4699             segments,
4700             self_ty,
4701             res,
4702             hir_id,
4703         );
4704
4705         let tcx = self.tcx;
4706
4707         let path_segs = match res {
4708             Res::Local(_) | Res::SelfCtor(_) => vec![],
4709             Res::Def(kind, def_id) =>
4710                 AstConv::def_ids_for_value_path_segments(self, segments, self_ty, kind, def_id),
4711             _ => bug!("instantiate_value_path on {:?}", res),
4712         };
4713
4714         let mut user_self_ty = None;
4715         let mut is_alias_variant_ctor = false;
4716         match res {
4717             Res::Def(DefKind::Ctor(CtorOf::Variant, _), _) => {
4718                 if let Some(self_ty) = self_ty {
4719                     let adt_def = self_ty.ty_adt_def().unwrap();
4720                     user_self_ty = Some(UserSelfTy {
4721                         impl_def_id: adt_def.did,
4722                         self_ty,
4723                     });
4724                     is_alias_variant_ctor = true;
4725                 }
4726             }
4727             Res::Def(DefKind::Method, def_id)
4728             | Res::Def(DefKind::AssocConst, def_id) => {
4729                 let container = tcx.associated_item(def_id).container;
4730                 debug!("instantiate_value_path: def_id={:?} container={:?}", def_id, container);
4731                 match container {
4732                     ty::TraitContainer(trait_did) => {
4733                         callee::check_legal_trait_for_method_call(tcx, span, trait_did)
4734                     }
4735                     ty::ImplContainer(impl_def_id) => {
4736                         if segments.len() == 1 {
4737                             // `<T>::assoc` will end up here, and so
4738                             // can `T::assoc`. It this came from an
4739                             // inherent impl, we need to record the
4740                             // `T` for posterity (see `UserSelfTy` for
4741                             // details).
4742                             let self_ty = self_ty.expect("UFCS sugared assoc missing Self");
4743                             user_self_ty = Some(UserSelfTy {
4744                                 impl_def_id,
4745                                 self_ty,
4746                             });
4747                         }
4748                     }
4749                 }
4750             }
4751             _ => {}
4752         }
4753
4754         // Now that we have categorized what space the parameters for each
4755         // segment belong to, let's sort out the parameters that the user
4756         // provided (if any) into their appropriate spaces. We'll also report
4757         // errors if type parameters are provided in an inappropriate place.
4758
4759         let generic_segs: FxHashSet<_> = path_segs.iter().map(|PathSeg(_, index)| index).collect();
4760         let generics_has_err = AstConv::prohibit_generics(
4761                 self, segments.iter().enumerate().filter_map(|(index, seg)| {
4762             if !generic_segs.contains(&index) || is_alias_variant_ctor {
4763                 Some(seg)
4764             } else {
4765                 None
4766             }
4767         }));
4768
4769         if let Res::Local(hid) = res {
4770             let ty = self.local_ty(span, hid).decl_ty;
4771             let ty = self.normalize_associated_types_in(span, &ty);
4772             self.write_ty(hir_id, ty);
4773             return (ty, res);
4774         }
4775
4776         if generics_has_err {
4777             // Don't try to infer type parameters when prohibited generic arguments were given.
4778             user_self_ty = None;
4779         }
4780
4781         // Now we have to compare the types that the user *actually*
4782         // provided against the types that were *expected*. If the user
4783         // did not provide any types, then we want to substitute inference
4784         // variables. If the user provided some types, we may still need
4785         // to add defaults. If the user provided *too many* types, that's
4786         // a problem.
4787
4788         let mut infer_args_for_err = FxHashSet::default();
4789         for &PathSeg(def_id, index) in &path_segs {
4790             let seg = &segments[index];
4791             let generics = tcx.generics_of(def_id);
4792             // Argument-position `impl Trait` is treated as a normal generic
4793             // parameter internally, but we don't allow users to specify the
4794             // parameter's value explicitly, so we have to do some error-
4795             // checking here.
4796             let suppress_errors = AstConv::check_generic_arg_count_for_call(
4797                 tcx,
4798                 span,
4799                 &generics,
4800                 &seg,
4801                 false, // `is_method_call`
4802             );
4803             if suppress_errors {
4804                 infer_args_for_err.insert(index);
4805                 self.set_tainted_by_errors(); // See issue #53251.
4806             }
4807         }
4808
4809         let has_self = path_segs.last().map(|PathSeg(def_id, _)| {
4810             tcx.generics_of(*def_id).has_self
4811         }).unwrap_or(false);
4812
4813         let (res, self_ctor_substs) = if let Res::SelfCtor(impl_def_id) = res {
4814             let ty = self.impl_self_ty(span, impl_def_id).ty;
4815             let adt_def = ty.ty_adt_def();
4816
4817             match ty.kind {
4818                 ty::Adt(adt_def, substs) if adt_def.has_ctor() => {
4819                     let variant = adt_def.non_enum_variant();
4820                     let ctor_def_id = variant.ctor_def_id.unwrap();
4821                     (
4822                         Res::Def(DefKind::Ctor(CtorOf::Struct, variant.ctor_kind), ctor_def_id),
4823                         Some(substs),
4824                     )
4825                 }
4826                 _ => {
4827                     let mut err = tcx.sess.struct_span_err(span,
4828                         "the `Self` constructor can only be used with tuple or unit structs");
4829                     if let Some(adt_def) = adt_def {
4830                         match adt_def.adt_kind() {
4831                             AdtKind::Enum => {
4832                                 err.help("did you mean to use one of the enum's variants?");
4833                             },
4834                             AdtKind::Struct |
4835                             AdtKind::Union => {
4836                                 err.span_suggestion(
4837                                     span,
4838                                     "use curly brackets",
4839                                     String::from("Self { /* fields */ }"),
4840                                     Applicability::HasPlaceholders,
4841                                 );
4842                             }
4843                         }
4844                     }
4845                     err.emit();
4846
4847                     return (tcx.types.err, res)
4848                 }
4849             }
4850         } else {
4851             (res, None)
4852         };
4853         let def_id = res.def_id();
4854
4855         // The things we are substituting into the type should not contain
4856         // escaping late-bound regions, and nor should the base type scheme.
4857         let ty = tcx.type_of(def_id);
4858
4859         let substs = self_ctor_substs.unwrap_or_else(|| AstConv::create_substs_for_generic_args(
4860             tcx,
4861             def_id,
4862             &[][..],
4863             has_self,
4864             self_ty,
4865             // Provide the generic args, and whether types should be inferred.
4866             |def_id| {
4867                 if let Some(&PathSeg(_, index)) = path_segs.iter().find(|&PathSeg(did, _)| {
4868                     *did == def_id
4869                 }) {
4870                     // If we've encountered an `impl Trait`-related error, we're just
4871                     // going to infer the arguments for better error messages.
4872                     if !infer_args_for_err.contains(&index) {
4873                         // Check whether the user has provided generic arguments.
4874                         if let Some(ref data) = segments[index].args {
4875                             return (Some(data), segments[index].infer_args);
4876                         }
4877                     }
4878                     return (None, segments[index].infer_args);
4879                 }
4880
4881                 (None, true)
4882             },
4883             // Provide substitutions for parameters for which (valid) arguments have been provided.
4884             |param, arg| {
4885                 match (&param.kind, arg) {
4886                     (GenericParamDefKind::Lifetime, GenericArg::Lifetime(lt)) => {
4887                         AstConv::ast_region_to_region(self, lt, Some(param)).into()
4888                     }
4889                     (GenericParamDefKind::Type { .. }, GenericArg::Type(ty)) => {
4890                         self.to_ty(ty).into()
4891                     }
4892                     (GenericParamDefKind::Const, GenericArg::Const(ct)) => {
4893                         self.to_const(&ct.value, self.tcx.type_of(param.def_id)).into()
4894                     }
4895                     _ => unreachable!(),
4896                 }
4897             },
4898             // Provide substitutions for parameters for which arguments are inferred.
4899             |substs, param, infer_args| {
4900                 match param.kind {
4901                     GenericParamDefKind::Lifetime => {
4902                         self.re_infer(Some(param), span).unwrap().into()
4903                     }
4904                     GenericParamDefKind::Type { has_default, .. } => {
4905                         if !infer_args && has_default {
4906                             // If we have a default, then we it doesn't matter that we're not
4907                             // inferring the type arguments: we provide the default where any
4908                             // is missing.
4909                             let default = tcx.type_of(param.def_id);
4910                             self.normalize_ty(
4911                                 span,
4912                                 default.subst_spanned(tcx, substs.unwrap(), Some(span))
4913                             ).into()
4914                         } else {
4915                             // If no type arguments were provided, we have to infer them.
4916                             // This case also occurs as a result of some malformed input, e.g.
4917                             // a lifetime argument being given instead of a type parameter.
4918                             // Using inference instead of `Error` gives better error messages.
4919                             self.var_for_def(span, param)
4920                         }
4921                     }
4922                     GenericParamDefKind::Const => {
4923                         // FIXME(const_generics:defaults)
4924                         // No const parameters were provided, we have to infer them.
4925                         self.var_for_def(span, param)
4926                     }
4927                 }
4928             },
4929         ));
4930         assert!(!substs.has_escaping_bound_vars());
4931         assert!(!ty.has_escaping_bound_vars());
4932
4933         // First, store the "user substs" for later.
4934         self.write_user_type_annotation_from_substs(hir_id, def_id, substs, user_self_ty);
4935
4936         self.add_required_obligations(span, def_id, &substs);
4937
4938         // Substitute the values for the type parameters into the type of
4939         // the referenced item.
4940         let ty_substituted = self.instantiate_type_scheme(span, &substs, &ty);
4941
4942         if let Some(UserSelfTy { impl_def_id, self_ty }) = user_self_ty {
4943             // In the case of `Foo<T>::method` and `<Foo<T>>::method`, if `method`
4944             // is inherent, there is no `Self` parameter; instead, the impl needs
4945             // type parameters, which we can infer by unifying the provided `Self`
4946             // with the substituted impl type.
4947             // This also occurs for an enum variant on a type alias.
4948             let ty = tcx.type_of(impl_def_id);
4949
4950             let impl_ty = self.instantiate_type_scheme(span, &substs, &ty);
4951             match self.at(&self.misc(span), self.param_env).sup(impl_ty, self_ty) {
4952                 Ok(ok) => self.register_infer_ok_obligations(ok),
4953                 Err(_) => {
4954                     self.tcx.sess.delay_span_bug(span, &format!(
4955                         "instantiate_value_path: (UFCS) {:?} was a subtype of {:?} but now is not?",
4956                         self_ty,
4957                         impl_ty,
4958                     ));
4959                 }
4960             }
4961         }
4962
4963         self.check_rustc_args_require_const(def_id, hir_id, span);
4964
4965         debug!("instantiate_value_path: type of {:?} is {:?}",
4966                hir_id,
4967                ty_substituted);
4968         self.write_substs(hir_id, substs);
4969
4970         (ty_substituted, res)
4971     }
4972
4973     /// Add all the obligations that are required, substituting and normalized appropriately.
4974     fn add_required_obligations(&self, span: Span, def_id: DefId, substs: &SubstsRef<'tcx>) {
4975         let (bounds, spans) = self.instantiate_bounds(span, def_id, &substs);
4976
4977         for (i, mut obligation) in traits::predicates_for_generics(
4978             traits::ObligationCause::new(
4979                 span,
4980                 self.body_id,
4981                 traits::ItemObligation(def_id),
4982             ),
4983             self.param_env,
4984             &bounds,
4985         ).into_iter().enumerate() {
4986             // This makes the error point at the bound, but we want to point at the argument
4987             if let Some(span) = spans.get(i) {
4988                 obligation.cause.code = traits::BindingObligation(def_id, *span);
4989             }
4990             self.register_predicate(obligation);
4991         }
4992     }
4993
4994     fn check_rustc_args_require_const(&self,
4995                                       def_id: DefId,
4996                                       hir_id: hir::HirId,
4997                                       span: Span) {
4998         // We're only interested in functions tagged with
4999         // #[rustc_args_required_const], so ignore anything that's not.
5000         if !self.tcx.has_attr(def_id, sym::rustc_args_required_const) {
5001             return
5002         }
5003
5004         // If our calling expression is indeed the function itself, we're good!
5005         // If not, generate an error that this can only be called directly.
5006         if let Node::Expr(expr) = self.tcx.hir().get(
5007             self.tcx.hir().get_parent_node(hir_id))
5008         {
5009             if let ExprKind::Call(ref callee, ..) = expr.kind {
5010                 if callee.hir_id == hir_id {
5011                     return
5012                 }
5013             }
5014         }
5015
5016         self.tcx.sess.span_err(span, "this function can only be invoked \
5017                                       directly, not through a function pointer");
5018     }
5019
5020     // Resolves `typ` by a single level if `typ` is a type variable.
5021     // If no resolution is possible, then an error is reported.
5022     // Numeric inference variables may be left unresolved.
5023     pub fn structurally_resolved_type(&self, sp: Span, ty: Ty<'tcx>) -> Ty<'tcx> {
5024         let ty = self.resolve_vars_with_obligations(ty);
5025         if !ty.is_ty_var() {
5026             ty
5027         } else {
5028             if !self.is_tainted_by_errors() {
5029                 self.need_type_info_err((**self).body_id, sp, ty)
5030                     .note("type must be known at this point")
5031                     .emit();
5032             }
5033             self.demand_suptype(sp, self.tcx.types.err, ty);
5034             self.tcx.types.err
5035         }
5036     }
5037
5038     fn with_breakable_ctxt<F: FnOnce() -> R, R>(
5039         &self,
5040         id: hir::HirId,
5041         ctxt: BreakableCtxt<'tcx>,
5042         f: F,
5043     ) -> (BreakableCtxt<'tcx>, R) {
5044         let index;
5045         {
5046             let mut enclosing_breakables = self.enclosing_breakables.borrow_mut();
5047             index = enclosing_breakables.stack.len();
5048             enclosing_breakables.by_id.insert(id, index);
5049             enclosing_breakables.stack.push(ctxt);
5050         }
5051         let result = f();
5052         let ctxt = {
5053             let mut enclosing_breakables = self.enclosing_breakables.borrow_mut();
5054             debug_assert!(enclosing_breakables.stack.len() == index + 1);
5055             enclosing_breakables.by_id.remove(&id).expect("missing breakable context");
5056             enclosing_breakables.stack.pop().expect("missing breakable context")
5057         };
5058         (ctxt, result)
5059     }
5060
5061     /// Instantiate a QueryResponse in a probe context, without a
5062     /// good ObligationCause.
5063     fn probe_instantiate_query_response(
5064         &self,
5065         span: Span,
5066         original_values: &OriginalQueryValues<'tcx>,
5067         query_result: &Canonical<'tcx, QueryResponse<'tcx, Ty<'tcx>>>,
5068     ) -> InferResult<'tcx, Ty<'tcx>>
5069     {
5070         self.instantiate_query_response_and_region_obligations(
5071             &traits::ObligationCause::misc(span, self.body_id),
5072             self.param_env,
5073             original_values,
5074             query_result)
5075     }
5076
5077     /// Returns `true` if an expression is contained inside the LHS of an assignment expression.
5078     fn expr_in_place(&self, mut expr_id: hir::HirId) -> bool {
5079         let mut contained_in_place = false;
5080
5081         while let hir::Node::Expr(parent_expr) =
5082             self.tcx.hir().get(self.tcx.hir().get_parent_node(expr_id))
5083         {
5084             match &parent_expr.kind {
5085                 hir::ExprKind::Assign(lhs, ..) | hir::ExprKind::AssignOp(_, lhs, ..) => {
5086                     if lhs.hir_id == expr_id {
5087                         contained_in_place = true;
5088                         break;
5089                     }
5090                 }
5091                 _ => (),
5092             }
5093             expr_id = parent_expr.hir_id;
5094         }
5095
5096         contained_in_place
5097     }
5098 }
5099
5100 pub fn check_bounds_are_used<'tcx>(tcx: TyCtxt<'tcx>, generics: &ty::Generics, ty: Ty<'tcx>) {
5101     let own_counts = generics.own_counts();
5102     debug!(
5103         "check_bounds_are_used(n_tys={}, n_cts={}, ty={:?})",
5104         own_counts.types,
5105         own_counts.consts,
5106         ty
5107     );
5108
5109     if own_counts.types == 0 {
5110         return;
5111     }
5112
5113     // Make a vector of booleans initially `false`; set to `true` when used.
5114     let mut types_used = vec![false; own_counts.types];
5115
5116     for leaf_ty in ty.walk() {
5117         if let ty::Param(ty::ParamTy { index, .. }) = leaf_ty.kind {
5118             debug!("found use of ty param num {}", index);
5119             types_used[index as usize - own_counts.lifetimes] = true;
5120         } else if let ty::Error = leaf_ty.kind {
5121             // If there is already another error, do not emit
5122             // an error for not using a type parameter.
5123             assert!(tcx.sess.has_errors());
5124             return;
5125         }
5126     }
5127
5128     let types = generics.params.iter().filter(|param| match param.kind {
5129         ty::GenericParamDefKind::Type { .. } => true,
5130         _ => false,
5131     });
5132     for (&used, param) in types_used.iter().zip(types) {
5133         if !used {
5134             let id = tcx.hir().as_local_hir_id(param.def_id).unwrap();
5135             let span = tcx.hir().span(id);
5136             struct_span_err!(tcx.sess, span, E0091, "type parameter `{}` is unused", param.name)
5137                 .span_label(span, "unused type parameter")
5138                 .emit();
5139         }
5140     }
5141 }
5142
5143 fn fatally_break_rust(sess: &Session) {
5144     let handler = sess.diagnostic();
5145     handler.span_bug_no_panic(
5146         MultiSpan::new(),
5147         "It looks like you're trying to break rust; would you like some ICE?",
5148     );
5149     handler.note_without_error("the compiler expectedly panicked. this is a feature.");
5150     handler.note_without_error(
5151         "we would appreciate a joke overview: \
5152         https://github.com/rust-lang/rust/issues/43162#issuecomment-320764675"
5153     );
5154     handler.note_without_error(&format!("rustc {} running on {}",
5155         option_env!("CFG_VERSION").unwrap_or("unknown_version"),
5156         crate::session::config::host_triple(),
5157     ));
5158 }
5159
5160 fn potentially_plural_count(count: usize, word: &str) -> String {
5161     format!("{} {}{}", count, word, pluralise!(count))
5162 }