mirror of
https://github.com/rust-lang/rust.git
synced 2025-06-05 19:58:32 +00:00
Do not ICE on unnamed future
This commit is contained in:
parent
de0abf7599
commit
e08944fdaf
@ -1016,8 +1016,8 @@ impl<'hir> Map<'hir> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn name(&self, id: HirId) -> Name {
|
pub fn opt_name(&self, id: HirId) -> Option<Name> {
|
||||||
match self.get(id) {
|
Some(match self.get(id) {
|
||||||
Node::Item(i) => i.ident.name,
|
Node::Item(i) => i.ident.name,
|
||||||
Node::ForeignItem(fi) => fi.ident.name,
|
Node::ForeignItem(fi) => fi.ident.name,
|
||||||
Node::ImplItem(ii) => ii.ident.name,
|
Node::ImplItem(ii) => ii.ident.name,
|
||||||
@ -1028,7 +1028,14 @@ impl<'hir> Map<'hir> {
|
|||||||
Node::GenericParam(param) => param.name.ident().name,
|
Node::GenericParam(param) => param.name.ident().name,
|
||||||
Node::Binding(&Pat { kind: PatKind::Binding(_, _, l, _), .. }) => l.name,
|
Node::Binding(&Pat { kind: PatKind::Binding(_, _, l, _), .. }) => l.name,
|
||||||
Node::Ctor(..) => self.name(self.get_parent_item(id)),
|
Node::Ctor(..) => self.name(self.get_parent_item(id)),
|
||||||
_ => bug!("no name for {}", self.node_to_string(id))
|
_ => return None,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn name(&self, id: HirId) -> Name {
|
||||||
|
match self.opt_name(id) {
|
||||||
|
Some(name) => name,
|
||||||
|
None => bug!("no name for {}", self.node_to_string(id)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2353,7 +2353,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
|||||||
let message = if let Some(name) = last_generator
|
let message = if let Some(name) = last_generator
|
||||||
.and_then(|generator_did| self.tcx.parent(generator_did))
|
.and_then(|generator_did| self.tcx.parent(generator_did))
|
||||||
.and_then(|parent_did| self.tcx.hir().as_local_hir_id(parent_did))
|
.and_then(|parent_did| self.tcx.hir().as_local_hir_id(parent_did))
|
||||||
.map(|parent_hir_id| self.tcx.hir().name(parent_hir_id))
|
.and_then(|parent_hir_id| self.tcx.hir().opt_name(parent_hir_id))
|
||||||
{
|
{
|
||||||
format!("future returned by `{}` is not {}", name, trait_name)
|
format!("future returned by `{}` is not {}", name, trait_name)
|
||||||
} else {
|
} else {
|
||||||
|
24
src/test/ui/async-await/issue-67252-unnamed-future.rs
Normal file
24
src/test/ui/async-await/issue-67252-unnamed-future.rs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
// edition:2018
|
||||||
|
use std::future::Future;
|
||||||
|
use std::pin::Pin;
|
||||||
|
use std::task::{Context, Poll};
|
||||||
|
|
||||||
|
fn spawn<T: Send>(_: T) {}
|
||||||
|
|
||||||
|
pub struct AFuture;
|
||||||
|
impl Future for AFuture{
|
||||||
|
type Output = ();
|
||||||
|
|
||||||
|
fn poll(mut self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<()> {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn foo() {
|
||||||
|
spawn(async { //~ ERROR future cannot be sent between threads safely
|
||||||
|
let _a = std::ptr::null_mut::<()>(); // `*mut ()` is not `Send`
|
||||||
|
AFuture.await;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
22
src/test/ui/async-await/issue-67252-unnamed-future.stderr
Normal file
22
src/test/ui/async-await/issue-67252-unnamed-future.stderr
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
error: future cannot be sent between threads safely
|
||||||
|
--> $DIR/issue-67252-unnamed-future.rs:18:5
|
||||||
|
|
|
||||||
|
LL | fn spawn<T: Send>(_: T) {}
|
||||||
|
| ----- ---- required by this bound in `spawn`
|
||||||
|
...
|
||||||
|
LL | spawn(async {
|
||||||
|
| ^^^^^ future is not `Send`
|
||||||
|
|
|
||||||
|
= help: within `impl std::future::Future`, the trait `std::marker::Send` is not implemented for `*mut ()`
|
||||||
|
note: future is not `Send` as this value is used across an await
|
||||||
|
--> $DIR/issue-67252-unnamed-future.rs:20:9
|
||||||
|
|
|
||||||
|
LL | let _a = std::ptr::null_mut::<()>(); // `*mut ()` is not `Send`
|
||||||
|
| -- has type `*mut ()`
|
||||||
|
LL | AFuture.await;
|
||||||
|
| ^^^^^^^^^^^^^ await occurs here, with `_a` maybe used later
|
||||||
|
LL | });
|
||||||
|
| - `_a` is later dropped here
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
Loading…
Reference in New Issue
Block a user