mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 00:34:06 +00:00
Rollup merge of #104931 - Swatinem:async-pretty, r=eholk
Pretty-print generators with their `generator_kind` After removing `GenFuture`, I special-cased async generators to pretty-print as `impl Future<Output = X>` mainly to avoid too much diagnostics changes originally. This now reverses that change so that async fn/blocks are pretty-printed as `[$async-type@$source-position]` in various diagnostics, and updates the tests that this touches.
This commit is contained in:
commit
6e6c42c61c
@ -376,7 +376,7 @@ impl<'tcx> NonConstOp<'tcx> for Generator {
|
|||||||
ccx: &ConstCx<'_, 'tcx>,
|
ccx: &ConstCx<'_, 'tcx>,
|
||||||
span: Span,
|
span: Span,
|
||||||
) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> {
|
) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> {
|
||||||
let msg = format!("{}s are not allowed in {}s", self.0, ccx.const_kind());
|
let msg = format!("{}s are not allowed in {}s", self.0.descr(), ccx.const_kind());
|
||||||
if let hir::GeneratorKind::Async(hir::AsyncGeneratorKind::Block) = self.0 {
|
if let hir::GeneratorKind::Async(hir::AsyncGeneratorKind::Block) = self.0 {
|
||||||
ccx.tcx.sess.create_feature_err(
|
ccx.tcx.sess.create_feature_err(
|
||||||
UnallowedOpInConstContext { span, msg },
|
UnallowedOpInConstContext { span, msg },
|
||||||
|
@ -1514,9 +1514,9 @@ pub enum AsyncGeneratorKind {
|
|||||||
impl fmt::Display for AsyncGeneratorKind {
|
impl fmt::Display for AsyncGeneratorKind {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
f.write_str(match self {
|
f.write_str(match self {
|
||||||
AsyncGeneratorKind::Block => "`async` block",
|
AsyncGeneratorKind::Block => "async block",
|
||||||
AsyncGeneratorKind::Closure => "`async` closure body",
|
AsyncGeneratorKind::Closure => "async closure body",
|
||||||
AsyncGeneratorKind::Fn => "`async fn` body",
|
AsyncGeneratorKind::Fn => "async fn body",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -118,7 +118,8 @@ impl<'a, 'tcx> InteriorVisitor<'a, 'tcx> {
|
|||||||
} else {
|
} else {
|
||||||
let note = format!(
|
let note = format!(
|
||||||
"the type is part of the {} because of this {}",
|
"the type is part of the {} because of this {}",
|
||||||
self.kind, yield_data.source
|
self.kind.descr(),
|
||||||
|
yield_data.source
|
||||||
);
|
);
|
||||||
|
|
||||||
self.fcx
|
self.fcx
|
||||||
|
@ -681,25 +681,20 @@ pub trait PrettyPrinter<'tcx>:
|
|||||||
}
|
}
|
||||||
ty::Str => p!("str"),
|
ty::Str => p!("str"),
|
||||||
ty::Generator(did, substs, movability) => {
|
ty::Generator(did, substs, movability) => {
|
||||||
// FIXME(swatinem): async constructs used to be pretty printed
|
|
||||||
// as `impl Future` previously due to the `from_generator` wrapping.
|
|
||||||
// lets special case this here for now to avoid churn in diagnostics.
|
|
||||||
let generator_kind = self.tcx().generator_kind(did);
|
|
||||||
if matches!(generator_kind, Some(hir::GeneratorKind::Async(..))) {
|
|
||||||
let return_ty = substs.as_generator().return_ty();
|
|
||||||
p!(write("impl Future<Output = {}>", return_ty));
|
|
||||||
|
|
||||||
return Ok(self);
|
|
||||||
}
|
|
||||||
|
|
||||||
p!(write("["));
|
p!(write("["));
|
||||||
match movability {
|
let generator_kind = self.tcx().generator_kind(did).unwrap();
|
||||||
hir::Movability::Movable => {}
|
let should_print_movability =
|
||||||
hir::Movability::Static => p!("static "),
|
self.should_print_verbose() || generator_kind == hir::GeneratorKind::Gen;
|
||||||
|
|
||||||
|
if should_print_movability {
|
||||||
|
match movability {
|
||||||
|
hir::Movability::Movable => {}
|
||||||
|
hir::Movability::Static => p!("static "),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !self.should_print_verbose() {
|
if !self.should_print_verbose() {
|
||||||
p!("generator");
|
p!(write("{}", generator_kind));
|
||||||
// FIXME(eddyb) should use `def_span`.
|
// FIXME(eddyb) should use `def_span`.
|
||||||
if let Some(did) = did.as_local() {
|
if let Some(did) = did.as_local() {
|
||||||
let span = self.tcx().def_span(did);
|
let span = self.tcx().def_span(did);
|
||||||
|
@ -2673,7 +2673,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
|||||||
let sp = self.tcx.def_span(def_id);
|
let sp = self.tcx.def_span(def_id);
|
||||||
|
|
||||||
// Special-case this to say "async block" instead of `[static generator]`.
|
// Special-case this to say "async block" instead of `[static generator]`.
|
||||||
let kind = tcx.generator_kind(def_id).unwrap();
|
let kind = tcx.generator_kind(def_id).unwrap().descr();
|
||||||
err.span_note(
|
err.span_note(
|
||||||
sp,
|
sp,
|
||||||
&format!("required because it's used within this {}", kind),
|
&format!("required because it's used within this {}", kind),
|
||||||
|
@ -15,7 +15,7 @@ fn return_targets_async_block_not_fn() -> u8 {
|
|||||||
return 0u8;
|
return 0u8;
|
||||||
};
|
};
|
||||||
let _: &dyn Future<Output = ()> = █
|
let _: &dyn Future<Output = ()> = █
|
||||||
//~^ ERROR expected `impl Future<Output = u8>` to be a future that resolves to `()`, but it resolves to `u8`
|
//~^ ERROR to be a future that resolves to `()`, but it resolves to `u8`
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn return_targets_async_block_not_async_fn() -> u8 {
|
async fn return_targets_async_block_not_async_fn() -> u8 {
|
||||||
@ -24,7 +24,7 @@ async fn return_targets_async_block_not_async_fn() -> u8 {
|
|||||||
return 0u8;
|
return 0u8;
|
||||||
};
|
};
|
||||||
let _: &dyn Future<Output = ()> = █
|
let _: &dyn Future<Output = ()> = █
|
||||||
//~^ ERROR expected `impl Future<Output = u8>` to be a future that resolves to `()`, but it resolves to `u8`
|
//~^ ERROR to be a future that resolves to `()`, but it resolves to `u8`
|
||||||
}
|
}
|
||||||
|
|
||||||
fn no_break_in_async_block() {
|
fn no_break_in_async_block() {
|
||||||
|
@ -29,13 +29,13 @@ LL | |
|
|||||||
LL | | }
|
LL | | }
|
||||||
| |_^ expected `u8`, found `()`
|
| |_^ expected `u8`, found `()`
|
||||||
|
|
||||||
error[E0271]: expected `impl Future<Output = u8>` to be a future that resolves to `()`, but it resolves to `u8`
|
error[E0271]: expected `[async block@$DIR/async-block-control-flow-static-semantics.rs:23:17: 25:6]` to be a future that resolves to `()`, but it resolves to `u8`
|
||||||
--> $DIR/async-block-control-flow-static-semantics.rs:26:39
|
--> $DIR/async-block-control-flow-static-semantics.rs:26:39
|
||||||
|
|
|
|
||||||
LL | let _: &dyn Future<Output = ()> = █
|
LL | let _: &dyn Future<Output = ()> = █
|
||||||
| ^^^^^^ expected `()`, found `u8`
|
| ^^^^^^ expected `()`, found `u8`
|
||||||
|
|
|
|
||||||
= note: required for the cast from `impl Future<Output = u8>` to the object type `dyn Future<Output = ()>`
|
= note: required for the cast from `[async block@$DIR/async-block-control-flow-static-semantics.rs:23:17: 25:6]` to the object type `dyn Future<Output = ()>`
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/async-block-control-flow-static-semantics.rs:12:43
|
--> $DIR/async-block-control-flow-static-semantics.rs:12:43
|
||||||
@ -45,13 +45,13 @@ LL | fn return_targets_async_block_not_fn() -> u8 {
|
|||||||
| |
|
| |
|
||||||
| implicitly returns `()` as its body has no tail or `return` expression
|
| implicitly returns `()` as its body has no tail or `return` expression
|
||||||
|
|
||||||
error[E0271]: expected `impl Future<Output = u8>` to be a future that resolves to `()`, but it resolves to `u8`
|
error[E0271]: expected `[async block@$DIR/async-block-control-flow-static-semantics.rs:14:17: 16:6]` to be a future that resolves to `()`, but it resolves to `u8`
|
||||||
--> $DIR/async-block-control-flow-static-semantics.rs:17:39
|
--> $DIR/async-block-control-flow-static-semantics.rs:17:39
|
||||||
|
|
|
|
||||||
LL | let _: &dyn Future<Output = ()> = █
|
LL | let _: &dyn Future<Output = ()> = █
|
||||||
| ^^^^^^ expected `()`, found `u8`
|
| ^^^^^^ expected `()`, found `u8`
|
||||||
|
|
|
|
||||||
= note: required for the cast from `impl Future<Output = u8>` to the object type `dyn Future<Output = ()>`
|
= note: required for the cast from `[async block@$DIR/async-block-control-flow-static-semantics.rs:14:17: 16:6]` to the object type `dyn Future<Output = ()>`
|
||||||
|
|
||||||
error[E0308]: mismatched types
|
error[E0308]: mismatched types
|
||||||
--> $DIR/async-block-control-flow-static-semantics.rs:49:44
|
--> $DIR/async-block-control-flow-static-semantics.rs:49:44
|
||||||
|
@ -8,8 +8,8 @@ LL | fun(async {}, async {});
|
|||||||
| | arguments to this function are incorrect
|
| | arguments to this function are incorrect
|
||||||
| the expected `async` block
|
| the expected `async` block
|
||||||
|
|
|
|
||||||
= note: expected `async` block `impl Future<Output = ()>` (`async` block)
|
= note: expected `async` block `[async block@$DIR/generator-desc.rs:10:9: 10:17]`
|
||||||
found `async` block `impl Future<Output = ()>` (`async` block)
|
found `async` block `[async block@$DIR/generator-desc.rs:10:19: 10:27]`
|
||||||
note: function defined here
|
note: function defined here
|
||||||
--> $SRC_DIR/core/src/future/mod.rs:LL:COL
|
--> $SRC_DIR/core/src/future/mod.rs:LL:COL
|
||||||
|
|
|
|
||||||
@ -53,8 +53,8 @@ LL | fun((async || {})(), (async || {})());
|
|||||||
| | the expected `async` closure body
|
| | the expected `async` closure body
|
||||||
| arguments to this function are incorrect
|
| arguments to this function are incorrect
|
||||||
|
|
|
|
||||||
= note: expected `async` closure body `impl Future<Output = ()>` (`async` closure body)
|
= note: expected `async` closure body `[async closure body@$DIR/generator-desc.rs:14:19: 14:21]`
|
||||||
found `async` closure body `impl Future<Output = ()>` (`async` closure body)
|
found `async` closure body `[async closure body@$DIR/generator-desc.rs:14:36: 14:38]`
|
||||||
note: function defined here
|
note: function defined here
|
||||||
--> $DIR/generator-desc.rs:8:4
|
--> $DIR/generator-desc.rs:8:4
|
||||||
|
|
|
|
||||||
|
@ -8,7 +8,7 @@ LL | | AFuture.await;
|
|||||||
LL | | });
|
LL | | });
|
||||||
| |_____^ future created by async block is not `Send`
|
| |_____^ future created by async block is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `*mut ()`
|
= help: within `[async block@$DIR/issue-67252-unnamed-future.rs:18:11: 21:6]`, the trait `Send` is not implemented for `*mut ()`
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/issue-67252-unnamed-future.rs:20:16
|
--> $DIR/issue-67252-unnamed-future.rs:20:16
|
||||||
|
|
|
|
||||||
|
@ -13,7 +13,7 @@ note: captured value is not `Send` because `&` references cannot be sent unless
|
|||||||
|
|
|
|
||||||
LL | let x = x;
|
LL | let x = x;
|
||||||
| ^ has type `&T` which is not `Send`, because `T` is not `Sync`
|
| ^ has type `&T` which is not `Send`, because `T` is not `Sync`
|
||||||
= note: required for the cast from `impl Future<Output = ()>` to the object type `dyn Future<Output = ()> + Send`
|
= note: required for the cast from `[async block@$DIR/issue-86507.rs:18:17: 20:18]` to the object type `dyn Future<Output = ()> + Send`
|
||||||
help: consider further restricting this bound
|
help: consider further restricting this bound
|
||||||
|
|
|
|
||||||
LL | fn bar<'me, 'async_trait, T: Send + std::marker::Sync>(x: &'me T)
|
LL | fn bar<'me, 'async_trait, T: Send + std::marker::Sync>(x: &'me T)
|
||||||
|
@ -8,7 +8,7 @@ LL | | bar(Foo(std::ptr::null())).await;
|
|||||||
LL | | })
|
LL | | })
|
||||||
| |_____^ future created by async block is not `Send`
|
| |_____^ future created by async block is not `Send`
|
||||||
|
|
|
|
||||||
= help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `*const u8`
|
= help: within `[async block@$DIR/issue-65436-raw-ptr-not-send.rs:16:17: 19:6]`, the trait `Send` is not implemented for `*const u8`
|
||||||
note: future is not `Send` as this value is used across an await
|
note: future is not `Send` as this value is used across an await
|
||||||
--> $DIR/issue-65436-raw-ptr-not-send.rs:18:35
|
--> $DIR/issue-65436-raw-ptr-not-send.rs:18:35
|
||||||
|
|
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
error[E0277]: `impl Future<Output = u32>` is not a future
|
error[E0277]: `[async fn body@$DIR/async.rs:7:29: 9:2]` is not a future
|
||||||
--> $DIR/async.rs:7:29
|
--> $DIR/async.rs:7:29
|
||||||
|
|
|
|
||||||
LL | async fn foo(x: u32) -> u32 {
|
LL | async fn foo(x: u32) -> u32 {
|
||||||
@ -7,18 +7,18 @@ LL | | x
|
|||||||
LL | | }
|
LL | | }
|
||||||
| | ^
|
| | ^
|
||||||
| | |
|
| | |
|
||||||
| |_`impl Future<Output = u32>` is not a future
|
| |_`[async fn body@$DIR/async.rs:7:29: 9:2]` is not a future
|
||||||
| required by a bound introduced by this call
|
| required by a bound introduced by this call
|
||||||
|
|
|
|
||||||
= help: the trait `Future` is not implemented for `impl Future<Output = u32>`
|
= help: the trait `Future` is not implemented for `[async fn body@$DIR/async.rs:7:29: 9:2]`
|
||||||
= note: impl Future<Output = u32> must be a future or must implement `IntoFuture` to be awaited
|
= note: [async fn body@$DIR/async.rs:7:29: 9:2] must be a future or must implement `IntoFuture` to be awaited
|
||||||
note: required by a bound in `identity_future`
|
note: required by a bound in `identity_future`
|
||||||
--> $SRC_DIR/core/src/future/mod.rs:LL:COL
|
--> $SRC_DIR/core/src/future/mod.rs:LL:COL
|
||||||
|
|
|
|
||||||
LL | pub const fn identity_future<O, Fut: Future<Output = O>>(f: Fut) -> Fut {
|
LL | pub const fn identity_future<O, Fut: Future<Output = O>>(f: Fut) -> Fut {
|
||||||
| ^^^^^^^^^^^^^^^^^^ required by this bound in `identity_future`
|
| ^^^^^^^^^^^^^^^^^^ required by this bound in `identity_future`
|
||||||
|
|
||||||
error[E0277]: the size for values of type `<impl Future<Output = u32> as Future>::Output` cannot be known at compilation time
|
error[E0277]: the size for values of type `<[async fn body@$DIR/async.rs:7:29: 9:2] as Future>::Output` cannot be known at compilation time
|
||||||
--> $DIR/async.rs:7:29
|
--> $DIR/async.rs:7:29
|
||||||
|
|
|
|
||||||
LL | async fn foo(x: u32) -> u32 {
|
LL | async fn foo(x: u32) -> u32 {
|
||||||
@ -27,23 +27,23 @@ LL | | x
|
|||||||
LL | | }
|
LL | | }
|
||||||
| |_^ doesn't have a size known at compile-time
|
| |_^ doesn't have a size known at compile-time
|
||||||
|
|
|
|
||||||
= help: the trait `Sized` is not implemented for `<impl Future<Output = u32> as Future>::Output`
|
= help: the trait `Sized` is not implemented for `<[async fn body@$DIR/async.rs:7:29: 9:2] as Future>::Output`
|
||||||
note: required by a bound in `identity_future`
|
note: required by a bound in `identity_future`
|
||||||
--> $SRC_DIR/core/src/future/mod.rs:LL:COL
|
--> $SRC_DIR/core/src/future/mod.rs:LL:COL
|
||||||
|
|
|
|
||||||
LL | pub const fn identity_future<O, Fut: Future<Output = O>>(f: Fut) -> Fut {
|
LL | pub const fn identity_future<O, Fut: Future<Output = O>>(f: Fut) -> Fut {
|
||||||
| ^ required by this bound in `identity_future`
|
| ^ required by this bound in `identity_future`
|
||||||
|
|
||||||
error[E0277]: `impl Future<Output = u32>` is not a future
|
error[E0277]: `[async fn body@$DIR/async.rs:7:29: 9:2]` is not a future
|
||||||
--> $DIR/async.rs:7:25
|
--> $DIR/async.rs:7:25
|
||||||
|
|
|
|
||||||
LL | async fn foo(x: u32) -> u32 {
|
LL | async fn foo(x: u32) -> u32 {
|
||||||
| ^^^ `impl Future<Output = u32>` is not a future
|
| ^^^ `[async fn body@$DIR/async.rs:7:29: 9:2]` is not a future
|
||||||
|
|
|
|
||||||
= help: the trait `Future` is not implemented for `impl Future<Output = u32>`
|
= help: the trait `Future` is not implemented for `[async fn body@$DIR/async.rs:7:29: 9:2]`
|
||||||
= note: impl Future<Output = u32> must be a future or must implement `IntoFuture` to be awaited
|
= note: [async fn body@$DIR/async.rs:7:29: 9:2] must be a future or must implement `IntoFuture` to be awaited
|
||||||
|
|
||||||
error[E0280]: the requirement `<impl Future<Output = u32> as Future>::Output == u32` is not satisfied
|
error[E0280]: the requirement `<[async fn body@$DIR/async.rs:7:29: 9:2] as Future>::Output == u32` is not satisfied
|
||||||
--> $DIR/async.rs:7:25
|
--> $DIR/async.rs:7:25
|
||||||
|
|
|
|
||||||
LL | async fn foo(x: u32) -> u32 {
|
LL | async fn foo(x: u32) -> u32 {
|
||||||
|
@ -15,42 +15,42 @@ fn main() {
|
|||||||
drop(non_clone);
|
drop(non_clone);
|
||||||
};
|
};
|
||||||
check_copy(&inner_non_clone);
|
check_copy(&inner_non_clone);
|
||||||
//~^ ERROR the trait bound `impl Future<Output = ()>: Copy` is not satisfied
|
//~^ ERROR : Copy` is not satisfied
|
||||||
check_clone(&inner_non_clone);
|
check_clone(&inner_non_clone);
|
||||||
//~^ ERROR the trait bound `impl Future<Output = ()>: Clone` is not satisfied
|
//~^ ERROR : Clone` is not satisfied
|
||||||
|
|
||||||
let non_clone = NonClone;
|
let non_clone = NonClone;
|
||||||
let outer_non_clone = async move {
|
let outer_non_clone = async move {
|
||||||
drop(non_clone);
|
drop(non_clone);
|
||||||
};
|
};
|
||||||
check_copy(&outer_non_clone);
|
check_copy(&outer_non_clone);
|
||||||
//~^ ERROR the trait bound `impl Future<Output = ()>: Copy` is not satisfied
|
//~^ ERROR : Copy` is not satisfied
|
||||||
check_clone(&outer_non_clone);
|
check_clone(&outer_non_clone);
|
||||||
//~^ ERROR the trait bound `impl Future<Output = ()>: Clone` is not satisfied
|
//~^ ERROR : Clone` is not satisfied
|
||||||
|
|
||||||
let maybe_copy_clone = async move {};
|
let maybe_copy_clone = async move {};
|
||||||
check_copy(&maybe_copy_clone);
|
check_copy(&maybe_copy_clone);
|
||||||
//~^ ERROR the trait bound `impl Future<Output = ()>: Copy` is not satisfied
|
//~^ ERROR : Copy` is not satisfied
|
||||||
check_clone(&maybe_copy_clone);
|
check_clone(&maybe_copy_clone);
|
||||||
//~^ ERROR the trait bound `impl Future<Output = ()>: Clone` is not satisfied
|
//~^ ERROR : Clone` is not satisfied
|
||||||
|
|
||||||
let inner_non_clone_fn = the_inner_non_clone_fn();
|
let inner_non_clone_fn = the_inner_non_clone_fn();
|
||||||
check_copy(&inner_non_clone_fn);
|
check_copy(&inner_non_clone_fn);
|
||||||
//~^ ERROR the trait bound `impl Future<Output = ()>: Copy` is not satisfied
|
//~^ ERROR : Copy` is not satisfied
|
||||||
check_clone(&inner_non_clone_fn);
|
check_clone(&inner_non_clone_fn);
|
||||||
//~^ ERROR the trait bound `impl Future<Output = ()>: Clone` is not satisfied
|
//~^ ERROR : Clone` is not satisfied
|
||||||
|
|
||||||
let outer_non_clone_fn = the_outer_non_clone_fn(NonClone);
|
let outer_non_clone_fn = the_outer_non_clone_fn(NonClone);
|
||||||
check_copy(&outer_non_clone_fn);
|
check_copy(&outer_non_clone_fn);
|
||||||
//~^ ERROR the trait bound `impl Future<Output = ()>: Copy` is not satisfied
|
//~^ ERROR : Copy` is not satisfied
|
||||||
check_clone(&outer_non_clone_fn);
|
check_clone(&outer_non_clone_fn);
|
||||||
//~^ ERROR the trait bound `impl Future<Output = ()>: Clone` is not satisfied
|
//~^ ERROR : Clone` is not satisfied
|
||||||
|
|
||||||
let maybe_copy_clone_fn = the_maybe_copy_clone_fn();
|
let maybe_copy_clone_fn = the_maybe_copy_clone_fn();
|
||||||
check_copy(&maybe_copy_clone_fn);
|
check_copy(&maybe_copy_clone_fn);
|
||||||
//~^ ERROR the trait bound `impl Future<Output = ()>: Copy` is not satisfied
|
//~^ ERROR : Copy` is not satisfied
|
||||||
check_clone(&maybe_copy_clone_fn);
|
check_clone(&maybe_copy_clone_fn);
|
||||||
//~^ ERROR the trait bound `impl Future<Output = ()>: Clone` is not satisfied
|
//~^ ERROR : Clone` is not satisfied
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn the_inner_non_clone_fn() {
|
async fn the_inner_non_clone_fn() {
|
||||||
@ -64,8 +64,7 @@ async fn the_outer_non_clone_fn(non_clone: NonClone) {
|
|||||||
drop(non_clone);
|
drop(non_clone);
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn the_maybe_copy_clone_fn() {
|
async fn the_maybe_copy_clone_fn() {}
|
||||||
}
|
|
||||||
|
|
||||||
fn check_copy<T: Copy>(_x: &T) {}
|
fn check_copy<T: Copy>(_x: &T) {}
|
||||||
fn check_clone<T: Clone>(_x: &T) {}
|
fn check_clone<T: Clone>(_x: &T) {}
|
||||||
|
@ -1,83 +1,83 @@
|
|||||||
error[E0277]: the trait bound `impl Future<Output = ()>: Copy` is not satisfied
|
error[E0277]: the trait bound `[async block@$DIR/clone-impl-async.rs:12:27: 16:6]: Copy` is not satisfied
|
||||||
--> $DIR/clone-impl-async.rs:17:16
|
--> $DIR/clone-impl-async.rs:17:16
|
||||||
|
|
|
|
||||||
LL | check_copy(&inner_non_clone);
|
LL | check_copy(&inner_non_clone);
|
||||||
| ---------- ^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `impl Future<Output = ()>`
|
| ---------- ^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `[async block@$DIR/clone-impl-async.rs:12:27: 16:6]`
|
||||||
| |
|
| |
|
||||||
| required by a bound introduced by this call
|
| required by a bound introduced by this call
|
||||||
|
|
|
|
||||||
note: required by a bound in `check_copy`
|
note: required by a bound in `check_copy`
|
||||||
--> $DIR/clone-impl-async.rs:70:18
|
--> $DIR/clone-impl-async.rs:69:18
|
||||||
|
|
|
|
||||||
LL | fn check_copy<T: Copy>(_x: &T) {}
|
LL | fn check_copy<T: Copy>(_x: &T) {}
|
||||||
| ^^^^ required by this bound in `check_copy`
|
| ^^^^ required by this bound in `check_copy`
|
||||||
|
|
||||||
error[E0277]: the trait bound `impl Future<Output = ()>: Clone` is not satisfied
|
error[E0277]: the trait bound `[async block@$DIR/clone-impl-async.rs:12:27: 16:6]: Clone` is not satisfied
|
||||||
--> $DIR/clone-impl-async.rs:19:17
|
--> $DIR/clone-impl-async.rs:19:17
|
||||||
|
|
|
|
||||||
LL | check_clone(&inner_non_clone);
|
LL | check_clone(&inner_non_clone);
|
||||||
| ----------- ^^^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `impl Future<Output = ()>`
|
| ----------- ^^^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `[async block@$DIR/clone-impl-async.rs:12:27: 16:6]`
|
||||||
| |
|
| |
|
||||||
| required by a bound introduced by this call
|
| required by a bound introduced by this call
|
||||||
|
|
|
|
||||||
note: required by a bound in `check_clone`
|
note: required by a bound in `check_clone`
|
||||||
--> $DIR/clone-impl-async.rs:71:19
|
--> $DIR/clone-impl-async.rs:70:19
|
||||||
|
|
|
|
||||||
LL | fn check_clone<T: Clone>(_x: &T) {}
|
LL | fn check_clone<T: Clone>(_x: &T) {}
|
||||||
| ^^^^^ required by this bound in `check_clone`
|
| ^^^^^ required by this bound in `check_clone`
|
||||||
|
|
||||||
error[E0277]: the trait bound `impl Future<Output = ()>: Copy` is not satisfied
|
error[E0277]: the trait bound `[async block@$DIR/clone-impl-async.rs:23:27: 25:6]: Copy` is not satisfied
|
||||||
--> $DIR/clone-impl-async.rs:26:16
|
--> $DIR/clone-impl-async.rs:26:16
|
||||||
|
|
|
|
||||||
LL | check_copy(&outer_non_clone);
|
LL | check_copy(&outer_non_clone);
|
||||||
| ---------- ^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `impl Future<Output = ()>`
|
| ---------- ^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `[async block@$DIR/clone-impl-async.rs:23:27: 25:6]`
|
||||||
| |
|
| |
|
||||||
| required by a bound introduced by this call
|
| required by a bound introduced by this call
|
||||||
|
|
|
|
||||||
note: required by a bound in `check_copy`
|
note: required by a bound in `check_copy`
|
||||||
--> $DIR/clone-impl-async.rs:70:18
|
--> $DIR/clone-impl-async.rs:69:18
|
||||||
|
|
|
|
||||||
LL | fn check_copy<T: Copy>(_x: &T) {}
|
LL | fn check_copy<T: Copy>(_x: &T) {}
|
||||||
| ^^^^ required by this bound in `check_copy`
|
| ^^^^ required by this bound in `check_copy`
|
||||||
|
|
||||||
error[E0277]: the trait bound `impl Future<Output = ()>: Clone` is not satisfied
|
error[E0277]: the trait bound `[async block@$DIR/clone-impl-async.rs:23:27: 25:6]: Clone` is not satisfied
|
||||||
--> $DIR/clone-impl-async.rs:28:17
|
--> $DIR/clone-impl-async.rs:28:17
|
||||||
|
|
|
|
||||||
LL | check_clone(&outer_non_clone);
|
LL | check_clone(&outer_non_clone);
|
||||||
| ----------- ^^^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `impl Future<Output = ()>`
|
| ----------- ^^^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `[async block@$DIR/clone-impl-async.rs:23:27: 25:6]`
|
||||||
| |
|
| |
|
||||||
| required by a bound introduced by this call
|
| required by a bound introduced by this call
|
||||||
|
|
|
|
||||||
note: required by a bound in `check_clone`
|
note: required by a bound in `check_clone`
|
||||||
--> $DIR/clone-impl-async.rs:71:19
|
--> $DIR/clone-impl-async.rs:70:19
|
||||||
|
|
|
|
||||||
LL | fn check_clone<T: Clone>(_x: &T) {}
|
LL | fn check_clone<T: Clone>(_x: &T) {}
|
||||||
| ^^^^^ required by this bound in `check_clone`
|
| ^^^^^ required by this bound in `check_clone`
|
||||||
|
|
||||||
error[E0277]: the trait bound `impl Future<Output = ()>: Copy` is not satisfied
|
error[E0277]: the trait bound `[async block@$DIR/clone-impl-async.rs:31:28: 31:41]: Copy` is not satisfied
|
||||||
--> $DIR/clone-impl-async.rs:32:16
|
--> $DIR/clone-impl-async.rs:32:16
|
||||||
|
|
|
|
||||||
LL | check_copy(&maybe_copy_clone);
|
LL | check_copy(&maybe_copy_clone);
|
||||||
| ---------- ^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `impl Future<Output = ()>`
|
| ---------- ^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `[async block@$DIR/clone-impl-async.rs:31:28: 31:41]`
|
||||||
| |
|
| |
|
||||||
| required by a bound introduced by this call
|
| required by a bound introduced by this call
|
||||||
|
|
|
|
||||||
note: required by a bound in `check_copy`
|
note: required by a bound in `check_copy`
|
||||||
--> $DIR/clone-impl-async.rs:70:18
|
--> $DIR/clone-impl-async.rs:69:18
|
||||||
|
|
|
|
||||||
LL | fn check_copy<T: Copy>(_x: &T) {}
|
LL | fn check_copy<T: Copy>(_x: &T) {}
|
||||||
| ^^^^ required by this bound in `check_copy`
|
| ^^^^ required by this bound in `check_copy`
|
||||||
|
|
||||||
error[E0277]: the trait bound `impl Future<Output = ()>: Clone` is not satisfied
|
error[E0277]: the trait bound `[async block@$DIR/clone-impl-async.rs:31:28: 31:41]: Clone` is not satisfied
|
||||||
--> $DIR/clone-impl-async.rs:34:17
|
--> $DIR/clone-impl-async.rs:34:17
|
||||||
|
|
|
|
||||||
LL | check_clone(&maybe_copy_clone);
|
LL | check_clone(&maybe_copy_clone);
|
||||||
| ----------- ^^^^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `impl Future<Output = ()>`
|
| ----------- ^^^^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `[async block@$DIR/clone-impl-async.rs:31:28: 31:41]`
|
||||||
| |
|
| |
|
||||||
| required by a bound introduced by this call
|
| required by a bound introduced by this call
|
||||||
|
|
|
|
||||||
note: required by a bound in `check_clone`
|
note: required by a bound in `check_clone`
|
||||||
--> $DIR/clone-impl-async.rs:71:19
|
--> $DIR/clone-impl-async.rs:70:19
|
||||||
|
|
|
|
||||||
LL | fn check_clone<T: Clone>(_x: &T) {}
|
LL | fn check_clone<T: Clone>(_x: &T) {}
|
||||||
| ^^^^^ required by this bound in `check_clone`
|
| ^^^^^ required by this bound in `check_clone`
|
||||||
@ -91,7 +91,7 @@ LL | check_copy(&inner_non_clone_fn);
|
|||||||
| required by a bound introduced by this call
|
| required by a bound introduced by this call
|
||||||
|
|
|
|
||||||
note: required by a bound in `check_copy`
|
note: required by a bound in `check_copy`
|
||||||
--> $DIR/clone-impl-async.rs:70:18
|
--> $DIR/clone-impl-async.rs:69:18
|
||||||
|
|
|
|
||||||
LL | fn check_copy<T: Copy>(_x: &T) {}
|
LL | fn check_copy<T: Copy>(_x: &T) {}
|
||||||
| ^^^^ required by this bound in `check_copy`
|
| ^^^^ required by this bound in `check_copy`
|
||||||
@ -105,7 +105,7 @@ LL | check_clone(&inner_non_clone_fn);
|
|||||||
| required by a bound introduced by this call
|
| required by a bound introduced by this call
|
||||||
|
|
|
|
||||||
note: required by a bound in `check_clone`
|
note: required by a bound in `check_clone`
|
||||||
--> $DIR/clone-impl-async.rs:71:19
|
--> $DIR/clone-impl-async.rs:70:19
|
||||||
|
|
|
|
||||||
LL | fn check_clone<T: Clone>(_x: &T) {}
|
LL | fn check_clone<T: Clone>(_x: &T) {}
|
||||||
| ^^^^^ required by this bound in `check_clone`
|
| ^^^^^ required by this bound in `check_clone`
|
||||||
@ -119,7 +119,7 @@ LL | check_copy(&outer_non_clone_fn);
|
|||||||
| required by a bound introduced by this call
|
| required by a bound introduced by this call
|
||||||
|
|
|
|
||||||
note: required by a bound in `check_copy`
|
note: required by a bound in `check_copy`
|
||||||
--> $DIR/clone-impl-async.rs:70:18
|
--> $DIR/clone-impl-async.rs:69:18
|
||||||
|
|
|
|
||||||
LL | fn check_copy<T: Copy>(_x: &T) {}
|
LL | fn check_copy<T: Copy>(_x: &T) {}
|
||||||
| ^^^^ required by this bound in `check_copy`
|
| ^^^^ required by this bound in `check_copy`
|
||||||
@ -133,7 +133,7 @@ LL | check_clone(&outer_non_clone_fn);
|
|||||||
| required by a bound introduced by this call
|
| required by a bound introduced by this call
|
||||||
|
|
|
|
||||||
note: required by a bound in `check_clone`
|
note: required by a bound in `check_clone`
|
||||||
--> $DIR/clone-impl-async.rs:71:19
|
--> $DIR/clone-impl-async.rs:70:19
|
||||||
|
|
|
|
||||||
LL | fn check_clone<T: Clone>(_x: &T) {}
|
LL | fn check_clone<T: Clone>(_x: &T) {}
|
||||||
| ^^^^^ required by this bound in `check_clone`
|
| ^^^^^ required by this bound in `check_clone`
|
||||||
@ -147,7 +147,7 @@ LL | check_copy(&maybe_copy_clone_fn);
|
|||||||
| required by a bound introduced by this call
|
| required by a bound introduced by this call
|
||||||
|
|
|
|
||||||
note: required by a bound in `check_copy`
|
note: required by a bound in `check_copy`
|
||||||
--> $DIR/clone-impl-async.rs:70:18
|
--> $DIR/clone-impl-async.rs:69:18
|
||||||
|
|
|
|
||||||
LL | fn check_copy<T: Copy>(_x: &T) {}
|
LL | fn check_copy<T: Copy>(_x: &T) {}
|
||||||
| ^^^^ required by this bound in `check_copy`
|
| ^^^^ required by this bound in `check_copy`
|
||||||
@ -161,7 +161,7 @@ LL | check_clone(&maybe_copy_clone_fn);
|
|||||||
| required by a bound introduced by this call
|
| required by a bound introduced by this call
|
||||||
|
|
|
|
||||||
note: required by a bound in `check_clone`
|
note: required by a bound in `check_clone`
|
||||||
--> $DIR/clone-impl-async.rs:71:19
|
--> $DIR/clone-impl-async.rs:70:19
|
||||||
|
|
|
|
||||||
LL | fn check_clone<T: Clone>(_x: &T) {}
|
LL | fn check_clone<T: Clone>(_x: &T) {}
|
||||||
| ^^^^^ required by this bound in `check_clone`
|
| ^^^^^ required by this bound in `check_clone`
|
||||||
|
@ -12,7 +12,7 @@ pub trait Bar {
|
|||||||
impl<S> Bar for S {
|
impl<S> Bar for S {
|
||||||
type E = impl std::marker::Copy;
|
type E = impl std::marker::Copy;
|
||||||
fn foo<T>() -> Self::E {
|
fn foo<T>() -> Self::E {
|
||||||
//~^ ERROR the trait bound `impl Future<Output = ()>: Copy` is not satisfied [E0277]
|
//~^ ERROR : Copy` is not satisfied [E0277]
|
||||||
async {}
|
async {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
error[E0277]: the trait bound `impl Future<Output = ()>: Copy` is not satisfied
|
error[E0277]: the trait bound `[async block@$DIR/issue-55872-3.rs:16:9: 16:17]: Copy` is not satisfied
|
||||||
--> $DIR/issue-55872-3.rs:14:20
|
--> $DIR/issue-55872-3.rs:14:20
|
||||||
|
|
|
|
||||||
LL | fn foo<T>() -> Self::E {
|
LL | fn foo<T>() -> Self::E {
|
||||||
| ^^^^^^^ the trait `Copy` is not implemented for `impl Future<Output = ()>`
|
| ^^^^^^^ the trait `Copy` is not implemented for `[async block@$DIR/issue-55872-3.rs:16:9: 16:17]`
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ type F = impl core::future::Future<Output = u8>;
|
|||||||
struct Bug {
|
struct Bug {
|
||||||
V1: [(); {
|
V1: [(); {
|
||||||
fn concrete_use() -> F {
|
fn concrete_use() -> F {
|
||||||
//~^ ERROR expected `impl Future<Output = ()>` to be a future that resolves to `u8`, but it resolves to `()`
|
//~^ ERROR to be a future that resolves to `u8`, but it resolves to `()`
|
||||||
async {}
|
async {}
|
||||||
}
|
}
|
||||||
let f: F = async { 1 };
|
let f: F = async { 1 };
|
||||||
|
@ -16,7 +16,7 @@ LL | let f: F = async { 1 };
|
|||||||
LL | }],
|
LL | }],
|
||||||
| - value is dropped here
|
| - value is dropped here
|
||||||
|
|
||||||
error[E0271]: expected `impl Future<Output = ()>` to be a future that resolves to `u8`, but it resolves to `()`
|
error[E0271]: expected `[async block@$DIR/issue-78722.rs:11:13: 11:21]` to be a future that resolves to `u8`, but it resolves to `()`
|
||||||
--> $DIR/issue-78722.rs:9:30
|
--> $DIR/issue-78722.rs:9:30
|
||||||
|
|
|
|
||||||
LL | fn concrete_use() -> F {
|
LL | fn concrete_use() -> F {
|
||||||
|
@ -4,7 +4,7 @@ error: `[closure@$DIR/non-structural-match-types.rs:9:17: 9:19]` cannot be used
|
|||||||
LL | const { || {} } => {},
|
LL | const { || {} } => {},
|
||||||
| ^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: `impl Future<Output = ()>` cannot be used in patterns
|
error: `[async block@$DIR/non-structural-match-types.rs:12:17: 12:25]` cannot be used in patterns
|
||||||
--> $DIR/non-structural-match-types.rs:12:9
|
--> $DIR/non-structural-match-types.rs:12:9
|
||||||
|
|
|
|
||||||
LL | const { async {} } => {},
|
LL | const { async {} } => {},
|
||||||
|
@ -87,7 +87,7 @@ LL | | }
|
|||||||
| arguments to this function are incorrect
|
| arguments to this function are incorrect
|
||||||
|
|
|
|
||||||
= note: expected struct `Pin<Box<dyn Future<Output = i32> + Send>>`
|
= note: expected struct `Pin<Box<dyn Future<Output = i32> + Send>>`
|
||||||
found `async` block `impl Future<Output = {integer}>`
|
found `async` block `[async block@$DIR/expected-boxed-future-isnt-pinned.rs:28:5: 30:6]`
|
||||||
note: function defined here
|
note: function defined here
|
||||||
--> $SRC_DIR/core/src/future/mod.rs:LL:COL
|
--> $SRC_DIR/core/src/future/mod.rs:LL:COL
|
||||||
|
|
|
|
||||||
|
Loading…
Reference in New Issue
Block a user