Skip to content

Commit 1e83503

Browse files
committed
Auto merge of #30317 - jseyfried:refactor_type_folder, r=nikomatsakis
`TypeFoldable`s can currently be visited inefficiently with an identity folder that is run only for its side effects. This creates a more efficient visitor for `TypeFoldable`s and uses it to implement `RegionEscape` and `HasProjectionTypes`, fixing cleanup issue #20298. This is a pure refactoring.
2 parents 2edb1d9 + 6327563 commit 1e83503

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+689
-873
lines changed

src/librustc/middle/implicator.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use middle::def_id::DefId;
1414
use middle::infer::{InferCtxt, GenericKind};
1515
use middle::subst::Substs;
1616
use middle::traits;
17-
use middle::ty::{self, RegionEscape, ToPredicate, Ty};
17+
use middle::ty::{self, ToPredicate, Ty};
1818
use middle::ty::fold::{TypeFoldable, TypeFolder};
1919

2020
use syntax::ast;
@@ -404,7 +404,7 @@ impl<'a, 'tcx> Implicator<'a, 'tcx> {
404404
}
405405

406406
fn fully_normalize<T>(&self, value: &T) -> Result<T,ErrorReported>
407-
where T : TypeFoldable<'tcx> + ty::HasTypeFlags
407+
where T : TypeFoldable<'tcx>
408408
{
409409
let value =
410410
traits::fully_normalize(self.infcx,

src/librustc/middle/infer/combine.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ impl<'cx, 'tcx> ty::fold::TypeFolder<'tcx> for Generalizer<'cx, 'tcx> {
318318
}
319319
}
320320
_ => {
321-
ty::fold::super_fold_ty(self, t)
321+
t.super_fold_with(self)
322322
}
323323
}
324324
}

src/librustc/middle/infer/error_reporting.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ use middle::def_id::DefId;
8282
use middle::infer::{self, TypeOrigin};
8383
use middle::region;
8484
use middle::subst;
85-
use middle::ty::{self, Ty, HasTypeFlags};
85+
use middle::ty::{self, Ty, TypeFoldable};
8686
use middle::ty::{Region, ReFree};
8787
use middle::ty::error::TypeError;
8888

@@ -250,7 +250,7 @@ pub trait ErrorReporting<'tcx> {
250250

251251
fn values_str(&self, values: &ValuePairs<'tcx>) -> Option<String>;
252252

253-
fn expected_found_str<T: fmt::Display + Resolvable<'tcx> + HasTypeFlags>(
253+
fn expected_found_str<T: fmt::Display + Resolvable<'tcx> + TypeFoldable<'tcx>>(
254254
&self,
255255
exp_found: &ty::error::ExpectedFound<T>)
256256
-> Option<String>;
@@ -575,7 +575,7 @@ impl<'a, 'tcx> ErrorReporting<'tcx> for InferCtxt<'a, 'tcx> {
575575
}
576576
}
577577

578-
fn expected_found_str<T: fmt::Display + Resolvable<'tcx> + HasTypeFlags>(
578+
fn expected_found_str<T: fmt::Display + Resolvable<'tcx> + TypeFoldable<'tcx>>(
579579
&self,
580580
exp_found: &ty::error::ExpectedFound<T>)
581581
-> Option<String>

src/librustc/middle/infer/freshen.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@
3030
//! variable only once, and it does so as soon as it can, so it is reasonable to ask what the type
3131
//! inferencer knows "so far".
3232
33-
use middle::ty::{self, Ty, HasTypeFlags};
34-
use middle::ty::fold::TypeFoldable;
33+
use middle::ty::{self, Ty, TypeFoldable};
3534
use middle::ty::fold::TypeFolder;
3635
use std::collections::hash_map::{self, Entry};
3736

@@ -169,7 +168,7 @@ impl<'a, 'tcx> TypeFolder<'tcx> for TypeFreshener<'a, 'tcx> {
169168
ty::TyTuple(..) |
170169
ty::TyProjection(..) |
171170
ty::TyParam(..) => {
172-
ty::fold::super_fold_ty(self, t)
171+
t.super_fold_with(self)
173172
}
174173
}
175174
}

