Skip to content

Commit

Permalink
def_collector, visit_fn: account for no body
Browse files Browse the repository at this point in the history
  • Loading branch information
Centril committed Apr 3, 2020
1 parent 424c793 commit 5a7ad49
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 4 deletions.
7 changes: 3 additions & 4 deletions src/librustc_resolve/def_collector.rs
Expand Up @@ -2,6 +2,7 @@ use log::debug;
use rustc_ast::ast::*;
use rustc_ast::token::{self, Token};
use rustc_ast::visit::{self, FnKind};
use rustc_ast::walk_list;
use rustc_expand::expand::AstFragment;
use rustc_hir::def_id::LocalDefId;
use rustc_hir::definitions::*;
Expand Down Expand Up @@ -117,10 +118,8 @@ impl<'a> visit::Visitor<'a> for DefCollector<'a> {
// we must mirror everything that `visit::walk_fn` below does.
self.visit_fn_header(&sig.header);
visit::walk_fn_decl(self, &sig.decl);
if let Some(body) = body {
let closure_def = self.create_def(closure_id, DefPathData::ClosureExpr, span);
self.with_parent(closure_def, |this| this.visit_block(body));
}
let closure_def = self.create_def(closure_id, DefPathData::ClosureExpr, span);
self.with_parent(closure_def, |this| walk_list!(this, visit_block, body));
return;
}
}
Expand Down
20 changes: 20 additions & 0 deletions src/test/ui/resolve/issue-70736-async-fn-no-body-def-collector.rs
@@ -0,0 +1,20 @@
// edition:2018

async fn free(); //~ ERROR without a body

struct A;
impl A {
async fn inherent(); //~ ERROR without body
}

trait B {
async fn associated();
//~^ ERROR cannot be declared `async`
}
impl B for A {
async fn associated(); //~ ERROR without body
//~^ ERROR cannot be declared `async`
//~| ERROR incompatible type for trait
}

fn main() {}
@@ -0,0 +1,65 @@
error: free function without a body
--> $DIR/issue-70736-async-fn-no-body-def-collector.rs:3:1
|
LL | async fn free();
| ^^^^^^^^^^^^^^^-
| |
| help: provide a definition for the function: `{ <body> }`

error: associated function in `impl` without body
--> $DIR/issue-70736-async-fn-no-body-def-collector.rs:7:5
|
LL | async fn inherent();
| ^^^^^^^^^^^^^^^^^^^-
| |
| help: provide a definition for the function: `{ <body> }`

error[E0706]: functions in traits cannot be declared `async`
--> $DIR/issue-70736-async-fn-no-body-def-collector.rs:11:5
|
LL | async fn associated();
| -----^^^^^^^^^^^^^^^^^
| |
| `async` because of this
|
= note: `async` trait functions are not currently supported
= note: consider using the `async-trait` crate: https://crates.io/crates/async-trait

error: associated function in `impl` without body
--> $DIR/issue-70736-async-fn-no-body-def-collector.rs:15:5
|
LL | async fn associated();
| ^^^^^^^^^^^^^^^^^^^^^-
| |
| help: provide a definition for the function: `{ <body> }`

error[E0706]: functions in traits cannot be declared `async`
--> $DIR/issue-70736-async-fn-no-body-def-collector.rs:15:5
|
LL | async fn associated();
| -----^^^^^^^^^^^^^^^^^
| |
| `async` because of this
|
= note: `async` trait functions are not currently supported
= note: consider using the `async-trait` crate: https://crates.io/crates/async-trait

error[E0053]: method `associated` has an incompatible type for trait
--> $DIR/issue-70736-async-fn-no-body-def-collector.rs:15:26
|
LL | async fn associated();
| - type in trait
...
LL | async fn associated();
| ^
| |
| the `Output` of this `async fn`'s found opaque type
| expected `()`, found opaque type
|
= note: expected fn pointer `fn()`
found fn pointer `fn() -> impl std::future::Future`

error: aborting due to 6 previous errors

Some errors have detailed explanations: E0053, E0706.
For more information about an error, try `rustc --explain E0053`.

0 comments on commit 5a7ad49

Please sign in to comment.