1 // Copyright 2012-2014 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.
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.
11 /*! See doc.rs for documentation */
13 #![allow(non_camel_case_types)]
15 pub use middle::ty::IntVarValue;
16 pub use self::resolve::resolve_and_force_all_but_regions;
17 pub use self::resolve::{force_all, not_regions};
18 pub use self::resolve::{force_ivar};
19 pub use self::resolve::{force_tvar, force_rvar};
20 pub use self::resolve::{resolve_ivar, resolve_all};
21 pub use self::resolve::{resolve_nested_tvar};
22 pub use self::resolve::{resolve_rvar};
23 pub use self::skolemize::TypeSkolemizer;
26 use middle::subst::Substs;
27 use middle::ty::{TyVid, IntVid, FloatVid, RegionVid};
30 use middle::ty_fold::TypeFolder;
31 use middle::typeck::check::regionmanip::replace_late_bound_regions_in_fn_sig;
32 use middle::typeck::infer::coercion::Coerce;
33 use middle::typeck::infer::combine::{Combine, CombineFields};
34 use middle::typeck::infer::region_inference::{RegionVarBindings,
36 use middle::typeck::infer::resolve::{resolver};
37 use middle::typeck::infer::equate::Equate;
38 use middle::typeck::infer::sub::Sub;
39 use middle::typeck::infer::lub::Lub;
40 use middle::typeck::infer::unify::{UnificationTable};
41 use middle::typeck::infer::error_reporting::ErrorReporting;
42 use std::cell::{RefCell};
43 use std::collections::HashMap;
47 use syntax::codemap::Span;
48 use util::common::indent;
49 use util::ppaux::{bound_region_to_string, ty_to_string, trait_ref_to_string, Repr};
55 pub mod error_reporting;
59 pub mod region_inference;
64 pub mod type_variable;
67 pub type Bound<T> = Option<T>;
69 pub type cres<T> = Result<T,ty::type_err>; // "combine result"
70 pub type ures = cres<()>; // "unify result"
71 pub type fres<T> = Result<T, fixup_err>; // "fixup result"
72 pub type CoerceResult = cres<Option<ty::AutoAdjustment>>;
74 pub struct InferCtxt<'a, 'tcx: 'a> {
75 pub tcx: &'a ty::ctxt<'tcx>,
77 // We instantiate UnificationTable with bounds<ty::t> because the
78 // types that might instantiate a general type variable have an
79 // order, represented by its upper and lower bounds.
80 type_variables: RefCell<type_variable::TypeVariableTable>,
82 // Map from integral variable to the kind of integer it represents
83 int_unification_table:
84 RefCell<UnificationTable<ty::IntVid, Option<IntVarValue>>>,
86 // Map from floating variable to the kind of float it represents
87 float_unification_table:
88 RefCell<UnificationTable<ty::FloatVid, Option<ast::FloatTy>>>,
90 // For region variables.
92 RegionVarBindings<'a, 'tcx>,
95 /// Why did we require that the two types be related?
97 /// See `error_reporting.rs` for more details
100 // Not yet categorized in a better way
103 // Checking that method of impl is compatible with trait
104 MethodCompatCheck(Span),
106 // Checking that this expression can be assigned where it needs to be
107 // FIXME(eddyb) #11161 is the original Expr required?
108 ExprAssignable(Span),
110 // Relating trait refs when resolving vtables
111 RelateTraitRefs(Span),
113 // Relating self types when resolving vtables
114 RelateSelfType(Span),
116 // Relating trait type parameters to those found in impl etc
117 RelateOutputImplTypes(Span),
119 // Computing common supertype in the arms of a match expression
120 MatchExpressionArm(Span, Span),
122 // Computing common supertype in an if expression
126 /// See `error_reporting.rs` for more details
128 pub enum ValuePairs {
129 Types(ty::expected_found<ty::t>),
130 TraitRefs(ty::expected_found<Rc<ty::TraitRef>>),
133 /// The trace designates the path through inference that we took to
134 /// encounter an error or subtyping constraint.
136 /// See `error_reporting.rs` for more details.
138 pub struct TypeTrace {
143 /// The origin of a `r1 <= r2` constraint.
145 /// See `error_reporting.rs` for more details
147 pub enum SubregionOrigin {
148 // Arose from a subtyping relation
151 // Stack-allocated closures cannot outlive innermost loop
152 // or function so as to ensure we only require finite stack
153 InfStackClosure(Span),
155 // Invocation of closure must be within its lifetime
158 // Dereference of reference must be within its lifetime
161 // Closure bound must not outlive captured free variables
162 FreeVariable(Span, ast::NodeId),
164 // Proc upvars must be 'static
165 ProcCapture(Span, ast::NodeId),
167 // Index into slice must be within its lifetime
170 // When casting `&'a T` to an `&'b Trait` object,
171 // relating `'a` to `'b`
172 RelateObjectBound(Span),
174 // When closing over a variable in a closure/proc, ensure that the
175 // type of the variable outlives the lifetime bound.
176 RelateProcBound(Span, ast::NodeId, ty::t),
178 // The given type parameter was instantiated with the given type,
179 // and that type must outlive some region.
180 RelateParamBound(Span, ty::ParamTy, ty::t),
182 // The given region parameter was instantiated with a region
183 // that must outlive some other region.
184 RelateRegionParamBound(Span),
186 // A bound placed on type parameters that states that must outlive
187 // the moment of their instantiation.
188 RelateDefaultParamBound(Span, ty::t),
190 // Creating a pointer `b` to contents of another reference
193 // Creating a pointer `b` to contents of an upvar
194 ReborrowUpvar(Span, ty::UpvarId),
196 // (&'a &'b T) where a >= b
197 ReferenceOutlivesReferent(ty::t, Span),
199 // The type T of an expression E must outlive the lifetime for E.
200 ExprTypeIsNotInScope(ty::t, Span),
202 // A `ref b` whose region does not enclose the decl site
203 BindingTypeIsNotValidAtDecl(Span),
205 // Regions appearing in a method receiver must outlive method call
208 // Regions appearing in a function argument must outlive func call
211 // Region in return type of invoked fn must enclose call
214 // Region resulting from a `&` expr must enclose the `&` expr
217 // An auto-borrow that does not enclose the expr where it occurs
221 /// Reasons to create a region inference variable
223 /// See `error_reporting.rs` for more details
225 pub enum RegionVariableOrigin {
226 // Region variables created for ill-categorized reasons,
227 // mostly indicates places in need of refactoring
230 // Regions created by a `&P` or `[...]` pattern
233 // Regions created by `&` operator
236 // Regions created by `&[...]` literal
239 // Regions created as part of an autoref of a method receiver
242 // Regions created as part of an automatic coercion
245 // Region variables created as the values for early-bound regions
246 EarlyBoundRegion(Span, ast::Name),
248 // Region variables created for bound regions
249 // in a function or method that is called
250 LateBoundRegion(Span, ty::BoundRegion),
252 // Region variables created for bound regions
253 // when doing subtyping/lub/glb computations
254 BoundRegionInFnType(Span, ty::BoundRegion),
256 UpvarRegion(ty::UpvarId, Span),
258 BoundRegionInCoherence(ast::Name),
263 unresolved_int_ty(IntVid),
264 unresolved_float_ty(FloatVid),
268 pub fn fixup_err_to_string(f: fixup_err) -> String {
270 unresolved_int_ty(_) => {
271 "cannot determine the type of this integer; add a suffix to \
272 specify the type explicitly".to_string()
274 unresolved_float_ty(_) => {
275 "cannot determine the type of this number; add a suffix to specify \
276 the type explicitly".to_string()
278 unresolved_ty(_) => "unconstrained type".to_string(),
282 pub fn new_infer_ctxt<'a, 'tcx>(tcx: &'a ty::ctxt<'tcx>)
283 -> InferCtxt<'a, 'tcx> {
286 type_variables: RefCell::new(type_variable::TypeVariableTable::new()),
287 int_unification_table: RefCell::new(UnificationTable::new()),
288 float_unification_table: RefCell::new(UnificationTable::new()),
289 region_vars: RegionVarBindings::new(tcx),
293 pub fn common_supertype(cx: &InferCtxt,
301 * Computes the least upper-bound of `a` and `b`. If this is
302 * not possible, reports an error and returns ty::err.
305 debug!("common_supertype({}, {})",
306 a.repr(cx.tcx), b.repr(cx.tcx));
308 let trace = TypeTrace {
310 values: Types(expected_found(a_is_expected, a, b))
314 cx.commit_if_ok(|| cx.lub(a_is_expected, trace.clone()).tys(a, b));
318 cx.report_and_explain_type_error(trace, err);
324 pub fn mk_subty(cx: &InferCtxt,
331 debug!("mk_subty({} <: {})", a.repr(cx.tcx), b.repr(cx.tcx));
333 cx.sub_types(a_is_expected, origin, a, b)
337 pub fn can_mk_subty(cx: &InferCtxt, a: ty::t, b: ty::t) -> ures {
338 debug!("can_mk_subty({} <: {})", a.repr(cx.tcx), b.repr(cx.tcx));
340 let trace = TypeTrace {
341 origin: Misc(codemap::DUMMY_SP),
342 values: Types(expected_found(true, a, b))
344 cx.sub(true, trace).tys(a, b).to_ures()
348 pub fn can_mk_eqty(cx: &InferCtxt, a: ty::t, b: ty::t) -> ures {
349 debug!("can_mk_subty({} <: {})", a.repr(cx.tcx), b.repr(cx.tcx));
351 let trace = TypeTrace {
352 origin: Misc(codemap::DUMMY_SP),
353 values: Types(expected_found(true, a, b))
355 cx.equate(true, trace).tys(a, b)
359 pub fn mk_subr(cx: &InferCtxt,
360 origin: SubregionOrigin,
363 debug!("mk_subr({} <: {})", a.repr(cx.tcx), b.repr(cx.tcx));
364 let snapshot = cx.region_vars.start_snapshot();
365 cx.region_vars.make_subregion(origin, a, b);
366 cx.region_vars.commit(snapshot);
369 pub fn verify_param_bound(cx: &InferCtxt,
370 origin: SubregionOrigin,
371 param_ty: ty::ParamTy,
373 bs: Vec<ty::Region>) {
374 debug!("verify_param_bound({}, {} <: {})",
375 param_ty.repr(cx.tcx),
379 cx.region_vars.verify_param_bound(origin, param_ty, a, bs);
382 pub fn mk_eqty(cx: &InferCtxt,
389 debug!("mk_eqty({} <: {})", a.repr(cx.tcx), b.repr(cx.tcx));
391 || cx.eq_types(a_is_expected, origin, a, b))
394 pub fn mk_sub_trait_refs(cx: &InferCtxt,
401 debug!("mk_sub_trait_refs({} <: {})",
402 a.repr(cx.tcx), b.repr(cx.tcx));
404 || cx.sub_trait_refs(a_is_expected, origin, a.clone(), b.clone()))
407 fn expected_found<T>(a_is_expected: bool,
410 -> ty::expected_found<T>
413 ty::expected_found {expected: a, found: b}
415 ty::expected_found {expected: b, found: a}
419 pub fn mk_coercety(cx: &InferCtxt,
425 debug!("mk_coercety({} -> {})", a.repr(cx.tcx), b.repr(cx.tcx));
428 let trace = TypeTrace {
430 values: Types(expected_found(a_is_expected, a, b))
432 Coerce(cx.combine_fields(a_is_expected, trace)).tys(a, b)
437 // See comment on the type `resolve_state` below
438 pub fn resolve_type(cx: &InferCtxt,
443 let mut resolver = resolver(cx, modes, span);
444 cx.commit_unconditionally(|| resolver.resolve_type_chk(a))
447 pub fn resolve_region(cx: &InferCtxt, r: ty::Region, modes: uint)
448 -> fres<ty::Region> {
449 let mut resolver = resolver(cx, modes, None);
450 resolver.resolve_region_chk(r)
454 fn then<T:Clone>(&self, f: || -> Result<T,ty::type_err>)
455 -> Result<T,ty::type_err>;
459 fn then<T:Clone>(&self, f: || -> Result<T,ty::type_err>)
460 -> Result<T,ty::type_err> {
461 self.and_then(|_i| f())
466 fn to_ures(&self) -> ures;
469 impl<T> ToUres for cres<T> {
470 fn to_ures(&self) -> ures {
472 Ok(ref _v) => Ok(()),
473 Err(ref e) => Err((*e))
478 trait CresCompare<T> {
479 fn compare(&self, t: T, f: || -> ty::type_err) -> cres<T>;
482 impl<T:Clone + PartialEq> CresCompare<T> for cres<T> {
483 fn compare(&self, t: T, f: || -> ty::type_err) -> cres<T> {
484 (*self).clone().and_then(|s| {
494 pub fn uok() -> ures {
498 pub struct CombinedSnapshot {
499 type_snapshot: type_variable::Snapshot,
500 int_snapshot: unify::Snapshot<ty::IntVid>,
501 float_snapshot: unify::Snapshot<ty::FloatVid>,
502 region_vars_snapshot: RegionSnapshot,
505 impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
506 pub fn skolemizer<'a>(&'a self) -> TypeSkolemizer<'a, 'tcx> {
507 skolemize::TypeSkolemizer::new(self)
510 pub fn combine_fields<'a>(&'a self, a_is_expected: bool, trace: TypeTrace)
511 -> CombineFields<'a, 'tcx> {
512 CombineFields {infcx: self,
513 a_is_expected: a_is_expected,
517 pub fn equate<'a>(&'a self, a_is_expected: bool, trace: TypeTrace) -> Equate<'a, 'tcx> {
518 Equate(self.combine_fields(a_is_expected, trace))
521 pub fn sub<'a>(&'a self, a_is_expected: bool, trace: TypeTrace) -> Sub<'a, 'tcx> {
522 Sub(self.combine_fields(a_is_expected, trace))
525 pub fn lub<'a>(&'a self, a_is_expected: bool, trace: TypeTrace) -> Lub<'a, 'tcx> {
526 Lub(self.combine_fields(a_is_expected, trace))
529 fn start_snapshot(&self) -> CombinedSnapshot {
531 type_snapshot: self.type_variables.borrow_mut().snapshot(),
532 int_snapshot: self.int_unification_table.borrow_mut().snapshot(),
533 float_snapshot: self.float_unification_table.borrow_mut().snapshot(),
534 region_vars_snapshot: self.region_vars.start_snapshot(),
538 fn rollback_to(&self, snapshot: CombinedSnapshot) {
540 let CombinedSnapshot { type_snapshot,
543 region_vars_snapshot } = snapshot;
547 .rollback_to(type_snapshot);
548 self.int_unification_table
550 .rollback_to(int_snapshot);
551 self.float_unification_table
553 .rollback_to(float_snapshot);
555 .rollback_to(region_vars_snapshot);
558 fn commit_from(&self, snapshot: CombinedSnapshot) {
559 debug!("commit_from!");
560 let CombinedSnapshot { type_snapshot,
563 region_vars_snapshot } = snapshot;
567 .commit(type_snapshot);
568 self.int_unification_table
570 .commit(int_snapshot);
571 self.float_unification_table
573 .commit(float_snapshot);
575 .commit(region_vars_snapshot);
578 /// Execute `f` and commit the bindings
579 pub fn commit_unconditionally<R>(&self, f: || -> R) -> R {
581 let snapshot = self.start_snapshot();
583 self.commit_from(snapshot);
587 /// Execute `f` and commit the bindings if successful
588 pub fn commit_if_ok<T,E>(&self, f: || -> Result<T,E>) -> Result<T,E> {
589 self.commit_unconditionally(|| self.try(|| f()))
592 /// Execute `f`, unroll bindings on failure
593 pub fn try<T,E>(&self, f: || -> Result<T,E>) -> Result<T,E> {
595 let snapshot = self.start_snapshot();
597 debug!("try() -- r.is_ok() = {}", r.is_ok());
600 self.commit_from(snapshot);
603 self.rollback_to(snapshot);
609 /// Execute `f` then unroll any bindings it creates
610 pub fn probe<R>(&self, f: || -> R) -> R {
612 let snapshot = self.start_snapshot();
614 self.rollback_to(snapshot);
618 pub fn add_given(&self,
622 self.region_vars.add_given(sub, sup);
625 pub fn sub_types(&self,
632 debug!("sub_types({} <: {})", a.repr(self.tcx), b.repr(self.tcx));
633 let trace = TypeTrace {
635 values: Types(expected_found(a_is_expected, a, b))
637 self.sub(a_is_expected, trace).tys(a, b).to_ures()
640 pub fn eq_types(&self,
647 let trace = TypeTrace {
649 values: Types(expected_found(a_is_expected, a, b))
651 self.equate(a_is_expected, trace).tys(a, b).to_ures()
654 pub fn sub_trait_refs(&self,
661 debug!("sub_trait_refs({} <: {})",
664 let trace = TypeTrace {
666 values: TraitRefs(expected_found(a_is_expected,
667 a.clone(), b.clone()))
669 let suber = self.sub(a_is_expected, trace);
670 suber.trait_refs(&*a, &*b).to_ures()
674 impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
675 pub fn next_ty_var_id(&self) -> TyVid {
681 pub fn next_ty_var(&self) -> ty::t {
682 ty::mk_var(self.tcx, self.next_ty_var_id())
685 pub fn next_ty_vars(&self, n: uint) -> Vec<ty::t> {
686 Vec::from_fn(n, |_i| self.next_ty_var())
689 pub fn next_int_var_id(&self) -> IntVid {
690 self.int_unification_table
695 pub fn next_float_var_id(&self) -> FloatVid {
696 self.float_unification_table
701 pub fn next_region_var(&self, origin: RegionVariableOrigin) -> ty::Region {
702 ty::ReInfer(ty::ReVar(self.region_vars.new_region_var(origin)))
705 pub fn region_vars_for_defs(&self,
707 defs: &[ty::RegionParameterDef])
710 .map(|d| self.next_region_var(EarlyBoundRegion(span, d.name)))
714 pub fn fresh_substs_for_generics(&self,
716 generics: &ty::Generics)
720 * Given a set of generics defined on a type or impl, returns
721 * a substitution mapping each type/region parameter to a
722 * fresh inference variable.
727 |_| self.next_ty_var());
729 generics.regions.map(
730 |d| self.next_region_var(EarlyBoundRegion(span, d.name)));
731 subst::Substs::new(type_params, region_params)
734 pub fn fresh_substs_for_trait(&self,
736 generics: &ty::Generics,
741 * Given a set of generics defined on a trait, returns a
742 * substitution mapping each output type/region parameter to a
743 * fresh inference variable, and mapping the self type to
747 assert!(generics.types.len(subst::SelfSpace) == 1);
748 assert!(generics.types.len(subst::FnSpace) == 0);
749 assert!(generics.regions.len(subst::SelfSpace) == 0);
750 assert!(generics.regions.len(subst::FnSpace) == 0);
752 let type_parameter_count = generics.types.len(subst::TypeSpace);
753 let region_param_defs = generics.regions.get_slice(subst::TypeSpace);
754 let regions = self.region_vars_for_defs(span, region_param_defs);
755 let type_parameters = self.next_ty_vars(type_parameter_count);
756 subst::Substs::new_trait(type_parameters, regions, self_ty)
759 pub fn fresh_bound_region(&self, binder_id: ast::NodeId) -> ty::Region {
760 self.region_vars.new_bound(binder_id)
763 pub fn resolve_regions_and_report_errors(&self) {
764 let errors = self.region_vars.resolve_regions();
765 self.report_region_errors(&errors); // see error_reporting.rs
768 pub fn ty_to_string(&self, t: ty::t) -> String {
769 ty_to_string(self.tcx,
770 self.resolve_type_vars_if_possible(t))
773 pub fn tys_to_string(&self, ts: &[ty::t]) -> String {
774 let tstrs: Vec<String> = ts.iter().map(|t| self.ty_to_string(*t)).collect();
775 format!("({})", tstrs.connect(", "))
778 pub fn trait_ref_to_string(&self, t: &ty::TraitRef) -> String {
779 let t = self.resolve_type_vars_in_trait_ref_if_possible(t);
780 trait_ref_to_string(self.tcx, &t)
783 pub fn contains_unbound_type_variables(&self, typ: ty::t) -> ty::t {
784 match resolve_type(self,
786 typ, resolve_nested_tvar | resolve_ivar) {
787 Ok(new_type) => new_type,
792 pub fn resolve_type_vars_if_possible(&self, typ: ty::t) -> ty::t {
793 match resolve_type(self,
795 typ, resolve_nested_tvar | resolve_ivar) {
796 Ok(new_type) => new_type,
801 pub fn resolve_type_vars_in_trait_ref_if_possible(&self,
802 trait_ref: &ty::TraitRef)
804 // make up a dummy type just to reuse/abuse the resolve machinery
805 let dummy0 = ty::mk_trait(self.tcx,
807 trait_ref.substs.clone(),
808 ty::region_existential_bound(ty::ReStatic));
809 let dummy1 = self.resolve_type_vars_if_possible(dummy0);
810 match ty::get(dummy1).sty {
811 ty::ty_trait(box ty::TyTrait { ref def_id, ref substs, .. }) => {
814 substs: (*substs).clone(),
819 format!("resolve_type_vars_if_possible() yielded {} \
820 when supplied with {}",
821 self.ty_to_string(dummy0),
822 self.ty_to_string(dummy1)).as_slice());
827 // [Note-Type-error-reporting]
828 // An invariant is that anytime the expected or actual type is ty_err (the special
829 // error type, meaning that an error occurred when typechecking this expression),
830 // this is a derived error. The error cascaded from another error (that was already
831 // reported), so it's not useful to display it to the user.
832 // The following four methods -- type_error_message_str, type_error_message_str_with_expected,
833 // type_error_message, and report_mismatched_types -- implement this logic.
834 // They check if either the actual or expected type is ty_err, and don't print the error
835 // in this case. The typechecker should only ever report type errors involving mismatched
836 // types using one of these four methods, and should not call span_err directly for such
838 pub fn type_error_message_str(&self,
840 mk_msg: |Option<String>, String| -> String,
842 err: Option<&ty::type_err>) {
843 self.type_error_message_str_with_expected(sp, mk_msg, None, actual_ty, err)
846 pub fn type_error_message_str_with_expected(&self,
848 mk_msg: |Option<String>,
851 expected_ty: Option<ty::t>,
853 err: Option<&ty::type_err>) {
854 debug!("hi! expected_ty = {:?}, actual_ty = {}", expected_ty, actual_ty);
856 let error_str = err.map_or("".to_string(), |t_err| {
857 format!(" ({})", ty::type_err_to_str(self.tcx, t_err))
859 let resolved_expected = expected_ty.map(|e_ty| {
860 self.resolve_type_vars_if_possible(e_ty)
862 if !resolved_expected.map_or(false, |e| { ty::type_is_error(e) }) {
863 match resolved_expected {
869 mk_msg(None, actual_ty),
870 error_str).as_slice())
873 self.tcx.sess.span_err(sp,
875 mk_msg(Some(self.ty_to_string(e)), actual_ty),
876 error_str).as_slice());
879 for err in err.iter() {
880 ty::note_and_explain_type_err(self.tcx, *err)
885 pub fn type_error_message(&self,
887 mk_msg: |String| -> String,
889 err: Option<&ty::type_err>) {
890 let actual_ty = self.resolve_type_vars_if_possible(actual_ty);
892 // Don't report an error if actual type is ty_err.
893 if ty::type_is_error(actual_ty) {
897 self.type_error_message_str(sp, |_e, a| { mk_msg(a) }, self.ty_to_string(actual_ty), err);
900 pub fn report_mismatched_types(&self,
904 err: &ty::type_err) {
905 let resolved_expected =
906 self.resolve_type_vars_if_possible(e);
907 let mk_msg = match ty::get(resolved_expected).sty {
908 // Don't report an error if expected is ty_err
909 ty::ty_err => return,
911 // if I leave out : String, it infers &str and complains
913 format!("mismatched types: expected `{}`, found `{}`",
914 self.ty_to_string(resolved_expected),
919 self.type_error_message(sp, mk_msg, a, Some(err));
922 pub fn replace_late_bound_regions_with_fresh_regions(&self,
926 HashMap<ty::BoundRegion,
929 replace_late_bound_regions_in_fn_sig(self.tcx, fsig, |br| {
930 let rvar = self.next_region_var(
931 BoundRegionInFnType(trace.origin.span(), br));
932 debug!("Bound region {} maps to {:?}",
933 bound_region_to_string(self.tcx, "", false, br),
941 pub fn fold_regions_in_sig(tcx: &ty::ctxt,
943 fldr: |r: ty::Region| -> ty::Region)
945 ty_fold::RegionFolder::regions(tcx, fldr).fold_sig(fn_sig)
949 pub fn span(&self) -> Span {
954 impl Repr for TypeTrace {
955 fn repr(&self, tcx: &ty::ctxt) -> String {
956 format!("TypeTrace({})", self.origin.repr(tcx))
961 pub fn span(&self) -> Span {
963 MethodCompatCheck(span) => span,
964 ExprAssignable(span) => span,
966 RelateTraitRefs(span) => span,
967 RelateSelfType(span) => span,
968 RelateOutputImplTypes(span) => span,
969 MatchExpressionArm(match_span, _) => match_span,
970 IfExpression(span) => span,
975 impl Repr for TypeOrigin {
976 fn repr(&self, tcx: &ty::ctxt) -> String {
978 MethodCompatCheck(a) => {
979 format!("MethodCompatCheck({})", a.repr(tcx))
981 ExprAssignable(a) => {
982 format!("ExprAssignable({})", a.repr(tcx))
984 Misc(a) => format!("Misc({})", a.repr(tcx)),
985 RelateTraitRefs(a) => {
986 format!("RelateTraitRefs({})", a.repr(tcx))
988 RelateSelfType(a) => {
989 format!("RelateSelfType({})", a.repr(tcx))
991 RelateOutputImplTypes(a) => {
992 format!("RelateOutputImplTypes({})", a.repr(tcx))
994 MatchExpressionArm(a, b) => {
995 format!("MatchExpressionArm({}, {})", a.repr(tcx), b.repr(tcx))
998 format!("IfExpression({})", a.repr(tcx))
1004 impl SubregionOrigin {
1005 pub fn span(&self) -> Span {
1007 Subtype(ref a) => a.span(),
1008 InfStackClosure(a) => a,
1009 InvokeClosure(a) => a,
1010 DerefPointer(a) => a,
1011 FreeVariable(a, _) => a,
1012 ProcCapture(a, _) => a,
1014 RelateObjectBound(a) => a,
1015 RelateProcBound(a, _, _) => a,
1016 RelateParamBound(a, _, _) => a,
1017 RelateRegionParamBound(a) => a,
1018 RelateDefaultParamBound(a, _) => a,
1020 ReborrowUpvar(a, _) => a,
1021 ReferenceOutlivesReferent(_, a) => a,
1022 ExprTypeIsNotInScope(_, a) => a,
1023 BindingTypeIsNotValidAtDecl(a) => a,
1033 impl Repr for SubregionOrigin {
1034 fn repr(&self, tcx: &ty::ctxt) -> String {
1037 format!("Subtype({})", a.repr(tcx))
1039 InfStackClosure(a) => {
1040 format!("InfStackClosure({})", a.repr(tcx))
1042 InvokeClosure(a) => {
1043 format!("InvokeClosure({})", a.repr(tcx))
1045 DerefPointer(a) => {
1046 format!("DerefPointer({})", a.repr(tcx))
1048 FreeVariable(a, b) => {
1049 format!("FreeVariable({}, {})", a.repr(tcx), b)
1051 ProcCapture(a, b) => {
1052 format!("ProcCapture({}, {})", a.repr(tcx), b)
1055 format!("IndexSlice({})", a.repr(tcx))
1057 RelateObjectBound(a) => {
1058 format!("RelateObjectBound({})", a.repr(tcx))
1060 RelateProcBound(a, b, c) => {
1061 format!("RelateProcBound({},{},{})",
1066 RelateParamBound(a, b, c) => {
1067 format!("RelateParamBound({},{},{})",
1072 RelateRegionParamBound(a) => {
1073 format!("RelateRegionParamBound({})",
1076 RelateDefaultParamBound(a, b) => {
1077 format!("RelateDefaultParamBound({},{})",
1081 Reborrow(a) => format!("Reborrow({})", a.repr(tcx)),
1082 ReborrowUpvar(a, b) => {
1083 format!("ReborrowUpvar({},{:?})", a.repr(tcx), b)
1085 ReferenceOutlivesReferent(_, a) => {
1086 format!("ReferenceOutlivesReferent({})", a.repr(tcx))
1088 ExprTypeIsNotInScope(a, b) => {
1089 format!("ExprTypeIsNotInScope({}, {})",
1093 BindingTypeIsNotValidAtDecl(a) => {
1094 format!("BindingTypeIsNotValidAtDecl({})", a.repr(tcx))
1096 CallRcvr(a) => format!("CallRcvr({})", a.repr(tcx)),
1097 CallArg(a) => format!("CallArg({})", a.repr(tcx)),
1098 CallReturn(a) => format!("CallReturn({})", a.repr(tcx)),
1099 AddrOf(a) => format!("AddrOf({})", a.repr(tcx)),
1100 AutoBorrow(a) => format!("AutoBorrow({})", a.repr(tcx)),
1105 impl RegionVariableOrigin {
1106 pub fn span(&self) -> Span {
1108 MiscVariable(a) => a,
1109 PatternRegion(a) => a,
1110 AddrOfRegion(a) => a,
1111 AddrOfSlice(a) => a,
1113 Coercion(ref a) => a.span(),
1114 EarlyBoundRegion(a, _) => a,
1115 LateBoundRegion(a, _) => a,
1116 BoundRegionInFnType(a, _) => a,
1117 BoundRegionInCoherence(_) => codemap::DUMMY_SP,
1118 UpvarRegion(_, a) => a
1123 impl Repr for RegionVariableOrigin {
1124 fn repr(&self, tcx: &ty::ctxt) -> String {
1126 MiscVariable(a) => {
1127 format!("MiscVariable({})", a.repr(tcx))
1129 PatternRegion(a) => {
1130 format!("PatternRegion({})", a.repr(tcx))
1132 AddrOfRegion(a) => {
1133 format!("AddrOfRegion({})", a.repr(tcx))
1135 AddrOfSlice(a) => format!("AddrOfSlice({})", a.repr(tcx)),
1136 Autoref(a) => format!("Autoref({})", a.repr(tcx)),
1137 Coercion(ref a) => format!("Coercion({})", a.repr(tcx)),
1138 EarlyBoundRegion(a, b) => {
1139 format!("EarlyBoundRegion({},{})", a.repr(tcx), b.repr(tcx))
1141 LateBoundRegion(a, b) => {
1142 format!("LateBoundRegion({},{})", a.repr(tcx), b.repr(tcx))
1144 BoundRegionInFnType(a, b) => {
1145 format!("bound_regionInFnType({},{})", a.repr(tcx),
1148 BoundRegionInCoherence(a) => {
1149 format!("bound_regionInCoherence({})", a.repr(tcx))
1151 UpvarRegion(a, b) => {
1152 format!("UpvarRegion({}, {})", a.repr(tcx), b.repr(tcx))