]> git.proxmox.com Git - rustc.git/blob - src/librustc_typeck/check/mod.rs
New upstream version 1.23.0+dfsg1
[rustc.git] / src / librustc_typeck / check / mod.rs
1 // Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 /*
12
13 # check.rs
14
15 Within the check phase of type check, we check each item one at a time
16 (bodies of function expressions are checked as part of the containing
17 function). Inference is used to supply types wherever they are
18 unknown.
19
20 By far the most complex case is checking the body of a function. This
21 can be broken down into several distinct phases:
22
23 - gather: creates type variables to represent the type of each local
24 variable and pattern binding.
25
26 - main: the main pass does the lion's share of the work: it
27 determines the types of all expressions, resolves
28 methods, checks for most invalid conditions, and so forth. In
29 some cases, where a type is unknown, it may create a type or region
30 variable and use that as the type of an expression.
31
32 In the process of checking, various constraints will be placed on
33 these type variables through the subtyping relationships requested
34 through the `demand` module. The `infer` module is in charge
35 of resolving those constraints.
36
37 - regionck: after main is complete, the regionck pass goes over all
38 types looking for regions and making sure that they did not escape
39 into places they are not in scope. This may also influence the
40 final assignments of the various region variables if there is some
41 flexibility.
42
43 - vtable: find and records the impls to use for each trait bound that
44 appears on a type parameter.
45
46 - writeback: writes the final types within a function body, replacing
47 type variables with their final inferred types. These final types
48 are written into the `tcx.node_types` table, which should *never* contain
49 any reference to a type variable.
50
51 ## Intermediate types
52
53 While type checking a function, the intermediate types for the
54 expressions, blocks, and so forth contained within the function are
55 stored in `fcx.node_types` and `fcx.node_substs`. These types
56 may contain unresolved type variables. After type checking is
57 complete, the functions in the writeback module are used to take the
58 types from this table, resolve them, and then write them into their
59 permanent home in the type context `tcx`.
60
61 This means that during inferencing you should use `fcx.write_ty()`
62 and `fcx.expr_ty()` / `fcx.node_ty()` to write/obtain the types of
63 nodes within the function.
64
65 The types of top-level items, which never contain unbound type
66 variables, are stored directly into the `tcx` tables.
67
68 n.b.: A type variable is not the same thing as a type parameter. A
69 type variable is rather an "instance" of a type parameter: that is,
70 given a generic function `fn foo<T>(t: T)`: while checking the
71 function `foo`, the type `ty_param(0)` refers to the type `T`, which
72 is treated in abstract. When `foo()` is called, however, `T` will be
73 substituted for a fresh type variable `N`. This variable will
74 eventually be resolved to some concrete type (which might itself be
75 type parameter).
76
77 */
78
79 pub use self::Expectation::*;
80 use self::autoderef::Autoderef;
81 use self::callee::DeferredCallResolution;
82 use self::coercion::{CoerceMany, DynamicCoerceMany};
83 pub use self::compare_method::{compare_impl_method, compare_const_impl};
84 use self::method::MethodCallee;
85 use self::TupleArgumentsFlag::*;
86
87 use astconv::AstConv;
88 use hir::def::{Def, CtorKind};
89 use hir::def_id::{CrateNum, DefId, LOCAL_CRATE};
90 use rustc_back::slice::ref_slice;
91 use namespace::Namespace;
92 use rustc::infer::{self, InferCtxt, InferOk, RegionVariableOrigin};
93 use rustc::infer::type_variable::{TypeVariableOrigin};
94 use rustc::middle::region;
95 use rustc::ty::subst::{Kind, Subst, Substs};
96 use rustc::traits::{self, FulfillmentContext, ObligationCause, ObligationCauseCode};
97 use rustc::ty::{ParamTy, LvaluePreference, NoPreference, PreferMutLvalue};
98 use rustc::ty::{self, Ty, TyCtxt, Visibility};
99 use rustc::ty::adjustment::{Adjust, Adjustment, AutoBorrow};
100 use rustc::ty::fold::{BottomUpFolder, TypeFoldable};
101 use rustc::ty::maps::Providers;
102 use rustc::ty::util::{Representability, IntTypeExt};
103 use errors::{DiagnosticBuilder, DiagnosticId};
104 use require_c_abi_if_variadic;
105 use session::{CompileIncomplete, Session};
106 use TypeAndSubsts;
107 use lint;
108 use util::common::{ErrorReported, indenter};
109 use util::nodemap::{DefIdMap, DefIdSet, FxHashMap, NodeMap};
110
111 use std::cell::{Cell, RefCell, Ref, RefMut};
112 use std::rc::Rc;
113 use std::collections::hash_map::Entry;
114 use std::cmp;
115 use std::fmt::Display;
116 use std::mem::replace;
117 use std::ops::{self, Deref};
118 use syntax::abi::Abi;
119 use syntax::ast;
120 use syntax::attr;
121 use syntax::codemap::{self, original_sp, Spanned};
122 use syntax::feature_gate::{GateIssue, emit_feature_err};
123 use syntax::ptr::P;
124 use syntax::symbol::{Symbol, InternedString, keywords};
125 use syntax::util::lev_distance::find_best_match_for_name;
126 use syntax_pos::{self, BytePos, Span, MultiSpan};
127
128 use rustc::hir::intravisit::{self, Visitor, NestedVisitorMap};
129 use rustc::hir::itemlikevisit::ItemLikeVisitor;
130 use rustc::hir::map::Node;
131 use rustc::hir::{self, PatKind};
132 use rustc::middle::lang_items;
133 use rustc_back::slice;
134 use rustc_const_math::ConstInt;
135
136 mod autoderef;
137 pub mod dropck;
138 pub mod _match;
139 pub mod writeback;
140 mod regionck;
141 pub mod coercion;
142 pub mod demand;
143 pub mod method;
144 mod upvar;
145 mod wfcheck;
146 mod cast;
147 mod closure;
148 mod callee;
149 mod compare_method;
150 mod generator_interior;
151 mod intrinsic;
152 mod op;
153
154 /// A wrapper for InferCtxt's `in_progress_tables` field.
155 #[derive(Copy, Clone)]
156 struct MaybeInProgressTables<'a, 'tcx: 'a> {
157 maybe_tables: Option<&'a RefCell<ty::TypeckTables<'tcx>>>,
158 }
159
160 impl<'a, 'tcx> MaybeInProgressTables<'a, 'tcx> {
161 fn borrow(self) -> Ref<'a, ty::TypeckTables<'tcx>> {
162 match self.maybe_tables {
163 Some(tables) => tables.borrow(),
164 None => {
165 bug!("MaybeInProgressTables: inh/fcx.tables.borrow() with no tables")
166 }
167 }
168 }
169
170 fn borrow_mut(self) -> RefMut<'a, ty::TypeckTables<'tcx>> {
171 match self.maybe_tables {
172 Some(tables) => tables.borrow_mut(),
173 None => {
174 bug!("MaybeInProgressTables: inh/fcx.tables.borrow_mut() with no tables")
175 }
176 }
177 }
178 }
179
180
181 /// closures defined within the function. For example:
182 ///
183 /// fn foo() {
184 /// bar(move|| { ... })
185 /// }
186 ///
187 /// Here, the function `foo()` and the closure passed to
188 /// `bar()` will each have their own `FnCtxt`, but they will
189 /// share the inherited fields.
190 pub struct Inherited<'a, 'gcx: 'a+'tcx, 'tcx: 'a> {
191 infcx: InferCtxt<'a, 'gcx, 'tcx>,
192
193 tables: MaybeInProgressTables<'a, 'tcx>,
194
195 locals: RefCell<NodeMap<Ty<'tcx>>>,
196
197 fulfillment_cx: RefCell<traits::FulfillmentContext<'tcx>>,
198
199 // When we process a call like `c()` where `c` is a closure type,
200 // we may not have decided yet whether `c` is a `Fn`, `FnMut`, or
201 // `FnOnce` closure. In that case, we defer full resolution of the
202 // call until upvar inference can kick in and make the
203 // decision. We keep these deferred resolutions grouped by the
204 // def-id of the closure, so that once we decide, we can easily go
205 // back and process them.
206 deferred_call_resolutions: RefCell<DefIdMap<Vec<DeferredCallResolution<'gcx, 'tcx>>>>,
207
208 deferred_cast_checks: RefCell<Vec<cast::CastCheck<'tcx>>>,
209
210 deferred_generator_interiors: RefCell<Vec<(hir::BodyId, Ty<'tcx>)>>,
211
212 // Anonymized types found in explicit return types and their
213 // associated fresh inference variable. Writeback resolves these
214 // variables to get the concrete type, which can be used to
215 // deanonymize TyAnon, after typeck is done with all functions.
216 anon_types: RefCell<NodeMap<Ty<'tcx>>>,
217
218 /// Each type parameter has an implicit region bound that
219 /// indicates it must outlive at least the function body (the user
220 /// may specify stronger requirements). This field indicates the
221 /// region of the callee. If it is `None`, then the parameter
222 /// environment is for an item or something where the "callee" is
223 /// not clear.
224 implicit_region_bound: Option<ty::Region<'tcx>>,
225
226 body_id: Option<hir::BodyId>,
227 }
228
229 impl<'a, 'gcx, 'tcx> Deref for Inherited<'a, 'gcx, 'tcx> {
230 type Target = InferCtxt<'a, 'gcx, 'tcx>;
231 fn deref(&self) -> &Self::Target {
232 &self.infcx
233 }
234 }
235
236 /// When type-checking an expression, we propagate downward
237 /// whatever type hint we are able in the form of an `Expectation`.
238 #[derive(Copy, Clone, Debug)]
239 pub enum Expectation<'tcx> {
240 /// We know nothing about what type this expression should have.
241 NoExpectation,
242
243 /// This expression is an `if` condition, it must resolve to `bool`.
244 ExpectIfCondition,
245
246 /// This expression should have the type given (or some subtype)
247 ExpectHasType(Ty<'tcx>),
248
249 /// This expression will be cast to the `Ty`
250 ExpectCastableToType(Ty<'tcx>),
251
252 /// This rvalue expression will be wrapped in `&` or `Box` and coerced
253 /// to `&Ty` or `Box<Ty>`, respectively. `Ty` is `[A]` or `Trait`.
254 ExpectRvalueLikeUnsized(Ty<'tcx>),
255 }
256
257 impl<'a, 'gcx, 'tcx> Expectation<'tcx> {
258 // Disregard "castable to" expectations because they
259 // can lead us astray. Consider for example `if cond
260 // {22} else {c} as u8` -- if we propagate the
261 // "castable to u8" constraint to 22, it will pick the
262 // type 22u8, which is overly constrained (c might not
263 // be a u8). In effect, the problem is that the
264 // "castable to" expectation is not the tightest thing
265 // we can say, so we want to drop it in this case.
266 // The tightest thing we can say is "must unify with
267 // else branch". Note that in the case of a "has type"
268 // constraint, this limitation does not hold.
269
270 // If the expected type is just a type variable, then don't use
271 // an expected type. Otherwise, we might write parts of the type
272 // when checking the 'then' block which are incompatible with the
273 // 'else' branch.
274 fn adjust_for_branches(&self, fcx: &FnCtxt<'a, 'gcx, 'tcx>) -> Expectation<'tcx> {
275 match *self {
276 ExpectHasType(ety) => {
277 let ety = fcx.shallow_resolve(ety);
278 if !ety.is_ty_var() {
279 ExpectHasType(ety)
280 } else {
281 NoExpectation
282 }
283 }
284 ExpectRvalueLikeUnsized(ety) => {
285 ExpectRvalueLikeUnsized(ety)
286 }
287 _ => NoExpectation
288 }
289 }
290
291 /// Provide an expectation for an rvalue expression given an *optional*
292 /// hint, which is not required for type safety (the resulting type might
293 /// be checked higher up, as is the case with `&expr` and `box expr`), but
294 /// is useful in determining the concrete type.
295 ///
296 /// The primary use case is where the expected type is a fat pointer,
297 /// like `&[isize]`. For example, consider the following statement:
298 ///
299 /// let x: &[isize] = &[1, 2, 3];
300 ///
301 /// In this case, the expected type for the `&[1, 2, 3]` expression is
302 /// `&[isize]`. If however we were to say that `[1, 2, 3]` has the
303 /// expectation `ExpectHasType([isize])`, that would be too strong --
304 /// `[1, 2, 3]` does not have the type `[isize]` but rather `[isize; 3]`.
305 /// It is only the `&[1, 2, 3]` expression as a whole that can be coerced
306 /// to the type `&[isize]`. Therefore, we propagate this more limited hint,
307 /// which still is useful, because it informs integer literals and the like.
308 /// See the test case `test/run-pass/coerce-expect-unsized.rs` and #20169
309 /// for examples of where this comes up,.
310 fn rvalue_hint(fcx: &FnCtxt<'a, 'gcx, 'tcx>, ty: Ty<'tcx>) -> Expectation<'tcx> {
311 match fcx.tcx.struct_tail(ty).sty {
312 ty::TySlice(_) | ty::TyStr | ty::TyDynamic(..) => {
313 ExpectRvalueLikeUnsized(ty)
314 }
315 _ => ExpectHasType(ty)
316 }
317 }
318
319 // Resolves `expected` by a single level if it is a variable. If
320 // there is no expected type or resolution is not possible (e.g.,
321 // no constraints yet present), just returns `None`.
322 fn resolve(self, fcx: &FnCtxt<'a, 'gcx, 'tcx>) -> Expectation<'tcx> {
323 match self {
324 NoExpectation => NoExpectation,
325 ExpectIfCondition => ExpectIfCondition,
326 ExpectCastableToType(t) => {
327 ExpectCastableToType(fcx.resolve_type_vars_if_possible(&t))
328 }
329 ExpectHasType(t) => {
330 ExpectHasType(fcx.resolve_type_vars_if_possible(&t))
331 }
332 ExpectRvalueLikeUnsized(t) => {
333 ExpectRvalueLikeUnsized(fcx.resolve_type_vars_if_possible(&t))
334 }
335 }
336 }
337
338 fn to_option(self, fcx: &FnCtxt<'a, 'gcx, 'tcx>) -> Option<Ty<'tcx>> {
339 match self.resolve(fcx) {
340 NoExpectation => None,
341 ExpectIfCondition => Some(fcx.tcx.types.bool),
342 ExpectCastableToType(ty) |
343 ExpectHasType(ty) |
344 ExpectRvalueLikeUnsized(ty) => Some(ty),
345 }
346 }
347
348 /// It sometimes happens that we want to turn an expectation into
349 /// a **hard constraint** (i.e., something that must be satisfied
350 /// for the program to type-check). `only_has_type` will return
351 /// such a constraint, if it exists.
352 fn only_has_type(self, fcx: &FnCtxt<'a, 'gcx, 'tcx>) -> Option<Ty<'tcx>> {
353 match self.resolve(fcx) {
354 ExpectHasType(ty) => Some(ty),
355 ExpectIfCondition => Some(fcx.tcx.types.bool),
356 NoExpectation | ExpectCastableToType(_) | ExpectRvalueLikeUnsized(_) => None,
357 }
358 }
359
360 /// Like `only_has_type`, but instead of returning `None` if no
361 /// hard constraint exists, creates a fresh type variable.
362 fn coercion_target_type(self, fcx: &FnCtxt<'a, 'gcx, 'tcx>, span: Span) -> Ty<'tcx> {
363 self.only_has_type(fcx)
364 .unwrap_or_else(|| fcx.next_ty_var(TypeVariableOrigin::MiscVariable(span)))
365 }
366 }
367
368 #[derive(Copy, Clone)]
369 pub struct UnsafetyState {
370 pub def: ast::NodeId,
371 pub unsafety: hir::Unsafety,
372 pub unsafe_push_count: u32,
373 from_fn: bool
374 }
375
376 impl UnsafetyState {
377 pub fn function(unsafety: hir::Unsafety, def: ast::NodeId) -> UnsafetyState {
378 UnsafetyState { def: def, unsafety: unsafety, unsafe_push_count: 0, from_fn: true }
379 }
380
381 pub fn recurse(&mut self, blk: &hir::Block) -> UnsafetyState {
382 match self.unsafety {
383 // If this unsafe, then if the outer function was already marked as
384 // unsafe we shouldn't attribute the unsafe'ness to the block. This
385 // way the block can be warned about instead of ignoring this
386 // extraneous block (functions are never warned about).
387 hir::Unsafety::Unsafe if self.from_fn => *self,
388
389 unsafety => {
390 let (unsafety, def, count) = match blk.rules {
391 hir::PushUnsafeBlock(..) =>
392 (unsafety, blk.id, self.unsafe_push_count.checked_add(1).unwrap()),
393 hir::PopUnsafeBlock(..) =>
394 (unsafety, blk.id, self.unsafe_push_count.checked_sub(1).unwrap()),
395 hir::UnsafeBlock(..) =>
396 (hir::Unsafety::Unsafe, blk.id, self.unsafe_push_count),
397 hir::DefaultBlock =>
398 (unsafety, self.def, self.unsafe_push_count),
399 };
400 UnsafetyState{ def,
401 unsafety,
402 unsafe_push_count: count,
403 from_fn: false }
404 }
405 }
406 }
407 }
408
409 #[derive(Debug, Copy, Clone)]
410 pub enum LvalueOp {
411 Deref,
412 Index
413 }
414
415 /// Tracks whether executing a node may exit normally (versus
416 /// return/break/panic, which "diverge", leaving dead code in their
417 /// wake). Tracked semi-automatically (through type variables marked
418 /// as diverging), with some manual adjustments for control-flow
419 /// primitives (approximating a CFG).
420 #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
421 pub enum Diverges {
422 /// Potentially unknown, some cases converge,
423 /// others require a CFG to determine them.
424 Maybe,
425
426 /// Definitely known to diverge and therefore
427 /// not reach the next sibling or its parent.
428 Always,
429
430 /// Same as `Always` but with a reachability
431 /// warning already emitted
432 WarnedAlways
433 }
434
435 // Convenience impls for combinig `Diverges`.
436
437 impl ops::BitAnd for Diverges {
438 type Output = Self;
439 fn bitand(self, other: Self) -> Self {
440 cmp::min(self, other)
441 }
442 }
443
444 impl ops::BitOr for Diverges {
445 type Output = Self;
446 fn bitor(self, other: Self) -> Self {
447 cmp::max(self, other)
448 }
449 }
450
451 impl ops::BitAndAssign for Diverges {
452 fn bitand_assign(&mut self, other: Self) {
453 *self = *self & other;
454 }
455 }
456
457 impl ops::BitOrAssign for Diverges {
458 fn bitor_assign(&mut self, other: Self) {
459 *self = *self | other;
460 }
461 }
462
463 impl Diverges {
464 fn always(self) -> bool {
465 self >= Diverges::Always
466 }
467 }
468
469 pub struct BreakableCtxt<'gcx: 'tcx, 'tcx> {
470 may_break: bool,
471
472 // this is `null` for loops where break with a value is illegal,
473 // such as `while`, `for`, and `while let`
474 coerce: Option<DynamicCoerceMany<'gcx, 'tcx>>,
475 }
476
477 pub struct EnclosingBreakables<'gcx: 'tcx, 'tcx> {
478 stack: Vec<BreakableCtxt<'gcx, 'tcx>>,
479 by_id: NodeMap<usize>,
480 }
481
482 impl<'gcx, 'tcx> EnclosingBreakables<'gcx, 'tcx> {
483 fn find_breakable(&mut self, target_id: ast::NodeId) -> &mut BreakableCtxt<'gcx, 'tcx> {
484 let ix = *self.by_id.get(&target_id).unwrap_or_else(|| {
485 bug!("could not find enclosing breakable with id {}", target_id);
486 });
487 &mut self.stack[ix]
488 }
489 }
490
491 pub struct FnCtxt<'a, 'gcx: 'a+'tcx, 'tcx: 'a> {
492 body_id: ast::NodeId,
493
494 /// The parameter environment used for proving trait obligations
495 /// in this function. This can change when we descend into
496 /// closures (as they bring new things into scope), hence it is
497 /// not part of `Inherited` (as of the time of this writing,
498 /// closures do not yet change the environment, but they will
499 /// eventually).
500 param_env: ty::ParamEnv<'tcx>,
501
502 // Number of errors that had been reported when we started
503 // checking this function. On exit, if we find that *more* errors
504 // have been reported, we will skip regionck and other work that
505 // expects the types within the function to be consistent.
506 err_count_on_creation: usize,
507
508 ret_coercion: Option<RefCell<DynamicCoerceMany<'gcx, 'tcx>>>,
509
510 yield_ty: Option<Ty<'tcx>>,
511
512 ps: RefCell<UnsafetyState>,
513
514 /// Whether the last checked node generates a divergence (e.g.,
515 /// `return` will set this to Always). In general, when entering
516 /// an expression or other node in the tree, the initial value
517 /// indicates whether prior parts of the containing expression may
518 /// have diverged. It is then typically set to `Maybe` (and the
519 /// old value remembered) for processing the subparts of the
520 /// current expression. As each subpart is processed, they may set
521 /// the flag to `Always` etc. Finally, at the end, we take the
522 /// result and "union" it with the original value, so that when we
523 /// return the flag indicates if any subpart of the the parent
524 /// expression (up to and including this part) has diverged. So,
525 /// if you read it after evaluating a subexpression `X`, the value
526 /// you get indicates whether any subexpression that was
527 /// evaluating up to and including `X` diverged.
528 ///
529 /// We use this flag for two purposes:
530 ///
531 /// - To warn about unreachable code: if, after processing a
532 /// sub-expression but before we have applied the effects of the
533 /// current node, we see that the flag is set to `Always`, we
534 /// can issue a warning. This corresponds to something like
535 /// `foo(return)`; we warn on the `foo()` expression. (We then
536 /// update the flag to `WarnedAlways` to suppress duplicate
537 /// reports.) Similarly, if we traverse to a fresh statement (or
538 /// tail expression) from a `Always` setting, we will issue a
539 /// warning. This corresponds to something like `{return;
540 /// foo();}` or `{return; 22}`, where we would warn on the
541 /// `foo()` or `22`.
542 ///
543 /// - To permit assignment into a local variable or other lvalue
544 /// (including the "return slot") of type `!`. This is allowed
545 /// if **either** the type of value being assigned is `!`, which
546 /// means the current code is dead, **or** the expression's
547 /// diverging flag is true, which means that a diverging value was
548 /// wrapped (e.g., `let x: ! = foo(return)`).
549 ///
550 /// To repeat the last point: an expression represents dead-code
551 /// if, after checking it, **either** its type is `!` OR the
552 /// diverges flag is set to something other than `Maybe`.
553 diverges: Cell<Diverges>,
554
555 /// Whether any child nodes have any type errors.
556 has_errors: Cell<bool>,
557
558 enclosing_breakables: RefCell<EnclosingBreakables<'gcx, 'tcx>>,
559
560 inh: &'a Inherited<'a, 'gcx, 'tcx>,
561 }
562
563 impl<'a, 'gcx, 'tcx> Deref for FnCtxt<'a, 'gcx, 'tcx> {
564 type Target = Inherited<'a, 'gcx, 'tcx>;
565 fn deref(&self) -> &Self::Target {
566 &self.inh
567 }
568 }
569
570 /// Helper type of a temporary returned by Inherited::build(...).
571 /// Necessary because we can't write the following bound:
572 /// F: for<'b, 'tcx> where 'gcx: 'tcx FnOnce(Inherited<'b, 'gcx, 'tcx>).
573 pub struct InheritedBuilder<'a, 'gcx: 'a+'tcx, 'tcx: 'a> {
574 infcx: infer::InferCtxtBuilder<'a, 'gcx, 'tcx>,
575 def_id: DefId,
576 }
577
578 impl<'a, 'gcx, 'tcx> Inherited<'a, 'gcx, 'tcx> {
579 pub fn build(tcx: TyCtxt<'a, 'gcx, 'gcx>, def_id: DefId)
580 -> InheritedBuilder<'a, 'gcx, 'tcx> {
581 let hir_id_root = if def_id.is_local() {
582 let node_id = tcx.hir.as_local_node_id(def_id).unwrap();
583 let hir_id = tcx.hir.definitions().node_to_hir_id(node_id);
584 DefId::local(hir_id.owner)
585 } else {
586 def_id
587 };
588
589 InheritedBuilder {
590 infcx: tcx.infer_ctxt().with_fresh_in_progress_tables(hir_id_root),
591 def_id,
592 }
593 }
594 }
595
596 impl<'a, 'gcx, 'tcx> InheritedBuilder<'a, 'gcx, 'tcx> {
597 fn enter<F, R>(&'tcx mut self, f: F) -> R
598 where F: for<'b> FnOnce(Inherited<'b, 'gcx, 'tcx>) -> R
599 {
600 let def_id = self.def_id;
601 self.infcx.enter(|infcx| f(Inherited::new(infcx, def_id)))
602 }
603 }
604
605 impl<'a, 'gcx, 'tcx> Inherited<'a, 'gcx, 'tcx> {
606 fn new(infcx: InferCtxt<'a, 'gcx, 'tcx>, def_id: DefId) -> Self {
607 let tcx = infcx.tcx;
608 let item_id = tcx.hir.as_local_node_id(def_id);
609 let body_id = item_id.and_then(|id| tcx.hir.maybe_body_owned_by(id));
610 let implicit_region_bound = body_id.map(|body_id| {
611 let body = tcx.hir.body(body_id);
612 tcx.mk_region(ty::ReScope(region::Scope::CallSite(body.value.hir_id.local_id)))
613 });
614
615 Inherited {
616 tables: MaybeInProgressTables {
617 maybe_tables: infcx.in_progress_tables,
618 },
619 infcx,
620 fulfillment_cx: RefCell::new(traits::FulfillmentContext::new()),
621 locals: RefCell::new(NodeMap()),
622 deferred_call_resolutions: RefCell::new(DefIdMap()),
623 deferred_cast_checks: RefCell::new(Vec::new()),
624 deferred_generator_interiors: RefCell::new(Vec::new()),
625 anon_types: RefCell::new(NodeMap()),
626 implicit_region_bound,
627 body_id,
628 }
629 }
630
631 fn register_predicate(&self, obligation: traits::PredicateObligation<'tcx>) {
632 debug!("register_predicate({:?})", obligation);
633 if obligation.has_escaping_regions() {
634 span_bug!(obligation.cause.span, "escaping regions in predicate {:?}",
635 obligation);
636 }
637 self.fulfillment_cx
638 .borrow_mut()
639 .register_predicate_obligation(self, obligation);
640 }
641
642 fn register_predicates<I>(&self, obligations: I)
643 where I: IntoIterator<Item = traits::PredicateObligation<'tcx>> {
644 for obligation in obligations {
645 self.register_predicate(obligation);
646 }
647 }
648
649 fn register_infer_ok_obligations<T>(&self, infer_ok: InferOk<'tcx, T>) -> T {
650 self.register_predicates(infer_ok.obligations);
651 infer_ok.value
652 }
653
654 fn normalize_associated_types_in<T>(&self,
655 span: Span,
656 body_id: ast::NodeId,
657 param_env: ty::ParamEnv<'tcx>,
658 value: &T) -> T
659 where T : TypeFoldable<'tcx>
660 {
661 let ok = self.partially_normalize_associated_types_in(span, body_id, param_env, value);
662 self.register_infer_ok_obligations(ok)
663 }
664
665 /// Replace any late-bound regions bound in `value` with
666 /// free variants attached to `all_outlive_scope`.
667 fn liberate_late_bound_regions<T>(&self,
668 all_outlive_scope: DefId,
669 value: &ty::Binder<T>)
670 -> T
671 where T: TypeFoldable<'tcx>
672 {
673 self.tcx.replace_late_bound_regions(value, |br| {
674 self.tcx.mk_region(ty::ReFree(ty::FreeRegion {
675 scope: all_outlive_scope,
676 bound_region: br
677 }))
678 }).0
679 }
680 }
681
682 struct CheckItemTypesVisitor<'a, 'tcx: 'a> { tcx: TyCtxt<'a, 'tcx, 'tcx> }
683
684 impl<'a, 'tcx> ItemLikeVisitor<'tcx> for CheckItemTypesVisitor<'a, 'tcx> {
685 fn visit_item(&mut self, i: &'tcx hir::Item) {
686 check_item_type(self.tcx, i);
687 }
688 fn visit_trait_item(&mut self, _: &'tcx hir::TraitItem) { }
689 fn visit_impl_item(&mut self, _: &'tcx hir::ImplItem) { }
690 }
691
692 pub fn check_wf_new<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) -> Result<(), ErrorReported> {
693 tcx.sess.track_errors(|| {
694 let mut visit = wfcheck::CheckTypeWellFormedVisitor::new(tcx);
695 tcx.hir.krate().visit_all_item_likes(&mut visit.as_deep_visitor());
696 })
697 }
698
699 pub fn check_item_types<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) -> Result<(), ErrorReported> {
700 tcx.sess.track_errors(|| {
701 tcx.hir.krate().visit_all_item_likes(&mut CheckItemTypesVisitor { tcx });
702 })
703 }
704
705 pub fn check_item_bodies<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) -> Result<(), CompileIncomplete> {
706 tcx.typeck_item_bodies(LOCAL_CRATE)
707 }
708
709 fn typeck_item_bodies<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, crate_num: CrateNum)
710 -> Result<(), CompileIncomplete>
711 {
712 debug_assert!(crate_num == LOCAL_CRATE);
713 Ok(tcx.sess.track_errors(|| {
714 for body_owner_def_id in tcx.body_owners() {
715 ty::maps::queries::typeck_tables_of::ensure(tcx, body_owner_def_id);
716 }
717 })?)
718 }
719
720 pub fn provide(providers: &mut Providers) {
721 *providers = Providers {
722 typeck_item_bodies,
723 typeck_tables_of,
724 has_typeck_tables,
725 closure_kind,
726 generator_sig,
727 adt_destructor,
728 used_trait_imports,
729 ..*providers
730 };
731 }
732
733 fn generator_sig<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
734 def_id: DefId)
735 -> Option<ty::PolyGenSig<'tcx>> {
736 let node_id = tcx.hir.as_local_node_id(def_id).unwrap();
737 let hir_id = tcx.hir.node_to_hir_id(node_id);
738 tcx.typeck_tables_of(def_id).generator_sigs()[hir_id].map(|s| ty::Binder(s))
739 }
740
741 fn closure_kind<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
742 def_id: DefId)
743 -> ty::ClosureKind {
744 let node_id = tcx.hir.as_local_node_id(def_id).unwrap();
745 let hir_id = tcx.hir.node_to_hir_id(node_id);
746 tcx.typeck_tables_of(def_id).closure_kinds()[hir_id].0
747 }
748
749 fn adt_destructor<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
750 def_id: DefId)
751 -> Option<ty::Destructor> {
752 tcx.calculate_dtor(def_id, &mut dropck::check_drop_impl)
753 }
754
755 /// If this def-id is a "primary tables entry", returns `Some((body_id, decl))`
756 /// with information about it's body-id and fn-decl (if any). Otherwise,
757 /// returns `None`.
758 ///
759 /// If this function returns "some", then `typeck_tables(def_id)` will
760 /// succeed; if it returns `None`, then `typeck_tables(def_id)` may or
761 /// may not succeed. In some cases where this function returns `None`
762 /// (notably closures), `typeck_tables(def_id)` would wind up
763 /// redirecting to the owning function.
764 fn primary_body_of<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
765 id: ast::NodeId)
766 -> Option<(hir::BodyId, Option<&'tcx hir::FnDecl>)>
767 {
768 match tcx.hir.get(id) {
769 hir::map::NodeItem(item) => {
770 match item.node {
771 hir::ItemConst(_, body) |
772 hir::ItemStatic(_, _, body) =>
773 Some((body, None)),
774 hir::ItemFn(ref decl, .., body) =>
775 Some((body, Some(decl))),
776 _ =>
777 None,
778 }
779 }
780 hir::map::NodeTraitItem(item) => {
781 match item.node {
782 hir::TraitItemKind::Const(_, Some(body)) =>
783 Some((body, None)),
784 hir::TraitItemKind::Method(ref sig, hir::TraitMethod::Provided(body)) =>
785 Some((body, Some(&sig.decl))),
786 _ =>
787 None,
788 }
789 }
790 hir::map::NodeImplItem(item) => {
791 match item.node {
792 hir::ImplItemKind::Const(_, body) =>
793 Some((body, None)),
794 hir::ImplItemKind::Method(ref sig, body) =>
795 Some((body, Some(&sig.decl))),
796 _ =>
797 None,
798 }
799 }
800 hir::map::NodeExpr(expr) => {
801 // FIXME(eddyb) Closures should have separate
802 // function definition IDs and expression IDs.
803 // Type-checking should not let closures get
804 // this far in a constant position.
805 // Assume that everything other than closures
806 // is a constant "initializer" expression.
807 match expr.node {
808 hir::ExprClosure(..) =>
809 None,
810 _ =>
811 Some((hir::BodyId { node_id: expr.id }, None)),
812 }
813 }
814 _ => None,
815 }
816 }
817
818 fn has_typeck_tables<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
819 def_id: DefId)
820 -> bool {
821 // Closures' tables come from their outermost function,
822 // as they are part of the same "inference environment".
823 let outer_def_id = tcx.closure_base_def_id(def_id);
824 if outer_def_id != def_id {
825 return tcx.has_typeck_tables(outer_def_id);
826 }
827
828 let id = tcx.hir.as_local_node_id(def_id).unwrap();
829 primary_body_of(tcx, id).is_some()
830 }
831
832 fn used_trait_imports<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
833 def_id: DefId)
834 -> Rc<DefIdSet> {
835 tcx.typeck_tables_of(def_id).used_trait_imports.clone()
836 }
837
838 fn typeck_tables_of<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
839 def_id: DefId)
840 -> &'tcx ty::TypeckTables<'tcx> {
841 // Closures' tables come from their outermost function,
842 // as they are part of the same "inference environment".
843 let outer_def_id = tcx.closure_base_def_id(def_id);
844 if outer_def_id != def_id {
845 return tcx.typeck_tables_of(outer_def_id);
846 }
847
848 let id = tcx.hir.as_local_node_id(def_id).unwrap();
849 let span = tcx.hir.span(id);
850
851 // Figure out what primary body this item has.
852 let (body_id, fn_decl) = primary_body_of(tcx, id).unwrap_or_else(|| {
853 span_bug!(span, "can't type-check body of {:?}", def_id);
854 });
855 let body = tcx.hir.body(body_id);
856
857 let tables = Inherited::build(tcx, def_id).enter(|inh| {
858 let param_env = tcx.param_env(def_id);
859 let fcx = if let Some(decl) = fn_decl {
860 let fn_sig = tcx.fn_sig(def_id);
861
862 check_abi(tcx, span, fn_sig.abi());
863
864 // Compute the fty from point of view of inside fn.
865 let fn_sig =
866 inh.liberate_late_bound_regions(def_id, &fn_sig);
867 let fn_sig =
868 inh.normalize_associated_types_in(body.value.span,
869 body_id.node_id,
870 param_env,
871 &fn_sig);
872
873 check_fn(&inh, param_env, fn_sig, decl, id, body, false).0
874 } else {
875 let fcx = FnCtxt::new(&inh, param_env, body.value.id);
876 let expected_type = tcx.type_of(def_id);
877 let expected_type = fcx.normalize_associated_types_in(body.value.span, &expected_type);
878 fcx.require_type_is_sized(expected_type, body.value.span, traits::ConstSized);
879
880 // Gather locals in statics (because of block expressions).
881 // This is technically unnecessary because locals in static items are forbidden,
882 // but prevents type checking from blowing up before const checking can properly
883 // emit an error.
884 GatherLocalsVisitor { fcx: &fcx }.visit_body(body);
885
886 fcx.check_expr_coercable_to_type(&body.value, expected_type);
887
888 fcx
889 };
890
891 fcx.select_all_obligations_and_apply_defaults();
892 fcx.closure_analyze(body);
893 fcx.select_obligations_where_possible();
894 fcx.check_casts();
895 fcx.resolve_generator_interiors(def_id);
896 fcx.select_all_obligations_or_error();
897
898 if fn_decl.is_some() {
899 fcx.regionck_fn(id, body);
900 } else {
901 fcx.regionck_expr(body);
902 }
903
904 fcx.resolve_type_vars_in_body(body)
905 });
906
907 // Consistency check our TypeckTables instance can hold all ItemLocalIds
908 // it will need to hold.
909 assert_eq!(tables.local_id_root,
910 Some(DefId::local(tcx.hir.definitions().node_to_hir_id(id).owner)));
911 tables
912 }
913
914 fn check_abi<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, span: Span, abi: Abi) {
915 if !tcx.sess.target.target.is_abi_supported(abi) {
916 struct_span_err!(tcx.sess, span, E0570,
917 "The ABI `{}` is not supported for the current target", abi).emit()
918 }
919 }
920
921 struct GatherLocalsVisitor<'a, 'gcx: 'a+'tcx, 'tcx: 'a> {
922 fcx: &'a FnCtxt<'a, 'gcx, 'tcx>
923 }
924
925 impl<'a, 'gcx, 'tcx> GatherLocalsVisitor<'a, 'gcx, 'tcx> {
926 fn assign(&mut self, span: Span, nid: ast::NodeId, ty_opt: Option<Ty<'tcx>>) -> Ty<'tcx> {
927 match ty_opt {
928 None => {
929 // infer the variable's type
930 let var_ty = self.fcx.next_ty_var(TypeVariableOrigin::TypeInference(span));
931 self.fcx.locals.borrow_mut().insert(nid, var_ty);
932 var_ty
933 }
934 Some(typ) => {
935 // take type that the user specified
936 self.fcx.locals.borrow_mut().insert(nid, typ);
937 typ
938 }
939 }
940 }
941 }
942
943 impl<'a, 'gcx, 'tcx> Visitor<'gcx> for GatherLocalsVisitor<'a, 'gcx, 'tcx> {
944 fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'gcx> {
945 NestedVisitorMap::None
946 }
947
948 // Add explicitly-declared locals.
949 fn visit_local(&mut self, local: &'gcx hir::Local) {
950 let o_ty = match local.ty {
951 Some(ref ty) => Some(self.fcx.to_ty(&ty)),
952 None => None
953 };
954 self.assign(local.span, local.id, o_ty);
955 debug!("Local variable {:?} is assigned type {}",
956 local.pat,
957 self.fcx.ty_to_string(
958 self.fcx.locals.borrow().get(&local.id).unwrap().clone()));
959 intravisit::walk_local(self, local);
960 }
961
962 // Add pattern bindings.
963 fn visit_pat(&mut self, p: &'gcx hir::Pat) {
964 if let PatKind::Binding(_, _, ref path1, _) = p.node {
965 let var_ty = self.assign(p.span, p.id, None);
966
967 self.fcx.require_type_is_sized(var_ty, p.span,
968 traits::VariableType(p.id));
969
970 debug!("Pattern binding {} is assigned to {} with type {:?}",
971 path1.node,
972 self.fcx.ty_to_string(
973 self.fcx.locals.borrow().get(&p.id).unwrap().clone()),
974 var_ty);
975 }
976 intravisit::walk_pat(self, p);
977 }
978
979 // Don't descend into the bodies of nested closures
980 fn visit_fn(&mut self, _: intravisit::FnKind<'gcx>, _: &'gcx hir::FnDecl,
981 _: hir::BodyId, _: Span, _: ast::NodeId) { }
982 }
983
984 /// Helper used for fns and closures. Does the grungy work of checking a function
985 /// body and returns the function context used for that purpose, since in the case of a fn item
986 /// there is still a bit more to do.
987 ///
988 /// * ...
989 /// * inherited: other fields inherited from the enclosing fn (if any)
990 fn check_fn<'a, 'gcx, 'tcx>(inherited: &'a Inherited<'a, 'gcx, 'tcx>,
991 param_env: ty::ParamEnv<'tcx>,
992 fn_sig: ty::FnSig<'tcx>,
993 decl: &'gcx hir::FnDecl,
994 fn_id: ast::NodeId,
995 body: &'gcx hir::Body,
996 can_be_generator: bool)
997 -> (FnCtxt<'a, 'gcx, 'tcx>, Option<ty::GeneratorInterior<'tcx>>)
998 {
999 let mut fn_sig = fn_sig.clone();
1000
1001 debug!("check_fn(sig={:?}, fn_id={}, param_env={:?})", fn_sig, fn_id, param_env);
1002
1003 // Create the function context. This is either derived from scratch or,
1004 // in the case of function expressions, based on the outer context.
1005 let mut fcx = FnCtxt::new(inherited, param_env, body.value.id);
1006 *fcx.ps.borrow_mut() = UnsafetyState::function(fn_sig.unsafety, fn_id);
1007
1008 let ret_ty = fn_sig.output();
1009 fcx.require_type_is_sized(ret_ty, decl.output.span(), traits::SizedReturnType);
1010 let ret_ty = fcx.instantiate_anon_types(&ret_ty);
1011 fcx.ret_coercion = Some(RefCell::new(CoerceMany::new(ret_ty)));
1012 fn_sig = fcx.tcx.mk_fn_sig(
1013 fn_sig.inputs().iter().cloned(),
1014 ret_ty,
1015 fn_sig.variadic,
1016 fn_sig.unsafety,
1017 fn_sig.abi
1018 );
1019
1020 let span = body.value.span;
1021
1022 if body.is_generator && can_be_generator {
1023 fcx.yield_ty = Some(fcx.next_ty_var(TypeVariableOrigin::TypeInference(span)));
1024 }
1025
1026 GatherLocalsVisitor { fcx: &fcx, }.visit_body(body);
1027
1028 // Add formal parameters.
1029 for (arg_ty, arg) in fn_sig.inputs().iter().zip(&body.arguments) {
1030 // Check the pattern.
1031 fcx.check_pat_walk(&arg.pat, arg_ty,
1032 ty::BindingMode::BindByValue(hir::Mutability::MutImmutable), true);
1033
1034 // Check that argument is Sized.
1035 // The check for a non-trivial pattern is a hack to avoid duplicate warnings
1036 // for simple cases like `fn foo(x: Trait)`,
1037 // where we would error once on the parameter as a whole, and once on the binding `x`.
1038 if arg.pat.simple_name().is_none() {
1039 fcx.require_type_is_sized(arg_ty, decl.output.span(), traits::MiscObligation);
1040 }
1041
1042 fcx.write_ty(arg.hir_id, arg_ty);
1043 }
1044
1045 let fn_hir_id = fcx.tcx.hir.node_to_hir_id(fn_id);
1046 let gen_ty = if can_be_generator && body.is_generator {
1047 let gen_sig = ty::GenSig {
1048 yield_ty: fcx.yield_ty.unwrap(),
1049 return_ty: ret_ty,
1050 };
1051 inherited.tables.borrow_mut().generator_sigs_mut().insert(fn_hir_id, Some(gen_sig));
1052
1053 let witness = fcx.next_ty_var(TypeVariableOrigin::MiscVariable(span));
1054 fcx.deferred_generator_interiors.borrow_mut().push((body.id(), witness));
1055 let interior = ty::GeneratorInterior::new(witness);
1056
1057 inherited.tables.borrow_mut().generator_interiors_mut().insert(fn_hir_id, interior);
1058
1059 Some(interior)
1060 } else {
1061 inherited.tables.borrow_mut().generator_sigs_mut().insert(fn_hir_id, None);
1062 None
1063 };
1064 inherited.tables.borrow_mut().liberated_fn_sigs_mut().insert(fn_hir_id, fn_sig);
1065
1066 fcx.check_return_expr(&body.value);
1067
1068 // Finalize the return check by taking the LUB of the return types
1069 // we saw and assigning it to the expected return type. This isn't
1070 // really expected to fail, since the coercions would have failed
1071 // earlier when trying to find a LUB.
1072 //
1073 // However, the behavior around `!` is sort of complex. In the
1074 // event that the `actual_return_ty` comes back as `!`, that
1075 // indicates that the fn either does not return or "returns" only
1076 // values of type `!`. In this case, if there is an expected
1077 // return type that is *not* `!`, that should be ok. But if the
1078 // return type is being inferred, we want to "fallback" to `!`:
1079 //
1080 // let x = move || panic!();
1081 //
1082 // To allow for that, I am creating a type variable with diverging
1083 // fallback. This was deemed ever so slightly better than unifying
1084 // the return value with `!` because it allows for the caller to
1085 // make more assumptions about the return type (e.g., they could do
1086 //
1087 // let y: Option<u32> = Some(x());
1088 //
1089 // which would then cause this return type to become `u32`, not
1090 // `!`).
1091 let coercion = fcx.ret_coercion.take().unwrap().into_inner();
1092 let mut actual_return_ty = coercion.complete(&fcx);
1093 if actual_return_ty.is_never() {
1094 actual_return_ty = fcx.next_diverging_ty_var(
1095 TypeVariableOrigin::DivergingFn(span));
1096 }
1097 fcx.demand_suptype(span, ret_ty, actual_return_ty);
1098
1099 (fcx, gen_ty)
1100 }
1101
1102 fn check_struct<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
1103 id: ast::NodeId,
1104 span: Span) {
1105 let def_id = tcx.hir.local_def_id(id);
1106 let def = tcx.adt_def(def_id);
1107 def.destructor(tcx); // force the destructor to be evaluated
1108 check_representable(tcx, span, def_id);
1109
1110 if def.repr.simd() {
1111 check_simd(tcx, span, def_id);
1112 }
1113
1114 check_packed(tcx, span, def_id);
1115 }
1116
1117 fn check_union<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
1118 id: ast::NodeId,
1119 span: Span) {
1120 let def_id = tcx.hir.local_def_id(id);
1121 let def = tcx.adt_def(def_id);
1122 def.destructor(tcx); // force the destructor to be evaluated
1123 check_representable(tcx, span, def_id);
1124
1125 check_packed(tcx, span, def_id);
1126 }
1127
1128 pub fn check_item_type<'a,'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, it: &'tcx hir::Item) {
1129 debug!("check_item_type(it.id={}, it.name={})",
1130 it.id,
1131 tcx.item_path_str(tcx.hir.local_def_id(it.id)));
1132 let _indenter = indenter();
1133 match it.node {
1134 // Consts can play a role in type-checking, so they are included here.
1135 hir::ItemStatic(..) |
1136 hir::ItemConst(..) => {
1137 tcx.typeck_tables_of(tcx.hir.local_def_id(it.id));
1138 }
1139 hir::ItemEnum(ref enum_definition, _) => {
1140 check_enum(tcx,
1141 it.span,
1142 &enum_definition.variants,
1143 it.id);
1144 }
1145 hir::ItemFn(..) => {} // entirely within check_item_body
1146 hir::ItemImpl(.., ref impl_item_refs) => {
1147 debug!("ItemImpl {} with id {}", it.name, it.id);
1148 let impl_def_id = tcx.hir.local_def_id(it.id);
1149 if let Some(impl_trait_ref) = tcx.impl_trait_ref(impl_def_id) {
1150 check_impl_items_against_trait(tcx,
1151 it.span,
1152 impl_def_id,
1153 impl_trait_ref,
1154 impl_item_refs);
1155 let trait_def_id = impl_trait_ref.def_id;
1156 check_on_unimplemented(tcx, trait_def_id, it);
1157 }
1158 }
1159 hir::ItemTrait(..) => {
1160 let def_id = tcx.hir.local_def_id(it.id);
1161 check_on_unimplemented(tcx, def_id, it);
1162 }
1163 hir::ItemStruct(..) => {
1164 check_struct(tcx, it.id, it.span);
1165 }
1166 hir::ItemUnion(..) => {
1167 check_union(tcx, it.id, it.span);
1168 }
1169 hir::ItemTy(_, ref generics) => {
1170 let def_id = tcx.hir.local_def_id(it.id);
1171 let pty_ty = tcx.type_of(def_id);
1172 check_bounds_are_used(tcx, generics, pty_ty);
1173 }
1174 hir::ItemForeignMod(ref m) => {
1175 check_abi(tcx, it.span, m.abi);
1176
1177 if m.abi == Abi::RustIntrinsic {
1178 for item in &m.items {
1179 intrinsic::check_intrinsic_type(tcx, item);
1180 }
1181 } else if m.abi == Abi::PlatformIntrinsic {
1182 for item in &m.items {
1183 intrinsic::check_platform_intrinsic_type(tcx, item);
1184 }
1185 } else {
1186 for item in &m.items {
1187 let generics = tcx.generics_of(tcx.hir.local_def_id(item.id));
1188 if !generics.types.is_empty() {
1189 let mut err = struct_span_err!(tcx.sess, item.span, E0044,
1190 "foreign items may not have type parameters");
1191 span_help!(&mut err, item.span,
1192 "consider using specialization instead of \
1193 type parameters");
1194 err.emit();
1195 }
1196
1197 if let hir::ForeignItemFn(ref fn_decl, _, _) = item.node {
1198 require_c_abi_if_variadic(tcx, fn_decl, m.abi, item.span);
1199 }
1200 }
1201 }
1202 }
1203 _ => {/* nothing to do */ }
1204 }
1205 }
1206
1207 fn check_on_unimplemented<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
1208 trait_def_id: DefId,
1209 item: &hir::Item) {
1210 let item_def_id = tcx.hir.local_def_id(item.id);
1211 // an error would be reported if this fails.
1212 let _ = traits::OnUnimplementedDirective::of_item(tcx, trait_def_id, item_def_id);
1213 }
1214
1215 fn report_forbidden_specialization<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
1216 impl_item: &hir::ImplItem,
1217 parent_impl: DefId)
1218 {
1219 let mut err = struct_span_err!(
1220 tcx.sess, impl_item.span, E0520,
1221 "`{}` specializes an item from a parent `impl`, but \
1222 that item is not marked `default`",
1223 impl_item.name);
1224 err.span_label(impl_item.span, format!("cannot specialize default item `{}`",
1225 impl_item.name));
1226
1227 match tcx.span_of_impl(parent_impl) {
1228 Ok(span) => {
1229 err.span_label(span, "parent `impl` is here");
1230 err.note(&format!("to specialize, `{}` in the parent `impl` must be marked `default`",
1231 impl_item.name));
1232 }
1233 Err(cname) => {
1234 err.note(&format!("parent implementation is in crate `{}`", cname));
1235 }
1236 }
1237
1238 err.emit();
1239 }
1240
1241 fn check_specialization_validity<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
1242 trait_def: &ty::TraitDef,
1243 trait_item: &ty::AssociatedItem,
1244 impl_id: DefId,
1245 impl_item: &hir::ImplItem)
1246 {
1247 let ancestors = trait_def.ancestors(tcx, impl_id);
1248
1249 let kind = match impl_item.node {
1250 hir::ImplItemKind::Const(..) => ty::AssociatedKind::Const,
1251 hir::ImplItemKind::Method(..) => ty::AssociatedKind::Method,
1252 hir::ImplItemKind::Type(_) => ty::AssociatedKind::Type
1253 };
1254
1255 let parent = ancestors.defs(tcx, trait_item.name, kind, trait_def.def_id).skip(1).next()
1256 .map(|node_item| node_item.map(|parent| parent.defaultness));
1257
1258 if let Some(parent) = parent {
1259 if tcx.impl_item_is_final(&parent) {
1260 report_forbidden_specialization(tcx, impl_item, parent.node.def_id());
1261 }
1262 }
1263
1264 }
1265
1266 fn check_impl_items_against_trait<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
1267 impl_span: Span,
1268 impl_id: DefId,
1269 impl_trait_ref: ty::TraitRef<'tcx>,
1270 impl_item_refs: &[hir::ImplItemRef]) {
1271 // If the trait reference itself is erroneous (so the compilation is going
1272 // to fail), skip checking the items here -- the `impl_item` table in `tcx`
1273 // isn't populated for such impls.
1274 if impl_trait_ref.references_error() { return; }
1275
1276 // Locate trait definition and items
1277 let trait_def = tcx.trait_def(impl_trait_ref.def_id);
1278 let mut overridden_associated_type = None;
1279
1280 let impl_items = || impl_item_refs.iter().map(|iiref| tcx.hir.impl_item(iiref.id));
1281
1282 // Check existing impl methods to see if they are both present in trait
1283 // and compatible with trait signature
1284 for impl_item in impl_items() {
1285 let ty_impl_item = tcx.associated_item(tcx.hir.local_def_id(impl_item.id));
1286 let ty_trait_item = tcx.associated_items(impl_trait_ref.def_id)
1287 .find(|ac| Namespace::from(&impl_item.node) == Namespace::from(ac.kind) &&
1288 tcx.hygienic_eq(ty_impl_item.name, ac.name, impl_trait_ref.def_id))
1289 .or_else(|| {
1290 // Not compatible, but needed for the error message
1291 tcx.associated_items(impl_trait_ref.def_id)
1292 .find(|ac| tcx.hygienic_eq(ty_impl_item.name, ac.name, impl_trait_ref.def_id))
1293 });
1294
1295 // Check that impl definition matches trait definition
1296 if let Some(ty_trait_item) = ty_trait_item {
1297 match impl_item.node {
1298 hir::ImplItemKind::Const(..) => {
1299 // Find associated const definition.
1300 if ty_trait_item.kind == ty::AssociatedKind::Const {
1301 compare_const_impl(tcx,
1302 &ty_impl_item,
1303 impl_item.span,
1304 &ty_trait_item,
1305 impl_trait_ref);
1306 } else {
1307 let mut err = struct_span_err!(tcx.sess, impl_item.span, E0323,
1308 "item `{}` is an associated const, \
1309 which doesn't match its trait `{}`",
1310 ty_impl_item.name,
1311 impl_trait_ref);
1312 err.span_label(impl_item.span, "does not match trait");
1313 // We can only get the spans from local trait definition
1314 // Same for E0324 and E0325
1315 if let Some(trait_span) = tcx.hir.span_if_local(ty_trait_item.def_id) {
1316 err.span_label(trait_span, "item in trait");
1317 }
1318 err.emit()
1319 }
1320 }
1321 hir::ImplItemKind::Method(..) => {
1322 let trait_span = tcx.hir.span_if_local(ty_trait_item.def_id);
1323 if ty_trait_item.kind == ty::AssociatedKind::Method {
1324 compare_impl_method(tcx,
1325 &ty_impl_item,
1326 impl_item.span,
1327 &ty_trait_item,
1328 impl_trait_ref,
1329 trait_span);
1330 } else {
1331 let mut err = struct_span_err!(tcx.sess, impl_item.span, E0324,
1332 "item `{}` is an associated method, \
1333 which doesn't match its trait `{}`",
1334 ty_impl_item.name,
1335 impl_trait_ref);
1336 err.span_label(impl_item.span, "does not match trait");
1337 if let Some(trait_span) = tcx.hir.span_if_local(ty_trait_item.def_id) {
1338 err.span_label(trait_span, "item in trait");
1339 }
1340 err.emit()
1341 }
1342 }
1343 hir::ImplItemKind::Type(_) => {
1344 if ty_trait_item.kind == ty::AssociatedKind::Type {
1345 if ty_trait_item.defaultness.has_value() {
1346 overridden_associated_type = Some(impl_item);
1347 }
1348 } else {
1349 let mut err = struct_span_err!(tcx.sess, impl_item.span, E0325,
1350 "item `{}` is an associated type, \
1351 which doesn't match its trait `{}`",
1352 ty_impl_item.name,
1353 impl_trait_ref);
1354 err.span_label(impl_item.span, "does not match trait");
1355 if let Some(trait_span) = tcx.hir.span_if_local(ty_trait_item.def_id) {
1356 err.span_label(trait_span, "item in trait");
1357 }
1358 err.emit()
1359 }
1360 }
1361 }
1362
1363 check_specialization_validity(tcx, trait_def, &ty_trait_item, impl_id, impl_item);
1364 }
1365 }
1366
1367 // Check for missing items from trait
1368 let mut missing_items = Vec::new();
1369 let mut invalidated_items = Vec::new();
1370 let associated_type_overridden = overridden_associated_type.is_some();
1371 for trait_item in tcx.associated_items(impl_trait_ref.def_id) {
1372 let is_implemented = trait_def.ancestors(tcx, impl_id)
1373 .defs(tcx, trait_item.name, trait_item.kind, impl_trait_ref.def_id)
1374 .next()
1375 .map(|node_item| !node_item.node.is_from_trait())
1376 .unwrap_or(false);
1377
1378 if !is_implemented {
1379 if !trait_item.defaultness.has_value() {
1380 missing_items.push(trait_item);
1381 } else if associated_type_overridden {
1382 invalidated_items.push(trait_item.name);
1383 }
1384 }
1385 }
1386
1387 if !missing_items.is_empty() {
1388 let mut err = struct_span_err!(tcx.sess, impl_span, E0046,
1389 "not all trait items implemented, missing: `{}`",
1390 missing_items.iter()
1391 .map(|trait_item| trait_item.name.to_string())
1392 .collect::<Vec<_>>().join("`, `"));
1393 err.span_label(impl_span, format!("missing `{}` in implementation",
1394 missing_items.iter()
1395 .map(|trait_item| trait_item.name.to_string())
1396 .collect::<Vec<_>>().join("`, `")));
1397 for trait_item in missing_items {
1398 if let Some(span) = tcx.hir.span_if_local(trait_item.def_id) {
1399 err.span_label(span, format!("`{}` from trait", trait_item.name));
1400 } else {
1401 err.note_trait_signature(trait_item.name.to_string(),
1402 trait_item.signature(&tcx));
1403 }
1404 }
1405 err.emit();
1406 }
1407
1408 if !invalidated_items.is_empty() {
1409 let invalidator = overridden_associated_type.unwrap();
1410 span_err!(tcx.sess, invalidator.span, E0399,
1411 "the following trait items need to be reimplemented \
1412 as `{}` was overridden: `{}`",
1413 invalidator.name,
1414 invalidated_items.iter()
1415 .map(|name| name.to_string())
1416 .collect::<Vec<_>>().join("`, `"))
1417 }
1418 }
1419
1420 /// Checks whether a type can be represented in memory. In particular, it
1421 /// identifies types that contain themselves without indirection through a
1422 /// pointer, which would mean their size is unbounded.
1423 fn check_representable<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
1424 sp: Span,
1425 item_def_id: DefId)
1426 -> bool {
1427 let rty = tcx.type_of(item_def_id);
1428
1429 // Check that it is possible to represent this type. This call identifies
1430 // (1) types that contain themselves and (2) types that contain a different
1431 // recursive type. It is only necessary to throw an error on those that
1432 // contain themselves. For case 2, there must be an inner type that will be
1433 // caught by case 1.
1434 match rty.is_representable(tcx, sp) {
1435 Representability::SelfRecursive(spans) => {
1436 let mut err = tcx.recursive_type_with_infinite_size_error(item_def_id);
1437 for span in spans {
1438 err.span_label(span, "recursive without indirection");
1439 }
1440 err.emit();
1441 return false
1442 }
1443 Representability::Representable | Representability::ContainsRecursive => (),
1444 }
1445 return true
1446 }
1447
1448 pub fn check_simd<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, sp: Span, def_id: DefId) {
1449 let t = tcx.type_of(def_id);
1450 match t.sty {
1451 ty::TyAdt(def, substs) if def.is_struct() => {
1452 let fields = &def.struct_variant().fields;
1453 if fields.is_empty() {
1454 span_err!(tcx.sess, sp, E0075, "SIMD vector cannot be empty");
1455 return;
1456 }
1457 let e = fields[0].ty(tcx, substs);
1458 if !fields.iter().all(|f| f.ty(tcx, substs) == e) {
1459 struct_span_err!(tcx.sess, sp, E0076, "SIMD vector should be homogeneous")
1460 .span_label(sp, "SIMD elements must have the same type")
1461 .emit();
1462 return;
1463 }
1464 match e.sty {
1465 ty::TyParam(_) => { /* struct<T>(T, T, T, T) is ok */ }
1466 _ if e.is_machine() => { /* struct(u8, u8, u8, u8) is ok */ }
1467 _ => {
1468 span_err!(tcx.sess, sp, E0077,
1469 "SIMD vector element type should be machine type");
1470 return;
1471 }
1472 }
1473 }
1474 _ => ()
1475 }
1476 }
1477
1478 fn check_packed<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, sp: Span, def_id: DefId) {
1479 if tcx.adt_def(def_id).repr.packed() {
1480 if tcx.adt_def(def_id).repr.align > 0 {
1481 struct_span_err!(tcx.sess, sp, E0587,
1482 "type has conflicting packed and align representation hints").emit();
1483 }
1484 else if check_packed_inner(tcx, def_id, &mut Vec::new()) {
1485 struct_span_err!(tcx.sess, sp, E0588,
1486 "packed type cannot transitively contain a `[repr(align)]` type").emit();
1487 }
1488 }
1489 }
1490
1491 fn check_packed_inner<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
1492 def_id: DefId,
1493 stack: &mut Vec<DefId>) -> bool {
1494 let t = tcx.type_of(def_id);
1495 if stack.contains(&def_id) {
1496 debug!("check_packed_inner: {:?} is recursive", t);
1497 return false;
1498 }
1499 match t.sty {
1500 ty::TyAdt(def, substs) if def.is_struct() || def.is_union() => {
1501 if tcx.adt_def(def.did).repr.align > 0 {
1502 return true;
1503 }
1504 // push struct def_id before checking fields
1505 stack.push(def_id);
1506 for field in &def.struct_variant().fields {
1507 let f = field.ty(tcx, substs);
1508 match f.sty {
1509 ty::TyAdt(def, _) => {
1510 if check_packed_inner(tcx, def.did, stack) {
1511 return true;
1512 }
1513 }
1514 _ => ()
1515 }
1516 }
1517 // only need to pop if not early out
1518 stack.pop();
1519 }
1520 _ => ()
1521 }
1522 false
1523 }
1524
1525 #[allow(trivial_numeric_casts)]
1526 pub fn check_enum<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
1527 sp: Span,
1528 vs: &'tcx [hir::Variant],
1529 id: ast::NodeId) {
1530 let def_id = tcx.hir.local_def_id(id);
1531 let def = tcx.adt_def(def_id);
1532 def.destructor(tcx); // force the destructor to be evaluated
1533
1534 if vs.is_empty() {
1535 let attributes = tcx.get_attrs(def_id);
1536 if let Some(attr) = attr::find_by_name(&attributes, "repr") {
1537 struct_span_err!(
1538 tcx.sess, attr.span, E0084,
1539 "unsupported representation for zero-variant enum")
1540 .span_label(sp, "zero-variant enum")
1541 .emit();
1542 }
1543 }
1544
1545 let repr_type_ty = def.repr.discr_type().to_ty(tcx);
1546 if repr_type_ty == tcx.types.i128 || repr_type_ty == tcx.types.u128 {
1547 if !tcx.sess.features.borrow().repr128 {
1548 emit_feature_err(&tcx.sess.parse_sess,
1549 "repr128",
1550 sp,
1551 GateIssue::Language,
1552 "repr with 128-bit type is unstable");
1553 }
1554 }
1555
1556 for v in vs {
1557 if let Some(e) = v.node.disr_expr {
1558 tcx.typeck_tables_of(tcx.hir.local_def_id(e.node_id));
1559 }
1560 }
1561
1562 let mut disr_vals: Vec<ConstInt> = Vec::new();
1563 for (discr, v) in def.discriminants(tcx).zip(vs) {
1564 // Check for duplicate discriminant values
1565 if let Some(i) = disr_vals.iter().position(|&x| x == discr) {
1566 let variant_i_node_id = tcx.hir.as_local_node_id(def.variants[i].did).unwrap();
1567 let variant_i = tcx.hir.expect_variant(variant_i_node_id);
1568 let i_span = match variant_i.node.disr_expr {
1569 Some(expr) => tcx.hir.span(expr.node_id),
1570 None => tcx.hir.span(variant_i_node_id)
1571 };
1572 let span = match v.node.disr_expr {
1573 Some(expr) => tcx.hir.span(expr.node_id),
1574 None => v.span
1575 };
1576 struct_span_err!(tcx.sess, span, E0081,
1577 "discriminant value `{}` already exists", disr_vals[i])
1578 .span_label(i_span, format!("first use of `{}`", disr_vals[i]))
1579 .span_label(span , format!("enum already has `{}`", disr_vals[i]))
1580 .emit();
1581 }
1582 disr_vals.push(discr);
1583 }
1584
1585 check_representable(tcx, sp, def_id);
1586 }
1587
1588 impl<'a, 'gcx, 'tcx> AstConv<'gcx, 'tcx> for FnCtxt<'a, 'gcx, 'tcx> {
1589 fn tcx<'b>(&'b self) -> TyCtxt<'b, 'gcx, 'tcx> { self.tcx }
1590
1591 fn get_type_parameter_bounds(&self, _: Span, def_id: DefId)
1592 -> ty::GenericPredicates<'tcx>
1593 {
1594 let tcx = self.tcx;
1595 let node_id = tcx.hir.as_local_node_id(def_id).unwrap();
1596 let item_id = tcx.hir.ty_param_owner(node_id);
1597 let item_def_id = tcx.hir.local_def_id(item_id);
1598 let generics = tcx.generics_of(item_def_id);
1599 let index = generics.type_param_to_index[&def_id.index];
1600 ty::GenericPredicates {
1601 parent: None,
1602 predicates: self.param_env.caller_bounds.iter().filter(|predicate| {
1603 match **predicate {
1604 ty::Predicate::Trait(ref data) => {
1605 data.0.self_ty().is_param(index)
1606 }
1607 _ => false
1608 }
1609 }).cloned().collect()
1610 }
1611 }
1612
1613 fn re_infer(&self, span: Span, def: Option<&ty::RegionParameterDef>)
1614 -> Option<ty::Region<'tcx>> {
1615 let v = match def {
1616 Some(def) => infer::EarlyBoundRegion(span, def.name),
1617 None => infer::MiscVariable(span)
1618 };
1619 Some(self.next_region_var(v))
1620 }
1621
1622 fn ty_infer(&self, span: Span) -> Ty<'tcx> {
1623 self.next_ty_var(TypeVariableOrigin::TypeInference(span))
1624 }
1625
1626 fn ty_infer_for_def(&self,
1627 ty_param_def: &ty::TypeParameterDef,
1628 substs: &[Kind<'tcx>],
1629 span: Span) -> Ty<'tcx> {
1630 self.type_var_for_def(span, ty_param_def, substs)
1631 }
1632
1633 fn projected_ty_from_poly_trait_ref(&self,
1634 span: Span,
1635 item_def_id: DefId,
1636 poly_trait_ref: ty::PolyTraitRef<'tcx>)
1637 -> Ty<'tcx>
1638 {
1639 let (trait_ref, _) =
1640 self.replace_late_bound_regions_with_fresh_var(
1641 span,
1642 infer::LateBoundRegionConversionTime::AssocTypeProjection(item_def_id),
1643 &poly_trait_ref);
1644
1645 self.tcx().mk_projection(item_def_id, trait_ref.substs)
1646 }
1647
1648 fn normalize_ty(&self, span: Span, ty: Ty<'tcx>) -> Ty<'tcx> {
1649 if ty.has_escaping_regions() {
1650 ty // FIXME: normalization and escaping regions
1651 } else {
1652 self.normalize_associated_types_in(span, &ty)
1653 }
1654 }
1655
1656 fn set_tainted_by_errors(&self) {
1657 self.infcx.set_tainted_by_errors()
1658 }
1659
1660 fn record_ty(&self, hir_id: hir::HirId, ty: Ty<'tcx>, _span: Span) {
1661 self.write_ty(hir_id, ty)
1662 }
1663 }
1664
1665 /// Controls whether the arguments are tupled. This is used for the call
1666 /// operator.
1667 ///
1668 /// Tupling means that all call-side arguments are packed into a tuple and
1669 /// passed as a single parameter. For example, if tupling is enabled, this
1670 /// function:
1671 ///
1672 /// fn f(x: (isize, isize))
1673 ///
1674 /// Can be called as:
1675 ///
1676 /// f(1, 2);
1677 ///
1678 /// Instead of:
1679 ///
1680 /// f((1, 2));
1681 #[derive(Clone, Eq, PartialEq)]
1682 enum TupleArgumentsFlag {
1683 DontTupleArguments,
1684 TupleArguments,
1685 }
1686
1687 impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
1688 pub fn new(inh: &'a Inherited<'a, 'gcx, 'tcx>,
1689 param_env: ty::ParamEnv<'tcx>,
1690 body_id: ast::NodeId)
1691 -> FnCtxt<'a, 'gcx, 'tcx> {
1692 FnCtxt {
1693 body_id,
1694 param_env,
1695 err_count_on_creation: inh.tcx.sess.err_count(),
1696 ret_coercion: None,
1697 yield_ty: None,
1698 ps: RefCell::new(UnsafetyState::function(hir::Unsafety::Normal,
1699 ast::CRATE_NODE_ID)),
1700 diverges: Cell::new(Diverges::Maybe),
1701 has_errors: Cell::new(false),
1702 enclosing_breakables: RefCell::new(EnclosingBreakables {
1703 stack: Vec::new(),
1704 by_id: NodeMap(),
1705 }),
1706 inh,
1707 }
1708 }
1709
1710 pub fn sess(&self) -> &Session {
1711 &self.tcx.sess
1712 }
1713
1714 pub fn err_count_since_creation(&self) -> usize {
1715 self.tcx.sess.err_count() - self.err_count_on_creation
1716 }
1717
1718 /// Produce warning on the given node, if the current point in the
1719 /// function is unreachable, and there hasn't been another warning.
1720 fn warn_if_unreachable(&self, id: ast::NodeId, span: Span, kind: &str) {
1721 if self.diverges.get() == Diverges::Always {
1722 self.diverges.set(Diverges::WarnedAlways);
1723
1724 debug!("warn_if_unreachable: id={:?} span={:?} kind={}", id, span, kind);
1725
1726 self.tcx().lint_node(
1727 lint::builtin::UNREACHABLE_CODE,
1728 id, span,
1729 &format!("unreachable {}", kind));
1730 }
1731 }
1732
1733 pub fn cause(&self,
1734 span: Span,
1735 code: ObligationCauseCode<'tcx>)
1736 -> ObligationCause<'tcx> {
1737 ObligationCause::new(span, self.body_id, code)
1738 }
1739
1740 pub fn misc(&self, span: Span) -> ObligationCause<'tcx> {
1741 self.cause(span, ObligationCauseCode::MiscObligation)
1742 }
1743
1744 /// Resolves type variables in `ty` if possible. Unlike the infcx
1745 /// version (resolve_type_vars_if_possible), this version will
1746 /// also select obligations if it seems useful, in an effort
1747 /// to get more type information.
1748 fn resolve_type_vars_with_obligations(&self, mut ty: Ty<'tcx>) -> Ty<'tcx> {
1749 debug!("resolve_type_vars_with_obligations(ty={:?})", ty);
1750
1751 // No TyInfer()? Nothing needs doing.
1752 if !ty.has_infer_types() {
1753 debug!("resolve_type_vars_with_obligations: ty={:?}", ty);
1754 return ty;
1755 }
1756
1757 // If `ty` is a type variable, see whether we already know what it is.
1758 ty = self.resolve_type_vars_if_possible(&ty);
1759 if !ty.has_infer_types() {
1760 debug!("resolve_type_vars_with_obligations: ty={:?}", ty);
1761 return ty;
1762 }
1763
1764 // If not, try resolving pending obligations as much as
1765 // possible. This can help substantially when there are
1766 // indirect dependencies that don't seem worth tracking
1767 // precisely.
1768 self.select_obligations_where_possible();
1769 ty = self.resolve_type_vars_if_possible(&ty);
1770
1771 debug!("resolve_type_vars_with_obligations: ty={:?}", ty);
1772 ty
1773 }
1774
1775 fn record_deferred_call_resolution(&self,
1776 closure_def_id: DefId,
1777 r: DeferredCallResolution<'gcx, 'tcx>) {
1778 let mut deferred_call_resolutions = self.deferred_call_resolutions.borrow_mut();
1779 deferred_call_resolutions.entry(closure_def_id).or_insert(vec![]).push(r);
1780 }
1781
1782 fn remove_deferred_call_resolutions(&self,
1783 closure_def_id: DefId)
1784 -> Vec<DeferredCallResolution<'gcx, 'tcx>>
1785 {
1786 let mut deferred_call_resolutions = self.deferred_call_resolutions.borrow_mut();
1787 deferred_call_resolutions.remove(&closure_def_id).unwrap_or(vec![])
1788 }
1789
1790 pub fn tag(&self) -> String {
1791 let self_ptr: *const FnCtxt = self;
1792 format!("{:?}", self_ptr)
1793 }
1794
1795 pub fn local_ty(&self, span: Span, nid: ast::NodeId) -> Ty<'tcx> {
1796 match self.locals.borrow().get(&nid) {
1797 Some(&t) => t,
1798 None => {
1799 span_bug!(span, "no type for local variable {}",
1800 self.tcx.hir.node_to_string(nid));
1801 }
1802 }
1803 }
1804
1805 #[inline]
1806 pub fn write_ty(&self, id: hir::HirId, ty: Ty<'tcx>) {
1807 debug!("write_ty({:?}, {:?}) in fcx {}",
1808 id, self.resolve_type_vars_if_possible(&ty), self.tag());
1809 self.tables.borrow_mut().node_types_mut().insert(id, ty);
1810
1811 if ty.references_error() {
1812 self.has_errors.set(true);
1813 self.set_tainted_by_errors();
1814 }
1815 }
1816
1817 // The NodeId and the ItemLocalId must identify the same item. We just pass
1818 // both of them for consistency checking.
1819 pub fn write_method_call(&self,
1820 hir_id: hir::HirId,
1821 method: MethodCallee<'tcx>) {
1822 self.tables
1823 .borrow_mut()
1824 .type_dependent_defs_mut()
1825 .insert(hir_id, Def::Method(method.def_id));
1826 self.write_substs(hir_id, method.substs);
1827 }
1828
1829 pub fn write_substs(&self, node_id: hir::HirId, substs: &'tcx Substs<'tcx>) {
1830 if !substs.is_noop() {
1831 debug!("write_substs({:?}, {:?}) in fcx {}",
1832 node_id,
1833 substs,
1834 self.tag());
1835
1836 self.tables.borrow_mut().node_substs_mut().insert(node_id, substs);
1837 }
1838 }
1839
1840 pub fn apply_adjustments(&self, expr: &hir::Expr, adj: Vec<Adjustment<'tcx>>) {
1841 debug!("apply_adjustments(expr={:?}, adj={:?})", expr, adj);
1842
1843 if adj.is_empty() {
1844 return;
1845 }
1846
1847 match self.tables.borrow_mut().adjustments_mut().entry(expr.hir_id) {
1848 Entry::Vacant(entry) => { entry.insert(adj); },
1849 Entry::Occupied(mut entry) => {
1850 debug!(" - composing on top of {:?}", entry.get());
1851 match (&entry.get()[..], &adj[..]) {
1852 // Applying any adjustment on top of a NeverToAny
1853 // is a valid NeverToAny adjustment, because it can't
1854 // be reached.
1855 (&[Adjustment { kind: Adjust::NeverToAny, .. }], _) => return,
1856 (&[
1857 Adjustment { kind: Adjust::Deref(_), .. },
1858 Adjustment { kind: Adjust::Borrow(AutoBorrow::Ref(..)), .. },
1859 ], &[
1860 Adjustment { kind: Adjust::Deref(_), .. },
1861 .. // Any following adjustments are allowed.
1862 ]) => {
1863 // A reborrow has no effect before a dereference.
1864 }
1865 // FIXME: currently we never try to compose autoderefs
1866 // and ReifyFnPointer/UnsafeFnPointer, but we could.
1867 _ =>
1868 bug!("while adjusting {:?}, can't compose {:?} and {:?}",
1869 expr, entry.get(), adj)
1870 };
1871 *entry.get_mut() = adj;
1872 }
1873 }
1874 }
1875
1876 /// Basically whenever we are converting from a type scheme into
1877 /// the fn body space, we always want to normalize associated
1878 /// types as well. This function combines the two.
1879 fn instantiate_type_scheme<T>(&self,
1880 span: Span,
1881 substs: &Substs<'tcx>,
1882 value: &T)
1883 -> T
1884 where T : TypeFoldable<'tcx>
1885 {
1886 let value = value.subst(self.tcx, substs);
1887 let result = self.normalize_associated_types_in(span, &value);
1888 debug!("instantiate_type_scheme(value={:?}, substs={:?}) = {:?}",
1889 value,
1890 substs,
1891 result);
1892 result
1893 }
1894
1895 /// As `instantiate_type_scheme`, but for the bounds found in a
1896 /// generic type scheme.
1897 fn instantiate_bounds(&self, span: Span, def_id: DefId, substs: &Substs<'tcx>)
1898 -> ty::InstantiatedPredicates<'tcx> {
1899 let bounds = self.tcx.predicates_of(def_id);
1900 let result = bounds.instantiate(self.tcx, substs);
1901 let result = self.normalize_associated_types_in(span, &result);
1902 debug!("instantiate_bounds(bounds={:?}, substs={:?}) = {:?}",
1903 bounds,
1904 substs,
1905 result);
1906 result
1907 }
1908
1909 /// Replace all anonymized types with fresh inference variables
1910 /// and record them for writeback.
1911 fn instantiate_anon_types<T: TypeFoldable<'tcx>>(&self, value: &T) -> T {
1912 value.fold_with(&mut BottomUpFolder { tcx: self.tcx, fldop: |ty| {
1913 if let ty::TyAnon(def_id, substs) = ty.sty {
1914 // Use the same type variable if the exact same TyAnon appears more
1915 // than once in the return type (e.g. if it's passed to a type alias).
1916 let id = self.tcx.hir.as_local_node_id(def_id).unwrap();
1917 if let Some(ty_var) = self.anon_types.borrow().get(&id) {
1918 return ty_var;
1919 }
1920 let span = self.tcx.def_span(def_id);
1921 let ty_var = self.next_ty_var(TypeVariableOrigin::TypeInference(span));
1922 self.anon_types.borrow_mut().insert(id, ty_var);
1923
1924 let predicates_of = self.tcx.predicates_of(def_id);
1925 let bounds = predicates_of.instantiate(self.tcx, substs);
1926
1927 for predicate in bounds.predicates {
1928 // Change the predicate to refer to the type variable,
1929 // which will be the concrete type, instead of the TyAnon.
1930 // This also instantiates nested `impl Trait`.
1931 let predicate = self.instantiate_anon_types(&predicate);
1932
1933 // Require that the predicate holds for the concrete type.
1934 let cause = traits::ObligationCause::new(span, self.body_id,
1935 traits::SizedReturnType);
1936 self.register_predicate(traits::Obligation::new(cause,
1937 self.param_env,
1938 predicate));
1939 }
1940
1941 ty_var
1942 } else {
1943 ty
1944 }
1945 }})
1946 }
1947
1948 fn normalize_associated_types_in<T>(&self, span: Span, value: &T) -> T
1949 where T : TypeFoldable<'tcx>
1950 {
1951 self.inh.normalize_associated_types_in(span, self.body_id, self.param_env, value)
1952 }
1953
1954 fn normalize_associated_types_in_as_infer_ok<T>(&self, span: Span, value: &T)
1955 -> InferOk<'tcx, T>
1956 where T : TypeFoldable<'tcx>
1957 {
1958 self.inh.partially_normalize_associated_types_in(span,
1959 self.body_id,
1960 self.param_env,
1961 value)
1962 }
1963
1964 pub fn require_type_meets(&self,
1965 ty: Ty<'tcx>,
1966 span: Span,
1967 code: traits::ObligationCauseCode<'tcx>,
1968 def_id: DefId)
1969 {
1970 self.register_bound(
1971 ty,
1972 def_id,
1973 traits::ObligationCause::new(span, self.body_id, code));
1974 }
1975
1976 pub fn require_type_is_sized(&self,
1977 ty: Ty<'tcx>,
1978 span: Span,
1979 code: traits::ObligationCauseCode<'tcx>)
1980 {
1981 let lang_item = self.tcx.require_lang_item(lang_items::SizedTraitLangItem);
1982 self.require_type_meets(ty, span, code, lang_item);
1983 }
1984
1985 pub fn register_bound(&self,
1986 ty: Ty<'tcx>,
1987 def_id: DefId,
1988 cause: traits::ObligationCause<'tcx>)
1989 {
1990 self.fulfillment_cx.borrow_mut()
1991 .register_bound(self, self.param_env, ty, def_id, cause);
1992 }
1993
1994 pub fn to_ty(&self, ast_t: &hir::Ty) -> Ty<'tcx> {
1995 let t = AstConv::ast_ty_to_ty(self, ast_t);
1996 self.register_wf_obligation(t, ast_t.span, traits::MiscObligation);
1997 t
1998 }
1999
2000 pub fn node_ty(&self, id: hir::HirId) -> Ty<'tcx> {
2001 match self.tables.borrow().node_types().get(id) {
2002 Some(&t) => t,
2003 None if self.is_tainted_by_errors() => self.tcx.types.err,
2004 None => {
2005 let node_id = self.tcx.hir.definitions().find_node_for_hir_id(id);
2006 bug!("no type for node {}: {} in fcx {}",
2007 node_id, self.tcx.hir.node_to_string(node_id),
2008 self.tag());
2009 }
2010 }
2011 }
2012
2013 /// Registers an obligation for checking later, during regionck, that the type `ty` must
2014 /// outlive the region `r`.
2015 pub fn register_wf_obligation(&self,
2016 ty: Ty<'tcx>,
2017 span: Span,
2018 code: traits::ObligationCauseCode<'tcx>)
2019 {
2020 // WF obligations never themselves fail, so no real need to give a detailed cause:
2021 let cause = traits::ObligationCause::new(span, self.body_id, code);
2022 self.register_predicate(traits::Obligation::new(cause,
2023 self.param_env,
2024 ty::Predicate::WellFormed(ty)));
2025 }
2026
2027 /// Registers obligations that all types appearing in `substs` are well-formed.
2028 pub fn add_wf_bounds(&self, substs: &Substs<'tcx>, expr: &hir::Expr)
2029 {
2030 for ty in substs.types() {
2031 self.register_wf_obligation(ty, expr.span, traits::MiscObligation);
2032 }
2033 }
2034
2035 /// Given a fully substituted set of bounds (`generic_bounds`), and the values with which each
2036 /// type/region parameter was instantiated (`substs`), creates and registers suitable
2037 /// trait/region obligations.
2038 ///
2039 /// For example, if there is a function:
2040 ///
2041 /// ```
2042 /// fn foo<'a,T:'a>(...)
2043 /// ```
2044 ///
2045 /// and a reference:
2046 ///
2047 /// ```
2048 /// let f = foo;
2049 /// ```
2050 ///
2051 /// Then we will create a fresh region variable `'$0` and a fresh type variable `$1` for `'a`
2052 /// and `T`. This routine will add a region obligation `$1:'$0` and register it locally.
2053 pub fn add_obligations_for_parameters(&self,
2054 cause: traits::ObligationCause<'tcx>,
2055 predicates: &ty::InstantiatedPredicates<'tcx>)
2056 {
2057 assert!(!predicates.has_escaping_regions());
2058
2059 debug!("add_obligations_for_parameters(predicates={:?})",
2060 predicates);
2061
2062 for obligation in traits::predicates_for_generics(cause, self.param_env, predicates) {
2063 self.register_predicate(obligation);
2064 }
2065 }
2066
2067 // FIXME(arielb1): use this instead of field.ty everywhere
2068 // Only for fields! Returns <none> for methods>
2069 // Indifferent to privacy flags
2070 pub fn field_ty(&self,
2071 span: Span,
2072 field: &'tcx ty::FieldDef,
2073 substs: &Substs<'tcx>)
2074 -> Ty<'tcx>
2075 {
2076 self.normalize_associated_types_in(span,
2077 &field.ty(self.tcx, substs))
2078 }
2079
2080 fn check_casts(&self) {
2081 let mut deferred_cast_checks = self.deferred_cast_checks.borrow_mut();
2082 for cast in deferred_cast_checks.drain(..) {
2083 cast.check(self);
2084 }
2085 }
2086
2087 fn resolve_generator_interiors(&self, def_id: DefId) {
2088 let mut deferred_generator_interiors = self.deferred_generator_interiors.borrow_mut();
2089 for (body_id, witness) in deferred_generator_interiors.drain(..) {
2090 generator_interior::resolve_interior(self, def_id, body_id, witness);
2091 }
2092 }
2093
2094 /// Apply "fallbacks" to some types
2095 /// unconstrained types get replaced with ! or () (depending on whether
2096 /// feature(never_type) is enabled), unconstrained ints with i32, and
2097 /// unconstrained floats with f64.
2098 fn default_type_parameters(&self) {
2099 use rustc::ty::error::UnconstrainedNumeric::Neither;
2100 use rustc::ty::error::UnconstrainedNumeric::{UnconstrainedInt, UnconstrainedFloat};
2101
2102 // Defaulting inference variables becomes very dubious if we have
2103 // encountered type-checking errors. Therefore, if we think we saw
2104 // some errors in this function, just resolve all uninstanted type
2105 // varibles to TyError.
2106 if self.is_tainted_by_errors() {
2107 for ty in &self.unsolved_variables() {
2108 if let ty::TyInfer(_) = self.shallow_resolve(ty).sty {
2109 debug!("default_type_parameters: defaulting `{:?}` to error", ty);
2110 self.demand_eqtype(syntax_pos::DUMMY_SP, *ty, self.tcx().types.err);
2111 }
2112 }
2113 return;
2114 }
2115
2116 for ty in &self.unsolved_variables() {
2117 let resolved = self.resolve_type_vars_if_possible(ty);
2118 if self.type_var_diverges(resolved) {
2119 debug!("default_type_parameters: defaulting `{:?}` to `!` because it diverges",
2120 resolved);
2121 self.demand_eqtype(syntax_pos::DUMMY_SP, *ty,
2122 self.tcx.mk_diverging_default());
2123 } else {
2124 match self.type_is_unconstrained_numeric(resolved) {
2125 UnconstrainedInt => {
2126 debug!("default_type_parameters: defaulting `{:?}` to `i32`",
2127 resolved);
2128 self.demand_eqtype(syntax_pos::DUMMY_SP, *ty, self.tcx.types.i32)
2129 },
2130 UnconstrainedFloat => {
2131 debug!("default_type_parameters: defaulting `{:?}` to `f32`",
2132 resolved);
2133 self.demand_eqtype(syntax_pos::DUMMY_SP, *ty, self.tcx.types.f64)
2134 }
2135 Neither => { }
2136 }
2137 }
2138 }
2139 }
2140
2141 // Implements type inference fallback algorithm
2142 fn select_all_obligations_and_apply_defaults(&self) {
2143 self.select_obligations_where_possible();
2144 self.default_type_parameters();
2145 self.select_obligations_where_possible();
2146 }
2147
2148 fn select_all_obligations_or_error(&self) {
2149 debug!("select_all_obligations_or_error");
2150
2151 // upvar inference should have ensured that all deferred call
2152 // resolutions are handled by now.
2153 assert!(self.deferred_call_resolutions.borrow().is_empty());
2154
2155 self.select_all_obligations_and_apply_defaults();
2156
2157 let mut fulfillment_cx = self.fulfillment_cx.borrow_mut();
2158
2159 match fulfillment_cx.select_all_or_error(self) {
2160 Ok(()) => { }
2161 Err(errors) => { self.report_fulfillment_errors(&errors, self.inh.body_id); }
2162 }
2163 }
2164
2165 /// Select as many obligations as we can at present.
2166 fn select_obligations_where_possible(&self) {
2167 match self.fulfillment_cx.borrow_mut().select_where_possible(self) {
2168 Ok(()) => { }
2169 Err(errors) => { self.report_fulfillment_errors(&errors, self.inh.body_id); }
2170 }
2171 }
2172
2173 /// For the overloaded lvalue expressions (`*x`, `x[3]`), the trait
2174 /// returns a type of `&T`, but the actual type we assign to the
2175 /// *expression* is `T`. So this function just peels off the return
2176 /// type by one layer to yield `T`.
2177 fn make_overloaded_lvalue_return_type(&self,
2178 method: MethodCallee<'tcx>)
2179 -> ty::TypeAndMut<'tcx>
2180 {
2181 // extract method return type, which will be &T;
2182 let ret_ty = method.sig.output();
2183
2184 // method returns &T, but the type as visible to user is T, so deref
2185 ret_ty.builtin_deref(true, NoPreference).unwrap()
2186 }
2187
2188 fn lookup_indexing(&self,
2189 expr: &hir::Expr,
2190 base_expr: &'gcx hir::Expr,
2191 base_ty: Ty<'tcx>,
2192 idx_ty: Ty<'tcx>,
2193 lvalue_pref: LvaluePreference)
2194 -> Option<(/*index type*/ Ty<'tcx>, /*element type*/ Ty<'tcx>)>
2195 {
2196 // FIXME(#18741) -- this is almost but not quite the same as the
2197 // autoderef that normal method probing does. They could likely be
2198 // consolidated.
2199
2200 let mut autoderef = self.autoderef(base_expr.span, base_ty);
2201 let mut result = None;
2202 while result.is_none() && autoderef.next().is_some() {
2203 result = self.try_index_step(expr, base_expr, &autoderef, lvalue_pref, idx_ty);
2204 }
2205 autoderef.finalize();
2206 result
2207 }
2208
2209 /// To type-check `base_expr[index_expr]`, we progressively autoderef
2210 /// (and otherwise adjust) `base_expr`, looking for a type which either
2211 /// supports builtin indexing or overloaded indexing.
2212 /// This loop implements one step in that search; the autoderef loop
2213 /// is implemented by `lookup_indexing`.
2214 fn try_index_step(&self,
2215 expr: &hir::Expr,
2216 base_expr: &hir::Expr,
2217 autoderef: &Autoderef<'a, 'gcx, 'tcx>,
2218 lvalue_pref: LvaluePreference,
2219 index_ty: Ty<'tcx>)
2220 -> Option<(/*index type*/ Ty<'tcx>, /*element type*/ Ty<'tcx>)>
2221 {
2222 let adjusted_ty = autoderef.unambiguous_final_ty();
2223 debug!("try_index_step(expr={:?}, base_expr={:?}, adjusted_ty={:?}, \
2224 index_ty={:?})",
2225 expr,
2226 base_expr,
2227 adjusted_ty,
2228 index_ty);
2229
2230 // First, try built-in indexing.
2231 match (adjusted_ty.builtin_index(), &index_ty.sty) {
2232 (Some(ty), &ty::TyUint(ast::UintTy::Us)) | (Some(ty), &ty::TyInfer(ty::IntVar(_))) => {
2233 debug!("try_index_step: success, using built-in indexing");
2234 let adjustments = autoderef.adjust_steps(lvalue_pref);
2235 self.apply_adjustments(base_expr, adjustments);
2236 return Some((self.tcx.types.usize, ty));
2237 }
2238 _ => {}
2239 }
2240
2241 for &unsize in &[false, true] {
2242 let mut self_ty = adjusted_ty;
2243 if unsize {
2244 // We only unsize arrays here.
2245 if let ty::TyArray(element_ty, _) = adjusted_ty.sty {
2246 self_ty = self.tcx.mk_slice(element_ty);
2247 } else {
2248 continue;
2249 }
2250 }
2251
2252 // If some lookup succeeds, write callee into table and extract index/element
2253 // type from the method signature.
2254 // If some lookup succeeded, install method in table
2255 let input_ty = self.next_ty_var(TypeVariableOrigin::AutoDeref(base_expr.span));
2256 let method = self.try_overloaded_lvalue_op(
2257 expr.span, self_ty, &[input_ty], lvalue_pref, LvalueOp::Index);
2258
2259 let result = method.map(|ok| {
2260 debug!("try_index_step: success, using overloaded indexing");
2261 let method = self.register_infer_ok_obligations(ok);
2262
2263 let mut adjustments = autoderef.adjust_steps(lvalue_pref);
2264 if let ty::TyRef(region, mt) = method.sig.inputs()[0].sty {
2265 adjustments.push(Adjustment {
2266 kind: Adjust::Borrow(AutoBorrow::Ref(region, mt.mutbl)),
2267 target: self.tcx.mk_ref(region, ty::TypeAndMut {
2268 mutbl: mt.mutbl,
2269 ty: adjusted_ty
2270 })
2271 });
2272 }
2273 if unsize {
2274 adjustments.push(Adjustment {
2275 kind: Adjust::Unsize,
2276 target: method.sig.inputs()[0]
2277 });
2278 }
2279 self.apply_adjustments(base_expr, adjustments);
2280
2281 self.write_method_call(expr.hir_id, method);
2282 (input_ty, self.make_overloaded_lvalue_return_type(method).ty)
2283 });
2284 if result.is_some() {
2285 return result;
2286 }
2287 }
2288
2289 None
2290 }
2291
2292 fn resolve_lvalue_op(&self, op: LvalueOp, is_mut: bool) -> (Option<DefId>, Symbol) {
2293 let (tr, name) = match (op, is_mut) {
2294 (LvalueOp::Deref, false) =>
2295 (self.tcx.lang_items().deref_trait(), "deref"),
2296 (LvalueOp::Deref, true) =>
2297 (self.tcx.lang_items().deref_mut_trait(), "deref_mut"),
2298 (LvalueOp::Index, false) =>
2299 (self.tcx.lang_items().index_trait(), "index"),
2300 (LvalueOp::Index, true) =>
2301 (self.tcx.lang_items().index_mut_trait(), "index_mut"),
2302 };
2303 (tr, Symbol::intern(name))
2304 }
2305
2306 fn try_overloaded_lvalue_op(&self,
2307 span: Span,
2308 base_ty: Ty<'tcx>,
2309 arg_tys: &[Ty<'tcx>],
2310 lvalue_pref: LvaluePreference,
2311 op: LvalueOp)
2312 -> Option<InferOk<'tcx, MethodCallee<'tcx>>>
2313 {
2314 debug!("try_overloaded_lvalue_op({:?},{:?},{:?},{:?})",
2315 span,
2316 base_ty,
2317 lvalue_pref,
2318 op);
2319
2320 // Try Mut first, if preferred.
2321 let (mut_tr, mut_op) = self.resolve_lvalue_op(op, true);
2322 let method = match (lvalue_pref, mut_tr) {
2323 (PreferMutLvalue, Some(trait_did)) => {
2324 self.lookup_method_in_trait(span, mut_op, trait_did, base_ty, Some(arg_tys))
2325 }
2326 _ => None,
2327 };
2328
2329 // Otherwise, fall back to the immutable version.
2330 let (imm_tr, imm_op) = self.resolve_lvalue_op(op, false);
2331 let method = match (method, imm_tr) {
2332 (None, Some(trait_did)) => {
2333 self.lookup_method_in_trait(span, imm_op, trait_did, base_ty, Some(arg_tys))
2334 }
2335 (method, _) => method,
2336 };
2337
2338 method
2339 }
2340
2341 fn check_method_argument_types(&self,
2342 sp: Span,
2343 expr_sp: Span,
2344 method: Result<MethodCallee<'tcx>, ()>,
2345 args_no_rcvr: &'gcx [hir::Expr],
2346 tuple_arguments: TupleArgumentsFlag,
2347 expected: Expectation<'tcx>)
2348 -> Ty<'tcx> {
2349 let has_error = match method {
2350 Ok(method) => {
2351 method.substs.references_error() || method.sig.references_error()
2352 }
2353 Err(_) => true
2354 };
2355 if has_error {
2356 let err_inputs = self.err_args(args_no_rcvr.len());
2357
2358 let err_inputs = match tuple_arguments {
2359 DontTupleArguments => err_inputs,
2360 TupleArguments => vec![self.tcx.intern_tup(&err_inputs[..], false)],
2361 };
2362
2363 self.check_argument_types(sp, expr_sp, &err_inputs[..], &[], args_no_rcvr,
2364 false, tuple_arguments, None);
2365 return self.tcx.types.err;
2366 }
2367
2368 let method = method.unwrap();
2369 // HACK(eddyb) ignore self in the definition (see above).
2370 let expected_arg_tys = self.expected_inputs_for_expected_output(
2371 sp,
2372 expected,
2373 method.sig.output(),
2374 &method.sig.inputs()[1..]
2375 );
2376 self.check_argument_types(sp, expr_sp, &method.sig.inputs()[1..], &expected_arg_tys[..],
2377 args_no_rcvr, method.sig.variadic, tuple_arguments,
2378 self.tcx.hir.span_if_local(method.def_id));
2379 method.sig.output()
2380 }
2381
2382 /// Generic function that factors out common logic from function calls,
2383 /// method calls and overloaded operators.
2384 fn check_argument_types(&self,
2385 sp: Span,
2386 expr_sp: Span,
2387 fn_inputs: &[Ty<'tcx>],
2388 expected_arg_tys: &[Ty<'tcx>],
2389 args: &'gcx [hir::Expr],
2390 variadic: bool,
2391 tuple_arguments: TupleArgumentsFlag,
2392 def_span: Option<Span>) {
2393 let tcx = self.tcx;
2394
2395 // Grab the argument types, supplying fresh type variables
2396 // if the wrong number of arguments were supplied
2397 let supplied_arg_count = if tuple_arguments == DontTupleArguments {
2398 args.len()
2399 } else {
2400 1
2401 };
2402
2403 // All the input types from the fn signature must outlive the call
2404 // so as to validate implied bounds.
2405 for &fn_input_ty in fn_inputs {
2406 self.register_wf_obligation(fn_input_ty, sp, traits::MiscObligation);
2407 }
2408
2409 let mut expected_arg_tys = expected_arg_tys;
2410 let expected_arg_count = fn_inputs.len();
2411
2412 let sp_args = if args.len() > 0 {
2413 let (first, args) = args.split_at(1);
2414 let mut sp_tmp = first[0].span;
2415 for arg in args {
2416 let sp_opt = self.sess().codemap().merge_spans(sp_tmp, arg.span);
2417 if ! sp_opt.is_some() {
2418 break;
2419 }
2420 sp_tmp = sp_opt.unwrap();
2421 };
2422 sp_tmp
2423 } else {
2424 sp
2425 };
2426
2427 fn parameter_count_error<'tcx>(sess: &Session,
2428 sp: Span,
2429 expr_sp: Span,
2430 expected_count: usize,
2431 arg_count: usize,
2432 error_code: &str,
2433 variadic: bool,
2434 def_span: Option<Span>,
2435 sugg_unit: bool) {
2436 let mut err = sess.struct_span_err_with_code(sp,
2437 &format!("this function takes {}{} parameter{} but {} parameter{} supplied",
2438 if variadic {"at least "} else {""},
2439 expected_count,
2440 if expected_count == 1 {""} else {"s"},
2441 arg_count,
2442 if arg_count == 1 {" was"} else {"s were"}),
2443 DiagnosticId::Error(error_code.to_owned()));
2444
2445 if let Some(def_s) = def_span {
2446 err.span_label(def_s, "defined here");
2447 }
2448 if sugg_unit {
2449 let sugg_span = expr_sp.end_point();
2450 // remove closing `)` from the span
2451 let sugg_span = sugg_span.with_hi(sugg_span.lo());
2452 err.span_suggestion(
2453 sugg_span,
2454 "expected the unit value `()`; create it with empty parentheses",
2455 String::from("()"));
2456 } else {
2457 err.span_label(sp, format!("expected {}{} parameter{}",
2458 if variadic {"at least "} else {""},
2459 expected_count,
2460 if expected_count == 1 {""} else {"s"}));
2461 }
2462 err.emit();
2463 }
2464
2465 let formal_tys = if tuple_arguments == TupleArguments {
2466 let tuple_type = self.structurally_resolved_type(sp, fn_inputs[0]);
2467 match tuple_type.sty {
2468 ty::TyTuple(arg_types, _) if arg_types.len() != args.len() => {
2469 parameter_count_error(tcx.sess, sp_args, expr_sp, arg_types.len(), args.len(),
2470 "E0057", false, def_span, false);
2471 expected_arg_tys = &[];
2472 self.err_args(args.len())
2473 }
2474 ty::TyTuple(arg_types, _) => {
2475 expected_arg_tys = match expected_arg_tys.get(0) {
2476 Some(&ty) => match ty.sty {
2477 ty::TyTuple(ref tys, _) => &tys,
2478 _ => &[]
2479 },
2480 None => &[]
2481 };
2482 arg_types.to_vec()
2483 }
2484 _ => {
2485 span_err!(tcx.sess, sp, E0059,
2486 "cannot use call notation; the first type parameter \
2487 for the function trait is neither a tuple nor unit");
2488 expected_arg_tys = &[];
2489 self.err_args(args.len())
2490 }
2491 }
2492 } else if expected_arg_count == supplied_arg_count {
2493 fn_inputs.to_vec()
2494 } else if variadic {
2495 if supplied_arg_count >= expected_arg_count {
2496 fn_inputs.to_vec()
2497 } else {
2498 parameter_count_error(tcx.sess, sp_args, expr_sp, expected_arg_count,
2499 supplied_arg_count, "E0060", true, def_span, false);
2500 expected_arg_tys = &[];
2501 self.err_args(supplied_arg_count)
2502 }
2503 } else {
2504 // is the missing argument of type `()`?
2505 let sugg_unit = if expected_arg_tys.len() == 1 && supplied_arg_count == 0 {
2506 self.resolve_type_vars_if_possible(&expected_arg_tys[0]).is_nil()
2507 } else if fn_inputs.len() == 1 && supplied_arg_count == 0 {
2508 self.resolve_type_vars_if_possible(&fn_inputs[0]).is_nil()
2509 } else {
2510 false
2511 };
2512 parameter_count_error(tcx.sess, sp_args, expr_sp, expected_arg_count,
2513 supplied_arg_count, "E0061", false, def_span, sugg_unit);
2514 expected_arg_tys = &[];
2515 self.err_args(supplied_arg_count)
2516 };
2517
2518 debug!("check_argument_types: formal_tys={:?}",
2519 formal_tys.iter().map(|t| self.ty_to_string(*t)).collect::<Vec<String>>());
2520
2521 // Check the arguments.
2522 // We do this in a pretty awful way: first we typecheck any arguments
2523 // that are not closures, then we typecheck the closures. This is so
2524 // that we have more information about the types of arguments when we
2525 // typecheck the functions. This isn't really the right way to do this.
2526 for &check_closures in &[false, true] {
2527 debug!("check_closures={}", check_closures);
2528
2529 // More awful hacks: before we check argument types, try to do
2530 // an "opportunistic" vtable resolution of any trait bounds on
2531 // the call. This helps coercions.
2532 if check_closures {
2533 self.select_obligations_where_possible();
2534 }
2535
2536 // For variadic functions, we don't have a declared type for all of
2537 // the arguments hence we only do our usual type checking with
2538 // the arguments who's types we do know.
2539 let t = if variadic {
2540 expected_arg_count
2541 } else if tuple_arguments == TupleArguments {
2542 args.len()
2543 } else {
2544 supplied_arg_count
2545 };
2546 for (i, arg) in args.iter().take(t).enumerate() {
2547 // Warn only for the first loop (the "no closures" one).
2548 // Closure arguments themselves can't be diverging, but
2549 // a previous argument can, e.g. `foo(panic!(), || {})`.
2550 if !check_closures {
2551 self.warn_if_unreachable(arg.id, arg.span, "expression");
2552 }
2553
2554 let is_closure = match arg.node {
2555 hir::ExprClosure(..) => true,
2556 _ => false
2557 };
2558
2559 if is_closure != check_closures {
2560 continue;
2561 }
2562
2563 debug!("checking the argument");
2564 let formal_ty = formal_tys[i];
2565
2566 // The special-cased logic below has three functions:
2567 // 1. Provide as good of an expected type as possible.
2568 let expected = expected_arg_tys.get(i).map(|&ty| {
2569 Expectation::rvalue_hint(self, ty)
2570 });
2571
2572 let checked_ty = self.check_expr_with_expectation(
2573 &arg,
2574 expected.unwrap_or(ExpectHasType(formal_ty)));
2575
2576 // 2. Coerce to the most detailed type that could be coerced
2577 // to, which is `expected_ty` if `rvalue_hint` returns an
2578 // `ExpectHasType(expected_ty)`, or the `formal_ty` otherwise.
2579 let coerce_ty = expected.and_then(|e| e.only_has_type(self));
2580 self.demand_coerce(&arg, checked_ty, coerce_ty.unwrap_or(formal_ty));
2581
2582 // 3. Relate the expected type and the formal one,
2583 // if the expected type was used for the coercion.
2584 coerce_ty.map(|ty| self.demand_suptype(arg.span, formal_ty, ty));
2585 }
2586 }
2587
2588 // We also need to make sure we at least write the ty of the other
2589 // arguments which we skipped above.
2590 if variadic {
2591 fn variadic_error<'tcx>(s: &Session, span: Span, t: Ty<'tcx>, cast_ty: &str) {
2592 type_error_struct!(s, span, t, E0617,
2593 "can't pass `{}` to variadic function, cast to `{}`",
2594 t, cast_ty).emit();
2595 }
2596
2597 for arg in args.iter().skip(expected_arg_count) {
2598 let arg_ty = self.check_expr(&arg);
2599
2600 // There are a few types which get autopromoted when passed via varargs
2601 // in C but we just error out instead and require explicit casts.
2602 let arg_ty = self.structurally_resolved_type(arg.span, arg_ty);
2603 match arg_ty.sty {
2604 ty::TyFloat(ast::FloatTy::F32) => {
2605 variadic_error(tcx.sess, arg.span, arg_ty, "c_double");
2606 }
2607 ty::TyInt(ast::IntTy::I8) | ty::TyInt(ast::IntTy::I16) | ty::TyBool => {
2608 variadic_error(tcx.sess, arg.span, arg_ty, "c_int");
2609 }
2610 ty::TyUint(ast::UintTy::U8) | ty::TyUint(ast::UintTy::U16) => {
2611 variadic_error(tcx.sess, arg.span, arg_ty, "c_uint");
2612 }
2613 ty::TyFnDef(..) => {
2614 let ptr_ty = self.tcx.mk_fn_ptr(arg_ty.fn_sig(self.tcx));
2615 let ptr_ty = self.resolve_type_vars_if_possible(&ptr_ty);
2616 variadic_error(tcx.sess, arg.span, arg_ty, &format!("{}", ptr_ty));
2617 }
2618 _ => {}
2619 }
2620 }
2621 }
2622 }
2623
2624 fn err_args(&self, len: usize) -> Vec<Ty<'tcx>> {
2625 (0..len).map(|_| self.tcx.types.err).collect()
2626 }
2627
2628 // AST fragment checking
2629 fn check_lit(&self,
2630 lit: &ast::Lit,
2631 expected: Expectation<'tcx>)
2632 -> Ty<'tcx>
2633 {
2634 let tcx = self.tcx;
2635
2636 match lit.node {
2637 ast::LitKind::Str(..) => tcx.mk_static_str(),
2638 ast::LitKind::ByteStr(ref v) => {
2639 tcx.mk_imm_ref(tcx.types.re_static,
2640 tcx.mk_array(tcx.types.u8, v.len() as u64))
2641 }
2642 ast::LitKind::Byte(_) => tcx.types.u8,
2643 ast::LitKind::Char(_) => tcx.types.char,
2644 ast::LitKind::Int(_, ast::LitIntType::Signed(t)) => tcx.mk_mach_int(t),
2645 ast::LitKind::Int(_, ast::LitIntType::Unsigned(t)) => tcx.mk_mach_uint(t),
2646 ast::LitKind::Int(_, ast::LitIntType::Unsuffixed) => {
2647 let opt_ty = expected.to_option(self).and_then(|ty| {
2648 match ty.sty {
2649 ty::TyInt(_) | ty::TyUint(_) => Some(ty),
2650 ty::TyChar => Some(tcx.types.u8),
2651 ty::TyRawPtr(..) => Some(tcx.types.usize),
2652 ty::TyFnDef(..) | ty::TyFnPtr(_) => Some(tcx.types.usize),
2653 _ => None
2654 }
2655 });
2656 opt_ty.unwrap_or_else(
2657 || tcx.mk_int_var(self.next_int_var_id()))
2658 }
2659 ast::LitKind::Float(_, t) => tcx.mk_mach_float(t),
2660 ast::LitKind::FloatUnsuffixed(_) => {
2661 let opt_ty = expected.to_option(self).and_then(|ty| {
2662 match ty.sty {
2663 ty::TyFloat(_) => Some(ty),
2664 _ => None
2665 }
2666 });
2667 opt_ty.unwrap_or_else(
2668 || tcx.mk_float_var(self.next_float_var_id()))
2669 }
2670 ast::LitKind::Bool(_) => tcx.types.bool
2671 }
2672 }
2673
2674 fn check_expr_eq_type(&self,
2675 expr: &'gcx hir::Expr,
2676 expected: Ty<'tcx>) {
2677 let ty = self.check_expr_with_hint(expr, expected);
2678 self.demand_eqtype(expr.span, expected, ty);
2679 }
2680
2681 pub fn check_expr_has_type_or_error(&self,
2682 expr: &'gcx hir::Expr,
2683 expected: Ty<'tcx>) -> Ty<'tcx> {
2684 self.check_expr_meets_expectation_or_error(expr, ExpectHasType(expected))
2685 }
2686
2687 fn check_expr_meets_expectation_or_error(&self,
2688 expr: &'gcx hir::Expr,
2689 expected: Expectation<'tcx>) -> Ty<'tcx> {
2690 let expected_ty = expected.to_option(&self).unwrap_or(self.tcx.types.bool);
2691 let mut ty = self.check_expr_with_expectation(expr, expected);
2692
2693 // While we don't allow *arbitrary* coercions here, we *do* allow
2694 // coercions from ! to `expected`.
2695 if ty.is_never() {
2696 assert!(!self.tables.borrow().adjustments().contains_key(expr.hir_id),
2697 "expression with never type wound up being adjusted");
2698 let adj_ty = self.next_diverging_ty_var(
2699 TypeVariableOrigin::AdjustmentType(expr.span));
2700 self.apply_adjustments(expr, vec![Adjustment {
2701 kind: Adjust::NeverToAny,
2702 target: adj_ty
2703 }]);
2704 ty = adj_ty;
2705 }
2706
2707 if let Some(mut err) = self.demand_suptype_diag(expr.span, expected_ty, ty) {
2708 // Add help to type error if this is an `if` condition with an assignment
2709 match (expected, &expr.node) {
2710 (ExpectIfCondition, &hir::ExprAssign(ref lhs, ref rhs)) => {
2711 let msg = "try comparing for equality";
2712 if let (Ok(left), Ok(right)) = (
2713 self.tcx.sess.codemap().span_to_snippet(lhs.span),
2714 self.tcx.sess.codemap().span_to_snippet(rhs.span))
2715 {
2716 err.span_suggestion(expr.span, msg, format!("{} == {}", left, right));
2717 } else {
2718 err.help(msg);
2719 }
2720 }
2721 _ => (),
2722 }
2723 err.emit();
2724 }
2725 ty
2726 }
2727
2728 fn check_expr_coercable_to_type(&self,
2729 expr: &'gcx hir::Expr,
2730 expected: Ty<'tcx>) -> Ty<'tcx> {
2731 self.check_expr_coercable_to_type_with_lvalue_pref(expr, expected, NoPreference)
2732 }
2733
2734 fn check_expr_coercable_to_type_with_lvalue_pref(&self,
2735 expr: &'gcx hir::Expr,
2736 expected: Ty<'tcx>,
2737 lvalue_pref: LvaluePreference)
2738 -> Ty<'tcx> {
2739 let ty = self.check_expr_with_expectation_and_lvalue_pref(
2740 expr,
2741 ExpectHasType(expected),
2742 lvalue_pref);
2743 self.demand_coerce(expr, ty, expected)
2744 }
2745
2746 fn check_expr_with_hint(&self, expr: &'gcx hir::Expr,
2747 expected: Ty<'tcx>) -> Ty<'tcx> {
2748 self.check_expr_with_expectation(expr, ExpectHasType(expected))
2749 }
2750
2751 fn check_expr_with_expectation(&self,
2752 expr: &'gcx hir::Expr,
2753 expected: Expectation<'tcx>) -> Ty<'tcx> {
2754 self.check_expr_with_expectation_and_lvalue_pref(expr, expected, NoPreference)
2755 }
2756
2757 fn check_expr(&self, expr: &'gcx hir::Expr) -> Ty<'tcx> {
2758 self.check_expr_with_expectation(expr, NoExpectation)
2759 }
2760
2761 fn check_expr_with_lvalue_pref(&self, expr: &'gcx hir::Expr,
2762 lvalue_pref: LvaluePreference) -> Ty<'tcx> {
2763 self.check_expr_with_expectation_and_lvalue_pref(expr, NoExpectation, lvalue_pref)
2764 }
2765
2766 // determine the `self` type, using fresh variables for all variables
2767 // declared on the impl declaration e.g., `impl<A,B> for Vec<(A,B)>`
2768 // would return ($0, $1) where $0 and $1 are freshly instantiated type
2769 // variables.
2770 pub fn impl_self_ty(&self,
2771 span: Span, // (potential) receiver for this impl
2772 did: DefId)
2773 -> TypeAndSubsts<'tcx> {
2774 let ity = self.tcx.type_of(did);
2775 debug!("impl_self_ty: ity={:?}", ity);
2776
2777 let substs = self.fresh_substs_for_item(span, did);
2778 let substd_ty = self.instantiate_type_scheme(span, &substs, &ity);
2779
2780 TypeAndSubsts { substs: substs, ty: substd_ty }
2781 }
2782
2783 /// Unifies the output type with the expected type early, for more coercions
2784 /// and forward type information on the input expressions.
2785 fn expected_inputs_for_expected_output(&self,
2786 call_span: Span,
2787 expected_ret: Expectation<'tcx>,
2788 formal_ret: Ty<'tcx>,
2789 formal_args: &[Ty<'tcx>])
2790 -> Vec<Ty<'tcx>> {
2791 let formal_ret = self.resolve_type_vars_with_obligations(formal_ret);
2792 let expected_args = expected_ret.only_has_type(self).and_then(|ret_ty| {
2793 self.fudge_regions_if_ok(&RegionVariableOrigin::Coercion(call_span), || {
2794 // Attempt to apply a subtyping relationship between the formal
2795 // return type (likely containing type variables if the function
2796 // is polymorphic) and the expected return type.
2797 // No argument expectations are produced if unification fails.
2798 let origin = self.misc(call_span);
2799 let ures = self.at(&origin, self.param_env).sup(ret_ty, formal_ret);
2800
2801 // FIXME(#15760) can't use try! here, FromError doesn't default
2802 // to identity so the resulting type is not constrained.
2803 match ures {
2804 Ok(ok) => {
2805 // Process any obligations locally as much as
2806 // we can. We don't care if some things turn
2807 // out unconstrained or ambiguous, as we're
2808 // just trying to get hints here.
2809 let result = self.save_and_restore_in_snapshot_flag(|_| {
2810 let mut fulfill = FulfillmentContext::new();
2811 let ok = ok; // FIXME(#30046)
2812 for obligation in ok.obligations {
2813 fulfill.register_predicate_obligation(self, obligation);
2814 }
2815 fulfill.select_where_possible(self)
2816 });
2817
2818 match result {
2819 Ok(()) => { }
2820 Err(_) => return Err(()),
2821 }
2822 }
2823 Err(_) => return Err(()),
2824 }
2825
2826 // Record all the argument types, with the substitutions
2827 // produced from the above subtyping unification.
2828 Ok(formal_args.iter().map(|ty| {
2829 self.resolve_type_vars_if_possible(ty)
2830 }).collect())
2831 }).ok()
2832 }).unwrap_or(vec![]);
2833 debug!("expected_inputs_for_expected_output(formal={:?} -> {:?}, expected={:?} -> {:?})",
2834 formal_args, formal_ret,
2835 expected_args, expected_ret);
2836 expected_args
2837 }
2838
2839 // Checks a method call.
2840 fn check_method_call(&self,
2841 expr: &'gcx hir::Expr,
2842 segment: &hir::PathSegment,
2843 span: Span,
2844 args: &'gcx [hir::Expr],
2845 expected: Expectation<'tcx>,
2846 lvalue_pref: LvaluePreference) -> Ty<'tcx> {
2847 let rcvr = &args[0];
2848 let rcvr_t = self.check_expr_with_lvalue_pref(&rcvr, lvalue_pref);
2849 // no need to check for bot/err -- callee does that
2850 let rcvr_t = self.structurally_resolved_type(expr.span, rcvr_t);
2851
2852 let method = match self.lookup_method(rcvr_t,
2853 segment,
2854 span,
2855 expr,
2856 rcvr) {
2857 Ok(method) => {
2858 self.write_method_call(expr.hir_id, method);
2859 Ok(method)
2860 }
2861 Err(error) => {
2862 if segment.name != keywords::Invalid.name() {
2863 self.report_method_error(span,
2864 rcvr_t,
2865 segment.name,
2866 Some(rcvr),
2867 error,
2868 Some(args));
2869 }
2870 Err(())
2871 }
2872 };
2873
2874 // Call the generic checker.
2875 self.check_method_argument_types(span,
2876 expr.span,
2877 method,
2878 &args[1..],
2879 DontTupleArguments,
2880 expected)
2881 }
2882
2883 fn check_return_expr(&self, return_expr: &'gcx hir::Expr) {
2884 let ret_coercion =
2885 self.ret_coercion
2886 .as_ref()
2887 .unwrap_or_else(|| span_bug!(return_expr.span,
2888 "check_return_expr called outside fn body"));
2889
2890 let ret_ty = ret_coercion.borrow().expected_ty();
2891 let return_expr_ty = self.check_expr_with_hint(return_expr, ret_ty.clone());
2892 ret_coercion.borrow_mut()
2893 .coerce(self,
2894 &self.cause(return_expr.span,
2895 ObligationCauseCode::ReturnType(return_expr.id)),
2896 return_expr,
2897 return_expr_ty,
2898 self.diverges.get());
2899 }
2900
2901
2902 // A generic function for checking the then and else in an if
2903 // or if-else.
2904 fn check_then_else(&self,
2905 cond_expr: &'gcx hir::Expr,
2906 then_expr: &'gcx hir::Expr,
2907 opt_else_expr: Option<&'gcx hir::Expr>,
2908 sp: Span,
2909 expected: Expectation<'tcx>) -> Ty<'tcx> {
2910 let cond_ty = self.check_expr_meets_expectation_or_error(cond_expr, ExpectIfCondition);
2911 let cond_diverges = self.diverges.get();
2912 self.diverges.set(Diverges::Maybe);
2913
2914 let expected = expected.adjust_for_branches(self);
2915 let then_ty = self.check_expr_with_expectation(then_expr, expected);
2916 let then_diverges = self.diverges.get();
2917 self.diverges.set(Diverges::Maybe);
2918
2919 // We've already taken the expected type's preferences
2920 // into account when typing the `then` branch. To figure
2921 // out the initial shot at a LUB, we thus only consider
2922 // `expected` if it represents a *hard* constraint
2923 // (`only_has_type`); otherwise, we just go with a
2924 // fresh type variable.
2925 let coerce_to_ty = expected.coercion_target_type(self, sp);
2926 let mut coerce: DynamicCoerceMany = CoerceMany::new(coerce_to_ty);
2927
2928 let if_cause = self.cause(sp, ObligationCauseCode::IfExpression);
2929 coerce.coerce(self, &if_cause, then_expr, then_ty, then_diverges);
2930
2931 if let Some(else_expr) = opt_else_expr {
2932 let else_ty = self.check_expr_with_expectation(else_expr, expected);
2933 let else_diverges = self.diverges.get();
2934
2935 coerce.coerce(self, &if_cause, else_expr, else_ty, else_diverges);
2936
2937 // We won't diverge unless both branches do (or the condition does).
2938 self.diverges.set(cond_diverges | then_diverges & else_diverges);
2939 } else {
2940 let else_cause = self.cause(sp, ObligationCauseCode::IfExpressionWithNoElse);
2941 coerce.coerce_forced_unit(self, &else_cause, &mut |_| (), true);
2942
2943 // If the condition is false we can't diverge.
2944 self.diverges.set(cond_diverges);
2945 }
2946
2947 let result_ty = coerce.complete(self);
2948 if cond_ty.references_error() {
2949 self.tcx.types.err
2950 } else {
2951 result_ty
2952 }
2953 }
2954
2955 // Check field access expressions
2956 fn check_field(&self,
2957 expr: &'gcx hir::Expr,
2958 lvalue_pref: LvaluePreference,
2959 base: &'gcx hir::Expr,
2960 field: &Spanned<ast::Name>) -> Ty<'tcx> {
2961 let expr_t = self.check_expr_with_lvalue_pref(base, lvalue_pref);
2962 let expr_t = self.structurally_resolved_type(expr.span,
2963 expr_t);
2964 let mut private_candidate = None;
2965 let mut autoderef = self.autoderef(expr.span, expr_t);
2966 while let Some((base_t, _)) = autoderef.next() {
2967 match base_t.sty {
2968 ty::TyAdt(base_def, substs) if !base_def.is_enum() => {
2969 debug!("struct named {:?}", base_t);
2970 let (ident, def_scope) =
2971 self.tcx.adjust(field.node, base_def.did, self.body_id);
2972 let fields = &base_def.struct_variant().fields;
2973 if let Some(field) = fields.iter().find(|f| f.name.to_ident() == ident) {
2974 let field_ty = self.field_ty(expr.span, field, substs);
2975 if field.vis.is_accessible_from(def_scope, self.tcx) {
2976 let adjustments = autoderef.adjust_steps(lvalue_pref);
2977 self.apply_adjustments(base, adjustments);
2978 autoderef.finalize();
2979
2980 self.tcx.check_stability(field.did, expr.id, expr.span);
2981
2982 return field_ty;
2983 }
2984 private_candidate = Some((base_def.did, field_ty));
2985 }
2986 }
2987 _ => {}
2988 }
2989 }
2990 autoderef.unambiguous_final_ty();
2991
2992 if let Some((did, field_ty)) = private_candidate {
2993 let struct_path = self.tcx().item_path_str(did);
2994 let mut err = struct_span_err!(self.tcx().sess, expr.span, E0616,
2995 "field `{}` of struct `{}` is private",
2996 field.node, struct_path);
2997 // Also check if an accessible method exists, which is often what is meant.
2998 if self.method_exists(field.span, field.node, expr_t, expr.id, false) {
2999 err.note(&format!("a method `{}` also exists, perhaps you wish to call it",
3000 field.node));
3001 }
3002 err.emit();
3003 field_ty
3004 } else if field.node == keywords::Invalid.name() {
3005 self.tcx().types.err
3006 } else if self.method_exists(field.span, field.node, expr_t, expr.id, true) {
3007 type_error_struct!(self.tcx().sess, field.span, expr_t, E0615,
3008 "attempted to take value of method `{}` on type `{}`",
3009 field.node, expr_t)
3010 .help("maybe a `()` to call it is missing?")
3011 .emit();
3012 self.tcx().types.err
3013 } else {
3014 if !expr_t.is_primitive_ty() {
3015 let mut err = self.no_such_field_err(field.span, &field.node, expr_t);
3016
3017 match expr_t.sty {
3018 ty::TyAdt(def, _) if !def.is_enum() => {
3019 if let Some(suggested_field_name) =
3020 Self::suggest_field_name(def.struct_variant(), field, vec![]) {
3021 err.span_label(field.span,
3022 format!("did you mean `{}`?", suggested_field_name));
3023 } else {
3024 err.span_label(field.span, "unknown field");
3025 let struct_variant_def = def.struct_variant();
3026 let field_names = self.available_field_names(struct_variant_def);
3027 if !field_names.is_empty() {
3028 err.note(&format!("available fields are: {}",
3029 self.name_series_display(field_names)));
3030 }
3031 };
3032 }
3033 ty::TyRawPtr(..) => {
3034 err.note(&format!("`{0}` is a native pointer; perhaps you need to deref \
3035 with `(*{0}).{1}`",
3036 self.tcx.hir.node_to_pretty_string(base.id),
3037 field.node));
3038 }
3039 _ => {}
3040 }
3041 err
3042 } else {
3043 type_error_struct!(self.tcx().sess, field.span, expr_t, E0610,
3044 "`{}` is a primitive type and therefore doesn't have fields",
3045 expr_t)
3046 }.emit();
3047 self.tcx().types.err
3048 }
3049 }
3050
3051 // Return an hint about the closest match in field names
3052 fn suggest_field_name(variant: &'tcx ty::VariantDef,
3053 field: &Spanned<ast::Name>,
3054 skip: Vec<InternedString>)
3055 -> Option<Symbol> {
3056 let name = field.node.as_str();
3057 let names = variant.fields.iter().filter_map(|field| {
3058 // ignore already set fields and private fields from non-local crates
3059 if skip.iter().any(|x| *x == field.name.as_str()) ||
3060 (variant.did.krate != LOCAL_CRATE && field.vis != Visibility::Public) {
3061 None
3062 } else {
3063 Some(&field.name)
3064 }
3065 });
3066
3067 find_best_match_for_name(names, &name, None)
3068 }
3069
3070 fn available_field_names(&self, variant: &'tcx ty::VariantDef) -> Vec<ast::Name> {
3071 let mut available = Vec::new();
3072 for field in variant.fields.iter() {
3073 let (_, def_scope) = self.tcx.adjust(field.name, variant.did, self.body_id);
3074 if field.vis.is_accessible_from(def_scope, self.tcx) {
3075 available.push(field.name);
3076 }
3077 }
3078 available
3079 }
3080
3081 fn name_series_display(&self, names: Vec<ast::Name>) -> String {
3082 // dynamic limit, to never omit just one field
3083 let limit = if names.len() == 6 { 6 } else { 5 };
3084 let mut display = names.iter().take(limit)
3085 .map(|n| format!("`{}`", n)).collect::<Vec<_>>().join(", ");
3086 if names.len() > limit {
3087 display = format!("{} ... and {} others", display, names.len() - limit);
3088 }
3089 display
3090 }
3091
3092 // Check tuple index expressions
3093 fn check_tup_field(&self,
3094 expr: &'gcx hir::Expr,
3095 lvalue_pref: LvaluePreference,
3096 base: &'gcx hir::Expr,
3097 idx: codemap::Spanned<usize>) -> Ty<'tcx> {
3098 let expr_t = self.check_expr_with_lvalue_pref(base, lvalue_pref);
3099 let expr_t = self.structurally_resolved_type(expr.span,
3100 expr_t);
3101 let mut private_candidate = None;
3102 let mut tuple_like = false;
3103 let mut autoderef = self.autoderef(expr.span, expr_t);
3104 while let Some((base_t, _)) = autoderef.next() {
3105 let field = match base_t.sty {
3106 ty::TyAdt(base_def, substs) if base_def.is_struct() => {
3107 tuple_like = base_def.struct_variant().ctor_kind == CtorKind::Fn;
3108 if !tuple_like { continue }
3109
3110 debug!("tuple struct named {:?}", base_t);
3111 let ident = ast::Ident {
3112 name: Symbol::intern(&idx.node.to_string()),
3113 ctxt: idx.span.ctxt().modern(),
3114 };
3115 let (ident, def_scope) =
3116 self.tcx.adjust_ident(ident, base_def.did, self.body_id);
3117 let fields = &base_def.struct_variant().fields;
3118 if let Some(field) = fields.iter().find(|f| f.name.to_ident() == ident) {
3119 let field_ty = self.field_ty(expr.span, field, substs);
3120 if field.vis.is_accessible_from(def_scope, self.tcx) {
3121 self.tcx.check_stability(field.did, expr.id, expr.span);
3122 Some(field_ty)
3123 } else {
3124 private_candidate = Some((base_def.did, field_ty));
3125 None
3126 }
3127 } else {
3128 None
3129 }
3130 }
3131 ty::TyTuple(ref v, _) => {
3132 tuple_like = true;
3133 v.get(idx.node).cloned()
3134 }
3135 _ => continue
3136 };
3137
3138 if let Some(field_ty) = field {
3139 let adjustments = autoderef.adjust_steps(lvalue_pref);
3140 self.apply_adjustments(base, adjustments);
3141 autoderef.finalize();
3142 return field_ty;
3143 }
3144 }
3145 autoderef.unambiguous_final_ty();
3146
3147 if let Some((did, field_ty)) = private_candidate {
3148 let struct_path = self.tcx().item_path_str(did);
3149 struct_span_err!(self.tcx().sess, expr.span, E0611,
3150 "field `{}` of tuple-struct `{}` is private",
3151 idx.node, struct_path).emit();
3152 return field_ty;
3153 }
3154
3155 if tuple_like {
3156 type_error_struct!(self.tcx().sess, expr.span, expr_t, E0612,
3157 "attempted out-of-bounds tuple index `{}` on type `{}`",
3158 idx.node, expr_t).emit();
3159 } else {
3160 self.no_such_field_err(expr.span, idx.node, expr_t).emit();
3161 }
3162
3163 self.tcx().types.err
3164 }
3165
3166 fn no_such_field_err<T: Display>(&self, span: Span, field: T, expr_t: &ty::TyS)
3167 -> DiagnosticBuilder {
3168 type_error_struct!(self.tcx().sess, span, expr_t, E0609,
3169 "no field `{}` on type `{}`",
3170 field, expr_t)
3171 }
3172
3173 fn report_unknown_field(&self,
3174 ty: Ty<'tcx>,
3175 variant: &'tcx ty::VariantDef,
3176 field: &hir::Field,
3177 skip_fields: &[hir::Field],
3178 kind_name: &str) {
3179 let mut err = self.type_error_struct_with_diag(
3180 field.name.span,
3181 |actual| match ty.sty {
3182 ty::TyAdt(adt, ..) if adt.is_enum() => {
3183 struct_span_err!(self.tcx.sess, field.name.span, E0559,
3184 "{} `{}::{}` has no field named `{}`",
3185 kind_name, actual, variant.name, field.name.node)
3186 }
3187 _ => {
3188 struct_span_err!(self.tcx.sess, field.name.span, E0560,
3189 "{} `{}` has no field named `{}`",
3190 kind_name, actual, field.name.node)
3191 }
3192 },
3193 ty);
3194 // prevent all specified fields from being suggested
3195 let skip_fields = skip_fields.iter().map(|ref x| x.name.node.as_str());
3196 if let Some(field_name) = Self::suggest_field_name(variant,
3197 &field.name,
3198 skip_fields.collect()) {
3199 err.span_label(field.name.span,
3200 format!("field does not exist - did you mean `{}`?", field_name));
3201 } else {
3202 match ty.sty {
3203 ty::TyAdt(adt, ..) => {
3204 if adt.is_enum() {
3205 err.span_label(field.name.span,
3206 format!("`{}::{}` does not have this field",
3207 ty, variant.name));
3208 } else {
3209 err.span_label(field.name.span,
3210 format!("`{}` does not have this field", ty));
3211 }
3212 let available_field_names = self.available_field_names(variant);
3213 if !available_field_names.is_empty() {
3214 err.note(&format!("available fields are: {}",
3215 self.name_series_display(available_field_names)));
3216 }
3217 }
3218 _ => bug!("non-ADT passed to report_unknown_field")
3219 }
3220 };
3221 err.emit();
3222 }
3223
3224 fn check_expr_struct_fields(&self,
3225 adt_ty: Ty<'tcx>,
3226 expected: Expectation<'tcx>,
3227 expr_id: ast::NodeId,
3228 span: Span,
3229 variant: &'tcx ty::VariantDef,
3230 ast_fields: &'gcx [hir::Field],
3231 check_completeness: bool) {
3232 let tcx = self.tcx;
3233
3234 let adt_ty_hint =
3235 self.expected_inputs_for_expected_output(span, expected, adt_ty, &[adt_ty])
3236 .get(0).cloned().unwrap_or(adt_ty);
3237 // re-link the regions that EIfEO can erase.
3238 self.demand_eqtype(span, adt_ty_hint, adt_ty);
3239
3240 let (substs, adt_kind, kind_name) = match &adt_ty.sty{
3241 &ty::TyAdt(adt, substs) => {
3242 (substs, adt.adt_kind(), adt.variant_descr())
3243 }
3244 _ => span_bug!(span, "non-ADT passed to check_expr_struct_fields")
3245 };
3246
3247 let mut remaining_fields = FxHashMap();
3248 for field in &variant.fields {
3249 remaining_fields.insert(field.name.to_ident(), field);
3250 }
3251
3252 let mut seen_fields = FxHashMap();
3253
3254 let mut error_happened = false;
3255
3256 // Typecheck each field.
3257 for field in ast_fields {
3258 let ident = tcx.adjust(field.name.node, variant.did, self.body_id).0;
3259 let field_type = if let Some(v_field) = remaining_fields.remove(&ident) {
3260 seen_fields.insert(field.name.node, field.span);
3261
3262 // we don't look at stability attributes on
3263 // struct-like enums (yet...), but it's definitely not
3264 // a bug to have construct one.
3265 if adt_kind != ty::AdtKind::Enum {
3266 tcx.check_stability(v_field.did, expr_id, field.span);
3267 }
3268
3269 self.field_ty(field.span, v_field, substs)
3270 } else {
3271 error_happened = true;
3272 if let Some(_) = variant.find_field_named(field.name.node) {
3273 let mut err = struct_span_err!(self.tcx.sess,
3274 field.name.span,
3275 E0062,
3276 "field `{}` specified more than once",
3277 field.name.node);
3278
3279 err.span_label(field.name.span, "used more than once");
3280
3281 if let Some(prev_span) = seen_fields.get(&field.name.node) {
3282 err.span_label(*prev_span, format!("first use of `{}`", field.name.node));
3283 }
3284
3285 err.emit();
3286 } else {
3287 self.report_unknown_field(adt_ty, variant, field, ast_fields, kind_name);
3288 }
3289
3290 tcx.types.err
3291 };
3292
3293 // Make sure to give a type to the field even if there's
3294 // an error, so we can continue typechecking
3295 self.check_expr_coercable_to_type(&field.expr, field_type);
3296 }
3297
3298 // Make sure the programmer specified correct number of fields.
3299 if kind_name == "union" {
3300 if ast_fields.len() != 1 {
3301 tcx.sess.span_err(span, "union expressions should have exactly one field");
3302 }
3303 } else if check_completeness && !error_happened && !remaining_fields.is_empty() {
3304 let len = remaining_fields.len();
3305
3306 let mut displayable_field_names = remaining_fields
3307 .keys()
3308 .map(|ident| ident.name.as_str())
3309 .collect::<Vec<_>>();
3310
3311 displayable_field_names.sort();
3312
3313 let truncated_fields_error = if len <= 3 {
3314 "".to_string()
3315 } else {
3316 format!(" and {} other field{}", (len - 3), if len - 3 == 1 {""} else {"s"})
3317 };
3318
3319 let remaining_fields_names = displayable_field_names.iter().take(3)
3320 .map(|n| format!("`{}`", n))
3321 .collect::<Vec<_>>()
3322 .join(", ");
3323
3324 struct_span_err!(tcx.sess, span, E0063,
3325 "missing field{} {}{} in initializer of `{}`",
3326 if remaining_fields.len() == 1 { "" } else { "s" },
3327 remaining_fields_names,
3328 truncated_fields_error,
3329 adt_ty)
3330 .span_label(span, format!("missing {}{}",
3331 remaining_fields_names,
3332 truncated_fields_error))
3333 .emit();
3334 }
3335 }
3336
3337 fn check_struct_fields_on_error(&self,
3338 fields: &'gcx [hir::Field],
3339 base_expr: &'gcx Option<P<hir::Expr>>) {
3340 for field in fields {
3341 self.check_expr(&field.expr);
3342 }
3343 match *base_expr {
3344 Some(ref base) => {
3345 self.check_expr(&base);
3346 },
3347 None => {}
3348 }
3349 }
3350
3351 pub fn check_struct_path(&self,
3352 qpath: &hir::QPath,
3353 node_id: ast::NodeId)
3354 -> Option<(&'tcx ty::VariantDef, Ty<'tcx>)> {
3355 let path_span = match *qpath {
3356 hir::QPath::Resolved(_, ref path) => path.span,
3357 hir::QPath::TypeRelative(ref qself, _) => qself.span
3358 };
3359 let (def, ty) = self.finish_resolving_struct_path(qpath, path_span, node_id);
3360 let variant = match def {
3361 Def::Err => {
3362 self.set_tainted_by_errors();
3363 return None;
3364 }
3365 Def::Variant(..) => {
3366 match ty.sty {
3367 ty::TyAdt(adt, substs) => {
3368 Some((adt.variant_of_def(def), adt.did, substs))
3369 }
3370 _ => bug!("unexpected type: {:?}", ty.sty)
3371 }
3372 }
3373 Def::Struct(..) | Def::Union(..) | Def::TyAlias(..) |
3374 Def::AssociatedTy(..) | Def::SelfTy(..) => {
3375 match ty.sty {
3376 ty::TyAdt(adt, substs) if !adt.is_enum() => {
3377 Some((adt.struct_variant(), adt.did, substs))
3378 }
3379 _ => None,
3380 }
3381 }
3382 _ => bug!("unexpected definition: {:?}", def)
3383 };
3384
3385 if let Some((variant, did, substs)) = variant {
3386 // Check bounds on type arguments used in the path.
3387 let bounds = self.instantiate_bounds(path_span, did, substs);
3388 let cause = traits::ObligationCause::new(path_span, self.body_id,
3389 traits::ItemObligation(did));
3390 self.add_obligations_for_parameters(cause, &bounds);
3391
3392 Some((variant, ty))
3393 } else {
3394 struct_span_err!(self.tcx.sess, path_span, E0071,
3395 "expected struct, variant or union type, found {}",
3396 ty.sort_string(self.tcx))
3397 .span_label(path_span, "not a struct")
3398 .emit();
3399 None
3400 }
3401 }
3402
3403 fn check_expr_struct(&self,
3404 expr: &hir::Expr,
3405 expected: Expectation<'tcx>,
3406 qpath: &hir::QPath,
3407 fields: &'gcx [hir::Field],
3408 base_expr: &'gcx Option<P<hir::Expr>>) -> Ty<'tcx>
3409 {
3410 // Find the relevant variant
3411 let (variant, struct_ty) =
3412 if let Some(variant_ty) = self.check_struct_path(qpath, expr.id) {
3413 variant_ty
3414 } else {
3415 self.check_struct_fields_on_error(fields, base_expr);
3416 return self.tcx.types.err;
3417 };
3418
3419 let path_span = match *qpath {
3420 hir::QPath::Resolved(_, ref path) => path.span,
3421 hir::QPath::TypeRelative(ref qself, _) => qself.span
3422 };
3423
3424 // Prohibit struct expressions when non exhaustive flag is set.
3425 if let ty::TyAdt(adt, _) = struct_ty.sty {
3426 if !adt.did.is_local() && adt.is_non_exhaustive() {
3427 span_err!(self.tcx.sess, expr.span, E0639,
3428 "cannot create non-exhaustive {} using struct expression",
3429 adt.variant_descr());
3430 }
3431 }
3432
3433 self.check_expr_struct_fields(struct_ty, expected, expr.id, path_span, variant, fields,
3434 base_expr.is_none());
3435 if let &Some(ref base_expr) = base_expr {
3436 self.check_expr_has_type_or_error(base_expr, struct_ty);
3437 match struct_ty.sty {
3438 ty::TyAdt(adt, substs) if adt.is_struct() => {
3439 let fru_field_types = adt.struct_variant().fields.iter().map(|f| {
3440 self.normalize_associated_types_in(expr.span, &f.ty(self.tcx, substs))
3441 }).collect();
3442
3443 self.tables
3444 .borrow_mut()
3445 .fru_field_types_mut()
3446 .insert(expr.hir_id, fru_field_types);
3447 }
3448 _ => {
3449 span_err!(self.tcx.sess, base_expr.span, E0436,
3450 "functional record update syntax requires a struct");
3451 }
3452 }
3453 }
3454 self.require_type_is_sized(struct_ty, expr.span, traits::StructInitializerSized);
3455 struct_ty
3456 }
3457
3458
3459 /// Invariant:
3460 /// If an expression has any sub-expressions that result in a type error,
3461 /// inspecting that expression's type with `ty.references_error()` will return
3462 /// true. Likewise, if an expression is known to diverge, inspecting its
3463 /// type with `ty::type_is_bot` will return true (n.b.: since Rust is
3464 /// strict, _|_ can appear in the type of an expression that does not,
3465 /// itself, diverge: for example, fn() -> _|_.)
3466 /// Note that inspecting a type's structure *directly* may expose the fact
3467 /// that there are actually multiple representations for `TyError`, so avoid
3468 /// that when err needs to be handled differently.
3469 fn check_expr_with_expectation_and_lvalue_pref(&self,
3470 expr: &'gcx hir::Expr,
3471 expected: Expectation<'tcx>,
3472 lvalue_pref: LvaluePreference) -> Ty<'tcx> {
3473 debug!(">> typechecking: expr={:?} expected={:?}",
3474 expr, expected);
3475
3476 // Warn for expressions after diverging siblings.
3477 self.warn_if_unreachable(expr.id, expr.span, "expression");
3478
3479 // Hide the outer diverging and has_errors flags.
3480 let old_diverges = self.diverges.get();
3481 let old_has_errors = self.has_errors.get();
3482 self.diverges.set(Diverges::Maybe);
3483 self.has_errors.set(false);
3484
3485 let ty = self.check_expr_kind(expr, expected, lvalue_pref);
3486
3487 // Warn for non-block expressions with diverging children.
3488 match expr.node {
3489 hir::ExprBlock(_) |
3490 hir::ExprLoop(..) | hir::ExprWhile(..) |
3491 hir::ExprIf(..) | hir::ExprMatch(..) => {}
3492
3493 _ => self.warn_if_unreachable(expr.id, expr.span, "expression")
3494 }
3495
3496 // Any expression that produces a value of type `!` must have diverged
3497 if ty.is_never() {
3498 self.diverges.set(self.diverges.get() | Diverges::Always);
3499 }
3500
3501 // Record the type, which applies it effects.
3502 // We need to do this after the warning above, so that
3503 // we don't warn for the diverging expression itself.
3504 self.write_ty(expr.hir_id, ty);
3505
3506 // Combine the diverging and has_error flags.
3507 self.diverges.set(self.diverges.get() | old_diverges);
3508 self.has_errors.set(self.has_errors.get() | old_has_errors);
3509
3510 debug!("type of {} is...", self.tcx.hir.node_to_string(expr.id));
3511 debug!("... {:?}, expected is {:?}", ty, expected);
3512
3513 ty
3514 }
3515
3516 fn check_expr_kind(&self,
3517 expr: &'gcx hir::Expr,
3518 expected: Expectation<'tcx>,
3519 lvalue_pref: LvaluePreference) -> Ty<'tcx> {
3520 let tcx = self.tcx;
3521 let id = expr.id;
3522 match expr.node {
3523 hir::ExprBox(ref subexpr) => {
3524 let expected_inner = expected.to_option(self).map_or(NoExpectation, |ty| {
3525 match ty.sty {
3526 ty::TyAdt(def, _) if def.is_box()
3527 => Expectation::rvalue_hint(self, ty.boxed_ty()),
3528 _ => NoExpectation
3529 }
3530 });
3531 let referent_ty = self.check_expr_with_expectation(subexpr, expected_inner);
3532 tcx.mk_box(referent_ty)
3533 }
3534
3535 hir::ExprLit(ref lit) => {
3536 self.check_lit(&lit, expected)
3537 }
3538 hir::ExprBinary(op, ref lhs, ref rhs) => {
3539 self.check_binop(expr, op, lhs, rhs)
3540 }
3541 hir::ExprAssignOp(op, ref lhs, ref rhs) => {
3542 self.check_binop_assign(expr, op, lhs, rhs)
3543 }
3544 hir::ExprUnary(unop, ref oprnd) => {
3545 let expected_inner = match unop {
3546 hir::UnNot | hir::UnNeg => {
3547 expected
3548 }
3549 hir::UnDeref => {
3550 NoExpectation
3551 }
3552 };
3553 let lvalue_pref = match unop {
3554 hir::UnDeref => lvalue_pref,
3555 _ => NoPreference
3556 };
3557 let mut oprnd_t = self.check_expr_with_expectation_and_lvalue_pref(&oprnd,
3558 expected_inner,
3559 lvalue_pref);
3560
3561 if !oprnd_t.references_error() {
3562 oprnd_t = self.structurally_resolved_type(expr.span, oprnd_t);
3563 match unop {
3564 hir::UnDeref => {
3565 if let Some(mt) = oprnd_t.builtin_deref(true, NoPreference) {
3566 oprnd_t = mt.ty;
3567 } else if let Some(ok) = self.try_overloaded_deref(
3568 expr.span, oprnd_t, lvalue_pref) {
3569 let method = self.register_infer_ok_obligations(ok);
3570 if let ty::TyRef(region, mt) = method.sig.inputs()[0].sty {
3571 self.apply_adjustments(oprnd, vec![Adjustment {
3572 kind: Adjust::Borrow(AutoBorrow::Ref(region, mt.mutbl)),
3573 target: method.sig.inputs()[0]
3574 }]);
3575 }
3576 oprnd_t = self.make_overloaded_lvalue_return_type(method).ty;
3577 self.write_method_call(expr.hir_id, method);
3578 } else {
3579 type_error_struct!(tcx.sess, expr.span, oprnd_t, E0614,
3580 "type `{}` cannot be dereferenced",
3581 oprnd_t).emit();
3582 oprnd_t = tcx.types.err;
3583 }
3584 }
3585 hir::UnNot => {
3586 let result = self.check_user_unop(expr, oprnd_t, unop);
3587 // If it's builtin, we can reuse the type, this helps inference.
3588 if !(oprnd_t.is_integral() || oprnd_t.sty == ty::TyBool) {
3589 oprnd_t = result;
3590 }
3591 }
3592 hir::UnNeg => {
3593 let result = self.check_user_unop(expr, oprnd_t, unop);
3594 // If it's builtin, we can reuse the type, this helps inference.
3595 if !(oprnd_t.is_integral() || oprnd_t.is_fp()) {
3596 oprnd_t = result;
3597 }
3598 }
3599 }
3600 }
3601 oprnd_t
3602 }
3603 hir::ExprAddrOf(mutbl, ref oprnd) => {
3604 let hint = expected.only_has_type(self).map_or(NoExpectation, |ty| {
3605 match ty.sty {
3606 ty::TyRef(_, ref mt) | ty::TyRawPtr(ref mt) => {
3607 if self.tcx.expr_is_lval(&oprnd) {
3608 // Lvalues may legitimately have unsized types.
3609 // For example, dereferences of a fat pointer and
3610 // the last field of a struct can be unsized.
3611 ExpectHasType(mt.ty)
3612 } else {
3613 Expectation::rvalue_hint(self, mt.ty)
3614 }
3615 }
3616 _ => NoExpectation
3617 }
3618 });
3619 let lvalue_pref = LvaluePreference::from_mutbl(mutbl);
3620 let ty = self.check_expr_with_expectation_and_lvalue_pref(&oprnd, hint, lvalue_pref);
3621
3622 let tm = ty::TypeAndMut { ty: ty, mutbl: mutbl };
3623 if tm.ty.references_error() {
3624 tcx.types.err
3625 } else {
3626 // Note: at this point, we cannot say what the best lifetime
3627 // is to use for resulting pointer. We want to use the
3628 // shortest lifetime possible so as to avoid spurious borrowck
3629 // errors. Moreover, the longest lifetime will depend on the
3630 // precise details of the value whose address is being taken
3631 // (and how long it is valid), which we don't know yet until type
3632 // inference is complete.
3633 //
3634 // Therefore, here we simply generate a region variable. The
3635 // region inferencer will then select the ultimate value.
3636 // Finally, borrowck is charged with guaranteeing that the
3637 // value whose address was taken can actually be made to live
3638 // as long as it needs to live.
3639 let region = self.next_region_var(infer::AddrOfRegion(expr.span));
3640 tcx.mk_ref(region, tm)
3641 }
3642 }
3643 hir::ExprPath(ref qpath) => {
3644 let (def, opt_ty, segments) = self.resolve_ty_and_def_ufcs(qpath,
3645 expr.id, expr.span);
3646 let ty = if def != Def::Err {
3647 self.instantiate_value_path(segments, opt_ty, def, expr.span, id)
3648 } else {
3649 self.set_tainted_by_errors();
3650 tcx.types.err
3651 };
3652
3653 // We always require that the type provided as the value for
3654 // a type parameter outlives the moment of instantiation.
3655 let substs = self.tables.borrow().node_substs(expr.hir_id);
3656 self.add_wf_bounds(substs, expr);
3657
3658 ty
3659 }
3660 hir::ExprInlineAsm(_, ref outputs, ref inputs) => {
3661 for output in outputs {
3662 self.check_expr(output);
3663 }
3664 for input in inputs {
3665 self.check_expr(input);
3666 }
3667 tcx.mk_nil()
3668 }
3669 hir::ExprBreak(destination, ref expr_opt) => {
3670 if let Some(target_id) = destination.target_id.opt_id() {
3671 let (e_ty, e_diverges, cause);
3672 if let Some(ref e) = *expr_opt {
3673 // If this is a break with a value, we need to type-check
3674 // the expression. Get an expected type from the loop context.
3675 let opt_coerce_to = {
3676 let mut enclosing_breakables = self.enclosing_breakables.borrow_mut();
3677 enclosing_breakables.find_breakable(target_id)
3678 .coerce
3679 .as_ref()
3680 .map(|coerce| coerce.expected_ty())
3681 };
3682
3683 // If the loop context is not a `loop { }`, then break with
3684 // a value is illegal, and `opt_coerce_to` will be `None`.
3685 // Just set expectation to error in that case.
3686 let coerce_to = opt_coerce_to.unwrap_or(tcx.types.err);
3687
3688 // Recurse without `enclosing_breakables` borrowed.
3689 e_ty = self.check_expr_with_hint(e, coerce_to);
3690 e_diverges = self.diverges.get();
3691 cause = self.misc(e.span);
3692 } else {
3693 // Otherwise, this is a break *without* a value. That's
3694 // always legal, and is equivalent to `break ()`.
3695 e_ty = tcx.mk_nil();
3696 e_diverges = Diverges::Maybe;
3697 cause = self.misc(expr.span);
3698 }
3699
3700 // Now that we have type-checked `expr_opt`, borrow
3701 // the `enclosing_loops` field and let's coerce the
3702 // type of `expr_opt` into what is expected.
3703 let mut enclosing_breakables = self.enclosing_breakables.borrow_mut();
3704 let ctxt = enclosing_breakables.find_breakable(target_id);
3705 if let Some(ref mut coerce) = ctxt.coerce {
3706 if let Some(ref e) = *expr_opt {
3707 coerce.coerce(self, &cause, e, e_ty, e_diverges);
3708 } else {
3709 assert!(e_ty.is_nil());
3710 coerce.coerce_forced_unit(self, &cause, &mut |_| (), true);
3711 }
3712 } else {
3713 // If `ctxt.coerce` is `None`, we can just ignore
3714 // the type of the expresison. This is because
3715 // either this was a break *without* a value, in
3716 // which case it is always a legal type (`()`), or
3717 // else an error would have been flagged by the
3718 // `loops` pass for using break with an expression
3719 // where you are not supposed to.
3720 assert!(expr_opt.is_none() || self.tcx.sess.err_count() > 0);
3721 }
3722
3723 ctxt.may_break = true;
3724 } else {
3725 // Otherwise, we failed to find the enclosing loop;
3726 // this can only happen if the `break` was not
3727 // inside a loop at all, which is caught by the
3728 // loop-checking pass.
3729 assert!(self.tcx.sess.err_count() > 0);
3730
3731 // We still need to assign a type to the inner expression to
3732 // prevent the ICE in #43162.
3733 if let Some(ref e) = *expr_opt {
3734 self.check_expr_with_hint(e, tcx.types.err);
3735
3736 // ... except when we try to 'break rust;'.
3737 // ICE this expression in particular (see #43162).
3738 if let hir::ExprPath(hir::QPath::Resolved(_, ref path)) = e.node {
3739 if path.segments.len() == 1 && path.segments[0].name == "rust" {
3740 fatally_break_rust(self.tcx.sess);
3741 }
3742 }
3743 }
3744 }
3745
3746 // the type of a `break` is always `!`, since it diverges
3747 tcx.types.never
3748 }
3749 hir::ExprAgain(_) => { tcx.types.never }
3750 hir::ExprRet(ref expr_opt) => {
3751 if self.ret_coercion.is_none() {
3752 struct_span_err!(self.tcx.sess, expr.span, E0572,
3753 "return statement outside of function body").emit();
3754 } else if let Some(ref e) = *expr_opt {
3755 self.check_return_expr(e);
3756 } else {
3757 let mut coercion = self.ret_coercion.as_ref().unwrap().borrow_mut();
3758 let cause = self.cause(expr.span, ObligationCauseCode::ReturnNoExpression);
3759 coercion.coerce_forced_unit(self, &cause, &mut |_| (), true);
3760 }
3761 tcx.types.never
3762 }
3763 hir::ExprAssign(ref lhs, ref rhs) => {
3764 let lhs_ty = self.check_expr_with_lvalue_pref(&lhs, PreferMutLvalue);
3765
3766 let rhs_ty = self.check_expr_coercable_to_type(&rhs, lhs_ty);
3767
3768 match expected {
3769 ExpectIfCondition => {
3770 self.tcx.sess.delay_span_bug(lhs.span, "invalid lhs expression in if;\
3771 expected error elsehwere");
3772 }
3773 _ => {
3774 // Only check this if not in an `if` condition, as the
3775 // mistyped comparison help is more appropriate.
3776 if !self.tcx.expr_is_lval(&lhs) {
3777 struct_span_err!(self.tcx.sess, expr.span, E0070,
3778 "invalid left-hand side expression")
3779 .span_label(expr.span, "left-hand of expression not valid")
3780 .emit();
3781 }
3782 }
3783 }
3784
3785 self.require_type_is_sized(lhs_ty, lhs.span, traits::AssignmentLhsSized);
3786
3787 if lhs_ty.references_error() || rhs_ty.references_error() {
3788 tcx.types.err
3789 } else {
3790 tcx.mk_nil()
3791 }
3792 }
3793 hir::ExprIf(ref cond, ref then_expr, ref opt_else_expr) => {
3794 self.check_then_else(&cond, then_expr, opt_else_expr.as_ref().map(|e| &**e),
3795 expr.span, expected)
3796 }
3797 hir::ExprWhile(ref cond, ref body, _) => {
3798 let ctxt = BreakableCtxt {
3799 // cannot use break with a value from a while loop
3800 coerce: None,
3801 may_break: true,
3802 };
3803
3804 self.with_breakable_ctxt(expr.id, ctxt, || {
3805 self.check_expr_has_type_or_error(&cond, tcx.types.bool);
3806 let cond_diverging = self.diverges.get();
3807 self.check_block_no_value(&body);
3808
3809 // We may never reach the body so it diverging means nothing.
3810 self.diverges.set(cond_diverging);
3811 });
3812
3813 self.tcx.mk_nil()
3814 }
3815 hir::ExprLoop(ref body, _, source) => {
3816 let coerce = match source {
3817 // you can only use break with a value from a normal `loop { }`
3818 hir::LoopSource::Loop => {
3819 let coerce_to = expected.coercion_target_type(self, body.span);
3820 Some(CoerceMany::new(coerce_to))
3821 }
3822
3823 hir::LoopSource::WhileLet |
3824 hir::LoopSource::ForLoop => {
3825 None
3826 }
3827 };
3828
3829 let ctxt = BreakableCtxt {
3830 coerce,
3831 may_break: false, // will get updated if/when we find a `break`
3832 };
3833
3834 let (ctxt, ()) = self.with_breakable_ctxt(expr.id, ctxt, || {
3835 self.check_block_no_value(&body);
3836 });
3837
3838 if ctxt.may_break {
3839 // No way to know whether it's diverging because
3840 // of a `break` or an outer `break` or `return.
3841 self.diverges.set(Diverges::Maybe);
3842 }
3843
3844 // If we permit break with a value, then result type is
3845 // the LUB of the breaks (possibly ! if none); else, it
3846 // is nil. This makes sense because infinite loops
3847 // (which would have type !) are only possible iff we
3848 // permit break with a value [1].
3849 assert!(ctxt.coerce.is_some() || ctxt.may_break); // [1]
3850 ctxt.coerce.map(|c| c.complete(self)).unwrap_or(self.tcx.mk_nil())
3851 }
3852 hir::ExprMatch(ref discrim, ref arms, match_src) => {
3853 self.check_match(expr, &discrim, arms, expected, match_src)
3854 }
3855 hir::ExprClosure(capture, ref decl, body_id, _, _) => {
3856 self.check_expr_closure(expr, capture, &decl, body_id, expected)
3857 }
3858 hir::ExprBlock(ref body) => {
3859 self.check_block_with_expected(&body, expected)
3860 }
3861 hir::ExprCall(ref callee, ref args) => {
3862 self.check_call(expr, &callee, args, expected)
3863 }
3864 hir::ExprMethodCall(ref segment, span, ref args) => {
3865 self.check_method_call(expr, segment, span, args, expected, lvalue_pref)
3866 }
3867 hir::ExprCast(ref e, ref t) => {
3868 // Find the type of `e`. Supply hints based on the type we are casting to,
3869 // if appropriate.
3870 let t_cast = self.to_ty(t);
3871 let t_cast = self.resolve_type_vars_if_possible(&t_cast);
3872 let t_expr = self.check_expr_with_expectation(e, ExpectCastableToType(t_cast));
3873 let t_cast = self.resolve_type_vars_if_possible(&t_cast);
3874 let diverges = self.diverges.get();
3875
3876 // Eagerly check for some obvious errors.
3877 if t_expr.references_error() || t_cast.references_error() {
3878 tcx.types.err
3879 } else {
3880 // Defer other checks until we're done type checking.
3881 let mut deferred_cast_checks = self.deferred_cast_checks.borrow_mut();
3882 match cast::CastCheck::new(self, e, t_expr, diverges, t_cast, t.span, expr.span) {
3883 Ok(cast_check) => {
3884 deferred_cast_checks.push(cast_check);
3885 t_cast
3886 }
3887 Err(ErrorReported) => {
3888 tcx.types.err
3889 }
3890 }
3891 }
3892 }
3893 hir::ExprType(ref e, ref t) => {
3894 let typ = self.to_ty(&t);
3895 self.check_expr_eq_type(&e, typ);
3896 typ
3897 }
3898 hir::ExprArray(ref args) => {
3899 let uty = expected.to_option(self).and_then(|uty| {
3900 match uty.sty {
3901 ty::TyArray(ty, _) | ty::TySlice(ty) => Some(ty),
3902 _ => None
3903 }
3904 });
3905
3906 let element_ty = if !args.is_empty() {
3907 let coerce_to = uty.unwrap_or_else(
3908 || self.next_ty_var(TypeVariableOrigin::TypeInference(expr.span)));
3909 let mut coerce = CoerceMany::with_coercion_sites(coerce_to, args);
3910 assert_eq!(self.diverges.get(), Diverges::Maybe);
3911 for e in args {
3912 let e_ty = self.check_expr_with_hint(e, coerce_to);
3913 let cause = self.misc(e.span);
3914 coerce.coerce(self, &cause, e, e_ty, self.diverges.get());
3915 }
3916 coerce.complete(self)
3917 } else {
3918 self.next_ty_var(TypeVariableOrigin::TypeInference(expr.span))
3919 };
3920 tcx.mk_array(element_ty, args.len() as u64)
3921 }
3922 hir::ExprRepeat(ref element, count) => {
3923 let count_def_id = tcx.hir.body_owner_def_id(count);
3924 let param_env = ty::ParamEnv::empty(traits::Reveal::UserFacing);
3925 let substs = Substs::identity_for_item(tcx.global_tcx(), count_def_id);
3926 let count = tcx.const_eval(param_env.and((count_def_id, substs)));
3927
3928 if let Err(ref err) = count {
3929 err.report(tcx, tcx.def_span(count_def_id), "constant expression");
3930 }
3931
3932 let uty = match expected {
3933 ExpectHasType(uty) => {
3934 match uty.sty {
3935 ty::TyArray(ty, _) | ty::TySlice(ty) => Some(ty),
3936 _ => None
3937 }
3938 }
3939 _ => None
3940 };
3941
3942 let (element_ty, t) = match uty {
3943 Some(uty) => {
3944 self.check_expr_coercable_to_type(&element, uty);
3945 (uty, uty)
3946 }
3947 None => {
3948 let t: Ty = self.next_ty_var(TypeVariableOrigin::MiscVariable(element.span));
3949 let element_ty = self.check_expr_has_type_or_error(&element, t);
3950 (element_ty, t)
3951 }
3952 };
3953
3954 if let Ok(count) = count {
3955 let zero_or_one = count.val.to_const_int().and_then(|count| {
3956 count.to_u64().map(|count| count <= 1)
3957 }).unwrap_or(false);
3958 if !zero_or_one {
3959 // For [foo, ..n] where n > 1, `foo` must have
3960 // Copy type:
3961 let lang_item = self.tcx.require_lang_item(lang_items::CopyTraitLangItem);
3962 self.require_type_meets(t, expr.span, traits::RepeatVec, lang_item);
3963 }
3964 }
3965
3966 if element_ty.references_error() {
3967 tcx.types.err
3968 } else if let Ok(count) = count {
3969 tcx.mk_ty(ty::TyArray(t, count))
3970 } else {
3971 tcx.types.err
3972 }
3973 }
3974 hir::ExprTup(ref elts) => {
3975 let flds = expected.only_has_type(self).and_then(|ty| {
3976 let ty = self.resolve_type_vars_with_obligations(ty);
3977 match ty.sty {
3978 ty::TyTuple(ref flds, _) => Some(&flds[..]),
3979 _ => None
3980 }
3981 });
3982
3983 let elt_ts_iter = elts.iter().enumerate().map(|(i, e)| {
3984 let t = match flds {
3985 Some(ref fs) if i < fs.len() => {
3986 let ety = fs[i];
3987 self.check_expr_coercable_to_type(&e, ety);
3988 ety
3989 }
3990 _ => {
3991 self.check_expr_with_expectation(&e, NoExpectation)
3992 }
3993 };
3994 t
3995 });
3996 let tuple = tcx.mk_tup(elt_ts_iter, false);
3997 if tuple.references_error() {
3998 tcx.types.err
3999 } else {
4000 self.require_type_is_sized(tuple, expr.span, traits::TupleInitializerSized);
4001 tuple
4002 }
4003 }
4004 hir::ExprStruct(ref qpath, ref fields, ref base_expr) => {
4005 self.check_expr_struct(expr, expected, qpath, fields, base_expr)
4006 }
4007 hir::ExprField(ref base, ref field) => {
4008 self.check_field(expr, lvalue_pref, &base, field)
4009 }
4010 hir::ExprTupField(ref base, idx) => {
4011 self.check_tup_field(expr, lvalue_pref, &base, idx)
4012 }
4013 hir::ExprIndex(ref base, ref idx) => {
4014 let base_t = self.check_expr_with_lvalue_pref(&base, lvalue_pref);
4015 let idx_t = self.check_expr(&idx);
4016
4017 if base_t.references_error() {
4018 base_t
4019 } else if idx_t.references_error() {
4020 idx_t
4021 } else {
4022 let base_t = self.structurally_resolved_type(expr.span, base_t);
4023 match self.lookup_indexing(expr, base, base_t, idx_t, lvalue_pref) {
4024 Some((index_ty, element_ty)) => {
4025 self.demand_coerce(idx, idx_t, index_ty);
4026 element_ty
4027 }
4028 None => {
4029 let mut err = type_error_struct!(tcx.sess, expr.span, base_t, E0608,
4030 "cannot index into a value of type `{}`",
4031 base_t);
4032 // Try to give some advice about indexing tuples.
4033 if let ty::TyTuple(..) = base_t.sty {
4034 let mut needs_note = true;
4035 // If the index is an integer, we can show the actual
4036 // fixed expression:
4037 if let hir::ExprLit(ref lit) = idx.node {
4038 if let ast::LitKind::Int(i,
4039 ast::LitIntType::Unsuffixed) = lit.node {
4040 let snip = tcx.sess.codemap().span_to_snippet(base.span);
4041 if let Ok(snip) = snip {
4042 err.span_suggestion(expr.span,
4043 "to access tuple elements, use",
4044 format!("{}.{}", snip, i));
4045 needs_note = false;
4046 }
4047 }
4048 }
4049 if needs_note {
4050 err.help("to access tuple elements, use tuple indexing \
4051 syntax (e.g. `tuple.0`)");
4052 }
4053 }
4054 err.emit();
4055 self.tcx.types.err
4056 }
4057 }
4058 }
4059 }
4060 hir::ExprYield(ref value) => {
4061 match self.yield_ty {
4062 Some(ty) => {
4063 self.check_expr_coercable_to_type(&value, ty);
4064 }
4065 None => {
4066 struct_span_err!(self.tcx.sess, expr.span, E0627,
4067 "yield statement outside of generator literal").emit();
4068 }
4069 }
4070 tcx.mk_nil()
4071 }
4072 }
4073 }
4074
4075 // Finish resolving a path in a struct expression or pattern `S::A { .. }` if necessary.
4076 // The newly resolved definition is written into `type_dependent_defs`.
4077 fn finish_resolving_struct_path(&self,
4078 qpath: &hir::QPath,
4079 path_span: Span,
4080 node_id: ast::NodeId)
4081 -> (Def, Ty<'tcx>)
4082 {
4083 match *qpath {
4084 hir::QPath::Resolved(ref maybe_qself, ref path) => {
4085 let opt_self_ty = maybe_qself.as_ref().map(|qself| self.to_ty(qself));
4086 let ty = AstConv::def_to_ty(self, opt_self_ty, path, true);
4087 (path.def, ty)
4088 }
4089 hir::QPath::TypeRelative(ref qself, ref segment) => {
4090 let ty = self.to_ty(qself);
4091
4092 let def = if let hir::TyPath(hir::QPath::Resolved(_, ref path)) = qself.node {
4093 path.def
4094 } else {
4095 Def::Err
4096 };
4097 let (ty, def) = AstConv::associated_path_def_to_ty(self, node_id, path_span,
4098 ty, def, segment);
4099
4100 // Write back the new resolution.
4101 let hir_id = self.tcx.hir.node_to_hir_id(node_id);
4102 self.tables.borrow_mut().type_dependent_defs_mut().insert(hir_id, def);
4103
4104 (def, ty)
4105 }
4106 }
4107 }
4108
4109 // Resolve associated value path into a base type and associated constant or method definition.
4110 // The newly resolved definition is written into `type_dependent_defs`.
4111 pub fn resolve_ty_and_def_ufcs<'b>(&self,
4112 qpath: &'b hir::QPath,
4113 node_id: ast::NodeId,
4114 span: Span)
4115 -> (Def, Option<Ty<'tcx>>, &'b [hir::PathSegment])
4116 {
4117 let (ty, item_segment) = match *qpath {
4118 hir::QPath::Resolved(ref opt_qself, ref path) => {
4119 return (path.def,
4120 opt_qself.as_ref().map(|qself| self.to_ty(qself)),
4121 &path.segments[..]);
4122 }
4123 hir::QPath::TypeRelative(ref qself, ref segment) => {
4124 (self.to_ty(qself), segment)
4125 }
4126 };
4127 let hir_id = self.tcx.hir.node_to_hir_id(node_id);
4128 if let Some(cached_def) = self.tables.borrow().type_dependent_defs().get(hir_id) {
4129 // Return directly on cache hit. This is useful to avoid doubly reporting
4130 // errors with default match binding modes. See #44614.
4131 return (*cached_def, Some(ty), slice::ref_slice(&**item_segment))
4132 }
4133 let item_name = item_segment.name;
4134 let def = match self.resolve_ufcs(span, item_name, ty, node_id) {
4135 Ok(def) => def,
4136 Err(error) => {
4137 let def = match error {
4138 method::MethodError::PrivateMatch(def, _) => def,
4139 _ => Def::Err,
4140 };
4141 if item_name != keywords::Invalid.name() {
4142 self.report_method_error(span, ty, item_name, None, error, None);
4143 }
4144 def
4145 }
4146 };
4147
4148 // Write back the new resolution.
4149 self.tables.borrow_mut().type_dependent_defs_mut().insert(hir_id, def);
4150 (def, Some(ty), slice::ref_slice(&**item_segment))
4151 }
4152
4153 pub fn check_decl_initializer(&self,
4154 local: &'gcx hir::Local,
4155 init: &'gcx hir::Expr) -> Ty<'tcx>
4156 {
4157 // FIXME(tschottdorf): contains_explicit_ref_binding() must be removed
4158 // for #42640 (default match binding modes).
4159 //
4160 // See #44848.
4161 let ref_bindings = local.pat.contains_explicit_ref_binding();
4162
4163 let local_ty = self.local_ty(init.span, local.id);
4164 if let Some(m) = ref_bindings {
4165 // Somewhat subtle: if we have a `ref` binding in the pattern,
4166 // we want to avoid introducing coercions for the RHS. This is
4167 // both because it helps preserve sanity and, in the case of
4168 // ref mut, for soundness (issue #23116). In particular, in
4169 // the latter case, we need to be clear that the type of the
4170 // referent for the reference that results is *equal to* the
4171 // type of the lvalue it is referencing, and not some
4172 // supertype thereof.
4173 let init_ty = self.check_expr_with_lvalue_pref(init, LvaluePreference::from_mutbl(m));
4174 self.demand_eqtype(init.span, init_ty, local_ty);
4175 init_ty
4176 } else {
4177 self.check_expr_coercable_to_type(init, local_ty)
4178 }
4179 }
4180
4181 pub fn check_decl_local(&self, local: &'gcx hir::Local) {
4182 let t = self.local_ty(local.span, local.id);
4183 self.write_ty(local.hir_id, t);
4184
4185 if let Some(ref init) = local.init {
4186 let init_ty = self.check_decl_initializer(local, &init);
4187 if init_ty.references_error() {
4188 self.write_ty(local.hir_id, init_ty);
4189 }
4190 }
4191
4192 self.check_pat_walk(&local.pat, t,
4193 ty::BindingMode::BindByValue(hir::Mutability::MutImmutable),
4194 true);
4195 let pat_ty = self.node_ty(local.pat.hir_id);
4196 if pat_ty.references_error() {
4197 self.write_ty(local.hir_id, pat_ty);
4198 }
4199 }
4200
4201 pub fn check_stmt(&self, stmt: &'gcx hir::Stmt) {
4202 // Don't do all the complex logic below for DeclItem.
4203 match stmt.node {
4204 hir::StmtDecl(ref decl, _) => {
4205 match decl.node {
4206 hir::DeclLocal(_) => {}
4207 hir::DeclItem(_) => {
4208 return;
4209 }
4210 }
4211 }
4212 hir::StmtExpr(..) | hir::StmtSemi(..) => {}
4213 }
4214
4215 self.warn_if_unreachable(stmt.node.id(), stmt.span, "statement");
4216
4217 // Hide the outer diverging and has_errors flags.
4218 let old_diverges = self.diverges.get();
4219 let old_has_errors = self.has_errors.get();
4220 self.diverges.set(Diverges::Maybe);
4221 self.has_errors.set(false);
4222
4223 match stmt.node {
4224 hir::StmtDecl(ref decl, _) => {
4225 match decl.node {
4226 hir::DeclLocal(ref l) => {
4227 self.check_decl_local(&l);
4228 }
4229 hir::DeclItem(_) => {/* ignore for now */}
4230 }
4231 }
4232 hir::StmtExpr(ref expr, _) => {
4233 // Check with expected type of ()
4234 self.check_expr_has_type_or_error(&expr, self.tcx.mk_nil());
4235 }
4236 hir::StmtSemi(ref expr, _) => {
4237 self.check_expr(&expr);
4238 }
4239 }
4240
4241 // Combine the diverging and has_error flags.
4242 self.diverges.set(self.diverges.get() | old_diverges);
4243 self.has_errors.set(self.has_errors.get() | old_has_errors);
4244 }
4245
4246 pub fn check_block_no_value(&self, blk: &'gcx hir::Block) {
4247 let unit = self.tcx.mk_nil();
4248 let ty = self.check_block_with_expected(blk, ExpectHasType(unit));
4249
4250 // if the block produces a `!` value, that can always be
4251 // (effectively) coerced to unit.
4252 if !ty.is_never() {
4253 self.demand_suptype(blk.span, unit, ty);
4254 }
4255 }
4256
4257 fn check_block_with_expected(&self,
4258 blk: &'gcx hir::Block,
4259 expected: Expectation<'tcx>) -> Ty<'tcx> {
4260 let prev = {
4261 let mut fcx_ps = self.ps.borrow_mut();
4262 let unsafety_state = fcx_ps.recurse(blk);
4263 replace(&mut *fcx_ps, unsafety_state)
4264 };
4265
4266 // In some cases, blocks have just one exit, but other blocks
4267 // can be targeted by multiple breaks. This cannot happen in
4268 // normal Rust syntax today, but it can happen when we desugar
4269 // a `do catch { ... }` expression.
4270 //
4271 // Example 1:
4272 //
4273 // 'a: { if true { break 'a Err(()); } Ok(()) }
4274 //
4275 // Here we would wind up with two coercions, one from
4276 // `Err(())` and the other from the tail expression
4277 // `Ok(())`. If the tail expression is omitted, that's a
4278 // "forced unit" -- unless the block diverges, in which
4279 // case we can ignore the tail expression (e.g., `'a: {
4280 // break 'a 22; }` would not force the type of the block
4281 // to be `()`).
4282 let tail_expr = blk.expr.as_ref();
4283 let coerce_to_ty = expected.coercion_target_type(self, blk.span);
4284 let coerce = if blk.targeted_by_break {
4285 CoerceMany::new(coerce_to_ty)
4286 } else {
4287 let tail_expr: &[P<hir::Expr>] = match tail_expr {
4288 Some(e) => ref_slice(e),
4289 None => &[],
4290 };
4291 CoerceMany::with_coercion_sites(coerce_to_ty, tail_expr)
4292 };
4293
4294 let prev_diverges = self.diverges.get();
4295 let ctxt = BreakableCtxt {
4296 coerce: Some(coerce),
4297 may_break: false,
4298 };
4299
4300 let (ctxt, ()) = self.with_breakable_ctxt(blk.id, ctxt, || {
4301 for s in &blk.stmts {
4302 self.check_stmt(s);
4303 }
4304
4305 // check the tail expression **without** holding the
4306 // `enclosing_breakables` lock below.
4307 let tail_expr_ty = tail_expr.map(|t| self.check_expr_with_expectation(t, expected));
4308
4309 let mut enclosing_breakables = self.enclosing_breakables.borrow_mut();
4310 let ctxt = enclosing_breakables.find_breakable(blk.id);
4311 let coerce = ctxt.coerce.as_mut().unwrap();
4312 if let Some(tail_expr_ty) = tail_expr_ty {
4313 let tail_expr = tail_expr.unwrap();
4314 let cause = self.cause(tail_expr.span,
4315 ObligationCauseCode::BlockTailExpression(blk.id));
4316 coerce.coerce(self,
4317 &cause,
4318 tail_expr,
4319 tail_expr_ty,
4320 self.diverges.get());
4321 } else {
4322 // Subtle: if there is no explicit tail expression,
4323 // that is typically equivalent to a tail expression
4324 // of `()` -- except if the block diverges. In that
4325 // case, there is no value supplied from the tail
4326 // expression (assuming there are no other breaks,
4327 // this implies that the type of the block will be
4328 // `!`).
4329 //
4330 // #41425 -- label the implicit `()` as being the
4331 // "found type" here, rather than the "expected type".
4332 if !self.diverges.get().always() {
4333 coerce.coerce_forced_unit(self, &self.misc(blk.span), &mut |err| {
4334 if let Some(expected_ty) = expected.only_has_type(self) {
4335 self.consider_hint_about_removing_semicolon(blk,
4336 expected_ty,
4337 err);
4338 }
4339 }, false);
4340 }
4341 }
4342 });
4343
4344 if ctxt.may_break {
4345 // If we can break from the block, then the block's exit is always reachable
4346 // (... as long as the entry is reachable) - regardless of the tail of the block.
4347 self.diverges.set(prev_diverges);
4348 }
4349
4350 let mut ty = ctxt.coerce.unwrap().complete(self);
4351
4352 if self.has_errors.get() || ty.references_error() {
4353 ty = self.tcx.types.err
4354 }
4355
4356 self.write_ty(blk.hir_id, ty);
4357
4358 *self.ps.borrow_mut() = prev;
4359 ty
4360 }
4361
4362 /// Given a `NodeId`, return the `FnDecl` of the method it is enclosed by and whether a
4363 /// suggestion can be made, `None` otherwise.
4364 pub fn get_fn_decl(&self, blk_id: ast::NodeId) -> Option<(hir::FnDecl, bool)> {
4365 // Get enclosing Fn, if it is a function or a trait method, unless there's a `loop` or
4366 // `while` before reaching it, as block tail returns are not available in them.
4367 if let Some(fn_id) = self.tcx.hir.get_return_block(blk_id) {
4368 let parent = self.tcx.hir.get(fn_id);
4369
4370 if let Node::NodeItem(&hir::Item {
4371 name, node: hir::ItemFn(ref decl, ..), ..
4372 }) = parent {
4373 decl.clone().and_then(|decl| {
4374 // This is less than ideal, it will not suggest a return type span on any
4375 // method called `main`, regardless of whether it is actually the entry point,
4376 // but it will still present it as the reason for the expected type.
4377 Some((decl, name != Symbol::intern("main")))
4378 })
4379 } else if let Node::NodeTraitItem(&hir::TraitItem {
4380 node: hir::TraitItemKind::Method(hir::MethodSig {
4381 ref decl, ..
4382 }, ..), ..
4383 }) = parent {
4384 decl.clone().and_then(|decl| {
4385 Some((decl, true))
4386 })
4387 } else if let Node::NodeImplItem(&hir::ImplItem {
4388 node: hir::ImplItemKind::Method(hir::MethodSig {
4389 ref decl, ..
4390 }, ..), ..
4391 }) = parent {
4392 decl.clone().and_then(|decl| {
4393 Some((decl, false))
4394 })
4395 } else {
4396 None
4397 }
4398 } else {
4399 None
4400 }
4401 }
4402
4403 /// On implicit return expressions with mismatched types, provide the following suggestions:
4404 ///
4405 /// - Point out the method's return type as the reason for the expected type
4406 /// - Possible missing semicolon
4407 /// - Possible missing return type if the return type is the default, and not `fn main()`
4408 pub fn suggest_mismatched_types_on_tail(&self,
4409 err: &mut DiagnosticBuilder<'tcx>,
4410 expression: &'gcx hir::Expr,
4411 expected: Ty<'tcx>,
4412 found: Ty<'tcx>,
4413 cause_span: Span,
4414 blk_id: ast::NodeId) {
4415 self.suggest_missing_semicolon(err, expression, expected, cause_span);
4416
4417 if let Some((fn_decl, can_suggest)) = self.get_fn_decl(blk_id) {
4418 self.suggest_missing_return_type(err, &fn_decl, expected, found, can_suggest);
4419 }
4420 }
4421
4422 /// A common error is to forget to add a semicolon at the end of a block:
4423 ///
4424 /// ```
4425 /// fn foo() {
4426 /// bar_that_returns_u32()
4427 /// }
4428 /// ```
4429 ///
4430 /// This routine checks if the return expression in a block would make sense on its own as a
4431 /// statement and the return type has been left as default or has been specified as `()`. If so,
4432 /// it suggests adding a semicolon.
4433 fn suggest_missing_semicolon(&self,
4434 err: &mut DiagnosticBuilder<'tcx>,
4435 expression: &'gcx hir::Expr,
4436 expected: Ty<'tcx>,
4437 cause_span: Span) {
4438 if expected.is_nil() {
4439 // `BlockTailExpression` only relevant if the tail expr would be
4440 // useful on its own.
4441 match expression.node {
4442 hir::ExprCall(..) |
4443 hir::ExprMethodCall(..) |
4444 hir::ExprIf(..) |
4445 hir::ExprWhile(..) |
4446 hir::ExprLoop(..) |
4447 hir::ExprMatch(..) |
4448 hir::ExprBlock(..) => {
4449 let sp = cause_span.next_point();
4450 err.span_suggestion(sp,
4451 "try adding a semicolon",
4452 ";".to_string());
4453 }
4454 _ => (),
4455 }
4456 }
4457 }
4458
4459
4460 /// A possible error is to forget to add a return type that is needed:
4461 ///
4462 /// ```
4463 /// fn foo() {
4464 /// bar_that_returns_u32()
4465 /// }
4466 /// ```
4467 ///
4468 /// This routine checks if the return type is left as default, the method is not part of an
4469 /// `impl` block and that it isn't the `main` method. If so, it suggests setting the return
4470 /// type.
4471 fn suggest_missing_return_type(&self,
4472 err: &mut DiagnosticBuilder<'tcx>,
4473 fn_decl: &hir::FnDecl,
4474 expected: Ty<'tcx>,
4475 found: Ty<'tcx>,
4476 can_suggest: bool) {
4477 // Only suggest changing the return type for methods that
4478 // haven't set a return type at all (and aren't `fn main()` or an impl).
4479 match (&fn_decl.output, found.is_suggestable(), can_suggest) {
4480 (&hir::FunctionRetTy::DefaultReturn(span), true, true) => {
4481 err.span_suggestion(span,
4482 "try adding a return type",
4483 format!("-> {} ", found));
4484 }
4485 (&hir::FunctionRetTy::DefaultReturn(span), false, true) => {
4486 err.span_label(span, "possibly return type missing here?");
4487 }
4488 (&hir::FunctionRetTy::DefaultReturn(span), _, _) => {
4489 // `fn main()` must return `()`, do not suggest changing return type
4490 err.span_label(span, "expected `()` because of default return type");
4491 }
4492 (&hir::FunctionRetTy::Return(ref ty), _, _) => {
4493 // Only point to return type if the expected type is the return type, as if they
4494 // are not, the expectation must have been caused by something else.
4495 debug!("suggest_missing_return_type: return type {:?} node {:?}", ty, ty.node);
4496 let sp = ty.span;
4497 let ty = AstConv::ast_ty_to_ty(self, ty);
4498 debug!("suggest_missing_return_type: return type sty {:?}", ty.sty);
4499 debug!("suggest_missing_return_type: expected type sty {:?}", ty.sty);
4500 if ty.sty == expected.sty {
4501 err.span_label(sp, format!("expected `{}` because of return type",
4502 expected));
4503 }
4504 }
4505 }
4506 }
4507
4508
4509 /// A common error is to add an extra semicolon:
4510 ///
4511 /// ```
4512 /// fn foo() -> usize {
4513 /// 22;
4514 /// }
4515 /// ```
4516 ///
4517 /// This routine checks if the final statement in a block is an
4518 /// expression with an explicit semicolon whose type is compatible
4519 /// with `expected_ty`. If so, it suggests removing the semicolon.
4520 fn consider_hint_about_removing_semicolon(&self,
4521 blk: &'gcx hir::Block,
4522 expected_ty: Ty<'tcx>,
4523 err: &mut DiagnosticBuilder) {
4524 // Be helpful when the user wrote `{... expr;}` and
4525 // taking the `;` off is enough to fix the error.
4526 let last_stmt = match blk.stmts.last() {
4527 Some(s) => s,
4528 None => return,
4529 };
4530 let last_expr = match last_stmt.node {
4531 hir::StmtSemi(ref e, _) => e,
4532 _ => return,
4533 };
4534 let last_expr_ty = self.node_ty(last_expr.hir_id);
4535 if self.can_sub(self.param_env, last_expr_ty, expected_ty).is_err() {
4536 return;
4537 }
4538 let original_span = original_sp(last_stmt.span, blk.span);
4539 let span_semi = original_span.with_lo(original_span.hi() - BytePos(1));
4540 err.span_suggestion(span_semi, "consider removing this semicolon", "".to_string());
4541 }
4542
4543 // Instantiates the given path, which must refer to an item with the given
4544 // number of type parameters and type.
4545 pub fn instantiate_value_path(&self,
4546 segments: &[hir::PathSegment],
4547 opt_self_ty: Option<Ty<'tcx>>,
4548 def: Def,
4549 span: Span,
4550 node_id: ast::NodeId)
4551 -> Ty<'tcx> {
4552 debug!("instantiate_value_path(path={:?}, def={:?}, node_id={})",
4553 segments,
4554 def,
4555 node_id);
4556
4557 // We need to extract the type parameters supplied by the user in
4558 // the path `path`. Due to the current setup, this is a bit of a
4559 // tricky-process; the problem is that resolve only tells us the
4560 // end-point of the path resolution, and not the intermediate steps.
4561 // Luckily, we can (at least for now) deduce the intermediate steps
4562 // just from the end-point.
4563 //
4564 // There are basically four cases to consider:
4565 //
4566 // 1. Reference to a constructor of enum variant or struct:
4567 //
4568 // struct Foo<T>(...)
4569 // enum E<T> { Foo(...) }
4570 //
4571 // In these cases, the parameters are declared in the type
4572 // space.
4573 //
4574 // 2. Reference to a fn item or a free constant:
4575 //
4576 // fn foo<T>() { }
4577 //
4578 // In this case, the path will again always have the form
4579 // `a::b::foo::<T>` where only the final segment should have
4580 // type parameters. However, in this case, those parameters are
4581 // declared on a value, and hence are in the `FnSpace`.
4582 //
4583 // 3. Reference to a method or an associated constant:
4584 //
4585 // impl<A> SomeStruct<A> {
4586 // fn foo<B>(...)
4587 // }
4588 //
4589 // Here we can have a path like
4590 // `a::b::SomeStruct::<A>::foo::<B>`, in which case parameters
4591 // may appear in two places. The penultimate segment,
4592 // `SomeStruct::<A>`, contains parameters in TypeSpace, and the
4593 // final segment, `foo::<B>` contains parameters in fn space.
4594 //
4595 // 4. Reference to a local variable
4596 //
4597 // Local variables can't have any type parameters.
4598 //
4599 // The first step then is to categorize the segments appropriately.
4600
4601 assert!(!segments.is_empty());
4602
4603 let mut ufcs_associated = None;
4604 let mut type_segment = None;
4605 let mut fn_segment = None;
4606 match def {
4607 // Case 1. Reference to a struct/variant constructor.
4608 Def::StructCtor(def_id, ..) |
4609 Def::VariantCtor(def_id, ..) => {
4610 // Everything but the final segment should have no
4611 // parameters at all.
4612 let mut generics = self.tcx.generics_of(def_id);
4613 if let Some(def_id) = generics.parent {
4614 // Variant and struct constructors use the
4615 // generics of their parent type definition.
4616 generics = self.tcx.generics_of(def_id);
4617 }
4618 type_segment = Some((segments.last().unwrap(), generics));
4619 }
4620
4621 // Case 2. Reference to a top-level value.
4622 Def::Fn(def_id) |
4623 Def::Const(def_id) |
4624 Def::Static(def_id, _) => {
4625 fn_segment = Some((segments.last().unwrap(),
4626 self.tcx.generics_of(def_id)));
4627 }
4628
4629 // Case 3. Reference to a method or associated const.
4630 Def::Method(def_id) |
4631 Def::AssociatedConst(def_id) => {
4632 let container = self.tcx.associated_item(def_id).container;
4633 match container {
4634 ty::TraitContainer(trait_did) => {
4635 callee::check_legal_trait_for_method_call(self.tcx, span, trait_did)
4636 }
4637 ty::ImplContainer(_) => {}
4638 }
4639
4640 let generics = self.tcx.generics_of(def_id);
4641 if segments.len() >= 2 {
4642 let parent_generics = self.tcx.generics_of(generics.parent.unwrap());
4643 type_segment = Some((&segments[segments.len() - 2], parent_generics));
4644 } else {
4645 // `<T>::assoc` will end up here, and so can `T::assoc`.
4646 let self_ty = opt_self_ty.expect("UFCS sugared assoc missing Self");
4647 ufcs_associated = Some((container, self_ty));
4648 }
4649 fn_segment = Some((segments.last().unwrap(), generics));
4650 }
4651
4652 // Case 4. Local variable, no generics.
4653 Def::Local(..) | Def::Upvar(..) => {}
4654
4655 _ => bug!("unexpected definition: {:?}", def),
4656 }
4657
4658 debug!("type_segment={:?} fn_segment={:?}", type_segment, fn_segment);
4659
4660 // Now that we have categorized what space the parameters for each
4661 // segment belong to, let's sort out the parameters that the user
4662 // provided (if any) into their appropriate spaces. We'll also report
4663 // errors if type parameters are provided in an inappropriate place.
4664 let poly_segments = type_segment.is_some() as usize +
4665 fn_segment.is_some() as usize;
4666 AstConv::prohibit_type_params(self, &segments[..segments.len() - poly_segments]);
4667
4668 match def {
4669 Def::Local(nid) | Def::Upvar(nid, ..) => {
4670 let ty = self.local_ty(span, nid);
4671 let ty = self.normalize_associated_types_in(span, &ty);
4672 self.write_ty(self.tcx.hir.node_to_hir_id(node_id), ty);
4673 return ty;
4674 }
4675 _ => {}
4676 }
4677
4678 // Now we have to compare the types that the user *actually*
4679 // provided against the types that were *expected*. If the user
4680 // did not provide any types, then we want to substitute inference
4681 // variables. If the user provided some types, we may still need
4682 // to add defaults. If the user provided *too many* types, that's
4683 // a problem.
4684 self.check_path_parameter_count(span, &mut type_segment, false);
4685 self.check_path_parameter_count(span, &mut fn_segment, false);
4686 self.check_impl_trait(span, &mut fn_segment);
4687
4688 let (fn_start, has_self) = match (type_segment, fn_segment) {
4689 (_, Some((_, generics))) => {
4690 (generics.parent_count(), generics.has_self)
4691 }
4692 (Some((_, generics)), None) => {
4693 (generics.own_count(), generics.has_self)
4694 }
4695 (None, None) => (0, false)
4696 };
4697 let substs = Substs::for_item(self.tcx, def.def_id(), |def, _| {
4698 let mut i = def.index as usize;
4699
4700 let segment = if i < fn_start {
4701 i -= has_self as usize;
4702 type_segment
4703 } else {
4704 i -= fn_start;
4705 fn_segment
4706 };
4707 let lifetimes = segment.map_or(&[][..], |(s, _)| {
4708 s.parameters.as_ref().map_or(&[][..], |p| &p.lifetimes[..])
4709 });
4710
4711 if let Some(lifetime) = lifetimes.get(i) {
4712 AstConv::ast_region_to_region(self, lifetime, Some(def))
4713 } else {
4714 self.re_infer(span, Some(def)).unwrap()
4715 }
4716 }, |def, substs| {
4717 let mut i = def.index as usize;
4718
4719 let segment = if i < fn_start {
4720 // Handle Self first, so we can adjust the index to match the AST.
4721 if has_self && i == 0 {
4722 return opt_self_ty.unwrap_or_else(|| {
4723 self.type_var_for_def(span, def, substs)
4724 });
4725 }
4726 i -= has_self as usize;
4727 type_segment
4728 } else {
4729 i -= fn_start;
4730 fn_segment
4731 };
4732 let (types, infer_types) = segment.map_or((&[][..], true), |(s, _)| {
4733 (s.parameters.as_ref().map_or(&[][..], |p| &p.types[..]), s.infer_types)
4734 });
4735
4736 // Skip over the lifetimes in the same segment.
4737 if let Some((_, generics)) = segment {
4738 i -= generics.regions.len();
4739 }
4740
4741 if let Some(ast_ty) = types.get(i) {
4742 // A provided type parameter.
4743 self.to_ty(ast_ty)
4744 } else if !infer_types && def.has_default {
4745 // No type parameter provided, but a default exists.
4746 let default = self.tcx.type_of(def.def_id);
4747 self.normalize_ty(
4748 span,
4749 default.subst_spanned(self.tcx, substs, Some(span))
4750 )
4751 } else {
4752 // No type parameters were provided, we can infer all.
4753 // This can also be reached in some error cases:
4754 // We prefer to use inference variables instead of
4755 // TyError to let type inference recover somewhat.
4756 self.type_var_for_def(span, def, substs)
4757 }
4758 });
4759
4760 // The things we are substituting into the type should not contain
4761 // escaping late-bound regions, and nor should the base type scheme.
4762 let ty = self.tcx.type_of(def.def_id());
4763 assert!(!substs.has_escaping_regions());
4764 assert!(!ty.has_escaping_regions());
4765
4766 // Add all the obligations that are required, substituting and
4767 // normalized appropriately.
4768 let bounds = self.instantiate_bounds(span, def.def_id(), &substs);
4769 self.add_obligations_for_parameters(
4770 traits::ObligationCause::new(span, self.body_id, traits::ItemObligation(def.def_id())),
4771 &bounds);
4772
4773 // Substitute the values for the type parameters into the type of
4774 // the referenced item.
4775 let ty_substituted = self.instantiate_type_scheme(span, &substs, &ty);
4776
4777 if let Some((ty::ImplContainer(impl_def_id), self_ty)) = ufcs_associated {
4778 // In the case of `Foo<T>::method` and `<Foo<T>>::method`, if `method`
4779 // is inherent, there is no `Self` parameter, instead, the impl needs
4780 // type parameters, which we can infer by unifying the provided `Self`
4781 // with the substituted impl type.
4782 let ty = self.tcx.type_of(impl_def_id);
4783
4784 let impl_ty = self.instantiate_type_scheme(span, &substs, &ty);
4785 match self.at(&self.misc(span), self.param_env).sup(impl_ty, self_ty) {
4786 Ok(ok) => self.register_infer_ok_obligations(ok),
4787 Err(_) => {
4788 span_bug!(span,
4789 "instantiate_value_path: (UFCS) {:?} was a subtype of {:?} but now is not?",
4790 self_ty,
4791 impl_ty);
4792 }
4793 }
4794 }
4795
4796 debug!("instantiate_value_path: type of {:?} is {:?}",
4797 node_id,
4798 ty_substituted);
4799 self.write_substs(self.tcx.hir.node_to_hir_id(node_id), substs);
4800 ty_substituted
4801 }
4802
4803 /// Report errors if the provided parameters are too few or too many.
4804 fn check_path_parameter_count(&self,
4805 span: Span,
4806 segment: &mut Option<(&hir::PathSegment, &ty::Generics)>,
4807 is_method_call: bool) {
4808 let (lifetimes, types, infer_types, bindings) = segment.map_or(
4809 (&[][..], &[][..], true, &[][..]),
4810 |(s, _)| s.parameters.as_ref().map_or(
4811 (&[][..], &[][..], s.infer_types, &[][..]),
4812 |p| (&p.lifetimes[..], &p.types[..],
4813 s.infer_types, &p.bindings[..])));
4814 let infer_lifetimes = lifetimes.len() == 0;
4815
4816 let count_lifetime_params = |n| {
4817 format!("{} lifetime parameter{}", n, if n == 1 { "" } else { "s" })
4818 };
4819 let count_type_params = |n| {
4820 format!("{} type parameter{}", n, if n == 1 { "" } else { "s" })
4821 };
4822
4823 // Check provided type parameters.
4824 let type_defs = segment.map_or(&[][..], |(_, generics)| {
4825 if generics.parent.is_none() {
4826 &generics.types[generics.has_self as usize..]
4827 } else {
4828 &generics.types
4829 }
4830 });
4831 let required_len = type_defs.iter().take_while(|d| !d.has_default).count();
4832 if types.len() > type_defs.len() {
4833 let span = types[type_defs.len()].span;
4834 let expected_text = count_type_params(type_defs.len());
4835 let actual_text = count_type_params(types.len());
4836 struct_span_err!(self.tcx.sess, span, E0087,
4837 "too many type parameters provided: \
4838 expected at most {}, found {}",
4839 expected_text, actual_text)
4840 .span_label(span, format!("expected {}", expected_text))
4841 .emit();
4842
4843 // To prevent derived errors to accumulate due to extra
4844 // type parameters, we force instantiate_value_path to
4845 // use inference variables instead of the provided types.
4846 *segment = None;
4847 } else if types.len() < required_len && !infer_types {
4848 let expected_text = count_type_params(required_len);
4849 let actual_text = count_type_params(types.len());
4850 struct_span_err!(self.tcx.sess, span, E0089,
4851 "too few type parameters provided: \
4852 expected {}, found {}",
4853 expected_text, actual_text)
4854 .span_label(span, format!("expected {}", expected_text))
4855 .emit();
4856 }
4857
4858 if !bindings.is_empty() {
4859 AstConv::prohibit_projection(self, bindings[0].span);
4860 }
4861
4862 // Check provided lifetime parameters.
4863 let lifetime_defs = segment.map_or(&[][..], |(_, generics)| &generics.regions);
4864 let required_len = lifetime_defs.len();
4865
4866 // Prohibit explicit lifetime arguments if late bound lifetime parameters are present.
4867 let has_late_bound_lifetime_defs =
4868 segment.map_or(None, |(_, generics)| generics.has_late_bound_regions);
4869 if let (Some(span_late), false) = (has_late_bound_lifetime_defs, lifetimes.is_empty()) {
4870 // Report this as a lint only if no error was reported previously.
4871 let primary_msg = "cannot specify lifetime arguments explicitly \
4872 if late bound lifetime parameters are present";
4873 let note_msg = "the late bound lifetime parameter is introduced here";
4874 if !is_method_call && (lifetimes.len() > lifetime_defs.len() ||
4875 lifetimes.len() < required_len && !infer_lifetimes) {
4876 let mut err = self.tcx.sess.struct_span_err(lifetimes[0].span, primary_msg);
4877 err.span_note(span_late, note_msg);
4878 err.emit();
4879 *segment = None;
4880 } else {
4881 let mut multispan = MultiSpan::from_span(lifetimes[0].span);
4882 multispan.push_span_label(span_late, note_msg.to_string());
4883 self.tcx.lint_node(lint::builtin::LATE_BOUND_LIFETIME_ARGUMENTS,
4884 lifetimes[0].id, multispan, primary_msg);
4885 }
4886 return;
4887 }
4888
4889 if lifetimes.len() > lifetime_defs.len() {
4890 let span = lifetimes[lifetime_defs.len()].span;
4891 let expected_text = count_lifetime_params(lifetime_defs.len());
4892 let actual_text = count_lifetime_params(lifetimes.len());
4893 struct_span_err!(self.tcx.sess, span, E0088,
4894 "too many lifetime parameters provided: \
4895 expected at most {}, found {}",
4896 expected_text, actual_text)
4897 .span_label(span, format!("expected {}", expected_text))
4898 .emit();
4899 } else if lifetimes.len() < required_len && !infer_lifetimes {
4900 let expected_text = count_lifetime_params(lifetime_defs.len());
4901 let actual_text = count_lifetime_params(lifetimes.len());
4902 struct_span_err!(self.tcx.sess, span, E0090,
4903 "too few lifetime parameters provided: \
4904 expected {}, found {}",
4905 expected_text, actual_text)
4906 .span_label(span, format!("expected {}", expected_text))
4907 .emit();
4908 }
4909 }
4910
4911 /// Report error if there is an explicit type parameter when using `impl Trait`.
4912 fn check_impl_trait(&self,
4913 span: Span,
4914 segment: &mut Option<(&hir::PathSegment, &ty::Generics)>) {
4915 use hir::SyntheticTyParamKind::*;
4916
4917 segment.map(|(path_segment, generics)| {
4918 let explicit = !path_segment.infer_types;
4919 let impl_trait = generics.types.iter()
4920 .any(|ty_param| {
4921 match ty_param.synthetic {
4922 Some(ImplTrait) => true,
4923 _ => false,
4924 }
4925 });
4926
4927 if explicit && impl_trait {
4928 let mut err = struct_span_err! {
4929 self.tcx.sess,
4930 span,
4931 E0632,
4932 "cannot provide explicit type parameters when `impl Trait` is \
4933 used in argument position."
4934 };
4935
4936 err.emit();
4937 }
4938 });
4939 }
4940
4941 fn structurally_resolve_type_or_else<F>(&self, sp: Span, ty: Ty<'tcx>, f: F)
4942 -> Ty<'tcx>
4943 where F: Fn() -> Ty<'tcx>
4944 {
4945 let mut ty = self.resolve_type_vars_with_obligations(ty);
4946
4947 if ty.is_ty_var() {
4948 let alternative = f();
4949
4950 // If not, error.
4951 if alternative.is_ty_var() || alternative.references_error() {
4952 if !self.is_tainted_by_errors() {
4953 type_error_struct!(self.tcx.sess, sp, ty, E0619,
4954 "the type of this value must be known in this context")
4955 .emit();
4956 }
4957 self.demand_suptype(sp, self.tcx.types.err, ty);
4958 ty = self.tcx.types.err;
4959 } else {
4960 self.demand_suptype(sp, alternative, ty);
4961 ty = alternative;
4962 }
4963 }
4964
4965 ty
4966 }
4967
4968 // Resolves `typ` by a single level if `typ` is a type variable. If no
4969 // resolution is possible, then an error is reported.
4970 pub fn structurally_resolved_type(&self, sp: Span, ty: Ty<'tcx>) -> Ty<'tcx> {
4971 self.structurally_resolve_type_or_else(sp, ty, || {
4972 self.tcx.types.err
4973 })
4974 }
4975
4976 fn with_breakable_ctxt<F: FnOnce() -> R, R>(&self, id: ast::NodeId,
4977 ctxt: BreakableCtxt<'gcx, 'tcx>, f: F)
4978 -> (BreakableCtxt<'gcx, 'tcx>, R) {
4979 let index;
4980 {
4981 let mut enclosing_breakables = self.enclosing_breakables.borrow_mut();
4982 index = enclosing_breakables.stack.len();
4983 enclosing_breakables.by_id.insert(id, index);
4984 enclosing_breakables.stack.push(ctxt);
4985 }
4986 let result = f();
4987 let ctxt = {
4988 let mut enclosing_breakables = self.enclosing_breakables.borrow_mut();
4989 debug_assert!(enclosing_breakables.stack.len() == index + 1);
4990 enclosing_breakables.by_id.remove(&id).expect("missing breakable context");
4991 enclosing_breakables.stack.pop().expect("missing breakable context")
4992 };
4993 (ctxt, result)
4994 }
4995 }
4996
4997 pub fn check_bounds_are_used<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
4998 generics: &hir::Generics,
4999 ty: Ty<'tcx>) {
5000 debug!("check_bounds_are_used(n_tps={}, ty={:?})",
5001 generics.ty_params.len(), ty);
5002
5003 // make a vector of booleans initially false, set to true when used
5004 if generics.ty_params.is_empty() { return; }
5005 let mut tps_used = vec![false; generics.ty_params.len()];
5006
5007 for leaf_ty in ty.walk() {
5008 if let ty::TyParam(ParamTy {idx, ..}) = leaf_ty.sty {
5009 debug!("Found use of ty param num {}", idx);
5010 tps_used[idx as usize - generics.lifetimes.len()] = true;
5011 } else if let ty::TyError = leaf_ty.sty {
5012 // If there already another error, do not emit an error for not using a type Parameter
5013 assert!(tcx.sess.err_count() > 0);
5014 return;
5015 }
5016 }
5017
5018 for (&used, param) in tps_used.iter().zip(&generics.ty_params) {
5019 if !used {
5020 struct_span_err!(tcx.sess, param.span, E0091,
5021 "type parameter `{}` is unused",
5022 param.name)
5023 .span_label(param.span, "unused type parameter")
5024 .emit();
5025 }
5026 }
5027 }
5028
5029 fn fatally_break_rust(sess: &Session) {
5030 let handler = sess.diagnostic();
5031 handler.span_bug_no_panic(
5032 MultiSpan::new(),
5033 "It looks like you're trying to break rust; would you like some ICE?",
5034 );
5035 handler.note_without_error("the compiler expectedly panicked. this is a feature.");
5036 handler.note_without_error(
5037 "we would appreciate a joke overview: \
5038 https://github.com/rust-lang/rust/issues/43162#issuecomment-320764675"
5039 );
5040 handler.note_without_error(&format!("rustc {} running on {}",
5041 option_env!("CFG_VERSION").unwrap_or("unknown_version"),
5042 ::session::config::host_triple(),
5043 ));
5044 }