]> git.lizzy.rs Git - rust.git/blob - src/librustc_typeck/check/mod.rs
Auto merge of #71331 - Dylan-DPC:rollup-5rn1isc, r=Dylan-DPC
[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 {
1643             origin: hir::OpaqueTyOrigin::AsyncFn | hir::OpaqueTyOrigin::FnReturn,
1644             ..
1645         }) => {
1646             let mut visitor = ProhibitOpaqueVisitor {
1647                 opaque_identity_ty: tcx
1648                     .mk_opaque(def_id, InternalSubsts::identity_for_item(tcx, def_id)),
1649                 generics: tcx.generics_of(def_id),
1650             };
1651             debug!("check_opaque_for_inheriting_lifetimes: visitor={:?}", visitor);
1652
1653             tcx.predicates_of(def_id)
1654                 .predicates
1655                 .iter()
1656                 .any(|(predicate, _)| predicate.visit_with(&mut visitor))
1657         }
1658         _ => false,
1659     };
1660
1661     debug!("check_opaque_for_inheriting_lifetimes: prohibit_opaque={:?}", prohibit_opaque);
1662     if prohibit_opaque {
1663         let is_async = match item.kind {
1664             ItemKind::OpaqueTy(hir::OpaqueTy { origin, .. }) => match origin {
1665                 hir::OpaqueTyOrigin::AsyncFn => true,
1666                 _ => false,
1667             },
1668             _ => unreachable!(),
1669         };
1670
1671         tcx.sess.span_err(
1672             span,
1673             &format!(
1674             "`{}` return type cannot contain a projection or `Self` that references lifetimes from \
1675              a parent scope",
1676             if is_async { "async fn" } else { "impl Trait" },
1677         ),
1678         );
1679     }
1680 }
1681
1682 /// Checks that an opaque type does not contain cycles.
1683 fn check_opaque_for_cycles<'tcx>(
1684     tcx: TyCtxt<'tcx>,
1685     def_id: DefId,
1686     substs: SubstsRef<'tcx>,
1687     span: Span,
1688     origin: &hir::OpaqueTyOrigin,
1689 ) {
1690     if let Err(partially_expanded_type) = tcx.try_expand_impl_trait_type(def_id, substs) {
1691         if let hir::OpaqueTyOrigin::AsyncFn = origin {
1692             struct_span_err!(tcx.sess, span, E0733, "recursion in an `async fn` requires boxing",)
1693                 .span_label(span, "recursive `async fn`")
1694                 .note("a recursive `async fn` must be rewritten to return a boxed `dyn Future`")
1695                 .emit();
1696         } else {
1697             let mut err =
1698                 struct_span_err!(tcx.sess, span, E0720, "opaque type expands to a recursive type",);
1699             err.span_label(span, "expands to a recursive type");
1700             if let ty::Opaque(..) = partially_expanded_type.kind {
1701                 err.note("type resolves to itself");
1702             } else {
1703                 err.note(&format!("expanded type is `{}`", partially_expanded_type));
1704             }
1705             err.emit();
1706         }
1707     }
1708 }
1709
1710 // Forbid defining intrinsics in Rust code,
1711 // as they must always be defined by the compiler.
1712 fn fn_maybe_err(tcx: TyCtxt<'_>, sp: Span, abi: Abi) {
1713     if let Abi::RustIntrinsic | Abi::PlatformIntrinsic = abi {
1714         tcx.sess.span_err(sp, "intrinsic must be in `extern \"rust-intrinsic\" { ... }` block");
1715     }
1716 }
1717
1718 pub fn check_item_type<'tcx>(tcx: TyCtxt<'tcx>, it: &'tcx hir::Item<'tcx>) {
1719     debug!(
1720         "check_item_type(it.hir_id={}, it.name={})",
1721         it.hir_id,
1722         tcx.def_path_str(tcx.hir().local_def_id(it.hir_id))
1723     );
1724     let _indenter = indenter();
1725     match it.kind {
1726         // Consts can play a role in type-checking, so they are included here.
1727         hir::ItemKind::Static(..) => {
1728             let def_id = tcx.hir().local_def_id(it.hir_id);
1729             tcx.typeck_tables_of(def_id);
1730             maybe_check_static_with_link_section(tcx, def_id, it.span);
1731         }
1732         hir::ItemKind::Const(..) => {
1733             tcx.typeck_tables_of(tcx.hir().local_def_id(it.hir_id));
1734         }
1735         hir::ItemKind::Enum(ref enum_definition, _) => {
1736             check_enum(tcx, it.span, &enum_definition.variants, it.hir_id);
1737         }
1738         hir::ItemKind::Fn(..) => {} // entirely within check_item_body
1739         hir::ItemKind::Impl { ref items, .. } => {
1740             debug!("ItemKind::Impl {} with id {}", it.ident, it.hir_id);
1741             let impl_def_id = tcx.hir().local_def_id(it.hir_id);
1742             if let Some(impl_trait_ref) = tcx.impl_trait_ref(impl_def_id) {
1743                 check_impl_items_against_trait(tcx, it.span, impl_def_id, impl_trait_ref, items);
1744                 let trait_def_id = impl_trait_ref.def_id;
1745                 check_on_unimplemented(tcx, trait_def_id, it);
1746             }
1747         }
1748         hir::ItemKind::Trait(_, _, _, _, ref items) => {
1749             let def_id = tcx.hir().local_def_id(it.hir_id);
1750             check_on_unimplemented(tcx, def_id, it);
1751
1752             for item in items.iter() {
1753                 let item = tcx.hir().trait_item(item.id);
1754                 if let hir::TraitItemKind::Fn(sig, _) = &item.kind {
1755                     let abi = sig.header.abi;
1756                     fn_maybe_err(tcx, item.ident.span, abi);
1757                 }
1758             }
1759         }
1760         hir::ItemKind::Struct(..) => {
1761             check_struct(tcx, it.hir_id, it.span);
1762         }
1763         hir::ItemKind::Union(..) => {
1764             check_union(tcx, it.hir_id, it.span);
1765         }
1766         hir::ItemKind::OpaqueTy(hir::OpaqueTy { origin, .. }) => {
1767             let def_id = tcx.hir().local_def_id(it.hir_id);
1768
1769             let substs = InternalSubsts::identity_for_item(tcx, def_id);
1770             check_opaque(tcx, def_id, substs, it.span, &origin);
1771         }
1772         hir::ItemKind::TyAlias(..) => {
1773             let def_id = tcx.hir().local_def_id(it.hir_id);
1774             let pty_ty = tcx.type_of(def_id);
1775             let generics = tcx.generics_of(def_id);
1776             check_type_params_are_used(tcx, &generics, pty_ty);
1777         }
1778         hir::ItemKind::ForeignMod(ref m) => {
1779             check_abi(tcx, it.span, m.abi);
1780
1781             if m.abi == Abi::RustIntrinsic {
1782                 for item in m.items {
1783                     intrinsic::check_intrinsic_type(tcx, item);
1784                 }
1785             } else if m.abi == Abi::PlatformIntrinsic {
1786                 for item in m.items {
1787                     intrinsic::check_platform_intrinsic_type(tcx, item);
1788                 }
1789             } else {
1790                 for item in m.items {
1791                     let generics = tcx.generics_of(tcx.hir().local_def_id(item.hir_id));
1792                     let own_counts = generics.own_counts();
1793                     if generics.params.len() - own_counts.lifetimes != 0 {
1794                         let (kinds, kinds_pl, egs) = match (own_counts.types, own_counts.consts) {
1795                             (_, 0) => ("type", "types", Some("u32")),
1796                             // We don't specify an example value, because we can't generate
1797                             // a valid value for any type.
1798                             (0, _) => ("const", "consts", None),
1799                             _ => ("type or const", "types or consts", None),
1800                         };
1801                         struct_span_err!(
1802                             tcx.sess,
1803                             item.span,
1804                             E0044,
1805                             "foreign items may not have {} parameters",
1806                             kinds,
1807                         )
1808                         .span_label(item.span, &format!("can't have {} parameters", kinds))
1809                         .help(
1810                             // FIXME: once we start storing spans for type arguments, turn this
1811                             // into a suggestion.
1812                             &format!(
1813                                 "replace the {} parameters with concrete {}{}",
1814                                 kinds,
1815                                 kinds_pl,
1816                                 egs.map(|egs| format!(" like `{}`", egs)).unwrap_or_default(),
1817                             ),
1818                         )
1819                         .emit();
1820                     }
1821
1822                     if let hir::ForeignItemKind::Fn(ref fn_decl, _, _) = item.kind {
1823                         require_c_abi_if_c_variadic(tcx, fn_decl, m.abi, item.span);
1824                     }
1825                 }
1826             }
1827         }
1828         _ => { /* nothing to do */ }
1829     }
1830 }
1831
1832 fn maybe_check_static_with_link_section(tcx: TyCtxt<'_>, id: DefId, span: Span) {
1833     // Only restricted on wasm32 target for now
1834     if !tcx.sess.opts.target_triple.triple().starts_with("wasm32") {
1835         return;
1836     }
1837
1838     // If `#[link_section]` is missing, then nothing to verify
1839     let attrs = tcx.codegen_fn_attrs(id);
1840     if attrs.link_section.is_none() {
1841         return;
1842     }
1843
1844     // For the wasm32 target statics with `#[link_section]` are placed into custom
1845     // sections of the final output file, but this isn't link custom sections of
1846     // other executable formats. Namely we can only embed a list of bytes,
1847     // nothing with pointers to anything else or relocations. If any relocation
1848     // show up, reject them here.
1849     // `#[link_section]` may contain arbitrary, or even undefined bytes, but it is
1850     // the consumer's responsibility to ensure all bytes that have been read
1851     // have defined values.
1852     match tcx.const_eval_poly(id) {
1853         Ok(ConstValue::ByRef { alloc, .. }) => {
1854             if alloc.relocations().len() != 0 {
1855                 let msg = "statics with a custom `#[link_section]` must be a \
1856                            simple list of bytes on the wasm target with no \
1857                            extra levels of indirection such as references";
1858                 tcx.sess.span_err(span, msg);
1859             }
1860         }
1861         Ok(_) => bug!("Matching on non-ByRef static"),
1862         Err(_) => {}
1863     }
1864 }
1865
1866 fn check_on_unimplemented(tcx: TyCtxt<'_>, trait_def_id: DefId, item: &hir::Item<'_>) {
1867     let item_def_id = tcx.hir().local_def_id(item.hir_id);
1868     // an error would be reported if this fails.
1869     let _ = traits::OnUnimplementedDirective::of_item(tcx, trait_def_id, item_def_id);
1870 }
1871
1872 fn report_forbidden_specialization(
1873     tcx: TyCtxt<'_>,
1874     impl_item: &hir::ImplItem<'_>,
1875     parent_impl: DefId,
1876 ) {
1877     let mut err = struct_span_err!(
1878         tcx.sess,
1879         impl_item.span,
1880         E0520,
1881         "`{}` specializes an item from a parent `impl`, but \
1882          that item is not marked `default`",
1883         impl_item.ident
1884     );
1885     err.span_label(impl_item.span, format!("cannot specialize default item `{}`", impl_item.ident));
1886
1887     match tcx.span_of_impl(parent_impl) {
1888         Ok(span) => {
1889             err.span_label(span, "parent `impl` is here");
1890             err.note(&format!(
1891                 "to specialize, `{}` in the parent `impl` must be marked `default`",
1892                 impl_item.ident
1893             ));
1894         }
1895         Err(cname) => {
1896             err.note(&format!("parent implementation is in crate `{}`", cname));
1897         }
1898     }
1899
1900     err.emit();
1901 }
1902
1903 fn check_specialization_validity<'tcx>(
1904     tcx: TyCtxt<'tcx>,
1905     trait_def: &ty::TraitDef,
1906     trait_item: &ty::AssocItem,
1907     impl_id: DefId,
1908     impl_item: &hir::ImplItem<'_>,
1909 ) {
1910     let kind = match impl_item.kind {
1911         hir::ImplItemKind::Const(..) => ty::AssocKind::Const,
1912         hir::ImplItemKind::Fn(..) => ty::AssocKind::Fn,
1913         hir::ImplItemKind::OpaqueTy(..) => ty::AssocKind::OpaqueTy,
1914         hir::ImplItemKind::TyAlias(_) => ty::AssocKind::Type,
1915     };
1916
1917     let ancestors = match trait_def.ancestors(tcx, impl_id) {
1918         Ok(ancestors) => ancestors,
1919         Err(_) => return,
1920     };
1921     let mut ancestor_impls = ancestors
1922         .skip(1)
1923         .filter_map(|parent| {
1924             if parent.is_from_trait() {
1925                 None
1926             } else {
1927                 Some((parent, parent.item(tcx, trait_item.ident, kind, trait_def.def_id)))
1928             }
1929         })
1930         .peekable();
1931
1932     if ancestor_impls.peek().is_none() {
1933         // No parent, nothing to specialize.
1934         return;
1935     }
1936
1937     let opt_result = ancestor_impls.find_map(|(parent_impl, parent_item)| {
1938         match parent_item {
1939             // Parent impl exists, and contains the parent item we're trying to specialize, but
1940             // doesn't mark it `default`.
1941             Some(parent_item) if traits::impl_item_is_final(tcx, &parent_item) => {
1942                 Some(Err(parent_impl.def_id()))
1943             }
1944
1945             // Parent impl contains item and makes it specializable.
1946             Some(_) => Some(Ok(())),
1947
1948             // Parent impl doesn't mention the item. This means it's inherited from the
1949             // grandparent. In that case, if parent is a `default impl`, inherited items use the
1950             // "defaultness" from the grandparent, else they are final.
1951             None => {
1952                 if tcx.impl_defaultness(parent_impl.def_id()).is_default() {
1953                     None
1954                 } else {
1955                     Some(Err(parent_impl.def_id()))
1956                 }
1957             }
1958         }
1959     });
1960
1961     // If `opt_result` is `None`, we have only encountered `default impl`s that don't contain the
1962     // item. This is allowed, the item isn't actually getting specialized here.
1963     let result = opt_result.unwrap_or(Ok(()));
1964
1965     if let Err(parent_impl) = result {
1966         report_forbidden_specialization(tcx, impl_item, parent_impl);
1967     }
1968 }
1969
1970 fn check_impl_items_against_trait<'tcx>(
1971     tcx: TyCtxt<'tcx>,
1972     full_impl_span: Span,
1973     impl_id: DefId,
1974     impl_trait_ref: ty::TraitRef<'tcx>,
1975     impl_item_refs: &[hir::ImplItemRef<'_>],
1976 ) {
1977     let impl_span = tcx.sess.source_map().guess_head_span(full_impl_span);
1978
1979     // If the trait reference itself is erroneous (so the compilation is going
1980     // to fail), skip checking the items here -- the `impl_item` table in `tcx`
1981     // isn't populated for such impls.
1982     if impl_trait_ref.references_error() {
1983         return;
1984     }
1985
1986     // Negative impls are not expected to have any items
1987     match tcx.impl_polarity(impl_id) {
1988         ty::ImplPolarity::Reservation | ty::ImplPolarity::Positive => {}
1989         ty::ImplPolarity::Negative => {
1990             if let [first_item_ref, ..] = impl_item_refs {
1991                 let first_item_span = tcx.hir().impl_item(first_item_ref.id).span;
1992                 struct_span_err!(
1993                     tcx.sess,
1994                     first_item_span,
1995                     E0749,
1996                     "negative impls cannot have any items"
1997                 )
1998                 .emit();
1999             }
2000             return;
2001         }
2002     }
2003
2004     // Locate trait definition and items
2005     let trait_def = tcx.trait_def(impl_trait_ref.def_id);
2006
2007     let impl_items = || impl_item_refs.iter().map(|iiref| tcx.hir().impl_item(iiref.id));
2008
2009     // Check existing impl methods to see if they are both present in trait
2010     // and compatible with trait signature
2011     for impl_item in impl_items() {
2012         let namespace = impl_item.kind.namespace();
2013         let ty_impl_item = tcx.associated_item(tcx.hir().local_def_id(impl_item.hir_id));
2014         let ty_trait_item = tcx
2015             .associated_items(impl_trait_ref.def_id)
2016             .find_by_name_and_namespace(tcx, ty_impl_item.ident, namespace, impl_trait_ref.def_id)
2017             .or_else(|| {
2018                 // Not compatible, but needed for the error message
2019                 tcx.associated_items(impl_trait_ref.def_id)
2020                     .filter_by_name(tcx, ty_impl_item.ident, impl_trait_ref.def_id)
2021                     .next()
2022             });
2023
2024         // Check that impl definition matches trait definition
2025         if let Some(ty_trait_item) = ty_trait_item {
2026             match impl_item.kind {
2027                 hir::ImplItemKind::Const(..) => {
2028                     // Find associated const definition.
2029                     if ty_trait_item.kind == ty::AssocKind::Const {
2030                         compare_const_impl(
2031                             tcx,
2032                             &ty_impl_item,
2033                             impl_item.span,
2034                             &ty_trait_item,
2035                             impl_trait_ref,
2036                         );
2037                     } else {
2038                         let mut err = struct_span_err!(
2039                             tcx.sess,
2040                             impl_item.span,
2041                             E0323,
2042                             "item `{}` is an associated const, \
2043                              which doesn't match its trait `{}`",
2044                             ty_impl_item.ident,
2045                             impl_trait_ref.print_only_trait_path()
2046                         );
2047                         err.span_label(impl_item.span, "does not match trait");
2048                         // We can only get the spans from local trait definition
2049                         // Same for E0324 and E0325
2050                         if let Some(trait_span) = tcx.hir().span_if_local(ty_trait_item.def_id) {
2051                             err.span_label(trait_span, "item in trait");
2052                         }
2053                         err.emit()
2054                     }
2055                 }
2056                 hir::ImplItemKind::Fn(..) => {
2057                     let opt_trait_span = tcx.hir().span_if_local(ty_trait_item.def_id);
2058                     if ty_trait_item.kind == ty::AssocKind::Fn {
2059                         compare_impl_method(
2060                             tcx,
2061                             &ty_impl_item,
2062                             impl_item.span,
2063                             &ty_trait_item,
2064                             impl_trait_ref,
2065                             opt_trait_span,
2066                         );
2067                     } else {
2068                         let mut err = struct_span_err!(
2069                             tcx.sess,
2070                             impl_item.span,
2071                             E0324,
2072                             "item `{}` is an associated method, \
2073                              which doesn't match its trait `{}`",
2074                             ty_impl_item.ident,
2075                             impl_trait_ref.print_only_trait_path()
2076                         );
2077                         err.span_label(impl_item.span, "does not match trait");
2078                         if let Some(trait_span) = opt_trait_span {
2079                             err.span_label(trait_span, "item in trait");
2080                         }
2081                         err.emit()
2082                     }
2083                 }
2084                 hir::ImplItemKind::OpaqueTy(..) | hir::ImplItemKind::TyAlias(_) => {
2085                     let opt_trait_span = tcx.hir().span_if_local(ty_trait_item.def_id);
2086                     if ty_trait_item.kind == ty::AssocKind::Type {
2087                         compare_ty_impl(
2088                             tcx,
2089                             &ty_impl_item,
2090                             impl_item.span,
2091                             &ty_trait_item,
2092                             impl_trait_ref,
2093                             opt_trait_span,
2094                         )
2095                     } else {
2096                         let mut err = struct_span_err!(
2097                             tcx.sess,
2098                             impl_item.span,
2099                             E0325,
2100                             "item `{}` is an associated type, \
2101                              which doesn't match its trait `{}`",
2102                             ty_impl_item.ident,
2103                             impl_trait_ref.print_only_trait_path()
2104                         );
2105                         err.span_label(impl_item.span, "does not match trait");
2106                         if let Some(trait_span) = opt_trait_span {
2107                             err.span_label(trait_span, "item in trait");
2108                         }
2109                         err.emit()
2110                     }
2111                 }
2112             }
2113
2114             check_specialization_validity(tcx, trait_def, &ty_trait_item, impl_id, impl_item);
2115         }
2116     }
2117
2118     // Check for missing items from trait
2119     let mut missing_items = Vec::new();
2120     if let Ok(ancestors) = trait_def.ancestors(tcx, impl_id) {
2121         for trait_item in tcx.associated_items(impl_trait_ref.def_id).in_definition_order() {
2122             let is_implemented = ancestors
2123                 .leaf_def(tcx, trait_item.ident, trait_item.kind)
2124                 .map(|node_item| !node_item.defining_node.is_from_trait())
2125                 .unwrap_or(false);
2126
2127             if !is_implemented && tcx.impl_defaultness(impl_id).is_final() {
2128                 if !trait_item.defaultness.has_value() {
2129                     missing_items.push(*trait_item);
2130                 }
2131             }
2132         }
2133     }
2134
2135     if !missing_items.is_empty() {
2136         missing_items_err(tcx, impl_span, &missing_items, full_impl_span);
2137     }
2138 }
2139
2140 fn missing_items_err(
2141     tcx: TyCtxt<'_>,
2142     impl_span: Span,
2143     missing_items: &[ty::AssocItem],
2144     full_impl_span: Span,
2145 ) {
2146     let missing_items_msg = missing_items
2147         .iter()
2148         .map(|trait_item| trait_item.ident.to_string())
2149         .collect::<Vec<_>>()
2150         .join("`, `");
2151
2152     let mut err = struct_span_err!(
2153         tcx.sess,
2154         impl_span,
2155         E0046,
2156         "not all trait items implemented, missing: `{}`",
2157         missing_items_msg
2158     );
2159     err.span_label(impl_span, format!("missing `{}` in implementation", missing_items_msg));
2160
2161     // `Span` before impl block closing brace.
2162     let hi = full_impl_span.hi() - BytePos(1);
2163     // Point at the place right before the closing brace of the relevant `impl` to suggest
2164     // adding the associated item at the end of its body.
2165     let sugg_sp = full_impl_span.with_lo(hi).with_hi(hi);
2166     // Obtain the level of indentation ending in `sugg_sp`.
2167     let indentation = tcx.sess.source_map().span_to_margin(sugg_sp).unwrap_or(0);
2168     // Make the whitespace that will make the suggestion have the right indentation.
2169     let padding: String = (0..indentation).map(|_| " ").collect();
2170
2171     for trait_item in missing_items {
2172         let snippet = suggestion_signature(&trait_item, tcx);
2173         let code = format!("{}{}\n{}", padding, snippet, padding);
2174         let msg = format!("implement the missing item: `{}`", snippet);
2175         let appl = Applicability::HasPlaceholders;
2176         if let Some(span) = tcx.hir().span_if_local(trait_item.def_id) {
2177             err.span_label(span, format!("`{}` from trait", trait_item.ident));
2178             err.tool_only_span_suggestion(sugg_sp, &msg, code, appl);
2179         } else {
2180             err.span_suggestion_hidden(sugg_sp, &msg, code, appl);
2181         }
2182     }
2183     err.emit();
2184 }
2185
2186 /// Resugar `ty::GenericPredicates` in a way suitable to be used in structured suggestions.
2187 fn bounds_from_generic_predicates(
2188     tcx: TyCtxt<'_>,
2189     predicates: ty::GenericPredicates<'_>,
2190 ) -> (String, String) {
2191     let mut types: FxHashMap<Ty<'_>, Vec<DefId>> = FxHashMap::default();
2192     let mut projections = vec![];
2193     for (predicate, _) in predicates.predicates {
2194         debug!("predicate {:?}", predicate);
2195         match predicate {
2196             ty::Predicate::Trait(trait_predicate, _) => {
2197                 let entry = types.entry(trait_predicate.skip_binder().self_ty()).or_default();
2198                 let def_id = trait_predicate.skip_binder().def_id();
2199                 if Some(def_id) != tcx.lang_items().sized_trait() {
2200                     // Type params are `Sized` by default, do not add that restriction to the list
2201                     // if it is a positive requirement.
2202                     entry.push(trait_predicate.skip_binder().def_id());
2203                 }
2204             }
2205             ty::Predicate::Projection(projection_pred) => {
2206                 projections.push(projection_pred);
2207             }
2208             _ => {}
2209         }
2210     }
2211     let generics = if types.is_empty() {
2212         "".to_string()
2213     } else {
2214         format!(
2215             "<{}>",
2216             types
2217                 .keys()
2218                 .filter_map(|t| match t.kind {
2219                     ty::Param(_) => Some(t.to_string()),
2220                     // Avoid suggesting the following:
2221                     // fn foo<T, <T as Trait>::Bar>(_: T) where T: Trait, <T as Trait>::Bar: Other {}
2222                     _ => None,
2223                 })
2224                 .collect::<Vec<_>>()
2225                 .join(", ")
2226         )
2227     };
2228     let mut where_clauses = vec![];
2229     for (ty, bounds) in types {
2230         for bound in &bounds {
2231             where_clauses.push(format!("{}: {}", ty, tcx.def_path_str(*bound)));
2232         }
2233     }
2234     for projection in &projections {
2235         let p = projection.skip_binder();
2236         // FIXME: this is not currently supported syntax, we should be looking at the `types` and
2237         // insert the associated types where they correspond, but for now let's be "lazy" and
2238         // propose this instead of the following valid resugaring:
2239         // `T: Trait, Trait::Assoc = K` â†’ `T: Trait<Assoc = K>`
2240         where_clauses.push(format!("{} = {}", tcx.def_path_str(p.projection_ty.item_def_id), p.ty));
2241     }
2242     let where_clauses = if where_clauses.is_empty() {
2243         String::new()
2244     } else {
2245         format!(" where {}", where_clauses.join(", "))
2246     };
2247     (generics, where_clauses)
2248 }
2249
2250 /// Return placeholder code for the given function.
2251 fn fn_sig_suggestion(
2252     tcx: TyCtxt<'_>,
2253     sig: &ty::FnSig<'_>,
2254     ident: Ident,
2255     predicates: ty::GenericPredicates<'_>,
2256     assoc: &ty::AssocItem,
2257 ) -> String {
2258     let args = sig
2259         .inputs()
2260         .iter()
2261         .enumerate()
2262         .map(|(i, ty)| {
2263             Some(match ty.kind {
2264                 ty::Param(_) if assoc.fn_has_self_parameter && i == 0 => "self".to_string(),
2265                 ty::Ref(reg, ref_ty, mutability) if i == 0 => {
2266                     let reg = match &format!("{}", reg)[..] {
2267                         "'_" | "" => String::new(),
2268                         reg => format!("{} ", reg),
2269                     };
2270                     if assoc.fn_has_self_parameter {
2271                         match ref_ty.kind {
2272                             ty::Param(param) if param.name == kw::SelfUpper => {
2273                                 format!("&{}{}self", reg, mutability.prefix_str())
2274                             }
2275
2276                             _ => format!("self: {}", ty),
2277                         }
2278                     } else {
2279                         format!("_: {:?}", ty)
2280                     }
2281                 }
2282                 _ => {
2283                     if assoc.fn_has_self_parameter && i == 0 {
2284                         format!("self: {:?}", ty)
2285                     } else {
2286                         format!("_: {:?}", ty)
2287                     }
2288                 }
2289             })
2290         })
2291         .chain(std::iter::once(if sig.c_variadic { Some("...".to_string()) } else { None }))
2292         .filter_map(|arg| arg)
2293         .collect::<Vec<String>>()
2294         .join(", ");
2295     let output = sig.output();
2296     let output = if !output.is_unit() { format!(" -> {:?}", output) } else { String::new() };
2297
2298     let unsafety = sig.unsafety.prefix_str();
2299     let (generics, where_clauses) = bounds_from_generic_predicates(tcx, predicates);
2300
2301     // FIXME: this is not entirely correct, as the lifetimes from borrowed params will
2302     // not be present in the `fn` definition, not will we account for renamed
2303     // lifetimes between the `impl` and the `trait`, but this should be good enough to
2304     // fill in a significant portion of the missing code, and other subsequent
2305     // suggestions can help the user fix the code.
2306     format!(
2307         "{}fn {}{}({}){}{} {{ todo!() }}",
2308         unsafety, ident, generics, args, output, where_clauses
2309     )
2310 }
2311
2312 /// Return placeholder code for the given associated item.
2313 /// Similar to `ty::AssocItem::suggestion`, but appropriate for use as the code snippet of a
2314 /// structured suggestion.
2315 fn suggestion_signature(assoc: &ty::AssocItem, tcx: TyCtxt<'_>) -> String {
2316     match assoc.kind {
2317         ty::AssocKind::Fn => {
2318             // We skip the binder here because the binder would deanonymize all
2319             // late-bound regions, and we don't want method signatures to show up
2320             // `as for<'r> fn(&'r MyType)`.  Pretty-printing handles late-bound
2321             // regions just fine, showing `fn(&MyType)`.
2322             fn_sig_suggestion(
2323                 tcx,
2324                 tcx.fn_sig(assoc.def_id).skip_binder(),
2325                 assoc.ident,
2326                 tcx.predicates_of(assoc.def_id),
2327                 assoc,
2328             )
2329         }
2330         ty::AssocKind::Type => format!("type {} = Type;", assoc.ident),
2331         // FIXME(type_alias_impl_trait): we should print bounds here too.
2332         ty::AssocKind::OpaqueTy => format!("type {} = Type;", assoc.ident),
2333         ty::AssocKind::Const => {
2334             let ty = tcx.type_of(assoc.def_id);
2335             let val = expr::ty_kind_suggestion(ty).unwrap_or("value");
2336             format!("const {}: {:?} = {};", assoc.ident, ty, val)
2337         }
2338     }
2339 }
2340
2341 /// Checks whether a type can be represented in memory. In particular, it
2342 /// identifies types that contain themselves without indirection through a
2343 /// pointer, which would mean their size is unbounded.
2344 fn check_representable(tcx: TyCtxt<'_>, sp: Span, item_def_id: DefId) -> bool {
2345     let rty = tcx.type_of(item_def_id);
2346
2347     // Check that it is possible to represent this type. This call identifies
2348     // (1) types that contain themselves and (2) types that contain a different
2349     // recursive type. It is only necessary to throw an error on those that
2350     // contain themselves. For case 2, there must be an inner type that will be
2351     // caught by case 1.
2352     match rty.is_representable(tcx, sp) {
2353         Representability::SelfRecursive(spans) => {
2354             let mut err = recursive_type_with_infinite_size_error(tcx, item_def_id);
2355             for span in spans {
2356                 err.span_label(span, "recursive without indirection");
2357             }
2358             err.emit();
2359             return false;
2360         }
2361         Representability::Representable | Representability::ContainsRecursive => (),
2362     }
2363     true
2364 }
2365
2366 pub fn check_simd(tcx: TyCtxt<'_>, sp: Span, def_id: DefId) {
2367     let t = tcx.type_of(def_id);
2368     if let ty::Adt(def, substs) = t.kind {
2369         if def.is_struct() {
2370             let fields = &def.non_enum_variant().fields;
2371             if fields.is_empty() {
2372                 struct_span_err!(tcx.sess, sp, E0075, "SIMD vector cannot be empty").emit();
2373                 return;
2374             }
2375             let e = fields[0].ty(tcx, substs);
2376             if !fields.iter().all(|f| f.ty(tcx, substs) == e) {
2377                 struct_span_err!(tcx.sess, sp, E0076, "SIMD vector should be homogeneous")
2378                     .span_label(sp, "SIMD elements must have the same type")
2379                     .emit();
2380                 return;
2381             }
2382             match e.kind {
2383                 ty::Param(_) => { /* struct<T>(T, T, T, T) is ok */ }
2384                 _ if e.is_machine() => { /* struct(u8, u8, u8, u8) is ok */ }
2385                 _ => {
2386                     struct_span_err!(
2387                         tcx.sess,
2388                         sp,
2389                         E0077,
2390                         "SIMD vector element type should be machine type"
2391                     )
2392                     .emit();
2393                     return;
2394                 }
2395             }
2396         }
2397     }
2398 }
2399
2400 fn check_packed(tcx: TyCtxt<'_>, sp: Span, def_id: DefId) {
2401     let repr = tcx.adt_def(def_id).repr;
2402     if repr.packed() {
2403         for attr in tcx.get_attrs(def_id).iter() {
2404             for r in attr::find_repr_attrs(&tcx.sess.parse_sess, attr) {
2405                 if let attr::ReprPacked(pack) = r {
2406                     if let Some(repr_pack) = repr.pack {
2407                         if pack as u64 != repr_pack.bytes() {
2408                             struct_span_err!(
2409                                 tcx.sess,
2410                                 sp,
2411                                 E0634,
2412                                 "type has conflicting packed representation hints"
2413                             )
2414                             .emit();
2415                         }
2416                     }
2417                 }
2418             }
2419         }
2420         if repr.align.is_some() {
2421             struct_span_err!(
2422                 tcx.sess,
2423                 sp,
2424                 E0587,
2425                 "type has conflicting packed and align representation hints"
2426             )
2427             .emit();
2428         } else {
2429             if let Some(def_spans) = check_packed_inner(tcx, def_id, &mut vec![]) {
2430                 let mut err = struct_span_err!(
2431                     tcx.sess,
2432                     sp,
2433                     E0588,
2434                     "packed type cannot transitively contain a `#[repr(align)]` type"
2435                 );
2436
2437                 let hir = tcx.hir();
2438                 if let Some(hir_id) = hir.as_local_hir_id(def_spans[0].0) {
2439                     if let Node::Item(Item { ident, .. }) = hir.get(hir_id) {
2440                         err.span_note(
2441                             tcx.def_span(def_spans[0].0),
2442                             &format!("`{}` has a `#[repr(align)]` attribute", ident),
2443                         );
2444                     }
2445                 }
2446
2447                 if def_spans.len() > 2 {
2448                     let mut first = true;
2449                     for (adt_def, span) in def_spans.iter().skip(1).rev() {
2450                         if let Some(hir_id) = hir.as_local_hir_id(*adt_def) {
2451                             if let Node::Item(Item { ident, .. }) = hir.get(hir_id) {
2452                                 err.span_note(
2453                                     *span,
2454                                     &if first {
2455                                         format!(
2456                                             "`{}` contains a field of type `{}`",
2457                                             tcx.type_of(def_id),
2458                                             ident
2459                                         )
2460                                     } else {
2461                                         format!("...which contains a field of type `{}`", ident)
2462                                     },
2463                                 );
2464                                 first = false;
2465                             }
2466                         }
2467                     }
2468                 }
2469
2470                 err.emit();
2471             }
2472         }
2473     }
2474 }
2475
2476 fn check_packed_inner(
2477     tcx: TyCtxt<'_>,
2478     def_id: DefId,
2479     stack: &mut Vec<DefId>,
2480 ) -> Option<Vec<(DefId, Span)>> {
2481     if let ty::Adt(def, substs) = tcx.type_of(def_id).kind {
2482         if def.is_struct() || def.is_union() {
2483             if def.repr.align.is_some() {
2484                 return Some(vec![(def.did, DUMMY_SP)]);
2485             }
2486
2487             stack.push(def_id);
2488             for field in &def.non_enum_variant().fields {
2489                 if let ty::Adt(def, _) = field.ty(tcx, substs).kind {
2490                     if !stack.contains(&def.did) {
2491                         if let Some(mut defs) = check_packed_inner(tcx, def.did, stack) {
2492                             defs.push((def.did, field.ident.span));
2493                             return Some(defs);
2494                         }
2495                     }
2496                 }
2497             }
2498             stack.pop();
2499         }
2500     }
2501
2502     None
2503 }
2504
2505 /// Emit an error when encountering more or less than one variant in a transparent enum.
2506 fn bad_variant_count<'tcx>(tcx: TyCtxt<'tcx>, adt: &'tcx ty::AdtDef, sp: Span, did: DefId) {
2507     let variant_spans: Vec<_> = adt
2508         .variants
2509         .iter()
2510         .map(|variant| tcx.hir().span_if_local(variant.def_id).unwrap())
2511         .collect();
2512     let msg = format!("needs exactly one variant, but has {}", adt.variants.len(),);
2513     let mut err = struct_span_err!(tcx.sess, sp, E0731, "transparent enum {}", msg);
2514     err.span_label(sp, &msg);
2515     if let [start @ .., end] = &*variant_spans {
2516         for variant_span in start {
2517             err.span_label(*variant_span, "");
2518         }
2519         err.span_label(*end, &format!("too many variants in `{}`", tcx.def_path_str(did)));
2520     }
2521     err.emit();
2522 }
2523
2524 /// Emit an error when encountering more or less than one non-zero-sized field in a transparent
2525 /// enum.
2526 fn bad_non_zero_sized_fields<'tcx>(
2527     tcx: TyCtxt<'tcx>,
2528     adt: &'tcx ty::AdtDef,
2529     field_count: usize,
2530     field_spans: impl Iterator<Item = Span>,
2531     sp: Span,
2532 ) {
2533     let msg = format!("needs exactly one non-zero-sized field, but has {}", field_count);
2534     let mut err = struct_span_err!(
2535         tcx.sess,
2536         sp,
2537         E0690,
2538         "{}transparent {} {}",
2539         if adt.is_enum() { "the variant of a " } else { "" },
2540         adt.descr(),
2541         msg,
2542     );
2543     err.span_label(sp, &msg);
2544     for sp in field_spans {
2545         err.span_label(sp, "this field is non-zero-sized");
2546     }
2547     err.emit();
2548 }
2549
2550 fn check_transparent(tcx: TyCtxt<'_>, sp: Span, def_id: DefId) {
2551     let adt = tcx.adt_def(def_id);
2552     if !adt.repr.transparent() {
2553         return;
2554     }
2555     let sp = tcx.sess.source_map().guess_head_span(sp);
2556
2557     if adt.is_union() && !tcx.features().transparent_unions {
2558         feature_err(
2559             &tcx.sess.parse_sess,
2560             sym::transparent_unions,
2561             sp,
2562             "transparent unions are unstable",
2563         )
2564         .emit();
2565     }
2566
2567     if adt.variants.len() != 1 {
2568         bad_variant_count(tcx, adt, sp, def_id);
2569         if adt.variants.is_empty() {
2570             // Don't bother checking the fields. No variants (and thus no fields) exist.
2571             return;
2572         }
2573     }
2574
2575     // For each field, figure out if it's known to be a ZST and align(1)
2576     let field_infos = adt.all_fields().map(|field| {
2577         let ty = field.ty(tcx, InternalSubsts::identity_for_item(tcx, field.did));
2578         let param_env = tcx.param_env(field.did);
2579         let layout = tcx.layout_of(param_env.and(ty));
2580         // We are currently checking the type this field came from, so it must be local
2581         let span = tcx.hir().span_if_local(field.did).unwrap();
2582         let zst = layout.map(|layout| layout.is_zst()).unwrap_or(false);
2583         let align1 = layout.map(|layout| layout.align.abi.bytes() == 1).unwrap_or(false);
2584         (span, zst, align1)
2585     });
2586
2587     let non_zst_fields =
2588         field_infos.clone().filter_map(|(span, zst, _align1)| if !zst { Some(span) } else { None });
2589     let non_zst_count = non_zst_fields.clone().count();
2590     if non_zst_count != 1 {
2591         bad_non_zero_sized_fields(tcx, adt, non_zst_count, non_zst_fields, sp);
2592     }
2593     for (span, zst, align1) in field_infos {
2594         if zst && !align1 {
2595             struct_span_err!(
2596                 tcx.sess,
2597                 span,
2598                 E0691,
2599                 "zero-sized field in transparent {} has alignment larger than 1",
2600                 adt.descr(),
2601             )
2602             .span_label(span, "has alignment larger than 1")
2603             .emit();
2604         }
2605     }
2606 }
2607
2608 #[allow(trivial_numeric_casts)]
2609 pub fn check_enum<'tcx>(
2610     tcx: TyCtxt<'tcx>,
2611     sp: Span,
2612     vs: &'tcx [hir::Variant<'tcx>],
2613     id: hir::HirId,
2614 ) {
2615     let def_id = tcx.hir().local_def_id(id);
2616     let def = tcx.adt_def(def_id);
2617     def.destructor(tcx); // force the destructor to be evaluated
2618
2619     if vs.is_empty() {
2620         let attributes = tcx.get_attrs(def_id);
2621         if let Some(attr) = attr::find_by_name(&attributes, sym::repr) {
2622             struct_span_err!(
2623                 tcx.sess,
2624                 attr.span,
2625                 E0084,
2626                 "unsupported representation for zero-variant enum"
2627             )
2628             .span_label(sp, "zero-variant enum")
2629             .emit();
2630         }
2631     }
2632
2633     let repr_type_ty = def.repr.discr_type().to_ty(tcx);
2634     if repr_type_ty == tcx.types.i128 || repr_type_ty == tcx.types.u128 {
2635         if !tcx.features().repr128 {
2636             feature_err(
2637                 &tcx.sess.parse_sess,
2638                 sym::repr128,
2639                 sp,
2640                 "repr with 128-bit type is unstable",
2641             )
2642             .emit();
2643         }
2644     }
2645
2646     for v in vs {
2647         if let Some(ref e) = v.disr_expr {
2648             tcx.typeck_tables_of(tcx.hir().local_def_id(e.hir_id));
2649         }
2650     }
2651
2652     if tcx.adt_def(def_id).repr.int.is_none() && tcx.features().arbitrary_enum_discriminant {
2653         let is_unit = |var: &hir::Variant<'_>| match var.data {
2654             hir::VariantData::Unit(..) => true,
2655             _ => false,
2656         };
2657
2658         let has_disr = |var: &hir::Variant<'_>| var.disr_expr.is_some();
2659         let has_non_units = vs.iter().any(|var| !is_unit(var));
2660         let disr_units = vs.iter().any(|var| is_unit(&var) && has_disr(&var));
2661         let disr_non_unit = vs.iter().any(|var| !is_unit(&var) && has_disr(&var));
2662
2663         if disr_non_unit || (disr_units && has_non_units) {
2664             let mut err =
2665                 struct_span_err!(tcx.sess, sp, E0732, "`#[repr(inttype)]` must be specified");
2666             err.emit();
2667         }
2668     }
2669
2670     let mut disr_vals: Vec<Discr<'tcx>> = Vec::with_capacity(vs.len());
2671     for ((_, discr), v) in def.discriminants(tcx).zip(vs) {
2672         // Check for duplicate discriminant values
2673         if let Some(i) = disr_vals.iter().position(|&x| x.val == discr.val) {
2674             let variant_did = def.variants[VariantIdx::new(i)].def_id;
2675             let variant_i_hir_id = tcx.hir().as_local_hir_id(variant_did).unwrap();
2676             let variant_i = tcx.hir().expect_variant(variant_i_hir_id);
2677             let i_span = match variant_i.disr_expr {
2678                 Some(ref expr) => tcx.hir().span(expr.hir_id),
2679                 None => tcx.hir().span(variant_i_hir_id),
2680             };
2681             let span = match v.disr_expr {
2682                 Some(ref expr) => tcx.hir().span(expr.hir_id),
2683                 None => v.span,
2684             };
2685             struct_span_err!(
2686                 tcx.sess,
2687                 span,
2688                 E0081,
2689                 "discriminant value `{}` already exists",
2690                 disr_vals[i]
2691             )
2692             .span_label(i_span, format!("first use of `{}`", disr_vals[i]))
2693             .span_label(span, format!("enum already has `{}`", disr_vals[i]))
2694             .emit();
2695         }
2696         disr_vals.push(discr);
2697     }
2698
2699     check_representable(tcx, sp, def_id);
2700     check_transparent(tcx, sp, def_id);
2701 }
2702
2703 fn report_unexpected_variant_res(tcx: TyCtxt<'_>, res: Res, span: Span) {
2704     struct_span_err!(
2705         tcx.sess,
2706         span,
2707         E0533,
2708         "expected unit struct, unit variant or constant, found {}{}",
2709         res.descr(),
2710         tcx.sess.source_map().span_to_snippet(span).map_or(String::new(), |s| format!(" `{}`", s)),
2711     )
2712     .emit();
2713 }
2714
2715 impl<'a, 'tcx> AstConv<'tcx> for FnCtxt<'a, 'tcx> {
2716     fn tcx<'b>(&'b self) -> TyCtxt<'tcx> {
2717         self.tcx
2718     }
2719
2720     fn item_def_id(&self) -> Option<DefId> {
2721         None
2722     }
2723
2724     fn default_constness_for_trait_bounds(&self) -> hir::Constness {
2725         // FIXME: refactor this into a method
2726         let node = self.tcx.hir().get(self.body_id);
2727         if let Some(fn_like) = FnLikeNode::from_node(node) {
2728             fn_like.constness()
2729         } else {
2730             hir::Constness::NotConst
2731         }
2732     }
2733
2734     fn get_type_parameter_bounds(&self, _: Span, def_id: DefId) -> ty::GenericPredicates<'tcx> {
2735         let tcx = self.tcx;
2736         let hir_id = tcx.hir().as_local_hir_id(def_id).unwrap();
2737         let item_id = tcx.hir().ty_param_owner(hir_id);
2738         let item_def_id = tcx.hir().local_def_id(item_id);
2739         let generics = tcx.generics_of(item_def_id);
2740         let index = generics.param_def_id_to_index[&def_id];
2741         ty::GenericPredicates {
2742             parent: None,
2743             predicates: tcx.arena.alloc_from_iter(self.param_env.caller_bounds.iter().filter_map(
2744                 |&predicate| match predicate {
2745                     ty::Predicate::Trait(ref data, _)
2746                         if data.skip_binder().self_ty().is_param(index) =>
2747                     {
2748                         // HACK(eddyb) should get the original `Span`.
2749                         let span = tcx.def_span(def_id);
2750                         Some((predicate, span))
2751                     }
2752                     _ => None,
2753                 },
2754             )),
2755         }
2756     }
2757
2758     fn re_infer(&self, def: Option<&ty::GenericParamDef>, span: Span) -> Option<ty::Region<'tcx>> {
2759         let v = match def {
2760             Some(def) => infer::EarlyBoundRegion(span, def.name),
2761             None => infer::MiscVariable(span),
2762         };
2763         Some(self.next_region_var(v))
2764     }
2765
2766     fn allow_ty_infer(&self) -> bool {
2767         true
2768     }
2769
2770     fn ty_infer(&self, param: Option<&ty::GenericParamDef>, span: Span) -> Ty<'tcx> {
2771         if let Some(param) = param {
2772             if let GenericArgKind::Type(ty) = self.var_for_def(span, param).unpack() {
2773                 return ty;
2774             }
2775             unreachable!()
2776         } else {
2777             self.next_ty_var(TypeVariableOrigin {
2778                 kind: TypeVariableOriginKind::TypeInference,
2779                 span,
2780             })
2781         }
2782     }
2783
2784     fn ct_infer(
2785         &self,
2786         ty: Ty<'tcx>,
2787         param: Option<&ty::GenericParamDef>,
2788         span: Span,
2789     ) -> &'tcx Const<'tcx> {
2790         if let Some(param) = param {
2791             if let GenericArgKind::Const(ct) = self.var_for_def(span, param).unpack() {
2792                 return ct;
2793             }
2794             unreachable!()
2795         } else {
2796             self.next_const_var(
2797                 ty,
2798                 ConstVariableOrigin { kind: ConstVariableOriginKind::ConstInference, span },
2799             )
2800         }
2801     }
2802
2803     fn projected_ty_from_poly_trait_ref(
2804         &self,
2805         span: Span,
2806         item_def_id: DefId,
2807         item_segment: &hir::PathSegment<'_>,
2808         poly_trait_ref: ty::PolyTraitRef<'tcx>,
2809     ) -> Ty<'tcx> {
2810         let (trait_ref, _) = self.replace_bound_vars_with_fresh_vars(
2811             span,
2812             infer::LateBoundRegionConversionTime::AssocTypeProjection(item_def_id),
2813             &poly_trait_ref,
2814         );
2815
2816         let item_substs = <dyn AstConv<'tcx>>::create_substs_for_associated_item(
2817             self,
2818             self.tcx,
2819             span,
2820             item_def_id,
2821             item_segment,
2822             trait_ref.substs,
2823         );
2824
2825         self.tcx().mk_projection(item_def_id, item_substs)
2826     }
2827
2828     fn normalize_ty(&self, span: Span, ty: Ty<'tcx>) -> Ty<'tcx> {
2829         if ty.has_escaping_bound_vars() {
2830             ty // FIXME: normalization and escaping regions
2831         } else {
2832             self.normalize_associated_types_in(span, &ty)
2833         }
2834     }
2835
2836     fn set_tainted_by_errors(&self) {
2837         self.infcx.set_tainted_by_errors()
2838     }
2839
2840     fn record_ty(&self, hir_id: hir::HirId, ty: Ty<'tcx>, _span: Span) {
2841         self.write_ty(hir_id, ty)
2842     }
2843 }
2844
2845 /// Controls whether the arguments are tupled. This is used for the call
2846 /// operator.
2847 ///
2848 /// Tupling means that all call-side arguments are packed into a tuple and
2849 /// passed as a single parameter. For example, if tupling is enabled, this
2850 /// function:
2851 ///
2852 ///     fn f(x: (isize, isize))
2853 ///
2854 /// Can be called as:
2855 ///
2856 ///     f(1, 2);
2857 ///
2858 /// Instead of:
2859 ///
2860 ///     f((1, 2));
2861 #[derive(Clone, Eq, PartialEq)]
2862 enum TupleArgumentsFlag {
2863     DontTupleArguments,
2864     TupleArguments,
2865 }
2866
2867 /// Controls how we perform fallback for unconstrained
2868 /// type variables.
2869 enum FallbackMode {
2870     /// Do not fallback type variables to opaque types.
2871     NoOpaque,
2872     /// Perform all possible kinds of fallback, including
2873     /// turning type variables to opaque types.
2874     All,
2875 }
2876
2877 impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
2878     pub fn new(
2879         inh: &'a Inherited<'a, 'tcx>,
2880         param_env: ty::ParamEnv<'tcx>,
2881         body_id: hir::HirId,
2882     ) -> FnCtxt<'a, 'tcx> {
2883         FnCtxt {
2884             body_id,
2885             param_env,
2886             err_count_on_creation: inh.tcx.sess.err_count(),
2887             ret_coercion: None,
2888             ret_coercion_span: RefCell::new(None),
2889             resume_yield_tys: None,
2890             ps: RefCell::new(UnsafetyState::function(hir::Unsafety::Normal, hir::CRATE_HIR_ID)),
2891             diverges: Cell::new(Diverges::Maybe),
2892             has_errors: Cell::new(false),
2893             enclosing_breakables: RefCell::new(EnclosingBreakables {
2894                 stack: Vec::new(),
2895                 by_id: Default::default(),
2896             }),
2897             inh,
2898         }
2899     }
2900
2901     pub fn sess(&self) -> &Session {
2902         &self.tcx.sess
2903     }
2904
2905     pub fn errors_reported_since_creation(&self) -> bool {
2906         self.tcx.sess.err_count() > self.err_count_on_creation
2907     }
2908
2909     /// Produces warning on the given node, if the current point in the
2910     /// function is unreachable, and there hasn't been another warning.
2911     fn warn_if_unreachable(&self, id: hir::HirId, span: Span, kind: &str) {
2912         // FIXME: Combine these two 'if' expressions into one once
2913         // let chains are implemented
2914         if let Diverges::Always { span: orig_span, custom_note } = self.diverges.get() {
2915             // If span arose from a desugaring of `if` or `while`, then it is the condition itself,
2916             // which diverges, that we are about to lint on. This gives suboptimal diagnostics.
2917             // Instead, stop here so that the `if`- or `while`-expression's block is linted instead.
2918             if !span.is_desugaring(DesugaringKind::CondTemporary)
2919                 && !span.is_desugaring(DesugaringKind::Async)
2920                 && !orig_span.is_desugaring(DesugaringKind::Await)
2921             {
2922                 self.diverges.set(Diverges::WarnedAlways);
2923
2924                 debug!("warn_if_unreachable: id={:?} span={:?} kind={}", id, span, kind);
2925
2926                 self.tcx().struct_span_lint_hir(lint::builtin::UNREACHABLE_CODE, id, span, |lint| {
2927                     let msg = format!("unreachable {}", kind);
2928                     lint.build(&msg)
2929                         .span_label(span, &msg)
2930                         .span_label(
2931                             orig_span,
2932                             custom_note
2933                                 .unwrap_or("any code following this expression is unreachable"),
2934                         )
2935                         .emit();
2936                 })
2937             }
2938         }
2939     }
2940
2941     pub fn cause(&self, span: Span, code: ObligationCauseCode<'tcx>) -> ObligationCause<'tcx> {
2942         ObligationCause::new(span, self.body_id, code)
2943     }
2944
2945     pub fn misc(&self, span: Span) -> ObligationCause<'tcx> {
2946         self.cause(span, ObligationCauseCode::MiscObligation)
2947     }
2948
2949     /// Resolves type and const variables in `ty` if possible. Unlike the infcx
2950     /// version (resolve_vars_if_possible), this version will
2951     /// also select obligations if it seems useful, in an effort
2952     /// to get more type information.
2953     fn resolve_vars_with_obligations(&self, mut ty: Ty<'tcx>) -> Ty<'tcx> {
2954         debug!("resolve_vars_with_obligations(ty={:?})", ty);
2955
2956         // No Infer()? Nothing needs doing.
2957         if !ty.has_infer_types_or_consts() {
2958             debug!("resolve_vars_with_obligations: ty={:?}", ty);
2959             return ty;
2960         }
2961
2962         // If `ty` is a type variable, see whether we already know what it is.
2963         ty = self.resolve_vars_if_possible(&ty);
2964         if !ty.has_infer_types_or_consts() {
2965             debug!("resolve_vars_with_obligations: ty={:?}", ty);
2966             return ty;
2967         }
2968
2969         // If not, try resolving pending obligations as much as
2970         // possible. This can help substantially when there are
2971         // indirect dependencies that don't seem worth tracking
2972         // precisely.
2973         self.select_obligations_where_possible(false, |_| {});
2974         ty = self.resolve_vars_if_possible(&ty);
2975
2976         debug!("resolve_vars_with_obligations: ty={:?}", ty);
2977         ty
2978     }
2979
2980     fn record_deferred_call_resolution(
2981         &self,
2982         closure_def_id: DefId,
2983         r: DeferredCallResolution<'tcx>,
2984     ) {
2985         let mut deferred_call_resolutions = self.deferred_call_resolutions.borrow_mut();
2986         deferred_call_resolutions.entry(closure_def_id).or_default().push(r);
2987     }
2988
2989     fn remove_deferred_call_resolutions(
2990         &self,
2991         closure_def_id: DefId,
2992     ) -> Vec<DeferredCallResolution<'tcx>> {
2993         let mut deferred_call_resolutions = self.deferred_call_resolutions.borrow_mut();
2994         deferred_call_resolutions.remove(&closure_def_id).unwrap_or(vec![])
2995     }
2996
2997     pub fn tag(&self) -> String {
2998         format!("{:p}", self)
2999     }
3000
3001     pub fn local_ty(&self, span: Span, nid: hir::HirId) -> LocalTy<'tcx> {
3002         self.locals.borrow().get(&nid).cloned().unwrap_or_else(|| {
3003             span_bug!(span, "no type for local variable {}", self.tcx.hir().node_to_string(nid))
3004         })
3005     }
3006
3007     #[inline]
3008     pub fn write_ty(&self, id: hir::HirId, ty: Ty<'tcx>) {
3009         debug!(
3010             "write_ty({:?}, {:?}) in fcx {}",
3011             id,
3012             self.resolve_vars_if_possible(&ty),
3013             self.tag()
3014         );
3015         self.tables.borrow_mut().node_types_mut().insert(id, ty);
3016
3017         if ty.references_error() {
3018             self.has_errors.set(true);
3019             self.set_tainted_by_errors();
3020         }
3021     }
3022
3023     pub fn write_field_index(&self, hir_id: hir::HirId, index: usize) {
3024         self.tables.borrow_mut().field_indices_mut().insert(hir_id, index);
3025     }
3026
3027     fn write_resolution(&self, hir_id: hir::HirId, r: Result<(DefKind, DefId), ErrorReported>) {
3028         self.tables.borrow_mut().type_dependent_defs_mut().insert(hir_id, r);
3029     }
3030
3031     pub fn write_method_call(&self, hir_id: hir::HirId, method: MethodCallee<'tcx>) {
3032         debug!("write_method_call(hir_id={:?}, method={:?})", hir_id, method);
3033         self.write_resolution(hir_id, Ok((DefKind::AssocFn, method.def_id)));
3034         self.write_substs(hir_id, method.substs);
3035
3036         // When the method is confirmed, the `method.substs` includes
3037         // parameters from not just the method, but also the impl of
3038         // the method -- in particular, the `Self` type will be fully
3039         // resolved. However, those are not something that the "user
3040         // specified" -- i.e., those types come from the inferred type
3041         // of the receiver, not something the user wrote. So when we
3042         // create the user-substs, we want to replace those earlier
3043         // types with just the types that the user actually wrote --
3044         // that is, those that appear on the *method itself*.
3045         //
3046         // As an example, if the user wrote something like
3047         // `foo.bar::<u32>(...)` -- the `Self` type here will be the
3048         // type of `foo` (possibly adjusted), but we don't want to
3049         // include that. We want just the `[_, u32]` part.
3050         if !method.substs.is_noop() {
3051             let method_generics = self.tcx.generics_of(method.def_id);
3052             if !method_generics.params.is_empty() {
3053                 let user_type_annotation = self.infcx.probe(|_| {
3054                     let user_substs = UserSubsts {
3055                         substs: InternalSubsts::for_item(self.tcx, method.def_id, |param, _| {
3056                             let i = param.index as usize;
3057                             if i < method_generics.parent_count {
3058                                 self.infcx.var_for_def(DUMMY_SP, param)
3059                             } else {
3060                                 method.substs[i]
3061                             }
3062                         }),
3063                         user_self_ty: None, // not relevant here
3064                     };
3065
3066                     self.infcx.canonicalize_user_type_annotation(&UserType::TypeOf(
3067                         method.def_id,
3068                         user_substs,
3069                     ))
3070                 });
3071
3072                 debug!("write_method_call: user_type_annotation={:?}", user_type_annotation);
3073                 self.write_user_type_annotation(hir_id, user_type_annotation);
3074             }
3075         }
3076     }
3077
3078     pub fn write_substs(&self, node_id: hir::HirId, substs: SubstsRef<'tcx>) {
3079         if !substs.is_noop() {
3080             debug!("write_substs({:?}, {:?}) in fcx {}", node_id, substs, self.tag());
3081
3082             self.tables.borrow_mut().node_substs_mut().insert(node_id, substs);
3083         }
3084     }
3085
3086     /// Given the substs that we just converted from the HIR, try to
3087     /// canonicalize them and store them as user-given substitutions
3088     /// (i.e., substitutions that must be respected by the NLL check).
3089     ///
3090     /// This should be invoked **before any unifications have
3091     /// occurred**, so that annotations like `Vec<_>` are preserved
3092     /// properly.
3093     pub fn write_user_type_annotation_from_substs(
3094         &self,
3095         hir_id: hir::HirId,
3096         def_id: DefId,
3097         substs: SubstsRef<'tcx>,
3098         user_self_ty: Option<UserSelfTy<'tcx>>,
3099     ) {
3100         debug!(
3101             "write_user_type_annotation_from_substs: hir_id={:?} def_id={:?} substs={:?} \
3102              user_self_ty={:?} in fcx {}",
3103             hir_id,
3104             def_id,
3105             substs,
3106             user_self_ty,
3107             self.tag(),
3108         );
3109
3110         if Self::can_contain_user_lifetime_bounds((substs, user_self_ty)) {
3111             let canonicalized = self.infcx.canonicalize_user_type_annotation(&UserType::TypeOf(
3112                 def_id,
3113                 UserSubsts { substs, user_self_ty },
3114             ));
3115             debug!("write_user_type_annotation_from_substs: canonicalized={:?}", canonicalized);
3116             self.write_user_type_annotation(hir_id, canonicalized);
3117         }
3118     }
3119
3120     pub fn write_user_type_annotation(
3121         &self,
3122         hir_id: hir::HirId,
3123         canonical_user_type_annotation: CanonicalUserType<'tcx>,
3124     ) {
3125         debug!(
3126             "write_user_type_annotation: hir_id={:?} canonical_user_type_annotation={:?} tag={}",
3127             hir_id,
3128             canonical_user_type_annotation,
3129             self.tag(),
3130         );
3131
3132         if !canonical_user_type_annotation.is_identity() {
3133             self.tables
3134                 .borrow_mut()
3135                 .user_provided_types_mut()
3136                 .insert(hir_id, canonical_user_type_annotation);
3137         } else {
3138             debug!("write_user_type_annotation: skipping identity substs");
3139         }
3140     }
3141
3142     pub fn apply_adjustments(&self, expr: &hir::Expr<'_>, adj: Vec<Adjustment<'tcx>>) {
3143         debug!("apply_adjustments(expr={:?}, adj={:?})", expr, adj);
3144
3145         if adj.is_empty() {
3146             return;
3147         }
3148
3149         match self.tables.borrow_mut().adjustments_mut().entry(expr.hir_id) {
3150             Entry::Vacant(entry) => {
3151                 entry.insert(adj);
3152             }
3153             Entry::Occupied(mut entry) => {
3154                 debug!(" - composing on top of {:?}", entry.get());
3155                 match (&entry.get()[..], &adj[..]) {
3156                     // Applying any adjustment on top of a NeverToAny
3157                     // is a valid NeverToAny adjustment, because it can't
3158                     // be reached.
3159                     (&[Adjustment { kind: Adjust::NeverToAny, .. }], _) => return,
3160                     (&[
3161                         Adjustment { kind: Adjust::Deref(_), .. },
3162                         Adjustment { kind: Adjust::Borrow(AutoBorrow::Ref(..)), .. },
3163                     ], &[
3164                         Adjustment { kind: Adjust::Deref(_), .. },
3165                         .. // Any following adjustments are allowed.
3166                     ]) => {
3167                         // A reborrow has no effect before a dereference.
3168                     }
3169                     // FIXME: currently we never try to compose autoderefs
3170                     // and ReifyFnPointer/UnsafeFnPointer, but we could.
3171                     _ =>
3172                         bug!("while adjusting {:?}, can't compose {:?} and {:?}",
3173                              expr, entry.get(), adj)
3174                 };
3175                 *entry.get_mut() = adj;
3176             }
3177         }
3178     }
3179
3180     /// Basically whenever we are converting from a type scheme into
3181     /// the fn body space, we always want to normalize associated
3182     /// types as well. This function combines the two.
3183     fn instantiate_type_scheme<T>(&self, span: Span, substs: SubstsRef<'tcx>, value: &T) -> T
3184     where
3185         T: TypeFoldable<'tcx>,
3186     {
3187         let value = value.subst(self.tcx, substs);
3188         let result = self.normalize_associated_types_in(span, &value);
3189         debug!("instantiate_type_scheme(value={:?}, substs={:?}) = {:?}", value, substs, result);
3190         result
3191     }
3192
3193     /// As `instantiate_type_scheme`, but for the bounds found in a
3194     /// generic type scheme.
3195     fn instantiate_bounds(
3196         &self,
3197         span: Span,
3198         def_id: DefId,
3199         substs: SubstsRef<'tcx>,
3200     ) -> (ty::InstantiatedPredicates<'tcx>, Vec<Span>) {
3201         let bounds = self.tcx.predicates_of(def_id);
3202         let spans: Vec<Span> = bounds.predicates.iter().map(|(_, span)| *span).collect();
3203         let result = bounds.instantiate(self.tcx, substs);
3204         let result = self.normalize_associated_types_in(span, &result);
3205         debug!(
3206             "instantiate_bounds(bounds={:?}, substs={:?}) = {:?}, {:?}",
3207             bounds, substs, result, spans,
3208         );
3209         (result, spans)
3210     }
3211
3212     /// Replaces the opaque types from the given value with type variables,
3213     /// and records the `OpaqueTypeMap` for later use during writeback. See
3214     /// `InferCtxt::instantiate_opaque_types` for more details.
3215     fn instantiate_opaque_types_from_value<T: TypeFoldable<'tcx>>(
3216         &self,
3217         parent_id: hir::HirId,
3218         value: &T,
3219         value_span: Span,
3220     ) -> T {
3221         let parent_def_id = self.tcx.hir().local_def_id(parent_id);
3222         debug!(
3223             "instantiate_opaque_types_from_value(parent_def_id={:?}, value={:?})",
3224             parent_def_id, value
3225         );
3226
3227         let (value, opaque_type_map) =
3228             self.register_infer_ok_obligations(self.instantiate_opaque_types(
3229                 parent_def_id,
3230                 self.body_id,
3231                 self.param_env,
3232                 value,
3233                 value_span,
3234             ));
3235
3236         let mut opaque_types = self.opaque_types.borrow_mut();
3237         let mut opaque_types_vars = self.opaque_types_vars.borrow_mut();
3238         for (ty, decl) in opaque_type_map {
3239             let _ = opaque_types.insert(ty, decl);
3240             let _ = opaque_types_vars.insert(decl.concrete_ty, decl.opaque_type);
3241         }
3242
3243         value
3244     }
3245
3246     fn normalize_associated_types_in<T>(&self, span: Span, value: &T) -> T
3247     where
3248         T: TypeFoldable<'tcx>,
3249     {
3250         self.inh.normalize_associated_types_in(span, self.body_id, self.param_env, value)
3251     }
3252
3253     fn normalize_associated_types_in_as_infer_ok<T>(
3254         &self,
3255         span: Span,
3256         value: &T,
3257     ) -> InferOk<'tcx, T>
3258     where
3259         T: TypeFoldable<'tcx>,
3260     {
3261         self.inh.partially_normalize_associated_types_in(span, self.body_id, self.param_env, value)
3262     }
3263
3264     pub fn require_type_meets(
3265         &self,
3266         ty: Ty<'tcx>,
3267         span: Span,
3268         code: traits::ObligationCauseCode<'tcx>,
3269         def_id: DefId,
3270     ) {
3271         self.register_bound(ty, def_id, traits::ObligationCause::new(span, self.body_id, code));
3272     }
3273
3274     pub fn require_type_is_sized(
3275         &self,
3276         ty: Ty<'tcx>,
3277         span: Span,
3278         code: traits::ObligationCauseCode<'tcx>,
3279     ) {
3280         if !ty.references_error() {
3281             let lang_item = self.tcx.require_lang_item(lang_items::SizedTraitLangItem, None);
3282             self.require_type_meets(ty, span, code, lang_item);
3283         }
3284     }
3285
3286     pub fn require_type_is_sized_deferred(
3287         &self,
3288         ty: Ty<'tcx>,
3289         span: Span,
3290         code: traits::ObligationCauseCode<'tcx>,
3291     ) {
3292         if !ty.references_error() {
3293             self.deferred_sized_obligations.borrow_mut().push((ty, span, code));
3294         }
3295     }
3296
3297     pub fn register_bound(
3298         &self,
3299         ty: Ty<'tcx>,
3300         def_id: DefId,
3301         cause: traits::ObligationCause<'tcx>,
3302     ) {
3303         if !ty.references_error() {
3304             self.fulfillment_cx.borrow_mut().register_bound(
3305                 self,
3306                 self.param_env,
3307                 ty,
3308                 def_id,
3309                 cause,
3310             );
3311         }
3312     }
3313
3314     pub fn to_ty(&self, ast_t: &hir::Ty<'_>) -> Ty<'tcx> {
3315         let t = AstConv::ast_ty_to_ty(self, ast_t);
3316         self.register_wf_obligation(t, ast_t.span, traits::MiscObligation);
3317         t
3318     }
3319
3320     pub fn to_ty_saving_user_provided_ty(&self, ast_ty: &hir::Ty<'_>) -> Ty<'tcx> {
3321         let ty = self.to_ty(ast_ty);
3322         debug!("to_ty_saving_user_provided_ty: ty={:?}", ty);
3323
3324         if Self::can_contain_user_lifetime_bounds(ty) {
3325             let c_ty = self.infcx.canonicalize_response(&UserType::Ty(ty));
3326             debug!("to_ty_saving_user_provided_ty: c_ty={:?}", c_ty);
3327             self.tables.borrow_mut().user_provided_types_mut().insert(ast_ty.hir_id, c_ty);
3328         }
3329
3330         ty
3331     }
3332
3333     pub fn to_const(&self, ast_c: &hir::AnonConst) -> &'tcx ty::Const<'tcx> {
3334         let const_def_id = self.tcx.hir().local_def_id(ast_c.hir_id).expect_local();
3335         let c = ty::Const::from_anon_const(self.tcx, const_def_id);
3336
3337         // HACK(eddyb) emulate what a `WellFormedConst` obligation would do.
3338         // This code should be replaced with the proper WF handling ASAP.
3339         if let ty::ConstKind::Unevaluated(def_id, substs, promoted) = c.val {
3340             assert!(promoted.is_none());
3341
3342             // HACK(eddyb) let's hope these are always empty.
3343             // let obligations = self.nominal_obligations(def_id, substs);
3344             // self.out.extend(obligations);
3345
3346             let cause = traits::ObligationCause::new(
3347                 self.tcx.def_span(const_def_id.to_def_id()),
3348                 self.body_id,
3349                 traits::MiscObligation,
3350             );
3351             self.register_predicate(traits::Obligation::new(
3352                 cause,
3353                 self.param_env,
3354                 ty::Predicate::ConstEvaluatable(def_id, substs),
3355             ));
3356         }
3357
3358         c
3359     }
3360
3361     // If the type given by the user has free regions, save it for later, since
3362     // NLL would like to enforce those. Also pass in types that involve
3363     // projections, since those can resolve to `'static` bounds (modulo #54940,
3364     // which hopefully will be fixed by the time you see this comment, dear
3365     // reader, although I have my doubts). Also pass in types with inference
3366     // types, because they may be repeated. Other sorts of things are already
3367     // sufficiently enforced with erased regions. =)
3368     fn can_contain_user_lifetime_bounds<T>(t: T) -> bool
3369     where
3370         T: TypeFoldable<'tcx>,
3371     {
3372         t.has_free_regions() || t.has_projections() || t.has_infer_types()
3373     }
3374
3375     pub fn node_ty(&self, id: hir::HirId) -> Ty<'tcx> {
3376         match self.tables.borrow().node_types().get(id) {
3377             Some(&t) => t,
3378             None if self.is_tainted_by_errors() => self.tcx.types.err,
3379             None => {
3380                 bug!(
3381                     "no type for node {}: {} in fcx {}",
3382                     id,
3383                     self.tcx.hir().node_to_string(id),
3384                     self.tag()
3385                 );
3386             }
3387         }
3388     }
3389
3390     /// Registers an obligation for checking later, during regionck, that the type `ty` must
3391     /// outlive the region `r`.
3392     pub fn register_wf_obligation(
3393         &self,
3394         ty: Ty<'tcx>,
3395         span: Span,
3396         code: traits::ObligationCauseCode<'tcx>,
3397     ) {
3398         // WF obligations never themselves fail, so no real need to give a detailed cause:
3399         let cause = traits::ObligationCause::new(span, self.body_id, code);
3400         self.register_predicate(traits::Obligation::new(
3401             cause,
3402             self.param_env,
3403             ty::Predicate::WellFormed(ty),
3404         ));
3405     }
3406
3407     /// Registers obligations that all types appearing in `substs` are well-formed.
3408     pub fn add_wf_bounds(&self, substs: SubstsRef<'tcx>, expr: &hir::Expr<'_>) {
3409         for ty in substs.types() {
3410             if !ty.references_error() {
3411                 self.register_wf_obligation(ty, expr.span, traits::MiscObligation);
3412             }
3413         }
3414     }
3415
3416     /// Given a fully substituted set of bounds (`generic_bounds`), and the values with which each
3417     /// type/region parameter was instantiated (`substs`), creates and registers suitable
3418     /// trait/region obligations.
3419     ///
3420     /// For example, if there is a function:
3421     ///
3422     /// ```
3423     /// fn foo<'a,T:'a>(...)
3424     /// ```
3425     ///
3426     /// and a reference:
3427     ///
3428     /// ```
3429     /// let f = foo;
3430     /// ```
3431     ///
3432     /// Then we will create a fresh region variable `'$0` and a fresh type variable `$1` for `'a`
3433     /// and `T`. This routine will add a region obligation `$1:'$0` and register it locally.
3434     pub fn add_obligations_for_parameters(
3435         &self,
3436         cause: traits::ObligationCause<'tcx>,
3437         predicates: &ty::InstantiatedPredicates<'tcx>,
3438     ) {
3439         assert!(!predicates.has_escaping_bound_vars());
3440
3441         debug!("add_obligations_for_parameters(predicates={:?})", predicates);
3442
3443         for obligation in traits::predicates_for_generics(cause, self.param_env, predicates) {
3444             self.register_predicate(obligation);
3445         }
3446     }
3447
3448     // FIXME(arielb1): use this instead of field.ty everywhere
3449     // Only for fields! Returns <none> for methods>
3450     // Indifferent to privacy flags
3451     pub fn field_ty(
3452         &self,
3453         span: Span,
3454         field: &'tcx ty::FieldDef,
3455         substs: SubstsRef<'tcx>,
3456     ) -> Ty<'tcx> {
3457         self.normalize_associated_types_in(span, &field.ty(self.tcx, substs))
3458     }
3459
3460     fn check_casts(&self) {
3461         let mut deferred_cast_checks = self.deferred_cast_checks.borrow_mut();
3462         for cast in deferred_cast_checks.drain(..) {
3463             cast.check(self);
3464         }
3465     }
3466
3467     fn resolve_generator_interiors(&self, def_id: DefId) {
3468         let mut generators = self.deferred_generator_interiors.borrow_mut();
3469         for (body_id, interior, kind) in generators.drain(..) {
3470             self.select_obligations_where_possible(false, |_| {});
3471             generator_interior::resolve_interior(self, def_id, body_id, interior, kind);
3472         }
3473     }
3474
3475     // Tries to apply a fallback to `ty` if it is an unsolved variable.
3476     //
3477     // - Unconstrained ints are replaced with `i32`.
3478     //
3479     // - Unconstrained floats are replaced with with `f64`.
3480     //
3481     // - Non-numerics get replaced with `!` when `#![feature(never_type_fallback)]`
3482     //   is enabled. Otherwise, they are replaced with `()`.
3483     //
3484     // Fallback becomes very dubious if we have encountered type-checking errors.
3485     // In that case, fallback to Error.
3486     // The return value indicates whether fallback has occurred.
3487     fn fallback_if_possible(&self, ty: Ty<'tcx>, mode: FallbackMode) -> bool {
3488         use rustc_middle::ty::error::UnconstrainedNumeric::Neither;
3489         use rustc_middle::ty::error::UnconstrainedNumeric::{UnconstrainedFloat, UnconstrainedInt};
3490
3491         assert!(ty.is_ty_infer());
3492         let fallback = match self.type_is_unconstrained_numeric(ty) {
3493             _ if self.is_tainted_by_errors() => self.tcx().types.err,
3494             UnconstrainedInt => self.tcx.types.i32,
3495             UnconstrainedFloat => self.tcx.types.f64,
3496             Neither if self.type_var_diverges(ty) => self.tcx.mk_diverging_default(),
3497             Neither => {
3498                 // This type variable was created from the instantiation of an opaque
3499                 // type. The fact that we're attempting to perform fallback for it
3500                 // means that the function neither constrained it to a concrete
3501                 // type, nor to the opaque type itself.
3502                 //
3503                 // For example, in this code:
3504                 //
3505                 //```
3506                 // type MyType = impl Copy;
3507                 // fn defining_use() -> MyType { true }
3508                 // fn other_use() -> MyType { defining_use() }
3509                 // ```
3510                 //
3511                 // `defining_use` will constrain the instantiated inference
3512                 // variable to `bool`, while `other_use` will constrain
3513                 // the instantiated inference variable to `MyType`.
3514                 //
3515                 // When we process opaque types during writeback, we
3516                 // will handle cases like `other_use`, and not count
3517                 // them as defining usages
3518                 //
3519                 // However, we also need to handle cases like this:
3520                 //
3521                 // ```rust
3522                 // pub type Foo = impl Copy;
3523                 // fn produce() -> Option<Foo> {
3524                 //     None
3525                 //  }
3526                 //  ```
3527                 //
3528                 // In the above snippet, the inference variable created by
3529                 // instantiating `Option<Foo>` will be completely unconstrained.
3530                 // We treat this as a non-defining use by making the inference
3531                 // variable fall back to the opaque type itself.
3532                 if let FallbackMode::All = mode {
3533                     if let Some(opaque_ty) = self.opaque_types_vars.borrow().get(ty) {
3534                         debug!(
3535                             "fallback_if_possible: falling back opaque type var {:?} to {:?}",
3536                             ty, opaque_ty
3537                         );
3538                         *opaque_ty
3539                     } else {
3540                         return false;
3541                     }
3542                 } else {
3543                     return false;
3544                 }
3545             }
3546         };
3547         debug!("fallback_if_possible: defaulting `{:?}` to `{:?}`", ty, fallback);
3548         self.demand_eqtype(rustc_span::DUMMY_SP, ty, fallback);
3549         true
3550     }
3551
3552     fn select_all_obligations_or_error(&self) {
3553         debug!("select_all_obligations_or_error");
3554         if let Err(errors) = self.fulfillment_cx.borrow_mut().select_all_or_error(&self) {
3555             self.report_fulfillment_errors(&errors, self.inh.body_id, false);
3556         }
3557     }
3558
3559     /// Select as many obligations as we can at present.
3560     fn select_obligations_where_possible(
3561         &self,
3562         fallback_has_occurred: bool,
3563         mutate_fullfillment_errors: impl Fn(&mut Vec<traits::FulfillmentError<'tcx>>),
3564     ) {
3565         let result = self.fulfillment_cx.borrow_mut().select_where_possible(self);
3566         if let Err(mut errors) = result {
3567             mutate_fullfillment_errors(&mut errors);
3568             self.report_fulfillment_errors(&errors, self.inh.body_id, fallback_has_occurred);
3569         }
3570     }
3571
3572     /// For the overloaded place expressions (`*x`, `x[3]`), the trait
3573     /// returns a type of `&T`, but the actual type we assign to the
3574     /// *expression* is `T`. So this function just peels off the return
3575     /// type by one layer to yield `T`.
3576     fn make_overloaded_place_return_type(
3577         &self,
3578         method: MethodCallee<'tcx>,
3579     ) -> ty::TypeAndMut<'tcx> {
3580         // extract method return type, which will be &T;
3581         let ret_ty = method.sig.output();
3582
3583         // method returns &T, but the type as visible to user is T, so deref
3584         ret_ty.builtin_deref(true).unwrap()
3585     }
3586
3587     fn lookup_indexing(
3588         &self,
3589         expr: &hir::Expr<'_>,
3590         base_expr: &'tcx hir::Expr<'tcx>,
3591         base_ty: Ty<'tcx>,
3592         idx_ty: Ty<'tcx>,
3593         needs: Needs,
3594     ) -> Option<(/*index type*/ Ty<'tcx>, /*element type*/ Ty<'tcx>)> {
3595         // FIXME(#18741) -- this is almost but not quite the same as the
3596         // autoderef that normal method probing does. They could likely be
3597         // consolidated.
3598
3599         let mut autoderef = self.autoderef(base_expr.span, base_ty);
3600         let mut result = None;
3601         while result.is_none() && autoderef.next().is_some() {
3602             result = self.try_index_step(expr, base_expr, &autoderef, needs, idx_ty);
3603         }
3604         autoderef.finalize(self);
3605         result
3606     }
3607
3608     /// To type-check `base_expr[index_expr]`, we progressively autoderef
3609     /// (and otherwise adjust) `base_expr`, looking for a type which either
3610     /// supports builtin indexing or overloaded indexing.
3611     /// This loop implements one step in that search; the autoderef loop
3612     /// is implemented by `lookup_indexing`.
3613     fn try_index_step(
3614         &self,
3615         expr: &hir::Expr<'_>,
3616         base_expr: &hir::Expr<'_>,
3617         autoderef: &Autoderef<'a, 'tcx>,
3618         needs: Needs,
3619         index_ty: Ty<'tcx>,
3620     ) -> Option<(/*index type*/ Ty<'tcx>, /*element type*/ Ty<'tcx>)> {
3621         let adjusted_ty = autoderef.unambiguous_final_ty(self);
3622         debug!(
3623             "try_index_step(expr={:?}, base_expr={:?}, adjusted_ty={:?}, \
3624              index_ty={:?})",
3625             expr, base_expr, adjusted_ty, index_ty
3626         );
3627
3628         for &unsize in &[false, true] {
3629             let mut self_ty = adjusted_ty;
3630             if unsize {
3631                 // We only unsize arrays here.
3632                 if let ty::Array(element_ty, _) = adjusted_ty.kind {
3633                     self_ty = self.tcx.mk_slice(element_ty);
3634                 } else {
3635                     continue;
3636                 }
3637             }
3638
3639             // If some lookup succeeds, write callee into table and extract index/element
3640             // type from the method signature.
3641             // If some lookup succeeded, install method in table
3642             let input_ty = self.next_ty_var(TypeVariableOrigin {
3643                 kind: TypeVariableOriginKind::AutoDeref,
3644                 span: base_expr.span,
3645             });
3646             let method = self.try_overloaded_place_op(
3647                 expr.span,
3648                 self_ty,
3649                 &[input_ty],
3650                 needs,
3651                 PlaceOp::Index,
3652             );
3653
3654             let result = method.map(|ok| {
3655                 debug!("try_index_step: success, using overloaded indexing");
3656                 let method = self.register_infer_ok_obligations(ok);
3657
3658                 let mut adjustments = autoderef.adjust_steps(self, needs);
3659                 if let ty::Ref(region, _, r_mutbl) = method.sig.inputs()[0].kind {
3660                     let mutbl = match r_mutbl {
3661                         hir::Mutability::Not => AutoBorrowMutability::Not,
3662                         hir::Mutability::Mut => AutoBorrowMutability::Mut {
3663                             // Indexing can be desugared to a method call,
3664                             // so maybe we could use two-phase here.
3665                             // See the documentation of AllowTwoPhase for why that's
3666                             // not the case today.
3667                             allow_two_phase_borrow: AllowTwoPhase::No,
3668                         },
3669                     };
3670                     adjustments.push(Adjustment {
3671                         kind: Adjust::Borrow(AutoBorrow::Ref(region, mutbl)),
3672                         target: self
3673                             .tcx
3674                             .mk_ref(region, ty::TypeAndMut { mutbl: r_mutbl, ty: adjusted_ty }),
3675                     });
3676                 }
3677                 if unsize {
3678                     adjustments.push(Adjustment {
3679                         kind: Adjust::Pointer(PointerCast::Unsize),
3680                         target: method.sig.inputs()[0],
3681                     });
3682                 }
3683                 self.apply_adjustments(base_expr, adjustments);
3684
3685                 self.write_method_call(expr.hir_id, method);
3686                 (input_ty, self.make_overloaded_place_return_type(method).ty)
3687             });
3688             if result.is_some() {
3689                 return result;
3690             }
3691         }
3692
3693         None
3694     }
3695
3696     fn resolve_place_op(&self, op: PlaceOp, is_mut: bool) -> (Option<DefId>, ast::Ident) {
3697         let (tr, name) = match (op, is_mut) {
3698             (PlaceOp::Deref, false) => (self.tcx.lang_items().deref_trait(), sym::deref),
3699             (PlaceOp::Deref, true) => (self.tcx.lang_items().deref_mut_trait(), sym::deref_mut),
3700             (PlaceOp::Index, false) => (self.tcx.lang_items().index_trait(), sym::index),
3701             (PlaceOp::Index, true) => (self.tcx.lang_items().index_mut_trait(), sym::index_mut),
3702         };
3703         (tr, ast::Ident::with_dummy_span(name))
3704     }
3705
3706     fn try_overloaded_place_op(
3707         &self,
3708         span: Span,
3709         base_ty: Ty<'tcx>,
3710         arg_tys: &[Ty<'tcx>],
3711         needs: Needs,
3712         op: PlaceOp,
3713     ) -> Option<InferOk<'tcx, MethodCallee<'tcx>>> {
3714         debug!("try_overloaded_place_op({:?},{:?},{:?},{:?})", span, base_ty, needs, op);
3715
3716         // Try Mut first, if needed.
3717         let (mut_tr, mut_op) = self.resolve_place_op(op, true);
3718         let method = match (needs, mut_tr) {
3719             (Needs::MutPlace, Some(trait_did)) => {
3720                 self.lookup_method_in_trait(span, mut_op, trait_did, base_ty, Some(arg_tys))
3721             }
3722             _ => None,
3723         };
3724
3725         // Otherwise, fall back to the immutable version.
3726         let (imm_tr, imm_op) = self.resolve_place_op(op, false);
3727         match (method, imm_tr) {
3728             (None, Some(trait_did)) => {
3729                 self.lookup_method_in_trait(span, imm_op, trait_did, base_ty, Some(arg_tys))
3730             }
3731             (method, _) => method,
3732         }
3733     }
3734
3735     fn check_method_argument_types(
3736         &self,
3737         sp: Span,
3738         expr: &'tcx hir::Expr<'tcx>,
3739         method: Result<MethodCallee<'tcx>, ()>,
3740         args_no_rcvr: &'tcx [hir::Expr<'tcx>],
3741         tuple_arguments: TupleArgumentsFlag,
3742         expected: Expectation<'tcx>,
3743     ) -> Ty<'tcx> {
3744         let has_error = match method {
3745             Ok(method) => method.substs.references_error() || method.sig.references_error(),
3746             Err(_) => true,
3747         };
3748         if has_error {
3749             let err_inputs = self.err_args(args_no_rcvr.len());
3750
3751             let err_inputs = match tuple_arguments {
3752                 DontTupleArguments => err_inputs,
3753                 TupleArguments => vec![self.tcx.intern_tup(&err_inputs[..])],
3754             };
3755
3756             self.check_argument_types(
3757                 sp,
3758                 expr,
3759                 &err_inputs[..],
3760                 &[],
3761                 args_no_rcvr,
3762                 false,
3763                 tuple_arguments,
3764                 None,
3765             );
3766             return self.tcx.types.err;
3767         }
3768
3769         let method = method.unwrap();
3770         // HACK(eddyb) ignore self in the definition (see above).
3771         let expected_arg_tys = self.expected_inputs_for_expected_output(
3772             sp,
3773             expected,
3774             method.sig.output(),
3775             &method.sig.inputs()[1..],
3776         );
3777         self.check_argument_types(
3778             sp,
3779             expr,
3780             &method.sig.inputs()[1..],
3781             &expected_arg_tys[..],
3782             args_no_rcvr,
3783             method.sig.c_variadic,
3784             tuple_arguments,
3785             self.tcx.hir().span_if_local(method.def_id),
3786         );
3787         method.sig.output()
3788     }
3789
3790     fn self_type_matches_expected_vid(
3791         &self,
3792         trait_ref: ty::PolyTraitRef<'tcx>,
3793         expected_vid: ty::TyVid,
3794     ) -> bool {
3795         let self_ty = self.shallow_resolve(trait_ref.self_ty());
3796         debug!(
3797             "self_type_matches_expected_vid(trait_ref={:?}, self_ty={:?}, expected_vid={:?})",
3798             trait_ref, self_ty, expected_vid
3799         );
3800         match self_ty.kind {
3801             ty::Infer(ty::TyVar(found_vid)) => {
3802                 // FIXME: consider using `sub_root_var` here so we
3803                 // can see through subtyping.
3804                 let found_vid = self.root_var(found_vid);
3805                 debug!("self_type_matches_expected_vid - found_vid={:?}", found_vid);
3806                 expected_vid == found_vid
3807             }
3808             _ => false,
3809         }
3810     }
3811
3812     fn obligations_for_self_ty<'b>(
3813         &'b self,
3814         self_ty: ty::TyVid,
3815     ) -> impl Iterator<Item = (ty::PolyTraitRef<'tcx>, traits::PredicateObligation<'tcx>)>
3816     + Captures<'tcx>
3817     + 'b {
3818         // FIXME: consider using `sub_root_var` here so we
3819         // can see through subtyping.
3820         let ty_var_root = self.root_var(self_ty);
3821         debug!(
3822             "obligations_for_self_ty: self_ty={:?} ty_var_root={:?} pending_obligations={:?}",
3823             self_ty,
3824             ty_var_root,
3825             self.fulfillment_cx.borrow().pending_obligations()
3826         );
3827
3828         self.fulfillment_cx
3829             .borrow()
3830             .pending_obligations()
3831             .into_iter()
3832             .filter_map(move |obligation| match obligation.predicate {
3833                 ty::Predicate::Projection(ref data) => {
3834                     Some((data.to_poly_trait_ref(self.tcx), obligation))
3835                 }
3836                 ty::Predicate::Trait(ref data, _) => Some((data.to_poly_trait_ref(), obligation)),
3837                 ty::Predicate::Subtype(..) => None,
3838                 ty::Predicate::RegionOutlives(..) => None,
3839                 ty::Predicate::TypeOutlives(..) => None,
3840                 ty::Predicate::WellFormed(..) => None,
3841                 ty::Predicate::ObjectSafe(..) => None,
3842                 ty::Predicate::ConstEvaluatable(..) => None,
3843                 // N.B., this predicate is created by breaking down a
3844                 // `ClosureType: FnFoo()` predicate, where
3845                 // `ClosureType` represents some `Closure`. It can't
3846                 // possibly be referring to the current closure,
3847                 // because we haven't produced the `Closure` for
3848                 // this closure yet; this is exactly why the other
3849                 // code is looking for a self type of a unresolved
3850                 // inference variable.
3851                 ty::Predicate::ClosureKind(..) => None,
3852             })
3853             .filter(move |(tr, _)| self.self_type_matches_expected_vid(*tr, ty_var_root))
3854     }
3855
3856     fn type_var_is_sized(&self, self_ty: ty::TyVid) -> bool {
3857         self.obligations_for_self_ty(self_ty)
3858             .any(|(tr, _)| Some(tr.def_id()) == self.tcx.lang_items().sized_trait())
3859     }
3860
3861     /// Generic function that factors out common logic from function calls,
3862     /// method calls and overloaded operators.
3863     fn check_argument_types(
3864         &self,
3865         sp: Span,
3866         expr: &'tcx hir::Expr<'tcx>,
3867         fn_inputs: &[Ty<'tcx>],
3868         expected_arg_tys: &[Ty<'tcx>],
3869         args: &'tcx [hir::Expr<'tcx>],
3870         c_variadic: bool,
3871         tuple_arguments: TupleArgumentsFlag,
3872         def_span: Option<Span>,
3873     ) {
3874         let tcx = self.tcx;
3875         // Grab the argument types, supplying fresh type variables
3876         // if the wrong number of arguments were supplied
3877         let supplied_arg_count = if tuple_arguments == DontTupleArguments { args.len() } else { 1 };
3878
3879         // All the input types from the fn signature must outlive the call
3880         // so as to validate implied bounds.
3881         for (fn_input_ty, arg_expr) in fn_inputs.iter().zip(args.iter()) {
3882             self.register_wf_obligation(fn_input_ty, arg_expr.span, traits::MiscObligation);
3883         }
3884
3885         let expected_arg_count = fn_inputs.len();
3886
3887         let param_count_error = |expected_count: usize,
3888                                  arg_count: usize,
3889                                  error_code: &str,
3890                                  c_variadic: bool,
3891                                  sugg_unit: bool| {
3892             let (span, start_span, args) = match &expr.kind {
3893                 hir::ExprKind::Call(hir::Expr { span, .. }, args) => (*span, *span, &args[..]),
3894                 hir::ExprKind::MethodCall(path_segment, span, args) => (
3895                     *span,
3896                     // `sp` doesn't point at the whole `foo.bar()`, only at `bar`.
3897                     path_segment
3898                         .args
3899                         .and_then(|args| args.args.iter().last())
3900                         // Account for `foo.bar::<T>()`.
3901                         .map(|arg| {
3902                             // Skip the closing `>`.
3903                             tcx.sess
3904                                 .source_map()
3905                                 .next_point(tcx.sess.source_map().next_point(arg.span()))
3906                         })
3907                         .unwrap_or(*span),
3908                     &args[1..], // Skip the receiver.
3909                 ),
3910                 k => span_bug!(sp, "checking argument types on a non-call: `{:?}`", k),
3911             };
3912             let arg_spans = if args.is_empty() {
3913                 // foo()
3914                 // ^^^-- supplied 0 arguments
3915                 // |
3916                 // expected 2 arguments
3917                 vec![tcx.sess.source_map().next_point(start_span).with_hi(sp.hi())]
3918             } else {
3919                 // foo(1, 2, 3)
3920                 // ^^^ -  -  - supplied 3 arguments
3921                 // |
3922                 // expected 2 arguments
3923                 args.iter().map(|arg| arg.span).collect::<Vec<Span>>()
3924             };
3925
3926             let mut err = tcx.sess.struct_span_err_with_code(
3927                 span,
3928                 &format!(
3929                     "this function takes {}{} but {} {} supplied",
3930                     if c_variadic { "at least " } else { "" },
3931                     potentially_plural_count(expected_count, "argument"),
3932                     potentially_plural_count(arg_count, "argument"),
3933                     if arg_count == 1 { "was" } else { "were" }
3934                 ),
3935                 DiagnosticId::Error(error_code.to_owned()),
3936             );
3937             let label = format!("supplied {}", potentially_plural_count(arg_count, "argument"));
3938             for (i, span) in arg_spans.into_iter().enumerate() {
3939                 err.span_label(
3940                     span,
3941                     if arg_count == 0 || i + 1 == arg_count { &label } else { "" },
3942                 );
3943             }
3944
3945             if let Some(def_s) = def_span.map(|sp| tcx.sess.source_map().guess_head_span(sp)) {
3946                 err.span_label(def_s, "defined here");
3947             }
3948             if sugg_unit {
3949                 let sugg_span = tcx.sess.source_map().end_point(expr.span);
3950                 // remove closing `)` from the span
3951                 let sugg_span = sugg_span.shrink_to_lo();
3952                 err.span_suggestion(
3953                     sugg_span,
3954                     "expected the unit value `()`; create it with empty parentheses",
3955                     String::from("()"),
3956                     Applicability::MachineApplicable,
3957                 );
3958             } else {
3959                 err.span_label(
3960                     span,
3961                     format!(
3962                         "expected {}{}",
3963                         if c_variadic { "at least " } else { "" },
3964                         potentially_plural_count(expected_count, "argument")
3965                     ),
3966                 );
3967             }
3968             err.emit();
3969         };
3970
3971         let mut expected_arg_tys = expected_arg_tys.to_vec();
3972
3973         let formal_tys = if tuple_arguments == TupleArguments {
3974             let tuple_type = self.structurally_resolved_type(sp, fn_inputs[0]);
3975             match tuple_type.kind {
3976                 ty::Tuple(arg_types) if arg_types.len() != args.len() => {
3977                     param_count_error(arg_types.len(), args.len(), "E0057", false, false);
3978                     expected_arg_tys = vec![];
3979                     self.err_args(args.len())
3980                 }
3981                 ty::Tuple(arg_types) => {
3982                     expected_arg_tys = match expected_arg_tys.get(0) {
3983                         Some(&ty) => match ty.kind {
3984                             ty::Tuple(ref tys) => tys.iter().map(|k| k.expect_ty()).collect(),
3985                             _ => vec![],
3986                         },
3987                         None => vec![],
3988                     };
3989                     arg_types.iter().map(|k| k.expect_ty()).collect()
3990                 }
3991                 _ => {
3992                     struct_span_err!(
3993                         tcx.sess,
3994                         sp,
3995                         E0059,
3996                         "cannot use call notation; the first type parameter \
3997                          for the function trait is neither a tuple nor unit"
3998                     )
3999                     .emit();
4000                     expected_arg_tys = vec![];
4001                     self.err_args(args.len())
4002                 }
4003             }
4004         } else if expected_arg_count == supplied_arg_count {
4005             fn_inputs.to_vec()
4006         } else if c_variadic {
4007             if supplied_arg_count >= expected_arg_count {
4008                 fn_inputs.to_vec()
4009             } else {
4010                 param_count_error(expected_arg_count, supplied_arg_count, "E0060", true, false);
4011                 expected_arg_tys = vec![];
4012                 self.err_args(supplied_arg_count)
4013             }
4014         } else {
4015             // is the missing argument of type `()`?
4016             let sugg_unit = if expected_arg_tys.len() == 1 && supplied_arg_count == 0 {
4017                 self.resolve_vars_if_possible(&expected_arg_tys[0]).is_unit()
4018             } else if fn_inputs.len() == 1 && supplied_arg_count == 0 {
4019                 self.resolve_vars_if_possible(&fn_inputs[0]).is_unit()
4020             } else {
4021                 false
4022             };
4023             param_count_error(expected_arg_count, supplied_arg_count, "E0061", false, sugg_unit);
4024
4025             expected_arg_tys = vec![];
4026             self.err_args(supplied_arg_count)
4027         };
4028
4029         debug!(
4030             "check_argument_types: formal_tys={:?}",
4031             formal_tys.iter().map(|t| self.ty_to_string(*t)).collect::<Vec<String>>()
4032         );
4033
4034         // If there is no expectation, expect formal_tys.
4035         let expected_arg_tys =
4036             if !expected_arg_tys.is_empty() { expected_arg_tys } else { formal_tys.clone() };
4037
4038         let mut final_arg_types: Vec<(usize, Ty<'_>, Ty<'_>)> = vec![];
4039
4040         // Check the arguments.
4041         // We do this in a pretty awful way: first we type-check any arguments
4042         // that are not closures, then we type-check the closures. This is so
4043         // that we have more information about the types of arguments when we
4044         // type-check the functions. This isn't really the right way to do this.
4045         for &check_closures in &[false, true] {
4046             debug!("check_closures={}", check_closures);
4047
4048             // More awful hacks: before we check argument types, try to do
4049             // an "opportunistic" vtable resolution of any trait bounds on
4050             // the call. This helps coercions.
4051             if check_closures {
4052                 self.select_obligations_where_possible(false, |errors| {
4053                     self.point_at_type_arg_instead_of_call_if_possible(errors, expr);
4054                     self.point_at_arg_instead_of_call_if_possible(
4055                         errors,
4056                         &final_arg_types[..],
4057                         sp,
4058                         &args,
4059                     );
4060                 })
4061             }
4062
4063             // For C-variadic functions, we don't have a declared type for all of
4064             // the arguments hence we only do our usual type checking with
4065             // the arguments who's types we do know.
4066             let t = if c_variadic {
4067                 expected_arg_count
4068             } else if tuple_arguments == TupleArguments {
4069                 args.len()
4070             } else {
4071                 supplied_arg_count
4072             };
4073             for (i, arg) in args.iter().take(t).enumerate() {
4074                 // Warn only for the first loop (the "no closures" one).
4075                 // Closure arguments themselves can't be diverging, but
4076                 // a previous argument can, e.g., `foo(panic!(), || {})`.
4077                 if !check_closures {
4078                     self.warn_if_unreachable(arg.hir_id, arg.span, "expression");
4079                 }
4080
4081                 let is_closure = match arg.kind {
4082                     ExprKind::Closure(..) => true,
4083                     _ => false,
4084                 };
4085
4086                 if is_closure != check_closures {
4087                     continue;
4088                 }
4089
4090                 debug!("checking the argument");
4091                 let formal_ty = formal_tys[i];
4092
4093                 // The special-cased logic below has three functions:
4094                 // 1. Provide as good of an expected type as possible.
4095                 let expected = Expectation::rvalue_hint(self, expected_arg_tys[i]);
4096
4097                 let checked_ty = self.check_expr_with_expectation(&arg, expected);
4098
4099                 // 2. Coerce to the most detailed type that could be coerced
4100                 //    to, which is `expected_ty` if `rvalue_hint` returns an
4101                 //    `ExpectHasType(expected_ty)`, or the `formal_ty` otherwise.
4102                 let coerce_ty = expected.only_has_type(self).unwrap_or(formal_ty);
4103                 // We're processing function arguments so we definitely want to use
4104                 // two-phase borrows.
4105                 self.demand_coerce(&arg, checked_ty, coerce_ty, AllowTwoPhase::Yes);
4106                 final_arg_types.push((i, checked_ty, coerce_ty));
4107
4108                 // 3. Relate the expected type and the formal one,
4109                 //    if the expected type was used for the coercion.
4110                 self.demand_suptype(arg.span, formal_ty, coerce_ty);
4111             }
4112         }
4113
4114         // We also need to make sure we at least write the ty of the other
4115         // arguments which we skipped above.
4116         if c_variadic {
4117             fn variadic_error<'tcx>(s: &Session, span: Span, t: Ty<'tcx>, cast_ty: &str) {
4118                 use crate::structured_errors::{StructuredDiagnostic, VariadicError};
4119                 VariadicError::new(s, span, t, cast_ty).diagnostic().emit();
4120             }
4121
4122             for arg in args.iter().skip(expected_arg_count) {
4123                 let arg_ty = self.check_expr(&arg);
4124
4125                 // There are a few types which get autopromoted when passed via varargs
4126                 // in C but we just error out instead and require explicit casts.
4127                 let arg_ty = self.structurally_resolved_type(arg.span, arg_ty);
4128                 match arg_ty.kind {
4129                     ty::Float(ast::FloatTy::F32) => {
4130                         variadic_error(tcx.sess, arg.span, arg_ty, "c_double");
4131                     }
4132                     ty::Int(ast::IntTy::I8 | ast::IntTy::I16) | ty::Bool => {
4133                         variadic_error(tcx.sess, arg.span, arg_ty, "c_int");
4134                     }
4135                     ty::Uint(ast::UintTy::U8 | ast::UintTy::U16) => {
4136                         variadic_error(tcx.sess, arg.span, arg_ty, "c_uint");
4137                     }
4138                     ty::FnDef(..) => {
4139                         let ptr_ty = self.tcx.mk_fn_ptr(arg_ty.fn_sig(self.tcx));
4140                         let ptr_ty = self.resolve_vars_if_possible(&ptr_ty);
4141                         variadic_error(tcx.sess, arg.span, arg_ty, &ptr_ty.to_string());
4142                     }
4143                     _ => {}
4144                 }
4145             }
4146         }
4147     }
4148
4149     fn err_args(&self, len: usize) -> Vec<Ty<'tcx>> {
4150         vec![self.tcx.types.err; len]
4151     }
4152
4153     /// Given a vec of evaluated `FulfillmentError`s and an `fn` call argument expressions, we walk
4154     /// the checked and coerced types for each argument to see if any of the `FulfillmentError`s
4155     /// reference a type argument. The reason to walk also the checked type is that the coerced type
4156     /// can be not easily comparable with predicate type (because of coercion). If the types match
4157     /// for either checked or coerced type, and there's only *one* argument that does, we point at
4158     /// the corresponding argument's expression span instead of the `fn` call path span.
4159     fn point_at_arg_instead_of_call_if_possible(
4160         &self,
4161         errors: &mut Vec<traits::FulfillmentError<'_>>,
4162         final_arg_types: &[(usize, Ty<'tcx>, Ty<'tcx>)],
4163         call_sp: Span,
4164         args: &'tcx [hir::Expr<'tcx>],
4165     ) {
4166         // We *do not* do this for desugared call spans to keep good diagnostics when involving
4167         // the `?` operator.
4168         if call_sp.desugaring_kind().is_some() {
4169             return;
4170         }
4171
4172         for error in errors {
4173             // Only if the cause is somewhere inside the expression we want try to point at arg.
4174             // Otherwise, it means that the cause is somewhere else and we should not change
4175             // anything because we can break the correct span.
4176             if !call_sp.contains(error.obligation.cause.span) {
4177                 continue;
4178             }
4179
4180             if let ty::Predicate::Trait(predicate, _) = error.obligation.predicate {
4181                 // Collect the argument position for all arguments that could have caused this
4182                 // `FulfillmentError`.
4183                 let mut referenced_in = final_arg_types
4184                     .iter()
4185                     .map(|&(i, checked_ty, _)| (i, checked_ty))
4186                     .chain(final_arg_types.iter().map(|&(i, _, coerced_ty)| (i, coerced_ty)))
4187                     .flat_map(|(i, ty)| {
4188                         let ty = self.resolve_vars_if_possible(&ty);
4189                         // We walk the argument type because the argument's type could have
4190                         // been `Option<T>`, but the `FulfillmentError` references `T`.
4191                         if ty.walk().any(|arg| arg == predicate.skip_binder().self_ty().into()) {
4192                             Some(i)
4193                         } else {
4194                             None
4195                         }
4196                     })
4197                     .collect::<Vec<_>>();
4198
4199                 // Both checked and coerced types could have matched, thus we need to remove
4200                 // duplicates.
4201                 referenced_in.sort();
4202                 referenced_in.dedup();
4203
4204                 if let (Some(ref_in), None) = (referenced_in.pop(), referenced_in.pop()) {
4205                     // We make sure that only *one* argument matches the obligation failure
4206                     // and we assign the obligation's span to its expression's.
4207                     error.obligation.cause.span = args[ref_in].span;
4208                     error.points_at_arg_span = true;
4209                 }
4210             }
4211         }
4212     }
4213
4214     /// Given a vec of evaluated `FulfillmentError`s and an `fn` call expression, we walk the
4215     /// `PathSegment`s and resolve their type parameters to see if any of the `FulfillmentError`s
4216     /// were caused by them. If they were, we point at the corresponding type argument's span
4217     /// instead of the `fn` call path span.
4218     fn point_at_type_arg_instead_of_call_if_possible(
4219         &self,
4220         errors: &mut Vec<traits::FulfillmentError<'_>>,
4221         call_expr: &'tcx hir::Expr<'tcx>,
4222     ) {
4223         if let hir::ExprKind::Call(path, _) = &call_expr.kind {
4224             if let hir::ExprKind::Path(qpath) = &path.kind {
4225                 if let hir::QPath::Resolved(_, path) = &qpath {
4226                     for error in errors {
4227                         if let ty::Predicate::Trait(predicate, _) = error.obligation.predicate {
4228                             // If any of the type arguments in this path segment caused the
4229                             // `FullfillmentError`, point at its span (#61860).
4230                             for arg in path
4231                                 .segments
4232                                 .iter()
4233                                 .filter_map(|seg| seg.args.as_ref())
4234                                 .flat_map(|a| a.args.iter())
4235                             {
4236                                 if let hir::GenericArg::Type(hir_ty) = &arg {
4237                                     if let hir::TyKind::Path(hir::QPath::TypeRelative(..)) =
4238                                         &hir_ty.kind
4239                                     {
4240                                         // Avoid ICE with associated types. As this is best
4241                                         // effort only, it's ok to ignore the case. It
4242                                         // would trigger in `is_send::<T::AssocType>();`
4243                                         // from `typeck-default-trait-impl-assoc-type.rs`.
4244                                     } else {
4245                                         let ty = AstConv::ast_ty_to_ty(self, hir_ty);
4246                                         let ty = self.resolve_vars_if_possible(&ty);
4247                                         if ty == predicate.skip_binder().self_ty() {
4248                                             error.obligation.cause.span = hir_ty.span;
4249                                         }
4250                                     }
4251                                 }
4252                             }
4253                         }
4254                     }
4255                 }
4256             }
4257         }
4258     }
4259
4260     // AST fragment checking
4261     fn check_lit(&self, lit: &hir::Lit, expected: Expectation<'tcx>) -> Ty<'tcx> {
4262         let tcx = self.tcx;
4263
4264         match lit.node {
4265             ast::LitKind::Str(..) => tcx.mk_static_str(),
4266             ast::LitKind::ByteStr(ref v) => {
4267                 tcx.mk_imm_ref(tcx.lifetimes.re_static, tcx.mk_array(tcx.types.u8, v.len() as u64))
4268             }
4269             ast::LitKind::Byte(_) => tcx.types.u8,
4270             ast::LitKind::Char(_) => tcx.types.char,
4271             ast::LitKind::Int(_, ast::LitIntType::Signed(t)) => tcx.mk_mach_int(t),
4272             ast::LitKind::Int(_, ast::LitIntType::Unsigned(t)) => tcx.mk_mach_uint(t),
4273             ast::LitKind::Int(_, ast::LitIntType::Unsuffixed) => {
4274                 let opt_ty = expected.to_option(self).and_then(|ty| match ty.kind {
4275                     ty::Int(_) | ty::Uint(_) => Some(ty),
4276                     ty::Char => Some(tcx.types.u8),
4277                     ty::RawPtr(..) => Some(tcx.types.usize),
4278                     ty::FnDef(..) | ty::FnPtr(_) => Some(tcx.types.usize),
4279                     _ => None,
4280                 });
4281                 opt_ty.unwrap_or_else(|| self.next_int_var())
4282             }
4283             ast::LitKind::Float(_, ast::LitFloatType::Suffixed(t)) => tcx.mk_mach_float(t),
4284             ast::LitKind::Float(_, ast::LitFloatType::Unsuffixed) => {
4285                 let opt_ty = expected.to_option(self).and_then(|ty| match ty.kind {
4286                     ty::Float(_) => Some(ty),
4287                     _ => None,
4288                 });
4289                 opt_ty.unwrap_or_else(|| self.next_float_var())
4290             }
4291             ast::LitKind::Bool(_) => tcx.types.bool,
4292             ast::LitKind::Err(_) => tcx.types.err,
4293         }
4294     }
4295
4296     /// Unifies the output type with the expected type early, for more coercions
4297     /// and forward type information on the input expressions.
4298     fn expected_inputs_for_expected_output(
4299         &self,
4300         call_span: Span,
4301         expected_ret: Expectation<'tcx>,
4302         formal_ret: Ty<'tcx>,
4303         formal_args: &[Ty<'tcx>],
4304     ) -> Vec<Ty<'tcx>> {
4305         let formal_ret = self.resolve_vars_with_obligations(formal_ret);
4306         let ret_ty = match expected_ret.only_has_type(self) {
4307             Some(ret) => ret,
4308             None => return Vec::new(),
4309         };
4310         let expect_args = self
4311             .fudge_inference_if_ok(|| {
4312                 // Attempt to apply a subtyping relationship between the formal
4313                 // return type (likely containing type variables if the function
4314                 // is polymorphic) and the expected return type.
4315                 // No argument expectations are produced if unification fails.
4316                 let origin = self.misc(call_span);
4317                 let ures = self.at(&origin, self.param_env).sup(ret_ty, &formal_ret);
4318
4319                 // FIXME(#27336) can't use ? here, Try::from_error doesn't default
4320                 // to identity so the resulting type is not constrained.
4321                 match ures {
4322                     Ok(ok) => {
4323                         // Process any obligations locally as much as
4324                         // we can.  We don't care if some things turn
4325                         // out unconstrained or ambiguous, as we're
4326                         // just trying to get hints here.
4327                         self.save_and_restore_in_snapshot_flag(|_| {
4328                             let mut fulfill = TraitEngine::new(self.tcx);
4329                             for obligation in ok.obligations {
4330                                 fulfill.register_predicate_obligation(self, obligation);
4331                             }
4332                             fulfill.select_where_possible(self)
4333                         })
4334                         .map_err(|_| ())?;
4335                     }
4336                     Err(_) => return Err(()),
4337                 }
4338
4339                 // Record all the argument types, with the substitutions
4340                 // produced from the above subtyping unification.
4341                 Ok(formal_args.iter().map(|ty| self.resolve_vars_if_possible(ty)).collect())
4342             })
4343             .unwrap_or_default();
4344         debug!(
4345             "expected_inputs_for_expected_output(formal={:?} -> {:?}, expected={:?} -> {:?})",
4346             formal_args, formal_ret, expect_args, expected_ret
4347         );
4348         expect_args
4349     }
4350
4351     pub fn check_struct_path(
4352         &self,
4353         qpath: &QPath<'_>,
4354         hir_id: hir::HirId,
4355     ) -> Option<(&'tcx ty::VariantDef, Ty<'tcx>)> {
4356         let path_span = match *qpath {
4357             QPath::Resolved(_, ref path) => path.span,
4358             QPath::TypeRelative(ref qself, _) => qself.span,
4359         };
4360         let (def, ty) = self.finish_resolving_struct_path(qpath, path_span, hir_id);
4361         let variant = match def {
4362             Res::Err => {
4363                 self.set_tainted_by_errors();
4364                 return None;
4365             }
4366             Res::Def(DefKind::Variant, _) => match ty.kind {
4367                 ty::Adt(adt, substs) => Some((adt.variant_of_res(def), adt.did, substs)),
4368                 _ => bug!("unexpected type: {:?}", ty),
4369             },
4370             Res::Def(DefKind::Struct | DefKind::Union | DefKind::TyAlias | DefKind::AssocTy, _)
4371             | Res::SelfTy(..) => match ty.kind {
4372                 ty::Adt(adt, substs) if !adt.is_enum() => {
4373                     Some((adt.non_enum_variant(), adt.did, substs))
4374                 }
4375                 _ => None,
4376             },
4377             _ => bug!("unexpected definition: {:?}", def),
4378         };
4379
4380         if let Some((variant, did, substs)) = variant {
4381             debug!("check_struct_path: did={:?} substs={:?}", did, substs);
4382             self.write_user_type_annotation_from_substs(hir_id, did, substs, None);
4383
4384             // Check bounds on type arguments used in the path.
4385             let (bounds, _) = self.instantiate_bounds(path_span, did, substs);
4386             let cause =
4387                 traits::ObligationCause::new(path_span, self.body_id, traits::ItemObligation(did));
4388             self.add_obligations_for_parameters(cause, &bounds);
4389
4390             Some((variant, ty))
4391         } else {
4392             struct_span_err!(
4393                 self.tcx.sess,
4394                 path_span,
4395                 E0071,
4396                 "expected struct, variant or union type, found {}",
4397                 ty.sort_string(self.tcx)
4398             )
4399             .span_label(path_span, "not a struct")
4400             .emit();
4401             None
4402         }
4403     }
4404
4405     // Finish resolving a path in a struct expression or pattern `S::A { .. }` if necessary.
4406     // The newly resolved definition is written into `type_dependent_defs`.
4407     fn finish_resolving_struct_path(
4408         &self,
4409         qpath: &QPath<'_>,
4410         path_span: Span,
4411         hir_id: hir::HirId,
4412     ) -> (Res, Ty<'tcx>) {
4413         match *qpath {
4414             QPath::Resolved(ref maybe_qself, ref path) => {
4415                 let self_ty = maybe_qself.as_ref().map(|qself| self.to_ty(qself));
4416                 let ty = AstConv::res_to_ty(self, self_ty, path, true);
4417                 (path.res, ty)
4418             }
4419             QPath::TypeRelative(ref qself, ref segment) => {
4420                 let ty = self.to_ty(qself);
4421
4422                 let res = if let hir::TyKind::Path(QPath::Resolved(_, ref path)) = qself.kind {
4423                     path.res
4424                 } else {
4425                     Res::Err
4426                 };
4427                 let result =
4428                     AstConv::associated_path_to_ty(self, hir_id, path_span, ty, res, segment, true);
4429                 let ty = result.map(|(ty, _, _)| ty).unwrap_or(self.tcx().types.err);
4430                 let result = result.map(|(_, kind, def_id)| (kind, def_id));
4431
4432                 // Write back the new resolution.
4433                 self.write_resolution(hir_id, result);
4434
4435                 (result.map(|(kind, def_id)| Res::Def(kind, def_id)).unwrap_or(Res::Err), ty)
4436             }
4437         }
4438     }
4439
4440     /// Resolves an associated value path into a base type and associated constant, or method
4441     /// resolution. The newly resolved definition is written into `type_dependent_defs`.
4442     pub fn resolve_ty_and_res_ufcs<'b>(
4443         &self,
4444         qpath: &'b QPath<'b>,
4445         hir_id: hir::HirId,
4446         span: Span,
4447     ) -> (Res, Option<Ty<'tcx>>, &'b [hir::PathSegment<'b>]) {
4448         debug!("resolve_ty_and_res_ufcs: qpath={:?} hir_id={:?} span={:?}", qpath, hir_id, span);
4449         let (ty, qself, item_segment) = match *qpath {
4450             QPath::Resolved(ref opt_qself, ref path) => {
4451                 return (
4452                     path.res,
4453                     opt_qself.as_ref().map(|qself| self.to_ty(qself)),
4454                     &path.segments[..],
4455                 );
4456             }
4457             QPath::TypeRelative(ref qself, ref segment) => (self.to_ty(qself), qself, segment),
4458         };
4459         if let Some(&cached_result) = self.tables.borrow().type_dependent_defs().get(hir_id) {
4460             // Return directly on cache hit. This is useful to avoid doubly reporting
4461             // errors with default match binding modes. See #44614.
4462             let def =
4463                 cached_result.map(|(kind, def_id)| Res::Def(kind, def_id)).unwrap_or(Res::Err);
4464             return (def, Some(ty), slice::from_ref(&**item_segment));
4465         }
4466         let item_name = item_segment.ident;
4467         let result = self.resolve_ufcs(span, item_name, ty, hir_id).or_else(|error| {
4468             let result = match error {
4469                 method::MethodError::PrivateMatch(kind, def_id, _) => Ok((kind, def_id)),
4470                 _ => Err(ErrorReported),
4471             };
4472             if item_name.name != kw::Invalid {
4473                 self.report_method_error(
4474                     span,
4475                     ty,
4476                     item_name,
4477                     SelfSource::QPath(qself),
4478                     error,
4479                     None,
4480                 )
4481                 .map(|mut e| e.emit());
4482             }
4483             result
4484         });
4485
4486         // Write back the new resolution.
4487         self.write_resolution(hir_id, result);
4488         (
4489             result.map(|(kind, def_id)| Res::Def(kind, def_id)).unwrap_or(Res::Err),
4490             Some(ty),
4491             slice::from_ref(&**item_segment),
4492         )
4493     }
4494
4495     pub fn check_decl_initializer(
4496         &self,
4497         local: &'tcx hir::Local<'tcx>,
4498         init: &'tcx hir::Expr<'tcx>,
4499     ) -> Ty<'tcx> {
4500         // FIXME(tschottdorf): `contains_explicit_ref_binding()` must be removed
4501         // for #42640 (default match binding modes).
4502         //
4503         // See #44848.
4504         let ref_bindings = local.pat.contains_explicit_ref_binding();
4505
4506         let local_ty = self.local_ty(init.span, local.hir_id).revealed_ty;
4507         if let Some(m) = ref_bindings {
4508             // Somewhat subtle: if we have a `ref` binding in the pattern,
4509             // we want to avoid introducing coercions for the RHS. This is
4510             // both because it helps preserve sanity and, in the case of
4511             // ref mut, for soundness (issue #23116). In particular, in
4512             // the latter case, we need to be clear that the type of the
4513             // referent for the reference that results is *equal to* the
4514             // type of the place it is referencing, and not some
4515             // supertype thereof.
4516             let init_ty = self.check_expr_with_needs(init, Needs::maybe_mut_place(m));
4517             self.demand_eqtype(init.span, local_ty, init_ty);
4518             init_ty
4519         } else {
4520             self.check_expr_coercable_to_type(init, local_ty)
4521         }
4522     }
4523
4524     /// Type check a `let` statement.
4525     pub fn check_decl_local(&self, local: &'tcx hir::Local<'tcx>) {
4526         // Determine and write the type which we'll check the pattern against.
4527         let ty = self.local_ty(local.span, local.hir_id).decl_ty;
4528         self.write_ty(local.hir_id, ty);
4529
4530         // Type check the initializer.
4531         if let Some(ref init) = local.init {
4532             let init_ty = self.check_decl_initializer(local, &init);
4533             self.overwrite_local_ty_if_err(local, ty, init_ty);
4534         }
4535
4536         // Does the expected pattern type originate from an expression and what is the span?
4537         let (origin_expr, ty_span) = match (local.ty, local.init) {
4538             (Some(ty), _) => (false, Some(ty.span)), // Bias towards the explicit user type.
4539             (_, Some(init)) => (true, Some(init.span)), // No explicit type; so use the scrutinee.
4540             _ => (false, None), // We have `let $pat;`, so the expected type is unconstrained.
4541         };
4542
4543         // Type check the pattern. Override if necessary to avoid knock-on errors.
4544         self.check_pat_top(&local.pat, ty, ty_span, origin_expr);
4545         let pat_ty = self.node_ty(local.pat.hir_id);
4546         self.overwrite_local_ty_if_err(local, ty, pat_ty);
4547     }
4548
4549     fn overwrite_local_ty_if_err(
4550         &self,
4551         local: &'tcx hir::Local<'tcx>,
4552         decl_ty: Ty<'tcx>,
4553         ty: Ty<'tcx>,
4554     ) {
4555         if ty.references_error() {
4556             // Override the types everywhere with `types.err` to avoid knock on errors.
4557             self.write_ty(local.hir_id, ty);
4558             self.write_ty(local.pat.hir_id, ty);
4559             let local_ty = LocalTy { decl_ty, revealed_ty: ty };
4560             self.locals.borrow_mut().insert(local.hir_id, local_ty);
4561             self.locals.borrow_mut().insert(local.pat.hir_id, local_ty);
4562         }
4563     }
4564
4565     fn suggest_semicolon_at_end(&self, span: Span, err: &mut DiagnosticBuilder<'_>) {
4566         err.span_suggestion_short(
4567             span.shrink_to_hi(),
4568             "consider using a semicolon here",
4569             ";".to_string(),
4570             Applicability::MachineApplicable,
4571         );
4572     }
4573
4574     pub fn check_stmt(&self, stmt: &'tcx hir::Stmt<'tcx>) {
4575         // Don't do all the complex logic below for `DeclItem`.
4576         match stmt.kind {
4577             hir::StmtKind::Item(..) => return,
4578             hir::StmtKind::Local(..) | hir::StmtKind::Expr(..) | hir::StmtKind::Semi(..) => {}
4579         }
4580
4581         self.warn_if_unreachable(stmt.hir_id, stmt.span, "statement");
4582
4583         // Hide the outer diverging and `has_errors` flags.
4584         let old_diverges = self.diverges.replace(Diverges::Maybe);
4585         let old_has_errors = self.has_errors.replace(false);
4586
4587         match stmt.kind {
4588             hir::StmtKind::Local(ref l) => {
4589                 self.check_decl_local(&l);
4590             }
4591             // Ignore for now.
4592             hir::StmtKind::Item(_) => {}
4593             hir::StmtKind::Expr(ref expr) => {
4594                 // Check with expected type of `()`.
4595                 self.check_expr_has_type_or_error(&expr, self.tcx.mk_unit(), |err| {
4596                     self.suggest_semicolon_at_end(expr.span, err);
4597                 });
4598             }
4599             hir::StmtKind::Semi(ref expr) => {
4600                 self.check_expr(&expr);
4601             }
4602         }
4603
4604         // Combine the diverging and `has_error` flags.
4605         self.diverges.set(self.diverges.get() | old_diverges);
4606         self.has_errors.set(self.has_errors.get() | old_has_errors);
4607     }
4608
4609     pub fn check_block_no_value(&self, blk: &'tcx hir::Block<'tcx>) {
4610         let unit = self.tcx.mk_unit();
4611         let ty = self.check_block_with_expected(blk, ExpectHasType(unit));
4612
4613         // if the block produces a `!` value, that can always be
4614         // (effectively) coerced to unit.
4615         if !ty.is_never() {
4616             self.demand_suptype(blk.span, unit, ty);
4617         }
4618     }
4619
4620     /// If `expr` is a `match` expression that has only one non-`!` arm, use that arm's tail
4621     /// expression's `Span`, otherwise return `expr.span`. This is done to give better errors
4622     /// when given code like the following:
4623     /// ```text
4624     /// if false { return 0i32; } else { 1u32 }
4625     /// //                               ^^^^ point at this instead of the whole `if` expression
4626     /// ```
4627     fn get_expr_coercion_span(&self, expr: &hir::Expr<'_>) -> rustc_span::Span {
4628         if let hir::ExprKind::Match(_, arms, _) = &expr.kind {
4629             let arm_spans: Vec<Span> = arms
4630                 .iter()
4631                 .filter_map(|arm| {
4632                     self.in_progress_tables
4633                         .and_then(|tables| tables.borrow().node_type_opt(arm.body.hir_id))
4634                         .and_then(|arm_ty| {
4635                             if arm_ty.is_never() {
4636                                 None
4637                             } else {
4638                                 Some(match &arm.body.kind {
4639                                     // Point at the tail expression when possible.
4640                                     hir::ExprKind::Block(block, _) => {
4641                                         block.expr.as_ref().map(|e| e.span).unwrap_or(block.span)
4642                                     }
4643                                     _ => arm.body.span,
4644                                 })
4645                             }
4646                         })
4647                 })
4648                 .collect();
4649             if arm_spans.len() == 1 {
4650                 return arm_spans[0];
4651             }
4652         }
4653         expr.span
4654     }
4655
4656     fn check_block_with_expected(
4657         &self,
4658         blk: &'tcx hir::Block<'tcx>,
4659         expected: Expectation<'tcx>,
4660     ) -> Ty<'tcx> {
4661         let prev = {
4662             let mut fcx_ps = self.ps.borrow_mut();
4663             let unsafety_state = fcx_ps.recurse(blk);
4664             replace(&mut *fcx_ps, unsafety_state)
4665         };
4666
4667         // In some cases, blocks have just one exit, but other blocks
4668         // can be targeted by multiple breaks. This can happen both
4669         // with labeled blocks as well as when we desugar
4670         // a `try { ... }` expression.
4671         //
4672         // Example 1:
4673         //
4674         //    'a: { if true { break 'a Err(()); } Ok(()) }
4675         //
4676         // Here we would wind up with two coercions, one from
4677         // `Err(())` and the other from the tail expression
4678         // `Ok(())`. If the tail expression is omitted, that's a
4679         // "forced unit" -- unless the block diverges, in which
4680         // case we can ignore the tail expression (e.g., `'a: {
4681         // break 'a 22; }` would not force the type of the block
4682         // to be `()`).
4683         let tail_expr = blk.expr.as_ref();
4684         let coerce_to_ty = expected.coercion_target_type(self, blk.span);
4685         let coerce = if blk.targeted_by_break {
4686             CoerceMany::new(coerce_to_ty)
4687         } else {
4688             let tail_expr: &[&hir::Expr<'_>] = match tail_expr {
4689                 Some(e) => slice::from_ref(e),
4690                 None => &[],
4691             };
4692             CoerceMany::with_coercion_sites(coerce_to_ty, tail_expr)
4693         };
4694
4695         let prev_diverges = self.diverges.get();
4696         let ctxt = BreakableCtxt { coerce: Some(coerce), may_break: false };
4697
4698         let (ctxt, ()) = self.with_breakable_ctxt(blk.hir_id, ctxt, || {
4699             for s in blk.stmts {
4700                 self.check_stmt(s);
4701             }
4702
4703             // check the tail expression **without** holding the
4704             // `enclosing_breakables` lock below.
4705             let tail_expr_ty = tail_expr.map(|t| self.check_expr_with_expectation(t, expected));
4706
4707             let mut enclosing_breakables = self.enclosing_breakables.borrow_mut();
4708             let ctxt = enclosing_breakables.find_breakable(blk.hir_id);
4709             let coerce = ctxt.coerce.as_mut().unwrap();
4710             if let Some(tail_expr_ty) = tail_expr_ty {
4711                 let tail_expr = tail_expr.unwrap();
4712                 let span = self.get_expr_coercion_span(tail_expr);
4713                 let cause = self.cause(span, ObligationCauseCode::BlockTailExpression(blk.hir_id));
4714                 coerce.coerce(self, &cause, tail_expr, tail_expr_ty);
4715             } else {
4716                 // Subtle: if there is no explicit tail expression,
4717                 // that is typically equivalent to a tail expression
4718                 // of `()` -- except if the block diverges. In that
4719                 // case, there is no value supplied from the tail
4720                 // expression (assuming there are no other breaks,
4721                 // this implies that the type of the block will be
4722                 // `!`).
4723                 //
4724                 // #41425 -- label the implicit `()` as being the
4725                 // "found type" here, rather than the "expected type".
4726                 if !self.diverges.get().is_always() {
4727                     // #50009 -- Do not point at the entire fn block span, point at the return type
4728                     // span, as it is the cause of the requirement, and
4729                     // `consider_hint_about_removing_semicolon` will point at the last expression
4730                     // if it were a relevant part of the error. This improves usability in editors
4731                     // that highlight errors inline.
4732                     let mut sp = blk.span;
4733                     let mut fn_span = None;
4734                     if let Some((decl, ident)) = self.get_parent_fn_decl(blk.hir_id) {
4735                         let ret_sp = decl.output.span();
4736                         if let Some(block_sp) = self.parent_item_span(blk.hir_id) {
4737                             // HACK: on some cases (`ui/liveness/liveness-issue-2163.rs`) the
4738                             // output would otherwise be incorrect and even misleading. Make sure
4739                             // the span we're aiming at correspond to a `fn` body.
4740                             if block_sp == blk.span {
4741                                 sp = ret_sp;
4742                                 fn_span = Some(ident.span);
4743                             }
4744                         }
4745                     }
4746                     coerce.coerce_forced_unit(
4747                         self,
4748                         &self.misc(sp),
4749                         &mut |err| {
4750                             if let Some(expected_ty) = expected.only_has_type(self) {
4751                                 self.consider_hint_about_removing_semicolon(blk, expected_ty, err);
4752                             }
4753                             if let Some(fn_span) = fn_span {
4754                                 err.span_label(
4755                                     fn_span,
4756                                     "implicitly returns `()` as its body has no tail or `return` \
4757                                      expression",
4758                                 );
4759                             }
4760                         },
4761                         false,
4762                     );
4763                 }
4764             }
4765         });
4766
4767         if ctxt.may_break {
4768             // If we can break from the block, then the block's exit is always reachable
4769             // (... as long as the entry is reachable) - regardless of the tail of the block.
4770             self.diverges.set(prev_diverges);
4771         }
4772
4773         let mut ty = ctxt.coerce.unwrap().complete(self);
4774
4775         if self.has_errors.get() || ty.references_error() {
4776             ty = self.tcx.types.err
4777         }
4778
4779         self.write_ty(blk.hir_id, ty);
4780
4781         *self.ps.borrow_mut() = prev;
4782         ty
4783     }
4784
4785     fn parent_item_span(&self, id: hir::HirId) -> Option<Span> {
4786         let node = self.tcx.hir().get(self.tcx.hir().get_parent_item(id));
4787         match node {
4788             Node::Item(&hir::Item { kind: hir::ItemKind::Fn(_, _, body_id), .. })
4789             | Node::ImplItem(&hir::ImplItem { kind: hir::ImplItemKind::Fn(_, body_id), .. }) => {
4790                 let body = self.tcx.hir().body(body_id);
4791                 if let ExprKind::Block(block, _) = &body.value.kind {
4792                     return Some(block.span);
4793                 }
4794             }
4795             _ => {}
4796         }
4797         None
4798     }
4799
4800     /// Given a function block's `HirId`, returns its `FnDecl` if it exists, or `None` otherwise.
4801     fn get_parent_fn_decl(
4802         &self,
4803         blk_id: hir::HirId,
4804     ) -> Option<(&'tcx hir::FnDecl<'tcx>, ast::Ident)> {
4805         let parent = self.tcx.hir().get(self.tcx.hir().get_parent_item(blk_id));
4806         self.get_node_fn_decl(parent).map(|(fn_decl, ident, _)| (fn_decl, ident))
4807     }
4808
4809     /// Given a function `Node`, return its `FnDecl` if it exists, or `None` otherwise.
4810     fn get_node_fn_decl(
4811         &self,
4812         node: Node<'tcx>,
4813     ) -> Option<(&'tcx hir::FnDecl<'tcx>, ast::Ident, bool)> {
4814         match node {
4815             Node::Item(&hir::Item { ident, kind: hir::ItemKind::Fn(ref sig, ..), .. }) => {
4816                 // This is less than ideal, it will not suggest a return type span on any
4817                 // method called `main`, regardless of whether it is actually the entry point,
4818                 // but it will still present it as the reason for the expected type.
4819                 Some((&sig.decl, ident, ident.name != sym::main))
4820             }
4821             Node::TraitItem(&hir::TraitItem {
4822                 ident,
4823                 kind: hir::TraitItemKind::Fn(ref sig, ..),
4824                 ..
4825             }) => Some((&sig.decl, ident, true)),
4826             Node::ImplItem(&hir::ImplItem {
4827                 ident,
4828                 kind: hir::ImplItemKind::Fn(ref sig, ..),
4829                 ..
4830             }) => Some((&sig.decl, ident, false)),
4831             _ => None,
4832         }
4833     }
4834
4835     /// Given a `HirId`, return the `FnDecl` of the method it is enclosed by and whether a
4836     /// suggestion can be made, `None` otherwise.
4837     pub fn get_fn_decl(&self, blk_id: hir::HirId) -> Option<(&'tcx hir::FnDecl<'tcx>, bool)> {
4838         // Get enclosing Fn, if it is a function or a trait method, unless there's a `loop` or
4839         // `while` before reaching it, as block tail returns are not available in them.
4840         self.tcx.hir().get_return_block(blk_id).and_then(|blk_id| {
4841             let parent = self.tcx.hir().get(blk_id);
4842             self.get_node_fn_decl(parent).map(|(fn_decl, _, is_main)| (fn_decl, is_main))
4843         })
4844     }
4845
4846     /// On implicit return expressions with mismatched types, provides the following suggestions:
4847     ///
4848     /// - Points out the method's return type as the reason for the expected type.
4849     /// - Possible missing semicolon.
4850     /// - Possible missing return type if the return type is the default, and not `fn main()`.
4851     pub fn suggest_mismatched_types_on_tail(
4852         &self,
4853         err: &mut DiagnosticBuilder<'_>,
4854         expr: &'tcx hir::Expr<'tcx>,
4855         expected: Ty<'tcx>,
4856         found: Ty<'tcx>,
4857         cause_span: Span,
4858         blk_id: hir::HirId,
4859     ) -> bool {
4860         let expr = expr.peel_drop_temps();
4861         self.suggest_missing_semicolon(err, expr, expected, cause_span);
4862         let mut pointing_at_return_type = false;
4863         if let Some((fn_decl, can_suggest)) = self.get_fn_decl(blk_id) {
4864             pointing_at_return_type =
4865                 self.suggest_missing_return_type(err, &fn_decl, expected, found, can_suggest);
4866         }
4867         pointing_at_return_type
4868     }
4869
4870     /// When encountering an fn-like ctor that needs to unify with a value, check whether calling
4871     /// the ctor would successfully solve the type mismatch and if so, suggest it:
4872     /// ```
4873     /// fn foo(x: usize) -> usize { x }
4874     /// let x: usize = foo;  // suggest calling the `foo` function: `foo(42)`
4875     /// ```
4876     fn suggest_fn_call(
4877         &self,
4878         err: &mut DiagnosticBuilder<'_>,
4879         expr: &hir::Expr<'_>,
4880         expected: Ty<'tcx>,
4881         found: Ty<'tcx>,
4882     ) -> bool {
4883         let hir = self.tcx.hir();
4884         let (def_id, sig) = match found.kind {
4885             ty::FnDef(def_id, _) => (def_id, found.fn_sig(self.tcx)),
4886             ty::Closure(def_id, substs) => (def_id, substs.as_closure().sig()),
4887             _ => return false,
4888         };
4889
4890         let sig = self.replace_bound_vars_with_fresh_vars(expr.span, infer::FnCall, &sig).0;
4891         let sig = self.normalize_associated_types_in(expr.span, &sig);
4892         if self.can_coerce(sig.output(), expected) {
4893             let (mut sugg_call, applicability) = if sig.inputs().is_empty() {
4894                 (String::new(), Applicability::MachineApplicable)
4895             } else {
4896                 ("...".to_string(), Applicability::HasPlaceholders)
4897             };
4898             let mut msg = "call this function";
4899             match hir.get_if_local(def_id) {
4900                 Some(
4901                     Node::Item(hir::Item { kind: ItemKind::Fn(.., body_id), .. })
4902                     | Node::ImplItem(hir::ImplItem {
4903                         kind: hir::ImplItemKind::Fn(_, body_id), ..
4904                     })
4905                     | Node::TraitItem(hir::TraitItem {
4906                         kind: hir::TraitItemKind::Fn(.., hir::TraitFn::Provided(body_id)),
4907                         ..
4908                     }),
4909                 ) => {
4910                     let body = hir.body(*body_id);
4911                     sugg_call = body
4912                         .params
4913                         .iter()
4914                         .map(|param| match &param.pat.kind {
4915                             hir::PatKind::Binding(_, _, ident, None)
4916                                 if ident.name != kw::SelfLower =>
4917                             {
4918                                 ident.to_string()
4919                             }
4920                             _ => "_".to_string(),
4921                         })
4922                         .collect::<Vec<_>>()
4923                         .join(", ");
4924                 }
4925                 Some(Node::Expr(hir::Expr {
4926                     kind: ExprKind::Closure(_, _, body_id, _, _),
4927                     span: full_closure_span,
4928                     ..
4929                 })) => {
4930                     if *full_closure_span == expr.span {
4931                         return false;
4932                     }
4933                     msg = "call this closure";
4934                     let body = hir.body(*body_id);
4935                     sugg_call = body
4936                         .params
4937                         .iter()
4938                         .map(|param| match &param.pat.kind {
4939                             hir::PatKind::Binding(_, _, ident, None)
4940                                 if ident.name != kw::SelfLower =>
4941                             {
4942                                 ident.to_string()
4943                             }
4944                             _ => "_".to_string(),
4945                         })
4946                         .collect::<Vec<_>>()
4947                         .join(", ");
4948                 }
4949                 Some(Node::Ctor(hir::VariantData::Tuple(fields, _))) => {
4950                     sugg_call = fields.iter().map(|_| "_").collect::<Vec<_>>().join(", ");
4951                     match hir.as_local_hir_id(def_id).and_then(|hir_id| hir.def_kind(hir_id)) {
4952                         Some(hir::def::DefKind::Ctor(hir::def::CtorOf::Variant, _)) => {
4953                             msg = "instantiate this tuple variant";
4954                         }
4955                         Some(hir::def::DefKind::Ctor(hir::def::CtorOf::Struct, _)) => {
4956                             msg = "instantiate this tuple struct";
4957                         }
4958                         _ => {}
4959                     }
4960                 }
4961                 Some(Node::ForeignItem(hir::ForeignItem {
4962                     kind: hir::ForeignItemKind::Fn(_, idents, _),
4963                     ..
4964                 })) => {
4965                     sugg_call = idents
4966                         .iter()
4967                         .map(|ident| {
4968                             if ident.name != kw::SelfLower {
4969                                 ident.to_string()
4970                             } else {
4971                                 "_".to_string()
4972                             }
4973                         })
4974                         .collect::<Vec<_>>()
4975                         .join(", ")
4976                 }
4977                 Some(Node::TraitItem(hir::TraitItem {
4978                     kind: hir::TraitItemKind::Fn(.., hir::TraitFn::Required(idents)),
4979                     ..
4980                 })) => {
4981                     sugg_call = idents
4982                         .iter()
4983                         .map(|ident| {
4984                             if ident.name != kw::SelfLower {
4985                                 ident.to_string()
4986                             } else {
4987                                 "_".to_string()
4988                             }
4989                         })
4990                         .collect::<Vec<_>>()
4991                         .join(", ")
4992                 }
4993                 _ => {}
4994             }
4995             err.span_suggestion_verbose(
4996                 expr.span.shrink_to_hi(),
4997                 &format!("use parentheses to {}", msg),
4998                 format!("({})", sugg_call),
4999                 applicability,
5000             );
5001             return true;
5002         }
5003         false
5004     }
5005
5006     pub fn suggest_ref_or_into(
5007         &self,
5008         err: &mut DiagnosticBuilder<'_>,
5009         expr: &hir::Expr<'_>,
5010         expected: Ty<'tcx>,
5011         found: Ty<'tcx>,
5012     ) {
5013         if let Some((sp, msg, suggestion)) = self.check_ref(expr, found, expected) {
5014             err.span_suggestion(sp, msg, suggestion, Applicability::MachineApplicable);
5015         } else if let (ty::FnDef(def_id, ..), true) =
5016             (&found.kind, self.suggest_fn_call(err, expr, expected, found))
5017         {
5018             if let Some(sp) = self.tcx.hir().span_if_local(*def_id) {
5019                 let sp = self.sess().source_map().guess_head_span(sp);
5020                 err.span_label(sp, &format!("{} defined here", found));
5021             }
5022         } else if !self.check_for_cast(err, expr, found, expected) {
5023             let is_struct_pat_shorthand_field =
5024                 self.is_hir_id_from_struct_pattern_shorthand_field(expr.hir_id, expr.span);
5025             let methods = self.get_conversion_methods(expr.span, expected, found, expr.hir_id);
5026             if let Ok(expr_text) = self.sess().source_map().span_to_snippet(expr.span) {
5027                 let mut suggestions = iter::repeat(&expr_text)
5028                     .zip(methods.iter())
5029                     .filter_map(|(receiver, method)| {
5030                         let method_call = format!(".{}()", method.ident);
5031                         if receiver.ends_with(&method_call) {
5032                             None // do not suggest code that is already there (#53348)
5033                         } else {
5034                             let method_call_list = [".to_vec()", ".to_string()"];
5035                             let sugg = if receiver.ends_with(".clone()")
5036                                 && method_call_list.contains(&method_call.as_str())
5037                             {
5038                                 let max_len = receiver.rfind('.').unwrap();
5039                                 format!("{}{}", &receiver[..max_len], method_call)
5040                             } else {
5041                                 if expr.precedence().order() < ExprPrecedence::MethodCall.order() {
5042                                     format!("({}){}", receiver, method_call)
5043                                 } else {
5044                                     format!("{}{}", receiver, method_call)
5045                                 }
5046                             };
5047                             Some(if is_struct_pat_shorthand_field {
5048                                 format!("{}: {}", receiver, sugg)
5049                             } else {
5050                                 sugg
5051                             })
5052                         }
5053                     })
5054                     .peekable();
5055                 if suggestions.peek().is_some() {
5056                     err.span_suggestions(
5057                         expr.span,
5058                         "try using a conversion method",
5059                         suggestions,
5060                         Applicability::MaybeIncorrect,
5061                     );
5062                 }
5063             }
5064         }
5065     }
5066
5067     /// When encountering the expected boxed value allocated in the stack, suggest allocating it
5068     /// in the heap by calling `Box::new()`.
5069     fn suggest_boxing_when_appropriate(
5070         &self,
5071         err: &mut DiagnosticBuilder<'_>,
5072         expr: &hir::Expr<'_>,
5073         expected: Ty<'tcx>,
5074         found: Ty<'tcx>,
5075     ) {
5076         if self.tcx.hir().is_const_context(expr.hir_id) {
5077             // Do not suggest `Box::new` in const context.
5078             return;
5079         }
5080         if !expected.is_box() || found.is_box() {
5081             return;
5082         }
5083         let boxed_found = self.tcx.mk_box(found);
5084         if let (true, Ok(snippet)) = (
5085             self.can_coerce(boxed_found, expected),
5086             self.sess().source_map().span_to_snippet(expr.span),
5087         ) {
5088             err.span_suggestion(
5089                 expr.span,
5090                 "store this in the heap by calling `Box::new`",
5091                 format!("Box::new({})", snippet),
5092                 Applicability::MachineApplicable,
5093             );
5094             err.note(
5095                 "for more on the distinction between the stack and the heap, read \
5096                  https://doc.rust-lang.org/book/ch15-01-box.html, \
5097                  https://doc.rust-lang.org/rust-by-example/std/box.html, and \
5098                  https://doc.rust-lang.org/std/boxed/index.html",
5099             );
5100         }
5101     }
5102
5103     /// When encountering an `impl Future` where `BoxFuture` is expected, suggest `Box::pin`.
5104     fn suggest_calling_boxed_future_when_appropriate(
5105         &self,
5106         err: &mut DiagnosticBuilder<'_>,
5107         expr: &hir::Expr<'_>,
5108         expected: Ty<'tcx>,
5109         found: Ty<'tcx>,
5110     ) -> bool {
5111         // Handle #68197.
5112
5113         if self.tcx.hir().is_const_context(expr.hir_id) {
5114             // Do not suggest `Box::new` in const context.
5115             return false;
5116         }
5117         let pin_did = self.tcx.lang_items().pin_type();
5118         match expected.kind {
5119             ty::Adt(def, _) if Some(def.did) != pin_did => return false,
5120             // This guards the `unwrap` and `mk_box` below.
5121             _ if pin_did.is_none() || self.tcx.lang_items().owned_box().is_none() => return false,
5122             _ => {}
5123         }
5124         let boxed_found = self.tcx.mk_box(found);
5125         let new_found = self.tcx.mk_lang_item(boxed_found, lang_items::PinTypeLangItem).unwrap();
5126         if let (true, Ok(snippet)) = (
5127             self.can_coerce(new_found, expected),
5128             self.sess().source_map().span_to_snippet(expr.span),
5129         ) {
5130             match found.kind {
5131                 ty::Adt(def, _) if def.is_box() => {
5132                     err.help("use `Box::pin`");
5133                 }
5134                 _ => {
5135                     err.span_suggestion(
5136                         expr.span,
5137                         "you need to pin and box this expression",
5138                         format!("Box::pin({})", snippet),
5139                         Applicability::MachineApplicable,
5140                     );
5141                 }
5142             }
5143             true
5144         } else {
5145             false
5146         }
5147     }
5148
5149     /// A common error is to forget to add a semicolon at the end of a block, e.g.,
5150     ///
5151     /// ```
5152     /// fn foo() {
5153     ///     bar_that_returns_u32()
5154     /// }
5155     /// ```
5156     ///
5157     /// This routine checks if the return expression in a block would make sense on its own as a
5158     /// statement and the return type has been left as default or has been specified as `()`. If so,
5159     /// it suggests adding a semicolon.
5160     fn suggest_missing_semicolon(
5161         &self,
5162         err: &mut DiagnosticBuilder<'_>,
5163         expression: &'tcx hir::Expr<'tcx>,
5164         expected: Ty<'tcx>,
5165         cause_span: Span,
5166     ) {
5167         if expected.is_unit() {
5168             // `BlockTailExpression` only relevant if the tail expr would be
5169             // useful on its own.
5170             match expression.kind {
5171                 ExprKind::Call(..)
5172                 | ExprKind::MethodCall(..)
5173                 | ExprKind::Loop(..)
5174                 | ExprKind::Match(..)
5175                 | ExprKind::Block(..) => {
5176                     err.span_suggestion(
5177                         cause_span.shrink_to_hi(),
5178                         "try adding a semicolon",
5179                         ";".to_string(),
5180                         Applicability::MachineApplicable,
5181                     );
5182                 }
5183                 _ => (),
5184             }
5185         }
5186     }
5187
5188     /// A possible error is to forget to add a return type that is needed:
5189     ///
5190     /// ```
5191     /// fn foo() {
5192     ///     bar_that_returns_u32()
5193     /// }
5194     /// ```
5195     ///
5196     /// This routine checks if the return type is left as default, the method is not part of an
5197     /// `impl` block and that it isn't the `main` method. If so, it suggests setting the return
5198     /// type.
5199     fn suggest_missing_return_type(
5200         &self,
5201         err: &mut DiagnosticBuilder<'_>,
5202         fn_decl: &hir::FnDecl<'_>,
5203         expected: Ty<'tcx>,
5204         found: Ty<'tcx>,
5205         can_suggest: bool,
5206     ) -> bool {
5207         // Only suggest changing the return type for methods that
5208         // haven't set a return type at all (and aren't `fn main()` or an impl).
5209         match (&fn_decl.output, found.is_suggestable(), can_suggest, expected.is_unit()) {
5210             (&hir::FnRetTy::DefaultReturn(span), true, true, true) => {
5211                 err.span_suggestion(
5212                     span,
5213                     "try adding a return type",
5214                     format!("-> {} ", self.resolve_vars_with_obligations(found)),
5215                     Applicability::MachineApplicable,
5216                 );
5217                 true
5218             }
5219             (&hir::FnRetTy::DefaultReturn(span), false, true, true) => {
5220                 err.span_label(span, "possibly return type missing here?");
5221                 true
5222             }
5223             (&hir::FnRetTy::DefaultReturn(span), _, false, true) => {
5224                 // `fn main()` must return `()`, do not suggest changing return type
5225                 err.span_label(span, "expected `()` because of default return type");
5226                 true
5227             }
5228             // expectation was caused by something else, not the default return
5229             (&hir::FnRetTy::DefaultReturn(_), _, _, false) => false,
5230             (&hir::FnRetTy::Return(ref ty), _, _, _) => {
5231                 // Only point to return type if the expected type is the return type, as if they
5232                 // are not, the expectation must have been caused by something else.
5233                 debug!("suggest_missing_return_type: return type {:?} node {:?}", ty, ty.kind);
5234                 let sp = ty.span;
5235                 let ty = AstConv::ast_ty_to_ty(self, ty);
5236                 debug!("suggest_missing_return_type: return type {:?}", ty);
5237                 debug!("suggest_missing_return_type: expected type {:?}", ty);
5238                 if ty.kind == expected.kind {
5239                     err.span_label(sp, format!("expected `{}` because of return type", expected));
5240                     return true;
5241                 }
5242                 false
5243             }
5244         }
5245     }
5246
5247     /// A possible error is to forget to add `.await` when using futures:
5248     ///
5249     /// ```
5250     /// async fn make_u32() -> u32 {
5251     ///     22
5252     /// }
5253     ///
5254     /// fn take_u32(x: u32) {}
5255     ///
5256     /// async fn foo() {
5257     ///     let x = make_u32();
5258     ///     take_u32(x);
5259     /// }
5260     /// ```
5261     ///
5262     /// This routine checks if the found type `T` implements `Future<Output=U>` where `U` is the
5263     /// expected type. If this is the case, and we are inside of an async body, it suggests adding
5264     /// `.await` to the tail of the expression.
5265     fn suggest_missing_await(
5266         &self,
5267         err: &mut DiagnosticBuilder<'_>,
5268         expr: &hir::Expr<'_>,
5269         expected: Ty<'tcx>,
5270         found: Ty<'tcx>,
5271     ) {
5272         // `.await` is not permitted outside of `async` bodies, so don't bother to suggest if the
5273         // body isn't `async`.
5274         let item_id = self.tcx().hir().get_parent_node(self.body_id);
5275         if let Some(body_id) = self.tcx().hir().maybe_body_owned_by(item_id) {
5276             let body = self.tcx().hir().body(body_id);
5277             if let Some(hir::GeneratorKind::Async(_)) = body.generator_kind {
5278                 let sp = expr.span;
5279                 // Check for `Future` implementations by constructing a predicate to
5280                 // prove: `<T as Future>::Output == U`
5281                 let future_trait = self.tcx.lang_items().future_trait().unwrap();
5282                 let item_def_id = self
5283                     .tcx
5284                     .associated_items(future_trait)
5285                     .in_definition_order()
5286                     .next()
5287                     .unwrap()
5288                     .def_id;
5289                 let predicate =
5290                     ty::Predicate::Projection(ty::Binder::bind(ty::ProjectionPredicate {
5291                         // `<T as Future>::Output`
5292                         projection_ty: ty::ProjectionTy {
5293                             // `T`
5294                             substs: self.tcx.mk_substs_trait(
5295                                 found,
5296                                 self.fresh_substs_for_item(sp, item_def_id),
5297                             ),
5298                             // `Future::Output`
5299                             item_def_id,
5300                         },
5301                         ty: expected,
5302                     }));
5303                 let obligation = traits::Obligation::new(self.misc(sp), self.param_env, predicate);
5304                 debug!("suggest_missing_await: trying obligation {:?}", obligation);
5305                 if self.infcx.predicate_may_hold(&obligation) {
5306                     debug!("suggest_missing_await: obligation held: {:?}", obligation);
5307                     if let Ok(code) = self.sess().source_map().span_to_snippet(sp) {
5308                         err.span_suggestion(
5309                             sp,
5310                             "consider using `.await` here",
5311                             format!("{}.await", code),
5312                             Applicability::MaybeIncorrect,
5313                         );
5314                     } else {
5315                         debug!("suggest_missing_await: no snippet for {:?}", sp);
5316                     }
5317                 } else {
5318                     debug!("suggest_missing_await: obligation did not hold: {:?}", obligation)
5319                 }
5320             }
5321         }
5322     }
5323
5324     /// A common error is to add an extra semicolon:
5325     ///
5326     /// ```
5327     /// fn foo() -> usize {
5328     ///     22;
5329     /// }
5330     /// ```
5331     ///
5332     /// This routine checks if the final statement in a block is an
5333     /// expression with an explicit semicolon whose type is compatible
5334     /// with `expected_ty`. If so, it suggests removing the semicolon.
5335     fn consider_hint_about_removing_semicolon(
5336         &self,
5337         blk: &'tcx hir::Block<'tcx>,
5338         expected_ty: Ty<'tcx>,
5339         err: &mut DiagnosticBuilder<'_>,
5340     ) {
5341         if let Some(span_semi) = self.could_remove_semicolon(blk, expected_ty) {
5342             err.span_suggestion(
5343                 span_semi,
5344                 "consider removing this semicolon",
5345                 String::new(),
5346                 Applicability::MachineApplicable,
5347             );
5348         }
5349     }
5350
5351     fn could_remove_semicolon(
5352         &self,
5353         blk: &'tcx hir::Block<'tcx>,
5354         expected_ty: Ty<'tcx>,
5355     ) -> Option<Span> {
5356         // Be helpful when the user wrote `{... expr;}` and
5357         // taking the `;` off is enough to fix the error.
5358         let last_stmt = blk.stmts.last()?;
5359         let last_expr = match last_stmt.kind {
5360             hir::StmtKind::Semi(ref e) => e,
5361             _ => return None,
5362         };
5363         let last_expr_ty = self.node_ty(last_expr.hir_id);
5364         if self.can_sub(self.param_env, last_expr_ty, expected_ty).is_err() {
5365             return None;
5366         }
5367         let original_span = original_sp(last_stmt.span, blk.span);
5368         Some(original_span.with_lo(original_span.hi() - BytePos(1)))
5369     }
5370
5371     // Instantiates the given path, which must refer to an item with the given
5372     // number of type parameters and type.
5373     pub fn instantiate_value_path(
5374         &self,
5375         segments: &[hir::PathSegment<'_>],
5376         self_ty: Option<Ty<'tcx>>,
5377         res: Res,
5378         span: Span,
5379         hir_id: hir::HirId,
5380     ) -> (Ty<'tcx>, Res) {
5381         debug!(
5382             "instantiate_value_path(segments={:?}, self_ty={:?}, res={:?}, hir_id={})",
5383             segments, self_ty, res, hir_id,
5384         );
5385
5386         let tcx = self.tcx;
5387
5388         let path_segs = match res {
5389             Res::Local(_) | Res::SelfCtor(_) => vec![],
5390             Res::Def(kind, def_id) => {
5391                 AstConv::def_ids_for_value_path_segments(self, segments, self_ty, kind, def_id)
5392             }
5393             _ => bug!("instantiate_value_path on {:?}", res),
5394         };
5395
5396         let mut user_self_ty = None;
5397         let mut is_alias_variant_ctor = false;
5398         match res {
5399             Res::Def(DefKind::Ctor(CtorOf::Variant, _), _) => {
5400                 if let Some(self_ty) = self_ty {
5401                     let adt_def = self_ty.ty_adt_def().unwrap();
5402                     user_self_ty = Some(UserSelfTy { impl_def_id: adt_def.did, self_ty });
5403                     is_alias_variant_ctor = true;
5404                 }
5405             }
5406             Res::Def(DefKind::AssocFn | DefKind::AssocConst, def_id) => {
5407                 let container = tcx.associated_item(def_id).container;
5408                 debug!("instantiate_value_path: def_id={:?} container={:?}", def_id, container);
5409                 match container {
5410                     ty::TraitContainer(trait_did) => {
5411                         callee::check_legal_trait_for_method_call(tcx, span, trait_did)
5412                     }
5413                     ty::ImplContainer(impl_def_id) => {
5414                         if segments.len() == 1 {
5415                             // `<T>::assoc` will end up here, and so
5416                             // can `T::assoc`. It this came from an
5417                             // inherent impl, we need to record the
5418                             // `T` for posterity (see `UserSelfTy` for
5419                             // details).
5420                             let self_ty = self_ty.expect("UFCS sugared assoc missing Self");
5421                             user_self_ty = Some(UserSelfTy { impl_def_id, self_ty });
5422                         }
5423                     }
5424                 }
5425             }
5426             _ => {}
5427         }
5428
5429         // Now that we have categorized what space the parameters for each
5430         // segment belong to, let's sort out the parameters that the user
5431         // provided (if any) into their appropriate spaces. We'll also report
5432         // errors if type parameters are provided in an inappropriate place.
5433
5434         let generic_segs: FxHashSet<_> = path_segs.iter().map(|PathSeg(_, index)| index).collect();
5435         let generics_has_err = AstConv::prohibit_generics(
5436             self,
5437             segments.iter().enumerate().filter_map(|(index, seg)| {
5438                 if !generic_segs.contains(&index) || is_alias_variant_ctor {
5439                     Some(seg)
5440                 } else {
5441                     None
5442                 }
5443             }),
5444         );
5445
5446         if let Res::Local(hid) = res {
5447             let ty = self.local_ty(span, hid).decl_ty;
5448             let ty = self.normalize_associated_types_in(span, &ty);
5449             self.write_ty(hir_id, ty);
5450             return (ty, res);
5451         }
5452
5453         if generics_has_err {
5454             // Don't try to infer type parameters when prohibited generic arguments were given.
5455             user_self_ty = None;
5456         }
5457
5458         // Now we have to compare the types that the user *actually*
5459         // provided against the types that were *expected*. If the user
5460         // did not provide any types, then we want to substitute inference
5461         // variables. If the user provided some types, we may still need
5462         // to add defaults. If the user provided *too many* types, that's
5463         // a problem.
5464
5465         let mut infer_args_for_err = FxHashSet::default();
5466         for &PathSeg(def_id, index) in &path_segs {
5467             let seg = &segments[index];
5468             let generics = tcx.generics_of(def_id);
5469             // Argument-position `impl Trait` is treated as a normal generic
5470             // parameter internally, but we don't allow users to specify the
5471             // parameter's value explicitly, so we have to do some error-
5472             // checking here.
5473             if let Err(GenericArgCountMismatch { reported: Some(ErrorReported), .. }) =
5474                 AstConv::check_generic_arg_count_for_call(
5475                     tcx, span, &generics, &seg, false, // `is_method_call`
5476                 )
5477             {
5478                 infer_args_for_err.insert(index);
5479                 self.set_tainted_by_errors(); // See issue #53251.
5480             }
5481         }
5482
5483         let has_self = path_segs
5484             .last()
5485             .map(|PathSeg(def_id, _)| tcx.generics_of(*def_id).has_self)
5486             .unwrap_or(false);
5487
5488         let (res, self_ctor_substs) = if let Res::SelfCtor(impl_def_id) = res {
5489             let ty = self.normalize_ty(span, tcx.at(span).type_of(impl_def_id));
5490             match ty.kind {
5491                 ty::Adt(adt_def, substs) if adt_def.has_ctor() => {
5492                     let variant = adt_def.non_enum_variant();
5493                     let ctor_def_id = variant.ctor_def_id.unwrap();
5494                     (
5495                         Res::Def(DefKind::Ctor(CtorOf::Struct, variant.ctor_kind), ctor_def_id),
5496                         Some(substs),
5497                     )
5498                 }
5499                 _ => {
5500                     let mut err = tcx.sess.struct_span_err(
5501                         span,
5502                         "the `Self` constructor can only be used with tuple or unit structs",
5503                     );
5504                     if let Some(adt_def) = ty.ty_adt_def() {
5505                         match adt_def.adt_kind() {
5506                             AdtKind::Enum => {
5507                                 err.help("did you mean to use one of the enum's variants?");
5508                             }
5509                             AdtKind::Struct | AdtKind::Union => {
5510                                 err.span_suggestion(
5511                                     span,
5512                                     "use curly brackets",
5513                                     String::from("Self { /* fields */ }"),
5514                                     Applicability::HasPlaceholders,
5515                                 );
5516                             }
5517                         }
5518                     }
5519                     err.emit();
5520
5521                     return (tcx.types.err, res);
5522                 }
5523             }
5524         } else {
5525             (res, None)
5526         };
5527         let def_id = res.def_id();
5528
5529         // The things we are substituting into the type should not contain
5530         // escaping late-bound regions, and nor should the base type scheme.
5531         let ty = tcx.type_of(def_id);
5532
5533         let substs = self_ctor_substs.unwrap_or_else(|| {
5534             AstConv::create_substs_for_generic_args(
5535                 tcx,
5536                 def_id,
5537                 &[][..],
5538                 has_self,
5539                 self_ty,
5540                 infer_args_for_err.is_empty(),
5541                 // Provide the generic args, and whether types should be inferred.
5542                 |def_id| {
5543                     if let Some(&PathSeg(_, index)) =
5544                         path_segs.iter().find(|&PathSeg(did, _)| *did == def_id)
5545                     {
5546                         // If we've encountered an `impl Trait`-related error, we're just
5547                         // going to infer the arguments for better error messages.
5548                         if !infer_args_for_err.contains(&index) {
5549                             // Check whether the user has provided generic arguments.
5550                             if let Some(ref data) = segments[index].args {
5551                                 return (Some(data), segments[index].infer_args);
5552                             }
5553                         }
5554                         return (None, segments[index].infer_args);
5555                     }
5556
5557                     (None, true)
5558                 },
5559                 // Provide substitutions for parameters for which (valid) arguments have been provided.
5560                 |param, arg| match (&param.kind, arg) {
5561                     (GenericParamDefKind::Lifetime, GenericArg::Lifetime(lt)) => {
5562                         AstConv::ast_region_to_region(self, lt, Some(param)).into()
5563                     }
5564                     (GenericParamDefKind::Type { .. }, GenericArg::Type(ty)) => {
5565                         self.to_ty(ty).into()
5566                     }
5567                     (GenericParamDefKind::Const, GenericArg::Const(ct)) => {
5568                         self.to_const(&ct.value).into()
5569                     }
5570                     _ => unreachable!(),
5571                 },
5572                 // Provide substitutions for parameters for which arguments are inferred.
5573                 |substs, param, infer_args| {
5574                     match param.kind {
5575                         GenericParamDefKind::Lifetime => {
5576                             self.re_infer(Some(param), span).unwrap().into()
5577                         }
5578                         GenericParamDefKind::Type { has_default, .. } => {
5579                             if !infer_args && has_default {
5580                                 // If we have a default, then we it doesn't matter that we're not
5581                                 // inferring the type arguments: we provide the default where any
5582                                 // is missing.
5583                                 let default = tcx.type_of(param.def_id);
5584                                 self.normalize_ty(
5585                                     span,
5586                                     default.subst_spanned(tcx, substs.unwrap(), Some(span)),
5587                                 )
5588                                 .into()
5589                             } else {
5590                                 // If no type arguments were provided, we have to infer them.
5591                                 // This case also occurs as a result of some malformed input, e.g.
5592                                 // a lifetime argument being given instead of a type parameter.
5593                                 // Using inference instead of `Error` gives better error messages.
5594                                 self.var_for_def(span, param)
5595                             }
5596                         }
5597                         GenericParamDefKind::Const => {
5598                             // FIXME(const_generics:defaults)
5599                             // No const parameters were provided, we have to infer them.
5600                             self.var_for_def(span, param)
5601                         }
5602                     }
5603                 },
5604             )
5605         });
5606         assert!(!substs.has_escaping_bound_vars());
5607         assert!(!ty.has_escaping_bound_vars());
5608
5609         // First, store the "user substs" for later.
5610         self.write_user_type_annotation_from_substs(hir_id, def_id, substs, user_self_ty);
5611
5612         self.add_required_obligations(span, def_id, &substs);
5613
5614         // Substitute the values for the type parameters into the type of
5615         // the referenced item.
5616         let ty_substituted = self.instantiate_type_scheme(span, &substs, &ty);
5617
5618         if let Some(UserSelfTy { impl_def_id, self_ty }) = user_self_ty {
5619             // In the case of `Foo<T>::method` and `<Foo<T>>::method`, if `method`
5620             // is inherent, there is no `Self` parameter; instead, the impl needs
5621             // type parameters, which we can infer by unifying the provided `Self`
5622             // with the substituted impl type.
5623             // This also occurs for an enum variant on a type alias.
5624             let ty = tcx.type_of(impl_def_id);
5625
5626             let impl_ty = self.instantiate_type_scheme(span, &substs, &ty);
5627             match self.at(&self.misc(span), self.param_env).sup(impl_ty, self_ty) {
5628                 Ok(ok) => self.register_infer_ok_obligations(ok),
5629                 Err(_) => {
5630                     self.tcx.sess.delay_span_bug(
5631                         span,
5632                         &format!(
5633                         "instantiate_value_path: (UFCS) {:?} was a subtype of {:?} but now is not?",
5634                         self_ty,
5635                         impl_ty,
5636                     ),
5637                     );
5638                 }
5639             }
5640         }
5641
5642         self.check_rustc_args_require_const(def_id, hir_id, span);
5643
5644         debug!("instantiate_value_path: type of {:?} is {:?}", hir_id, ty_substituted);
5645         self.write_substs(hir_id, substs);
5646
5647         (ty_substituted, res)
5648     }
5649
5650     /// Add all the obligations that are required, substituting and normalized appropriately.
5651     fn add_required_obligations(&self, span: Span, def_id: DefId, substs: &SubstsRef<'tcx>) {
5652         let (bounds, spans) = self.instantiate_bounds(span, def_id, &substs);
5653
5654         for (i, mut obligation) in traits::predicates_for_generics(
5655             traits::ObligationCause::new(span, self.body_id, traits::ItemObligation(def_id)),
5656             self.param_env,
5657             &bounds,
5658         )
5659         .into_iter()
5660         .enumerate()
5661         {
5662             // This makes the error point at the bound, but we want to point at the argument
5663             if let Some(span) = spans.get(i) {
5664                 obligation.cause.code = traits::BindingObligation(def_id, *span);
5665             }
5666             self.register_predicate(obligation);
5667         }
5668     }
5669
5670     fn check_rustc_args_require_const(&self, def_id: DefId, hir_id: hir::HirId, span: Span) {
5671         // We're only interested in functions tagged with
5672         // #[rustc_args_required_const], so ignore anything that's not.
5673         if !self.tcx.has_attr(def_id, sym::rustc_args_required_const) {
5674             return;
5675         }
5676
5677         // If our calling expression is indeed the function itself, we're good!
5678         // If not, generate an error that this can only be called directly.
5679         if let Node::Expr(expr) = self.tcx.hir().get(self.tcx.hir().get_parent_node(hir_id)) {
5680             if let ExprKind::Call(ref callee, ..) = expr.kind {
5681                 if callee.hir_id == hir_id {
5682                     return;
5683                 }
5684             }
5685         }
5686
5687         self.tcx.sess.span_err(
5688             span,
5689             "this function can only be invoked directly, not through a function pointer",
5690         );
5691     }
5692
5693     /// Resolves `typ` by a single level if `typ` is a type variable.
5694     /// If no resolution is possible, then an error is reported.
5695     /// Numeric inference variables may be left unresolved.
5696     pub fn structurally_resolved_type(&self, sp: Span, ty: Ty<'tcx>) -> Ty<'tcx> {
5697         let ty = self.resolve_vars_with_obligations(ty);
5698         if !ty.is_ty_var() {
5699             ty
5700         } else {
5701             if !self.is_tainted_by_errors() {
5702                 self.need_type_info_err((**self).body_id, sp, ty, E0282)
5703                     .note("type must be known at this point")
5704                     .emit();
5705             }
5706             self.demand_suptype(sp, self.tcx.types.err, ty);
5707             self.tcx.types.err
5708         }
5709     }
5710
5711     fn with_breakable_ctxt<F: FnOnce() -> R, R>(
5712         &self,
5713         id: hir::HirId,
5714         ctxt: BreakableCtxt<'tcx>,
5715         f: F,
5716     ) -> (BreakableCtxt<'tcx>, R) {
5717         let index;
5718         {
5719             let mut enclosing_breakables = self.enclosing_breakables.borrow_mut();
5720             index = enclosing_breakables.stack.len();
5721             enclosing_breakables.by_id.insert(id, index);
5722             enclosing_breakables.stack.push(ctxt);
5723         }
5724         let result = f();
5725         let ctxt = {
5726             let mut enclosing_breakables = self.enclosing_breakables.borrow_mut();
5727             debug_assert!(enclosing_breakables.stack.len() == index + 1);
5728             enclosing_breakables.by_id.remove(&id).expect("missing breakable context");
5729             enclosing_breakables.stack.pop().expect("missing breakable context")
5730         };
5731         (ctxt, result)
5732     }
5733
5734     /// Instantiate a QueryResponse in a probe context, without a
5735     /// good ObligationCause.
5736     fn probe_instantiate_query_response(
5737         &self,
5738         span: Span,
5739         original_values: &OriginalQueryValues<'tcx>,
5740         query_result: &Canonical<'tcx, QueryResponse<'tcx, Ty<'tcx>>>,
5741     ) -> InferResult<'tcx, Ty<'tcx>> {
5742         self.instantiate_query_response_and_region_obligations(
5743             &traits::ObligationCause::misc(span, self.body_id),
5744             self.param_env,
5745             original_values,
5746             query_result,
5747         )
5748     }
5749
5750     /// Returns `true` if an expression is contained inside the LHS of an assignment expression.
5751     fn expr_in_place(&self, mut expr_id: hir::HirId) -> bool {
5752         let mut contained_in_place = false;
5753
5754         while let hir::Node::Expr(parent_expr) =
5755             self.tcx.hir().get(self.tcx.hir().get_parent_node(expr_id))
5756         {
5757             match &parent_expr.kind {
5758                 hir::ExprKind::Assign(lhs, ..) | hir::ExprKind::AssignOp(_, lhs, ..) => {
5759                     if lhs.hir_id == expr_id {
5760                         contained_in_place = true;
5761                         break;
5762                     }
5763                 }
5764                 _ => (),
5765             }
5766             expr_id = parent_expr.hir_id;
5767         }
5768
5769         contained_in_place
5770     }
5771 }
5772
5773 fn check_type_params_are_used<'tcx>(tcx: TyCtxt<'tcx>, generics: &ty::Generics, ty: Ty<'tcx>) {
5774     debug!("check_type_params_are_used(generics={:?}, ty={:?})", generics, ty);
5775
5776     assert_eq!(generics.parent, None);
5777
5778     if generics.own_counts().types == 0 {
5779         return;
5780     }
5781
5782     let mut params_used = BitSet::new_empty(generics.params.len());
5783
5784     if ty.references_error() {
5785         // If there is already another error, do not emit
5786         // an error for not using a type parameter.
5787         assert!(tcx.sess.has_errors());
5788         return;
5789     }
5790
5791     for leaf in ty.walk() {
5792         if let GenericArgKind::Type(leaf_ty) = leaf.unpack() {
5793             if let ty::Param(param) = leaf_ty.kind {
5794                 debug!("found use of ty param {:?}", param);
5795                 params_used.insert(param.index);
5796             }
5797         }
5798     }
5799
5800     for param in &generics.params {
5801         if !params_used.contains(param.index) {
5802             if let ty::GenericParamDefKind::Type { .. } = param.kind {
5803                 let span = tcx.def_span(param.def_id);
5804                 struct_span_err!(
5805                     tcx.sess,
5806                     span,
5807                     E0091,
5808                     "type parameter `{}` is unused",
5809                     param.name,
5810                 )
5811                 .span_label(span, "unused type parameter")
5812                 .emit();
5813             }
5814         }
5815     }
5816 }
5817
5818 fn fatally_break_rust(sess: &Session) {
5819     let handler = sess.diagnostic();
5820     handler.span_bug_no_panic(
5821         MultiSpan::new(),
5822         "It looks like you're trying to break rust; would you like some ICE?",
5823     );
5824     handler.note_without_error("the compiler expectedly panicked. this is a feature.");
5825     handler.note_without_error(
5826         "we would appreciate a joke overview: \
5827          https://github.com/rust-lang/rust/issues/43162#issuecomment-320764675",
5828     );
5829     handler.note_without_error(&format!(
5830         "rustc {} running on {}",
5831         option_env!("CFG_VERSION").unwrap_or("unknown_version"),
5832         config::host_triple(),
5833     ));
5834 }
5835
5836 fn potentially_plural_count(count: usize, word: &str) -> String {
5837     format!("{} {}{}", count, word, pluralize!(count))
5838 }