Skip to content

Commit

Permalink
stop reporting "unsatisfied lifetime bounds" errors after the first
Browse files Browse the repository at this point in the history
In particular, after the first for a given region variable. This
suppresses a lot of duplicate errors.
  • Loading branch information
nikomatsakis committed Oct 22, 2018
1 parent 2921fba commit 64b5599
Show file tree
Hide file tree
Showing 10 changed files with 17 additions and 113 deletions.
1 change: 1 addition & 0 deletions src/librustc_mir/borrow_check/nll/region_infer/mod.rs
Expand Up @@ -1208,6 +1208,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
// to report the error. This gives better error messages
// in some cases.
self.report_error(mir, infcx, mir_def_id, longer_fr, shorter_fr, errors_buffer);
return; // continuing to iterate just reports more errors than necessary
}
}

Expand Down
Expand Up @@ -47,7 +47,6 @@ fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {

// Only works if 'x: 'y:
demand_y(x, y, x.get())
//~^ ERROR unsatisfied lifetime constraints
});
}

Expand Down
Expand Up @@ -7,7 +7,6 @@ LL | | //~^ ERROR borrowed data escapes outside of function
LL | |
LL | | // Only works if 'x: 'y:
LL | | demand_y(x, y, x.get())
LL | | //~^ ERROR unsatisfied lifetime constraints
LL | | });
| |_____^
|
Expand Down Expand Up @@ -44,21 +43,9 @@ LL | | //~^ ERROR borrowed data escapes outside of function
LL | |
LL | | // Only works if 'x: 'y:
LL | | demand_y(x, y, x.get())
LL | | //~^ ERROR unsatisfied lifetime constraints
LL | | });
| |______^ `cell_a` escapes the function body here

error: unsatisfied lifetime constraints
--> $DIR/propagate-approximated-shorter-to-static-no-bound.rs:49:9
|
LL | fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
| -- -- lifetime `'b` defined here
| |
| lifetime `'a` defined here
...
LL | demand_y(x, y, x.get())
| ^^^^^^^^^^^^^^^^^^^^^^^ argument requires that `'a` must outlive `'b`

error: aborting due to 2 previous errors
error: aborting due to previous error

For more information about this error, try `rustc --explain E0521`.
Expand Up @@ -47,9 +47,9 @@ fn demand_y<'x, 'y>(_cell_x: &Cell<&'x u32>, _cell_y: &Cell<&'y u32>, _y: &'y u3
fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
establish_relationships(&cell_a, &cell_b, |_outlives1, _outlives2, x, y| {
//~^ ERROR borrowed data escapes outside of function

// Only works if 'x: 'y:
demand_y(x, y, x.get())
//~^ ERROR unsatisfied lifetime constraints
});
}

Expand Down
Expand Up @@ -4,9 +4,9 @@ note: External requirements
LL | establish_relationships(&cell_a, &cell_b, |_outlives1, _outlives2, x, y| {
| _______________________________________________^
LL | | //~^ ERROR borrowed data escapes outside of function
LL | |
LL | | // Only works if 'x: 'y:
LL | | demand_y(x, y, x.get())
LL | | //~^ ERROR unsatisfied lifetime constraints
LL | | });
| |_____^
|
Expand All @@ -25,7 +25,7 @@ note: No external requirements
LL | / fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
LL | | establish_relationships(&cell_a, &cell_b, |_outlives1, _outlives2, x, y| {
LL | | //~^ ERROR borrowed data escapes outside of function
LL | | // Only works if 'x: 'y:
LL | |
... |
LL | | });
LL | | }
Expand All @@ -40,23 +40,12 @@ LL | fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
| ------ `cell_a` is a reference that is only valid in the function body
LL | / establish_relationships(&cell_a, &cell_b, |_outlives1, _outlives2, x, y| {
LL | | //~^ ERROR borrowed data escapes outside of function
LL | |
LL | | // Only works if 'x: 'y:
LL | | demand_y(x, y, x.get())
LL | | //~^ ERROR unsatisfied lifetime constraints
LL | | });
| |______^ `cell_a` escapes the function body here