src/librustc/middle/infer/higher_ranked/mod.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,8 @@
1414
use super::{CombinedSnapshot, InferCtxt, HigherRankedType, SkolemizationMap};
1515
use super::combine::CombineFields;
1616

17-
use middle::ty::{self, Binder};
17+
use middle::ty::{self, Binder, TypeFoldable};
1818
use middle::ty::error::TypeError;
19-
use middle::ty::fold::TypeFoldable;
2019
use middle::ty::relate::{Relate, RelateResult, TypeRelation};
2120
use syntax::codemap::Span;
2221
use util::nodemap::{FnvHashMap, FnvHashSet};
@@ -557,7 +556,7 @@ pub fn plug_leaks<'a,'tcx,T>(infcx: &InferCtxt<'a,'tcx>,
557556
snapshot: &CombinedSnapshot,
558557
value: &T)
559558
-> T
560-
where T : TypeFoldable<'tcx> + ty::HasTypeFlags
559+
where T : TypeFoldable<'tcx>
561560
{
562561
debug_assert!(leak_check(infcx, &skol_map, snapshot).is_ok());
563562

src/librustc/middle/infer/mod.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ use middle::subst::Subst;
3030
use middle::traits;
3131
use middle::ty::adjustment;
3232
use middle::ty::{TyVid, IntVid, FloatVid};
33-
use middle::ty::{self, Ty, HasTypeFlags};
33+
use middle::ty::{self, Ty};
3434
use middle::ty::error::{ExpectedFound, TypeError, UnconstrainedNumeric};
3535
use middle::ty::fold::{TypeFolder, TypeFoldable};
3636
use middle::ty::relate::{Relate, RelateResult, TypeRelation};
@@ -512,7 +512,7 @@ pub struct CombinedSnapshot {
512512
}
513513

514514
pub fn normalize_associated_type<'tcx,T>(tcx: &ty::ctxt<'tcx>, value: &T) -> T
515-
where T : TypeFoldable<'tcx> + HasTypeFlags
515+
where T : TypeFoldable<'tcx>
516516
{
517517
debug!("normalize_associated_type(t={:?})", value);
518518

@@ -546,7 +546,7 @@ pub fn drain_fulfillment_cx_or_panic<'a,'tcx,T>(span: Span,
546546
fulfill_cx: &mut traits::FulfillmentContext<'tcx>,
547547
result: &T)
548548
-> T
549-
where T : TypeFoldable<'tcx> + HasTypeFlags
549+
where T : TypeFoldable<'tcx>
550550
{
551551
match drain_fulfillment_cx(infcx, fulfill_cx, result) {
552552
Ok(v) => v,
@@ -570,7 +570,7 @@ pub fn drain_fulfillment_cx<'a,'tcx,T>(infcx: &InferCtxt<'a,'tcx>,
570570
fulfill_cx: &mut traits::FulfillmentContext<'tcx>,
571571
result: &T)
572572
-> Result<T,Vec<traits::FulfillmentError<'tcx>>>
573-
where T : TypeFoldable<'tcx> + HasTypeFlags
573+
where T : TypeFoldable<'tcx>
574574
{
575575
debug!("drain_fulfillment_cx(result={:?})",
576576
result);
@@ -929,7 +929,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
929929
snapshot: &CombinedSnapshot,
930930
value: &T)
931931
-> T
932-
where T : TypeFoldable<'tcx> + HasTypeFlags
932+
where T : TypeFoldable<'tcx>
933933
{
934934
/*! See `higher_ranked::plug_leaks` */
935935

@@ -1201,7 +1201,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
12011201
}
12021202

12031203
pub fn resolve_type_vars_if_possible<T>(&self, value: &T) -> T
1204-
where T: TypeFoldable<'tcx> + HasTypeFlags
1204+
where T: TypeFoldable<'tcx>
12051205
{
12061206
/*!
12071207
* Where possible, replaces type/int/float variables in

src/librustc/middle/infer/resolve.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@
99
// except according to those terms.
1010

1111
use super::{InferCtxt, FixupError, FixupResult};
12-
use middle::ty::{self, Ty, HasTypeFlags};
13-
use middle::ty::fold::{TypeFoldable};
12+
use middle::ty::{self, Ty, TypeFoldable};
1413

1514
///////////////////////////////////////////////////////////////////////////
1615
// OPPORTUNISTIC TYPE RESOLVER
@@ -40,7 +39,7 @@ impl<'a, 'tcx> ty::fold::TypeFolder<'tcx> for OpportunisticTypeResolver<'a, 'tcx
4039
t // micro-optimize -- if there is nothing in this type that this fold affects...
4140
} else {
4241
let t0 = self.infcx.shallow_resolve(t);
43-
ty::fold::super_fold_ty(self, t0)
42+
t0.super_fold_with(self)
4443
}
4544
}
4645
}
@@ -68,7 +67,7 @@ impl<'a, 'tcx> ty::fold::TypeFolder<'tcx> for OpportunisticTypeAndRegionResolver
6867
t // micro-optimize -- if there is nothing in this type that this fold affects...
6968
} else {
7069
let t0 = self.infcx.shallow_resolve(t);
71-
ty::fold::super_fold_ty(self, t0)
70+
t0.super_fold_with(self)
7271
}
7372
}
7473

@@ -133,7 +132,7 @@ impl<'a, 'tcx> ty::fold::TypeFolder<'tcx> for FullTypeResolver<'a, 'tcx> {
133132
t));
134133
}
135134
_ => {
136-
ty::fold::super_fold_ty(self, t)
135+
t.super_fold_with(self)
137136
}
138137
}
139138
}

src/librustc/middle/intrinsicck.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use middle::def::DefFn;
1313
use middle::def_id::DefId;
1414
use middle::subst::{Subst, Substs, EnumeratedItems};
1515
use middle::ty::{TransmuteRestriction, ctxt, TyBareFn};
16-
use middle::ty::{self, Ty, HasTypeFlags};
16+
use middle::ty::{self, Ty, TypeFoldable};
1717

1818
use std::fmt;
1919

src/librustc/middle/subst.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ pub use self::ParamSpace::*;
1414
pub use self::RegionSubsts::*;
1515

1616
use middle::cstore;
17-
use middle::ty::{self, Ty, HasTypeFlags, RegionEscape};
17+
use middle::ty::{self, Ty};
1818
use middle::ty::fold::{TypeFoldable, TypeFolder};
1919

2020
use serialize::{Encodable, Encoder, Decodable, Decoder};
@@ -674,7 +674,7 @@ impl<'a, 'tcx> TypeFolder<'tcx> for SubstFolder<'a, 'tcx> {
674674
self.ty_for_param(p, t)
675675
}
676676
_ => {
677-
ty::fold::super_fold_ty(self, t)
677+
t.super_fold_with(self)
678678
}
679679
};
680680

src/librustc/middle/traits/error_reporting.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,8 @@ use super::{
2626
use fmt_macros::{Parser, Piece, Position};
2727
use middle::def_id::DefId;
2828
use middle::infer::InferCtxt;
29-
use middle::ty::{self, ToPredicate, HasTypeFlags, ToPolyTraitRef, TraitRef, Ty};
29+
use middle::ty::{self, ToPredicate, ToPolyTraitRef, TraitRef, Ty, TypeFoldable};
3030
use middle::ty::fast_reject;
31-
use middle::ty::fold::TypeFoldable;
3231
use util::nodemap::{FnvHashMap, FnvHashSet};
3332

3433
use std::cmp;
@@ -185,7 +184,7 @@ fn report_on_unimplemented<'a, 'tcx>(infcx: &InferCtxt<'a, 'tcx>,
185184
pub fn report_overflow_error<'a, 'tcx, T>(infcx: &InferCtxt<'a, 'tcx>,
186185
obligation: &Obligation<'tcx, T>)
187186
-> !
188-
where T: fmt::Display + TypeFoldable<'tcx> + HasTypeFlags
187+
where T: fmt::Display + TypeFoldable<'tcx>
189188
{
190189
let predicate =
191190
infcx.resolve_type_vars_if_possible(&obligation.predicate);

0 commit comments

Comments
 (0)