@@ -409,39 +409,9 @@ impl unify_methods for infer_ctxt {
409
409
}
410
410
411
411
fn regions ( a : ty:: region , b : ty:: region ) -> ures {
412
- alt ( a, b) {
413
- ( ty:: re_var ( _) , _) | ( _, ty:: re_var ( _) ) {
414
- self . uok ( ) // FIXME: We need region variables!
415
- }
416
- ( ty:: re_inferred, _) | ( _, ty:: re_inferred) {
417
- fail "tried to unify inferred regions"
418
- }
419
- ( ty:: re_param ( _) , ty:: re_param ( _) ) |
420
- ( ty:: re_self, ty:: re_self) {
421
- if a == b {
422
- self . uok ( )
423
- } else {
424
- self . uerr ( ty:: terr_regions_differ ( false , a, b) )
425
- }
426
- }
427
- ( ty:: re_param ( _) , ty:: re_block ( _) ) |
428
- ( ty:: re_self, ty:: re_block ( _) ) {
429
- self . uok ( )
430
- }
431
- ( ty:: re_block ( _) , ty:: re_param ( _) ) |
432
- ( ty:: re_block ( _) , ty:: re_self) {
433
- self . uerr ( ty:: terr_regions_differ ( false , a, b) )
434
- }
435
- ( ty:: re_block ( superblock) , ty:: re_block ( subblock) ) {
436
- // The region corresponding to an outer block is a subtype of the
437
- // region corresponding to an inner block.
438
- let rm = self . tcx . region_map ;
439
- if region:: scope_contains ( rm, subblock, superblock) {
440
- self . uok ( )
441
- } else {
442
- self . uerr ( ty:: terr_regions_differ ( false , a, b) )
443
- }
444
- }
412
+ alt combine_or_unify_regions ( self . tcx , a, b, false ) {
413
+ ok ( _) { self . uok ( ) }
414
+ err ( e) { self . uerr ( e) }
445
415
}
446
416
}
447
417
@@ -1214,6 +1184,47 @@ fn c_tys<C:combine>(
1214
1184
}
1215
1185
}
1216
1186
1187
+ fn combine_or_unify_regions ( tcx : ty:: ctxt ,
1188
+ a : ty:: region ,
1189
+ b : ty:: region ,
1190
+ contravariant_combine : bool ) -> cres < ty:: region > {
1191
+ alt ( a, b) {
1192
+ ( ty:: re_var ( _) , _) | ( _, ty:: re_var ( _) ) {
1193
+ ok ( a) // FIXME: We need region variables!
1194
+ }
1195
+ ( ty:: re_inferred, _) | ( _, ty:: re_inferred) {
1196
+ fail "tried to combine or unify inferred regions"
1197
+ }
1198
+ ( ty:: re_param ( _) , ty:: re_param ( _) ) |
1199
+ ( ty:: re_self, ty:: re_self) {
1200
+ if a == b {
1201
+ ok ( a)
1202
+ } else {
1203
+ err ( ty:: terr_regions_differ ( false , a, b) )
1204
+ }
1205
+ }
1206
+ ( ty:: re_param ( _) , ty:: re_block ( _) ) |
1207
+ ( ty:: re_self, ty:: re_block ( _) ) {
1208
+ ok ( a)
1209
+ }
1210
+ ( ty:: re_block ( _) , ty:: re_param ( _) ) |
1211
+ ( ty:: re_block ( _) , ty:: re_self) {
1212
+ err ( ty:: terr_regions_differ ( false , a, b) )
1213
+ }
1214
+ ( ty:: re_block ( block_a) , ty:: re_block ( block_b) ) {
1215
+ // The region corresponding to an outer block is a subtype of the
1216
+ // region corresponding to an inner block.
1217
+ let rm = tcx. region_map ;
1218
+ let nca_opt = region:: nearest_common_ancestor ( rm, block_a, block_b) ;
1219
+ alt nca_opt {
1220
+ some( nca) if nca == block_b { ok ( a) }
1221
+ some ( nca) if contravariant_combine { ok ( ty:: re_block ( nca) ) }
1222
+ _ { err( ty:: terr_regions_differ ( false , a, b) ) }
1223
+ }
1224
+ }
1225
+ }
1226
+ }
1227
+
1217
1228
impl of combine for lub {
1218
1229
fn infcx ( ) -> infer_ctxt { * self }
1219
1230
@@ -1232,10 +1243,6 @@ impl of combine for lub {
1232
1243
ok ( b)
1233
1244
}
1234
1245
1235
- fn c_regions ( a : ty:: region , _b : ty:: region ) -> cres < ty:: region > {
1236
- ok ( a) // FIXME
1237
- }
1238
-
1239
1246
fn c_mts ( a : ty:: mt , b : ty:: mt ) -> cres < ty:: mt > {
1240
1247
let tcx = self . infcx ( ) . tcx ;
1241
1248
@@ -1302,6 +1309,10 @@ impl of combine for lub {
1302
1309
}
1303
1310
}
1304
1311
}
1312
+
1313
+ fn c_regions ( a : ty:: region , b : ty:: region ) -> cres < ty:: region > {
1314
+ ret combine_or_unify_regions ( self . tcx , a, b, true ) ;
1315
+ }
1305
1316
}
1306
1317
1307
1318
impl of combine for glb {
@@ -1410,4 +1421,8 @@ impl of combine for glb {
1410
1421
}
1411
1422
}
1412
1423
}
1424
+
1425
+ fn c_regions ( a : ty:: region , b : ty:: region ) -> cres < ty:: region > {
1426
+ ret combine_or_unify_regions ( self . tcx , a, b, false ) ;
1427
+ }
1413
1428
}
0 commit comments