error: unsatisfied lifetime constraints
--> $DIR/propagate-approximated-shorter-to-static-wrong-bound.rs:51:9
|
LL | fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
| -- -- lifetime `'b` defined here
| |
| lifetime `'a` defined here
...
LL | demand_y(x, y, x.get())
| ^^^^^^^^^^^^^^^^^^^^^^^ argument requires that `'a` must outlive `'b`

error: aborting due to 2 previous errors
error: aborting due to previous error

For more information about this error, try `rustc --explain E0521`.
6 changes: 1 addition & 5 deletions src/test/ui/nll/user-annotations/closure-substs.rs
Expand Up @@ -23,8 +23,6 @@ fn foo1() {
// Here `x` is bound in the closure sig:
|x: &i32| -> &'static i32 {
return x; //~ ERROR unsatisfied lifetime constraints
//~^ ERROR unsatisfied lifetime constraints
//~| ERROR unsatisfied lifetime constraints
};
}

Expand All @@ -38,9 +36,7 @@ fn bar<'a>() {
fn bar1() {
// Here `x` is bound in the closure sig:
|x: &i32, b: fn(&'static i32)| {
b(x); //~ ERROR
//~^ ERROR borrowed data escapes outside of closure
//~| ERROR unsatisfied lifetime constraints
b(x); //~ ERROR borrowed data escapes outside of closure
};
}

Expand Down
57 changes: 6 additions & 51 deletions src/test/ui/nll/user-annotations/closure-substs.stderr
Expand Up @@ -16,67 +16,22 @@ LL | return x; //~ ERROR unsatisfied lifetime constraints
| ^ returning this value requires that `'1` must outlive `'static`

error: unsatisfied lifetime constraints
--> $DIR/closure-substs.rs:25:16
|
LL | |x: &i32| -> &'static i32 {
| - - return type of closure is &'2 i32
| |
| let's call the lifetime of this reference `'1`
LL | return x; //~ ERROR unsatisfied lifetime constraints
| ^ returning this value requires that `'1` must outlive `'2`

error: unsatisfied lifetime constraints
--> $DIR/closure-substs.rs:25:16
|
LL | |x: &i32| -> &'static i32 {
| -------------------------
| | |
| | let's call the lifetime of this reference `'1`
| lifetime `'2` represents this closure's body
LL | return x; //~ ERROR unsatisfied lifetime constraints
| ^ closure was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
= note: closure implements `Fn`, so references to captured variables can't escape the closure

error: unsatisfied lifetime constraints
--> $DIR/closure-substs.rs:34:9
--> $DIR/closure-substs.rs:32:9
|
LL | fn bar<'a>() {
| -- lifetime `'a` defined here
...
LL | b(x); //~ ERROR unsatisfied lifetime constraints
| ^^^^ argument requires that `'a` must outlive `'static`

