@@ -486,7 +486,15 @@ pub enum bound_region {
486
486
br_cap_avoid( ast:: node_id , @bound_region ) ,
487
487
}
488
488
489
- type opt_region = Option < Region > ;
489
+ /**
490
+ * Represents the values to use when substituting lifetime parameters.
491
+ * If the value is `ErasedRegions`, then this subst is occurring during
492
+ * trans, and all region parameters will be replaced with `ty::re_static`. */
493
+ #[ deriving( Clone , Eq , IterBytes ) ]
494
+ pub enum RegionSubsts {
495
+ ErasedRegions ,
496
+ NonerasedRegions ( OptVec < ty:: Region > )
497
+ }
490
498
491
499
/**
492
500
* The type substs represents the kinds of things that can be substituted to
@@ -507,9 +515,9 @@ type opt_region = Option<Region>;
507
515
* always substituted away to the implementing type for a trait. */
508
516
#[ deriving( Clone , Eq , IterBytes ) ]
509
517
pub struct substs {
510
- self_r : opt_region ,
511
518
self_ty : Option < ty:: t > ,
512
- tps : ~[ t ]
519
+ tps : ~[ t ] ,
520
+ regions : RegionSubsts ,
513
521
}
514
522
515
523
mod primitives {
@@ -948,7 +956,14 @@ fn mk_t(cx: ctxt, st: sty) -> t {
948
956
fn sflags ( substs : & substs ) -> uint {
949
957
let mut f = 0 u;
950
958
for substs. tps. iter( ) . advance |tt| { f |= get( * tt) . flags; }
951
- for substs. self_r. iter( ) . advance |r| { f |= rflags( * r) }
959
+ match substs. regions {
960
+ ErasedRegions => { }
961
+ NonerasedRegions ( ref regions) => {
962
+ for regions. iter( ) . advance |r| {
963
+ f |= rflags( * r)
964
+ }
965
+ }
966
+ }
952
967
return f;
953
968
}
954
969
match & st {
@@ -1286,7 +1301,7 @@ pub fn fold_bare_fn_ty(fty: &BareFnTy, fldop: &fn(t) -> t) -> BareFnTy {
1286
1301
1287
1302
fn fold_sty( sty: & sty, fldop: & fn( t) -> t) -> sty {
1288
1303
fn fold_substs( substs : & substs, fldop : & fn( t) -> t) -> substs {
1289
- substs { self_r : substs. self_r ,
1304
+ substs { regions : substs. regions . clone ( ) ,
1290
1305
self_ty : substs. self_ty. map( |t| fldop( * t) ) ,
1291
1306
tps : substs. tps. map( |t| fldop( * t) ) }
1292
1307
}
@@ -1378,8 +1393,15 @@ pub fn fold_regions_and_ty(
1378
1393
fldr : & fn ( r : Region ) -> Region ,
1379
1394
fldt : & fn ( t : t ) -> t )
1380
1395
-> substs {
1396
+ let regions = match substs. regions {
1397
+ ErasedRegions => ErasedRegions ,
1398
+ NonerasedRegions ( ref regions) => {
1399
+ NonerasedRegions ( regions. map ( |r| fldr ( * r) ) )
1400
+ }
1401
+ } ;
1402
+
1381
1403
substs {
1382
- self_r : substs . self_r . map ( |r| fldr ( * r ) ) ,
1404
+ regions : regions ,
1383
1405
self_ty : substs. self_ty . map ( |t| fldt ( * t) ) ,
1384
1406
tps : substs. tps . map ( |t| fldt ( * t) )
1385
1407
}
@@ -1478,8 +1500,13 @@ pub fn subst_tps(cx: ctxt, tps: &[t], self_ty_opt: Option<t>, typ: t) -> t {
1478
1500
}
1479
1501
1480
1502
pub fn substs_is_noop ( substs : & substs ) -> bool {
1503
+ let regions_is_noop = match substs. regions {
1504
+ ErasedRegions => false , // may be used to canonicalize
1505
+ NonerasedRegions ( ref regions) => regions. is_empty ( )
1506
+ } ;
1507
+
1481
1508
substs. tps . len ( ) == 0 u &&
1482
- substs . self_r . is_none ( ) &&
1509
+ regions_is_noop &&
1483
1510
substs. self_ty . is_none ( )
1484
1511
}
1485
1512
@@ -4227,30 +4254,33 @@ pub fn normalize_ty(cx: ctxt, t: t) -> t {
4227
4254
} )
4228
4255
}
4229
4256
4230
- ty_enum( did, ref r) =>
4231
- match ( * r) . self_r {
4232
- Some ( _) =>
4233
- // Use re_static since trans doesn't care about regions
4234
- mk_enum ( cx, did,
4235
- substs {
4236
- self_r : Some ( ty:: re_static) ,
4237
- self_ty : None ,
4238
- tps : ( * r) . tps . clone ( )
4239
- } ) ,
4240
- None =>
4257
+ ty_enum( did, ref r) => {
4258
+ match ( * r) . regions {
4259
+ NonerasedRegions ( _) => {
4260
+ // trans doesn't care about regions
4261
+ mk_enum ( cx, did, substs { regions : ty:: ErasedRegions ,
4262
+ self_ty : None ,
4263
+ tps : ( * r) . tps . clone ( ) } )
4264
+ }
4265
+ ErasedRegions => {
4241
4266
t
4242
- } ,
4267
+ }
4268
+ }
4269
+ }
4243
4270
4244
- ty_struct( did, ref r) =>
4245
- match ( * r) . self_r {
4246
- Some ( _) =>
4247
- // Ditto.
4248
- mk_struct ( cx, did, substs { self_r : Some ( ty:: re_static) ,
4249
- self_ty : None ,
4250
- tps : ( * r) . tps . clone ( ) } ) ,
4251
- None =>
4252
- t
4253
- } ,
4271
+ ty_struct( did, ref r) => {
4272
+ match ( * r) . regions {
4273
+ NonerasedRegions ( _) => {
4274
+ // Ditto.
4275
+ mk_struct ( cx, did, substs { regions : ty:: ErasedRegions ,
4276
+ self_ty : None ,
4277
+ tps : ( * r) . tps . clone ( ) } )
4278
+ }
4279
+ ErasedRegions => {
4280
+ t
4281
+ }
4282
+ }
4283
+ }
4254
4284
4255
4285
_ =>
4256
4286
t
@@ -4434,7 +4464,7 @@ pub fn visitor_object_ty(tcx: ctxt) -> Result<(@TraitRef, t), ~str> {
4434
4464
Err ( s) => { return Err ( s) ; }
4435
4465
} ;
4436
4466
let substs = substs {
4437
- self_r : None ,
4467
+ regions : ty :: NonerasedRegions ( opt_vec :: Empty ) ,
4438
4468
self_ty : None ,
4439
4469
tps : ~[ ]
4440
4470
} ;
0 commit comments