Remove redundant coroutine captures note
This commit is contained in:
parent
200e3f7995
commit
3d56178880
@ -3199,71 +3199,69 @@ fn note_obligation_cause_code<G: EmissionGuarantee, T>(
|
||||
}
|
||||
};
|
||||
|
||||
// Don't print the tuple of capture types
|
||||
'print: {
|
||||
if !is_upvar_tys_infer_tuple {
|
||||
let ty_str = tcx.short_ty_string(ty, &mut long_ty_file);
|
||||
let msg = format!("required because it appears within the type `{ty_str}`");
|
||||
match ty.kind() {
|
||||
ty::Adt(def, _) => match tcx.opt_item_ident(def.did()) {
|
||||
Some(ident) => err.span_note(ident.span, msg),
|
||||
None => err.note(msg),
|
||||
},
|
||||
ty::Alias(ty::Opaque, ty::AliasTy { def_id, .. }) => {
|
||||
// If the previous type is async fn, this is the future generated by the body of an async function.
|
||||
// Avoid printing it twice (it was already printed in the `ty::Coroutine` arm below).
|
||||
let is_future = tcx.ty_is_opaque_future(ty);
|
||||
debug!(
|
||||
?obligated_types,
|
||||
?is_future,
|
||||
"note_obligation_cause_code: check for async fn"
|
||||
);
|
||||
if is_future
|
||||
&& obligated_types.last().is_some_and(|ty| match ty.kind() {
|
||||
ty::Coroutine(last_def_id, ..) => {
|
||||
tcx.coroutine_is_async(*last_def_id)
|
||||
}
|
||||
_ => false,
|
||||
})
|
||||
{
|
||||
break 'print;
|
||||
}
|
||||
err.span_note(tcx.def_span(def_id), msg)
|
||||
if !is_upvar_tys_infer_tuple {
|
||||
let ty_str = tcx.short_ty_string(ty, &mut long_ty_file);
|
||||
let msg = format!("required because it appears within the type `{ty_str}`");
|
||||
match ty.kind() {
|
||||
ty::Adt(def, _) => match tcx.opt_item_ident(def.did()) {
|
||||
Some(ident) => {
|
||||
err.span_note(ident.span, msg);
|
||||
}
|
||||
ty::CoroutineWitness(def_id, args) => {
|
||||
use std::fmt::Write;
|
||||
None => {
|
||||
err.note(msg);
|
||||
}
|
||||
},
|
||||
ty::Alias(ty::Opaque, ty::AliasTy { def_id, .. }) => {
|
||||
// If the previous type is async fn, this is the future generated by the body of an async function.
|
||||
// Avoid printing it twice (it was already printed in the `ty::Coroutine` arm below).
|
||||
let is_future = tcx.ty_is_opaque_future(ty);
|
||||
debug!(
|
||||
?obligated_types,
|
||||
?is_future,
|
||||
"note_obligation_cause_code: check for async fn"
|
||||
);
|
||||
if is_future
|
||||
&& obligated_types.last().is_some_and(|ty| match ty.kind() {
|
||||
ty::Coroutine(last_def_id, ..) => {
|
||||
tcx.coroutine_is_async(*last_def_id)
|
||||
}
|
||||
_ => false,
|
||||
})
|
||||
{
|
||||
// See comment above; skip printing twice.
|
||||
} else {
|
||||
err.span_note(tcx.def_span(def_id), msg);
|
||||
}
|
||||
}
|
||||
ty::Coroutine(def_id, _) => {
|
||||
let sp = tcx.def_span(def_id);
|
||||
|
||||
// FIXME: this is kind of an unusual format for rustc, can we make it more clear?
|
||||
// Maybe we should just remove this note altogether?
|
||||
// FIXME: only print types which don't meet the trait requirement
|
||||
let mut msg =
|
||||
"required because it captures the following types: ".to_owned();
|
||||
for bty in tcx.coroutine_hidden_types(*def_id) {
|
||||
let ty = bty.instantiate(tcx, args);
|
||||
write!(msg, "`{ty}`, ").unwrap();
|
||||
}
|
||||
err.note(msg.trim_end_matches(", ").to_string())
|
||||
}
|
||||
ty::Coroutine(def_id, _) => {
|
||||
let sp = tcx.def_span(def_id);
|
||||
|
||||
// Special-case this to say "async block" instead of `[static coroutine]`.
|
||||
let kind = tcx.coroutine_kind(def_id).unwrap();
|
||||
err.span_note(
|
||||
sp,
|
||||
with_forced_trimmed_paths!(format!(
|
||||
"required because it's used within this {kind:#}",
|
||||
)),
|
||||
)
|
||||
}
|
||||
ty::Closure(def_id, _) => err.span_note(
|
||||
// Special-case this to say "async block" instead of `[static coroutine]`.
|
||||
let kind = tcx.coroutine_kind(def_id).unwrap();
|
||||
err.span_note(
|
||||
sp,
|
||||
with_forced_trimmed_paths!(format!(
|
||||
"required because it's used within this {kind:#}",
|
||||
)),
|
||||
);
|
||||
}
|
||||
ty::CoroutineWitness(..) => {
|
||||
// Skip printing coroutine-witnesses, since we'll drill into
|
||||
// the bad field in another derived obligation cause.
|
||||
}
|
||||
ty::Closure(def_id, _) | ty::CoroutineClosure(def_id, _) => {
|
||||
err.span_note(
|
||||
tcx.def_span(def_id),
|
||||
"required because it's used within this closure",
|
||||
),
|
||||
ty::Str => err.note("`str` is considered to contain a `[u8]` slice for auto trait purposes"),
|
||||
_ => err.note(msg),
|
||||
};
|
||||
}
|
||||
);
|
||||
}
|
||||
ty::Str => {
|
||||
err.note("`str` is considered to contain a `[u8]` slice for auto trait purposes");
|
||||
}
|
||||
_ => {
|
||||
err.note(msg);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
obligated_types.push(ty);
|
||||
|
@ -38,7 +38,6 @@ LL | async fn bar2<T>(_: T) -> ! {
|
||||
LL | | panic!()
|
||||
LL | | }
|
||||
| |_^
|
||||
= note: required because it captures the following types: `impl Future<Output = !>`
|
||||
note: required because it's used within this `async` fn body
|
||||
--> $DIR/async-await-let-else.rs:18:32
|
||||
|
|
||||
|
@ -58,7 +58,6 @@ note: required because it appears within the type `impl Future<Output = Arc<RefC
|
||||
|
|
||||
LL | fn make_non_send_future2() -> impl Future<Output = Arc<RefCell<i32>>> {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: required because it captures the following types: `impl Future<Output = Arc<RefCell<i32>>>`, `Ready<i32>`
|
||||
note: required because it's used within this `async` block
|
||||
--> $DIR/issue-68112.rs:57:20
|
||||
|
|
||||
|
@ -25,7 +25,6 @@ LL | async fn baz<T>(_c: impl FnMut() -> T) where T: Future<Output=()> {
|
||||
| ___________________________________________________________________^
|
||||
LL | | }
|
||||
| |_^
|
||||
= note: required because it captures the following types: `impl Future<Output = ()>`
|
||||
note: required because it's used within this `async` block
|
||||
--> $DIR/issue-70935-complex-spans.rs:18:5
|
||||
|
|
||||
@ -63,7 +62,6 @@ LL | async fn baz<T>(_c: impl FnMut() -> T) where T: Future<Output=()> {
|
||||
| ___________________________________________________________________^
|
||||
LL | | }
|
||||
| |_^
|
||||
= note: required because it captures the following types: `impl Future<Output = ()>`
|
||||
note: required because it's used within this `async` block
|
||||
--> $DIR/issue-70935-complex-spans.rs:18:5
|
||||
|
|
||||
|
@ -12,7 +12,6 @@ LL | pub async fn run() {
|
||||
| ------------------ within this `impl Future<Output = ()>`
|
||||
|
|
||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `MutexGuard<'_, ()>`, which is required by `impl Future<Output = ()>: Send`
|
||||
= note: required because it captures the following types: `Arc<Mutex<()>>`, `MutexGuard<'_, ()>`, `impl Future<Output = ()>`
|
||||
note: required because it's used within this `async` fn body
|
||||
--> $DIR/auxiliary/issue_67893.rs:9:20
|
||||
|
|
||||
|
@ -8,7 +8,6 @@ fn main() {
|
||||
//~| NOTE cannot be sent
|
||||
//~| NOTE bound introduced by
|
||||
//~| NOTE appears within the type
|
||||
//~| NOTE captures the following types
|
||||
}
|
||||
|
||||
fn gimme_send<T: Send>(t: T) {
|
||||
|
@ -11,9 +11,8 @@ LL | async fn foo() {
|
||||
|
|
||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `NotSend`, which is required by `impl Future<Output = ()>: Send`
|
||||
= note: required because it appears within the type `(NotSend,)`
|
||||
= note: required because it captures the following types: `(NotSend,)`, `impl Future<Output = ()>`
|
||||
note: required because it's used within this `async` fn body
|
||||
--> $DIR/partial-drop-partial-reinit.rs:28:16
|
||||
--> $DIR/partial-drop-partial-reinit.rs:27:16
|
||||
|
|
||||
LL | async fn foo() {
|
||||
| ________________^
|
||||
@ -25,7 +24,7 @@ LL | | bar().await;
|
||||
LL | | }
|
||||
| |_^
|
||||
note: required by a bound in `gimme_send`
|
||||
--> $DIR/partial-drop-partial-reinit.rs:14:18
|
||||
--> $DIR/partial-drop-partial-reinit.rs:13:18
|
||||
|
|
||||
LL | fn gimme_send<T: Send>(t: T) {
|
||||
| ^^^^ required by this bound in `gimme_send`
|
||||
|
@ -65,7 +65,6 @@ fn test2() {
|
||||
//~^ ERROR `RefCell<i32>` cannot be shared between threads safely
|
||||
//~| NOTE `RefCell<i32>` cannot be shared between threads safely
|
||||
//~| NOTE required for
|
||||
//~| NOTE captures the following types
|
||||
//~| NOTE use `std::sync::RwLock` instead
|
||||
}
|
||||
|
||||
|
@ -44,7 +44,6 @@ note: required because it appears within the type `impl Coroutine<Return = Arc<R
|
||||
|
|
||||
LL | fn make_non_send_coroutine2() -> impl Coroutine<Return = Arc<RefCell<i32>>> {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: required because it captures the following types: `impl Coroutine<Return = Arc<RefCell<i32>>>`
|
||||
note: required because it's used within this coroutine
|
||||
--> $DIR/issue-68112.rs:60:20
|
||||
|
|
||||
|
@ -43,7 +43,6 @@ note: required because it appears within the type `Opaque(DefId(0:36 ~ coroutine
|
||||
|
|
||||
LL | fn make_non_send_coroutine2() -> impl Coroutine<Return = Arc<RefCell<i32>>> {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= note: required because it captures the following types: `Opaque(DefId(0:36 ~ coroutine_print_verbose_1[75fb]::make_non_send_coroutine2::{opaque#0}), [])`
|
||||
note: required because it's used within this coroutine
|
||||
--> $DIR/coroutine-print-verbose-1.rs:52:20
|
||||
|
|
||||
|
Loading…
Reference in New Issue
Block a user