error: borrowed data escapes outside of closure
--> $DIR/closure-substs.rs:41:9
error[E0521]: borrowed data escapes outside of closure
--> $DIR/closure-substs.rs:39:9
|
LL | |x: &i32, b: fn(&'static i32)| {
| - `x` is a reference that is only valid in the closure body
LL | b(x); //~ ERROR
| ^^^^ `x` escapes the closure body here

error: borrowed data escapes outside of closure
--> $DIR/closure-substs.rs:41:9
|
LL | |x: &i32, b: fn(&'static i32)| {
| - - `b` is declared here, outside of the closure body
| |
| `x` is a reference that is only valid in the closure body
LL | b(x); //~ ERROR
LL | b(x); //~ ERROR borrowed data escapes outside of closure
| ^^^^ `x` escapes the closure body here

error: unsatisfied lifetime constraints
--> $DIR/closure-substs.rs:41:9
|
LL | |x: &i32, b: fn(&'static i32)| {
| ------------------------------
| | |
| | let's call the lifetime of this reference `'1`
| lifetime `'2` represents this closure's body
LL | b(x); //~ ERROR
| ^^^^ argument requires that `'1` must outlive `'2`
|
= note: closure implements `Fn`, so references to captured variables can't escape the closure

error: aborting due to 8 previous errors
error: aborting due to 4 previous errors

For more information about this error, try `rustc --explain E0521`.
2 changes: 1 addition & 1 deletion src/test/ui/regions/regions-static-bound.ll.stderr
Expand Up @@ -20,7 +20,7 @@ LL | static_id(&u); //[ll]~ ERROR explicit lifetime required in the type of
| ^^^^^^^^^ lifetime `'static` required

error[E0621]: explicit lifetime required in the type of `v`
--> $DIR/regions-static-bound.rs:27:5
--> $DIR/regions-static-bound.rs:26:5
|
LL | fn error(u: &(), v: &()) {
| --- help: add explicit lifetime `'static` to the type of `v`: `&'static ()`
Expand Down
25 changes: 2 additions & 23 deletions src/test/ui/regions/regions-static-bound.nll.stderr
Expand Up @@ -15,35 +15,14 @@ LL | static_id(&u); //[ll]~ ERROR explicit lifetime required in the type of
| ^^^^^^^^^^^^^ lifetime `'static` required

error[E0621]: explicit lifetime required in the type of `v`
--> $DIR/regions-static-bound.rs:27:5
--> $DIR/regions-static-bound.rs:26:5
|
LL | fn error(u: &(), v: &()) {
| --- help: add explicit lifetime `'static` to the type of `v`: `&'static ()`
...
LL | static_id_indirect(&v); //[ll]~ ERROR explicit lifetime required in the type of `v` [E0621]
| ^^^^^^^^^^^^^^^^^^^^^^ lifetime `'static` required

error: unsatisfied lifetime constraints
--> $DIR/regions-static-bound.rs:24:5
|
LL | fn error(u: &(), v: &()) {
| - - let's call the lifetime of this reference `'2`
| |
| let's call the lifetime of this reference `'1`
LL | static_id(&u); //[ll]~ ERROR explicit lifetime required in the type of `u` [E0621]
| ^^^^^^^^^^^^^ argument requires that `'1` must outlive `'2`

error: unsatisfied lifetime constraints
--> $DIR/regions-static-bound.rs:27:5
|
LL | fn error(u: &(), v: &()) {
| - - let's call the lifetime of this reference `'1`
| |
| let's call the lifetime of this reference `'2`
...
LL | static_id_indirect(&v); //[ll]~ ERROR explicit lifetime required in the type of `v` [E0621]
| ^^^^^^^^^^^^^^^^^^^^^^ argument requires that `'1` must outlive `'2`

error: aborting due to 5 previous errors
error: aborting due to 3 previous errors

For more information about this error, try `rustc --explain E0621`.
2 changes: 0 additions & 2 deletions src/test/ui/regions/regions-static-bound.rs
Expand Up @@ -23,10 +23,8 @@ fn static_id_wrong_way<'a>(t: &'a ()) -> &'static () where 'static: 'a {
fn error(u: &(), v: &()) {
static_id(&u); //[ll]~ ERROR explicit lifetime required in the type of `u` [E0621]
//[nll]~^ ERROR explicit lifetime required in the type of `u` [E0621]
//[nll]~| ERROR unsatisfied lifetime constraints
static_id_indirect(&v); //[ll]~ ERROR explicit lifetime required in the type of `v` [E0621]
//[nll]~^ ERROR explicit lifetime required in the type of `v` [E0621]
//[nll]~| ERROR unsatisfied lifetime constraints
}

fn main() {}

0 comments on commit 64b5599

Please sign in to comment.