rustc: avoid using subst::VecPerParamSpace::{empty,new} directly.
This commit is contained in:
parent
77dc61b5c6
commit
c87063f07e
9 changed files with 38 additions and 44 deletions
|
@ -180,9 +180,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||||
ity.ty);
|
ity.ty);
|
||||||
|
|
||||||
let rps = self.region_vars_for_defs(obligation.cause.span, rps);
|
let rps = self.region_vars_for_defs(obligation.cause.span, rps);
|
||||||
let mut substs = subst::Substs::new(
|
let mut substs = subst::Substs::new_type(vec![], rps);
|
||||||
subst::VecPerParamSpace::empty(),
|
|
||||||
subst::VecPerParamSpace::new(Vec::new(), rps, Vec::new()));
|
|
||||||
self.type_vars_for_defs(obligation.cause.span,
|
self.type_vars_for_defs(obligation.cause.span,
|
||||||
TypeSpace,
|
TypeSpace,
|
||||||
&mut substs,
|
&mut substs,
|
||||||
|
|
|
@ -429,6 +429,15 @@ pub struct ItemVariances {
|
||||||
pub regions: VecPerParamSpace<Variance>,
|
pub regions: VecPerParamSpace<Variance>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ItemVariances {
|
||||||
|
pub fn empty() -> ItemVariances {
|
||||||
|
ItemVariances {
|
||||||
|
types: VecPerParamSpace::empty(),
|
||||||
|
regions: VecPerParamSpace::empty(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone, PartialEq, RustcDecodable, RustcEncodable, Copy)]
|
#[derive(Clone, PartialEq, RustcDecodable, RustcEncodable, Copy)]
|
||||||
pub enum Variance {
|
pub enum Variance {
|
||||||
Covariant, // T<A> <: T<B> iff A <: B -- e.g., function return type
|
Covariant, // T<A> <: T<B> iff A <: B -- e.g., function return type
|
||||||
|
@ -2864,22 +2873,20 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
|
||||||
pub fn construct_free_substs(self, generics: &Generics<'gcx>,
|
pub fn construct_free_substs(self, generics: &Generics<'gcx>,
|
||||||
free_id_outlive: CodeExtent) -> Substs<'gcx> {
|
free_id_outlive: CodeExtent) -> Substs<'gcx> {
|
||||||
// map T => T
|
// map T => T
|
||||||
let mut types = VecPerParamSpace::empty();
|
let types = generics.types.map(|def| {
|
||||||
for def in generics.types.as_full_slice() {
|
|
||||||
debug!("construct_parameter_environment(): push_types_from_defs: def={:?}",
|
debug!("construct_parameter_environment(): push_types_from_defs: def={:?}",
|
||||||
def);
|
def);
|
||||||
types.push(def.space, self.global_tcx().mk_param_from_def(def));
|
self.global_tcx().mk_param_from_def(def)
|
||||||
}
|
});
|
||||||
|
|
||||||
// map bound 'a => free 'a
|
// map bound 'a => free 'a
|
||||||
let mut regions = VecPerParamSpace::empty();
|
let regions = generics.regions.map(|def| {
|
||||||
for def in generics.regions.as_full_slice() {
|
|
||||||
let region =
|
let region =
|
||||||
ReFree(FreeRegion { scope: free_id_outlive,
|
ReFree(FreeRegion { scope: free_id_outlive,
|
||||||
bound_region: def.to_bound_region() });
|
bound_region: def.to_bound_region() });
|
||||||
debug!("push_region_params {:?}", region);
|
debug!("push_region_params {:?}", region);
|
||||||
regions.push(def.space, region);
|
region
|
||||||
}
|
});
|
||||||
|
|
||||||
Substs {
|
Substs {
|
||||||
types: types,
|
types: types,
|
||||||
|
|
|
@ -41,6 +41,14 @@ impl<'a, 'gcx, 'tcx> Substs<'tcx> {
|
||||||
Substs { types: t, regions: r }
|
Substs { types: t, regions: r }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn new_fn(t: Vec<Ty<'tcx>>,
|
||||||
|
r: Vec<ty::Region>)
|
||||||
|
-> Substs<'tcx>
|
||||||
|
{
|
||||||
|
Substs::new(VecPerParamSpace::new(vec![], vec![], t),
|
||||||
|
VecPerParamSpace::new(vec![], vec![], r))
|
||||||
|
}
|
||||||
|
|
||||||
pub fn new_type(t: Vec<Ty<'tcx>>,
|
pub fn new_type(t: Vec<Ty<'tcx>>,
|
||||||
r: Vec<ty::Region>)
|
r: Vec<ty::Region>)
|
||||||
-> Substs<'tcx>
|
-> Substs<'tcx>
|
||||||
|
|
|
@ -35,7 +35,6 @@ use middle::cstore::{DefLike, DlDef, DlField, DlImpl, tls};
|
||||||
use rustc::hir::def::Def;
|
use rustc::hir::def::Def;
|
||||||
use rustc::hir::def_id::{DefId, DefIndex};
|
use rustc::hir::def_id::{DefId, DefIndex};
|
||||||
use middle::lang_items;
|
use middle::lang_items;
|
||||||
use rustc::ty::subst;
|
|
||||||
use rustc::ty::{ImplContainer, TraitContainer};
|
use rustc::ty::{ImplContainer, TraitContainer};
|
||||||
use rustc::ty::{self, Ty, TyCtxt, TypeFoldable, VariantKind};
|
use rustc::ty::{self, Ty, TyCtxt, TypeFoldable, VariantKind};
|
||||||
|
|
||||||
|
@ -1580,25 +1579,24 @@ fn doc_generics<'a, 'tcx>(base_doc: rbml::Doc,
|
||||||
{
|
{
|
||||||
let doc = reader::get_doc(base_doc, tag);
|
let doc = reader::get_doc(base_doc, tag);
|
||||||
|
|
||||||
let mut types = subst::VecPerParamSpace::empty();
|
let mut generics = ty::Generics::empty();
|
||||||
for p in reader::tagged_docs(doc, tag_type_param_def) {
|
for p in reader::tagged_docs(doc, tag_type_param_def) {
|
||||||
let bd =
|
let bd =
|
||||||
TyDecoder::with_doc(tcx, cdata.cnum, p,
|
TyDecoder::with_doc(tcx, cdata.cnum, p,
|
||||||
&mut |did| translate_def_id(cdata, did))
|
&mut |did| translate_def_id(cdata, did))
|
||||||
.parse_type_param_def();
|
.parse_type_param_def();
|
||||||
types.push(bd.space, bd);
|
generics.types.push(bd.space, bd);
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut regions = subst::VecPerParamSpace::empty();
|
|
||||||
for p in reader::tagged_docs(doc, tag_region_param_def) {
|
for p in reader::tagged_docs(doc, tag_region_param_def) {
|
||||||
let bd =
|
let bd =
|
||||||
TyDecoder::with_doc(tcx, cdata.cnum, p,
|
TyDecoder::with_doc(tcx, cdata.cnum, p,
|
||||||
&mut |did| translate_def_id(cdata, did))
|
&mut |did| translate_def_id(cdata, did))
|
||||||
.parse_region_param_def();
|
.parse_region_param_def();
|
||||||
regions.push(bd.space, bd);
|
generics.regions.push(bd.space, bd);
|
||||||
}
|
}
|
||||||
|
|
||||||
ty::Generics { types: types, regions: regions }
|
generics
|
||||||
}
|
}
|
||||||
|
|
||||||
fn doc_predicate<'a, 'tcx>(cdata: Cmd,
|
fn doc_predicate<'a, 'tcx>(cdata: Cmd,
|
||||||
|
|
|
@ -89,7 +89,7 @@ should go to.
|
||||||
use build::{BlockAnd, BlockAndExtension, Builder, CFG, ScopeAuxiliary, ScopeId};
|
use build::{BlockAnd, BlockAndExtension, Builder, CFG, ScopeAuxiliary, ScopeId};
|
||||||
use rustc::middle::region::{CodeExtent, CodeExtentData};
|
use rustc::middle::region::{CodeExtent, CodeExtentData};
|
||||||
use rustc::middle::lang_items;
|
use rustc::middle::lang_items;
|
||||||
use rustc::ty::subst::{Substs, Subst, VecPerParamSpace};
|
use rustc::ty::subst::{Substs, Subst};
|
||||||
use rustc::ty::{Ty, TyCtxt};
|
use rustc::ty::{Ty, TyCtxt};
|
||||||
use rustc::mir::repr::*;
|
use rustc::mir::repr::*;
|
||||||
use syntax_pos::Span;
|
use syntax_pos::Span;
|
||||||
|
@ -750,10 +750,7 @@ fn build_free<'a, 'gcx, 'tcx>(tcx: TyCtxt<'a, 'gcx, 'tcx>,
|
||||||
-> TerminatorKind<'tcx> {
|
-> TerminatorKind<'tcx> {
|
||||||
let free_func = tcx.lang_items.require(lang_items::BoxFreeFnLangItem)
|
let free_func = tcx.lang_items.require(lang_items::BoxFreeFnLangItem)
|
||||||
.unwrap_or_else(|e| tcx.sess.fatal(&e));
|
.unwrap_or_else(|e| tcx.sess.fatal(&e));
|
||||||
let substs = tcx.mk_substs(Substs::new(
|
let substs = tcx.mk_substs(Substs::new_fn(vec![data.item_ty], vec![]));
|
||||||
VecPerParamSpace::new(vec![], vec![], vec![data.item_ty]),
|
|
||||||
VecPerParamSpace::new(vec![], vec![], vec![])
|
|
||||||
));
|
|
||||||
TerminatorKind::Call {
|
TerminatorKind::Call {
|
||||||
func: Operand::Constant(Constant {
|
func: Operand::Constant(Constant {
|
||||||
span: data.span,
|
span: data.span,
|
||||||
|
|
|
@ -39,7 +39,7 @@ use rustc::cfg;
|
||||||
use rustc::hir::def_id::DefId;
|
use rustc::hir::def_id::DefId;
|
||||||
use middle::lang_items::{LangItem, ExchangeMallocFnLangItem, StartFnLangItem};
|
use middle::lang_items::{LangItem, ExchangeMallocFnLangItem, StartFnLangItem};
|
||||||
use rustc::hir::pat_util::simple_name;
|
use rustc::hir::pat_util::simple_name;
|
||||||
use rustc::ty::subst::{self, Substs};
|
use rustc::ty::subst::Substs;
|
||||||
use rustc::traits;
|
use rustc::traits;
|
||||||
use rustc::ty::{self, Ty, TyCtxt, TypeFoldable};
|
use rustc::ty::{self, Ty, TyCtxt, TypeFoldable};
|
||||||
use rustc::ty::adjustment::CustomCoerceUnsized;
|
use rustc::ty::adjustment::CustomCoerceUnsized;
|
||||||
|
@ -675,10 +675,7 @@ pub fn custom_coerce_unsize_info<'scx, 'tcx>(scx: &SharedCrateContext<'scx, 'tcx
|
||||||
source_ty: Ty<'tcx>,
|
source_ty: Ty<'tcx>,
|
||||||
target_ty: Ty<'tcx>)
|
target_ty: Ty<'tcx>)
|
||||||
-> CustomCoerceUnsized {
|
-> CustomCoerceUnsized {
|
||||||
let trait_substs = Substs::new(subst::VecPerParamSpace::new(vec![source_ty],
|
let trait_substs = Substs::new_trait(vec![target_ty], vec![], source_ty);
|
||||||
vec![target_ty],
|
|
||||||
Vec::new()),
|
|
||||||
subst::VecPerParamSpace::empty());
|
|
||||||
|
|
||||||
let trait_ref = ty::Binder(ty::TraitRef {
|
let trait_ref = ty::Binder(ty::TraitRef {
|
||||||
def_id: scx.tcx().lang_items.coerce_unsized_trait().unwrap(),
|
def_id: scx.tcx().lang_items.coerce_unsized_trait().unwrap(),
|
||||||
|
|
|
@ -2796,9 +2796,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
|
||||||
debug!("impl_self_ty: tps={:?} rps={:?} raw_ty={:?}", tps, rps, raw_ty);
|
debug!("impl_self_ty: tps={:?} rps={:?} raw_ty={:?}", tps, rps, raw_ty);
|
||||||
|
|
||||||
let rps = self.region_vars_for_defs(span, rps);
|
let rps = self.region_vars_for_defs(span, rps);
|
||||||
let mut substs = subst::Substs::new(
|
let mut substs = subst::Substs::new_type(vec![], rps);
|
||||||
VecPerParamSpace::empty(),
|
|
||||||
VecPerParamSpace::new(Vec::new(), rps, Vec::new()));
|
|
||||||
self.type_vars_for_defs(span, ParamSpace::TypeSpace, &mut substs, tps);
|
self.type_vars_for_defs(span, ParamSpace::TypeSpace, &mut substs, tps);
|
||||||
let substd_ty = self.instantiate_type_scheme(span, &substs, &raw_ty);
|
let substd_ty = self.instantiate_type_scheme(span, &substs, &raw_ty);
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
//! optimal solution to the constraints. The final variance for each
|
//! optimal solution to the constraints. The final variance for each
|
||||||
//! inferred is then written into the `variance_map` in the tcx.
|
//! inferred is then written into the `variance_map` in the tcx.
|
||||||
|
|
||||||
use rustc::ty::subst::VecPerParamSpace;
|
|
||||||
use rustc::ty;
|
use rustc::ty;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
|
@ -109,8 +108,7 @@ impl<'a, 'tcx> SolveContext<'a, 'tcx> {
|
||||||
let num_inferred = self.terms_cx.num_inferred();
|
let num_inferred = self.terms_cx.num_inferred();
|
||||||
while index < num_inferred {
|
while index < num_inferred {
|
||||||
let item_id = inferred_infos[index].item_id;
|
let item_id = inferred_infos[index].item_id;
|
||||||
let mut types = VecPerParamSpace::empty();
|
let mut item_variances = ty::ItemVariances::empty();
|
||||||
let mut regions = VecPerParamSpace::empty();
|
|
||||||
|
|
||||||
while index < num_inferred && inferred_infos[index].item_id == item_id {
|
while index < num_inferred && inferred_infos[index].item_id == item_id {
|
||||||
let info = &inferred_infos[index];
|
let info = &inferred_infos[index];
|
||||||
|
@ -118,17 +116,13 @@ impl<'a, 'tcx> SolveContext<'a, 'tcx> {
|
||||||
debug!("Index {} Info {} / {:?} / {:?} Variance {:?}",
|
debug!("Index {} Info {} / {:?} / {:?} Variance {:?}",
|
||||||
index, info.index, info.kind, info.space, variance);
|
index, info.index, info.kind, info.space, variance);
|
||||||
match info.kind {
|
match info.kind {
|
||||||
TypeParam => { types.push(info.space, variance); }
|
TypeParam => { item_variances.types.push(info.space, variance); }
|
||||||
RegionParam => { regions.push(info.space, variance); }
|
RegionParam => { item_variances.regions.push(info.space, variance); }
|
||||||
}
|
}
|
||||||
|
|
||||||
index += 1;
|
index += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
let item_variances = ty::ItemVariances {
|
|
||||||
types: types,
|
|
||||||
regions: regions
|
|
||||||
};
|
|
||||||
debug!("item_id={} item_variances={:?}",
|
debug!("item_id={} item_variances={:?}",
|
||||||
item_id,
|
item_id,
|
||||||
item_variances);
|
item_variances);
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
use arena::TypedArena;
|
use arena::TypedArena;
|
||||||
use dep_graph::DepTrackingMapConfig;
|
use dep_graph::DepTrackingMapConfig;
|
||||||
use rustc::ty::subst::{ParamSpace, FnSpace, TypeSpace, SelfSpace, VecPerParamSpace};
|
use rustc::ty::subst::{ParamSpace, FnSpace, TypeSpace, SelfSpace};
|
||||||
use rustc::ty::{self, TyCtxt};
|
use rustc::ty::{self, TyCtxt};
|
||||||
use rustc::ty::maps::ItemVariances;
|
use rustc::ty::maps::ItemVariances;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
@ -112,10 +112,7 @@ pub fn determine_parameters_to_be_inferred<'a, 'tcx>(
|
||||||
|
|
||||||
// cache and share the variance struct used for items with
|
// cache and share the variance struct used for items with
|
||||||
// no type/region parameters
|
// no type/region parameters
|
||||||
empty_variances: Rc::new(ty::ItemVariances {
|
empty_variances: Rc::new(ty::ItemVariances::empty())
|
||||||
types: VecPerParamSpace::empty(),
|
|
||||||
regions: VecPerParamSpace::empty()
|
|
||||||
})
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// See README.md for a discussion on dep-graph management.
|
// See README.md for a discussion on dep-graph management.
|
||||||
|
|
Loading…
Reference in a new issue