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