Skip to content

Commit d515e9c

Browse files
committed
Stop using Variance in the ty_relate trait
1 parent b5da410 commit d515e9c

File tree

8 files changed

+80
-86
lines changed

8 files changed

+80
-86
lines changed

src/librustc/middle/infer/bivariate.rs

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -54,26 +54,16 @@ impl<'a, 'tcx> TypeRelation<'a, 'tcx> for Bivariate<'a, 'tcx> {
5454
false
5555
}
5656

57-
fn relate_with_variance<T:Relate<'a,'tcx>>(&mut self,
58-
variance: ty::Variance,
59-
a: &T,
60-
b: &T)
61-
-> RelateResult<'tcx, T>
62-
{
63-
match variance {
64-
// If we have Foo<A> and Foo is invariant w/r/t A,
65-
// and we want to assert that
66-
//
67-
// Foo<A> <: Foo<B> ||
68-
// Foo<B> <: Foo<A>
69-
//
70-
// then still A must equal B.
71-
ty::Invariant => self.relate(a, b),
72-
73-
ty::Covariant => self.relate(a, b),
74-
ty::Bivariant => self.relate(a, b),
75-
ty::Contravariant => self.relate(a, b),
76-
}
57+
fn contra<T:Relate<'a,'tcx>>(&mut self, a: &T, b: &T) -> RelateResult<'tcx, T> {
58+
self.relate(a, b)
59+
}
60+
61+
fn equate<T:Relate<'a,'tcx>>(&mut self, a: &T, b: &T) -> RelateResult<'tcx, T> {
62+
self.relate(a, b)
63+
}
64+
65+
fn bivar<T:Relate<'a,'tcx>>(&mut self, a: &T, b: &T) -> RelateResult<'tcx, T> {
66+
self.relate(a, b)
7767
}
7868

7969
fn tys(&mut self, a: Ty<'tcx>, b: Ty<'tcx>) -> RelateResult<'tcx, Ty<'tcx>> {

src/librustc/middle/infer/combine.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ impl<'a, 'tcx> CombineFields<'a, 'tcx> {
252252
BiTo => self.bivariate().relate(&a_ty, &b_ty),
253253
EqTo => self.equate().relate(&a_ty, &b_ty),
254254
SubtypeOf => self.sub().relate(&a_ty, &b_ty),
255-
SupertypeOf => self.sub().relate_with_variance(ty::Contravariant, &a_ty, &b_ty),
255+
SupertypeOf => self.sub().contra(&a_ty, &b_ty),
256256
});
257257
}
258258

src/librustc/middle/infer/equate.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,15 @@ impl<'a, 'tcx> TypeRelation<'a,'tcx> for Equate<'a, 'tcx> {
3939
a || b
4040
}
4141

42-
fn relate_with_variance<T:Relate<'a,'tcx>>(&mut self,
43-
_: ty::Variance,
44-
a: &T,
45-
b: &T)
46-
-> RelateResult<'tcx, T>
47-
{
42+
fn contra<T:Relate<'a,'tcx>>(&mut self, a: &T, b: &T) -> RelateResult<'tcx, T> {
43+
self.relate(a, b)
44+
}
45+
46+
fn equate<T:Relate<'a,'tcx>>(&mut self, a: &T, b: &T) -> RelateResult<'tcx, T> {
47+
self.relate(a, b)
48+
}
49+
50+
fn bivar<T:Relate<'a,'tcx>>(&mut self, a: &T, b: &T) -> RelateResult<'tcx, T> {
4851
self.relate(a, b)
4952
}
5053

src/librustc/middle/infer/glb.rs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,16 @@ impl<'a, 'tcx> TypeRelation<'a, 'tcx> for Glb<'a, 'tcx> {
4545
a || b
4646
}
4747

48-
fn relate_with_variance<T:Relate<'a,'tcx>>(&mut self,
49-
variance: ty::Variance,
50-
a: &T,
51-
b: &T)
52-
-> RelateResult<'tcx, T>
53-
{
54-
match variance {
55-
ty::Invariant => self.fields.equate().relate(a, b),
56-
ty::Covariant => self.relate(a, b),
57-
ty::Bivariant => self.fields.bivariate().relate(a, b),
58-
ty::Contravariant => self.fields.lub().relate(a, b),
59-
}
48+
fn contra<T:Relate<'a,'tcx>>(&mut self, a: &T, b: &T) -> RelateResult<'tcx, T> {
49+
self.fields.lub().relate(a, b)
50+
}
51+
52+
fn equate<T:Relate<'a,'tcx>>(&mut self, a: &T, b: &T) -> RelateResult<'tcx, T> {
53+
self.fields.equate().relate(a, b)
54+
}
55+
56+
fn bivar<T:Relate<'a,'tcx>>(&mut self, a: &T, b: &T) -> RelateResult<'tcx, T> {
57+
self.fields.bivariate().relate(a, b)
6058
}
6159

