]> git.lizzy.rs Git - rust.git/blob - src/librustc_typeck/check/mod.rs
Rollup merge of #61702 - RalfJung:const-enum-cast, r=oli-obk
[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 mod autoderef;
71 pub mod dropck;
72 pub mod _match;
73 pub mod writeback;
74 mod regionck;
75 pub mod coercion;
76 pub mod demand;
77 mod expr;
78 pub mod method;
79 mod upvar;
80 mod wfcheck;
81 mod cast;
82 mod closure;
83 mod callee;
84 mod compare_method;
85 mod generator_interior;
86 pub mod intrinsic;
87 mod op;
88
89 use crate::astconv::{AstConv, PathSeg};
90 use errors::{Applicability, DiagnosticBuilder, DiagnosticId};
91 use rustc::hir::{self, ExprKind, GenericArg, ItemKind, Node, PatKind, QPath};
92 use rustc::hir::def::{CtorOf, Res, DefKind};
93 use rustc::hir::def_id::{CrateNum, DefId, LOCAL_CRATE};
94 use rustc::hir::intravisit::{self, Visitor, NestedVisitorMap};
95 use rustc::hir::itemlikevisit::ItemLikeVisitor;
96 use crate::middle::lang_items;
97 use crate::namespace::Namespace;
98 use rustc::infer::{self, InferCtxt, InferOk, InferResult};
99 use rustc::infer::canonical::{Canonical, OriginalQueryValues, QueryResponse};
100 use rustc_data_structures::indexed_vec::Idx;
101 use rustc_target::spec::abi::Abi;
102 use rustc::infer::opaque_types::OpaqueTypeDecl;
103 use rustc::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
104 use rustc::infer::unify_key::{ConstVariableOrigin, ConstVariableOriginKind};
105 use rustc::middle::region;
106 use rustc::mir::interpret::{ConstValue, GlobalId};
107 use rustc::traits::{self, ObligationCause, ObligationCauseCode, TraitEngine};
108 use rustc::ty::{
109     self, AdtKind, CanonicalUserType, Ty, TyCtxt, Const, GenericParamDefKind,
110     ToPolyTraitRef, ToPredicate, RegionKind, UserType
111 };
112 use rustc::ty::adjustment::{
113     Adjust, Adjustment, AllowTwoPhase, AutoBorrow, AutoBorrowMutability, PointerCast
114 };
115 use rustc::ty::fold::TypeFoldable;
116 use rustc::ty::query::Providers;
117 use rustc::ty::subst::{UnpackedKind, Subst, InternalSubsts, SubstsRef, UserSelfTy, UserSubsts};
118 use rustc::ty::util::{Representability, IntTypeExt, Discr};
119 use rustc::ty::layout::VariantIdx;
120 use syntax_pos::{self, BytePos, Span, MultiSpan};
121 use syntax_pos::hygiene::CompilerDesugaringKind;
122 use syntax::ast;
123 use syntax::attr;
124 use syntax::feature_gate::{GateIssue, emit_feature_err};
125 use syntax::ptr::P;
126 use syntax::source_map::{DUMMY_SP, original_sp};
127 use syntax::symbol::{kw, sym};
128
129 use std::cell::{Cell, RefCell, Ref, RefMut};
130 use std::collections::hash_map::Entry;
131 use std::cmp;
132 use std::iter;
133 use std::mem::replace;
134 use std::ops::{self, Deref};
135 use std::slice;
136
137 use crate::require_c_abi_if_c_variadic;
138 use crate::session::Session;
139 use crate::session::config::EntryFnType;
140 use crate::TypeAndSubsts;
141 use crate::lint;
142 use crate::util::captures::Captures;
143 use crate::util::common::{ErrorReported, indenter};
144 use crate::util::nodemap::{DefIdMap, DefIdSet, FxHashSet, HirIdMap};
145
146 pub use self::Expectation::*;
147 use self::autoderef::Autoderef;
148 use self::callee::DeferredCallResolution;
149 use self::coercion::{CoerceMany, DynamicCoerceMany};
150 pub use self::compare_method::{compare_impl_method, compare_const_impl};
151 use self::method::{MethodCallee, SelfSource};
152 use self::TupleArgumentsFlag::*;
153
154 /// The type of a local binding, including the revealed type for anon types.
155 #[derive(Copy, Clone)]
156 pub struct LocalTy<'tcx> {
157     decl_ty: Ty<'tcx>,
158     revealed_ty: Ty<'tcx>
159 }
160
161 /// A wrapper for `InferCtxt`'s `in_progress_tables` field.
162 #[derive(Copy, Clone)]
163 struct MaybeInProgressTables<'a, 'tcx: 'a> {
164     maybe_tables: Option<&'a RefCell<ty::TypeckTables<'tcx>>>,
165 }
166
167 impl<'a, 'tcx> MaybeInProgressTables<'a, 'tcx> {
168     fn borrow(self) -> Ref<'a, ty::TypeckTables<'tcx>> {
169         match self.maybe_tables {
170             Some(tables) => tables.borrow(),
171             None => {
172                 bug!("MaybeInProgressTables: inh/fcx.tables.borrow() with no tables")
173             }
174         }
175     }
176
177     fn borrow_mut(self) -> RefMut<'a, ty::TypeckTables<'tcx>> {
178         match self.maybe_tables {
179             Some(tables) => tables.borrow_mut(),
180             None => {
181                 bug!("MaybeInProgressTables: inh/fcx.tables.borrow_mut() with no tables")
182             }
183         }
184     }
185 }
186
187 /// Closures defined within the function. For example:
188 ///
189 ///     fn foo() {
190 ///         bar(move|| { ... })
191 ///     }
192 ///
193 /// Here, the function `foo()` and the closure passed to
194 /// `bar()` will each have their own `FnCtxt`, but they will
195 /// share the inherited fields.
196 pub struct Inherited<'a, 'tcx: 'a> {
197     infcx: InferCtxt<'a, 'tcx>,
198
199     tables: MaybeInProgressTables<'a, 'tcx>,
200
201     locals: RefCell<HirIdMap<LocalTy<'tcx>>>,
202
203     fulfillment_cx: RefCell<Box<dyn TraitEngine<'tcx>>>,
204
205     // Some additional `Sized` obligations badly affect type inference.
206     // These obligations are added in a later stage of typeck.
207     deferred_sized_obligations: RefCell<Vec<(Ty<'tcx>, Span, traits::ObligationCauseCode<'tcx>)>>,
208
209     // When we process a call like `c()` where `c` is a closure type,
210     // we may not have decided yet whether `c` is a `Fn`, `FnMut`, or
211     // `FnOnce` closure. In that case, we defer full resolution of the
212     // call until upvar inference can kick in and make the
213     // decision. We keep these deferred resolutions grouped by the
214     // def-id of the closure, so that once we decide, we can easily go
215     // back and process them.
216     deferred_call_resolutions: RefCell<DefIdMap<Vec<DeferredCallResolution<'tcx>>>>,
217
218     deferred_cast_checks: RefCell<Vec<cast::CastCheck<'tcx>>>,
219
220     deferred_generator_interiors: RefCell<Vec<(hir::BodyId, Ty<'tcx>)>>,
221
222     // Opaque types found in explicit return types and their
223     // associated fresh inference variable. Writeback resolves these
224     // variables to get the concrete type, which can be used to
225     // 'de-opaque' OpaqueTypeDecl, after typeck is done with all functions.
226     opaque_types: RefCell<DefIdMap<OpaqueTypeDecl<'tcx>>>,
227
228     /// Each type parameter has an implicit region bound that
229     /// indicates it must outlive at least the function body (the user
230     /// may specify stronger requirements). This field indicates the
231     /// region of the callee. If it is `None`, then the parameter
232     /// environment is for an item or something where the "callee" is
233     /// not clear.
234     implicit_region_bound: Option<ty::Region<'tcx>>,
235
236     body_id: Option<hir::BodyId>,
237 }
238
239 impl<'a, 'tcx> Deref for Inherited<'a, 'tcx> {
240     type Target = InferCtxt<'a, 'tcx>;
241     fn deref(&self) -> &Self::Target {
242         &self.infcx
243     }
244 }
245
246 /// When type-checking an expression, we propagate downward
247 /// whatever type hint we are able in the form of an `Expectation`.
248 #[derive(Copy, Clone, Debug)]
249 pub enum Expectation<'tcx> {
250     /// We know nothing about what type this expression should have.
251     NoExpectation,
252
253     /// This expression should have the type given (or some subtype).
254     ExpectHasType(Ty<'tcx>),
255
256     /// This expression will be cast to the `Ty`.
257     ExpectCastableToType(Ty<'tcx>),
258
259     /// This rvalue expression will be wrapped in `&` or `Box` and coerced
260     /// to `&Ty` or `Box<Ty>`, respectively. `Ty` is `[A]` or `Trait`.
261     ExpectRvalueLikeUnsized(Ty<'tcx>),
262 }
263
264 impl<'a, 'tcx> Expectation<'tcx> {
265     // Disregard "castable to" expectations because they
266     // can lead us astray. Consider for example `if cond
267     // {22} else {c} as u8` -- if we propagate the
268     // "castable to u8" constraint to 22, it will pick the
269     // type 22u8, which is overly constrained (c might not
270     // be a u8). In effect, the problem is that the
271     // "castable to" expectation is not the tightest thing
272     // we can say, so we want to drop it in this case.
273     // The tightest thing we can say is "must unify with
274     // else branch". Note that in the case of a "has type"
275     // constraint, this limitation does not hold.
276
277     // If the expected type is just a type variable, then don't use
278     // an expected type. Otherwise, we might write parts of the type
279     // when checking the 'then' block which are incompatible with the
280     // 'else' branch.
281     fn adjust_for_branches(&self, fcx: &FnCtxt<'a, 'tcx>) -> Expectation<'tcx> {
282         match *self {
283             ExpectHasType(ety) => {
284                 let ety = fcx.shallow_resolve(ety);
285                 if !ety.is_ty_var() {
286                     ExpectHasType(ety)
287                 } else {
288                     NoExpectation
289                 }
290             }
291             ExpectRvalueLikeUnsized(ety) => {
292                 ExpectRvalueLikeUnsized(ety)
293             }
294             _ => NoExpectation
295         }
296     }
297
298     /// Provides an expectation for an rvalue expression given an *optional*
299     /// hint, which is not required for type safety (the resulting type might
300     /// be checked higher up, as is the case with `&expr` and `box expr`), but
301     /// is useful in determining the concrete type.
302     ///
303     /// The primary use case is where the expected type is a fat pointer,
304     /// like `&[isize]`. For example, consider the following statement:
305     ///
306     ///    let x: &[isize] = &[1, 2, 3];
307     ///
308     /// In this case, the expected type for the `&[1, 2, 3]` expression is
309     /// `&[isize]`. If however we were to say that `[1, 2, 3]` has the
310     /// expectation `ExpectHasType([isize])`, that would be too strong --
311     /// `[1, 2, 3]` does not have the type `[isize]` but rather `[isize; 3]`.
312     /// It is only the `&[1, 2, 3]` expression as a whole that can be coerced
313     /// to the type `&[isize]`. Therefore, we propagate this more limited hint,
314     /// which still is useful, because it informs integer literals and the like.
315     /// See the test case `test/run-pass/coerce-expect-unsized.rs` and #20169
316     /// for examples of where this comes up,.
317     fn rvalue_hint(fcx: &FnCtxt<'a, 'tcx>, ty: Ty<'tcx>) -> Expectation<'tcx> {
318         match fcx.tcx.struct_tail(ty).sty {
319             ty::Slice(_) | ty::Str | ty::Dynamic(..) => {
320                 ExpectRvalueLikeUnsized(ty)
321             }
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) => {
333                 ExpectCastableToType(fcx.resolve_vars_if_possible(&t))
334             }
335             ExpectHasType(t) => {
336                 ExpectHasType(fcx.resolve_vars_if_possible(&t))
337             }
338             ExpectRvalueLikeUnsized(t) => {
339                 ExpectRvalueLikeUnsized(fcx.resolve_vars_if_possible(&t))
340             }
341         }
342     }
343
344     fn to_option(self, fcx: &FnCtxt<'a, 'tcx>) -> Option<Ty<'tcx>> {
345         match self.resolve(fcx) {
346             NoExpectation => None,
347             ExpectCastableToType(ty) |
348             ExpectHasType(ty) |
349             ExpectRvalueLikeUnsized(ty) => Some(ty),
350         }
351     }
352
353     /// It sometimes happens that we want to turn an expectation into
354     /// a **hard constraint** (i.e., something that must be satisfied
355     /// for the program to type-check). `only_has_type` will return
356     /// such a constraint, if it exists.
357     fn only_has_type(self, fcx: &FnCtxt<'a, 'tcx>) -> Option<Ty<'tcx>> {
358         match self.resolve(fcx) {
359             ExpectHasType(ty) => Some(ty),
360             NoExpectation | ExpectCastableToType(_) | ExpectRvalueLikeUnsized(_) => None,
361         }
362     }
363
364     /// Like `only_has_type`, but instead of returning `None` if no
365     /// hard constraint exists, creates a fresh type variable.
366     fn coercion_target_type(self, fcx: &FnCtxt<'a, 'tcx>, span: Span) -> Ty<'tcx> {
367         self.only_has_type(fcx)
368             .unwrap_or_else(|| {
369                 fcx.next_ty_var(TypeVariableOrigin {
370                     kind: TypeVariableOriginKind::MiscVariable,
371                     span,
372                 })
373             })
374     }
375 }
376
377 #[derive(Copy, Clone, Debug, PartialEq, Eq)]
378 pub enum Needs {
379     MutPlace,
380     None
381 }
382
383 impl Needs {
384     fn maybe_mut_place(m: hir::Mutability) -> Self {
385         match m {
386             hir::MutMutable => Needs::MutPlace,
387             hir::MutImmutable => Needs::None,
388         }
389     }
390 }
391
392 #[derive(Copy, Clone)]
393 pub struct UnsafetyState {
394     pub def: hir::HirId,
395     pub unsafety: hir::Unsafety,
396     pub unsafe_push_count: u32,
397     from_fn: bool
398 }
399
400 impl UnsafetyState {
401     pub fn function(unsafety: hir::Unsafety, def: hir::HirId) -> UnsafetyState {
402         UnsafetyState { def: def, unsafety: unsafety, unsafe_push_count: 0, from_fn: true }
403     }
404
405     pub fn recurse(&mut self, blk: &hir::Block) -> UnsafetyState {
406         match self.unsafety {
407             // If this unsafe, then if the outer function was already marked as
408             // unsafe we shouldn't attribute the unsafe'ness to the block. This
409             // way the block can be warned about instead of ignoring this
410             // extraneous block (functions are never warned about).
411             hir::Unsafety::Unsafe if self.from_fn => *self,
412
413             unsafety => {
414                 let (unsafety, def, count) = match blk.rules {
415                     hir::PushUnsafeBlock(..) =>
416                         (unsafety, blk.hir_id, self.unsafe_push_count.checked_add(1).unwrap()),
417                     hir::PopUnsafeBlock(..) =>
418                         (unsafety, blk.hir_id, self.unsafe_push_count.checked_sub(1).unwrap()),
419                     hir::UnsafeBlock(..) =>
420                         (hir::Unsafety::Unsafe, blk.hir_id, self.unsafe_push_count),
421                     hir::DefaultBlock =>
422                         (unsafety, self.def, self.unsafe_push_count),
423                 };
424                 UnsafetyState{ def,
425                                unsafety,
426                                unsafe_push_count: count,
427                                from_fn: false }
428             }
429         }
430     }
431 }
432
433 #[derive(Debug, Copy, Clone)]
434 pub enum PlaceOp {
435     Deref,
436     Index
437 }
438
439 /// Tracks whether executing a node may exit normally (versus
440 /// return/break/panic, which "diverge", leaving dead code in their
441 /// wake). Tracked semi-automatically (through type variables marked
442 /// as diverging), with some manual adjustments for control-flow
443 /// primitives (approximating a CFG).
444 #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
445 pub enum Diverges {
446     /// Potentially unknown, some cases converge,
447     /// others require a CFG to determine them.
448     Maybe,
449
450     /// Definitely known to diverge and therefore
451     /// not reach the next sibling or its parent.
452     Always,
453
454     /// Same as `Always` but with a reachability
455     /// warning already emitted.
456     WarnedAlways
457 }
458
459 // Convenience impls for combinig `Diverges`.
460
461 impl ops::BitAnd for Diverges {
462     type Output = Self;
463     fn bitand(self, other: Self) -> Self {
464         cmp::min(self, other)
465     }
466 }
467
468 impl ops::BitOr for Diverges {
469     type Output = Self;
470     fn bitor(self, other: Self) -> Self {
471         cmp::max(self, other)
472     }
473 }
474
475 impl ops::BitAndAssign for Diverges {
476     fn bitand_assign(&mut self, other: Self) {
477         *self = *self & other;
478     }
479 }
480
481 impl ops::BitOrAssign for Diverges {
482     fn bitor_assign(&mut self, other: Self) {
483         *self = *self | other;
484     }
485 }
486
487 impl Diverges {
488     fn always(self) -> bool {
489         self >= Diverges::Always
490     }
491 }
492
493 pub struct BreakableCtxt<'tcx> {
494     may_break: bool,
495
496     // this is `null` for loops where break with a value is illegal,
497     // such as `while`, `for`, and `while let`
498     coerce: Option<DynamicCoerceMany<'tcx>>,
499 }
500
501 pub struct EnclosingBreakables<'tcx> {
502     stack: Vec<BreakableCtxt<'tcx>>,
503     by_id: HirIdMap<usize>,
504 }
505
506 impl<'tcx> EnclosingBreakables<'tcx> {
507     fn find_breakable(&mut self, target_id: hir::HirId) -> &mut BreakableCtxt<'tcx> {
508         let ix = *self.by_id.get(&target_id).unwrap_or_else(|| {
509             bug!("could not find enclosing breakable with id {}", target_id);
510         });
511         &mut self.stack[ix]
512     }
513 }
514
515 pub struct FnCtxt<'a, 'tcx: 'a> {
516     body_id: hir::HirId,
517
518     /// The parameter environment used for proving trait obligations
519     /// in this function. This can change when we descend into
520     /// closures (as they bring new things into scope), hence it is
521     /// not part of `Inherited` (as of the time of this writing,
522     /// closures do not yet change the environment, but they will
523     /// eventually).
524     param_env: ty::ParamEnv<'tcx>,
525
526     /// Number of errors that had been reported when we started
527     /// checking this function. On exit, if we find that *more* errors
528     /// have been reported, we will skip regionck and other work that
529     /// expects the types within the function to be consistent.
530     err_count_on_creation: usize,
531
532     ret_coercion: Option<RefCell<DynamicCoerceMany<'tcx>>>,
533     ret_coercion_span: RefCell<Option<Span>>,
534
535     yield_ty: Option<Ty<'tcx>>,
536
537     ps: RefCell<UnsafetyState>,
538
539     /// Whether the last checked node generates a divergence (e.g.,
540     /// `return` will set this to `Always`). In general, when entering
541     /// an expression or other node in the tree, the initial value
542     /// indicates whether prior parts of the containing expression may
543     /// have diverged. It is then typically set to `Maybe` (and the
544     /// old value remembered) for processing the subparts of the
545     /// current expression. As each subpart is processed, they may set
546     /// the flag to `Always`, etc. Finally, at the end, we take the
547     /// result and "union" it with the original value, so that when we
548     /// return the flag indicates if any subpart of the parent
549     /// expression (up to and including this part) has diverged. So,
550     /// if you read it after evaluating a subexpression `X`, the value
551     /// you get indicates whether any subexpression that was
552     /// evaluating up to and including `X` diverged.
553     ///
554     /// We currently use this flag only for diagnostic purposes:
555     ///
556     /// - To warn about unreachable code: if, after processing a
557     ///   sub-expression but before we have applied the effects of the
558     ///   current node, we see that the flag is set to `Always`, we
559     ///   can issue a warning. This corresponds to something like
560     ///   `foo(return)`; we warn on the `foo()` expression. (We then
561     ///   update the flag to `WarnedAlways` to suppress duplicate
562     ///   reports.) Similarly, if we traverse to a fresh statement (or
563     ///   tail expression) from a `Always` setting, we will issue a
564     ///   warning. This corresponds to something like `{return;
565     ///   foo();}` or `{return; 22}`, where we would warn on the
566     ///   `foo()` or `22`.
567     ///
568     /// An expression represents dead code if, after checking it,
569     /// the diverges flag is set to something other than `Maybe`.
570     diverges: Cell<Diverges>,
571
572     /// Whether any child nodes have any type errors.
573     has_errors: Cell<bool>,
574
575     enclosing_breakables: RefCell<EnclosingBreakables<'tcx>>,
576
577     inh: &'a Inherited<'a, 'tcx>,
578 }
579
580 impl<'a, 'tcx> Deref for FnCtxt<'a, 'tcx> {
581     type Target = Inherited<'a, 'tcx>;
582     fn deref(&self) -> &Self::Target {
583         &self.inh
584     }
585 }
586
587 /// Helper type of a temporary returned by `Inherited::build(...)`.
588 /// Necessary because we can't write the following bound:
589 /// `F: for<'b, 'tcx> where 'tcx FnOnce(Inherited<'b, 'tcx>)`.
590 pub struct InheritedBuilder<'tcx> {
591     infcx: infer::InferCtxtBuilder<'tcx>,
592     def_id: DefId,
593 }
594
595 impl Inherited<'_, 'tcx> {
596     pub fn build(tcx: TyCtxt<'tcx>, def_id: DefId) -> InheritedBuilder<'tcx> {
597         let hir_id_root = if def_id.is_local() {
598             let hir_id = tcx.hir().as_local_hir_id(def_id).unwrap();
599             DefId::local(hir_id.owner)
600         } else {
601             def_id
602         };
603
604         InheritedBuilder {
605             infcx: tcx.infer_ctxt().with_fresh_in_progress_tables(hir_id_root),
606             def_id,
607         }
608     }
609 }
610
611 impl<'tcx> InheritedBuilder<'tcx> {
612     fn enter<F, R>(&mut self, f: F) -> R
613     where
614         F: for<'a> FnOnce(Inherited<'a, 'tcx>) -> R,
615     {
616         let def_id = self.def_id;
617         self.infcx.enter(|infcx| f(Inherited::new(infcx, def_id)))
618     }
619 }
620
621 impl Inherited<'a, 'tcx> {
622     fn new(infcx: InferCtxt<'a, 'tcx>, def_id: DefId) -> Self {
623         let tcx = infcx.tcx;
624         let item_id = tcx.hir().as_local_hir_id(def_id);
625         let body_id = item_id.and_then(|id| tcx.hir().maybe_body_owned_by_by_hir_id(id));
626         let implicit_region_bound = body_id.map(|body_id| {
627             let body = tcx.hir().body(body_id);
628             tcx.mk_region(ty::ReScope(region::Scope {
629                 id: body.value.hir_id.local_id,
630                 data: region::ScopeData::CallSite
631             }))
632         });
633
634         Inherited {
635             tables: MaybeInProgressTables {
636                 maybe_tables: infcx.in_progress_tables,
637             },
638             infcx,
639             fulfillment_cx: RefCell::new(TraitEngine::new(tcx)),
640             locals: RefCell::new(Default::default()),
641             deferred_sized_obligations: RefCell::new(Vec::new()),
642             deferred_call_resolutions: RefCell::new(Default::default()),
643             deferred_cast_checks: RefCell::new(Vec::new()),
644             deferred_generator_interiors: RefCell::new(Vec::new()),
645             opaque_types: RefCell::new(Default::default()),
646             implicit_region_bound,
647             body_id,
648         }
649     }
650
651     fn register_predicate(&self, obligation: traits::PredicateObligation<'tcx>) {
652         debug!("register_predicate({:?})", obligation);
653         if obligation.has_escaping_bound_vars() {
654             span_bug!(obligation.cause.span, "escaping bound vars in predicate {:?}",
655                       obligation);
656         }
657         self.fulfillment_cx
658             .borrow_mut()
659             .register_predicate_obligation(self, obligation);
660     }
661
662     fn register_predicates<I>(&self, obligations: I)
663         where I: IntoIterator<Item = traits::PredicateObligation<'tcx>>
664     {
665         for obligation in obligations {
666             self.register_predicate(obligation);
667         }
668     }
669
670     fn register_infer_ok_obligations<T>(&self, infer_ok: InferOk<'tcx, T>) -> T {
671         self.register_predicates(infer_ok.obligations);
672         infer_ok.value
673     }
674
675     fn normalize_associated_types_in<T>(&self,
676                                         span: Span,
677                                         body_id: hir::HirId,
678                                         param_env: ty::ParamEnv<'tcx>,
679                                         value: &T) -> T
680         where T : TypeFoldable<'tcx>
681     {
682         let ok = self.partially_normalize_associated_types_in(span, body_id, param_env, value);
683         self.register_infer_ok_obligations(ok)
684     }
685 }
686
687 struct CheckItemTypesVisitor<'tcx> {
688     tcx: TyCtxt<'tcx>,
689 }
690
691 impl ItemLikeVisitor<'tcx> for CheckItemTypesVisitor<'tcx> {
692     fn visit_item(&mut self, i: &'tcx hir::Item) {
693         check_item_type(self.tcx, i);
694     }
695     fn visit_trait_item(&mut self, _: &'tcx hir::TraitItem) { }
696     fn visit_impl_item(&mut self, _: &'tcx hir::ImplItem) { }
697 }
698
699 pub fn check_wf_new<'tcx>(tcx: TyCtxt<'tcx>) -> Result<(), ErrorReported> {
700     tcx.sess.track_errors(|| {
701         let mut visit = wfcheck::CheckTypeWellFormedVisitor::new(tcx);
702         tcx.hir().krate().par_visit_all_item_likes(&mut visit);
703     })
704 }
705
706 fn check_mod_item_types<'tcx>(tcx: TyCtxt<'tcx>, module_def_id: DefId) {
707     tcx.hir().visit_item_likes_in_module(module_def_id, &mut CheckItemTypesVisitor { tcx });
708 }
709
710 fn typeck_item_bodies<'tcx>(tcx: TyCtxt<'tcx>, crate_num: CrateNum) {
711     debug_assert!(crate_num == LOCAL_CRATE);
712     tcx.par_body_owners(|body_owner_def_id| {
713         tcx.ensure().typeck_tables_of(body_owner_def_id);
714     });
715 }
716
717 fn check_item_well_formed<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) {
718     wfcheck::check_item_well_formed(tcx, def_id);
719 }
720
721 fn check_trait_item_well_formed<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) {
722     wfcheck::check_trait_item(tcx, def_id);
723 }
724
725 fn check_impl_item_well_formed<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) {
726     wfcheck::check_impl_item(tcx, def_id);
727 }
728
729 pub fn provide(providers: &mut Providers<'_>) {
730     method::provide(providers);
731     *providers = Providers {
732         typeck_item_bodies,
733         typeck_tables_of,
734         has_typeck_tables,
735         adt_destructor,
736         used_trait_imports,
737         check_item_well_formed,
738         check_trait_item_well_formed,
739         check_impl_item_well_formed,
740         check_mod_item_types,
741         ..*providers
742     };
743 }
744
745 fn adt_destructor<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> Option<ty::Destructor> {
746     tcx.calculate_dtor(def_id, &mut dropck::check_drop_impl)
747 }
748
749 /// If this `DefId` is a "primary tables entry", returns `Some((body_id, decl))`
750 /// with information about it's body-id and fn-decl (if any). Otherwise,
751 /// returns `None`.
752 ///
753 /// If this function returns "some", then `typeck_tables(def_id)` will
754 /// succeed; if it returns `None`, then `typeck_tables(def_id)` may or
755 /// may not succeed. In some cases where this function returns `None`
756 /// (notably closures), `typeck_tables(def_id)` would wind up
757 /// redirecting to the owning function.
758 fn primary_body_of<'tcx>(
759     tcx: TyCtxt<'tcx>,
760     id: hir::HirId,
761 ) -> Option<(hir::BodyId, Option<&'tcx hir::FnDecl>)> {
762     match tcx.hir().get_by_hir_id(id) {
763         Node::Item(item) => {
764             match item.node {
765                 hir::ItemKind::Const(_, body) |
766                 hir::ItemKind::Static(_, _, body) =>
767                     Some((body, None)),
768                 hir::ItemKind::Fn(ref decl, .., body) =>
769                     Some((body, Some(decl))),
770                 _ =>
771                     None,
772             }
773         }
774         Node::TraitItem(item) => {
775             match item.node {
776                 hir::TraitItemKind::Const(_, Some(body)) =>
777                     Some((body, None)),
778                 hir::TraitItemKind::Method(ref sig, hir::TraitMethod::Provided(body)) =>
779                     Some((body, Some(&sig.decl))),
780                 _ =>
781                     None,
782             }
783         }
784         Node::ImplItem(item) => {
785             match item.node {
786                 hir::ImplItemKind::Const(_, body) =>
787                     Some((body, None)),
788                 hir::ImplItemKind::Method(ref sig, body) =>
789                     Some((body, Some(&sig.decl))),
790                 _ =>
791                     None,
792             }
793         }
794         Node::AnonConst(constant) => Some((constant.body, None)),
795         _ => None,
796     }
797 }
798
799 fn has_typeck_tables<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> bool {
800     // Closures' tables come from their outermost function,
801     // as they are part of the same "inference environment".
802     let outer_def_id = tcx.closure_base_def_id(def_id);
803     if outer_def_id != def_id {
804         return tcx.has_typeck_tables(outer_def_id);
805     }
806
807     let id = tcx.hir().as_local_hir_id(def_id).unwrap();
808     primary_body_of(tcx, id).is_some()
809 }
810
811 fn used_trait_imports<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> &'tcx DefIdSet {
812     &*tcx.typeck_tables_of(def_id).used_trait_imports
813 }
814
815 fn typeck_tables_of<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> &'tcx ty::TypeckTables<'tcx> {
816     // Closures' tables come from their outermost function,
817     // as they are part of the same "inference environment".
818     let outer_def_id = tcx.closure_base_def_id(def_id);
819     if outer_def_id != def_id {
820         return tcx.typeck_tables_of(outer_def_id);
821     }
822
823     let id = tcx.hir().as_local_hir_id(def_id).unwrap();
824     let span = tcx.hir().span_by_hir_id(id);
825
826     // Figure out what primary body this item has.
827     let (body_id, fn_decl) = primary_body_of(tcx, id).unwrap_or_else(|| {
828         span_bug!(span, "can't type-check body of {:?}", def_id);
829     });
830     let body = tcx.hir().body(body_id);
831
832     let tables = Inherited::build(tcx, def_id).enter(|inh| {
833         let param_env = tcx.param_env(def_id);
834         let fcx = if let Some(decl) = fn_decl {
835             let fn_sig = tcx.fn_sig(def_id);
836
837             check_abi(tcx, span, fn_sig.abi());
838
839             // Compute the fty from point of view of inside the fn.
840             let fn_sig =
841                 tcx.liberate_late_bound_regions(def_id, &fn_sig);
842             let fn_sig =
843                 inh.normalize_associated_types_in(body.value.span,
844                                                   body_id.hir_id,
845                                                   param_env,
846                                                   &fn_sig);
847
848             let fcx = check_fn(&inh, param_env, fn_sig, decl, id, body, None).0;
849             fcx
850         } else {
851             let fcx = FnCtxt::new(&inh, param_env, body.value.hir_id);
852             let expected_type = tcx.type_of(def_id);
853             let expected_type = fcx.normalize_associated_types_in(body.value.span, &expected_type);
854             fcx.require_type_is_sized(expected_type, body.value.span, traits::ConstSized);
855
856             let revealed_ty = if tcx.features().impl_trait_in_bindings {
857                 fcx.instantiate_opaque_types_from_value(
858                     id,
859                     &expected_type
860                 )
861             } else {
862                 expected_type
863             };
864
865             // Gather locals in statics (because of block expressions).
866             GatherLocalsVisitor { fcx: &fcx, parent_id: id, }.visit_body(body);
867
868             fcx.check_expr_coercable_to_type(&body.value, revealed_ty);
869
870             fcx.write_ty(id, revealed_ty);
871
872             fcx
873         };
874
875         // All type checking constraints were added, try to fallback unsolved variables.
876         fcx.select_obligations_where_possible(false);
877         let mut fallback_has_occurred = false;
878         for ty in &fcx.unsolved_variables() {
879             fallback_has_occurred |= fcx.fallback_if_possible(ty);
880         }
881         fcx.select_obligations_where_possible(fallback_has_occurred);
882
883         // Even though coercion casts provide type hints, we check casts after fallback for
884         // backwards compatibility. This makes fallback a stronger type hint than a cast coercion.
885         fcx.check_casts();
886
887         // Closure and generator analysis may run after fallback
888         // because they don't constrain other type variables.
889         fcx.closure_analyze(body);
890         assert!(fcx.deferred_call_resolutions.borrow().is_empty());
891         fcx.resolve_generator_interiors(def_id);
892
893         for (ty, span, code) in fcx.deferred_sized_obligations.borrow_mut().drain(..) {
894             let ty = fcx.normalize_ty(span, ty);
895             fcx.require_type_is_sized(ty, span, code);
896         }
897         fcx.select_all_obligations_or_error();
898
899         if fn_decl.is_some() {
900             fcx.regionck_fn(id, body);
901         } else {
902             fcx.regionck_expr(body);
903         }
904
905         fcx.resolve_type_vars_in_body(body)
906     });
907
908     // Consistency check our TypeckTables instance can hold all ItemLocalIds
909     // it will need to hold.
910     assert_eq!(tables.local_id_root, Some(DefId::local(id.owner)));
911
912     tables
913 }
914
915 fn check_abi<'tcx>(tcx: TyCtxt<'tcx>, span: Span, abi: Abi) {
916     if !tcx.sess.target.target.is_abi_supported(abi) {
917         struct_span_err!(tcx.sess, span, E0570,
918             "The ABI `{}` is not supported for the current target", abi).emit()
919     }
920 }
921
922 struct GatherLocalsVisitor<'a, 'tcx: 'a> {
923     fcx: &'a FnCtxt<'a, 'tcx>,
924     parent_id: hir::HirId,
925 }
926
927 impl<'a, 'tcx> GatherLocalsVisitor<'a, 'tcx> {
928     fn assign(&mut self, span: Span, nid: hir::HirId, ty_opt: Option<LocalTy<'tcx>>) -> Ty<'tcx> {
929         match ty_opt {
930             None => {
931                 // infer the variable's type
932                 let var_ty = self.fcx.next_ty_var(TypeVariableOrigin {
933                     kind: TypeVariableOriginKind::TypeInference,
934                     span,
935                 });
936                 self.fcx.locals.borrow_mut().insert(nid, LocalTy {
937                     decl_ty: var_ty,
938                     revealed_ty: var_ty
939                 });
940                 var_ty
941             }
942             Some(typ) => {
943                 // take type that the user specified
944                 self.fcx.locals.borrow_mut().insert(nid, typ);
945                 typ.revealed_ty
946             }
947         }
948     }
949 }
950
951 impl<'a, 'tcx> Visitor<'tcx> for GatherLocalsVisitor<'a, 'tcx> {
952     fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> {
953         NestedVisitorMap::None
954     }
955
956     // Add explicitly-declared locals.
957     fn visit_local(&mut self, local: &'tcx hir::Local) {
958         let local_ty = match local.ty {
959             Some(ref ty) => {
960                 let o_ty = self.fcx.to_ty(&ty);
961
962                 let revealed_ty = if self.fcx.tcx.features().impl_trait_in_bindings {
963                     self.fcx.instantiate_opaque_types_from_value(
964                         self.parent_id,
965                         &o_ty
966                     )
967                 } else {
968                     o_ty
969                 };
970
971                 let c_ty = self.fcx.inh.infcx.canonicalize_user_type_annotation(
972                     &UserType::Ty(revealed_ty)
973                 );
974                 debug!("visit_local: ty.hir_id={:?} o_ty={:?} revealed_ty={:?} c_ty={:?}",
975                        ty.hir_id, o_ty, revealed_ty, c_ty);
976                 self.fcx.tables.borrow_mut().user_provided_types_mut().insert(ty.hir_id, c_ty);
977
978                 Some(LocalTy { decl_ty: o_ty, revealed_ty })
979             },
980             None => None,
981         };
982         self.assign(local.span, local.hir_id, local_ty);
983
984         debug!("Local variable {:?} is assigned type {}",
985                local.pat,
986                self.fcx.ty_to_string(
987                    self.fcx.locals.borrow().get(&local.hir_id).unwrap().clone().decl_ty));
988         intravisit::walk_local(self, local);
989     }
990
991     // Add pattern bindings.
992     fn visit_pat(&mut self, p: &'tcx hir::Pat) {
993         if let PatKind::Binding(_, _, ident, _) = p.node {
994             let var_ty = self.assign(p.span, p.hir_id, None);
995
996             let node_id = self.fcx.tcx.hir().hir_to_node_id(p.hir_id);
997             if !self.fcx.tcx.features().unsized_locals {
998                 self.fcx.require_type_is_sized(var_ty, p.span,
999                                                traits::VariableType(node_id));
1000             }
1001
1002             debug!("Pattern binding {} is assigned to {} with type {:?}",
1003                    ident,
1004                    self.fcx.ty_to_string(
1005                        self.fcx.locals.borrow().get(&p.hir_id).unwrap().clone().decl_ty),
1006                    var_ty);
1007         }
1008         intravisit::walk_pat(self, p);
1009     }
1010
1011     // Don't descend into the bodies of nested closures
1012     fn visit_fn(
1013         &mut self,
1014         _: intravisit::FnKind<'tcx>,
1015         _: &'tcx hir::FnDecl,
1016         _: hir::BodyId,
1017         _: Span,
1018         _: hir::HirId,
1019     ) { }
1020 }
1021
1022 /// When `check_fn` is invoked on a generator (i.e., a body that
1023 /// includes yield), it returns back some information about the yield
1024 /// points.
1025 struct GeneratorTypes<'tcx> {
1026     /// Type of value that is yielded.
1027     yield_ty: Ty<'tcx>,
1028
1029     /// Types that are captured (see `GeneratorInterior` for more).
1030     interior: Ty<'tcx>,
1031
1032     /// Indicates if the generator is movable or static (immovable).
1033     movability: hir::GeneratorMovability,
1034 }
1035
1036 /// Helper used for fns and closures. Does the grungy work of checking a function
1037 /// body and returns the function context used for that purpose, since in the case of a fn item
1038 /// there is still a bit more to do.
1039 ///
1040 /// * ...
1041 /// * inherited: other fields inherited from the enclosing fn (if any)
1042 fn check_fn<'a, 'tcx>(
1043     inherited: &'a Inherited<'a, 'tcx>,
1044     param_env: ty::ParamEnv<'tcx>,
1045     fn_sig: ty::FnSig<'tcx>,
1046     decl: &'tcx hir::FnDecl,
1047     fn_id: hir::HirId,
1048     body: &'tcx hir::Body,
1049     can_be_generator: Option<hir::GeneratorMovability>,
1050 ) -> (FnCtxt<'a, 'tcx>, Option<GeneratorTypes<'tcx>>) {
1051     let mut fn_sig = fn_sig.clone();
1052
1053     debug!("check_fn(sig={:?}, fn_id={}, param_env={:?})", fn_sig, fn_id, param_env);
1054
1055     // Create the function context.  This is either derived from scratch or,
1056     // in the case of closures, based on the outer context.
1057     let mut fcx = FnCtxt::new(inherited, param_env, body.value.hir_id);
1058     *fcx.ps.borrow_mut() = UnsafetyState::function(fn_sig.unsafety, fn_id);
1059
1060     let declared_ret_ty = fn_sig.output();
1061     fcx.require_type_is_sized(declared_ret_ty, decl.output.span(), traits::SizedReturnType);
1062     let revealed_ret_ty = fcx.instantiate_opaque_types_from_value(fn_id, &declared_ret_ty);
1063     fcx.ret_coercion = Some(RefCell::new(CoerceMany::new(revealed_ret_ty)));
1064     fn_sig = fcx.tcx.mk_fn_sig(
1065         fn_sig.inputs().iter().cloned(),
1066         revealed_ret_ty,
1067         fn_sig.c_variadic,
1068         fn_sig.unsafety,
1069         fn_sig.abi
1070     );
1071
1072     let span = body.value.span;
1073
1074     if body.is_generator && can_be_generator.is_some() {
1075         let yield_ty = fcx.next_ty_var(TypeVariableOrigin {
1076             kind: TypeVariableOriginKind::TypeInference,
1077             span,
1078         });
1079         fcx.require_type_is_sized(yield_ty, span, traits::SizedYieldType);
1080         fcx.yield_ty = Some(yield_ty);
1081     }
1082
1083     let outer_def_id = fcx.tcx.closure_base_def_id(fcx.tcx.hir().local_def_id_from_hir_id(fn_id));
1084     let outer_hir_id = fcx.tcx.hir().as_local_hir_id(outer_def_id).unwrap();
1085     GatherLocalsVisitor { fcx: &fcx, parent_id: outer_hir_id, }.visit_body(body);
1086
1087     // Add formal parameters.
1088     for (arg_ty, arg) in fn_sig.inputs().iter().zip(&body.arguments) {
1089         // Check the pattern.
1090         let binding_mode = ty::BindingMode::BindByValue(hir::Mutability::MutImmutable);
1091         fcx.check_pat_walk(&arg.pat, arg_ty, binding_mode, None);
1092
1093         // Check that argument is Sized.
1094         // The check for a non-trivial pattern is a hack to avoid duplicate warnings
1095         // for simple cases like `fn foo(x: Trait)`,
1096         // where we would error once on the parameter as a whole, and once on the binding `x`.
1097         if arg.pat.simple_ident().is_none() && !fcx.tcx.features().unsized_locals {
1098             fcx.require_type_is_sized(arg_ty, decl.output.span(), traits::SizedArgumentType);
1099         }
1100
1101         fcx.write_ty(arg.hir_id, arg_ty);
1102     }
1103
1104     inherited.tables.borrow_mut().liberated_fn_sigs_mut().insert(fn_id, fn_sig);
1105
1106     fcx.check_return_expr(&body.value);
1107
1108     // We insert the deferred_generator_interiors entry after visiting the body.
1109     // This ensures that all nested generators appear before the entry of this generator.
1110     // resolve_generator_interiors relies on this property.
1111     let gen_ty = if can_be_generator.is_some() && body.is_generator {
1112         let interior = fcx.next_ty_var(TypeVariableOrigin {
1113             kind: TypeVariableOriginKind::MiscVariable,
1114             span,
1115         });
1116         fcx.deferred_generator_interiors.borrow_mut().push((body.id(), interior));
1117         Some(GeneratorTypes {
1118             yield_ty: fcx.yield_ty.unwrap(),
1119             interior,
1120             movability: can_be_generator.unwrap(),
1121         })
1122     } else {
1123         None
1124     };
1125
1126     // Finalize the return check by taking the LUB of the return types
1127     // we saw and assigning it to the expected return type. This isn't
1128     // really expected to fail, since the coercions would have failed
1129     // earlier when trying to find a LUB.
1130     //
1131     // However, the behavior around `!` is sort of complex. In the
1132     // event that the `actual_return_ty` comes back as `!`, that
1133     // indicates that the fn either does not return or "returns" only
1134     // values of type `!`. In this case, if there is an expected
1135     // return type that is *not* `!`, that should be ok. But if the
1136     // return type is being inferred, we want to "fallback" to `!`:
1137     //
1138     //     let x = move || panic!();
1139     //
1140     // To allow for that, I am creating a type variable with diverging
1141     // fallback. This was deemed ever so slightly better than unifying
1142     // the return value with `!` because it allows for the caller to
1143     // make more assumptions about the return type (e.g., they could do
1144     //
1145     //     let y: Option<u32> = Some(x());
1146     //
1147     // which would then cause this return type to become `u32`, not
1148     // `!`).
1149     let coercion = fcx.ret_coercion.take().unwrap().into_inner();
1150     let mut actual_return_ty = coercion.complete(&fcx);
1151     if actual_return_ty.is_never() {
1152         actual_return_ty = fcx.next_diverging_ty_var(
1153             TypeVariableOrigin {
1154                 kind: TypeVariableOriginKind::DivergingFn,
1155                 span,
1156             },
1157         );
1158     }
1159     fcx.demand_suptype(span, revealed_ret_ty, actual_return_ty);
1160
1161     // Check that the main return type implements the termination trait.
1162     if let Some(term_id) = fcx.tcx.lang_items().termination() {
1163         if let Some((def_id, EntryFnType::Main)) = fcx.tcx.entry_fn(LOCAL_CRATE) {
1164             let main_id = fcx.tcx.hir().as_local_hir_id(def_id).unwrap();
1165             if main_id == fn_id {
1166                 let substs = fcx.tcx.mk_substs_trait(declared_ret_ty, &[]);
1167                 let trait_ref = ty::TraitRef::new(term_id, substs);
1168                 let return_ty_span = decl.output.span();
1169                 let cause = traits::ObligationCause::new(
1170                     return_ty_span, fn_id, ObligationCauseCode::MainFunctionType);
1171
1172                 inherited.register_predicate(
1173                     traits::Obligation::new(
1174                         cause, param_env, trait_ref.to_predicate()));
1175             }
1176         }
1177     }
1178
1179     // Check that a function marked as `#[panic_handler]` has signature `fn(&PanicInfo) -> !`
1180     if let Some(panic_impl_did) = fcx.tcx.lang_items().panic_impl() {
1181         if panic_impl_did == fcx.tcx.hir().local_def_id_from_hir_id(fn_id) {
1182             if let Some(panic_info_did) = fcx.tcx.lang_items().panic_info() {
1183                 // at this point we don't care if there are duplicate handlers or if the handler has
1184                 // the wrong signature as this value we'll be used when writing metadata and that
1185                 // only happens if compilation succeeded
1186                 fcx.tcx.sess.has_panic_handler.try_set_same(true);
1187
1188                 if declared_ret_ty.sty != ty::Never {
1189                     fcx.tcx.sess.span_err(
1190                         decl.output.span(),
1191                         "return type should be `!`",
1192                     );
1193                 }
1194
1195                 let inputs = fn_sig.inputs();
1196                 let span = fcx.tcx.hir().span_by_hir_id(fn_id);
1197                 if inputs.len() == 1 {
1198                     let arg_is_panic_info = match inputs[0].sty {
1199                         ty::Ref(region, ty, mutbl) => match ty.sty {
1200                             ty::Adt(ref adt, _) => {
1201                                 adt.did == panic_info_did &&
1202                                     mutbl == hir::Mutability::MutImmutable &&
1203                                     *region != RegionKind::ReStatic
1204                             },
1205                             _ => false,
1206                         },
1207                         _ => false,
1208                     };
1209
1210                     if !arg_is_panic_info {
1211                         fcx.tcx.sess.span_err(
1212                             decl.inputs[0].span,
1213                             "argument should be `&PanicInfo`",
1214                         );
1215                     }
1216
1217                     if let Node::Item(item) = fcx.tcx.hir().get_by_hir_id(fn_id) {
1218                         if let ItemKind::Fn(_, _, ref generics, _) = item.node {
1219                             if !generics.params.is_empty() {
1220                                 fcx.tcx.sess.span_err(
1221                                     span,
1222                                     "should have no type parameters",
1223                                 );
1224                             }
1225                         }
1226                     }
1227                 } else {
1228                     let span = fcx.tcx.sess.source_map().def_span(span);
1229                     fcx.tcx.sess.span_err(span, "function should have one argument");
1230                 }
1231             } else {
1232                 fcx.tcx.sess.err("language item required, but not found: `panic_info`");
1233             }
1234         }
1235     }
1236
1237     // Check that a function marked as `#[alloc_error_handler]` has signature `fn(Layout) -> !`
1238     if let Some(alloc_error_handler_did) = fcx.tcx.lang_items().oom() {
1239         if alloc_error_handler_did == fcx.tcx.hir().local_def_id_from_hir_id(fn_id) {
1240             if let Some(alloc_layout_did) = fcx.tcx.lang_items().alloc_layout() {
1241                 if declared_ret_ty.sty != ty::Never {
1242                     fcx.tcx.sess.span_err(
1243                         decl.output.span(),
1244                         "return type should be `!`",
1245                     );
1246                 }
1247
1248                 let inputs = fn_sig.inputs();
1249                 let span = fcx.tcx.hir().span_by_hir_id(fn_id);
1250                 if inputs.len() == 1 {
1251                     let arg_is_alloc_layout = match inputs[0].sty {
1252                         ty::Adt(ref adt, _) => {
1253                             adt.did == alloc_layout_did
1254                         },
1255                         _ => false,
1256                     };
1257
1258                     if !arg_is_alloc_layout {
1259                         fcx.tcx.sess.span_err(
1260                             decl.inputs[0].span,
1261                             "argument should be `Layout`",
1262                         );
1263                     }
1264
1265                     if let Node::Item(item) = fcx.tcx.hir().get_by_hir_id(fn_id) {
1266                         if let ItemKind::Fn(_, _, ref generics, _) = item.node {
1267                             if !generics.params.is_empty() {
1268                                 fcx.tcx.sess.span_err(
1269                                     span,
1270                                     "`#[alloc_error_handler]` function should have no type \
1271                                      parameters",
1272                                 );
1273                             }
1274                         }
1275                     }
1276                 } else {
1277                     let span = fcx.tcx.sess.source_map().def_span(span);
1278                     fcx.tcx.sess.span_err(span, "function should have one argument");
1279                 }
1280             } else {
1281                 fcx.tcx.sess.err("language item required, but not found: `alloc_layout`");
1282             }
1283         }
1284     }
1285
1286     (fcx, gen_ty)
1287 }
1288
1289 fn check_struct<'tcx>(tcx: TyCtxt<'tcx>, id: hir::HirId, span: Span) {
1290     let def_id = tcx.hir().local_def_id_from_hir_id(id);
1291     let def = tcx.adt_def(def_id);
1292     def.destructor(tcx); // force the destructor to be evaluated
1293     check_representable(tcx, span, def_id);
1294
1295     if def.repr.simd() {
1296         check_simd(tcx, span, def_id);
1297     }
1298
1299     check_transparent(tcx, span, def_id);
1300     check_packed(tcx, span, def_id);
1301 }
1302
1303 fn check_union<'tcx>(tcx: TyCtxt<'tcx>, id: hir::HirId, span: Span) {
1304     let def_id = tcx.hir().local_def_id_from_hir_id(id);
1305     let def = tcx.adt_def(def_id);
1306     def.destructor(tcx); // force the destructor to be evaluated
1307     check_representable(tcx, span, def_id);
1308     check_transparent(tcx, span, def_id);
1309     check_packed(tcx, span, def_id);
1310 }
1311
1312 fn check_opaque<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, substs: SubstsRef<'tcx>, span: Span) {
1313     if let Err(partially_expanded_type) = tcx.try_expand_impl_trait_type(def_id, substs) {
1314         let mut err = struct_span_err!(
1315             tcx.sess, span, E0720,
1316             "opaque type expands to a recursive type",
1317         );
1318         err.span_label(span, "expands to self-referential type");
1319         if let ty::Opaque(..) = partially_expanded_type.sty {
1320             err.note("type resolves to itself");
1321         } else {
1322             err.note(&format!("expanded type is `{}`", partially_expanded_type));
1323         }
1324         err.emit();
1325     }
1326 }
1327
1328 pub fn check_item_type<'tcx>(tcx: TyCtxt<'tcx>, it: &'tcx hir::Item) {
1329     debug!(
1330         "check_item_type(it.hir_id={}, it.name={})",
1331         it.hir_id,
1332         tcx.def_path_str(tcx.hir().local_def_id_from_hir_id(it.hir_id))
1333     );
1334     let _indenter = indenter();
1335     match it.node {
1336         // Consts can play a role in type-checking, so they are included here.
1337         hir::ItemKind::Static(..) => {
1338             let def_id = tcx.hir().local_def_id_from_hir_id(it.hir_id);
1339             tcx.typeck_tables_of(def_id);
1340             maybe_check_static_with_link_section(tcx, def_id, it.span);
1341         }
1342         hir::ItemKind::Const(..) => {
1343             tcx.typeck_tables_of(tcx.hir().local_def_id_from_hir_id(it.hir_id));
1344         }
1345         hir::ItemKind::Enum(ref enum_definition, _) => {
1346             check_enum(tcx, it.span, &enum_definition.variants, it.hir_id);
1347         }
1348         hir::ItemKind::Fn(..) => {} // entirely within check_item_body
1349         hir::ItemKind::Impl(.., ref impl_item_refs) => {
1350             debug!("ItemKind::Impl {} with id {}", it.ident, it.hir_id);
1351             let impl_def_id = tcx.hir().local_def_id_from_hir_id(it.hir_id);
1352             if let Some(impl_trait_ref) = tcx.impl_trait_ref(impl_def_id) {
1353                 check_impl_items_against_trait(
1354                     tcx,
1355                     it.span,
1356                     impl_def_id,
1357                     impl_trait_ref,
1358                     impl_item_refs,
1359                 );
1360                 let trait_def_id = impl_trait_ref.def_id;
1361                 check_on_unimplemented(tcx, trait_def_id, it);
1362             }
1363         }
1364         hir::ItemKind::Trait(..) => {
1365             let def_id = tcx.hir().local_def_id_from_hir_id(it.hir_id);
1366             check_on_unimplemented(tcx, def_id, it);
1367         }
1368         hir::ItemKind::Struct(..) => {
1369             check_struct(tcx, it.hir_id, it.span);
1370         }
1371         hir::ItemKind::Union(..) => {
1372             check_union(tcx, it.hir_id, it.span);
1373         }
1374         hir::ItemKind::Existential(..) => {
1375             let def_id = tcx.hir().local_def_id_from_hir_id(it.hir_id);
1376
1377             let substs = InternalSubsts::identity_for_item(tcx, def_id);
1378             check_opaque(tcx, def_id, substs, it.span);
1379         }
1380         hir::ItemKind::Ty(..) => {
1381             let def_id = tcx.hir().local_def_id_from_hir_id(it.hir_id);
1382             let pty_ty = tcx.type_of(def_id);
1383             let generics = tcx.generics_of(def_id);
1384             check_bounds_are_used(tcx, &generics, pty_ty);
1385         }
1386         hir::ItemKind::ForeignMod(ref m) => {
1387             check_abi(tcx, it.span, m.abi);
1388
1389             if m.abi == Abi::RustIntrinsic {
1390                 for item in &m.items {
1391                     intrinsic::check_intrinsic_type(tcx, item);
1392                 }
1393             } else if m.abi == Abi::PlatformIntrinsic {
1394                 for item in &m.items {
1395                     intrinsic::check_platform_intrinsic_type(tcx, item);
1396                 }
1397             } else {
1398                 for item in &m.items {
1399                     let generics = tcx.generics_of(tcx.hir().local_def_id_from_hir_id(item.hir_id));
1400                     if generics.params.len() - generics.own_counts().lifetimes != 0 {
1401                         let mut err = struct_span_err!(
1402                             tcx.sess,
1403                             item.span,
1404                             E0044,
1405                             "foreign items may not have type parameters"
1406                         );
1407                         err.span_label(item.span, "can't have type parameters");
1408                         // FIXME: once we start storing spans for type arguments, turn this into a
1409                         // suggestion.
1410                         err.help(
1411                             "use specialization instead of type parameters by replacing them \
1412                              with concrete types like `u32`",
1413                         );
1414                         err.emit();
1415                     }
1416
1417                     if let hir::ForeignItemKind::Fn(ref fn_decl, _, _) = item.node {
1418                         require_c_abi_if_c_variadic(tcx, fn_decl, m.abi, item.span);
1419                     }
1420                 }
1421             }
1422         }
1423         _ => { /* nothing to do */ }
1424     }
1425 }
1426
1427 fn maybe_check_static_with_link_section(tcx: TyCtxt<'_>, id: DefId, span: Span) {
1428     // Only restricted on wasm32 target for now
1429     if !tcx.sess.opts.target_triple.triple().starts_with("wasm32") {
1430         return
1431     }
1432
1433     // If `#[link_section]` is missing, then nothing to verify
1434     let attrs = tcx.codegen_fn_attrs(id);
1435     if attrs.link_section.is_none() {
1436         return
1437     }
1438
1439     // For the wasm32 target statics with #[link_section] are placed into custom
1440     // sections of the final output file, but this isn't link custom sections of
1441     // other executable formats. Namely we can only embed a list of bytes,
1442     // nothing with pointers to anything else or relocations. If any relocation
1443     // show up, reject them here.
1444     let instance = ty::Instance::mono(tcx, id);
1445     let cid = GlobalId {
1446         instance,
1447         promoted: None
1448     };
1449     let param_env = ty::ParamEnv::reveal_all();
1450     if let Ok(static_) = tcx.const_eval(param_env.and(cid)) {
1451         let alloc = if let ConstValue::ByRef(_, allocation) = static_.val {
1452             allocation
1453         } else {
1454             bug!("Matching on non-ByRef static")
1455         };
1456         if alloc.relocations.len() != 0 {
1457             let msg = "statics with a custom `#[link_section]` must be a \
1458                        simple list of bytes on the wasm target with no \
1459                        extra levels of indirection such as references";
1460             tcx.sess.span_err(span, msg);
1461         }
1462     }
1463 }
1464
1465 fn check_on_unimplemented<'tcx>(tcx: TyCtxt<'tcx>, trait_def_id: DefId, item: &hir::Item) {
1466     let item_def_id = tcx.hir().local_def_id_from_hir_id(item.hir_id);
1467     // an error would be reported if this fails.
1468     let _ = traits::OnUnimplementedDirective::of_item(tcx, trait_def_id, item_def_id);
1469 }
1470
1471 fn report_forbidden_specialization<'tcx>(
1472     tcx: TyCtxt<'tcx>,
1473     impl_item: &hir::ImplItem,
1474     parent_impl: DefId,
1475 ) {
1476     let mut err = struct_span_err!(
1477         tcx.sess, impl_item.span, E0520,
1478         "`{}` specializes an item from a parent `impl`, but \
1479          that item is not marked `default`",
1480         impl_item.ident);
1481     err.span_label(impl_item.span, format!("cannot specialize default item `{}`",
1482                                             impl_item.ident));
1483
1484     match tcx.span_of_impl(parent_impl) {
1485         Ok(span) => {
1486             err.span_label(span, "parent `impl` is here");
1487             err.note(&format!("to specialize, `{}` in the parent `impl` must be marked `default`",
1488                               impl_item.ident));
1489         }
1490         Err(cname) => {
1491             err.note(&format!("parent implementation is in crate `{}`", cname));
1492         }
1493     }
1494
1495     err.emit();
1496 }
1497
1498 fn check_specialization_validity<'tcx>(
1499     tcx: TyCtxt<'tcx>,
1500     trait_def: &ty::TraitDef,
1501     trait_item: &ty::AssocItem,
1502     impl_id: DefId,
1503     impl_item: &hir::ImplItem,
1504 ) {
1505     let ancestors = trait_def.ancestors(tcx, impl_id);
1506
1507     let kind = match impl_item.node {
1508         hir::ImplItemKind::Const(..) => ty::AssocKind::Const,
1509         hir::ImplItemKind::Method(..) => ty::AssocKind::Method,
1510         hir::ImplItemKind::Existential(..) => ty::AssocKind::Existential,
1511         hir::ImplItemKind::Type(_) => ty::AssocKind::Type
1512     };
1513
1514     let parent = ancestors.defs(tcx, trait_item.ident, kind, trait_def.def_id).nth(1)
1515         .map(|node_item| node_item.map(|parent| parent.defaultness));
1516
1517     if let Some(parent) = parent {
1518         if tcx.impl_item_is_final(&parent) {
1519             report_forbidden_specialization(tcx, impl_item, parent.node.def_id());
1520         }
1521     }
1522
1523 }
1524
1525 fn check_impl_items_against_trait<'tcx>(
1526     tcx: TyCtxt<'tcx>,
1527     impl_span: Span,
1528     impl_id: DefId,
1529     impl_trait_ref: ty::TraitRef<'tcx>,
1530     impl_item_refs: &[hir::ImplItemRef],
1531 ) {
1532     let impl_span = tcx.sess.source_map().def_span(impl_span);
1533
1534     // If the trait reference itself is erroneous (so the compilation is going
1535     // to fail), skip checking the items here -- the `impl_item` table in `tcx`
1536     // isn't populated for such impls.
1537     if impl_trait_ref.references_error() { return; }
1538
1539     // Locate trait definition and items
1540     let trait_def = tcx.trait_def(impl_trait_ref.def_id);
1541     let mut overridden_associated_type = None;
1542
1543     let impl_items = || impl_item_refs.iter().map(|iiref| tcx.hir().impl_item(iiref.id));
1544
1545     // Check existing impl methods to see if they are both present in trait
1546     // and compatible with trait signature
1547     for impl_item in impl_items() {
1548         let ty_impl_item = tcx.associated_item(
1549             tcx.hir().local_def_id_from_hir_id(impl_item.hir_id));
1550         let ty_trait_item = tcx.associated_items(impl_trait_ref.def_id)
1551             .find(|ac| Namespace::from(&impl_item.node) == Namespace::from(ac.kind) &&
1552                        tcx.hygienic_eq(ty_impl_item.ident, ac.ident, impl_trait_ref.def_id))
1553             .or_else(|| {
1554                 // Not compatible, but needed for the error message
1555                 tcx.associated_items(impl_trait_ref.def_id)
1556                    .find(|ac| tcx.hygienic_eq(ty_impl_item.ident, ac.ident, impl_trait_ref.def_id))
1557             });
1558
1559         // Check that impl definition matches trait definition
1560         if let Some(ty_trait_item) = ty_trait_item {
1561             match impl_item.node {
1562                 hir::ImplItemKind::Const(..) => {
1563                     // Find associated const definition.
1564                     if ty_trait_item.kind == ty::AssocKind::Const {
1565                         compare_const_impl(tcx,
1566                                            &ty_impl_item,
1567                                            impl_item.span,
1568                                            &ty_trait_item,
1569                                            impl_trait_ref);
1570                     } else {
1571                          let mut err = struct_span_err!(tcx.sess, impl_item.span, E0323,
1572                              "item `{}` is an associated const, \
1573                               which doesn't match its trait `{}`",
1574                              ty_impl_item.ident,
1575                              impl_trait_ref);
1576                          err.span_label(impl_item.span, "does not match trait");
1577                          // We can only get the spans from local trait definition
1578                          // Same for E0324 and E0325
1579                          if let Some(trait_span) = tcx.hir().span_if_local(ty_trait_item.def_id) {
1580                             err.span_label(trait_span, "item in trait");
1581                          }
1582                          err.emit()
1583                     }
1584                 }
1585                 hir::ImplItemKind::Method(..) => {
1586                     let trait_span = tcx.hir().span_if_local(ty_trait_item.def_id);
1587                     if ty_trait_item.kind == ty::AssocKind::Method {
1588                         compare_impl_method(tcx,
1589                                             &ty_impl_item,
1590                                             impl_item.span,
1591                                             &ty_trait_item,
1592                                             impl_trait_ref,
1593                                             trait_span);
1594                     } else {
1595                         let mut err = struct_span_err!(tcx.sess, impl_item.span, E0324,
1596                             "item `{}` is an associated method, \
1597                              which doesn't match its trait `{}`",
1598                             ty_impl_item.ident,
1599                             impl_trait_ref);
1600                          err.span_label(impl_item.span, "does not match trait");
1601                          if let Some(trait_span) = tcx.hir().span_if_local(ty_trait_item.def_id) {
1602                             err.span_label(trait_span, "item in trait");
1603                          }
1604                          err.emit()
1605                     }
1606                 }
1607                 hir::ImplItemKind::Existential(..) |
1608                 hir::ImplItemKind::Type(_) => {
1609                     if ty_trait_item.kind == ty::AssocKind::Type {
1610                         if ty_trait_item.defaultness.has_value() {
1611                             overridden_associated_type = Some(impl_item);
1612                         }
1613                     } else {
1614                         let mut err = struct_span_err!(tcx.sess, impl_item.span, E0325,
1615                             "item `{}` is an associated type, \
1616                              which doesn't match its trait `{}`",
1617                             ty_impl_item.ident,
1618                             impl_trait_ref);
1619                          err.span_label(impl_item.span, "does not match trait");
1620                          if let Some(trait_span) = tcx.hir().span_if_local(ty_trait_item.def_id) {
1621                             err.span_label(trait_span, "item in trait");
1622                          }
1623                          err.emit()
1624                     }
1625                 }
1626             }
1627
1628             check_specialization_validity(tcx, trait_def, &ty_trait_item, impl_id, impl_item);
1629         }
1630     }
1631
1632     // Check for missing items from trait
1633     let mut missing_items = Vec::new();
1634     let mut invalidated_items = Vec::new();
1635     let associated_type_overridden = overridden_associated_type.is_some();
1636     for trait_item in tcx.associated_items(impl_trait_ref.def_id) {
1637         let is_implemented = trait_def.ancestors(tcx, impl_id)
1638             .defs(tcx, trait_item.ident, trait_item.kind, impl_trait_ref.def_id)
1639             .next()
1640             .map(|node_item| !node_item.node.is_from_trait())
1641             .unwrap_or(false);
1642
1643         if !is_implemented && !tcx.impl_is_default(impl_id) {
1644             if !trait_item.defaultness.has_value() {
1645                 missing_items.push(trait_item);
1646             } else if associated_type_overridden {
1647                 invalidated_items.push(trait_item.ident);
1648             }
1649         }
1650     }
1651
1652     if !missing_items.is_empty() {
1653         let mut err = struct_span_err!(tcx.sess, impl_span, E0046,
1654             "not all trait items implemented, missing: `{}`",
1655             missing_items.iter()
1656                 .map(|trait_item| trait_item.ident.to_string())
1657                 .collect::<Vec<_>>().join("`, `"));
1658         err.span_label(impl_span, format!("missing `{}` in implementation",
1659                 missing_items.iter()
1660                     .map(|trait_item| trait_item.ident.to_string())
1661                     .collect::<Vec<_>>().join("`, `")));
1662         for trait_item in missing_items {
1663             if let Some(span) = tcx.hir().span_if_local(trait_item.def_id) {
1664                 err.span_label(span, format!("`{}` from trait", trait_item.ident));
1665             } else {
1666                 err.note_trait_signature(trait_item.ident.to_string(),
1667                                          trait_item.signature(tcx));
1668             }
1669         }
1670         err.emit();
1671     }
1672
1673     if !invalidated_items.is_empty() {
1674         let invalidator = overridden_associated_type.unwrap();
1675         span_err!(tcx.sess, invalidator.span, E0399,
1676                   "the following trait items need to be reimplemented \
1677                    as `{}` was overridden: `{}`",
1678                   invalidator.ident,
1679                   invalidated_items.iter()
1680                                    .map(|name| name.to_string())
1681                                    .collect::<Vec<_>>().join("`, `"))
1682     }
1683 }
1684
1685 /// Checks whether a type can be represented in memory. In particular, it
1686 /// identifies types that contain themselves without indirection through a
1687 /// pointer, which would mean their size is unbounded.
1688 fn check_representable<'tcx>(tcx: TyCtxt<'tcx>, sp: Span, item_def_id: DefId) -> bool {
1689     let rty = tcx.type_of(item_def_id);
1690
1691     // Check that it is possible to represent this type. This call identifies
1692     // (1) types that contain themselves and (2) types that contain a different
1693     // recursive type. It is only necessary to throw an error on those that
1694     // contain themselves. For case 2, there must be an inner type that will be
1695     // caught by case 1.
1696     match rty.is_representable(tcx, sp) {
1697         Representability::SelfRecursive(spans) => {
1698             let mut err = tcx.recursive_type_with_infinite_size_error(item_def_id);
1699             for span in spans {
1700                 err.span_label(span, "recursive without indirection");
1701             }
1702             err.emit();
1703             return false
1704         }
1705         Representability::Representable | Representability::ContainsRecursive => (),
1706     }
1707     return true;
1708 }
1709
1710 pub fn check_simd<'tcx>(tcx: TyCtxt<'tcx>, sp: Span, def_id: DefId) {
1711     let t = tcx.type_of(def_id);
1712     if let ty::Adt(def, substs) = t.sty {
1713         if def.is_struct() {
1714             let fields = &def.non_enum_variant().fields;
1715             if fields.is_empty() {
1716                 span_err!(tcx.sess, sp, E0075, "SIMD vector cannot be empty");
1717                 return;
1718             }
1719             let e = fields[0].ty(tcx, substs);
1720             if !fields.iter().all(|f| f.ty(tcx, substs) == e) {
1721                 struct_span_err!(tcx.sess, sp, E0076, "SIMD vector should be homogeneous")
1722                                 .span_label(sp, "SIMD elements must have the same type")
1723                                 .emit();
1724                 return;
1725             }
1726             match e.sty {
1727                 ty::Param(_) => { /* struct<T>(T, T, T, T) is ok */ }
1728                 _ if e.is_machine() => { /* struct(u8, u8, u8, u8) is ok */ }
1729                 _ => {
1730                     span_err!(tcx.sess, sp, E0077,
1731                               "SIMD vector element type should be machine type");
1732                     return;
1733                 }
1734             }
1735         }
1736     }
1737 }
1738
1739 fn check_packed<'tcx>(tcx: TyCtxt<'tcx>, sp: Span, def_id: DefId) {
1740     let repr = tcx.adt_def(def_id).repr;
1741     if repr.packed() {
1742         for attr in tcx.get_attrs(def_id).iter() {
1743             for r in attr::find_repr_attrs(&tcx.sess.parse_sess, attr) {
1744                 if let attr::ReprPacked(pack) = r {
1745                     if pack != repr.pack {
1746                         struct_span_err!(tcx.sess, sp, E0634,
1747                                          "type has conflicting packed representation hints").emit();
1748                     }
1749                 }
1750             }
1751         }
1752         if repr.align > 0 {
1753             struct_span_err!(tcx.sess, sp, E0587,
1754                              "type has conflicting packed and align representation hints").emit();
1755         }
1756         else if check_packed_inner(tcx, def_id, &mut Vec::new()) {
1757             struct_span_err!(tcx.sess, sp, E0588,
1758                 "packed type cannot transitively contain a `[repr(align)]` type").emit();
1759         }
1760     }
1761 }
1762
1763 fn check_packed_inner<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, stack: &mut Vec<DefId>) -> bool {
1764     let t = tcx.type_of(def_id);
1765     if stack.contains(&def_id) {
1766         debug!("check_packed_inner: {:?} is recursive", t);
1767         return false;
1768     }
1769     if let ty::Adt(def, substs) = t.sty {
1770         if def.is_struct() || def.is_union() {
1771             if tcx.adt_def(def.did).repr.align > 0 {
1772                 return true;
1773             }
1774             // push struct def_id before checking fields
1775             stack.push(def_id);
1776             for field in &def.non_enum_variant().fields {
1777                 let f = field.ty(tcx, substs);
1778                 if let ty::Adt(def, _) = f.sty {
1779                     if check_packed_inner(tcx, def.did, stack) {
1780                         return true;
1781                     }
1782                 }
1783             }
1784             // only need to pop if not early out
1785             stack.pop();
1786         }
1787     }
1788     false
1789 }
1790
1791 fn check_transparent<'tcx>(tcx: TyCtxt<'tcx>, sp: Span, def_id: DefId) {
1792     let adt = tcx.adt_def(def_id);
1793     if !adt.repr.transparent() {
1794         return;
1795     }
1796
1797     if adt.is_enum() {
1798         if !tcx.features().transparent_enums {
1799             emit_feature_err(&tcx.sess.parse_sess,
1800                              sym::transparent_enums,
1801                              sp,
1802                              GateIssue::Language,
1803                              "transparent enums are unstable");
1804         }
1805         if adt.variants.len() != 1 {
1806             let variant_spans: Vec<_> = adt.variants.iter().map(|variant| {
1807                 tcx.hir().span_if_local(variant.def_id).unwrap()
1808             }).collect();
1809             let mut err = struct_span_err!(tcx.sess, sp, E0731,
1810                             "transparent enum needs exactly one variant, but has {}",
1811                             adt.variants.len());
1812             if !variant_spans.is_empty() {
1813                 err.span_note(variant_spans, &format!("the following variants exist on `{}`",
1814                                                       tcx.def_path_str(def_id)));
1815             }
1816             err.emit();
1817             if adt.variants.is_empty() {
1818                 // Don't bother checking the fields. No variants (and thus no fields) exist.
1819                 return;
1820             }
1821         }
1822     }
1823
1824     if adt.is_union() && !tcx.features().transparent_unions {
1825         emit_feature_err(&tcx.sess.parse_sess,
1826                          sym::transparent_unions,
1827                          sp,
1828                          GateIssue::Language,
1829                          "transparent unions are unstable");
1830     }
1831
1832     // For each field, figure out if it's known to be a ZST and align(1)
1833     let field_infos = adt.all_fields().map(|field| {
1834         let ty = field.ty(tcx, InternalSubsts::identity_for_item(tcx, field.did));
1835         let param_env = tcx.param_env(field.did);
1836         let layout = tcx.layout_of(param_env.and(ty));
1837         // We are currently checking the type this field came from, so it must be local
1838         let span = tcx.hir().span_if_local(field.did).unwrap();
1839         let zst = layout.map(|layout| layout.is_zst()).unwrap_or(false);
1840         let align1 = layout.map(|layout| layout.align.abi.bytes() == 1).unwrap_or(false);
1841         (span, zst, align1)
1842     });
1843
1844     let non_zst_fields = field_infos.clone().filter(|(_span, zst, _align1)| !*zst);
1845     let non_zst_count = non_zst_fields.clone().count();
1846     if non_zst_count != 1 {
1847         let field_spans: Vec<_> = non_zst_fields.map(|(span, _zst, _align1)| span).collect();
1848
1849         let mut err = struct_span_err!(tcx.sess, sp, E0690,
1850                          "{}transparent {} needs exactly one non-zero-sized field, but has {}",
1851                          if adt.is_enum() { "the variant of a " } else { "" },
1852                          adt.descr(),
1853                          non_zst_count);
1854         if !field_spans.is_empty() {
1855             err.span_note(field_spans,
1856                           &format!("the following non-zero-sized fields exist on `{}`:",
1857                                    tcx.def_path_str(def_id)));
1858         }
1859         err.emit();
1860     }
1861     for (span, zst, align1) in field_infos {
1862         if zst && !align1 {
1863             span_err!(tcx.sess, span, E0691,
1864                       "zero-sized field in transparent {} has alignment larger than 1",
1865                       adt.descr());
1866         }
1867     }
1868 }
1869
1870 #[allow(trivial_numeric_casts)]
1871 pub fn check_enum<'tcx>(tcx: TyCtxt<'tcx>, sp: Span, vs: &'tcx [hir::Variant], id: hir::HirId) {
1872     let def_id = tcx.hir().local_def_id_from_hir_id(id);
1873     let def = tcx.adt_def(def_id);
1874     def.destructor(tcx); // force the destructor to be evaluated
1875
1876     if vs.is_empty() {
1877         let attributes = tcx.get_attrs(def_id);
1878         if let Some(attr) = attr::find_by_name(&attributes, sym::repr) {
1879             struct_span_err!(
1880                 tcx.sess, attr.span, E0084,
1881                 "unsupported representation for zero-variant enum")
1882                 .span_label(sp, "zero-variant enum")
1883                 .emit();
1884         }
1885     }
1886
1887     let repr_type_ty = def.repr.discr_type().to_ty(tcx);
1888     if repr_type_ty == tcx.types.i128 || repr_type_ty == tcx.types.u128 {
1889         if !tcx.features().repr128 {
1890             emit_feature_err(&tcx.sess.parse_sess,
1891                              sym::repr128,
1892                              sp,
1893                              GateIssue::Language,
1894                              "repr with 128-bit type is unstable");
1895         }
1896     }
1897
1898     for v in vs {
1899         if let Some(ref e) = v.node.disr_expr {
1900             tcx.typeck_tables_of(tcx.hir().local_def_id_from_hir_id(e.hir_id));
1901         }
1902     }
1903
1904     let mut disr_vals: Vec<Discr<'tcx>> = Vec::with_capacity(vs.len());
1905     for ((_, discr), v) in def.discriminants(tcx).zip(vs) {
1906         // Check for duplicate discriminant values
1907         if let Some(i) = disr_vals.iter().position(|&x| x.val == discr.val) {
1908             let variant_did = def.variants[VariantIdx::new(i)].def_id;
1909             let variant_i_hir_id = tcx.hir().as_local_hir_id(variant_did).unwrap();
1910             let variant_i = tcx.hir().expect_variant(variant_i_hir_id);
1911             let i_span = match variant_i.node.disr_expr {
1912                 Some(ref expr) => tcx.hir().span_by_hir_id(expr.hir_id),
1913                 None => tcx.hir().span_by_hir_id(variant_i_hir_id)
1914             };
1915             let span = match v.node.disr_expr {
1916                 Some(ref expr) => tcx.hir().span_by_hir_id(expr.hir_id),
1917                 None => v.span
1918             };
1919             struct_span_err!(tcx.sess, span, E0081,
1920                              "discriminant value `{}` already exists", disr_vals[i])
1921                 .span_label(i_span, format!("first use of `{}`", disr_vals[i]))
1922                 .span_label(span , format!("enum already has `{}`", disr_vals[i]))
1923                 .emit();
1924         }
1925         disr_vals.push(discr);
1926     }
1927
1928     check_representable(tcx, sp, def_id);
1929     check_transparent(tcx, sp, def_id);
1930 }
1931
1932 fn report_unexpected_variant_res<'tcx>(tcx: TyCtxt<'tcx>, res: Res, span: Span, qpath: &QPath) {
1933     span_err!(tcx.sess, span, E0533,
1934               "expected unit struct/variant or constant, found {} `{}`",
1935               res.descr(),
1936               hir::print::to_string(tcx.hir(), |s| s.print_qpath(qpath, false)));
1937 }
1938
1939 impl<'a, 'tcx> AstConv<'tcx> for FnCtxt<'a, 'tcx> {
1940     fn tcx<'b>(&'b self) -> TyCtxt<'tcx> {
1941         self.tcx
1942         }
1943
1944     fn get_type_parameter_bounds(&self, _: Span, def_id: DefId)
1945                                  -> &'tcx ty::GenericPredicates<'tcx>
1946     {
1947         let tcx = self.tcx;
1948         let hir_id = tcx.hir().as_local_hir_id(def_id).unwrap();
1949         let item_id = tcx.hir().ty_param_owner(hir_id);
1950         let item_def_id = tcx.hir().local_def_id_from_hir_id(item_id);
1951         let generics = tcx.generics_of(item_def_id);
1952         let index = generics.param_def_id_to_index[&def_id];
1953         tcx.arena.alloc(ty::GenericPredicates {
1954             parent: None,
1955             predicates: self.param_env.caller_bounds.iter().filter_map(|&predicate| {
1956                 match predicate {
1957                     ty::Predicate::Trait(ref data)
1958                     if data.skip_binder().self_ty().is_param(index) => {
1959                         // HACK(eddyb) should get the original `Span`.
1960                         let span = tcx.def_span(def_id);
1961                         Some((predicate, span))
1962                     }
1963                     _ => None
1964                 }
1965             }).collect()
1966         })
1967     }
1968
1969     fn re_infer(
1970         &self,
1971         def: Option<&ty::GenericParamDef>,
1972         span: Span,
1973     ) -> Option<ty::Region<'tcx>> {
1974         let v = match def {
1975             Some(def) => infer::EarlyBoundRegion(span, def.name),
1976             None => infer::MiscVariable(span)
1977         };
1978         Some(self.next_region_var(v))
1979     }
1980
1981     fn ty_infer(&self, param: Option<&ty::GenericParamDef>, span: Span) -> Ty<'tcx> {
1982         if let Some(param) = param {
1983             if let UnpackedKind::Type(ty) = self.var_for_def(span, param).unpack() {
1984                 return ty;
1985             }
1986             unreachable!()
1987         } else {
1988             self.next_ty_var(TypeVariableOrigin {
1989                 kind: TypeVariableOriginKind::TypeInference,
1990                 span,
1991             })
1992         }
1993     }
1994
1995     fn ct_infer(
1996         &self,
1997         ty: Ty<'tcx>,
1998         param: Option<&ty::GenericParamDef>,
1999         span: Span,
2000     ) -> &'tcx Const<'tcx> {
2001         if let Some(param) = param {
2002             if let UnpackedKind::Const(ct) = self.var_for_def(span, param).unpack() {
2003                 return ct;
2004             }
2005             unreachable!()
2006         } else {
2007             self.next_const_var(ty, ConstVariableOrigin {
2008                 kind: ConstVariableOriginKind::ConstInference,
2009                 span,
2010             })
2011         }
2012     }
2013
2014     fn projected_ty_from_poly_trait_ref(&self,
2015                                         span: Span,
2016                                         item_def_id: DefId,
2017                                         poly_trait_ref: ty::PolyTraitRef<'tcx>)
2018                                         -> Ty<'tcx>
2019     {
2020         let (trait_ref, _) = self.replace_bound_vars_with_fresh_vars(
2021             span,
2022             infer::LateBoundRegionConversionTime::AssocTypeProjection(item_def_id),
2023             &poly_trait_ref
2024         );
2025
2026         self.tcx().mk_projection(item_def_id, trait_ref.substs)
2027     }
2028
2029     fn normalize_ty(&self, span: Span, ty: Ty<'tcx>) -> Ty<'tcx> {
2030         if ty.has_escaping_bound_vars() {
2031             ty // FIXME: normalization and escaping regions
2032         } else {
2033             self.normalize_associated_types_in(span, &ty)
2034         }
2035     }
2036
2037     fn set_tainted_by_errors(&self) {
2038         self.infcx.set_tainted_by_errors()
2039     }
2040
2041     fn record_ty(&self, hir_id: hir::HirId, ty: Ty<'tcx>, _span: Span) {
2042         self.write_ty(hir_id, ty)
2043     }
2044 }
2045
2046 /// Controls whether the arguments are tupled. This is used for the call
2047 /// operator.
2048 ///
2049 /// Tupling means that all call-side arguments are packed into a tuple and
2050 /// passed as a single parameter. For example, if tupling is enabled, this
2051 /// function:
2052 ///
2053 ///     fn f(x: (isize, isize))
2054 ///
2055 /// Can be called as:
2056 ///
2057 ///     f(1, 2);
2058 ///
2059 /// Instead of:
2060 ///
2061 ///     f((1, 2));
2062 #[derive(Clone, Eq, PartialEq)]
2063 enum TupleArgumentsFlag {
2064     DontTupleArguments,
2065     TupleArguments,
2066 }
2067
2068 impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
2069     pub fn new(
2070         inh: &'a Inherited<'a, 'tcx>,
2071         param_env: ty::ParamEnv<'tcx>,
2072         body_id: hir::HirId,
2073     ) -> FnCtxt<'a, 'tcx> {
2074         FnCtxt {
2075             body_id,
2076             param_env,
2077             err_count_on_creation: inh.tcx.sess.err_count(),
2078             ret_coercion: None,
2079             ret_coercion_span: RefCell::new(None),
2080             yield_ty: None,
2081             ps: RefCell::new(UnsafetyState::function(hir::Unsafety::Normal,
2082                                                      hir::CRATE_HIR_ID)),
2083             diverges: Cell::new(Diverges::Maybe),
2084             has_errors: Cell::new(false),
2085             enclosing_breakables: RefCell::new(EnclosingBreakables {
2086                 stack: Vec::new(),
2087                 by_id: Default::default(),
2088             }),
2089             inh,
2090         }
2091     }
2092
2093     pub fn sess(&self) -> &Session {
2094         &self.tcx.sess
2095     }
2096
2097     pub fn err_count_since_creation(&self) -> usize {
2098         self.tcx.sess.err_count() - self.err_count_on_creation
2099     }
2100
2101     /// Produces warning on the given node, if the current point in the
2102     /// function is unreachable, and there hasn't been another warning.
2103     fn warn_if_unreachable(&self, id: hir::HirId, span: Span, kind: &str) {
2104         if self.diverges.get() == Diverges::Always &&
2105             // If span arose from a desugaring of `if` then it is the condition itself,
2106             // which diverges, that we are about to lint on. This gives suboptimal diagnostics
2107             // and so we stop here and allow the block of the `if`-expression to be linted instead.
2108             !span.is_compiler_desugaring(CompilerDesugaringKind::IfTemporary) {
2109             self.diverges.set(Diverges::WarnedAlways);
2110
2111             debug!("warn_if_unreachable: id={:?} span={:?} kind={}", id, span, kind);
2112
2113             let msg = format!("unreachable {}", kind);
2114             self.tcx().lint_hir(lint::builtin::UNREACHABLE_CODE, id, span, &msg);
2115         }
2116     }
2117
2118     pub fn cause(&self,
2119                  span: Span,
2120                  code: ObligationCauseCode<'tcx>)
2121                  -> ObligationCause<'tcx> {
2122         ObligationCause::new(span, self.body_id, code)
2123     }
2124
2125     pub fn misc(&self, span: Span) -> ObligationCause<'tcx> {
2126         self.cause(span, ObligationCauseCode::MiscObligation)
2127     }
2128
2129     /// Resolves type variables in `ty` if possible. Unlike the infcx
2130     /// version (resolve_vars_if_possible), this version will
2131     /// also select obligations if it seems useful, in an effort
2132     /// to get more type information.
2133     fn resolve_type_vars_with_obligations(&self, mut ty: Ty<'tcx>) -> Ty<'tcx> {
2134         debug!("resolve_type_vars_with_obligations(ty={:?})", ty);
2135
2136         // No Infer()? Nothing needs doing.
2137         if !ty.has_infer_types() {
2138             debug!("resolve_type_vars_with_obligations: ty={:?}", ty);
2139             return ty;
2140         }
2141
2142         // If `ty` is a type variable, see whether we already know what it is.
2143         ty = self.resolve_vars_if_possible(&ty);
2144         if !ty.has_infer_types() {
2145             debug!("resolve_type_vars_with_obligations: ty={:?}", ty);
2146             return ty;
2147         }
2148
2149         // If not, try resolving pending obligations as much as
2150         // possible. This can help substantially when there are
2151         // indirect dependencies that don't seem worth tracking
2152         // precisely.
2153         self.select_obligations_where_possible(false);
2154         ty = self.resolve_vars_if_possible(&ty);
2155
2156         debug!("resolve_type_vars_with_obligations: ty={:?}", ty);
2157         ty
2158     }
2159
2160     fn record_deferred_call_resolution(
2161         &self,
2162         closure_def_id: DefId,
2163         r: DeferredCallResolution<'tcx>,
2164     ) {
2165         let mut deferred_call_resolutions = self.deferred_call_resolutions.borrow_mut();
2166         deferred_call_resolutions.entry(closure_def_id).or_default().push(r);
2167     }
2168
2169     fn remove_deferred_call_resolutions(
2170         &self,
2171         closure_def_id: DefId,
2172     ) -> Vec<DeferredCallResolution<'tcx>> {
2173         let mut deferred_call_resolutions = self.deferred_call_resolutions.borrow_mut();
2174         deferred_call_resolutions.remove(&closure_def_id).unwrap_or(vec![])
2175     }
2176
2177     pub fn tag(&self) -> String {
2178         format!("{:p}", self)
2179     }
2180
2181     pub fn local_ty(&self, span: Span, nid: hir::HirId) -> LocalTy<'tcx> {
2182         self.locals.borrow().get(&nid).cloned().unwrap_or_else(||
2183             span_bug!(span, "no type for local variable {}",
2184                       self.tcx.hir().hir_to_string(nid))
2185         )
2186     }
2187
2188     #[inline]
2189     pub fn write_ty(&self, id: hir::HirId, ty: Ty<'tcx>) {
2190         debug!("write_ty({:?}, {:?}) in fcx {}",
2191                id, self.resolve_vars_if_possible(&ty), self.tag());
2192         self.tables.borrow_mut().node_types_mut().insert(id, ty);
2193
2194         if ty.references_error() {
2195             self.has_errors.set(true);
2196             self.set_tainted_by_errors();
2197         }
2198     }
2199
2200     pub fn write_field_index(&self, hir_id: hir::HirId, index: usize) {
2201         self.tables.borrow_mut().field_indices_mut().insert(hir_id, index);
2202     }
2203
2204     fn write_resolution(&self, hir_id: hir::HirId, r: Result<(DefKind, DefId), ErrorReported>) {
2205         self.tables.borrow_mut().type_dependent_defs_mut().insert(hir_id, r);
2206     }
2207
2208     pub fn write_method_call(&self,
2209                              hir_id: hir::HirId,
2210                              method: MethodCallee<'tcx>) {
2211         debug!("write_method_call(hir_id={:?}, method={:?})", hir_id, method);
2212         self.write_resolution(hir_id, Ok((DefKind::Method, method.def_id)));
2213         self.write_substs(hir_id, method.substs);
2214
2215         // When the method is confirmed, the `method.substs` includes
2216         // parameters from not just the method, but also the impl of
2217         // the method -- in particular, the `Self` type will be fully
2218         // resolved. However, those are not something that the "user
2219         // specified" -- i.e., those types come from the inferred type
2220         // of the receiver, not something the user wrote. So when we
2221         // create the user-substs, we want to replace those earlier
2222         // types with just the types that the user actually wrote --
2223         // that is, those that appear on the *method itself*.
2224         //
2225         // As an example, if the user wrote something like
2226         // `foo.bar::<u32>(...)` -- the `Self` type here will be the
2227         // type of `foo` (possibly adjusted), but we don't want to
2228         // include that. We want just the `[_, u32]` part.
2229         if !method.substs.is_noop() {
2230             let method_generics = self.tcx.generics_of(method.def_id);
2231             if !method_generics.params.is_empty() {
2232                 let user_type_annotation = self.infcx.probe(|_| {
2233                     let user_substs = UserSubsts {
2234                         substs: InternalSubsts::for_item(self.tcx, method.def_id, |param, _| {
2235                             let i = param.index as usize;
2236                             if i < method_generics.parent_count {
2237                                 self.infcx.var_for_def(DUMMY_SP, param)
2238                             } else {
2239                                 method.substs[i]
2240                             }
2241                         }),
2242                         user_self_ty: None, // not relevant here
2243                     };
2244
2245                     self.infcx.canonicalize_user_type_annotation(&UserType::TypeOf(
2246                         method.def_id,
2247                         user_substs,
2248                     ))
2249                 });
2250
2251                 debug!("write_method_call: user_type_annotation={:?}", user_type_annotation);
2252                 self.write_user_type_annotation(hir_id, user_type_annotation);
2253             }
2254         }
2255     }
2256
2257     pub fn write_substs(&self, node_id: hir::HirId, substs: SubstsRef<'tcx>) {
2258         if !substs.is_noop() {
2259             debug!("write_substs({:?}, {:?}) in fcx {}",
2260                    node_id,
2261                    substs,
2262                    self.tag());
2263
2264             self.tables.borrow_mut().node_substs_mut().insert(node_id, substs);
2265         }
2266     }
2267
2268     /// Given the substs that we just converted from the HIR, try to
2269     /// canonicalize them and store them as user-given substitutions
2270     /// (i.e., substitutions that must be respected by the NLL check).
2271     ///
2272     /// This should be invoked **before any unifications have
2273     /// occurred**, so that annotations like `Vec<_>` are preserved
2274     /// properly.
2275     pub fn write_user_type_annotation_from_substs(
2276         &self,
2277         hir_id: hir::HirId,
2278         def_id: DefId,
2279         substs: SubstsRef<'tcx>,
2280         user_self_ty: Option<UserSelfTy<'tcx>>,
2281     ) {
2282         debug!(
2283             "write_user_type_annotation_from_substs: hir_id={:?} def_id={:?} substs={:?} \
2284              user_self_ty={:?} in fcx {}",
2285             hir_id, def_id, substs, user_self_ty, self.tag(),
2286         );
2287
2288         if Self::can_contain_user_lifetime_bounds((substs, user_self_ty)) {
2289             let canonicalized = self.infcx.canonicalize_user_type_annotation(
2290                 &UserType::TypeOf(def_id, UserSubsts {
2291                     substs,
2292                     user_self_ty,
2293                 })
2294             );
2295             debug!("write_user_type_annotation_from_substs: canonicalized={:?}", canonicalized);
2296             self.write_user_type_annotation(hir_id, canonicalized);
2297         }
2298     }
2299
2300     pub fn write_user_type_annotation(
2301         &self,
2302         hir_id: hir::HirId,
2303         canonical_user_type_annotation: CanonicalUserType<'tcx>,
2304     ) {
2305         debug!(
2306             "write_user_type_annotation: hir_id={:?} canonical_user_type_annotation={:?} tag={}",
2307             hir_id, canonical_user_type_annotation, self.tag(),
2308         );
2309
2310         if !canonical_user_type_annotation.is_identity() {
2311             self.tables.borrow_mut().user_provided_types_mut().insert(
2312                 hir_id, canonical_user_type_annotation
2313             );
2314         } else {
2315             debug!("write_user_type_annotation: skipping identity substs");
2316         }
2317     }
2318
2319     pub fn apply_adjustments(&self, expr: &hir::Expr, adj: Vec<Adjustment<'tcx>>) {
2320         debug!("apply_adjustments(expr={:?}, adj={:?})", expr, adj);
2321
2322         if adj.is_empty() {
2323             return;
2324         }
2325
2326         match self.tables.borrow_mut().adjustments_mut().entry(expr.hir_id) {
2327             Entry::Vacant(entry) => { entry.insert(adj); },
2328             Entry::Occupied(mut entry) => {
2329                 debug!(" - composing on top of {:?}", entry.get());
2330                 match (&entry.get()[..], &adj[..]) {
2331                     // Applying any adjustment on top of a NeverToAny
2332                     // is a valid NeverToAny adjustment, because it can't
2333                     // be reached.
2334                     (&[Adjustment { kind: Adjust::NeverToAny, .. }], _) => return,
2335                     (&[
2336                         Adjustment { kind: Adjust::Deref(_), .. },
2337                         Adjustment { kind: Adjust::Borrow(AutoBorrow::Ref(..)), .. },
2338                     ], &[
2339                         Adjustment { kind: Adjust::Deref(_), .. },
2340                         .. // Any following adjustments are allowed.
2341                     ]) => {
2342                         // A reborrow has no effect before a dereference.
2343                     }
2344                     // FIXME: currently we never try to compose autoderefs
2345                     // and ReifyFnPointer/UnsafeFnPointer, but we could.
2346                     _ =>
2347                         bug!("while adjusting {:?}, can't compose {:?} and {:?}",
2348                              expr, entry.get(), adj)
2349                 };
2350                 *entry.get_mut() = adj;
2351             }
2352         }
2353     }
2354
2355     /// Basically whenever we are converting from a type scheme into
2356     /// the fn body space, we always want to normalize associated
2357     /// types as well. This function combines the two.
2358     fn instantiate_type_scheme<T>(&self,
2359                                   span: Span,
2360                                   substs: SubstsRef<'tcx>,
2361                                   value: &T)
2362                                   -> T
2363         where T : TypeFoldable<'tcx>
2364     {
2365         let value = value.subst(self.tcx, substs);
2366         let result = self.normalize_associated_types_in(span, &value);
2367         debug!("instantiate_type_scheme(value={:?}, substs={:?}) = {:?}",
2368                value,
2369                substs,
2370                result);
2371         result
2372     }
2373
2374     /// As `instantiate_type_scheme`, but for the bounds found in a
2375     /// generic type scheme.
2376     fn instantiate_bounds(&self, span: Span, def_id: DefId, substs: SubstsRef<'tcx>)
2377                           -> ty::InstantiatedPredicates<'tcx> {
2378         let bounds = self.tcx.predicates_of(def_id);
2379         let result = bounds.instantiate(self.tcx, substs);
2380         let result = self.normalize_associated_types_in(span, &result);
2381         debug!("instantiate_bounds(bounds={:?}, substs={:?}) = {:?}",
2382                bounds,
2383                substs,
2384                result);
2385         result
2386     }
2387
2388     /// Replaces the opaque types from the given value with type variables,
2389     /// and records the `OpaqueTypeMap` for later use during writeback. See
2390     /// `InferCtxt::instantiate_opaque_types` for more details.
2391     fn instantiate_opaque_types_from_value<T: TypeFoldable<'tcx>>(
2392         &self,
2393         parent_id: hir::HirId,
2394         value: &T,
2395     ) -> T {
2396         let parent_def_id = self.tcx.hir().local_def_id_from_hir_id(parent_id);
2397         debug!("instantiate_opaque_types_from_value(parent_def_id={:?}, value={:?})",
2398                parent_def_id,
2399                value);
2400
2401         let (value, opaque_type_map) = self.register_infer_ok_obligations(
2402             self.instantiate_opaque_types(
2403                 parent_def_id,
2404                 self.body_id,
2405                 self.param_env,
2406                 value,
2407             )
2408         );
2409
2410         let mut opaque_types = self.opaque_types.borrow_mut();
2411         for (ty, decl) in opaque_type_map {
2412             let old_value = opaque_types.insert(ty, decl);
2413             assert!(old_value.is_none(), "instantiated twice: {:?}/{:?}", ty, decl);
2414         }
2415
2416         value
2417     }
2418
2419     fn normalize_associated_types_in<T>(&self, span: Span, value: &T) -> T
2420         where T : TypeFoldable<'tcx>
2421     {
2422         self.inh.normalize_associated_types_in(span, self.body_id, self.param_env, value)
2423     }
2424
2425     fn normalize_associated_types_in_as_infer_ok<T>(&self, span: Span, value: &T)
2426                                                     -> InferOk<'tcx, T>
2427         where T : TypeFoldable<'tcx>
2428     {
2429         self.inh.partially_normalize_associated_types_in(span,
2430                                                          self.body_id,
2431                                                          self.param_env,
2432                                                          value)
2433     }
2434
2435     pub fn require_type_meets(&self,
2436                               ty: Ty<'tcx>,
2437                               span: Span,
2438                               code: traits::ObligationCauseCode<'tcx>,
2439                               def_id: DefId)
2440     {
2441         self.register_bound(
2442             ty,
2443             def_id,
2444             traits::ObligationCause::new(span, self.body_id, code));
2445     }
2446
2447     pub fn require_type_is_sized(&self,
2448                                  ty: Ty<'tcx>,
2449                                  span: Span,
2450                                  code: traits::ObligationCauseCode<'tcx>)
2451     {
2452         let lang_item = self.tcx.require_lang_item(lang_items::SizedTraitLangItem);
2453         self.require_type_meets(ty, span, code, lang_item);
2454     }
2455
2456     pub fn require_type_is_sized_deferred(&self,
2457                                           ty: Ty<'tcx>,
2458                                           span: Span,
2459                                           code: traits::ObligationCauseCode<'tcx>)
2460     {
2461         self.deferred_sized_obligations.borrow_mut().push((ty, span, code));
2462     }
2463
2464     pub fn register_bound(&self,
2465                           ty: Ty<'tcx>,
2466                           def_id: DefId,
2467                           cause: traits::ObligationCause<'tcx>)
2468     {
2469         self.fulfillment_cx.borrow_mut()
2470                            .register_bound(self, self.param_env, ty, def_id, cause);
2471     }
2472
2473     pub fn to_ty(&self, ast_t: &hir::Ty) -> Ty<'tcx> {
2474         let t = AstConv::ast_ty_to_ty(self, ast_t);
2475         self.register_wf_obligation(t, ast_t.span, traits::MiscObligation);
2476         t
2477     }
2478
2479     pub fn to_ty_saving_user_provided_ty(&self, ast_ty: &hir::Ty) -> Ty<'tcx> {
2480         let ty = self.to_ty(ast_ty);
2481         debug!("to_ty_saving_user_provided_ty: ty={:?}", ty);
2482
2483         if Self::can_contain_user_lifetime_bounds(ty) {
2484             let c_ty = self.infcx.canonicalize_response(&UserType::Ty(ty));
2485             debug!("to_ty_saving_user_provided_ty: c_ty={:?}", c_ty);
2486             self.tables.borrow_mut().user_provided_types_mut().insert(ast_ty.hir_id, c_ty);
2487         }
2488
2489         ty
2490     }
2491
2492     /// Returns the `DefId` of the constant parameter that the provided expression is a path to.
2493     pub fn const_param_def_id(&self, hir_c: &hir::AnonConst) -> Option<DefId> {
2494         AstConv::const_param_def_id(self, &self.tcx.hir().body(hir_c.body).value)
2495     }
2496
2497     pub fn to_const(&self, ast_c: &hir::AnonConst, ty: Ty<'tcx>) -> &'tcx ty::Const<'tcx> {
2498         AstConv::ast_const_to_const(self, ast_c, ty)
2499     }
2500
2501     // If the type given by the user has free regions, save it for later, since
2502     // NLL would like to enforce those. Also pass in types that involve
2503     // projections, since those can resolve to `'static` bounds (modulo #54940,
2504     // which hopefully will be fixed by the time you see this comment, dear
2505     // reader, although I have my doubts). Also pass in types with inference
2506     // types, because they may be repeated. Other sorts of things are already
2507     // sufficiently enforced with erased regions. =)
2508     fn can_contain_user_lifetime_bounds<T>(t: T) -> bool
2509     where
2510         T: TypeFoldable<'tcx>
2511     {
2512         t.has_free_regions() || t.has_projections() || t.has_infer_types()
2513     }
2514
2515     pub fn node_ty(&self, id: hir::HirId) -> Ty<'tcx> {
2516         match self.tables.borrow().node_types().get(id) {
2517             Some(&t) => t,
2518             None if self.is_tainted_by_errors() => self.tcx.types.err,
2519             None => {
2520                 let node_id = self.tcx.hir().hir_to_node_id(id);
2521                 bug!("no type for node {}: {} in fcx {}",
2522                      node_id, self.tcx.hir().node_to_string(node_id),
2523                      self.tag());
2524             }
2525         }
2526     }
2527
2528     /// Registers an obligation for checking later, during regionck, that the type `ty` must
2529     /// outlive the region `r`.
2530     pub fn register_wf_obligation(&self,
2531                                   ty: Ty<'tcx>,
2532                                   span: Span,
2533                                   code: traits::ObligationCauseCode<'tcx>)
2534     {
2535         // WF obligations never themselves fail, so no real need to give a detailed cause:
2536         let cause = traits::ObligationCause::new(span, self.body_id, code);
2537         self.register_predicate(traits::Obligation::new(cause,
2538                                                         self.param_env,
2539                                                         ty::Predicate::WellFormed(ty)));
2540     }
2541
2542     /// Registers obligations that all types appearing in `substs` are well-formed.
2543     pub fn add_wf_bounds(&self, substs: SubstsRef<'tcx>, expr: &hir::Expr) {
2544         for ty in substs.types() {
2545             self.register_wf_obligation(ty, expr.span, traits::MiscObligation);
2546         }
2547     }
2548
2549     /// Given a fully substituted set of bounds (`generic_bounds`), and the values with which each
2550     /// type/region parameter was instantiated (`substs`), creates and registers suitable
2551     /// trait/region obligations.
2552     ///
2553     /// For example, if there is a function:
2554     ///
2555     /// ```
2556     /// fn foo<'a,T:'a>(...)
2557     /// ```
2558     ///
2559     /// and a reference:
2560     ///
2561     /// ```
2562     /// let f = foo;
2563     /// ```
2564     ///
2565     /// Then we will create a fresh region variable `'$0` and a fresh type variable `$1` for `'a`
2566     /// and `T`. This routine will add a region obligation `$1:'$0` and register it locally.
2567     pub fn add_obligations_for_parameters(&self,
2568                                           cause: traits::ObligationCause<'tcx>,
2569                                           predicates: &ty::InstantiatedPredicates<'tcx>)
2570     {
2571         assert!(!predicates.has_escaping_bound_vars());
2572
2573         debug!("add_obligations_for_parameters(predicates={:?})",
2574                predicates);
2575
2576         for obligation in traits::predicates_for_generics(cause, self.param_env, predicates) {
2577             self.register_predicate(obligation);
2578         }
2579     }
2580
2581     // FIXME(arielb1): use this instead of field.ty everywhere
2582     // Only for fields! Returns <none> for methods>
2583     // Indifferent to privacy flags
2584     pub fn field_ty(&self,
2585                     span: Span,
2586                     field: &'tcx ty::FieldDef,
2587                     substs: SubstsRef<'tcx>)
2588                     -> Ty<'tcx>
2589     {
2590         self.normalize_associated_types_in(span, &field.ty(self.tcx, substs))
2591     }
2592
2593     fn check_casts(&self) {
2594         let mut deferred_cast_checks = self.deferred_cast_checks.borrow_mut();
2595         for cast in deferred_cast_checks.drain(..) {
2596             cast.check(self);
2597         }
2598     }
2599
2600     fn resolve_generator_interiors(&self, def_id: DefId) {
2601         let mut generators = self.deferred_generator_interiors.borrow_mut();
2602         for (body_id, interior) in generators.drain(..) {
2603             self.select_obligations_where_possible(false);
2604             generator_interior::resolve_interior(self, def_id, body_id, interior);
2605         }
2606     }
2607
2608     // Tries to apply a fallback to `ty` if it is an unsolved variable.
2609     // Non-numerics get replaced with ! or () (depending on whether
2610     // feature(never_type) is enabled, unconstrained ints with i32,
2611     // unconstrained floats with f64.
2612     // Fallback becomes very dubious if we have encountered type-checking errors.
2613     // In that case, fallback to Error.
2614     // The return value indicates whether fallback has occurred.
2615     fn fallback_if_possible(&self, ty: Ty<'tcx>) -> bool {
2616         use rustc::ty::error::UnconstrainedNumeric::Neither;
2617         use rustc::ty::error::UnconstrainedNumeric::{UnconstrainedInt, UnconstrainedFloat};
2618
2619         assert!(ty.is_ty_infer());
2620         let fallback = match self.type_is_unconstrained_numeric(ty) {
2621             _ if self.is_tainted_by_errors() => self.tcx().types.err,
2622             UnconstrainedInt => self.tcx.types.i32,
2623             UnconstrainedFloat => self.tcx.types.f64,
2624             Neither if self.type_var_diverges(ty) => self.tcx.mk_diverging_default(),
2625             Neither => return false,
2626         };
2627         debug!("fallback_if_possible: defaulting `{:?}` to `{:?}`", ty, fallback);
2628         self.demand_eqtype(syntax_pos::DUMMY_SP, ty, fallback);
2629         true
2630     }
2631
2632     fn select_all_obligations_or_error(&self) {
2633         debug!("select_all_obligations_or_error");
2634         if let Err(errors) = self.fulfillment_cx.borrow_mut().select_all_or_error(&self) {
2635             self.report_fulfillment_errors(&errors, self.inh.body_id, false);
2636         }
2637     }
2638
2639     /// Select as many obligations as we can at present.
2640     fn select_obligations_where_possible(&self, fallback_has_occurred: bool) {
2641         if let Err(errors) = self.fulfillment_cx.borrow_mut().select_where_possible(self) {
2642             self.report_fulfillment_errors(&errors, self.inh.body_id, fallback_has_occurred);
2643         }
2644     }
2645
2646     /// For the overloaded place expressions (`*x`, `x[3]`), the trait
2647     /// returns a type of `&T`, but the actual type we assign to the
2648     /// *expression* is `T`. So this function just peels off the return
2649     /// type by one layer to yield `T`.
2650     fn make_overloaded_place_return_type(&self,
2651                                           method: MethodCallee<'tcx>)
2652                                           -> ty::TypeAndMut<'tcx>
2653     {
2654         // extract method return type, which will be &T;
2655         let ret_ty = method.sig.output();
2656
2657         // method returns &T, but the type as visible to user is T, so deref
2658         ret_ty.builtin_deref(true).unwrap()
2659     }
2660
2661     fn lookup_indexing(
2662         &self,
2663         expr: &hir::Expr,
2664         base_expr: &'tcx hir::Expr,
2665         base_ty: Ty<'tcx>,
2666         idx_ty: Ty<'tcx>,
2667         needs: Needs,
2668     ) -> Option<(/*index type*/ Ty<'tcx>, /*element type*/ Ty<'tcx>)> {
2669         // FIXME(#18741) -- this is almost but not quite the same as the
2670         // autoderef that normal method probing does. They could likely be
2671         // consolidated.
2672
2673         let mut autoderef = self.autoderef(base_expr.span, base_ty);
2674         let mut result = None;
2675         while result.is_none() && autoderef.next().is_some() {
2676             result = self.try_index_step(expr, base_expr, &autoderef, needs, idx_ty);
2677         }
2678         autoderef.finalize(self);
2679         result
2680     }
2681
2682     /// To type-check `base_expr[index_expr]`, we progressively autoderef
2683     /// (and otherwise adjust) `base_expr`, looking for a type which either
2684     /// supports builtin indexing or overloaded indexing.
2685     /// This loop implements one step in that search; the autoderef loop
2686     /// is implemented by `lookup_indexing`.
2687     fn try_index_step(
2688         &self,
2689         expr: &hir::Expr,
2690         base_expr: &hir::Expr,
2691         autoderef: &Autoderef<'a, 'tcx>,
2692         needs: Needs,
2693         index_ty: Ty<'tcx>,
2694     ) -> Option<(/*index type*/ Ty<'tcx>, /*element type*/ Ty<'tcx>)> {
2695         let adjusted_ty = autoderef.unambiguous_final_ty(self);
2696         debug!("try_index_step(expr={:?}, base_expr={:?}, adjusted_ty={:?}, \
2697                                index_ty={:?})",
2698                expr,
2699                base_expr,
2700                adjusted_ty,
2701                index_ty);
2702
2703         for &unsize in &[false, true] {
2704             let mut self_ty = adjusted_ty;
2705             if unsize {
2706                 // We only unsize arrays here.
2707                 if let ty::Array(element_ty, _) = adjusted_ty.sty {
2708                     self_ty = self.tcx.mk_slice(element_ty);
2709                 } else {
2710                     continue;
2711                 }
2712             }
2713
2714             // If some lookup succeeds, write callee into table and extract index/element
2715             // type from the method signature.
2716             // If some lookup succeeded, install method in table
2717             let input_ty = self.next_ty_var(TypeVariableOrigin {
2718                 kind: TypeVariableOriginKind::AutoDeref,
2719                 span: base_expr.span,
2720             });
2721             let method = self.try_overloaded_place_op(
2722                 expr.span, self_ty, &[input_ty], needs, PlaceOp::Index);
2723
2724             let result = method.map(|ok| {
2725                 debug!("try_index_step: success, using overloaded indexing");
2726                 let method = self.register_infer_ok_obligations(ok);
2727
2728                 let mut adjustments = autoderef.adjust_steps(self, needs);
2729                 if let ty::Ref(region, _, r_mutbl) = method.sig.inputs()[0].sty {
2730                     let mutbl = match r_mutbl {
2731                         hir::MutImmutable => AutoBorrowMutability::Immutable,
2732                         hir::MutMutable => AutoBorrowMutability::Mutable {
2733                             // Indexing can be desugared to a method call,
2734                             // so maybe we could use two-phase here.
2735                             // See the documentation of AllowTwoPhase for why that's
2736                             // not the case today.
2737                             allow_two_phase_borrow: AllowTwoPhase::No,
2738                         }
2739                     };
2740                     adjustments.push(Adjustment {
2741                         kind: Adjust::Borrow(AutoBorrow::Ref(region, mutbl)),
2742                         target: self.tcx.mk_ref(region, ty::TypeAndMut {
2743                             mutbl: r_mutbl,
2744                             ty: adjusted_ty
2745                         })
2746                     });
2747                 }
2748                 if unsize {
2749                     adjustments.push(Adjustment {
2750                         kind: Adjust::Pointer(PointerCast::Unsize),
2751                         target: method.sig.inputs()[0]
2752                     });
2753                 }
2754                 self.apply_adjustments(base_expr, adjustments);
2755
2756                 self.write_method_call(expr.hir_id, method);
2757                 (input_ty, self.make_overloaded_place_return_type(method).ty)
2758             });
2759             if result.is_some() {
2760                 return result;
2761             }
2762         }
2763
2764         None
2765     }
2766
2767     fn resolve_place_op(&self, op: PlaceOp, is_mut: bool) -> (Option<DefId>, ast::Ident) {
2768         let (tr, name) = match (op, is_mut) {
2769             (PlaceOp::Deref, false) => (self.tcx.lang_items().deref_trait(), sym::deref),
2770             (PlaceOp::Deref, true) => (self.tcx.lang_items().deref_mut_trait(), sym::deref_mut),
2771             (PlaceOp::Index, false) => (self.tcx.lang_items().index_trait(), sym::index),
2772             (PlaceOp::Index, true) => (self.tcx.lang_items().index_mut_trait(), sym::index_mut),
2773         };
2774         (tr, ast::Ident::with_empty_ctxt(name))
2775     }
2776
2777     fn try_overloaded_place_op(&self,
2778                                 span: Span,
2779                                 base_ty: Ty<'tcx>,
2780                                 arg_tys: &[Ty<'tcx>],
2781                                 needs: Needs,
2782                                 op: PlaceOp)
2783                                 -> Option<InferOk<'tcx, MethodCallee<'tcx>>>
2784     {
2785         debug!("try_overloaded_place_op({:?},{:?},{:?},{:?})",
2786                span,
2787                base_ty,
2788                needs,
2789                op);
2790
2791         // Try Mut first, if needed.
2792         let (mut_tr, mut_op) = self.resolve_place_op(op, true);
2793         let method = match (needs, mut_tr) {
2794             (Needs::MutPlace, Some(trait_did)) => {
2795                 self.lookup_method_in_trait(span, mut_op, trait_did, base_ty, Some(arg_tys))
2796             }
2797             _ => None,
2798         };
2799
2800         // Otherwise, fall back to the immutable version.
2801         let (imm_tr, imm_op) = self.resolve_place_op(op, false);
2802         let method = match (method, imm_tr) {
2803             (None, Some(trait_did)) => {
2804                 self.lookup_method_in_trait(span, imm_op, trait_did, base_ty, Some(arg_tys))
2805             }
2806             (method, _) => method,
2807         };
2808
2809         method
2810     }
2811
2812     fn check_method_argument_types(
2813         &self,
2814         sp: Span,
2815         expr_sp: Span,
2816         method: Result<MethodCallee<'tcx>, ()>,
2817         args_no_rcvr: &'tcx [hir::Expr],
2818         tuple_arguments: TupleArgumentsFlag,
2819         expected: Expectation<'tcx>,
2820     ) -> Ty<'tcx> {
2821         let has_error = match method {
2822             Ok(method) => {
2823                 method.substs.references_error() || method.sig.references_error()
2824             }
2825             Err(_) => true
2826         };
2827         if has_error {
2828             let err_inputs = self.err_args(args_no_rcvr.len());
2829
2830             let err_inputs = match tuple_arguments {
2831                 DontTupleArguments => err_inputs,
2832                 TupleArguments => vec![self.tcx.intern_tup(&err_inputs[..])],
2833             };
2834
2835             self.check_argument_types(sp, expr_sp, &err_inputs[..], &[], args_no_rcvr,
2836                                       false, tuple_arguments, None);
2837             return self.tcx.types.err;
2838         }
2839
2840         let method = method.unwrap();
2841         // HACK(eddyb) ignore self in the definition (see above).
2842         let expected_arg_tys = self.expected_inputs_for_expected_output(
2843             sp,
2844             expected,
2845             method.sig.output(),
2846             &method.sig.inputs()[1..]
2847         );
2848         self.check_argument_types(sp, expr_sp, &method.sig.inputs()[1..], &expected_arg_tys[..],
2849                                   args_no_rcvr, method.sig.c_variadic, tuple_arguments,
2850                                   self.tcx.hir().span_if_local(method.def_id));
2851         method.sig.output()
2852     }
2853
2854     fn self_type_matches_expected_vid(
2855         &self,
2856         trait_ref: ty::PolyTraitRef<'tcx>,
2857         expected_vid: ty::TyVid,
2858     ) -> bool {
2859         let self_ty = self.shallow_resolve(trait_ref.self_ty());
2860         debug!(
2861             "self_type_matches_expected_vid(trait_ref={:?}, self_ty={:?}, expected_vid={:?})",
2862             trait_ref, self_ty, expected_vid
2863         );
2864         match self_ty.sty {
2865             ty::Infer(ty::TyVar(found_vid)) => {
2866                 // FIXME: consider using `sub_root_var` here so we
2867                 // can see through subtyping.
2868                 let found_vid = self.root_var(found_vid);
2869                 debug!("self_type_matches_expected_vid - found_vid={:?}", found_vid);
2870                 expected_vid == found_vid
2871             }
2872             _ => false
2873         }
2874     }
2875
2876     fn obligations_for_self_ty<'b>(
2877         &'b self,
2878         self_ty: ty::TyVid,
2879     ) -> impl Iterator<Item = (ty::PolyTraitRef<'tcx>, traits::PredicateObligation<'tcx>)>
2880                  + Captures<'tcx>
2881                  + 'b {
2882         // FIXME: consider using `sub_root_var` here so we
2883         // can see through subtyping.
2884         let ty_var_root = self.root_var(self_ty);
2885         debug!("obligations_for_self_ty: self_ty={:?} ty_var_root={:?} pending_obligations={:?}",
2886                self_ty, ty_var_root,
2887                self.fulfillment_cx.borrow().pending_obligations());
2888
2889         self.fulfillment_cx
2890             .borrow()
2891             .pending_obligations()
2892             .into_iter()
2893             .filter_map(move |obligation| match obligation.predicate {
2894                 ty::Predicate::Projection(ref data) =>
2895                     Some((data.to_poly_trait_ref(self.tcx), obligation)),
2896                 ty::Predicate::Trait(ref data) =>
2897                     Some((data.to_poly_trait_ref(), obligation)),
2898                 ty::Predicate::Subtype(..) => None,
2899                 ty::Predicate::RegionOutlives(..) => None,
2900                 ty::Predicate::TypeOutlives(..) => None,
2901                 ty::Predicate::WellFormed(..) => None,
2902                 ty::Predicate::ObjectSafe(..) => None,
2903                 ty::Predicate::ConstEvaluatable(..) => None,
2904                 // N.B., this predicate is created by breaking down a
2905                 // `ClosureType: FnFoo()` predicate, where
2906                 // `ClosureType` represents some `Closure`. It can't
2907                 // possibly be referring to the current closure,
2908                 // because we haven't produced the `Closure` for
2909                 // this closure yet; this is exactly why the other
2910                 // code is looking for a self type of a unresolved
2911                 // inference variable.
2912                 ty::Predicate::ClosureKind(..) => None,
2913             }).filter(move |(tr, _)| self.self_type_matches_expected_vid(*tr, ty_var_root))
2914     }
2915
2916     fn type_var_is_sized(&self, self_ty: ty::TyVid) -> bool {
2917         self.obligations_for_self_ty(self_ty).any(|(tr, _)| {
2918             Some(tr.def_id()) == self.tcx.lang_items().sized_trait()
2919         })
2920     }
2921
2922     /// Generic function that factors out common logic from function calls,
2923     /// method calls and overloaded operators.
2924     fn check_argument_types(
2925         &self,
2926         sp: Span,
2927         expr_sp: Span,
2928         fn_inputs: &[Ty<'tcx>],
2929         expected_arg_tys: &[Ty<'tcx>],
2930         args: &'tcx [hir::Expr],
2931         c_variadic: bool,
2932         tuple_arguments: TupleArgumentsFlag,
2933         def_span: Option<Span>,
2934     ) {
2935         let tcx = self.tcx;
2936
2937         // Grab the argument types, supplying fresh type variables
2938         // if the wrong number of arguments were supplied
2939         let supplied_arg_count = if tuple_arguments == DontTupleArguments {
2940             args.len()
2941         } else {
2942             1
2943         };
2944
2945         // All the input types from the fn signature must outlive the call
2946         // so as to validate implied bounds.
2947         for &fn_input_ty in fn_inputs {
2948             self.register_wf_obligation(fn_input_ty, sp, traits::MiscObligation);
2949         }
2950
2951         let expected_arg_count = fn_inputs.len();
2952
2953         let param_count_error = |expected_count: usize,
2954                                  arg_count: usize,
2955                                  error_code: &str,
2956                                  c_variadic: bool,
2957                                  sugg_unit: bool| {
2958             let mut err = tcx.sess.struct_span_err_with_code(sp,
2959                 &format!("this function takes {}{} but {} {} supplied",
2960                     if c_variadic { "at least " } else { "" },
2961                     potentially_plural_count(expected_count, "parameter"),
2962                     potentially_plural_count(arg_count, "parameter"),
2963                     if arg_count == 1 {"was"} else {"were"}),
2964                 DiagnosticId::Error(error_code.to_owned()));
2965
2966             if let Some(def_s) = def_span.map(|sp| tcx.sess.source_map().def_span(sp)) {
2967                 err.span_label(def_s, "defined here");
2968             }
2969             if sugg_unit {
2970                 let sugg_span = tcx.sess.source_map().end_point(expr_sp);
2971                 // remove closing `)` from the span
2972                 let sugg_span = sugg_span.shrink_to_lo();
2973                 err.span_suggestion(
2974                     sugg_span,
2975                     "expected the unit value `()`; create it with empty parentheses",
2976                     String::from("()"),
2977                     Applicability::MachineApplicable);
2978             } else {
2979                 err.span_label(sp, format!("expected {}{}",
2980                                            if c_variadic { "at least " } else { "" },
2981                                            potentially_plural_count(expected_count, "parameter")));
2982             }
2983             err.emit();
2984         };
2985
2986         let mut expected_arg_tys = expected_arg_tys.to_vec();
2987
2988         let formal_tys = if tuple_arguments == TupleArguments {
2989             let tuple_type = self.structurally_resolved_type(sp, fn_inputs[0]);
2990             match tuple_type.sty {
2991                 ty::Tuple(arg_types) if arg_types.len() != args.len() => {
2992                     param_count_error(arg_types.len(), args.len(), "E0057", false, false);
2993                     expected_arg_tys = vec![];
2994                     self.err_args(args.len())
2995                 }
2996                 ty::Tuple(arg_types) => {
2997                     expected_arg_tys = match expected_arg_tys.get(0) {
2998                         Some(&ty) => match ty.sty {
2999                             ty::Tuple(ref tys) => tys.iter().map(|k| k.expect_ty()).collect(),
3000                             _ => vec![],
3001                         },
3002                         None => vec![],
3003                     };
3004                     arg_types.iter().map(|k| k.expect_ty()).collect()
3005                 }
3006                 _ => {
3007                     span_err!(tcx.sess, sp, E0059,
3008                         "cannot use call notation; the first type parameter \
3009                          for the function trait is neither a tuple nor unit");
3010                     expected_arg_tys = vec![];
3011                     self.err_args(args.len())
3012                 }
3013             }
3014         } else if expected_arg_count == supplied_arg_count {
3015             fn_inputs.to_vec()
3016         } else if c_variadic {
3017             if supplied_arg_count >= expected_arg_count {
3018                 fn_inputs.to_vec()
3019             } else {
3020                 param_count_error(expected_arg_count, supplied_arg_count, "E0060", true, false);
3021                 expected_arg_tys = vec![];
3022                 self.err_args(supplied_arg_count)
3023             }
3024         } else {
3025             // is the missing argument of type `()`?
3026             let sugg_unit = if expected_arg_tys.len() == 1 && supplied_arg_count == 0 {
3027                 self.resolve_vars_if_possible(&expected_arg_tys[0]).is_unit()
3028             } else if fn_inputs.len() == 1 && supplied_arg_count == 0 {
3029                 self.resolve_vars_if_possible(&fn_inputs[0]).is_unit()
3030             } else {
3031                 false
3032             };
3033             param_count_error(expected_arg_count, supplied_arg_count, "E0061", false, sugg_unit);
3034
3035             expected_arg_tys = vec![];
3036             self.err_args(supplied_arg_count)
3037         };
3038
3039         debug!("check_argument_types: formal_tys={:?}",
3040                formal_tys.iter().map(|t| self.ty_to_string(*t)).collect::<Vec<String>>());
3041
3042         // If there is no expectation, expect formal_tys.
3043         let expected_arg_tys = if !expected_arg_tys.is_empty() {
3044             expected_arg_tys
3045         } else {
3046             formal_tys.clone()
3047         };
3048
3049         // Check the arguments.
3050         // We do this in a pretty awful way: first we type-check any arguments
3051         // that are not closures, then we type-check the closures. This is so
3052         // that we have more information about the types of arguments when we
3053         // type-check the functions. This isn't really the right way to do this.
3054         for &check_closures in &[false, true] {
3055             debug!("check_closures={}", check_closures);
3056
3057             // More awful hacks: before we check argument types, try to do
3058             // an "opportunistic" vtable resolution of any trait bounds on
3059             // the call. This helps coercions.
3060             if check_closures {
3061                 self.select_obligations_where_possible(false);
3062             }
3063
3064             // For C-variadic functions, we don't have a declared type for all of
3065             // the arguments hence we only do our usual type checking with
3066             // the arguments who's types we do know.
3067             let t = if c_variadic {
3068                 expected_arg_count
3069             } else if tuple_arguments == TupleArguments {
3070                 args.len()
3071             } else {
3072                 supplied_arg_count
3073             };
3074             for (i, arg) in args.iter().take(t).enumerate() {
3075                 // Warn only for the first loop (the "no closures" one).
3076                 // Closure arguments themselves can't be diverging, but
3077                 // a previous argument can, e.g., `foo(panic!(), || {})`.
3078                 if !check_closures {
3079                     self.warn_if_unreachable(arg.hir_id, arg.span, "expression");
3080                 }
3081
3082                 let is_closure = match arg.node {
3083                     ExprKind::Closure(..) => true,
3084                     _ => false
3085                 };
3086
3087                 if is_closure != check_closures {
3088                     continue;
3089                 }
3090
3091                 debug!("checking the argument");
3092                 let formal_ty = formal_tys[i];
3093
3094                 // The special-cased logic below has three functions:
3095                 // 1. Provide as good of an expected type as possible.
3096                 let expected = Expectation::rvalue_hint(self, expected_arg_tys[i]);
3097
3098                 let checked_ty = self.check_expr_with_expectation(&arg, expected);
3099
3100                 // 2. Coerce to the most detailed type that could be coerced
3101                 //    to, which is `expected_ty` if `rvalue_hint` returns an
3102                 //    `ExpectHasType(expected_ty)`, or the `formal_ty` otherwise.
3103                 let coerce_ty = expected.only_has_type(self).unwrap_or(formal_ty);
3104                 // We're processing function arguments so we definitely want to use
3105                 // two-phase borrows.
3106                 self.demand_coerce(&arg, checked_ty, coerce_ty, AllowTwoPhase::Yes);
3107
3108                 // 3. Relate the expected type and the formal one,
3109                 //    if the expected type was used for the coercion.
3110                 self.demand_suptype(arg.span, formal_ty, coerce_ty);
3111             }
3112         }
3113
3114         // We also need to make sure we at least write the ty of the other
3115         // arguments which we skipped above.
3116         if c_variadic {
3117             fn variadic_error<'tcx>(s: &Session, span: Span, t: Ty<'tcx>, cast_ty: &str) {
3118                 use crate::structured_errors::{VariadicError, StructuredDiagnostic};
3119                 VariadicError::new(s, span, t, cast_ty).diagnostic().emit();
3120             }
3121
3122             for arg in args.iter().skip(expected_arg_count) {
3123                 let arg_ty = self.check_expr(&arg);
3124
3125                 // There are a few types which get autopromoted when passed via varargs
3126                 // in C but we just error out instead and require explicit casts.
3127                 let arg_ty = self.structurally_resolved_type(arg.span, arg_ty);
3128                 match arg_ty.sty {
3129                     ty::Float(ast::FloatTy::F32) => {
3130                         variadic_error(tcx.sess, arg.span, arg_ty, "c_double");
3131                     }
3132                     ty::Int(ast::IntTy::I8) | ty::Int(ast::IntTy::I16) | ty::Bool => {
3133                         variadic_error(tcx.sess, arg.span, arg_ty, "c_int");
3134                     }
3135                     ty::Uint(ast::UintTy::U8) | ty::Uint(ast::UintTy::U16) => {
3136                         variadic_error(tcx.sess, arg.span, arg_ty, "c_uint");
3137                     }
3138                     ty::FnDef(..) => {
3139                         let ptr_ty = self.tcx.mk_fn_ptr(arg_ty.fn_sig(self.tcx));
3140                         let ptr_ty = self.resolve_vars_if_possible(&ptr_ty);
3141                         variadic_error(tcx.sess, arg.span, arg_ty, &ptr_ty.to_string());
3142                     }
3143                     _ => {}
3144                 }
3145             }
3146         }
3147     }
3148
3149     fn err_args(&self, len: usize) -> Vec<Ty<'tcx>> {
3150         vec![self.tcx.types.err; len]
3151     }
3152
3153     // AST fragment checking
3154     fn check_lit(&self,
3155                  lit: &hir::Lit,
3156                  expected: Expectation<'tcx>)
3157                  -> Ty<'tcx>
3158     {
3159         let tcx = self.tcx;
3160
3161         match lit.node {
3162             ast::LitKind::Str(..) => tcx.mk_static_str(),
3163             ast::LitKind::ByteStr(ref v) => {
3164                 tcx.mk_imm_ref(tcx.lifetimes.re_static,
3165                                tcx.mk_array(tcx.types.u8, v.len() as u64))
3166             }
3167             ast::LitKind::Byte(_) => tcx.types.u8,
3168             ast::LitKind::Char(_) => tcx.types.char,
3169             ast::LitKind::Int(_, ast::LitIntType::Signed(t)) => tcx.mk_mach_int(t),
3170             ast::LitKind::Int(_, ast::LitIntType::Unsigned(t)) => tcx.mk_mach_uint(t),
3171             ast::LitKind::Int(_, ast::LitIntType::Unsuffixed) => {
3172                 let opt_ty = expected.to_option(self).and_then(|ty| {
3173                     match ty.sty {
3174                         ty::Int(_) | ty::Uint(_) => Some(ty),
3175                         ty::Char => Some(tcx.types.u8),
3176                         ty::RawPtr(..) => Some(tcx.types.usize),
3177                         ty::FnDef(..) | ty::FnPtr(_) => Some(tcx.types.usize),
3178                         _ => None
3179                     }
3180                 });
3181                 opt_ty.unwrap_or_else(|| self.next_int_var())
3182             }
3183             ast::LitKind::Float(_, t) => tcx.mk_mach_float(t),
3184             ast::LitKind::FloatUnsuffixed(_) => {
3185                 let opt_ty = expected.to_option(self).and_then(|ty| {
3186                     match ty.sty {
3187                         ty::Float(_) => Some(ty),
3188                         _ => None
3189                     }
3190                 });
3191                 opt_ty.unwrap_or_else(|| self.next_float_var())
3192             }
3193             ast::LitKind::Bool(_) => tcx.types.bool,
3194             ast::LitKind::Err(_) => tcx.types.err,
3195         }
3196     }
3197
3198     // Determine the `Self` type, using fresh variables for all variables
3199     // declared on the impl declaration e.g., `impl<A,B> for Vec<(A,B)>`
3200     // would return `($0, $1)` where `$0` and `$1` are freshly instantiated type
3201     // variables.
3202     pub fn impl_self_ty(&self,
3203                         span: Span, // (potential) receiver for this impl
3204                         did: DefId)
3205                         -> TypeAndSubsts<'tcx> {
3206         let ity = self.tcx.type_of(did);
3207         debug!("impl_self_ty: ity={:?}", ity);
3208
3209         let substs = self.fresh_substs_for_item(span, did);
3210         let substd_ty = self.instantiate_type_scheme(span, &substs, &ity);
3211
3212         TypeAndSubsts { substs: substs, ty: substd_ty }
3213     }
3214
3215     /// Unifies the output type with the expected type early, for more coercions
3216     /// and forward type information on the input expressions.
3217     fn expected_inputs_for_expected_output(&self,
3218                                            call_span: Span,
3219                                            expected_ret: Expectation<'tcx>,
3220                                            formal_ret: Ty<'tcx>,
3221                                            formal_args: &[Ty<'tcx>])
3222                                            -> Vec<Ty<'tcx>> {
3223         let formal_ret = self.resolve_type_vars_with_obligations(formal_ret);
3224         let ret_ty = match expected_ret.only_has_type(self) {
3225             Some(ret) => ret,
3226             None => return Vec::new()
3227         };
3228         let expect_args = self.fudge_inference_if_ok(|| {
3229             // Attempt to apply a subtyping relationship between the formal
3230             // return type (likely containing type variables if the function
3231             // is polymorphic) and the expected return type.
3232             // No argument expectations are produced if unification fails.
3233             let origin = self.misc(call_span);
3234             let ures = self.at(&origin, self.param_env).sup(ret_ty, &formal_ret);
3235
3236             // FIXME(#27336) can't use ? here, Try::from_error doesn't default
3237             // to identity so the resulting type is not constrained.
3238             match ures {
3239                 Ok(ok) => {
3240                     // Process any obligations locally as much as
3241                     // we can.  We don't care if some things turn
3242                     // out unconstrained or ambiguous, as we're
3243                     // just trying to get hints here.
3244                     self.save_and_restore_in_snapshot_flag(|_| {
3245                         let mut fulfill = TraitEngine::new(self.tcx);
3246                         for obligation in ok.obligations {
3247                             fulfill.register_predicate_obligation(self, obligation);
3248                         }
3249                         fulfill.select_where_possible(self)
3250                     }).map_err(|_| ())?;
3251                 }
3252                 Err(_) => return Err(()),
3253             }
3254
3255             // Record all the argument types, with the substitutions
3256             // produced from the above subtyping unification.
3257             Ok(formal_args.iter().map(|ty| {
3258                 self.resolve_vars_if_possible(ty)
3259             }).collect())
3260         }).unwrap_or_default();
3261         debug!("expected_inputs_for_expected_output(formal={:?} -> {:?}, expected={:?} -> {:?})",
3262                formal_args, formal_ret,
3263                expect_args, expected_ret);
3264         expect_args
3265     }
3266
3267     pub fn check_struct_path(&self,
3268                              qpath: &QPath,
3269                              hir_id: hir::HirId)
3270                              -> Option<(&'tcx ty::VariantDef,  Ty<'tcx>)> {
3271         let path_span = match *qpath {
3272             QPath::Resolved(_, ref path) => path.span,
3273             QPath::TypeRelative(ref qself, _) => qself.span
3274         };
3275         let (def, ty) = self.finish_resolving_struct_path(qpath, path_span, hir_id);
3276         let variant = match def {
3277             Res::Err => {
3278                 self.set_tainted_by_errors();
3279                 return None;
3280             }
3281             Res::Def(DefKind::Variant, _) => {
3282                 match ty.sty {
3283                     ty::Adt(adt, substs) => {
3284                         Some((adt.variant_of_res(def), adt.did, substs))
3285                     }
3286                     _ => bug!("unexpected type: {:?}", ty)
3287                 }
3288             }
3289             Res::Def(DefKind::Struct, _)
3290             | Res::Def(DefKind::Union, _)
3291             | Res::Def(DefKind::TyAlias, _)
3292             | Res::Def(DefKind::AssocTy, _)
3293             | Res::SelfTy(..) => {
3294                 match ty.sty {
3295                     ty::Adt(adt, substs) if !adt.is_enum() => {
3296                         Some((adt.non_enum_variant(), adt.did, substs))
3297                     }
3298                     _ => None,
3299                 }
3300             }
3301             _ => bug!("unexpected definition: {:?}", def)
3302         };
3303
3304         if let Some((variant, did, substs)) = variant {
3305             debug!("check_struct_path: did={:?} substs={:?}", did, substs);
3306             self.write_user_type_annotation_from_substs(hir_id, did, substs, None);
3307
3308             // Check bounds on type arguments used in the path.
3309             let bounds = self.instantiate_bounds(path_span, did, substs);
3310             let cause = traits::ObligationCause::new(path_span, self.body_id,
3311                                                      traits::ItemObligation(did));
3312             self.add_obligations_for_parameters(cause, &bounds);
3313
3314             Some((variant, ty))
3315         } else {
3316             struct_span_err!(self.tcx.sess, path_span, E0071,
3317                              "expected struct, variant or union type, found {}",
3318                              ty.sort_string(self.tcx))
3319                 .span_label(path_span, "not a struct")
3320                 .emit();
3321             None
3322         }
3323     }
3324
3325     // Finish resolving a path in a struct expression or pattern `S::A { .. }` if necessary.
3326     // The newly resolved definition is written into `type_dependent_defs`.
3327     fn finish_resolving_struct_path(&self,
3328                                     qpath: &QPath,
3329                                     path_span: Span,
3330                                     hir_id: hir::HirId)
3331                                     -> (Res, Ty<'tcx>)
3332     {
3333         match *qpath {
3334             QPath::Resolved(ref maybe_qself, ref path) => {
3335                 let self_ty = maybe_qself.as_ref().map(|qself| self.to_ty(qself));
3336                 let ty = AstConv::res_to_ty(self, self_ty, path, true);
3337                 (path.res, ty)
3338             }
3339             QPath::TypeRelative(ref qself, ref segment) => {
3340                 let ty = self.to_ty(qself);
3341
3342                 let res = if let hir::TyKind::Path(QPath::Resolved(_, ref path)) = qself.node {
3343                     path.res
3344                 } else {
3345                     Res::Err
3346                 };
3347                 let result = AstConv::associated_path_to_ty(
3348                     self,
3349                     hir_id,
3350                     path_span,
3351                     ty,
3352                     res,
3353                     segment,
3354                     true,
3355                 );
3356                 let ty = result.map(|(ty, _, _)| ty).unwrap_or(self.tcx().types.err);
3357                 let result = result.map(|(_, kind, def_id)| (kind, def_id));
3358
3359                 // Write back the new resolution.
3360                 self.write_resolution(hir_id, result);
3361
3362                 (result.map(|(kind, def_id)| Res::Def(kind, def_id)).unwrap_or(Res::Err), ty)
3363             }
3364         }
3365     }
3366
3367     /// Resolves an associated value path into a base type and associated constant, or method
3368     /// resolution. The newly resolved definition is written into `type_dependent_defs`.
3369     pub fn resolve_ty_and_res_ufcs<'b>(&self,
3370                                        qpath: &'b QPath,
3371                                        hir_id: hir::HirId,
3372                                        span: Span)
3373                                        -> (Res, Option<Ty<'tcx>>, &'b [hir::PathSegment])
3374     {
3375         debug!("resolve_ty_and_res_ufcs: qpath={:?} hir_id={:?} span={:?}", qpath, hir_id, span);
3376         let (ty, qself, item_segment) = match *qpath {
3377             QPath::Resolved(ref opt_qself, ref path) => {
3378                 return (path.res,
3379                         opt_qself.as_ref().map(|qself| self.to_ty(qself)),
3380                         &path.segments[..]);
3381             }
3382             QPath::TypeRelative(ref qself, ref segment) => {
3383                 (self.to_ty(qself), qself, segment)
3384             }
3385         };
3386         if let Some(&cached_result) = self.tables.borrow().type_dependent_defs().get(hir_id) {
3387             // Return directly on cache hit. This is useful to avoid doubly reporting
3388             // errors with default match binding modes. See #44614.
3389             let def = cached_result.map(|(kind, def_id)| Res::Def(kind, def_id))
3390                 .unwrap_or(Res::Err);
3391             return (def, Some(ty), slice::from_ref(&**item_segment));
3392         }
3393         let item_name = item_segment.ident;
3394         let result = self.resolve_ufcs(span, item_name, ty, hir_id).or_else(|error| {
3395             let result = match error {
3396                 method::MethodError::PrivateMatch(kind, def_id, _) => Ok((kind, def_id)),
3397                 _ => Err(ErrorReported),
3398             };
3399             if item_name.name != kw::Invalid {
3400                 self.report_method_error(
3401                     span,
3402                     ty,
3403                     item_name,
3404                     SelfSource::QPath(qself),
3405                     error,
3406                     None,
3407                 );
3408             }
3409             result
3410         });
3411
3412         // Write back the new resolution.
3413         self.write_resolution(hir_id, result);
3414         (
3415             result.map(|(kind, def_id)| Res::Def(kind, def_id)).unwrap_or(Res::Err),
3416             Some(ty),
3417             slice::from_ref(&**item_segment),
3418         )
3419     }
3420
3421     pub fn check_decl_initializer(
3422         &self,
3423         local: &'tcx hir::Local,
3424         init: &'tcx hir::Expr,
3425     ) -> Ty<'tcx> {
3426         // FIXME(tschottdorf): `contains_explicit_ref_binding()` must be removed
3427         // for #42640 (default match binding modes).
3428         //
3429         // See #44848.
3430         let ref_bindings = local.pat.contains_explicit_ref_binding();
3431
3432         let local_ty = self.local_ty(init.span, local.hir_id).revealed_ty;
3433         if let Some(m) = ref_bindings {
3434             // Somewhat subtle: if we have a `ref` binding in the pattern,
3435             // we want to avoid introducing coercions for the RHS. This is
3436             // both because it helps preserve sanity and, in the case of
3437             // ref mut, for soundness (issue #23116). In particular, in
3438             // the latter case, we need to be clear that the type of the
3439             // referent for the reference that results is *equal to* the
3440             // type of the place it is referencing, and not some
3441             // supertype thereof.
3442             let init_ty = self.check_expr_with_needs(init, Needs::maybe_mut_place(m));
3443             self.demand_eqtype(init.span, local_ty, init_ty);
3444             init_ty
3445         } else {
3446             self.check_expr_coercable_to_type(init, local_ty)
3447         }
3448     }
3449
3450     pub fn check_decl_local(&self, local: &'tcx hir::Local) {
3451         let t = self.local_ty(local.span, local.hir_id).decl_ty;
3452         self.write_ty(local.hir_id, t);
3453
3454         if let Some(ref init) = local.init {
3455             let init_ty = self.check_decl_initializer(local, &init);
3456             if init_ty.references_error() {
3457                 self.write_ty(local.hir_id, init_ty);
3458             }
3459         }
3460
3461         self.check_pat_walk(
3462             &local.pat,
3463             t,
3464             ty::BindingMode::BindByValue(hir::Mutability::MutImmutable),
3465             None,
3466         );
3467         let pat_ty = self.node_ty(local.pat.hir_id);
3468         if pat_ty.references_error() {
3469             self.write_ty(local.hir_id, pat_ty);
3470         }
3471     }
3472
3473     pub fn check_stmt(&self, stmt: &'tcx hir::Stmt) {
3474         // Don't do all the complex logic below for `DeclItem`.
3475         match stmt.node {
3476             hir::StmtKind::Item(..) => return,
3477             hir::StmtKind::Local(..) | hir::StmtKind::Expr(..) | hir::StmtKind::Semi(..) => {}
3478         }
3479
3480         self.warn_if_unreachable(stmt.hir_id, stmt.span, "statement");
3481
3482         // Hide the outer diverging and `has_errors` flags.
3483         let old_diverges = self.diverges.get();
3484         let old_has_errors = self.has_errors.get();
3485         self.diverges.set(Diverges::Maybe);
3486         self.has_errors.set(false);
3487
3488         match stmt.node {
3489             hir::StmtKind::Local(ref l) => {
3490                 self.check_decl_local(&l);
3491             }
3492             // Ignore for now.
3493             hir::StmtKind::Item(_) => {}
3494             hir::StmtKind::Expr(ref expr) => {
3495                 // Check with expected type of `()`.
3496                 self.check_expr_has_type_or_error(&expr, self.tcx.mk_unit());
3497             }
3498             hir::StmtKind::Semi(ref expr) => {
3499                 self.check_expr(&expr);
3500             }
3501         }
3502
3503         // Combine the diverging and `has_error` flags.
3504         self.diverges.set(self.diverges.get() | old_diverges);
3505         self.has_errors.set(self.has_errors.get() | old_has_errors);
3506     }
3507
3508     pub fn check_block_no_value(&self, blk: &'tcx hir::Block) {
3509         let unit = self.tcx.mk_unit();
3510         let ty = self.check_block_with_expected(blk, ExpectHasType(unit));
3511
3512         // if the block produces a `!` value, that can always be
3513         // (effectively) coerced to unit.
3514         if !ty.is_never() {
3515             self.demand_suptype(blk.span, unit, ty);
3516         }
3517     }
3518
3519     fn check_block_with_expected(
3520         &self,
3521         blk: &'tcx hir::Block,
3522         expected: Expectation<'tcx>,
3523     ) -> Ty<'tcx> {
3524         let prev = {
3525             let mut fcx_ps = self.ps.borrow_mut();
3526             let unsafety_state = fcx_ps.recurse(blk);
3527             replace(&mut *fcx_ps, unsafety_state)
3528         };
3529
3530         // In some cases, blocks have just one exit, but other blocks
3531         // can be targeted by multiple breaks. This can happen both
3532         // with labeled blocks as well as when we desugar
3533         // a `try { ... }` expression.
3534         //
3535         // Example 1:
3536         //
3537         //    'a: { if true { break 'a Err(()); } Ok(()) }
3538         //
3539         // Here we would wind up with two coercions, one from
3540         // `Err(())` and the other from the tail expression
3541         // `Ok(())`. If the tail expression is omitted, that's a
3542         // "forced unit" -- unless the block diverges, in which
3543         // case we can ignore the tail expression (e.g., `'a: {
3544         // break 'a 22; }` would not force the type of the block
3545         // to be `()`).
3546         let tail_expr = blk.expr.as_ref();
3547         let coerce_to_ty = expected.coercion_target_type(self, blk.span);
3548         let coerce = if blk.targeted_by_break {
3549             CoerceMany::new(coerce_to_ty)
3550         } else {
3551             let tail_expr: &[P<hir::Expr>] = match tail_expr {
3552                 Some(e) => slice::from_ref(e),
3553                 None => &[],
3554             };
3555             CoerceMany::with_coercion_sites(coerce_to_ty, tail_expr)
3556         };
3557
3558         let prev_diverges = self.diverges.get();
3559         let ctxt = BreakableCtxt {
3560             coerce: Some(coerce),
3561             may_break: false,
3562         };
3563
3564         let (ctxt, ()) = self.with_breakable_ctxt(blk.hir_id, ctxt, || {
3565             for s in &blk.stmts {
3566                 self.check_stmt(s);
3567             }
3568
3569             // check the tail expression **without** holding the
3570             // `enclosing_breakables` lock below.
3571             let tail_expr_ty = tail_expr.map(|t| self.check_expr_with_expectation(t, expected));
3572
3573             let mut enclosing_breakables = self.enclosing_breakables.borrow_mut();
3574             let ctxt = enclosing_breakables.find_breakable(blk.hir_id);
3575             let coerce = ctxt.coerce.as_mut().unwrap();
3576             if let Some(tail_expr_ty) = tail_expr_ty {
3577                 let tail_expr = tail_expr.unwrap();
3578                 let cause = self.cause(tail_expr.span,
3579                                        ObligationCauseCode::BlockTailExpression(blk.hir_id));
3580                 coerce.coerce(self,
3581                               &cause,
3582                               tail_expr,
3583                               tail_expr_ty);
3584             } else {
3585                 // Subtle: if there is no explicit tail expression,
3586                 // that is typically equivalent to a tail expression
3587                 // of `()` -- except if the block diverges. In that
3588                 // case, there is no value supplied from the tail
3589                 // expression (assuming there are no other breaks,
3590                 // this implies that the type of the block will be
3591                 // `!`).
3592                 //
3593                 // #41425 -- label the implicit `()` as being the
3594                 // "found type" here, rather than the "expected type".
3595                 if !self.diverges.get().always() {
3596                     // #50009 -- Do not point at the entire fn block span, point at the return type
3597                     // span, as it is the cause of the requirement, and
3598                     // `consider_hint_about_removing_semicolon` will point at the last expression
3599                     // if it were a relevant part of the error. This improves usability in editors
3600                     // that highlight errors inline.
3601                     let mut sp = blk.span;
3602                     let mut fn_span = None;
3603                     if let Some((decl, ident)) = self.get_parent_fn_decl(blk.hir_id) {
3604                         let ret_sp = decl.output.span();
3605                         if let Some(block_sp) = self.parent_item_span(blk.hir_id) {
3606                             // HACK: on some cases (`ui/liveness/liveness-issue-2163.rs`) the
3607                             // output would otherwise be incorrect and even misleading. Make sure
3608                             // the span we're aiming at correspond to a `fn` body.
3609                             if block_sp == blk.span {
3610                                 sp = ret_sp;
3611                                 fn_span = Some(ident.span);
3612                             }
3613                         }
3614                     }
3615                     coerce.coerce_forced_unit(self, &self.misc(sp), &mut |err| {
3616                         if let Some(expected_ty) = expected.only_has_type(self) {
3617                             self.consider_hint_about_removing_semicolon(blk, expected_ty, err);
3618                         }
3619                         if let Some(fn_span) = fn_span {
3620                             err.span_label(fn_span, "this function's body doesn't return");
3621                         }
3622                     }, false);
3623                 }
3624             }
3625         });
3626
3627         if ctxt.may_break {
3628             // If we can break from the block, then the block's exit is always reachable
3629             // (... as long as the entry is reachable) - regardless of the tail of the block.
3630             self.diverges.set(prev_diverges);
3631         }
3632
3633         let mut ty = ctxt.coerce.unwrap().complete(self);
3634
3635         if self.has_errors.get() || ty.references_error() {
3636             ty = self.tcx.types.err
3637         }
3638
3639         self.write_ty(blk.hir_id, ty);
3640
3641         *self.ps.borrow_mut() = prev;
3642         ty
3643     }
3644
3645     fn parent_item_span(&self, id: hir::HirId) -> Option<Span> {
3646         let node = self.tcx.hir().get_by_hir_id(self.tcx.hir().get_parent_item(id));
3647         match node {
3648             Node::Item(&hir::Item {
3649                 node: hir::ItemKind::Fn(_, _, _, body_id), ..
3650             }) |
3651             Node::ImplItem(&hir::ImplItem {
3652                 node: hir::ImplItemKind::Method(_, body_id), ..
3653             }) => {
3654                 let body = self.tcx.hir().body(body_id);
3655                 if let ExprKind::Block(block, _) = &body.value.node {
3656                     return Some(block.span);
3657                 }
3658             }
3659             _ => {}
3660         }
3661         None
3662     }
3663
3664     /// Given a function block's `HirId`, returns its `FnDecl` if it exists, or `None` otherwise.
3665     fn get_parent_fn_decl(&self, blk_id: hir::HirId) -> Option<(hir::FnDecl, ast::Ident)> {
3666         let parent = self.tcx.hir().get_by_hir_id(self.tcx.hir().get_parent_item(blk_id));
3667         self.get_node_fn_decl(parent).map(|(fn_decl, ident, _)| (fn_decl, ident))
3668     }
3669
3670     /// Given a function `Node`, return its `FnDecl` if it exists, or `None` otherwise.
3671     fn get_node_fn_decl(&self, node: Node<'_>) -> Option<(hir::FnDecl, ast::Ident, bool)> {
3672         match node {
3673             Node::Item(&hir::Item {
3674                 ident, node: hir::ItemKind::Fn(ref decl, ..), ..
3675             }) => decl.clone().and_then(|decl| {
3676                 // This is less than ideal, it will not suggest a return type span on any
3677                 // method called `main`, regardless of whether it is actually the entry point,
3678                 // but it will still present it as the reason for the expected type.
3679                 Some((decl, ident, ident.name != sym::main))
3680             }),
3681             Node::TraitItem(&hir::TraitItem {
3682                 ident, node: hir::TraitItemKind::Method(hir::MethodSig {
3683                     ref decl, ..
3684                 }, ..), ..
3685             }) => decl.clone().and_then(|decl| Some((decl, ident, true))),
3686             Node::ImplItem(&hir::ImplItem {
3687                 ident, node: hir::ImplItemKind::Method(hir::MethodSig {
3688                     ref decl, ..
3689                 }, ..), ..
3690             }) => decl.clone().and_then(|decl| Some((decl, ident, false))),
3691             _ => None,
3692         }
3693     }
3694
3695     /// Given a `HirId`, return the `FnDecl` of the method it is enclosed by and whether a
3696     /// suggestion can be made, `None` otherwise.
3697     pub fn get_fn_decl(&self, blk_id: hir::HirId) -> Option<(hir::FnDecl, bool)> {
3698         // Get enclosing Fn, if it is a function or a trait method, unless there's a `loop` or
3699         // `while` before reaching it, as block tail returns are not available in them.
3700         self.tcx.hir().get_return_block(blk_id).and_then(|blk_id| {
3701             let parent = self.tcx.hir().get_by_hir_id(blk_id);
3702             self.get_node_fn_decl(parent).map(|(fn_decl, _, is_main)| (fn_decl, is_main))
3703         })
3704     }
3705
3706     /// On implicit return expressions with mismatched types, provides the following suggestions:
3707     ///
3708     /// - Points out the method's return type as the reason for the expected type.
3709     /// - Possible missing semicolon.
3710     /// - Possible missing return type if the return type is the default, and not `fn main()`.
3711     pub fn suggest_mismatched_types_on_tail(
3712         &self,
3713         err: &mut DiagnosticBuilder<'tcx>,
3714         expression: &'tcx hir::Expr,
3715         expected: Ty<'tcx>,
3716         found: Ty<'tcx>,
3717         cause_span: Span,
3718         blk_id: hir::HirId,
3719     ) -> bool {
3720         self.suggest_missing_semicolon(err, expression, expected, cause_span);
3721         let mut pointing_at_return_type = false;
3722         if let Some((fn_decl, can_suggest)) = self.get_fn_decl(blk_id) {
3723             pointing_at_return_type = self.suggest_missing_return_type(
3724                 err, &fn_decl, expected, found, can_suggest);
3725         }
3726         self.suggest_ref_or_into(err, expression, expected, found);
3727         pointing_at_return_type
3728     }
3729
3730     pub fn suggest_ref_or_into(
3731         &self,
3732         err: &mut DiagnosticBuilder<'tcx>,
3733         expr: &hir::Expr,
3734         expected: Ty<'tcx>,
3735         found: Ty<'tcx>,
3736     ) {
3737         if let Some((sp, msg, suggestion)) = self.check_ref(expr, found, expected) {
3738             err.span_suggestion(
3739                 sp,
3740                 msg,
3741                 suggestion,
3742                 Applicability::MachineApplicable,
3743             );
3744         } else if !self.check_for_cast(err, expr, found, expected) {
3745             let is_struct_pat_shorthand_field = self.is_hir_id_from_struct_pattern_shorthand_field(
3746                 expr.hir_id,
3747                 expr.span,
3748             );
3749             let methods = self.get_conversion_methods(expr.span, expected, found);
3750             if let Ok(expr_text) = self.sess().source_map().span_to_snippet(expr.span) {
3751                 let mut suggestions = iter::repeat(&expr_text).zip(methods.iter())
3752                     .filter_map(|(receiver, method)| {
3753                         let method_call = format!(".{}()", method.ident);
3754                         if receiver.ends_with(&method_call) {
3755                             None  // do not suggest code that is already there (#53348)
3756                         } else {
3757                             let method_call_list = [".to_vec()", ".to_string()"];
3758                             let sugg = if receiver.ends_with(".clone()")
3759                                     && method_call_list.contains(&method_call.as_str()) {
3760                                 let max_len = receiver.rfind(".").unwrap();
3761                                 format!("{}{}", &receiver[..max_len], method_call)
3762                             } else {
3763                                 format!("{}{}", receiver, method_call)
3764                             };
3765                             Some(if is_struct_pat_shorthand_field {
3766                                 format!("{}: {}", receiver, sugg)
3767                             } else {
3768                                 sugg
3769                             })
3770                         }
3771                     }).peekable();
3772                 if suggestions.peek().is_some() {
3773                     err.span_suggestions(
3774                         expr.span,
3775                         "try using a conversion method",
3776                         suggestions,
3777                         Applicability::MaybeIncorrect,
3778                     );
3779                 }
3780             }
3781         }
3782     }
3783
3784     /// A common error is to forget to add a semicolon at the end of a block, e.g.,
3785     ///
3786     /// ```
3787     /// fn foo() {
3788     ///     bar_that_returns_u32()
3789     /// }
3790     /// ```
3791     ///
3792     /// This routine checks if the return expression in a block would make sense on its own as a
3793     /// statement and the return type has been left as default or has been specified as `()`. If so,
3794     /// it suggests adding a semicolon.
3795     fn suggest_missing_semicolon(
3796         &self,
3797         err: &mut DiagnosticBuilder<'tcx>,
3798         expression: &'tcx hir::Expr,
3799         expected: Ty<'tcx>,
3800         cause_span: Span,
3801     ) {
3802         if expected.is_unit() {
3803             // `BlockTailExpression` only relevant if the tail expr would be
3804             // useful on its own.
3805             match expression.node {
3806                 ExprKind::Call(..) |
3807                 ExprKind::MethodCall(..) |
3808                 ExprKind::While(..) |
3809                 ExprKind::Loop(..) |
3810                 ExprKind::Match(..) |
3811                 ExprKind::Block(..) => {
3812                     let sp = self.tcx.sess.source_map().next_point(cause_span);
3813                     err.span_suggestion(
3814                         sp,
3815                         "try adding a semicolon",
3816                         ";".to_string(),
3817                         Applicability::MachineApplicable);
3818                 }
3819                 _ => (),
3820             }
3821         }
3822     }
3823
3824     /// A possible error is to forget to add a return type that is needed:
3825     ///
3826     /// ```
3827     /// fn foo() {
3828     ///     bar_that_returns_u32()
3829     /// }
3830     /// ```
3831     ///
3832     /// This routine checks if the return type is left as default, the method is not part of an
3833     /// `impl` block and that it isn't the `main` method. If so, it suggests setting the return
3834     /// type.
3835     fn suggest_missing_return_type(
3836         &self,
3837         err: &mut DiagnosticBuilder<'tcx>,
3838         fn_decl: &hir::FnDecl,
3839         expected: Ty<'tcx>,
3840         found: Ty<'tcx>,
3841         can_suggest: bool,
3842     ) -> bool {
3843         // Only suggest changing the return type for methods that
3844         // haven't set a return type at all (and aren't `fn main()` or an impl).
3845         match (&fn_decl.output, found.is_suggestable(), can_suggest, expected.is_unit()) {
3846             (&hir::FunctionRetTy::DefaultReturn(span), true, true, true) => {
3847                 err.span_suggestion(
3848                     span,
3849                     "try adding a return type",
3850                     format!("-> {} ", self.resolve_type_vars_with_obligations(found)),
3851                     Applicability::MachineApplicable);
3852                 true
3853             }
3854             (&hir::FunctionRetTy::DefaultReturn(span), false, true, true) => {
3855                 err.span_label(span, "possibly return type missing here?");
3856                 true
3857             }
3858             (&hir::FunctionRetTy::DefaultReturn(span), _, false, true) => {
3859                 // `fn main()` must return `()`, do not suggest changing return type
3860                 err.span_label(span, "expected `()` because of default return type");
3861                 true
3862             }
3863             // expectation was caused by something else, not the default return
3864             (&hir::FunctionRetTy::DefaultReturn(_), _, _, false) => false,
3865             (&hir::FunctionRetTy::Return(ref ty), _, _, _) => {
3866                 // Only point to return type if the expected type is the return type, as if they
3867                 // are not, the expectation must have been caused by something else.
3868                 debug!("suggest_missing_return_type: return type {:?} node {:?}", ty, ty.node);
3869                 let sp = ty.span;
3870                 let ty = AstConv::ast_ty_to_ty(self, ty);
3871                 debug!("suggest_missing_return_type: return type {:?}", ty);
3872                 debug!("suggest_missing_return_type: expected type {:?}", ty);
3873                 if ty.sty == expected.sty {
3874                     err.span_label(sp, format!("expected `{}` because of return type",
3875                                                expected));
3876                     return true;
3877                 }
3878                 false
3879             }
3880         }
3881     }
3882
3883     /// A common error is to add an extra semicolon:
3884     ///
3885     /// ```
3886     /// fn foo() -> usize {
3887     ///     22;
3888     /// }
3889     /// ```
3890     ///
3891     /// This routine checks if the final statement in a block is an
3892     /// expression with an explicit semicolon whose type is compatible
3893     /// with `expected_ty`. If so, it suggests removing the semicolon.
3894     fn consider_hint_about_removing_semicolon(
3895         &self,
3896         blk: &'tcx hir::Block,
3897         expected_ty: Ty<'tcx>,
3898         err: &mut DiagnosticBuilder<'_>,
3899     ) {
3900         if let Some(span_semi) = self.could_remove_semicolon(blk, expected_ty) {
3901             err.span_suggestion(
3902                 span_semi,
3903                 "consider removing this semicolon",
3904                 String::new(),
3905                 Applicability::MachineApplicable,
3906             );
3907         }
3908     }
3909
3910     fn could_remove_semicolon(&self, blk: &'tcx hir::Block, expected_ty: Ty<'tcx>) -> Option<Span> {
3911         // Be helpful when the user wrote `{... expr;}` and
3912         // taking the `;` off is enough to fix the error.
3913         let last_stmt = blk.stmts.last()?;
3914         let last_expr = match last_stmt.node {
3915             hir::StmtKind::Semi(ref e) => e,
3916             _ => return None,
3917         };
3918         let last_expr_ty = self.node_ty(last_expr.hir_id);
3919         if self.can_sub(self.param_env, last_expr_ty, expected_ty).is_err() {
3920             return None;
3921         }
3922         let original_span = original_sp(last_stmt.span, blk.span);
3923         Some(original_span.with_lo(original_span.hi() - BytePos(1)))
3924     }
3925
3926     // Rewrite `SelfCtor` to `Ctor`
3927     pub fn rewrite_self_ctor(
3928         &self,
3929         res: Res,
3930         span: Span,
3931     ) -> Result<Res, ErrorReported> {
3932         let tcx = self.tcx;
3933         if let Res::SelfCtor(impl_def_id) = res {
3934             let ty = self.impl_self_ty(span, impl_def_id).ty;
3935             let adt_def = ty.ty_adt_def();
3936
3937             match adt_def {
3938                 Some(adt_def) if adt_def.has_ctor() => {
3939                     let variant = adt_def.non_enum_variant();
3940                     let ctor_def_id = variant.ctor_def_id.unwrap();
3941                     Ok(Res::Def(DefKind::Ctor(CtorOf::Struct, variant.ctor_kind), ctor_def_id))
3942                 }
3943                 _ => {
3944                     let mut err = tcx.sess.struct_span_err(span,
3945                         "the `Self` constructor can only be used with tuple or unit structs");
3946                     if let Some(adt_def) = adt_def {
3947                         match adt_def.adt_kind() {
3948                             AdtKind::Enum => {
3949                                 err.help("did you mean to use one of the enum's variants?");
3950                             },
3951                             AdtKind::Struct |
3952                             AdtKind::Union => {
3953                                 err.span_suggestion(
3954                                     span,
3955                                     "use curly brackets",
3956                                     String::from("Self { /* fields */ }"),
3957                                     Applicability::HasPlaceholders,
3958                                 );
3959                             }
3960                         }
3961                     }
3962                     err.emit();
3963
3964                     Err(ErrorReported)
3965                 }
3966             }
3967         } else {
3968             Ok(res)
3969         }
3970     }
3971
3972     // Instantiates the given path, which must refer to an item with the given
3973     // number of type parameters and type.
3974     pub fn instantiate_value_path(&self,
3975                                   segments: &[hir::PathSegment],
3976                                   self_ty: Option<Ty<'tcx>>,
3977                                   res: Res,
3978                                   span: Span,
3979                                   hir_id: hir::HirId)
3980                                   -> (Ty<'tcx>, Res) {
3981         debug!(
3982             "instantiate_value_path(segments={:?}, self_ty={:?}, res={:?}, hir_id={})",
3983             segments,
3984             self_ty,
3985             res,
3986             hir_id,
3987         );
3988
3989         let tcx = self.tcx;
3990
3991         let res = match self.rewrite_self_ctor(res, span) {
3992             Ok(res) => res,
3993             Err(ErrorReported) => return (tcx.types.err, res),
3994         };
3995         let path_segs = match res {
3996             Res::Local(_) => vec![],
3997             Res::Def(kind, def_id) =>
3998                 AstConv::def_ids_for_value_path_segments(self, segments, self_ty, kind, def_id),
3999             _ => bug!("instantiate_value_path on {:?}", res),
4000         };
4001
4002         let mut user_self_ty = None;
4003         let mut is_alias_variant_ctor = false;
4004         match res {
4005             Res::Def(DefKind::Ctor(CtorOf::Variant, _), _) => {
4006                 if let Some(self_ty) = self_ty {
4007                     let adt_def = self_ty.ty_adt_def().unwrap();
4008                     user_self_ty = Some(UserSelfTy {
4009                         impl_def_id: adt_def.did,
4010                         self_ty,
4011                     });
4012                     is_alias_variant_ctor = true;
4013                 }
4014             }
4015             Res::Def(DefKind::Method, def_id)
4016             | Res::Def(DefKind::AssocConst, def_id) => {
4017                 let container = tcx.associated_item(def_id).container;
4018                 debug!("instantiate_value_path: def_id={:?} container={:?}", def_id, container);
4019                 match container {
4020                     ty::TraitContainer(trait_did) => {
4021                         callee::check_legal_trait_for_method_call(tcx, span, trait_did)
4022                     }
4023                     ty::ImplContainer(impl_def_id) => {
4024                         if segments.len() == 1 {
4025                             // `<T>::assoc` will end up here, and so
4026                             // can `T::assoc`. It this came from an
4027                             // inherent impl, we need to record the
4028                             // `T` for posterity (see `UserSelfTy` for
4029                             // details).
4030                             let self_ty = self_ty.expect("UFCS sugared assoc missing Self");
4031                             user_self_ty = Some(UserSelfTy {
4032                                 impl_def_id,
4033                                 self_ty,
4034                             });
4035                         }
4036                     }
4037                 }
4038             }
4039             _ => {}
4040         }
4041
4042         // Now that we have categorized what space the parameters for each
4043         // segment belong to, let's sort out the parameters that the user
4044         // provided (if any) into their appropriate spaces. We'll also report
4045         // errors if type parameters are provided in an inappropriate place.
4046
4047         let generic_segs: FxHashSet<_> = path_segs.iter().map(|PathSeg(_, index)| index).collect();
4048         let generics_has_err = AstConv::prohibit_generics(
4049                 self, segments.iter().enumerate().filter_map(|(index, seg)| {
4050             if !generic_segs.contains(&index) || is_alias_variant_ctor {
4051                 Some(seg)
4052             } else {
4053                 None
4054             }
4055         }));
4056
4057         if let Res::Local(hid) = res {
4058             let ty = self.local_ty(span, hid).decl_ty;
4059             let ty = self.normalize_associated_types_in(span, &ty);
4060             self.write_ty(hir_id, ty);
4061             return (ty, res);
4062         }
4063
4064         if generics_has_err {
4065             // Don't try to infer type parameters when prohibited generic arguments were given.
4066             user_self_ty = None;
4067         }
4068
4069         // Now we have to compare the types that the user *actually*
4070         // provided against the types that were *expected*. If the user
4071         // did not provide any types, then we want to substitute inference
4072         // variables. If the user provided some types, we may still need
4073         // to add defaults. If the user provided *too many* types, that's
4074         // a problem.
4075
4076         let mut infer_args_for_err = FxHashSet::default();
4077         for &PathSeg(def_id, index) in &path_segs {
4078             let seg = &segments[index];
4079             let generics = tcx.generics_of(def_id);
4080             // Argument-position `impl Trait` is treated as a normal generic
4081             // parameter internally, but we don't allow users to specify the
4082             // parameter's value explicitly, so we have to do some error-
4083             // checking here.
4084             let suppress_errors = AstConv::check_generic_arg_count_for_call(
4085                 tcx,
4086                 span,
4087                 &generics,
4088                 &seg,
4089                 false, // `is_method_call`
4090             );
4091             if suppress_errors {
4092                 infer_args_for_err.insert(index);
4093                 self.set_tainted_by_errors(); // See issue #53251.
4094             }
4095         }
4096
4097         let has_self = path_segs.last().map(|PathSeg(def_id, _)| {
4098             tcx.generics_of(*def_id).has_self
4099         }).unwrap_or(false);
4100
4101         let def_id = res.def_id();
4102
4103         // The things we are substituting into the type should not contain
4104         // escaping late-bound regions, and nor should the base type scheme.
4105         let ty = tcx.type_of(def_id);
4106
4107         let substs = AstConv::create_substs_for_generic_args(
4108             tcx,
4109             def_id,
4110             &[][..],
4111             has_self,
4112             self_ty,
4113             // Provide the generic args, and whether types should be inferred.
4114             |def_id| {
4115                 if let Some(&PathSeg(_, index)) = path_segs.iter().find(|&PathSeg(did, _)| {
4116                     *did == def_id
4117                 }) {
4118                     // If we've encountered an `impl Trait`-related error, we're just
4119                     // going to infer the arguments for better error messages.
4120                     if !infer_args_for_err.contains(&index) {
4121                         // Check whether the user has provided generic arguments.
4122                         if let Some(ref data) = segments[index].args {
4123                             return (Some(data), segments[index].infer_args);
4124                         }
4125                     }
4126                     return (None, segments[index].infer_args);
4127                 }
4128
4129                 (None, true)
4130             },
4131             // Provide substitutions for parameters for which (valid) arguments have been provided.
4132             |param, arg| {
4133                 match (&param.kind, arg) {
4134                     (GenericParamDefKind::Lifetime, GenericArg::Lifetime(lt)) => {
4135                         AstConv::ast_region_to_region(self, lt, Some(param)).into()
4136                     }
4137                     (GenericParamDefKind::Type { .. }, GenericArg::Type(ty)) => {
4138                         self.to_ty(ty).into()
4139                     }
4140                     (GenericParamDefKind::Const, GenericArg::Const(ct)) => {
4141                         self.to_const(&ct.value, self.tcx.type_of(param.def_id)).into()
4142                     }
4143                     _ => unreachable!(),
4144                 }
4145             },
4146             // Provide substitutions for parameters for which arguments are inferred.
4147             |substs, param, infer_args| {
4148                 match param.kind {
4149                     GenericParamDefKind::Lifetime => {
4150                         self.re_infer(Some(param), span).unwrap().into()
4151                     }
4152                     GenericParamDefKind::Type { has_default, .. } => {
4153                         if !infer_args && has_default {
4154                             // If we have a default, then we it doesn't matter that we're not
4155                             // inferring the type arguments: we provide the default where any
4156                             // is missing.
4157                             let default = tcx.type_of(param.def_id);
4158                             self.normalize_ty(
4159                                 span,
4160                                 default.subst_spanned(tcx, substs.unwrap(), Some(span))
4161                             ).into()
4162                         } else {
4163                             // If no type arguments were provided, we have to infer them.
4164                             // This case also occurs as a result of some malformed input, e.g.
4165                             // a lifetime argument being given instead of a type parameter.
4166                             // Using inference instead of `Error` gives better error messages.
4167                             self.var_for_def(span, param)
4168                         }
4169                     }
4170                     GenericParamDefKind::Const => {
4171                         // FIXME(const_generics:defaults)
4172                         // No const parameters were provided, we have to infer them.
4173                         self.var_for_def(span, param)
4174                     }
4175                 }
4176             },
4177         );
4178         assert!(!substs.has_escaping_bound_vars());
4179         assert!(!ty.has_escaping_bound_vars());
4180
4181         // First, store the "user substs" for later.
4182         self.write_user_type_annotation_from_substs(hir_id, def_id, substs, user_self_ty);
4183
4184         // Add all the obligations that are required, substituting and
4185         // normalized appropriately.
4186         let bounds = self.instantiate_bounds(span, def_id, &substs);
4187         self.add_obligations_for_parameters(
4188             traits::ObligationCause::new(span, self.body_id, traits::ItemObligation(def_id)),
4189             &bounds);
4190
4191         // Substitute the values for the type parameters into the type of
4192         // the referenced item.
4193         let ty_substituted = self.instantiate_type_scheme(span, &substs, &ty);
4194
4195         if let Some(UserSelfTy { impl_def_id, self_ty }) = user_self_ty {
4196             // In the case of `Foo<T>::method` and `<Foo<T>>::method`, if `method`
4197             // is inherent, there is no `Self` parameter; instead, the impl needs
4198             // type parameters, which we can infer by unifying the provided `Self`
4199             // with the substituted impl type.
4200             // This also occurs for an enum variant on a type alias.
4201             let ty = tcx.type_of(impl_def_id);
4202
4203             let impl_ty = self.instantiate_type_scheme(span, &substs, &ty);
4204             match self.at(&self.misc(span), self.param_env).sup(impl_ty, self_ty) {
4205                 Ok(ok) => self.register_infer_ok_obligations(ok),
4206                 Err(_) => {
4207                     self.tcx.sess.delay_span_bug(span, &format!(
4208                         "instantiate_value_path: (UFCS) {:?} was a subtype of {:?} but now is not?",
4209                         self_ty,
4210                         impl_ty,
4211                     ));
4212                 }
4213             }
4214         }
4215
4216         self.check_rustc_args_require_const(def_id, hir_id, span);
4217
4218         debug!("instantiate_value_path: type of {:?} is {:?}",
4219                hir_id,
4220                ty_substituted);
4221         self.write_substs(hir_id, substs);
4222
4223         (ty_substituted, res)
4224     }
4225
4226     fn check_rustc_args_require_const(&self,
4227                                       def_id: DefId,
4228                                       hir_id: hir::HirId,
4229                                       span: Span) {
4230         // We're only interested in functions tagged with
4231         // #[rustc_args_required_const], so ignore anything that's not.
4232         if !self.tcx.has_attr(def_id, sym::rustc_args_required_const) {
4233             return
4234         }
4235
4236         // If our calling expression is indeed the function itself, we're good!
4237         // If not, generate an error that this can only be called directly.
4238         if let Node::Expr(expr) = self.tcx.hir().get_by_hir_id(
4239             self.tcx.hir().get_parent_node_by_hir_id(hir_id))
4240         {
4241             if let ExprKind::Call(ref callee, ..) = expr.node {
4242                 if callee.hir_id == hir_id {
4243                     return
4244                 }
4245             }
4246         }
4247
4248         self.tcx.sess.span_err(span, "this function can only be invoked \
4249                                       directly, not through a function pointer");
4250     }
4251
4252     // Resolves `typ` by a single level if `typ` is a type variable.
4253     // If no resolution is possible, then an error is reported.
4254     // Numeric inference variables may be left unresolved.
4255     pub fn structurally_resolved_type(&self, sp: Span, ty: Ty<'tcx>) -> Ty<'tcx> {
4256         let ty = self.resolve_type_vars_with_obligations(ty);
4257         if !ty.is_ty_var() {
4258             ty
4259         } else {
4260             if !self.is_tainted_by_errors() {
4261                 self.need_type_info_err((**self).body_id, sp, ty)
4262                     .note("type must be known at this point")
4263                     .emit();
4264             }
4265             self.demand_suptype(sp, self.tcx.types.err, ty);
4266             self.tcx.types.err
4267         }
4268     }
4269
4270     fn with_breakable_ctxt<F: FnOnce() -> R, R>(
4271         &self,
4272         id: hir::HirId,
4273         ctxt: BreakableCtxt<'tcx>,
4274         f: F,
4275     ) -> (BreakableCtxt<'tcx>, R) {
4276         let index;
4277         {
4278             let mut enclosing_breakables = self.enclosing_breakables.borrow_mut();
4279             index = enclosing_breakables.stack.len();
4280             enclosing_breakables.by_id.insert(id, index);
4281             enclosing_breakables.stack.push(ctxt);
4282         }
4283         let result = f();
4284         let ctxt = {
4285             let mut enclosing_breakables = self.enclosing_breakables.borrow_mut();
4286             debug_assert!(enclosing_breakables.stack.len() == index + 1);
4287             enclosing_breakables.by_id.remove(&id).expect("missing breakable context");
4288             enclosing_breakables.stack.pop().expect("missing breakable context")
4289         };
4290         (ctxt, result)
4291     }
4292
4293     /// Instantiate a QueryResponse in a probe context, without a
4294     /// good ObligationCause.
4295     fn probe_instantiate_query_response(
4296         &self,
4297         span: Span,
4298         original_values: &OriginalQueryValues<'tcx>,
4299         query_result: &Canonical<'tcx, QueryResponse<'tcx, Ty<'tcx>>>,
4300     ) -> InferResult<'tcx, Ty<'tcx>>
4301     {
4302         self.instantiate_query_response_and_region_obligations(
4303             &traits::ObligationCause::misc(span, self.body_id),
4304             self.param_env,
4305             original_values,
4306             query_result)
4307     }
4308
4309     /// Returns `true` if an expression is contained inside the LHS of an assignment expression.
4310     fn expr_in_place(&self, mut expr_id: hir::HirId) -> bool {
4311         let mut contained_in_place = false;
4312
4313         while let hir::Node::Expr(parent_expr) =
4314             self.tcx.hir().get_by_hir_id(self.tcx.hir().get_parent_node_by_hir_id(expr_id))
4315         {
4316             match &parent_expr.node {
4317                 hir::ExprKind::Assign(lhs, ..) | hir::ExprKind::AssignOp(_, lhs, ..) => {
4318                     if lhs.hir_id == expr_id {
4319                         contained_in_place = true;
4320                         break;
4321                     }
4322                 }
4323                 _ => (),
4324             }
4325             expr_id = parent_expr.hir_id;
4326         }
4327
4328         contained_in_place
4329     }
4330 }
4331
4332 pub fn check_bounds_are_used<'tcx>(tcx: TyCtxt<'tcx>, generics: &ty::Generics, ty: Ty<'tcx>) {
4333     let own_counts = generics.own_counts();
4334     debug!(
4335         "check_bounds_are_used(n_tys={}, n_cts={}, ty={:?})",
4336         own_counts.types,
4337         own_counts.consts,
4338         ty
4339     );
4340
4341     if own_counts.types == 0 {
4342         return;
4343     }
4344
4345     // Make a vector of booleans initially false, set to true when used.
4346     let mut types_used = vec![false; own_counts.types];
4347
4348     for leaf_ty in ty.walk() {
4349         if let ty::Param(ty::ParamTy { index, .. }) = leaf_ty.sty {
4350             debug!("Found use of ty param num {}", index);
4351             types_used[index as usize - own_counts.lifetimes] = true;
4352         } else if let ty::Error = leaf_ty.sty {
4353             // If there is already another error, do not emit
4354             // an error for not using a type Parameter.
4355             assert!(tcx.sess.err_count() > 0);
4356             return;
4357         }
4358     }
4359
4360     let types = generics.params.iter().filter(|param| match param.kind {
4361         ty::GenericParamDefKind::Type { .. } => true,
4362         _ => false,
4363     });
4364     for (&used, param) in types_used.iter().zip(types) {
4365         if !used {
4366             let id = tcx.hir().as_local_hir_id(param.def_id).unwrap();
4367             let span = tcx.hir().span_by_hir_id(id);
4368             struct_span_err!(tcx.sess, span, E0091, "type parameter `{}` is unused", param.name)
4369                 .span_label(span, "unused type parameter")
4370                 .emit();
4371         }
4372     }
4373 }
4374
4375 fn fatally_break_rust(sess: &Session) {
4376     let handler = sess.diagnostic();
4377     handler.span_bug_no_panic(
4378         MultiSpan::new(),
4379         "It looks like you're trying to break rust; would you like some ICE?",
4380     );
4381     handler.note_without_error("the compiler expectedly panicked. this is a feature.");
4382     handler.note_without_error(
4383         "we would appreciate a joke overview: \
4384         https://github.com/rust-lang/rust/issues/43162#issuecomment-320764675"
4385     );
4386     handler.note_without_error(&format!("rustc {} running on {}",
4387         option_env!("CFG_VERSION").unwrap_or("unknown_version"),
4388         crate::session::config::host_triple(),
4389     ));
4390 }
4391
4392 fn potentially_plural_count(count: usize, word: &str) -> String {
4393     format!("{} {}{}", count, word, if count == 1 { "" } else { "s" })
4394 }