Skip to content

Commit

Permalink
fix diagnostic regresssion
Browse files Browse the repository at this point in the history
  • Loading branch information
aliemjay committed Dec 17, 2023
1 parent 9f7d0e9 commit 8c215e7
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 32 deletions.
19 changes: 12 additions & 7 deletions compiler/rustc_borrowck/src/diagnostics/bound_region_errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -408,30 +408,35 @@ fn try_extract_error_from_region_constraints<'tcx>(
mut region_var_origin: impl FnMut(RegionVid) -> RegionVariableOrigin,
mut universe_of_region: impl FnMut(RegionVid) -> UniverseIndex,
) -> Option<DiagnosticBuilder<'tcx, ErrorGuaranteed>> {
let placeholder_universe = match placeholder_region.kind() {
ty::RePlaceholder(p) => p.universe,
ty::ReVar(vid) => universe_of_region(vid),
_ => ty::UniverseIndex::ROOT,
};
let matches =
|a_region: Region<'tcx>, b_region: Region<'tcx>| match (a_region.kind(), b_region.kind()) {
(RePlaceholder(a_p), RePlaceholder(b_p)) => a_p.bound == b_p.bound,
_ => a_region == b_region,
};
let check = |constraint: &Constraint<'tcx>, cause: &SubregionOrigin<'tcx>, exact| {
match *constraint {
let mut check =
|constraint: &Constraint<'tcx>, cause: &SubregionOrigin<'tcx>, exact| match *constraint {
Constraint::RegSubReg(sub, sup)
if ((exact && sup == placeholder_region)
|| (!exact && matches(sup, placeholder_region)))
&& sup != sub =>
{
Some((sub, cause.clone()))
}
// FIXME: Should this check the universe of the var?
Constraint::VarSubReg(vid, sup)
if ((exact && sup == placeholder_region)
|| (!exact && matches(sup, placeholder_region))) =>
if (exact
&& sup == placeholder_region
&& !universe_of_region(vid).can_name(placeholder_universe))
|| (!exact && matches(sup, placeholder_region)) =>
{
Some((ty::Region::new_var(infcx.tcx, vid), cause.clone()))
}
_ => None,
}
};
};
let mut info = region_constraints
.constraints
.iter()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ where
// isize>`, we require `T : for<'a> Bar<&'a isize>`, but the where
// clause only specifies `T : Bar<&'b isize>`.
foo_hrtb_bar_not(&mut t);
//~^ ERROR mismatched types
//~^ ERROR implementation of `Bar` is not general enough
//~^^ ERROR lifetime may not live long enough
}

Expand Down
14 changes: 4 additions & 10 deletions tests/ui/higher-ranked/trait-bounds/hrtb-perfect-forwarding.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -53,19 +53,14 @@ note: due to current limitations in the borrow checker, this implies a `'static`
LL | T: for<'a> Foo<&'a isize> + Bar<&'b isize>,
| ^^^^^^^^^^^^^^^^^^^^^^

error[E0308]: mismatched types
error: implementation of `Bar` is not general enough
--> $DIR/hrtb-perfect-forwarding.rs:43:5
|
LL | foo_hrtb_bar_not(&mut t);
| ^^^^^^^^^^^^^^^^^^^^^^^^ one type is more general than the other
| ^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `Bar` is not general enough
|
= note: expected trait `for<'a> <T as Foo<&'a isize>>`
found trait `for<'a> <T as Foo<&'a isize>>`
note: the lifetime requirement is introduced here
--> $DIR/hrtb-perfect-forwarding.rs:37:8
|
LL | T: for<'a> Foo<&'a isize> + Bar<&'b isize>,
| ^^^^^^^^^^^^^^^^^^^^^^
= note: `T` must implement `Bar<&'0 isize>`, for any lifetime `'0`...
= note: ...but it actually implements `Bar<&'1 isize>`, for some specific lifetime `'1`

warning: function cannot return without recursing
--> $DIR/hrtb-perfect-forwarding.rs:48:1
Expand All @@ -82,4 +77,3 @@ LL | foo_hrtb_bar_hrtb(&mut t);

error: aborting due to 2 previous errors; 4 warnings emitted

For more information about this error, try `rustc --explain E0308`.
18 changes: 4 additions & 14 deletions tests/ui/lifetimes/issue-79187-2.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,8 @@ error[E0308]: mismatched types
LL | take_foo(|a: &i32| a);
| ^^^^^^^^^^^^^^^^^^^^^ one type is more general than the other
|
= note: expected trait `for<'a> <{closure@$DIR/issue-79187-2.rs:11:14: 11:23} as FnOnce<(&'a i32,)>>`
found trait `for<'a> <{closure@$DIR/issue-79187-2.rs:11:14: 11:23} as FnOnce<(&'a i32,)>>`
note: this closure does not fulfill the lifetime requirements
--> $DIR/issue-79187-2.rs:11:14
|
LL | take_foo(|a: &i32| a);
| ^^^^^^^^^
= note: expected reference `&_`
found reference `&_`
note: the lifetime requirement is introduced here
--> $DIR/issue-79187-2.rs:5:21
|
Expand All @@ -73,13 +68,8 @@ error[E0308]: mismatched types
LL | take_foo(|a: &i32| -> &i32 { a });
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ one type is more general than the other
|
= note: expected trait `for<'a> <{closure@$DIR/issue-79187-2.rs:14:14: 14:31} as FnOnce<(&'a i32,)>>`
found trait `for<'a> <{closure@$DIR/issue-79187-2.rs:14:14: 14:31} as FnOnce<(&'a i32,)>>`
note: this closure does not fulfill the lifetime requirements
--> $DIR/issue-79187-2.rs:14:14
|
LL | take_foo(|a: &i32| -> &i32 { a });
| ^^^^^^^^^^^^^^^^^
= note: expected reference `&_`
found reference `&_`
note: the lifetime requirement is introduced here
--> $DIR/issue-79187-2.rs:5:21
|
Expand Down

0 comments on commit 8c215e7

Please sign in to comment.