Stall coroutines based off of ty::Coroutine, not ty::CoroutineWitness

This commit is contained in:
Michael Goulet 2025-07-18 18:17:15 +00:00
parent 3fb1b53a9d
commit d525e79157
15 changed files with 218 additions and 210 deletions

View file

@ -229,7 +229,7 @@ where
}
// We need to make sure to stall any coroutines we are inferring to avoid query cycles.
if let Some(cand) = ecx.try_stall_coroutine_witness(goal.predicate.self_ty()) {
if let Some(cand) = ecx.try_stall_coroutine(goal.predicate.self_ty()) {
return cand;
}
@ -294,7 +294,7 @@ where
}
// We need to make sure to stall any coroutines we are inferring to avoid query cycles.
if let Some(cand) = ecx.try_stall_coroutine_witness(goal.predicate.self_ty()) {
if let Some(cand) = ecx.try_stall_coroutine(goal.predicate.self_ty()) {
return cand;
}
@ -1432,11 +1432,8 @@ where
self.merge_trait_candidates(candidates)
}
fn try_stall_coroutine_witness(
&mut self,
self_ty: I::Ty,
) -> Option<Result<Candidate<I>, NoSolution>> {
if let ty::CoroutineWitness(def_id, _) = self_ty.kind() {
fn try_stall_coroutine(&mut self, self_ty: I::Ty) -> Option<Result<Candidate<I>, NoSolution>> {
if let ty::Coroutine(def_id, _) = self_ty.kind() {
match self.typing_mode() {
TypingMode::Analysis {
defining_opaque_types_and_generators: stalled_generators,

View file

@ -355,7 +355,7 @@ impl<'tcx> TypeVisitor<TyCtxt<'tcx>> for StalledOnCoroutines<'tcx> {
return ControlFlow::Continue(());
}
if let ty::CoroutineWitness(def_id, _) = *ty.kind()
if let ty::Coroutine(def_id, _) = *ty.kind()
&& def_id.as_local().is_some_and(|def_id| self.stalled_coroutines.contains(&def_id))
{
ControlFlow::Break(())

View file

@ -794,18 +794,25 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
// The auto impl might apply; we don't know.
candidates.ambiguous = true;
}
ty::Coroutine(coroutine_def_id, _)
if self.tcx().is_lang_item(def_id, LangItem::Unpin) =>
{
match self.tcx().coroutine_movability(coroutine_def_id) {
hir::Movability::Static => {
// Immovable coroutines are never `Unpin`, so
// suppress the normal auto-impl candidate for it.
ty::Coroutine(coroutine_def_id, _) => {
if self.tcx().is_lang_item(def_id, LangItem::Unpin) {
match self.tcx().coroutine_movability(coroutine_def_id) {
hir::Movability::Static => {
// Immovable coroutines are never `Unpin`, so
// suppress the normal auto-impl candidate for it.
}
hir::Movability::Movable => {
// Movable coroutines are always `Unpin`, so add an
// unconditional builtin candidate with no sub-obligations.
candidates.vec.push(BuiltinCandidate);
}
}
hir::Movability::Movable => {
// Movable coroutines are always `Unpin`, so add an
// unconditional builtin candidate.
candidates.vec.push(BuiltinCandidate);
} else {
if self.should_stall_coroutine(coroutine_def_id) {
candidates.ambiguous = true;
} else {
// Coroutines implement all other auto traits normally.
candidates.vec.push(AutoImplCandidate);
}
}
}
@ -842,12 +849,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
}
}
ty::CoroutineWitness(def_id, _) => {
if self.should_stall_coroutine_witness(def_id) {
candidates.ambiguous = true;
} else {
candidates.vec.push(AutoImplCandidate);
}
ty::CoroutineWitness(..) => {
candidates.vec.push(AutoImplCandidate);
}
ty::Bool
@ -866,7 +869,6 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
| ty::FnPtr(..)
| ty::Closure(..)
| ty::CoroutineClosure(..)
| ty::Coroutine(..)
| ty::Never
| ty::Tuple(_)
| ty::UnsafeBinder(_) => {
@ -1153,6 +1155,11 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
ty::Ref(_, _, hir::Mutability::Mut) => {}
ty::Coroutine(coroutine_def_id, args) => {
if self.should_stall_coroutine(coroutine_def_id) {
candidates.ambiguous = true;
return;
}
match self.tcx().coroutine_movability(coroutine_def_id) {
hir::Movability::Static => {}
hir::Movability::Movable => {
@ -1194,12 +1201,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
}
}
ty::CoroutineWitness(coroutine_def_id, _) => {
if self.should_stall_coroutine_witness(coroutine_def_id) {
candidates.ambiguous = true;
} else {
candidates.vec.push(SizedCandidate);
}
ty::CoroutineWitness(..) => {
candidates.vec.push(SizedCandidate);
}
// Fallback to whatever user-defined impls or param-env clauses exist in this case.
@ -1238,7 +1241,6 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
| ty::RawPtr(..)
| ty::Char
| ty::Ref(..)
| ty::Coroutine(..)
| ty::Array(..)
| ty::Closure(..)
| ty::CoroutineClosure(..)
@ -1247,14 +1249,18 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
candidates.vec.push(SizedCandidate);
}
ty::CoroutineWitness(coroutine_def_id, _) => {
if self.should_stall_coroutine_witness(coroutine_def_id) {
ty::Coroutine(coroutine_def_id, _) => {
if self.should_stall_coroutine(coroutine_def_id) {
candidates.ambiguous = true;
} else {
candidates.vec.push(SizedCandidate);
}
}
ty::CoroutineWitness(..) => {
candidates.vec.push(SizedCandidate);
}
// Conditionally `Sized`.
ty::Tuple(..) | ty::Pat(..) | ty::Adt(..) | ty::UnsafeBinder(_) => {
candidates.vec.push(SizedCandidate);

View file

@ -2841,7 +2841,7 @@ impl<'tcx> SelectionContext<'_, 'tcx> {
obligations
}
fn should_stall_coroutine_witness(&self, def_id: DefId) -> bool {
fn should_stall_coroutine(&self, def_id: DefId) -> bool {
match self.infcx.typing_mode() {
TypingMode::Analysis { defining_opaque_types_and_generators: stalled_generators } => {
def_id.as_local().is_some_and(|def_id| stalled_generators.contains(&def_id))

View file

@ -131,10 +131,7 @@ bitflags::bitflags! {
/// Does this have any binders with bound vars (e.g. that need to be anonymized)?
const HAS_BINDER_VARS = 1 << 23;
/// Does this type have any coroutine witnesses in it?
// FIXME: This should probably be changed to track whether the type has any
// *coroutines* in it, though this will happen if we remove coroutine witnesses
// altogether.
/// Does this type have any coroutines in it?
const HAS_TY_CORO = 1 << 24;
}
}
@ -246,11 +243,13 @@ impl<I: Interner> FlagComputation<I> {
self.add_flags(TypeFlags::HAS_TY_PARAM);
}
ty::Closure(_, args) | ty::Coroutine(_, args) | ty::CoroutineClosure(_, args) => {
ty::Closure(_, args)
| ty::CoroutineClosure(_, args)
| ty::CoroutineWitness(_, args) => {
self.add_args(args.as_slice());
}
ty::CoroutineWitness(_, args) => {
ty::Coroutine(_, args) => {
self.add_flags(TypeFlags::HAS_TY_CORO);
self.add_args(args.as_slice());
}

View file

@ -4,6 +4,7 @@ use std::future::Future;
fn foo<T: Send, U>(ty: T, ty1: U) -> impl Future<Output = (T, U)> + Send {
//~^ ERROR future cannot be sent between threads safely
async { (ty, ty1) }
//~^ ERROR future cannot be sent between threads safely
}
fn main() {}

View file

@ -1,3 +1,24 @@
error: future cannot be sent between threads safely
--> $DIR/issue-70818.rs:6:5
|
LL | async { (ty, ty1) }
| ^^^^^^^^^^^^^^^^^^^ future created by async block is not `Send`
|
note: captured value is not `Send`
--> $DIR/issue-70818.rs:6:18
|
LL | async { (ty, ty1) }
| ^^^ has type `U` which is not `Send`
note: required by a bound in an opaque type
--> $DIR/issue-70818.rs:4:69
|
LL | fn foo<T: Send, U>(ty: T, ty1: U) -> impl Future<Output = (T, U)> + Send {
| ^^^^
help: consider restricting type parameter `U` with trait `Send`
|
LL | fn foo<T: Send, U: std::marker::Send>(ty: T, ty1: U) -> impl Future<Output = (T, U)> + Send {
| +++++++++++++++++++
error: future cannot be sent between threads safely
--> $DIR/issue-70818.rs:4:38
|
@ -14,5 +35,5 @@ help: consider restricting type parameter `U` with trait `Send`
LL | fn foo<T: Send, U: std::marker::Send>(ty: T, ty1: U) -> impl Future<Output = (T, U)> + Send {
| +++++++++++++++++++
error: aborting due to 1 previous error
error: aborting due to 2 previous errors

View file

@ -13,7 +13,7 @@ note: captured value is not `Send` because `&` references cannot be sent unless
|
LL | let x = x;
| ^ has type `&T` which is not `Send`, because `T` is not `Sync`
= note: required for the cast from `Pin<Box<{async block@$DIR/issue-86507.rs:18:17: 18:27}>>` to `Pin<Box<(dyn Future<Output = ()> + Send + 'async_trait)>>`
= note: required for the cast from `Pin<Box<{async block@$DIR/issue-86507.rs:18:17: 18:27}>>` to `Pin<Box<dyn Future<Output = ()> + Send>>`
help: consider further restricting type parameter `T` with trait `Sync`
|
LL | fn bar<'me, 'async_trait, T: Send + std::marker::Sync>(x: &'me T)

View file

@ -9,7 +9,7 @@ use std::future::ready;
struct NonClone;
fn main() {
fn local() {
let inner_non_clone = async {
let non_clone = NonClone;
let () = ready(()).await;
@ -34,7 +34,9 @@ fn main() {
//~^ ERROR : Copy` is not satisfied
check_clone(&maybe_copy_clone);
//~^ ERROR : Clone` is not satisfied
}
fn non_local() {
let inner_non_clone_fn = the_inner_non_clone_fn();
check_copy(&inner_non_clone_fn);
//~^ ERROR : Copy` is not satisfied
@ -69,3 +71,5 @@ async fn the_maybe_copy_clone_fn() {}
fn check_copy<T: Copy>(_x: &T) {}
fn check_clone<T: Clone>(_x: &T) {}
fn main() {}

View file

@ -1,89 +1,5 @@
error[E0277]: the trait bound `{async block@$DIR/clone-impl-async.rs:13:27: 13:32}: Copy` is not satisfied
--> $DIR/clone-impl-async.rs:18:16
|
LL | check_copy(&inner_non_clone);
| ---------- ^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `{async block@$DIR/clone-impl-async.rs:13:27: 13:32}`
| |
| required by a bound introduced by this call
|
note: required by a bound in `check_copy`
--> $DIR/clone-impl-async.rs:70:18
|
LL | fn check_copy<T: Copy>(_x: &T) {}
| ^^^^ required by this bound in `check_copy`
error[E0277]: the trait bound `{async block@$DIR/clone-impl-async.rs:13:27: 13:32}: Clone` is not satisfied
--> $DIR/clone-impl-async.rs:20:17
|
LL | check_clone(&inner_non_clone);
| ----------- ^^^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `{async block@$DIR/clone-impl-async.rs:13:27: 13:32}`
| |
| required by a bound introduced by this call
|
note: required by a bound in `check_clone`
--> $DIR/clone-impl-async.rs:71:19
|
LL | fn check_clone<T: Clone>(_x: &T) {}
| ^^^^^ required by this bound in `check_clone`
error[E0277]: the trait bound `{async block@$DIR/clone-impl-async.rs:24:27: 24:37}: Copy` is not satisfied
--> $DIR/clone-impl-async.rs:27:16
|
LL | check_copy(&outer_non_clone);
| ---------- ^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `{async block@$DIR/clone-impl-async.rs:24:27: 24:37}`
| |
| required by a bound introduced by this call
|
note: required by a bound in `check_copy`
--> $DIR/clone-impl-async.rs:70:18
|
LL | fn check_copy<T: Copy>(_x: &T) {}
| ^^^^ required by this bound in `check_copy`
error[E0277]: the trait bound `{async block@$DIR/clone-impl-async.rs:24:27: 24:37}: Clone` is not satisfied
--> $DIR/clone-impl-async.rs:29:17
|
LL | check_clone(&outer_non_clone);
| ----------- ^^^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `{async block@$DIR/clone-impl-async.rs:24:27: 24:37}`
| |
| required by a bound introduced by this call
|
note: required by a bound in `check_clone`
--> $DIR/clone-impl-async.rs:71:19
|
LL | fn check_clone<T: Clone>(_x: &T) {}
| ^^^^^ required by this bound in `check_clone`
error[E0277]: the trait bound `{async block@$DIR/clone-impl-async.rs:32:28: 32:38}: Copy` is not satisfied
--> $DIR/clone-impl-async.rs:33:16
|
LL | check_copy(&maybe_copy_clone);
| ---------- ^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `{async block@$DIR/clone-impl-async.rs:32:28: 32:38}`
| |
| required by a bound introduced by this call
|
note: required by a bound in `check_copy`
--> $DIR/clone-impl-async.rs:70:18
|
LL | fn check_copy<T: Copy>(_x: &T) {}
| ^^^^ required by this bound in `check_copy`
error[E0277]: the trait bound `{async block@$DIR/clone-impl-async.rs:32:28: 32:38}: Clone` is not satisfied
--> $DIR/clone-impl-async.rs:35:17
|
LL | check_clone(&maybe_copy_clone);
| ----------- ^^^^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `{async block@$DIR/clone-impl-async.rs:32:28: 32:38}`
| |
| required by a bound introduced by this call
|
note: required by a bound in `check_clone`
--> $DIR/clone-impl-async.rs:71:19
|
LL | fn check_clone<T: Clone>(_x: &T) {}
| ^^^^^ required by this bound in `check_clone`
error[E0277]: the trait bound `impl Future<Output = ()>: Copy` is not satisfied
--> $DIR/clone-impl-async.rs:39:16
--> $DIR/clone-impl-async.rs:41:16
|
LL | check_copy(&inner_non_clone_fn);
| ---------- ^^^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `impl Future<Output = ()>`
@ -91,13 +7,13 @@ LL | check_copy(&inner_non_clone_fn);
| required by a bound introduced by this call
|
note: required by a bound in `check_copy`
--> $DIR/clone-impl-async.rs:70:18
--> $DIR/clone-impl-async.rs:72:18
|
LL | fn check_copy<T: Copy>(_x: &T) {}
| ^^^^ required by this bound in `check_copy`
error[E0277]: the trait bound `impl Future<Output = ()>: Clone` is not satisfied
--> $DIR/clone-impl-async.rs:41:17
--> $DIR/clone-impl-async.rs:43:17
|
LL | check_clone(&inner_non_clone_fn);
| ----------- ^^^^^^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `impl Future<Output = ()>`
@ -105,13 +21,13 @@ LL | check_clone(&inner_non_clone_fn);
| required by a bound introduced by this call
|
note: required by a bound in `check_clone`
--> $DIR/clone-impl-async.rs:71:19
--> $DIR/clone-impl-async.rs:73:19
|
LL | fn check_clone<T: Clone>(_x: &T) {}
| ^^^^^ required by this bound in `check_clone`
error[E0277]: the trait bound `impl Future<Output = ()>: Copy` is not satisfied
--> $DIR/clone-impl-async.rs:45:16
--> $DIR/clone-impl-async.rs:47:16
|
LL | check_copy(&outer_non_clone_fn);
| ---------- ^^^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `impl Future<Output = ()>`
@ -119,13 +35,13 @@ LL | check_copy(&outer_non_clone_fn);
| required by a bound introduced by this call
|
note: required by a bound in `check_copy`
--> $DIR/clone-impl-async.rs:70:18
--> $DIR/clone-impl-async.rs:72:18
|
LL | fn check_copy<T: Copy>(_x: &T) {}
| ^^^^ required by this bound in `check_copy`
error[E0277]: the trait bound `impl Future<Output = ()>: Clone` is not satisfied
--> $DIR/clone-impl-async.rs:47:17
--> $DIR/clone-impl-async.rs:49:17
|
LL | check_clone(&outer_non_clone_fn);
| ----------- ^^^^^^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `impl Future<Output = ()>`
@ -133,13 +49,13 @@ LL | check_clone(&outer_non_clone_fn);
| required by a bound introduced by this call
|
note: required by a bound in `check_clone`
--> $DIR/clone-impl-async.rs:71:19
--> $DIR/clone-impl-async.rs:73:19
|
LL | fn check_clone<T: Clone>(_x: &T) {}
| ^^^^^ required by this bound in `check_clone`
error[E0277]: the trait bound `impl Future<Output = ()>: Copy` is not satisfied
--> $DIR/clone-impl-async.rs:51:16
--> $DIR/clone-impl-async.rs:53:16
|
LL | check_copy(&maybe_copy_clone_fn);
| ---------- ^^^^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `impl Future<Output = ()>`
@ -147,13 +63,13 @@ LL | check_copy(&maybe_copy_clone_fn);
| required by a bound introduced by this call
|
note: required by a bound in `check_copy`
--> $DIR/clone-impl-async.rs:70:18
--> $DIR/clone-impl-async.rs:72:18
|
LL | fn check_copy<T: Copy>(_x: &T) {}
| ^^^^ required by this bound in `check_copy`
error[E0277]: the trait bound `impl Future<Output = ()>: Clone` is not satisfied
--> $DIR/clone-impl-async.rs:53:17
--> $DIR/clone-impl-async.rs:55:17
|
LL | check_clone(&maybe_copy_clone_fn);
| ----------- ^^^^^^^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `impl Future<Output = ()>`
@ -161,7 +77,79 @@ LL | check_clone(&maybe_copy_clone_fn);
| required by a bound introduced by this call
|
note: required by a bound in `check_clone`
--> $DIR/clone-impl-async.rs:71:19
--> $DIR/clone-impl-async.rs:73:19
|
LL | fn check_clone<T: Clone>(_x: &T) {}
| ^^^^^ required by this bound in `check_clone`
error[E0277]: the trait bound `{async block@$DIR/clone-impl-async.rs:13:27: 13:32}: Copy` is not satisfied
--> $DIR/clone-impl-async.rs:18:5
|
LL | check_copy(&inner_non_clone);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `{async block@$DIR/clone-impl-async.rs:13:27: 13:32}`
|
note: required by a bound in `check_copy`
--> $DIR/clone-impl-async.rs:72:18
|
LL | fn check_copy<T: Copy>(_x: &T) {}
| ^^^^ required by this bound in `check_copy`
error[E0277]: the trait bound `{async block@$DIR/clone-impl-async.rs:13:27: 13:32}: Clone` is not satisfied
--> $DIR/clone-impl-async.rs:20:5
|
LL | check_clone(&inner_non_clone);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `{async block@$DIR/clone-impl-async.rs:13:27: 13:32}`
|
note: required by a bound in `check_clone`
--> $DIR/clone-impl-async.rs:73:19
|
LL | fn check_clone<T: Clone>(_x: &T) {}
| ^^^^^ required by this bound in `check_clone`
error[E0277]: the trait bound `{async block@$DIR/clone-impl-async.rs:24:27: 24:37}: Copy` is not satisfied
--> $DIR/clone-impl-async.rs:27:5
|
LL | check_copy(&outer_non_clone);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `{async block@$DIR/clone-impl-async.rs:24:27: 24:37}`
|
note: required by a bound in `check_copy`
--> $DIR/clone-impl-async.rs:72:18
|
LL | fn check_copy<T: Copy>(_x: &T) {}
| ^^^^ required by this bound in `check_copy`
error[E0277]: the trait bound `{async block@$DIR/clone-impl-async.rs:24:27: 24:37}: Clone` is not satisfied
--> $DIR/clone-impl-async.rs:29:5
|
LL | check_clone(&outer_non_clone);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `{async block@$DIR/clone-impl-async.rs:24:27: 24:37}`
|
note: required by a bound in `check_clone`
--> $DIR/clone-impl-async.rs:73:19
|
LL | fn check_clone<T: Clone>(_x: &T) {}
| ^^^^^ required by this bound in `check_clone`
error[E0277]: the trait bound `{async block@$DIR/clone-impl-async.rs:32:28: 32:38}: Copy` is not satisfied
--> $DIR/clone-impl-async.rs:33:5
|
LL | check_copy(&maybe_copy_clone);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `{async block@$DIR/clone-impl-async.rs:32:28: 32:38}`
|
note: required by a bound in `check_copy`
--> $DIR/clone-impl-async.rs:72:18
|
LL | fn check_copy<T: Copy>(_x: &T) {}
| ^^^^ required by this bound in `check_copy`
error[E0277]: the trait bound `{async block@$DIR/clone-impl-async.rs:32:28: 32:38}: Clone` is not satisfied
--> $DIR/clone-impl-async.rs:35:5
|
LL | check_clone(&maybe_copy_clone);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `{async block@$DIR/clone-impl-async.rs:32:28: 32:38}`
|
note: required by a bound in `check_clone`
--> $DIR/clone-impl-async.rs:73:19
|
LL | fn check_clone<T: Clone>(_x: &T) {}
| ^^^^^ required by this bound in `check_clone`

View file

@ -1,10 +1,8 @@
error[E0277]: the trait bound `{static coroutine@$DIR/clone-impl-static.rs:11:5: 11:19}: Copy` is not satisfied
--> $DIR/clone-impl-static.rs:14:16
--> $DIR/clone-impl-static.rs:14:5
|
LL | check_copy(&generator);
| ---------- ^^^^^^^^^^ the trait `Copy` is not implemented for `{static coroutine@$DIR/clone-impl-static.rs:11:5: 11:19}`
| |
| required by a bound introduced by this call
| ^^^^^^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `{static coroutine@$DIR/clone-impl-static.rs:11:5: 11:19}`
|
note: required by a bound in `check_copy`
--> $DIR/clone-impl-static.rs:20:18
@ -13,12 +11,10 @@ LL | fn check_copy<T: Copy>(_x: &T) {}
| ^^^^ required by this bound in `check_copy`
error[E0277]: the trait bound `{static coroutine@$DIR/clone-impl-static.rs:11:5: 11:19}: Clone` is not satisfied
--> $DIR/clone-impl-static.rs:16:17
--> $DIR/clone-impl-static.rs:16:5
|
LL | check_clone(&generator);
| ----------- ^^^^^^^^^^ the trait `Clone` is not implemented for `{static coroutine@$DIR/clone-impl-static.rs:11:5: 11:19}`
| |
| required by a bound introduced by this call
| ^^^^^^^^^^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `{static coroutine@$DIR/clone-impl-static.rs:11:5: 11:19}`
|
note: required by a bound in `check_clone`
--> $DIR/clone-impl-static.rs:21:19

View file

@ -42,6 +42,7 @@ fn test3_upvars() {
let clonable_0: Vec<u32> = Vec::new();
let gen_clone_0 = #[coroutine]
move || {
yield;
drop(clonable_0);
};
check_copy(&gen_clone_0);

View file

@ -1,59 +1,81 @@
error[E0277]: the trait bound `Vec<u32>: Copy` is not satisfied in `{coroutine@$DIR/clone-impl.rs:44:5: 44:12}`
--> $DIR/clone-impl.rs:47:16
--> $DIR/clone-impl.rs:48:5
|
LL | move || {
| ------- within this `{coroutine@$DIR/clone-impl.rs:44:5: 44:12}`
...
LL | check_copy(&gen_clone_0);
| ^^^^^^^^^^^^ within `{coroutine@$DIR/clone-impl.rs:44:5: 44:12}`, the trait `Copy` is not implemented for `Vec<u32>`
| ^^^^^^^^^^^^^^^^^^^^^^^^ within `{coroutine@$DIR/clone-impl.rs:44:5: 44:12}`, the trait `Copy` is not implemented for `Vec<u32>`
|
note: captured value does not implement `Copy`
--> $DIR/clone-impl.rs:45:14
--> $DIR/clone-impl.rs:46:14
|
LL | drop(clonable_0);
| ^^^^^^^^^^ has type `Vec<u32>` which does not implement `Copy`
note: required by a bound in `check_copy`
--> $DIR/clone-impl.rs:91:18
--> $DIR/clone-impl.rs:92:18
|
LL | fn check_copy<T: Copy>(_x: &T) {}
| ^^^^ required by this bound in `check_copy`
error[E0277]: the trait bound `Vec<u32>: Copy` is not satisfied in `{coroutine@$DIR/clone-impl.rs:67:5: 67:12}`
--> $DIR/clone-impl.rs:73:16
error[E0277]: the trait bound `Vec<char>: Copy` is not satisfied in `{coroutine@$DIR/clone-impl.rs:55:5: 55:12}`
--> $DIR/clone-impl.rs:60:5
|
LL | move || {
| ------- within this `{coroutine@$DIR/clone-impl.rs:67:5: 67:12}`
| ------- within this `{coroutine@$DIR/clone-impl.rs:55:5: 55:12}`
...
LL | check_copy(&gen_clone_1);
| ^^^^^^^^^^^^ within `{coroutine@$DIR/clone-impl.rs:67:5: 67:12}`, the trait `Copy` is not implemented for `Vec<u32>`
| ^^^^^^^^^^^^^^^^^^^^^^^^ within `{coroutine@$DIR/clone-impl.rs:55:5: 55:12}`, the trait `Copy` is not implemented for `Vec<char>`
|
note: coroutine does not implement `Copy` as this value is used across a yield
--> $DIR/clone-impl.rs:57:9
|
LL | let v = vec!['a'];
| - has type `Vec<char>` which does not implement `Copy`
LL | yield;
| ^^^^^ yield occurs here, with `v` maybe used later
note: required by a bound in `check_copy`
--> $DIR/clone-impl.rs:92:18
|
LL | fn check_copy<T: Copy>(_x: &T) {}
| ^^^^ required by this bound in `check_copy`
error[E0277]: the trait bound `Vec<u32>: Copy` is not satisfied in `{coroutine@$DIR/clone-impl.rs:68:5: 68:12}`
--> $DIR/clone-impl.rs:74:5
|
LL | move || {
| ------- within this `{coroutine@$DIR/clone-impl.rs:68:5: 68:12}`
...
LL | check_copy(&gen_clone_1);
| ^^^^^^^^^^^^^^^^^^^^^^^^ within `{coroutine@$DIR/clone-impl.rs:68:5: 68:12}`, the trait `Copy` is not implemented for `Vec<u32>`
|
note: captured value does not implement `Copy`
--> $DIR/clone-impl.rs:71:14
--> $DIR/clone-impl.rs:72:14
|
LL | drop(clonable_1);
| ^^^^^^^^^^ has type `Vec<u32>` which does not implement `Copy`
note: required by a bound in `check_copy`
--> $DIR/clone-impl.rs:91:18
--> $DIR/clone-impl.rs:92:18
|
LL | fn check_copy<T: Copy>(_x: &T) {}
| ^^^^ required by this bound in `check_copy`
error[E0277]: the trait bound `NonClone: Copy` is not satisfied in `{coroutine@$DIR/clone-impl.rs:81:5: 81:12}`
--> $DIR/clone-impl.rs:85:16
error[E0277]: the trait bound `NonClone: Copy` is not satisfied in `{coroutine@$DIR/clone-impl.rs:82:5: 82:12}`
--> $DIR/clone-impl.rs:86:5
|
LL | move || {
| ------- within this `{coroutine@$DIR/clone-impl.rs:81:5: 81:12}`
| ------- within this `{coroutine@$DIR/clone-impl.rs:82:5: 82:12}`
...
LL | check_copy(&gen_non_clone);
| ^^^^^^^^^^^^^^ within `{coroutine@$DIR/clone-impl.rs:81:5: 81:12}`, the trait `Copy` is not implemented for `NonClone`
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ within `{coroutine@$DIR/clone-impl.rs:82:5: 82:12}`, the trait `Copy` is not implemented for `NonClone`
|
note: captured value does not implement `Copy`
--> $DIR/clone-impl.rs:83:14
--> $DIR/clone-impl.rs:84:14
|
LL | drop(non_clonable);
| ^^^^^^^^^^^^ has type `NonClone` which does not implement `Copy`
note: required by a bound in `check_copy`
--> $DIR/clone-impl.rs:91:18
--> $DIR/clone-impl.rs:92:18
|
LL | fn check_copy<T: Copy>(_x: &T) {}
| ^^^^ required by this bound in `check_copy`
@ -63,22 +85,22 @@ LL + #[derive(Copy)]
LL | struct NonClone;
|
error[E0277]: the trait bound `NonClone: Clone` is not satisfied in `{coroutine@$DIR/clone-impl.rs:81:5: 81:12}`
--> $DIR/clone-impl.rs:87:17
error[E0277]: the trait bound `NonClone: Clone` is not satisfied in `{coroutine@$DIR/clone-impl.rs:82:5: 82:12}`
--> $DIR/clone-impl.rs:88:5
|
LL | move || {
| ------- within this `{coroutine@$DIR/clone-impl.rs:81:5: 81:12}`
| ------- within this `{coroutine@$DIR/clone-impl.rs:82:5: 82:12}`
...
LL | check_clone(&gen_non_clone);
| ^^^^^^^^^^^^^^ within `{coroutine@$DIR/clone-impl.rs:81:5: 81:12}`, the trait `Clone` is not implemented for `NonClone`
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ within `{coroutine@$DIR/clone-impl.rs:82:5: 82:12}`, the trait `Clone` is not implemented for `NonClone`
|
note: captured value does not implement `Clone`
--> $DIR/clone-impl.rs:83:14
--> $DIR/clone-impl.rs:84:14
|
LL | drop(non_clonable);
| ^^^^^^^^^^^^ has type `NonClone` which does not implement `Clone`
note: required by a bound in `check_clone`
--> $DIR/clone-impl.rs:92:19
--> $DIR/clone-impl.rs:93:19
|
LL | fn check_clone<T: Clone>(_x: &T) {}
| ^^^^^ required by this bound in `check_clone`
@ -88,28 +110,6 @@ LL + #[derive(Clone)]
LL | struct NonClone;
|
error[E0277]: the trait bound `Vec<char>: Copy` is not satisfied in `{coroutine@$DIR/clone-impl.rs:54:5: 54:12}`
--> $DIR/clone-impl.rs:59:5
|
LL | move || {
| ------- within this `{coroutine@$DIR/clone-impl.rs:54:5: 54:12}`
...
LL | check_copy(&gen_clone_1);
| ^^^^^^^^^^^^^^^^^^^^^^^^ within `{coroutine@$DIR/clone-impl.rs:54:5: 54:12}`, the trait `Copy` is not implemented for `Vec<char>`
|
note: coroutine does not implement `Copy` as this value is used across a yield
--> $DIR/clone-impl.rs:56:9
|
LL | let v = vec!['a'];
| - has type `Vec<char>` which does not implement `Copy`
LL | yield;
| ^^^^^ yield occurs here, with `v` maybe used later
note: required by a bound in `check_copy`
--> $DIR/clone-impl.rs:91:18
|
LL | fn check_copy<T: Copy>(_x: &T) {}
| ^^^^ required by this bound in `check_copy`
error: aborting due to 5 previous errors
For more information about this error, try `rustc --explain E0277`.

View file

@ -1,14 +1,13 @@
error: coroutine cannot be sent between threads safely
--> $DIR/ref-upvar-not-send.rs:15:30
--> $DIR/ref-upvar-not-send.rs:15:5
|
LL | assert_send(#[coroutine] move || {
| ______________________________^
LL | / assert_send(#[coroutine] move || {
LL | |
LL | |
LL | | yield;
LL | | let _x = x;
LL | | });
| |_____^ coroutine is not `Send`
| |______^ coroutine is not `Send`
|
= help: the trait `Sync` is not implemented for `*mut ()`
note: captured value is not `Send` because `&` references cannot be sent unless their referent is `Sync`
@ -23,16 +22,15 @@ LL | fn assert_send<T: Send>(_: T) {}
| ^^^^ required by this bound in `assert_send`
error: coroutine cannot be sent between threads safely
--> $DIR/ref-upvar-not-send.rs:23:30
--> $DIR/ref-upvar-not-send.rs:23:5
|
LL | assert_send(#[coroutine] move || {
| ______________________________^
LL | / assert_send(#[coroutine] move || {
LL | |
LL | |
LL | | yield;
LL | | let _y = y;
LL | | });
| |_____^ coroutine is not `Send`
| |______^ coroutine is not `Send`
|
= help: within `{coroutine@$DIR/ref-upvar-not-send.rs:23:30: 23:37}`, the trait `Send` is not implemented for `*mut ()`
note: captured value is not `Send` because `&mut` references cannot be sent unless their referent is `Send`

View file

@ -1,12 +1,3 @@
error[E0277]: the trait bound `{async block@$DIR/issue-55872-3.rs:18:9: 18:14}: Copy` is not satisfied
--> $DIR/issue-55872-3.rs:14:20
|
LL | fn foo<T>() -> Self::E {
| ^^^^^^^ the trait `Copy` is not implemented for `{async block@$DIR/issue-55872-3.rs:18:9: 18:14}`
...
LL | async {}
| -------- return type was inferred to be `{async block@$DIR/issue-55872-3.rs:18:9: 18:14}` here
error: type parameter `T` is part of concrete type but not used in parameter list for the `impl Trait` type alias
--> $DIR/issue-55872-3.rs:14:20
|
@ -21,6 +12,12 @@ LL | fn foo<T>() -> Self::E {
|
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
error[E0277]: the trait bound `{async block@$DIR/issue-55872-3.rs:18:9: 18:14}: Copy` is not satisfied
--> $DIR/issue-55872-3.rs:14:20
|
LL | fn foo<T>() -> Self::E {
| ^^^^^^^ the trait `Copy` is not implemented for `{async block@$DIR/issue-55872-3.rs:18:9: 18:14}`
error: aborting due to 3 previous errors
For more information about this error, try `rustc --explain E0277`.