Stall coroutines based off of ty::Coroutine, not ty::CoroutineWitness
This commit is contained in:
parent
3fb1b53a9d
commit
d525e79157
15 changed files with 218 additions and 210 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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(())
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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() {}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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() {}
|
||||
|
|
|
|||
|
|
@ -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`
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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`.
|
||||
|
|
|
|||
|
|
@ -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`
|
||||
|
|
|
|||
|
|
@ -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`.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue