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