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:
@@ -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"
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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() {}
|
||||
@@ -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`.
|
||||
Reference in New Issue
Block a user