Skip to content

Commit 5bfb63b

Browse files
committed
---
yaml --- r: 5836 b: refs/heads/master c: 48d351b h: refs/heads/master v: v3
1 parent 67e560b commit 5bfb63b

File tree

2 files changed

+54
-15
lines changed

2 files changed

+54
-15
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: d6613384fdd3b942981e517320708f813e1ad8b6
2+
refs/heads/master: 48d351b21e72112059b705f6ba7ad9b09afa1819

trunk/src/comp/middle/ty.rs

Lines changed: 53 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1846,7 +1846,7 @@ mod unify {
18461846
cx: @ctxt, key: int, typ: t, variance: variance) -> result {
18471847
record_var_binding(
18481848
cx, key, typ,
1849-
fn (cx: @ctxt, old_type: t, new_type: t) -> result {
1849+
lambda (cx: @ctxt, old_type: t, new_type: t) -> result {
18501850
unify_step(cx, old_type, new_type, variance)
18511851
})
18521852
}
@@ -1855,7 +1855,7 @@ mod unify {
18551855
cx: @ctxt, key: int, typ: t, variance: variance) -> result {
18561856
record_var_binding(
18571857
cx, key, typ,
1858-
fn (cx: @ctxt, old_type: t, new_type: t) -> result {
1858+
lambda (cx: @ctxt, old_type: t, new_type: t) -> result {
18591859
unify_step(cx, new_type, old_type, variance)
18601860
})
18611861
}
@@ -2007,7 +2007,8 @@ mod unify {
20072007
expected: t, actual: t, expected_inputs: [arg],
20082008
expected_output: t, actual_inputs: [arg], actual_output: t,
20092009
expected_cf: ret_style, actual_cf: ret_style,
2010-
_expected_constrs: [@constr], actual_constrs: [@constr]) ->
2010+
_expected_constrs: [@constr], actual_constrs: [@constr],
2011+
variance: variance) ->
20112012
result {
20122013
if e_proto != a_proto { ret ures_err(terr_mismatch); }
20132014
if actual_cf != ast::noreturn && actual_cf != expected_cf {
@@ -2020,7 +2021,8 @@ mod unify {
20202021
}
20212022
let t =
20222023
unify_fn_common(cx, expected, actual, expected_inputs,
2023-
expected_output, actual_inputs, actual_output);
2024+
expected_output, actual_inputs, actual_output,
2025+
variance);
20242026
alt t {
20252027
fn_common_res_err(r) { ret r; }
20262028
fn_common_res_ok(result_ins, result_out) {
@@ -2034,11 +2036,13 @@ mod unify {
20342036
fn unify_native_fn(cx: @ctxt, e_abi: ast::native_abi,
20352037
a_abi: ast::native_abi, expected: t, actual: t,
20362038
expected_inputs: [arg], expected_output: t,
2037-
actual_inputs: [arg], actual_output: t) -> result {
2039+
actual_inputs: [arg], actual_output: t,
2040+
variance: variance) -> result {
20382041
if e_abi != a_abi { ret ures_err(terr_mismatch); }
20392042
let t =
20402043
unify_fn_common(cx, expected, actual, expected_inputs,
2041-
expected_output, actual_inputs, actual_output);
2044+
expected_output, actual_inputs, actual_output,
2045+
variance);
20422046
alt t {
20432047
fn_common_res_err(r) { ret r; }
20442048
fn_common_res_ok(result_ins, result_out) {
@@ -2048,7 +2052,7 @@ mod unify {
20482052
}
20492053
}
20502054
fn unify_obj(cx: @ctxt, expected: t, actual: t, expected_meths: [method],
2051-
actual_meths: [method]) -> result {
2055+
actual_meths: [method], variance: variance) -> result {
20522056
let result_meths: [method] = [];
20532057
let i: uint = 0u;
20542058
let expected_len: uint = vec::len::<method>(expected_meths);
@@ -2064,7 +2068,7 @@ mod unify {
20642068
unify_fn(cx, e_meth.proto, a_meth.proto, expected, actual,
20652069
e_meth.inputs, e_meth.output, a_meth.inputs,
20662070
a_meth.output, e_meth.cf, a_meth.cf, e_meth.constrs,
2067-
a_meth.constrs);
2071+
a_meth.constrs, variance);
20682072
alt r {
20692073
ures_ok(tfn) {
20702074
alt struct(cx.tcx, tfn) {
@@ -2109,6 +2113,38 @@ mod unify {
21092113
invariant;
21102114
}
21112115

2116+
// The calculation for recursive variance
2117+
// "Taming the Wildcards: Combining Definition- and Use-Site Variance"
2118+
// by John Altidor, et. al.
2119+
//
2120+
// I'm just copying the table from figure 1 - haven't actually
2121+
// read the paper (yet).
2122+
fn variance_transform(a: variance, b: variance) -> variance {
2123+
alt a {
2124+
covariant. {
2125+
alt b {
2126+
covariant. { covariant }
2127+
contravariant. { contravariant }
2128+
invariant. { invariant }
2129+
}
2130+
}
2131+
contravariant. {
2132+
alt b {
2133+
covariant. { contravariant }
2134+
contravariant. { covariant }
2135+
invariant. { invariant }
2136+
}
2137+
}
2138+
invariant. {
2139+
alt b {
2140+
covariant. { invariant }
2141+
contravariant. { invariant }
2142+
invariant. { invariant }
2143+
}
2144+
}
2145+
}
2146+
}
2147+
21122148
fn unify_step(cx: @ctxt, expected: t, actual: t,
21132149
variance: variance) -> result {
21142150
// TODO: rewrite this using tuple pattern matching when available, to
@@ -2128,14 +2164,15 @@ mod unify {
21282164
alt struct(cx.tcx, expected) {
21292165
ty::ty_var(expected_id) {
21302166
let expected_n = expected_id as uint;
2131-
alt union(cx, expected_n, actual_n) {
2167+
alt union(cx, expected_n, actual_n, variance) {
21322168
unres_ok. {/* fall through */ }
21332169
unres_err(t_e) { ret ures_err(t_e); }
21342170
}
21352171
}
21362172
_ {
21372173
// Just bind the type variable to the expected type.
2138-
alt record_var_binding_for_actual(cx, actual_id, expected) {
2174+
alt record_var_binding_for_actual(
2175+
cx, actual_id, expected, variance) {
21392176
ures_ok(_) {/* fall through */ }
21402177
rs { ret rs; }
21412178
}
@@ -2149,7 +2186,9 @@ mod unify {
21492186
ty::ty_var(expected_id) {
21502187
// Add a binding. (`actual` can't actually be a var here.)
21512188

2152-
alt record_var_binding_for_expected(cx, expected_id, actual) {
2189+
alt record_var_binding_for_expected(
2190+
cx, expected_id, actual,
2191+
variance) {
21532192
ures_ok(_) {/* fall through */ }
21542193
rs { ret rs; }
21552194
}
@@ -2413,7 +2452,7 @@ mod unify {
24132452
ret unify_fn(cx, ep, ap, expected, actual, expected_inputs,
24142453
expected_output, actual_inputs, actual_output,
24152454
expected_cf, actual_cf, expected_constrs,
2416-
actual_constrs);
2455+
actual_constrs, variance);
24172456
}
24182457
_ { ret ures_err(terr_mismatch); }
24192458
}
@@ -2423,7 +2462,7 @@ mod unify {
24232462
ty::ty_native_fn(a_abi, actual_inputs, actual_output) {
24242463
ret unify_native_fn(cx, e_abi, a_abi, expected, actual,
24252464
expected_inputs, expected_output,
2426-
actual_inputs, actual_output);
2465+
actual_inputs, actual_output, variance);
24272466
}
24282467
_ { ret ures_err(terr_mismatch); }
24292468
}
@@ -2432,7 +2471,7 @@ mod unify {
24322471
alt struct(cx.tcx, actual) {
24332472
ty::ty_obj(actual_meths) {
24342473
ret unify_obj(cx, expected, actual, expected_meths,
2435-
actual_meths);
2474+
actual_meths, variance);
24362475
}
24372476
_ { ret ures_err(terr_mismatch); }
24382477
}

0 commit comments

Comments
 (0)