Skip to content

Commit b5cd4d3

Browse files
committed
Relate with contravariant and covariant
1 parent c2136ba commit b5cd4d3

File tree

3 files changed

+21
-15
lines changed

3 files changed

+21
-15
lines changed

chalk-solve/src/infer/unify.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -393,13 +393,13 @@ impl<'t, I: Interner> Unifier<'t, I> {
393393
if let Variance::Invariant | Variance::Contravariant = variance {
394394
let a_universal = self.table.instantiate_binders_universally(interner, a);
395395
let b_existential = self.table.instantiate_binders_existentially(interner, b);
396-
Zip::zip_with(self, variance, &a_universal, &b_existential)?;
396+
Zip::zip_with(self, Variance::Contravariant, &a_universal, &b_existential)?;
397397
}
398398

399399
if let Variance::Invariant | Variance::Covariant = variance {
400400
let b_universal = self.table.instantiate_binders_universally(interner, b);
401401
let a_existential = self.table.instantiate_binders_existentially(interner, a);
402-
Zip::zip_with(self, variance, &a_existential, &b_universal)?;
402+
Zip::zip_with(self, Variance::Covariant, &a_existential, &b_universal)?;
403403
}
404404

405405
Ok(())

tests/test/existential_types.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -337,10 +337,9 @@ fn dyn_binders_reverse() {
337337
}
338338
} yields {
339339
"Unique; substitution [], lifetime constraints [\
340-
InEnvironment { environment: Env([]), goal: '!10_0: '!10_1 }, \
341-
InEnvironment { environment: Env([]), goal: '!10_1: '!10_0 }, \
342-
InEnvironment { environment: Env([]), goal: '!13_0: '!13_1 }, \
343-
InEnvironment { environment: Env([]), goal: '!13_1: '!13_0 }]"
340+
InEnvironment { environment: Env([]), goal: '!9_0: '!9_1 }, \
341+
InEnvironment { environment: Env([]), goal: '!9_1: '!9_0 }\
342+
]"
344343
}
345344

346345
// Note: these constraints are ultimately unresolveable (we
@@ -353,10 +352,8 @@ fn dyn_binders_reverse() {
353352
}
354353
} yields {
355354
"Unique; substitution [], lifetime constraints [\
356-
InEnvironment { environment: Env([]), goal: '!12_0: '!12_1 }, \
357-
InEnvironment { environment: Env([]), goal: '!12_1: '!12_0 }, \
358-
InEnvironment { environment: Env([]), goal: '!9_0: '!9_1 }, \
359-
InEnvironment { environment: Env([]), goal: '!9_1: '!9_0 }\
355+
InEnvironment { environment: Env([]), goal: '!7_0: '!7_1 }, \
356+
InEnvironment { environment: Env([]), goal: '!7_1: '!7_0 }\
360357
]"
361358
}
362359

tests/test/subtype.rs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,20 @@ fn fn_lifetime_variance_args() {
7979

8080
goal {
8181
for<'a, 'b> fn(&'a u32, &'b u32) = for<'a> fn(&'a u32, &'a u32)
82-
} yields {
83-
"Unique;substitution [], lifetime constraints [\
84-
InEnvironment { environment: Env([]), goal: '!1_0: '!1_1 }, \
85-
InEnvironment { environment: Env([]), goal: '!1_1: '!1_0 } \
86-
]"
82+
} yields[SolverChoice::recursive()] {
83+
"Unique; for<?U1,?U2,?U2> { substitution [], lifetime constraints [\
84+
InEnvironment { environment: Env([]), goal: '!1_0: '^0.0 }, \
85+
InEnvironment { environment: Env([]), goal: '!1_1: '^0.0 }, \
86+
InEnvironment { environment: Env([]), goal: '!2_0: '^0.1 }, \
87+
InEnvironment { environment: Env([]), goal: '!2_0: '^0.2 }\
88+
] }"
89+
} yields[SolverChoice::slg_default()] {
90+
"Unique; for<?U2,?U2,?U1> { substitution [], lifetime constraints [\
91+
InEnvironment { environment: Env([]), goal: '!1_0: '^0.2 }, \
92+
InEnvironment { environment: Env([]), goal: '!1_1: '^0.2 }, \
93+
InEnvironment { environment: Env([]), goal: '!2_0: '^0.0 }, \
94+
InEnvironment { environment: Env([]), goal: '!2_0: '^0.1 }\
95+
] }"
8796
}
8897
}
8998
}

0 commit comments

Comments
 (0)