6260
fn tys(&mut self, a: Ty<'tcx>, b: Ty<'tcx>) -> RelateResult<'tcx, Ty<'tcx>> {

src/librustc/middle/infer/lub.rs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,16 @@ impl<'a, 'tcx> TypeRelation<'a, 'tcx> for Lub<'a, 'tcx> {
4040
a || b
4141
}
4242

43-
fn relate_with_variance<T:Relate<'a,'tcx>>(&mut self,
44-
variance: ty::Variance,
45-
a: &T,
46-
b: &T)
47-
-> RelateResult<'tcx, T>
48-
{
49-
match variance {
50-
ty::Invariant => self.fields.equate().relate(a, b),
51-
ty::Covariant => self.relate(a, b),
52-
ty::Bivariant => self.fields.bivariate().relate(a, b),
53-
ty::Contravariant => self.fields.glb().relate(a, b),
54-
}
43+
fn contra<T:Relate<'a,'tcx>>(&mut self, a: &T, b: &T) -> RelateResult<'tcx, T> {
44+
self.fields.glb().relate(a, b)
45+
}
46+
47+
fn equate<T:Relate<'a,'tcx>>(&mut self, a: &T, b: &T) -> RelateResult<'tcx, T> {
48+
self.fields.equate().relate(a, b)
49+
}
50+
51+
fn bivar<T:Relate<'a,'tcx>>(&mut self, a: &T, b: &T) -> RelateResult<'tcx, T> {
52+
self.fields.bivariate().relate(a, b)
5553
}
5654

5755
fn tys(&mut self, a: Ty<'tcx>, b: Ty<'tcx>) -> RelateResult<'tcx, Ty<'tcx>> {

src/librustc/middle/infer/sub.rs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -53,18 +53,16 @@ impl<'a, 'tcx> TypeRelation<'a, 'tcx> for Sub<'a, 'tcx> {
5353
!a && b
5454
}
5555

56-
fn relate_with_variance<T:Relate<'a,'tcx>>(&mut self,
57-
variance: ty::Variance,
58-
a: &T,
59-
b: &T)
60-
-> RelateResult<'tcx, T>
61-
{
62-
match variance {
63-
ty::Invariant => self.fields.equate().relate(a, b),
64-
ty::Covariant => self.relate(a, b),
65-
ty::Bivariant => self.fields.bivariate().relate(a, b),
66-
ty::Contravariant => self.fields.switch_expected().sub().relate(b, a),
67-
}
56+
fn contra<T:Relate<'a,'tcx>>(&mut self, a: &T, b: &T) -> RelateResult<'tcx, T> {
57+
self.fields.switch_expected().sub().relate(b, a)
58+
}
59+
60+
fn equate<T:Relate<'a,'tcx>>(&mut self, a: &T, b: &T) -> RelateResult<'tcx, T> {
61+
self.fields.equate().relate(a, b)
62+
}
63+
64+
fn bivar<T:Relate<'a,'tcx>>(&mut self, a: &T, b: &T) -> RelateResult<'tcx, T> {
65+
self.fields.bivariate().relate(a, b)
6866
}
6967

7068
fn tys(&mut self, a: Ty<'tcx>, b: Ty<'tcx>) -> RelateResult<'tcx, Ty<'tcx>> {

src/librustc/middle/ty_match.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,15 @@ impl<'a, 'tcx> TypeRelation<'a, 'tcx> for Match<'a, 'tcx> {
4747
false
4848
}
4949

50-
fn relate_with_variance<T:Relate<'a,'tcx>>(&mut self,
51-
_: ty::Variance,
52-
a: &T,
53-
b: &T)
54-
-> RelateResult<'tcx, T>
55-
{
50+
fn contra<T:Relate<'a,'tcx>>(&mut self, a: &T, b: &T) -> RelateResult<'tcx, T> {
51+
self.relate(a, b)
52+
}
53+
54+
fn equate<T:Relate<'a,'tcx>>(&mut self, a: &T, b: &T) -> RelateResult<'tcx, T> {
55+
self.relate(a, b)
56+
}
57+
58+
fn bivar<T:Relate<'a,'tcx>>(&mut self, a: &T, b: &T) -> RelateResult<'tcx, T> {
5659
self.relate(a, b)
5760
}
5861

src/librustc/middle/ty_relate/mod.rs

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,9 @@ pub trait TypeRelation<'a,'tcx> : Sized {
5555
Relate::relate(self, a, b)
5656
}
5757

