diff options
| author | Eduard-Mihai Burtescu <edy.burt@gmail.com> | 2018-05-16 09:34:09 +0300 |
|---|---|---|
| committer | Eduard-Mihai Burtescu <edy.burt@gmail.com> | 2018-05-21 12:13:17 +0300 |
| commit | e3df729c250c282c6876aca3f9ff1bc0e77e576c (patch) | |
| tree | b41c3d3ae43a538d2fdaefaa47cdb9d816e43081 | |
| parent | d47dc98767b9362f82f14339fd22a4858e8eb7a5 (diff) | |
| download | rust-e3df729c250c282c6876aca3f9ff1bc0e77e576c.tar.gz rust-e3df729c250c282c6876aca3f9ff1bc0e77e576c.zip | |
rustc: make mk_substs_trait take &[Kind] instead of &[Ty].
| -rw-r--r-- | src/librustc/traits/error_reporting.rs | 12 | ||||
| -rw-r--r-- | src/librustc/traits/select.rs | 10 | ||||
| -rw-r--r-- | src/librustc/traits/util.rs | 10 | ||||
| -rw-r--r-- | src/librustc/ty/context.rs | 6 | ||||
| -rw-r--r-- | src/librustc/ty/instance.rs | 3 | ||||
| -rw-r--r-- | src/librustc/ty/sty.rs | 40 | ||||
| -rw-r--r-- | src/librustc/ty/subst.rs | 52 | ||||
| -rw-r--r-- | src/librustc_mir/borrow_check/nll/type_check/mod.rs | 3 | ||||
| -rw-r--r-- | src/librustc_mir/build/matches/test.rs | 2 | ||||
| -rw-r--r-- | src/librustc_mir/hair/cx/mod.rs | 4 | ||||
| -rw-r--r-- | src/librustc_mir/monomorphize/mod.rs | 8 | ||||
| -rw-r--r-- | src/librustc_mir/util/elaborate_drops.rs | 6 | ||||
| -rw-r--r-- | src/librustc_typeck/check/coercion.rs | 2 | ||||
| -rw-r--r-- | src/librustc_typeck/check/method/suggest.rs | 5 | ||||
| -rw-r--r-- | src/librustc_typeck/check/mod.rs | 3 | ||||
| -rw-r--r-- | src/librustc_typeck/coherence/builtin.rs | 2 |
16 files changed, 70 insertions, 98 deletions
diff --git a/src/librustc/traits/error_reporting.rs b/src/librustc/traits/error_reporting.rs index 97ce730c59e..9ad98b45e96 100644 --- a/src/librustc/traits/error_reporting.rs +++ b/src/librustc/traits/error_reporting.rs @@ -652,14 +652,10 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> { && fallback_has_occurred { let predicate = trait_predicate.map_bound(|mut trait_pred| { - { - let trait_ref = &mut trait_pred.trait_ref; - let never_substs = trait_ref.substs; - let mut unit_substs = Vec::with_capacity(never_substs.len()); - unit_substs.push(self.tcx.mk_nil().into()); - unit_substs.extend(&never_substs[1..]); - trait_ref.substs = self.tcx.intern_substs(&unit_substs); - } + trait_pred.trait_ref.substs = self.tcx.mk_substs_trait( + self.tcx.mk_nil(), + &trait_pred.trait_ref.substs[1..], + ); trait_pred }); let unit_obligation = Obligation { diff --git a/src/librustc/traits/select.rs b/src/librustc/traits/select.rs index bd7ec4a12b0..3ab51a0eb2f 100644 --- a/src/librustc/traits/select.rs +++ b/src/librustc/traits/select.rs @@ -3058,7 +3058,7 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> { obligation.predicate.def_id(), obligation.recursion_depth + 1, inner_source, - &[inner_target])); + &[inner_target.into()])); } // (.., T) -> (.., U). @@ -3066,16 +3066,16 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> { assert_eq!(tys_a.len(), tys_b.len()); // The last field of the tuple has to exist. - let (a_last, a_mid) = if let Some(x) = tys_a.split_last() { + let (&a_last, a_mid) = if let Some(x) = tys_a.split_last() { x } else { return Err(Unimplemented); }; - let b_last = tys_b.last().unwrap(); + let &b_last = tys_b.last().unwrap(); // Check that the source tuple with the target's // last element is equal to the target. - let new_tuple = tcx.mk_tup(a_mid.iter().chain(Some(b_last))); + let new_tuple = tcx.mk_tup(a_mid.iter().cloned().chain(iter::once(b_last))); let InferOk { obligations, .. } = self.infcx.at(&obligation.cause, obligation.param_env) .eq(target, new_tuple) @@ -3089,7 +3089,7 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> { obligation.predicate.def_id(), obligation.recursion_depth + 1, a_last, - &[b_last])); + &[b_last.into()])); } _ => bug!() diff --git a/src/librustc/traits/util.rs b/src/librustc/traits/util.rs index f5a9d2a7f00..684022f8e8a 100644 --- a/src/librustc/traits/util.rs +++ b/src/librustc/traits/util.rs @@ -9,7 +9,7 @@ // except according to those terms. use hir::def_id::DefId; -use ty::subst::{Subst, Substs}; +use ty::subst::{Kind, Subst, Substs}; use ty::{self, Ty, TyCtxt, ToPredicate, ToPolyTraitRef}; use ty::outlives::Component; use util::nodemap::FxHashSet; @@ -430,13 +430,13 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { cause: ObligationCause<'tcx>, trait_def_id: DefId, recursion_depth: usize, - param_ty: Ty<'tcx>, - ty_params: &[Ty<'tcx>]) + self_ty: Ty<'tcx>, + params: &[Kind<'tcx>]) -> PredicateObligation<'tcx> { let trait_ref = ty::TraitRef { def_id: trait_def_id, - substs: self.mk_substs_trait(param_ty, ty_params) + substs: self.mk_substs_trait(self_ty, params) }; predicate_for_trait_ref(cause, param_env, trait_ref, recursion_depth) } @@ -512,7 +512,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { }; let trait_ref = ty::TraitRef { def_id: fn_trait_def_id, - substs: self.mk_substs_trait(self_ty, &[arguments_tuple]), + substs: self.mk_substs_trait(self_ty, &[arguments_tuple.into()]), }; ty::Binder::bind((trait_ref, sig.skip_binder().output())) } diff --git a/src/librustc/ty/context.rs b/src/librustc/ty/context.rs index ee55b8dd767..b1e9aab6872 100644 --- a/src/librustc/ty/context.rs +++ b/src/librustc/ty/context.rs @@ -2584,11 +2584,11 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { } pub fn mk_substs_trait(self, - s: Ty<'tcx>, - t: &[Ty<'tcx>]) + self_ty: Ty<'tcx>, + rest: &[Kind<'tcx>]) -> &'tcx Substs<'tcx> { - self.mk_substs(iter::once(s).chain(t.into_iter().cloned()).map(Kind::from)) + self.mk_substs(iter::once(self_ty.into()).chain(rest.iter().cloned())) } pub fn mk_clauses<I: InternAs<[Clause<'tcx>], Clauses<'tcx>>>(self, iter: I) -> I::Output { diff --git a/src/librustc/ty/instance.rs b/src/librustc/ty/instance.rs index e97f782fccf..66edbeff749 100644 --- a/src/librustc/ty/instance.rs +++ b/src/librustc/ty/instance.rs @@ -10,7 +10,6 @@ use hir::def_id::DefId; use ty::{self, Ty, TypeFoldable, Substs, TyCtxt}; -use ty::subst::Kind; use traits; use rustc_target::spec::abi::Abi; use util::ppaux; @@ -361,7 +360,7 @@ fn fn_once_adapter_instance<'a, 'tcx>( let sig = substs.closure_sig(closure_did, tcx); let sig = tcx.normalize_erasing_late_bound_regions(ty::ParamEnv::reveal_all(), &sig); assert_eq!(sig.inputs().len(), 1); - let substs = tcx.mk_substs([Kind::from(self_ty), sig.inputs()[0].into()].iter().cloned()); + let substs = tcx.mk_substs_trait(self_ty, &[sig.inputs()[0].into()]); debug!("fn_once_adapter_shim: self_ty={:?} sig={:?}", self_ty, sig); Instance { def, substs } diff --git a/src/librustc/ty/sty.rs b/src/librustc/ty/sty.rs index 0b8f10d311d..6bc0cb51a92 100644 --- a/src/librustc/ty/sty.rs +++ b/src/librustc/ty/sty.rs @@ -622,6 +622,18 @@ impl<'tcx> TraitRef<'tcx> { // associated types. self.substs.types() } + + pub fn from_method(tcx: TyCtxt<'_, '_, 'tcx>, + trait_id: DefId, + substs: &Substs<'tcx>) + -> ty::TraitRef<'tcx> { + let defs = tcx.generics_of(trait_id); + + ty::TraitRef { + def_id: trait_id, + substs: tcx.intern_substs(&substs[..defs.params.len()]) + } + } } pub type PolyTraitRef<'tcx> = Binder<TraitRef<'tcx>>; @@ -663,6 +675,18 @@ impl<'a, 'gcx, 'tcx> ExistentialTraitRef<'tcx> { self.substs.types() } + pub fn erase_self_ty(tcx: TyCtxt<'a, 'gcx, 'tcx>, + trait_ref: ty::TraitRef<'tcx>) + -> ty::ExistentialTraitRef<'tcx> { + // Assert there is a Self. + trait_ref.substs.type_at(0); + + ty::ExistentialTraitRef { + def_id: trait_ref.def_id, + substs: tcx.intern_substs(&trait_ref.substs[1..]) + } + } + /// Object types don't have a self-type specified. Therefore, when /// we convert the principal trait-ref into a normal trait-ref, /// you must give *some* self-type. A common choice is `mk_err()` @@ -674,8 +698,7 @@ impl<'a, 'gcx, 'tcx> ExistentialTraitRef<'tcx> { ty::TraitRef { def_id: self.def_id, - substs: tcx.mk_substs( - iter::once(self_ty.into()).chain(self.substs.iter().cloned())) + substs: tcx.mk_substs_trait(self_ty, self.substs) } } } @@ -686,6 +709,16 @@ impl<'tcx> PolyExistentialTraitRef<'tcx> { pub fn def_id(&self) -> DefId { self.skip_binder().def_id } + + /// Object types don't have a self-type specified. Therefore, when + /// we convert the principal trait-ref into a normal trait-ref, + /// you must give *some* self-type. A common choice is `mk_err()` + /// or some skolemized type. + pub fn with_self_ty(&self, tcx: TyCtxt<'_, '_, 'tcx>, + self_ty: Ty<'tcx>) + -> ty::PolyTraitRef<'tcx> { + self.map_bound(|trait_ref| trait_ref.with_self_ty(tcx, self_ty)) + } } /// Binder is a binder for higher-ranked lifetimes. It is part of the @@ -1188,8 +1221,7 @@ impl<'a, 'tcx, 'gcx> ExistentialProjection<'tcx> { ty::ProjectionPredicate { projection_ty: ty::ProjectionTy { item_def_id: self.item_def_id, - substs: tcx.mk_substs( - iter::once(self_ty.into()).chain(self.substs.iter().cloned())), + substs: tcx.mk_substs_trait(self_ty, self.substs), }, ty: self.ty, } diff --git a/src/librustc/ty/subst.rs b/src/librustc/ty/subst.rs index b94b3e17f86..67dde685f8d 100644 --- a/src/librustc/ty/subst.rs +++ b/src/librustc/ty/subst.rs @@ -20,7 +20,6 @@ use rustc_data_structures::accumulate_vec::AccumulateVec; use core::intrinsics; use std::fmt; -use std::iter; use std::marker::PhantomData; use std::mem; use std::num::NonZeroUsize; @@ -543,54 +542,3 @@ impl<'a, 'gcx, 'tcx> SubstFolder<'a, 'gcx, 'tcx> { self.tcx().mk_region(ty::fold::shift_region(*region, self.region_binders_passed)) } } - -// Helper methods that modify substitutions. - -impl<'a, 'gcx, 'tcx> ty::TraitRef<'tcx> { - pub fn from_method(tcx: TyCtxt<'a, 'gcx, 'tcx>, - trait_id: DefId, - substs: &Substs<'tcx>) - -> ty::TraitRef<'tcx> { - let defs = tcx.generics_of(trait_id); - - ty::TraitRef { - def_id: trait_id, - substs: tcx.intern_substs(&substs[..defs.params.len()]) - } - } -} - -impl<'a, 'gcx, 'tcx> ty::ExistentialTraitRef<'tcx> { - pub fn erase_self_ty(tcx: TyCtxt<'a, 'gcx, 'tcx>, - trait_ref: ty::TraitRef<'tcx>) - -> ty::ExistentialTraitRef<'tcx> { - // Assert there is a Self. - trait_ref.substs.type_at(0); - - ty::ExistentialTraitRef { - def_id: trait_ref.def_id, - substs: tcx.intern_substs(&trait_ref.substs[1..]) - } - } -} - -impl<'a, 'gcx, 'tcx> ty::PolyExistentialTraitRef<'tcx> { - /// Object types don't have a self-type specified. Therefore, when - /// we convert the principal trait-ref into a normal trait-ref, - /// you must give *some* self-type. A common choice is `mk_err()` - /// or some skolemized type. - pub fn with_self_ty(&self, tcx: TyCtxt<'a, 'gcx, 'tcx>, - self_ty: Ty<'tcx>) - -> ty::PolyTraitRef<'tcx> { - // otherwise the escaping regions would be captured by the binder - assert!(!self_ty.has_escaping_regions()); - - self.map_bound(|trait_ref| { - ty::TraitRef { - def_id: trait_ref.def_id, - substs: tcx.mk_substs( - iter::once(self_ty.into()).chain(trait_ref.substs.iter().cloned())) - } - }) - } -} diff --git a/src/librustc_mir/borrow_check/nll/type_check/mod.rs b/src/librustc_mir/borrow_check/nll/type_check/mod.rs index 1014299c708..456aa1aa66f 100644 --- a/src/librustc_mir/borrow_check/nll/type_check/mod.rs +++ b/src/librustc_mir/borrow_check/nll/type_check/mod.rs @@ -1375,9 +1375,10 @@ impl<'a, 'gcx, 'tcx> TypeChecker<'a, 'gcx, 'tcx> { } CastKind::Unsize => { + let &ty = ty; let trait_ref = ty::TraitRef { def_id: tcx.lang_items().coerce_unsized_trait().unwrap(), - substs: tcx.mk_substs_trait(op.ty(mir, tcx), &[ty]), + substs: tcx.mk_substs_trait(op.ty(mir, tcx), &[ty.into()]), }; self.prove_trait_ref(trait_ref, location); diff --git a/src/librustc_mir/build/matches/test.rs b/src/librustc_mir/build/matches/test.rs index 913cb944835..5dbe8d850bd 100644 --- a/src/librustc_mir/build/matches/test.rs +++ b/src/librustc_mir/build/matches/test.rs @@ -312,7 +312,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> { }, } let eq_def_id = self.hir.tcx().lang_items().eq_trait().unwrap(); - let (mty, method) = self.hir.trait_method(eq_def_id, "eq", ty, &[ty]); + let (mty, method) = self.hir.trait_method(eq_def_id, "eq", ty, &[ty.into()]); // take the argument by reference let region_scope = self.topmost_scope(); diff --git a/src/librustc_mir/hair/cx/mod.rs b/src/librustc_mir/hair/cx/mod.rs index 4739c0e92ed..71dd35c010d 100644 --- a/src/librustc_mir/hair/cx/mod.rs +++ b/src/librustc_mir/hair/cx/mod.rs @@ -24,7 +24,7 @@ use rustc::infer::InferCtxt; use rustc::ty::layout::{IntegerExt, Size}; use rustc::ty::subst::Subst; use rustc::ty::{self, Ty, TyCtxt, layout}; -use rustc::ty::subst::Substs; +use rustc::ty::subst::{Kind, Substs}; use syntax::ast::{self, LitKind}; use syntax::attr; use syntax::symbol::Symbol; @@ -235,7 +235,7 @@ impl<'a, 'gcx, 'tcx> Cx<'a, 'gcx, 'tcx> { trait_def_id: DefId, method_name: &str, self_ty: Ty<'tcx>, - params: &[Ty<'tcx>]) + params: &[Kind<'tcx>]) -> (Ty<'tcx>, Literal<'tcx>) { let method_name = Symbol::intern(method_name); let substs = self.tcx.mk_substs_trait(self_ty, params); diff --git a/src/librustc_mir/monomorphize/mod.rs b/src/librustc_mir/monomorphize/mod.rs index 51793305513..bf544e5120c 100644 --- a/src/librustc_mir/monomorphize/mod.rs +++ b/src/librustc_mir/monomorphize/mod.rs @@ -12,7 +12,6 @@ use rustc::hir::def_id::DefId; use rustc::middle::lang_items::DropInPlaceFnLangItem; use rustc::traits; use rustc::ty::adjustment::CustomCoerceUnsized; -use rustc::ty::subst::Kind; use rustc::ty::{self, Ty, TyCtxt}; pub use rustc::ty::Instance; @@ -89,10 +88,7 @@ fn fn_once_adapter_instance<'a, 'tcx>( let sig = substs.closure_sig(closure_did, tcx); let sig = tcx.normalize_erasing_late_bound_regions(ty::ParamEnv::reveal_all(), &sig); assert_eq!(sig.inputs().len(), 1); - let substs = tcx.mk_substs([ - Kind::from(self_ty), - sig.inputs()[0].into(), - ].iter().cloned()); + let substs = tcx.mk_substs_trait(self_ty, &[sig.inputs()[0].into()]); debug!("fn_once_adapter_shim: self_ty={:?} sig={:?}", self_ty, sig); Instance { def, substs } @@ -164,7 +160,7 @@ pub fn custom_coerce_unsize_info<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, let trait_ref = ty::Binder::bind(ty::TraitRef { def_id: def_id, - substs: tcx.mk_substs_trait(source_ty, &[target_ty]) + substs: tcx.mk_substs_trait(source_ty, &[target_ty.into()]) }); match tcx.codegen_fulfill_obligation( (ty::ParamEnv::reveal_all(), trait_ref)) { diff --git a/src/librustc_mir/util/elaborate_drops.rs b/src/librustc_mir/util/elaborate_drops.rs index 9fc04dc7d24..f70a5ef57fe 100644 --- a/src/librustc_mir/util/elaborate_drops.rs +++ b/src/librustc_mir/util/elaborate_drops.rs @@ -14,12 +14,12 @@ use rustc::mir::*; use rustc::middle::lang_items; use rustc::traits::Reveal; use rustc::ty::{self, Ty, TyCtxt}; -use rustc::ty::subst::{Kind, Substs}; +use rustc::ty::subst::Substs; use rustc::ty::util::IntTypeExt; use rustc_data_structures::indexed_vec::Idx; use util::patch::MirPatch; -use std::{iter, u32}; +use std::u32; #[derive(Debug, PartialEq, Eq, Copy, Clone)] pub enum DropFlagState { @@ -520,7 +520,7 @@ impl<'l, 'b, 'tcx, D> DropCtxt<'l, 'b, 'tcx, D> let drop_trait = tcx.lang_items().drop_trait().unwrap(); let drop_fn = tcx.associated_items(drop_trait).next().unwrap(); let ty = self.place_ty(self.place); - let substs = tcx.mk_substs(iter::once(Kind::from(ty))); + let substs = tcx.mk_substs_trait(ty, &[]); let ref_ty = tcx.mk_ref(tcx.types.re_erased, ty::TypeAndMut { ty, diff --git a/src/librustc_typeck/check/coercion.rs b/src/librustc_typeck/check/coercion.rs index 324af7b6270..5b3484dcccb 100644 --- a/src/librustc_typeck/check/coercion.rs +++ b/src/librustc_typeck/check/coercion.rs @@ -547,7 +547,7 @@ impl<'f, 'gcx, 'tcx> Coerce<'f, 'gcx, 'tcx> { coerce_unsized_did, 0, coerce_source, - &[coerce_target])); + &[coerce_target.into()])); let mut has_unsized_tuple_coercion = false; diff --git a/src/librustc_typeck/check/method/suggest.rs b/src/librustc_typeck/check/method/suggest.rs index 2dc7c7fe71a..8a575c14787 100644 --- a/src/librustc_typeck/check/method/suggest.rs +++ b/src/librustc_typeck/check/method/suggest.rs @@ -56,8 +56,9 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { self.autoderef(span, ty).any(|(ty, _)| { self.probe(|_| { - let fn_once_substs = tcx.mk_substs_trait(ty, - &[self.next_ty_var(TypeVariableOrigin::MiscVariable(span))]); + let fn_once_substs = tcx.mk_substs_trait(ty, &[ + self.next_ty_var(TypeVariableOrigin::MiscVariable(span)).into() + ]); let trait_ref = ty::TraitRef::new(fn_once, fn_once_substs); let poly_trait_ref = trait_ref.to_poly_trait_ref(); let obligation = diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs index 1088ec1b2ac..21197b4d85c 100644 --- a/src/librustc_typeck/check/mod.rs +++ b/src/librustc_typeck/check/mod.rs @@ -116,7 +116,6 @@ use std::collections::hash_map::Entry; use std::cmp; use std::fmt::Display; use std::mem::replace; -use std::iter; use std::ops::{self, Deref}; use rustc_target::spec::abi::Abi; use syntax::ast; @@ -1114,7 +1113,7 @@ fn check_fn<'a, 'gcx, 'tcx>(inherited: &'a Inherited<'a, 'gcx, 'tcx>, if id == fn_id { match entry_type { config::EntryMain => { - let substs = fcx.tcx.mk_substs(iter::once(Kind::from(declared_ret_ty))); + let substs = fcx.tcx.mk_substs_trait(declared_ret_ty, &[]); let trait_ref = ty::TraitRef::new(term_id, substs); let return_ty_span = decl.output.span(); let cause = traits::ObligationCause::new( diff --git a/src/librustc_typeck/coherence/builtin.rs b/src/librustc_typeck/coherence/builtin.rs index 735ebbfcb3d..528f81a5612 100644 --- a/src/librustc_typeck/coherence/builtin.rs +++ b/src/librustc_typeck/coherence/builtin.rs @@ -387,7 +387,7 @@ pub fn coerce_unsized_info<'a, 'gcx>(gcx: TyCtxt<'a, 'gcx, 'gcx>, trait_def_id, 0, source, - &[target]); + &[target.into()]); fulfill_cx.register_predicate_obligation(&infcx, predicate); // Check that all transitive obligations are satisfied. |
