Point at multiple outlives requirements instead of just the first one

```
error[E0716]: temporary value dropped while borrowed
  --> $DIR/multiple-sources-for-outlives-requirement.rs:5:38
   |
LL | fn foo<'b>() {
   |        -- lifetime `'b` defined here
LL |     outlives_indir::<'_, 'b, _>(&mut 1u32);
   |     ---------------------------------^^^^-- temporary value is freed at the end of this statement
   |     |                                |
   |     |                                creates a temporary value which is freed while still in use
   |     argument requires that borrow lasts for `'b`
   |
note: requirements that the value outlives `'b` introduced here
  --> $DIR/multiple-sources-for-outlives-requirement.rs:1:23
   |
LL | fn outlives_indir<'a: 'b, 'b, T: 'a>(_x: T) {}
   |                       ^^         ^^
```
This commit is contained in:
Esteban Küber
2025-09-28 21:13:53 +00:00
parent 58f5260b96
commit c5313fed76
3 changed files with 39 additions and 5 deletions

View File

@@ -417,18 +417,21 @@ impl<'tcx> BorrowExplanation<'tcx> {
self.add_object_lifetime_default_note(tcx, err, unsize_ty);
}
if let Some(pred) = path
let mut preds = path
.iter()
.filter_map(|constraint| match constraint.category {
ConstraintCategory::Predicate(pred) if !pred.is_dummy() => Some(pred),
_ => None,
})
.next()
{
.collect::<Vec<Span>>();
preds.sort();
preds.dedup();
if !preds.is_empty() {
let s = if preds.len() == 1 { "" } else { "s" };
err.span_note(
pred,
preds,
format!(
"requirement that the value outlives `{region_name}` introduced here"
"requirement{s} that the value outlives `{region_name}` introduced here"
),
);
}

View File

@@ -0,0 +1,11 @@
fn outlives_indir<'a: 'b, 'b, T: 'a>(_x: T) {}
//~^ NOTE: requirements that the value outlives `'b` introduced here
fn foo<'b>() { //~ NOTE: lifetime `'b` defined here
outlives_indir::<'_, 'b, _>(&mut 1u32); //~ ERROR: temporary value dropped while borrowed
//~^ NOTE: argument requires that borrow lasts for `'b`
//~| NOTE: creates a temporary value which is freed while still in use
//~| NOTE: temporary value is freed at the end of this statement
}
fn main() {}

View File

@@ -0,0 +1,20 @@
error[E0716]: temporary value dropped while borrowed
--> $DIR/multiple-sources-for-outlives-requirement.rs:5:38
|
LL | fn foo<'b>() {
| -- lifetime `'b` defined here
LL | outlives_indir::<'_, 'b, _>(&mut 1u32);
| ---------------------------------^^^^-- temporary value is freed at the end of this statement
| | |
| | creates a temporary value which is freed while still in use
| argument requires that borrow lasts for `'b`
|
note: requirements that the value outlives `'b` introduced here
--> $DIR/multiple-sources-for-outlives-requirement.rs:1:23
|
LL | fn outlives_indir<'a: 'b, 'b, T: 'a>(_x: T) {}
| ^^ ^^
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0716`.