@@ -460,6 +460,90 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
460
460
}
461
461
}
462
462
463
+ /// True if `a <= b`.
464
+ fn sub_region_values ( & self , a : VarValue < ' tcx > , b : VarValue < ' tcx > ) -> bool {
465
+ match ( a, b) {
466
+ // Error region is `'static`
467
+ ( VarValue :: ErrorValue , _) | ( _, VarValue :: ErrorValue ) => return true ,
468
+ ( VarValue :: Empty ( a_ui) , VarValue :: Empty ( b_ui) ) => {
469
+ // Empty regions are ordered according to the universe
470
+ // they are associated with.
471
+ a_ui. min ( b_ui) == b_ui
472
+ }
473
+ ( VarValue :: Value ( a) , VarValue :: Empty ( b_ui) ) => {
474
+ match * a {
475
+ ReLateBound ( ..) | ReErased => {
476
+ bug ! ( "cannot relate region: {:?}" , a) ;
477
+ }
478
+
479
+ ReVar ( v_id) => {
480
+ span_bug ! (
481
+ self . var_infos[ v_id] . origin. span( ) ,
482
+ "lub_concrete_regions invoked with non-concrete region: {:?}" ,
483
+ a
484
+ ) ;
485
+ }
486
+
487
+ ReStatic | ReEarlyBound ( _) | ReFree ( _) => {
488
+ // nothing lives longer than `'static`
489
+
490
+ // All empty regions are less than early-bound, free,
491
+ // and scope regions.
492
+
493
+ false
494
+ }
495
+
496
+ ReEmpty ( a_ui) => {
497
+ // Empty regions are ordered according to the universe
498
+ // they are associated with.
499
+ a_ui. min ( b_ui) == b_ui
500
+ }
501
+
502
+ RePlaceholder ( _) => {
503
+ // The LUB is either `a` or `'static`
504
+ false
505
+ }
506
+ }
507
+ }
508
+ ( VarValue :: Empty ( a_ui) , VarValue :: Value ( b) ) => {
509
+ match * b {
510
+ ReLateBound ( ..) | ReErased => {
511
+ bug ! ( "cannot relate region: {:?}" , b) ;
512
+ }
513
+
514
+ ReVar ( v_id) => {
515
+ span_bug ! (
516
+ self . var_infos[ v_id] . origin. span( ) ,
517
+ "lub_concrete_regions invoked with non-concrete regions: {:?}" ,
518
+ b
519
+ ) ;
520
+ }
521
+
522
+ ReStatic | ReEarlyBound ( _) | ReFree ( _) => {
523
+ // nothing lives longer than `'static`
524
+ // All empty regions are less than early-bound, free,
525
+ // and scope regions.
526
+ true
527
+ }
528
+
529
+ ReEmpty ( b_ui) => {
530
+ // Empty regions are ordered according to the universe
531
+ // they are associated with.
532
+ a_ui. min ( b_ui) == b_ui
533
+ }
534
+
535
+ RePlaceholder ( placeholder) => {
536
+ // If this empty region is from a universe that can
537
+ // name the placeholder, then the placeholder is
538
+ // larger; otherwise, the only ancestor is `'static`.
539
+ if a_ui. can_name ( placeholder. universe ) { true } else { false }
540
+ }
541
+ }
542
+ }
543
+ ( VarValue :: Value ( a) , VarValue :: Value ( b) ) => self . sub_concrete_regions ( a, b) ,
544
+ }
545
+ }
546
+
463
547
/// True if `a <= b`, but not defined over inference variables.
464
548
#[ instrument( level = "trace" , skip( self ) ) ]
465
549
fn sub_concrete_regions ( & self , a : Region < ' tcx > , b : Region < ' tcx > ) -> bool {
@@ -989,12 +1073,25 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
989
1073
}
990
1074
991
1075
VerifyBound :: OutlivedBy ( r) => {
992
- self . sub_concrete_regions ( min, var_values. normalize ( self . tcx ( ) , * r) )
1076
+ let a = match * min {
1077
+ ty:: ReVar ( rid) => var_values. values [ rid] ,
1078
+ _ => VarValue :: Value ( min) ,
1079
+ } ;
1080
+ let b = match * * r {
1081
+ ty:: ReVar ( rid) => var_values. values [ rid] ,
1082
+ _ => VarValue :: Value ( * r) ,
1083
+ } ;
1084
+ self . sub_region_values ( a, b)
993
1085
}
994
1086
995
- VerifyBound :: IsEmpty => {
996
- matches ! ( * min, ty:: ReEmpty ( _) )
997
- }
1087
+ VerifyBound :: IsEmpty => match * min {
1088
+ ty:: ReVar ( rid) => match var_values. values [ rid] {
1089
+ VarValue :: ErrorValue => false ,
1090
+ VarValue :: Empty ( _) => true ,
1091
+ VarValue :: Value ( min) => matches ! ( * min, ty:: ReEmpty ( _) ) ,
1092
+ } ,
1093
+ _ => matches ! ( * min, ty:: ReEmpty ( _) ) ,
1094
+ } ,
998
1095
999
1096
VerifyBound :: AnyBound ( bs) => {
1000
1097
bs. iter ( ) . any ( |b| self . bound_is_met ( b, var_values, generic_ty, min) )
@@ -1036,7 +1133,7 @@ impl<'tcx> LexicalRegionResolutions<'tcx> {
1036
1133
) -> ty:: Region < ' tcx > {
1037
1134
let result = match * r {
1038
1135
ty:: ReVar ( rid) => match self . values [ rid] {
1039
- VarValue :: Empty ( vid_universe ) => tcx . mk_region ( ty :: ReEmpty ( vid_universe ) ) ,
1136
+ VarValue :: Empty ( _ ) => r ,
1040
1137
VarValue :: Value ( r) => r,
1041
1138
VarValue :: ErrorValue => tcx. lifetimes . re_static ,
1042
1139
} ,
0 commit comments