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

+2-2
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

+1-1
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

+3-3
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

+2-3
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

+2-3
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

+6-6
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

+4-5
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

+1-1
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

+2-2
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

+2-3
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);

src/librustc/middle/traits/fulfill.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
// except according to those terms.
1010

1111
use middle::infer::InferCtxt;
12-
use middle::ty::{self, RegionEscape, Ty, HasTypeFlags};
12+
use middle::ty::{self, Ty, TypeFoldable};
1313

1414
use syntax::ast;
1515
use util::common::ErrorReported;

src/librustc/middle/traits/mod.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,8 @@ use dep_graph::DepNode;
1919
use middle::def_id::DefId;
2020
use middle::free_region::FreeRegionMap;
2121
use middle::subst;
22-
use middle::ty::{self, HasTypeFlags, Ty};
22+
use middle::ty::{self, Ty, TypeFoldable};
2323
use middle::ty::fast_reject;
24-
use middle::ty::fold::TypeFoldable;
2524
use middle::infer::{self, fixup_err_to_string, InferCtxt};
2625

2726
use std::rc::Rc;
@@ -470,7 +469,7 @@ pub fn fully_normalize<'a,'tcx,T>(infcx: &InferCtxt<'a,'tcx>,
470469
cause: ObligationCause<'tcx>,
471470
value: &T)
472471
-> Result<T, Vec<FulfillmentError<'tcx>>>
473-
where T : TypeFoldable<'tcx> + HasTypeFlags
472+
where T : TypeFoldable<'tcx>
474473
{
475474
debug!("normalize_param_env(value={:?})", value);
476475

src/librustc/middle/traits/object_safety.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use super::elaborate_predicates;
2323
use middle::def_id::DefId;
2424
use middle::subst::{self, SelfSpace, TypeSpace};
2525
use middle::traits;
26-
use middle::ty::{self, HasTypeFlags, ToPolyTraitRef, Ty};
26+
use middle::ty::{self, ToPolyTraitRef, Ty, TypeFoldable};
2727
use std::rc::Rc;
2828
use syntax::ast;
2929

src/librustc/middle/traits/project.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use super::util;
2323

2424
use middle::infer::{self, TypeOrigin};
2525
use middle::subst::Subst;
26-
use middle::ty::{self, ToPredicate, RegionEscape, HasTypeFlags, ToPolyTraitRef, Ty};
26+
use middle::ty::{self, ToPredicate, ToPolyTraitRef, Ty};
2727
use middle::ty::fold::{TypeFoldable, TypeFolder};
2828
use syntax::parse::token;
2929
use util::common::FN_OUTPUT_NAME;
@@ -202,7 +202,7 @@ pub fn normalize<'a,'b,'tcx,T>(selcx: &'a mut SelectionContext<'b,'tcx>,
202202
cause: ObligationCause<'tcx>,
203203
value: &T)
204204
-> Normalized<'tcx, T>
205-
where T : TypeFoldable<'tcx> + HasTypeFlags
205+
where T : TypeFoldable<'tcx>
206206
{
207207
normalize_with_depth(selcx, cause, 0, value)
208208
}
@@ -213,7 +213,7 @@ pub fn normalize_with_depth<'a,'b,'tcx,T>(selcx: &'a mut SelectionContext<'b,'tc
213213
depth: usize,
214214
value: &T)
215215
-> Normalized<'tcx, T>
216-
where T : TypeFoldable<'tcx> + HasTypeFlags
216+
where T : TypeFoldable<'tcx>
217217
{
218218
let mut normalizer = AssociatedTypeNormalizer::new(selcx, cause, depth);
219219
let result = normalizer.fold(value);
@@ -245,7 +245,7 @@ impl<'a,'b,'tcx> AssociatedTypeNormalizer<'a,'b,'tcx> {
245245
}
246246
}
247247

248-
fn fold<T:TypeFoldable<'tcx> + HasTypeFlags>(&mut self, value: &T) -> T {
248+
fn fold<T:TypeFoldable<'tcx>>(&mut self, value: &T) -> T {
249249
let value = self.selcx.infcx().resolve_type_vars_if_possible(value);
250250

251251
if !value.has_projection_types() {
@@ -273,7 +273,7 @@ impl<'a,'b,'tcx> TypeFolder<'tcx> for AssociatedTypeNormalizer<'a,'b,'tcx> {
273273
// normalize it when we instantiate those bound regions (which
274274
// should occur eventually).
275275

276-
let ty = ty::fold::super_fold_ty(self, ty);
276+
let ty = ty.super_fold_with(self);
277277
match ty.sty {
278278
ty::TyProjection(ref data) if !data.has_escaping_regions() => { // (*)
279279

src/librustc/middle/traits/select.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,8 @@ use middle::def_id::DefId;
3939
use middle::infer;
4040
use middle::infer::{InferCtxt, TypeFreshener, TypeOrigin};
4141
use middle::subst::{Subst, Substs, TypeSpace};
42-
use middle::ty::{self, ToPredicate, RegionEscape, ToPolyTraitRef, Ty, HasTypeFlags};
42+
use middle::ty::{self, ToPredicate, ToPolyTraitRef, Ty, TypeFoldable};
4343
use middle::ty::fast_reject;
44-
use middle::ty::fold::TypeFoldable;
4544
use middle::ty::relate::TypeRelation;
4645

4746
use std::cell::RefCell;
@@ -965,7 +964,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
965964
match *candidate {
966965
Ok(Some(_)) | Err(_) => true,
967966
Ok(None) => {
968-
cache_fresh_trait_pred.0.input_types().has_infer_types()
967+
cache_fresh_trait_pred.0.trait_ref.substs.types.has_infer_types()
969968
}
970969
}
971970
}

0 commit comments

Comments
 (0)