Do not ICE on unnamed future

This commit is contained in:
Esteban Küber 2019-12-13 15:27:55 -08:00
parent de0abf7599
commit e08944fdaf
4 changed files with 57 additions and 4 deletions

View File

@ -1016,8 +1016,8 @@ pub fn expect_expr(&self, id: HirId) -> &'hir Expr {
}
}
pub fn name(&self, id: HirId) -> Name {
match self.get(id) {
pub fn opt_name(&self, id: HirId) -> Option<Name> {
Some(match self.get(id) {
Node::Item(i) => i.ident.name,
Node::ForeignItem(fi) => fi.ident.name,
Node::ImplItem(ii) => ii.ident.name,
@ -1028,7 +1028,14 @@ pub fn name(&self, id: HirId) -> Name {
Node::GenericParam(param) => param.name.ident().name,
Node::Binding(&Pat { kind: PatKind::Binding(_, _, l, _), .. }) => l.name,
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)),
}
}

View File

@ -2353,7 +2353,7 @@ fn note_obligation_cause_for_async_await(
let message = if let Some(name) = last_generator
.and_then(|generator_did| self.tcx.parent(generator_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)
} else {

View 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() {}

View 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