From 9409bd9ff87941fcdddb5af7cb3b22c0e7a29c30 Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Fri, 5 Dec 2014 11:04:49 -0500 Subject: [PATCH] Introduce predicates but don't use them. --- src/librustc/metadata/decoder.rs | 4 +++- src/librustc/middle/astencode.rs | 3 +++ src/librustc/middle/ty.rs | 17 +++++++++++++++++ src/librustc/middle/ty_fold.rs | 19 +++++++++++++++++++ src/librustc_typeck/lib.rs | 1 + 5 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/librustc/metadata/decoder.rs b/src/librustc/metadata/decoder.rs index 23bd37486bc0..79bfc46dca8d 100644 --- a/src/librustc/metadata/decoder.rs +++ b/src/librustc/metadata/decoder.rs @@ -1437,7 +1437,9 @@ fn doc_generics<'tcx>(base_doc: rbml::Doc, true }); - ty::Generics { types: types, regions: regions } + let predicates = subst::VecPerParamSpace::empty(); // TODO fix in later commit + + ty::Generics { types: types, regions: regions, predicates: predicates } } pub fn is_associated_type(cdata: Cmd, id: ast::NodeId) -> bool { diff --git a/src/librustc/middle/astencode.rs b/src/librustc/middle/astencode.rs index 8c2fbc078e2e..319337bf48b7 100644 --- a/src/librustc/middle/astencode.rs +++ b/src/librustc/middle/astencode.rs @@ -1554,6 +1554,9 @@ impl<'a, 'tcx> rbml_decoder_decoder_helpers<'tcx> for reader::Decoder<'a> { Ok(this.read_vec_per_param_space( |this| Decodable::decode(this).unwrap())) }).unwrap(), + + predicates: + subst::VecPerParamSpace::empty(), // TODO fix in later commit }) }) }).unwrap(), diff --git a/src/librustc/middle/ty.rs b/src/librustc/middle/ty.rs index ee13fc5e3460..ef8e3f3b2d7f 100644 --- a/src/librustc/middle/ty.rs +++ b/src/librustc/middle/ty.rs @@ -1619,6 +1619,22 @@ pub struct RegionParameterDef { pub struct Generics<'tcx> { pub types: VecPerParamSpace>, pub regions: VecPerParamSpace, + pub predicates: VecPerParamSpace>, +} + +#[deriving(Clone, Show)] +pub enum Predicate<'tcx> { + /// where Foo : Bar + Trait(Rc>), + + /// where Foo == Bar + Equate(Ty<'tcx>, Ty<'tcx>), + + /// where 'a : 'b + RegionOutlives(Region, Region), + + /// where T : 'a + TypeOutlives(Ty<'tcx>, Region), } impl<'tcx> Generics<'tcx> { @@ -1626,6 +1642,7 @@ impl<'tcx> Generics<'tcx> { Generics { types: VecPerParamSpace::empty(), regions: VecPerParamSpace::empty(), + predicates: VecPerParamSpace::empty(), } } diff --git a/src/librustc/middle/ty_fold.rs b/src/librustc/middle/ty_fold.rs index 543d2bdd9574..87467ba064a2 100644 --- a/src/librustc/middle/ty_fold.rs +++ b/src/librustc/middle/ty_fold.rs @@ -399,6 +399,25 @@ impl<'tcx> TypeFoldable<'tcx> for ty::Generics<'tcx> { ty::Generics { types: self.types.fold_with(folder), regions: self.regions.fold_with(folder), + predicates: self.predicates.fold_with(folder), + } + } +} + +impl<'tcx> TypeFoldable<'tcx> for ty::Predicate<'tcx> { + fn fold_with>(&self, folder: &mut F) -> ty::Predicate<'tcx> { + match *self { + ty::Predicate::Trait(ref a) => + ty::Predicate::Trait(a.fold_with(folder)), + ty::Predicate::Equate(ref a, ref b) => + ty::Predicate::Equate(a.fold_with(folder), + b.fold_with(folder)), + ty::Predicate::RegionOutlives(ref a, ref b) => + ty::Predicate::RegionOutlives(a.fold_with(folder), + b.fold_with(folder)), + ty::Predicate::TypeOutlives(ref a, ref b) => + ty::Predicate::TypeOutlives(a.fold_with(folder), + b.fold_with(folder)), } } } diff --git a/src/librustc_typeck/lib.rs b/src/librustc_typeck/lib.rs index d29e5a9f4309..41ed5b8ec365 100644 --- a/src/librustc_typeck/lib.rs +++ b/src/librustc_typeck/lib.rs @@ -163,6 +163,7 @@ fn no_params<'tcx>(t: Ty<'tcx>) -> ty::Polytype<'tcx> { generics: ty::Generics { types: VecPerParamSpace::empty(), regions: VecPerParamSpace::empty(), + predicates: VecPerParamSpace::empty(), }, ty: t }