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