Change:
I'm seeing an internal compiler error on the following input (found by ):
Report from cargo-bisect-rustc: searched nightlies: from nightly-2020-03-09 to nightly-2020-04-03 regressed nightly: nightly-2020-03-16 searched commits: from to regressed commit:
Maybe due to cc
Fixed by

Discussion:
use rustc_ast::ast::*; use rustc_ast::token::{self, Token}; use rustc_ast::visit::{self, FnKind}; <ins> use rustc_ast::walk_list; </ins> use rustc_expand::expand::AstFragment; use rustc_hir::def_id::LocalDefId; use rustc_hir::definitions::*;

// we must mirror everything that `visit::walk_fn` below does. self.visit_fn_header(&sig.header); visit::walk_fn_decl(self, &sig.decl); <del> 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)); } </del> <ins> let closure_def = self.create_def(closure_id, DefPathData::ClosureExpr, span); self.with_parent(closure_def, |this| walk_list!(this, visit_block, body)); </ins> return; } }

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

<ins> 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`. </ins>