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