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