@@ -486,7 +486,15 @@ pub enum bound_region {
486486    br_cap_avoid( ast:: node_id ,  @bound_region ) , 
487487} 
488488
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+ } 
490498
491499/** 
492500 * The type substs represents the kinds of things that can be substituted to 
@@ -507,9 +515,9 @@ type opt_region = Option<Region>;
507515 *   always substituted away to the implementing type for a trait. */ 
508516#[ deriving( Clone ,  Eq ,  IterBytes ) ]  
509517pub  struct  substs  { 
510-     self_r :  opt_region , 
511518    self_ty :  Option < ty:: t > , 
512-     tps :  ~[ t ] 
519+     tps :  ~[ t ] , 
520+     regions :  RegionSubsts , 
513521} 
514522
515523mod  primitives { 
@@ -948,7 +956,14 @@ fn mk_t(cx: ctxt, st: sty) -> t {
948956    fn  sflags ( substs :  & substs )  -> uint  { 
949957        let  mut  f = 0 u; 
950958        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+         } 
952967        return  f; 
953968    } 
954969    match  & st { 
@@ -1286,7 +1301,7 @@ pub fn fold_bare_fn_ty(fty: &BareFnTy, fldop: &fn(t) -> t) -> BareFnTy {
12861301
12871302fn  fold_sty( sty:  & sty,  fldop:  & fn( t)  -> t)  -> sty  { 
12881303    fn fold_substs( substs :  & substs,  fldop :  & fn( t)  -> t)  -> substs  { 
1289-         substs  { self_r :  substs. self_r , 
1304+         substs { regions :  substs. regions . clone ( ) , 
12901305                self_ty :  substs. self_ty. map( |t| fldop( * t) ) , 
12911306                tps :  substs. tps. map( |t| fldop( * t) ) } 
12921307    } 
@@ -1378,8 +1393,15 @@ pub fn fold_regions_and_ty(
13781393        fldr :  & fn ( r :  Region )  -> Region , 
13791394        fldt :  & fn ( t :  t )  -> t ) 
13801395     -> substs  { 
1396+         let  regions = match  substs. regions  { 
1397+             ErasedRegions  => ErasedRegions , 
1398+             NonerasedRegions ( ref  regions)  => { 
1399+                 NonerasedRegions ( regions. map ( |r| fldr ( * r) ) ) 
1400+             } 
1401+         } ; 
1402+ 
13811403        substs  { 
1382-             self_r :  substs . self_r . map ( |r|  fldr ( * r ) ) , 
1404+             regions :  regions , 
13831405            self_ty :  substs. self_ty . map ( |t| fldt ( * t) ) , 
13841406            tps :  substs. tps . map ( |t| fldt ( * t) ) 
13851407        } 
@@ -1478,8 +1500,13 @@ pub fn subst_tps(cx: ctxt, tps: &[t], self_ty_opt: Option<t>, typ: t) -> t {
14781500} 
14791501
14801502pub  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+ 
14811508    substs. tps . len ( )  == 0 u &&
1482-         substs . self_r . is_none ( )  &&
1509+         regions_is_noop  &&
14831510        substs. self_ty . is_none ( ) 
14841511} 
14851512
@@ -4227,30 +4254,33 @@ pub fn normalize_ty(cx: ctxt, t: t) -> t {
42274254            } ) 
42284255        } 
42294256
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  => { 
42414266                    t
4242-             } , 
4267+                 } 
4268+             } 
4269+         } 
42434270
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+         } 
42544284
42554285        _ =>
42564286            t
@@ -4434,7 +4464,7 @@ pub fn visitor_object_ty(tcx: ctxt) -> Result<(@TraitRef, t), ~str> {
44344464        Err ( s)  => {  return  Err ( s) ;  } 
44354465    } ; 
44364466    let  substs = substs  { 
4437-         self_r :   None , 
4467+         regions :  ty :: NonerasedRegions ( opt_vec :: Empty ) , 
44384468        self_ty :  None , 
44394469        tps :  ~[ ] 
44404470    } ; 
0 commit comments