@@ -896,6 +896,8 @@ iface combine {
896
896
fn ret_styles( r1: ret_style, r2: ret_style) -> cres < ret_style > ;
897
897
fn contraregions( a: ty:: region, b: ty:: region) -> cres < ty:: region > ;
898
898
fn regions( a: ty:: region, b: ty:: region) -> cres < ty:: region > ;
899
+ fn vstores( vk: ty:: terr_vstore_kind,
900
+ a: ty:: vstore, b: ty:: vstore) -> cres < ty:: vstore > ;
899
901
}
900
902
901
903
enum sub = infer_ctxt; // "subtype", "subregion" etc
@@ -951,6 +953,27 @@ fn super_args<C:combine>(
951
953
}
952
954
}
953
955
956
+ fn super_vstores<C : combine>(
957
+ self : C , vk: ty:: terr_vstore_kind,
958
+ a: ty:: vstore, b: ty:: vstore) -> cres<ty:: vstore> {
959
+
960
+ alt ( a, b) {
961
+ ( ty:: vstore_slice( a_r) , ty:: vstore_slice( b_r) ) {
962
+ self . contraregions( a_r, b_r) . chain { |r|
963
+ ok( ty:: vstore_slice( r) )
964
+ }
965
+ }
966
+
967
+ _ if a == b {
968
+ ok( a)
969
+ }
970
+
971
+ _ {
972
+ err( ty:: terr_vstores_differ( vk, b, a) )
973
+ }
974
+ }
975
+ }
976
+
954
977
fn super_fns<C : combine>(
955
978
self : C , a_f: ty:: fn_ty, b_f: ty:: fn_ty) -> cres<ty:: fn_ty> {
956
979
@@ -1070,15 +1093,20 @@ fn super_tys<C:combine>(
1070
1093
}
1071
1094
}
1072
1095
1073
- ( ty:: ty_evec( a_mt, ty:: vstore_slice( a_r) ) ,
1074
- ty:: ty_evec( b_mt, ty:: vstore_slice( b_r) ) ) {
1075
- self . contraregions( a_r, b_r) . chain { |r|
1076
- self . mts( a_mt, b_mt) . chain { |mt|
1077
- ok( ty:: mk_evec( tcx, mt, ty:: vstore_slice( r) ) )
1096
+ ( ty:: ty_evec( a_mt, vs_a) , ty:: ty_evec( b_mt, vs_b) ) {
1097
+ self . mts( a_mt, b_mt) . chain { |mt|
1098
+ self . vstores( ty:: terr_vec, vs_a, vs_b) . chain { |vs|
1099
+ ok( ty:: mk_evec( tcx, mt, vs) )
1078
1100
}
1079
1101
}
1080
1102
}
1081
1103
1104
+ ( ty:: ty_estr( vs_a) , ty:: ty_estr( vs_b) ) {
1105
+ self . vstores( ty:: terr_str, vs_a, vs_b) . chain { |vs|
1106
+ ok( ty:: mk_estr( tcx, vs) )
1107
+ }
1108
+ }
1109
+
1082
1110
( ty:: ty_res( a_id, a_t, a_tps) , ty:: ty_res( b_id, b_t, b_tps) )
1083
1111
if a_id == b_id {
1084
1112
self . tys( a_t, b_t) . chain { |t|
@@ -1234,6 +1262,11 @@ impl of combine for sub {
1234
1262
super_flds( self , a, b)
1235
1263
}
1236
1264
1265
+ fn vstores( vk: ty:: terr_vstore_kind,
1266
+ a: ty:: vstore, b: ty:: vstore) -> cres < ty:: vstore > {
1267
+ super_vstores( self , vk, a, b)
1268
+ }
1269
+
1237
1270
fn modes( a: ast:: mode, b: ast:: mode) -> cres < ast:: mode > {
1238
1271
super_modes( self , a, b)
1239
1272
}
@@ -1402,6 +1435,11 @@ impl of combine for lub {
1402
1435
super_flds( self , a, b)
1403
1436
}
1404
1437
1438
+ fn vstores( vk: ty:: terr_vstore_kind,
1439
+ a: ty:: vstore, b: ty:: vstore) -> cres < ty:: vstore > {
1440
+ super_vstores( self , vk, a, b)
1441
+ }
1442
+
1405
1443
fn modes( a: ast:: mode, b: ast:: mode) -> cres < ast:: mode > {
1406
1444
super_modes( self , a, b)
1407
1445
}
@@ -1587,6 +1625,11 @@ impl of combine for glb {
1587
1625
super_flds( self , a, b)
1588
1626
}
1589
1627
1628
+ fn vstores( vk: ty:: terr_vstore_kind,
1629
+ a: ty:: vstore, b: ty:: vstore) -> cres < ty:: vstore > {
1630
+ super_vstores( self , vk, a, b)
1631
+ }
1632
+
1590
1633
fn modes( a: ast:: mode, b: ast:: mode) -> cres < ast:: mode > {
1591
1634
super_modes( self , a, b)
1592
1635
}
0 commit comments