Show bound lifetimes when comparing types in diagnostics

This commit is contained in:
Matthew Jasper 2021-03-03 12:14:35 +00:00 committed by Rémy Rakic
parent 5d52c0e0c6
commit 842f0590db
2 changed files with 15 additions and 4 deletions

View file

@ -1191,16 +1191,26 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
// | | // | |
// | elided as they were the same // | elided as they were the same
// not elided, they were different, but irrelevant // not elided, they were different, but irrelevant
//
// For bound lifetimes, keep the names of the lifetimes,
// even if they are the same so that it's clear what's happening
// if we have something like
//
// for<'r, 's> fn(Inv<'r>, Inv<'s>)
// for<'r> fn(Inv<'r>, Inv<'r>)
let lifetimes = sub1.regions().zip(sub2.regions()); let lifetimes = sub1.regions().zip(sub2.regions());
for (i, lifetimes) in lifetimes.enumerate() { for (i, lifetimes) in lifetimes.enumerate() {
let l1 = lifetime_display(lifetimes.0); let l1 = lifetime_display(lifetimes.0);
let l2 = lifetime_display(lifetimes.1); let l2 = lifetime_display(lifetimes.1);
if lifetimes.0 == lifetimes.1 { if lifetimes.0 != lifetimes.1 {
values.0.push_normal("'_");
values.1.push_normal("'_");
} else {
values.0.push_highlighted(l1); values.0.push_highlighted(l1);
values.1.push_highlighted(l2); values.1.push_highlighted(l2);
} else if lifetimes.0.is_late_bound() {
values.0.push_normal(l1);
values.1.push_normal(l2);
} else {
values.0.push_normal("'_");
values.1.push_normal("'_");
} }
self.push_comma(&mut values.0, &mut values.1, len, i); self.push_comma(&mut values.0, &mut values.1, len, i);
} }

View file

@ -1,4 +1,5 @@
pub use self::freshen::TypeFreshener; pub use self::freshen::TypeFreshener;
pub use self::lexical_region_resolve::RegionResolutionError;
pub use self::LateBoundRegionConversionTime::*; pub use self::LateBoundRegionConversionTime::*;
pub use self::RegionVariableOrigin::*; pub use self::RegionVariableOrigin::*;
pub use self::SubregionOrigin::*; pub use self::SubregionOrigin::*;