mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-13 12:36:47 +00:00
fix diagnostic regresssion
This commit is contained in:
parent
9f7d0e91b5
commit
8c215e7841
@ -408,13 +408,18 @@ 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)))
|
||||
@ -422,16 +427,16 @@ fn try_extract_error_from_region_constraints<'tcx>(
|
||||
{
|
||||
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()
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
@ -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`.
|
||||
|
@ -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
|
||||
|
|
||||
@ -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
|
||||
|
|
||||
|
Loading…
Reference in New Issue
Block a user