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