Clean up visual output logic

This commit is contained in:
Esteban Kuber 2021-10-11 19:20:13 +00:00
parent d10fe26f39
commit dd81e98466
14 changed files with 61 additions and 106 deletions

View File

@ -139,89 +139,39 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> {
// | ...is captured here...
(false, sup_origin.span())
} else {
(true, param.param_ty_span)
(!sup_origin.span().overlaps(return_sp), param.param_ty_span)
};
err.span_label(capture_point, &format!("this data with {}...", lifetime));
debug!("try_report_static_impl_trait: param_info={:?}", param);
let mut spans = spans.clone();
if mention_capture {
spans.push(sup_origin.span());
}
spans.sort();
spans.dedup();
// We try to make the output have fewer overlapping spans if possible.
if (sp == sup_origin.span() || !return_sp.overlaps(sup_origin.span()))
&& sup_origin.span() != return_sp
{
// Customize the spans and labels depending on their relative order so
// that split sentences flow correctly.
if sup_origin.span().overlaps(return_sp) && sp == sup_origin.span() {
// Avoid the following:
//
// error: cannot infer an appropriate lifetime
// --> $DIR/must_outlive_least_region_or_bound.rs:18:50
// |
// LL | fn foo(x: &i32) -> Box<dyn Debug> { Box::new(x) }
// | ---- ---------^-
//
// and instead show:
//
// error: cannot infer an appropriate lifetime
// --> $DIR/must_outlive_least_region_or_bound.rs:18:50
// |
// LL | fn foo(x: &i32) -> Box<dyn Debug> { Box::new(x) }
// | ---- ^
err.span_label(
sup_origin.span(),
&format!(
"...is captured here, requiring it to live as long as `'static`{}",
if spans.is_empty() { "" } else { "..." },
),
);
} else {
if return_sp < sup_origin.span() && mention_capture {
err.span_label(sup_origin.span(), "...is captured here...");
err.span_note(
return_sp,
"...and is required to live as long as `'static` here",
);
} else {
err.span_label(
return_sp,
&format!(
"...is required to live as long as `'static` here{}",
if spans.is_empty() { "" } else { "..." },
),
);
if mention_capture {
let span = sup_origin.span();
let msg = if spans.iter().any(|sp| *sp > span) {
"...is captured here..."
} else {
"...and is captured here"
};
err.span_label(span, msg);
}
}
}
let (require_msg, require_span) = if sup_origin.span().overlaps(return_sp) {
("...is captured and required to live as long as `'static` here", sup_origin.span())
} else {
err.span_label(
return_sp,
&format!(
"...is captured and required to live as long as `'static` here{}",
if spans.is_empty() { "" } else { "..." },
),
);
("...and is required to live as long as `'static` here", return_sp)
};
for span in &spans {
err.span_label(*span, "...is captured here...");
}
for span in spans {
let msg =
format!("...and is captured here{}", if mention_capture { " too" } else { "" });
if span.overlaps(return_sp) {
err.span_note(*span, &msg);
} else {
err.span_label(*span, &msg);
}
if spans.iter().any(|sp| sp.overlaps(return_sp) || *sp > return_sp) {
err.span_note(require_span, require_msg);
} else {
err.span_label(require_span, require_msg);
}
if let SubregionOrigin::RelateParamBound(_, _, Some(bound)) = sub_origin {
err.span_note(*bound, "`'static` lifetime requirement introduced by this trait bound");
err.span_note(*bound, "`'static` lifetime requirement introduced by this bound");
}
let fn_returns = tcx.return_type_impl_or_dyn_traits(anon_reg_sup.def_id);

View File

@ -4,7 +4,7 @@ error[E0759]: `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime
LL | fn baz<'a,'b>(x: &'a u32) -> &'static u32 {
| ------- this data with lifetime `'a`...
LL | bar(foo, x)
| ----^^^---- ...is captured and required to live as long as `'static` here
| ^^^ - ...is captured and required to live as long as `'static` here
error: aborting due to previous error

View File

@ -5,7 +5,7 @@ LL | fn baz<'a, 'b>(x: Type<'a>) -> Type<'static> {
| -------- this data with lifetime `'a`...
...
LL | bar(foo, x)
| ----^^^---- ...is captured and required to live as long as `'static` here
| ^^^ - ...is captured and required to live as long as `'static` here
error: aborting due to previous error

View File

@ -4,14 +4,14 @@ error[E0759]: `self` has an anonymous lifetime `'_` but it needs to satisfy a `'
LL | pub async fn run_dummy_fn(&self) {
| ^^^^^ this data with an anonymous lifetime `'_`...
LL | foo(|| self.bar()).await;
| --- ...is required to live as long as `'static` here...
| ------------------------ ...is captured here...
|
note: ...and is captured here
note: ...and is required to live as long as `'static` here
--> $DIR/issue-62097.rs:13:9
|
LL | foo(|| self.bar()).await;
| ^^^^^^^^^^^^^^^^^^^^^^^^
note: `'static` lifetime requirement introduced by this trait bound
| ^^^
note: `'static` lifetime requirement introduced by this bound
--> $DIR/issue-62097.rs:4:19
|
LL | F: FnOnce() + 'static

View File

@ -1,6 +1,6 @@
// edition:2018
fn require_static<T: 'static>(val: T) -> T {
//~^ NOTE 'static` lifetime requirement introduced by this trait bound
//~^ NOTE 'static` lifetime requirement introduced by this bound
val
}
@ -10,8 +10,8 @@ impl Problem {
pub async fn start(&self) { //~ ERROR E0759
//~^ NOTE this data with an anonymous lifetime `'_`
//~| NOTE in this expansion of desugaring of `async` block or function
require_static(async move { //~ NOTE ...is required to live as long as `'static` here
&self; //~ NOTE ...and is captured here
require_static(async move { //~ NOTE ...and is required to live as long as `'static` here
&self; //~ NOTE ...is captured here...
});
}
}

View File

@ -4,12 +4,15 @@ error[E0759]: `self` has an anonymous lifetime `'_` but it needs to satisfy a `'
LL | pub async fn start(&self) {
| ^^^^^ this data with an anonymous lifetime `'_`...
...
LL | require_static(async move {
| -------------- ...is required to live as long as `'static` here...
LL | &self;
| ----- ...and is captured here
| ----- ...is captured here...
|
note: `'static` lifetime requirement introduced by this trait bound
note: ...and is required to live as long as `'static` here
--> $DIR/issue-72312.rs:13:9
|
LL | require_static(async move {
| ^^^^^^^^^^^^^^
note: `'static` lifetime requirement introduced by this bound
--> $DIR/issue-72312.rs:2:22
|
LL | fn require_static<T: 'static>(val: T) -> T {

View File

@ -80,7 +80,7 @@ error[E0759]: `x` has an anonymous lifetime `'_` but it needs to satisfy a `'sta
--> $DIR/must_outlive_least_region_or_bound.rs:24:65
|
LL | fn elided5(x: &i32) -> (Box<dyn Debug>, impl Debug) { (Box::new(x), x) }
| ---- this data with an anonymous lifetime `'_`... ^ ...is captured here, requiring it to live as long as `'static`
| ---- this data with an anonymous lifetime `'_`... ^ ...is captured and required to live as long as `'static` here
|
help: to declare that the trait object captures data from argument `x`, you can add an explicit `'_` lifetime bound
|
@ -136,7 +136,7 @@ error[E0759]: `x` has an anonymous lifetime `'_` but it needs to satisfy a `'sta
--> $DIR/must_outlive_least_region_or_bound.rs:16:50
|
LL | fn elided3(x: &i32) -> Box<dyn Debug> { Box::new(x) }
| ---- ^ ...is captured here, requiring it to live as long as `'static`
| ---- ^ ...is captured and required to live as long as `'static` here
| |
| this data with an anonymous lifetime `'_`...
|
@ -149,7 +149,7 @@ error[E0759]: `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime
--> $DIR/must_outlive_least_region_or_bound.rs:18:59
|
LL | fn explicit3<'a>(x: &'a i32) -> Box<dyn Debug> { Box::new(x) }
| ------- ^ ...is captured here, requiring it to live as long as `'static`
| ------- ^ ...is captured and required to live as long as `'static` here
| |
| this data with lifetime `'a`...
|
@ -162,7 +162,7 @@ error[E0759]: `x` has an anonymous lifetime `'_` but it needs to satisfy a `'sta
--> $DIR/must_outlive_least_region_or_bound.rs:20:60
|
LL | fn elided4(x: &i32) -> Box<dyn Debug + 'static> { Box::new(x) }
| ---- ^ ...is captured here, requiring it to live as long as `'static`
| ---- ^ ...is captured and required to live as long as `'static` here
| |
| this data with an anonymous lifetime `'_`...
|
@ -179,7 +179,7 @@ error[E0759]: `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime
--> $DIR/must_outlive_least_region_or_bound.rs:22:69
|
LL | fn explicit4<'a>(x: &'a i32) -> Box<dyn Debug + 'static> { Box::new(x) }
| ------- this data with lifetime `'a`... ^ ...is captured here, requiring it to live as long as `'static`
| ------- this data with lifetime `'a`... ^ ...is captured and required to live as long as `'static` here
|
help: consider changing the trait object's explicit `'static` bound to the lifetime of argument `x`
|

View File

@ -4,7 +4,7 @@ error[E0759]: `value` has an anonymous lifetime `'_` but it needs to satisfy a `
LL | fn foo<T: Any>(value: &T) -> Box<dyn Any> {
| -- this data with an anonymous lifetime `'_`...
LL | Box::new(value) as Box<dyn Any>
| ^^^^^ ...is captured here, requiring it to live as long as `'static`
| ^^^^^ ...is captured and required to live as long as `'static` here
|
help: to declare that the trait object captures data from argument `value`, you can add an explicit `'_` lifetime bound
|

View File

@ -4,7 +4,7 @@ error[E0759]: `v` has an anonymous lifetime `'_` but it needs to satisfy a `'sta
LL | fn a(v: &[u8]) -> Box<dyn Foo + 'static> {
| ----- this data with an anonymous lifetime `'_`...
LL | let x: Box<dyn Foo + 'static> = Box::new(v);
| ^ ...is captured here, requiring it to live as long as `'static`
| ^ ...is captured and required to live as long as `'static` here
|
help: consider changing the trait object's explicit `'static` bound to the lifetime of argument `v`
|
@ -21,7 +21,7 @@ error[E0759]: `v` has an anonymous lifetime `'_` but it needs to satisfy a `'sta
LL | fn b(v: &[u8]) -> Box<dyn Foo + 'static> {
| ----- this data with an anonymous lifetime `'_`...
LL | Box::new(v)
| ^ ...is captured here, requiring it to live as long as `'static`
| ^ ...is captured and required to live as long as `'static` here
|
help: consider changing the trait object's explicit `'static` bound to the lifetime of argument `v`
|
@ -39,7 +39,7 @@ LL | fn c(v: &[u8]) -> Box<dyn Foo> {
| ----- this data with an anonymous lifetime `'_`...
...
LL | Box::new(v)
| ^ ...is captured here, requiring it to live as long as `'static`
| ^ ...is captured and required to live as long as `'static` here
|
help: to declare that the trait object captures data from argument `v`, you can add an explicit `'_` lifetime bound
|

View File

@ -4,7 +4,7 @@ error[E0759]: `v` has lifetime `'a` but it needs to satisfy a `'static` lifetime
LL | fn g<'a, T: 'static>(v: Box<dyn A<T> + 'a>) -> Box<dyn X + 'static> {
| ------------------ this data with lifetime `'a`...
LL | Box::new(B(&*v)) as Box<dyn X>
| ^^^ ...is captured here, requiring it to live as long as `'static`
| ^^^ ...is captured and required to live as long as `'static` here
|
help: consider changing the trait object's explicit `'static` bound to the lifetime of argument `v`
|

View File

@ -4,7 +4,7 @@ error[E0759]: `v` has lifetime `'a` but it needs to satisfy a `'static` lifetime
LL | fn i<'a, T, U>(v: Box<dyn A<U>+'a>) -> Box<dyn X + 'static> {
| ---------------- this data with lifetime `'a`...
LL | Box::new(B(&*v)) as Box<dyn X>
| ^^^ ...is captured here, requiring it to live as long as `'static`
| ^^^ ...is captured and required to live as long as `'static` here
|
help: consider changing the trait object's explicit `'static` bound to the lifetime of argument `v`
|

View File

@ -5,7 +5,7 @@ LL | fn static_proc(x: &isize) -> Box<dyn FnMut() -> (isize) + 'static> {
| ------ this data with an anonymous lifetime `'_`...
LL | // This is illegal, because the region bound on `proc` is 'static.
LL | Box::new(move || { *x })
| ^^^^^^^^^^^^^^ ...is captured here, requiring it to live as long as `'static`
| ^^^^^^^^^^^^^^ ...is captured and required to live as long as `'static` here
|
help: consider changing the trait object's explicit `'static` bound to the lifetime of argument `x`
|

View File

@ -39,13 +39,13 @@ LL | let y = x as &dyn Bar<'_, '_>;
| ...is captured here...
LL |
LL | y.get_b() // ERROR
| --------- ...is required to live as long as `'static` here...
| - ...is captured here...
|
note: ...and is captured here too
note: ...and is required to live as long as `'static` here
--> $DIR/type-checking-test-4.rs:29:5
|
LL | y.get_b() // ERROR
| ^
| ^^^^^^^^^
error[E0759]: `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
--> $DIR/type-checking-test-4.rs:33:5
@ -53,7 +53,7 @@ error[E0759]: `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime
LL | fn test_wrong4<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> {
| ------------ this data with lifetime `'a`...
LL | <_ as Bar>::get_b(x) // ERROR
| ^^^^^^^^^^^^^^^^^ ...is captured here, requiring it to live as long as `'static`
| ^^^^^^^^^^^^^^^^^ ...is captured and required to live as long as `'static` here
error[E0759]: `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
--> $DIR/type-checking-test-4.rs:38:15
@ -61,7 +61,7 @@ error[E0759]: `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime
LL | fn test_wrong5<'a>(x: &dyn Foo<'a>) -> Option<&'static u32> {
| ------------ this data with lifetime `'a`...
LL | <_ as Bar<'_, '_>>::get_b(x) // ERROR
| ----------^^---------------- ...is captured and required to live as long as `'static` here
| ----------^^------------- ...is captured and required to live as long as `'static` here
error[E0759]: `x` has lifetime `'a` but it needs to satisfy a `'static` lifetime requirement
--> $DIR/type-checking-test-4.rs:43:27
@ -74,16 +74,16 @@ LL | let y = x as &dyn Bar<'_, '_>;
| ...is captured here...
LL |
LL | y.get_b(); // ERROR
| - ...and is captured here too
| - ...is captured here...
LL | let z = y;
LL | z.get_b() // ERROR
| --------- ...is required to live as long as `'static` here...
| - ...is captured here...
|
note: ...and is captured here too
note: ...and is required to live as long as `'static` here
--> $DIR/type-checking-test-4.rs:47:5
|
LL | z.get_b() // ERROR
| ^
| ^^^^^^^^^
error: aborting due to 6 previous errors

View File

@ -5,7 +5,9 @@ LL | fn a<T>(items: &[T]) -> Box<dyn Iterator<Item=&T>> {
| ---- this data with an anonymous lifetime `'_`...
LL | // ^^^^^^^^^^^^^^^^^^^^^ bound *here* defaults to `'static`
LL | Box::new(items.iter())
| ---------------^^^^--- ...is captured and required to live as long as `'static` here
| ----- ^^^^
| |
| ...is captured and required to live as long as `'static` here
|
help: to declare that the trait object captures data from argument `items`, you can add an explicit `'_` lifetime bound
|