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