@@ -489,7 +489,15 @@ pub enum bound_region {
489
489
br_cap_avoid( ast:: node_id , @bound_region ) ,
490
490
}
491
491
492
- type opt_region = Option < Region > ;
492
+ /**
493
+ * Represents the values to use when substituting lifetime parameters.
494
+ * If the value is `ErasedRegions`, then this subst is occurring during
495
+ * trans, and all region parameters will be replaced with `ty::re_static`. */
496
+ #[ deriving( Clone , Eq , IterBytes ) ]
497
+ pub enum RegionSubsts {
498
+ ErasedRegions ,
499
+ NonerasedRegions ( OptVec < ty:: Region > )
500
+ }
493
501
494
502
/**
495
503
* The type substs represents the kinds of things that can be substituted to
@@ -510,9 +518,9 @@ type opt_region = Option<Region>;
510
518
* always substituted away to the implementing type for a trait. */
511
519
#[ deriving( Clone , Eq , IterBytes ) ]
512
520
pub struct substs {
513
- self_r : opt_region ,
514
521
self_ty : Option < ty:: t > ,
515
- tps : ~[ t ]
522
+ tps : ~[ t ] ,
523
+ regions : RegionSubsts ,
516
524
}
517
525
518
526
mod primitives {
@@ -952,7 +960,14 @@ fn mk_t(cx: ctxt, st: sty) -> t {
952
960
fn sflags ( substs : & substs ) -> uint {
953
961
let mut f = 0 u;
954
962
for substs. tps. iter( ) . advance |tt| { f |= get( * tt) . flags; }
955
- for substs. self_r. iter( ) . advance |r| { f |= rflags( * r) }
963
+ match substs. regions {
964
+ ErasedRegions => { }
965
+ NonerasedRegions ( ref regions) => {
966
+ for regions. iter( ) . advance |r| {
967
+ f |= rflags( * r)
968
+ }
969
+ }
970
+ }
956
971
return f;
957
972
}
958
973
match & st {
@@ -1290,7 +1305,7 @@ pub fn fold_bare_fn_ty(fty: &BareFnTy, fldop: &fn(t) -> t) -> BareFnTy {
1290
1305
1291
1306
fn fold_sty( sty: & sty, fldop: & fn( t) -> t) -> sty {
1292
1307
fn fold_substs( substs : & substs, fldop : & fn( t) -> t) -> substs {
1293
- substs { self_r : substs. self_r ,
1308
+ substs { regions : substs. regions . clone ( ) ,
1294
1309
self_ty : substs. self_ty. map( |t| fldop( * t) ) ,
1295
1310
tps : substs. tps. map( |t| fldop( * t) ) }
1296
1311
}
@@ -1382,8 +1397,15 @@ pub fn fold_regions_and_ty(
1382
1397
fldr : & fn ( r : Region ) -> Region ,
1383
1398
fldt : & fn ( t : t ) -> t )
1384
1399
-> substs {
1400
+ let regions = match substs. regions {
1401
+ ErasedRegions => ErasedRegions ,
1402
+ NonerasedRegions ( ref regions) => {
1403
+ NonerasedRegions ( regions. map ( |r| fldr ( * r) ) )
1404
+ }
1405
+ } ;
1406
+
1385
1407
substs {
1386
- self_r : substs . self_r . map ( |r| fldr ( * r ) ) ,
1408
+ regions : regions ,
1387
1409
self_ty : substs. self_ty . map ( |t| fldt ( * t) ) ,
1388
1410
tps : substs. tps . map ( |t| fldt ( * t) )
1389
1411
}
@@ -1482,8 +1504,13 @@ pub fn subst_tps(cx: ctxt, tps: &[t], self_ty_opt: Option<t>, typ: t) -> t {
1482
1504
}
1483
1505
1484
1506
pub fn substs_is_noop ( substs : & substs ) -> bool {
1507
+ let regions_is_noop = match substs. regions {
1508
+ ErasedRegions => false , // may be used to canonicalize
1509
+ NonerasedRegions ( ref regions) => regions. is_empty ( )
1510
+ } ;
1511
+
1485
1512
substs. tps . len ( ) == 0 u &&
1486
- substs . self_r . is_none ( ) &&
1513
+ regions_is_noop &&
1487
1514
substs. self_ty . is_none ( )
1488
1515
}
1489
1516
@@ -4238,30 +4265,33 @@ pub fn normalize_ty(cx: ctxt, t: t) -> t {
4238
4265
} )
4239
4266
}
4240
4267
4241
- ty_enum( did, ref r) =>
4242
- match ( * r) . self_r {
4243
- Some ( _) =>
4244
- // Use re_static since trans doesn't care about regions
4245
- mk_enum ( cx, did,
4246
- substs {
4247
- self_r : Some ( ty:: re_static) ,
4248
- self_ty : None ,
4249
- tps : ( * r) . tps . clone ( )
4250
- } ) ,
4251
- None =>
4268
+ ty_enum( did, ref r) => {
4269
+ match ( * r) . regions {
4270
+ NonerasedRegions ( _) => {
4271
+ // trans doesn't care about regions
4272
+ mk_enum ( cx, did, substs { regions : ty:: ErasedRegions ,
4273
+ self_ty : None ,
4274
+ tps : ( * r) . tps . clone ( ) } )
4275
+ }
4276
+ ErasedRegions => {
4252
4277
t
4253
- } ,
4278
+ }
4279
+ }
4280
+ }
4254
4281
4255
- ty_struct( did, ref r) =>
4256
- match ( * r) . self_r {
4257
- Some ( _) =>
4258
- // Ditto.
4259
- mk_struct ( cx, did, substs { self_r : Some ( ty:: re_static) ,
4260
- self_ty : None ,
4261
- tps : ( * r) . tps . clone ( ) } ) ,
4262
- None =>
4263
- t
4264
- } ,
4282
+ ty_struct( did, ref r) => {
4283
+ match ( * r) . regions {
4284
+ NonerasedRegions ( _) => {
4285
+ // Ditto.
4286
+ mk_struct ( cx, did, substs { regions : ty:: ErasedRegions ,
4287
+ self_ty : None ,
4288
+ tps : ( * r) . tps . clone ( ) } )
4289
+ }
4290
+ ErasedRegions => {
4291
+ t
4292
+ }
4293
+ }
4294
+ }
4265
4295
4266
4296
_ =>
4267
4297
t
@@ -4421,7 +4451,7 @@ pub fn visitor_object_ty(tcx: ctxt) -> Result<(@TraitRef, t), ~str> {
4421
4451
Err ( s) => { return Err ( s) ; }
4422
4452
} ;
4423
4453
let substs = substs {
4424
- self_r : None ,
4454
+ regions : ty :: NonerasedRegions ( opt_vec :: Empty ) ,
4425
4455
self_ty : None ,
4426
4456
tps : ~[ ]
4427
4457
} ;
0 commit comments