@@ -49,7 +49,7 @@ impl<'tcx> UniverseInfo<'tcx> {
49
49
UniverseInfo :: RelateTys { expected, found }
50
50
}
51
51
52
- pub ( crate ) fn report_error (
52
+ pub ( crate ) fn report_erroneous_element (
53
53
& self ,
54
54
mbcx : & mut MirBorrowckCtxt < ' _ , ' _ , ' tcx > ,
55
55
placeholder : ty:: PlaceholderRegion ,
@@ -68,7 +68,7 @@ impl<'tcx> UniverseInfo<'tcx> {
68
68
mbcx. buffer_error ( err) ;
69
69
}
70
70
UniverseInfo :: TypeOp ( ref type_op_info) => {
71
- type_op_info. report_error ( mbcx, placeholder, error_element, cause) ;
71
+ type_op_info. report_erroneous_element ( mbcx, placeholder, error_element, cause) ;
72
72
}
73
73
UniverseInfo :: Other => {
74
74
// FIXME: This error message isn't great, but it doesn't show
@@ -145,8 +145,11 @@ pub(crate) trait TypeOpInfo<'tcx> {
145
145
error_region : Option < ty:: Region < ' tcx > > ,
146
146
) -> Option < Diag < ' infcx > > ;
147
147
148
+ /// Constraints require that `error_element` appear in the
149
+ /// values of `placeholder`, but this cannot be proven to
150
+ /// hold. Report an error.
148
151
#[ instrument( level = "debug" , skip( self , mbcx) ) ]
149
- fn report_error (
152
+ fn report_erroneous_element (
150
153
& self ,
151
154
mbcx : & mut MirBorrowckCtxt < ' _ , ' _ , ' tcx > ,
152
155
placeholder : ty:: PlaceholderRegion ,
@@ -190,12 +193,7 @@ pub(crate) trait TypeOpInfo<'tcx> {
190
193
let nice_error = self . nice_error ( mbcx, cause, placeholder_region, error_region) ;
191
194
192
195
debug ! ( ?nice_error) ;
193
-
194
- if let Some ( nice_error) = nice_error {
195
- mbcx. buffer_error ( nice_error) ;
196
- } else {
197
- mbcx. buffer_error ( self . fallback_error ( tcx, span) ) ;
198
- }
196
+ mbcx. buffer_error ( nice_error. unwrap_or_else ( || self . fallback_error ( tcx, span) ) ) ;
199
197
}
200
198
}
201
199
@@ -450,7 +448,8 @@ fn try_extract_error_from_region_constraints<'a, 'tcx>(
450
448
ty:: ReVar ( vid) => universe_of_region ( vid) ,
451
449
_ => ty:: UniverseIndex :: ROOT ,
452
450
} ;
453
- let matches =
451
+ // Are the two regions the same?
452
+ let regions_the_same =
454
453
|a_region : Region < ' tcx > , b_region : Region < ' tcx > | match ( a_region. kind ( ) , b_region. kind ( ) ) {
455
454
( RePlaceholder ( a_p) , RePlaceholder ( b_p) ) => a_p. bound == b_p. bound ,
456
455
_ => a_region == b_region,
@@ -459,7 +458,7 @@ fn try_extract_error_from_region_constraints<'a, 'tcx>(
459
458
|constraint : & Constraint < ' tcx > , cause : & SubregionOrigin < ' tcx > , exact| match * constraint {
460
459
Constraint :: RegSubReg ( sub, sup)
461
460
if ( ( exact && sup == placeholder_region)
462
- || ( !exact && matches ( sup, placeholder_region) ) )
461
+ || ( !exact && regions_the_same ( sup, placeholder_region) ) )
463
462
&& sup != sub =>
464
463
{
465
464
Some ( ( sub, cause. clone ( ) ) )
@@ -468,23 +467,21 @@ fn try_extract_error_from_region_constraints<'a, 'tcx>(
468
467
if ( exact
469
468
&& sup == placeholder_region
470
469
&& !universe_of_region ( vid) . can_name ( placeholder_universe) )
471
- || ( !exact && matches ( sup, placeholder_region) ) =>
470
+ || ( !exact && regions_the_same ( sup, placeholder_region) ) =>
472
471
{
473
472
Some ( ( ty:: Region :: new_var ( infcx. tcx , vid) , cause. clone ( ) ) )
474
473
}
475
474
_ => None ,
476
475
} ;
477
- let mut info = region_constraints
478
- . constraints
479
- . iter ( )
480
- . find_map ( |( constraint, cause) | check ( constraint, cause, true ) ) ;
481
- if info. is_none ( ) {
482
- info = region_constraints
476
+
477
+ let mut find_culprit = |exact_match : bool | {
478
+ region_constraints
483
479
. constraints
484
480
. iter ( )
485
- . find_map ( |( constraint, cause) | check ( constraint, cause, false ) ) ;
486
- }
487
- let ( sub_region, cause) = info?;
481
+ . find_map ( |( constraint, cause) | check ( constraint, cause, exact_match) )
482
+ } ;
483
+
484
+ let ( sub_region, cause) = find_culprit ( true ) . or_else ( || find_culprit ( false ) ) ?;
488
485
489
486
debug ! ( ?sub_region, "cause = {:#?}" , cause) ;
490
487
let error = match ( error_region, sub_region. kind ( ) ) {
0 commit comments