Rollup merge of #70739 - Centril:fix-70736, r=petrochenkov
def_collector, visit_fn: account for no body Fixes #70736 r? @petrochenkov
This commit is contained in:
commit
17fa3440d2
@ -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::*;
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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`.
|
Loading…
x
Reference in New Issue
Block a user