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