58-
/// Switch variance for the purpose of relating `a` and `b`.
59-
fn relate_with_variance<T:Relate<'a,'tcx>>(&mut self,
60-
variance: ty::Variance,
61-
a: &T,
62-
b: &T)
63-
-> RelateResult<'tcx, T>;
58+
fn contra<T:Relate<'a,'tcx>>(&mut self, a: &T, b: &T) -> RelateResult<'tcx, T>;
59+
fn equate<T:Relate<'a,'tcx>>(&mut self, a: &T, b: &T) -> RelateResult<'tcx, T>;
60+
fn bivar<T:Relate<'a,'tcx>>(&mut self, a: &T, b: &T) -> RelateResult<'tcx, T>;
6461

6562
// Overrideable relations. You shouldn't typically call these
6663
// directly, instead call `relate()`, which in turn calls
@@ -104,11 +101,10 @@ impl<'a,'tcx:'a> Relate<'a,'tcx> for ty::mt<'tcx> {
104101
Err(ty::terr_mutability)
105102
} else {
106103
let mutbl = a.mutbl;
107-
let variance = match mutbl {
108-
ast::MutImmutable => ty::Covariant,
109-
ast::MutMutable => ty::Invariant,
104+
let ty = match mutbl {
105+
ast::MutImmutable => try!(relation.relate(&a.ty, &b.ty)),
106+
ast::MutMutable => try!(relation.equate(&a.ty, &b.ty)),
110107
};
111-
let ty = try!(relation.relate_with_variance(variance, &a.ty, &b.ty));
112108
Ok(ty::mt {ty: ty, mutbl: mutbl})
113109
}
114110
}
@@ -196,7 +192,12 @@ fn relate_type_params<'a,'tcx:'a,R>(relation: &mut R,
196192
let a_ty = a_tys[i];
197193
let b_ty = b_tys[i];
198194
let v = variances.map_or(ty::Invariant, |v| v[i]);
199-
relation.relate_with_variance(v, &a_ty, &b_ty)
195+
match v {
196+
ty::Bivariant => relation.bivar(&a_ty, &b_ty),
197+
ty::Covariant => relation.relate(&a_ty, &b_ty),
198+
ty::Contravariant => relation.contra(&a_ty, &b_ty),
199+
ty::Invariant => relation.equate(&a_ty, &b_ty),
200+
}
200201
})
201202
.collect()
202203
}
@@ -227,7 +228,12 @@ fn relate_region_params<'a,'tcx:'a,R>(relation: &mut R,
227228
let a_r = a_rs[i];
228229
let b_r = b_rs[i];
229230
let variance = variances.map_or(ty::Invariant, |v| v[i]);
230-
relation.relate_with_variance(variance, &a_r, &b_r)
231+
match variance {
232+
ty::Bivariant => relation.bivar(&a_r, &b_r),
233+
ty::Covariant => relation.relate(&a_r, &b_r),
234+
ty::Contravariant => relation.contra(&a_r, &b_r),
235+
ty::Invariant => relation.equate(&a_r, &b_r),
236+
}
231237
})
232238
.collect()
233239
}
@@ -292,7 +298,7 @@ fn relate_arg_vecs<'a,'tcx:'a,R>(relation: &mut R,
292298

293299
a_args.iter()
294300
.zip(b_args)
295-
.map(|(a, b)| relation.relate_with_variance(ty::Invariant, a, b))
301+
.map(|(a, b)| relation.equate(a, b))
296302
.collect()
297303
}
298304

@@ -391,9 +397,7 @@ impl<'a,'tcx:'a> Relate<'a,'tcx> for ty::ExistentialBounds<'tcx> {
391397
let r =
392398
try!(relation.with_cause(
393399
Cause::ExistentialRegionBound(will_change),
394-
|relation| relation.relate_with_variance(ty::Contravariant,
395-
&a.region_bound,
396-
&b.region_bound)));
400+
|relation| relation.contra(&a.region_bound, &b.region_bound)));
397401
let nb = try!(relation.relate(&a.builtin_bounds, &b.builtin_bounds));
398402
let pb = try!(relation.relate(&a.projection_bounds, &b.projection_bounds));
399403
Ok(ty::ExistentialBounds { region_bound: r,
@@ -537,7 +541,7 @@ pub fn super_relate_tys<'a,'tcx:'a,R>(relation: &mut R,
537541

538542
(&ty::TyRef(a_r, ref a_mt), &ty::TyRef(b_r, ref b_mt)) =>
539543
{
540-
let r = try!(relation.relate_with_variance(ty::Contravariant, a_r, b_r));
544+
let r = try!(relation.contra(a_r, b_r));
541545
let mt = try!(relation.relate(a_mt, b_mt));
542546
Ok(tcx.mk_ref(tcx.mk_region(r), mt))
543547
}

0 commit comments

Comments
 (0)