Change:
<!-- Thank you for finding an Internal Compiler Error! If possible, try to provide a minimal verifiable example. You can read "Rust Bug Minimization Patterns" for how to create smaller examples. --<!-- If you're using the stable version of the compiler, you should also check if the bug also exists in the beta or nightly versions. --: <!-- Include a backtrace in the code block by setting in your environment. E.g. . --<details<summary<strongBacktrace</strong</summary<p</p</details
Doesn't ICE on stable or beta label: regression-from-stable-to-nightly
searched nightlies: from nightly-2020-11-25 to nightly-2020-11-29 regressed nightly: nightly-2020-11-27 searched commits: from to regressed commit: <details<summarybisected with <a href=''cargo-bisect-rustc</av0.6.0</summaryHost triple: x86_64-unknown-linux-gnu Reproduce with: </detailsMaybe ?
Assigning and removing as in the prioritization working group.
- would you be up for fixing this bug or temporarily reverting PR presuming it is the cause?

Discussion:
body: &Expr, fn_decl_span: Span, ) -> hir::ExprKind<'hir> { <del> // Lower outside new scope to preserve `is_in_loop_condition`. let fn_decl = self.lower_fn_decl(decl, None, false, None); self.with_new_scopes(move |this| { </del> <ins> let (body_id, generator_option) = self.with_new_scopes(move |this| { </ins> let prev = this.current_item; this.current_item = Some(fn_decl_span); let mut generator_kind = None;

let generator_option = this.generator_movability_for_fn(&decl, fn_decl_span, generator_kind, movability); this.current_item = prev; <del> hir::ExprKind::Closure(capture_clause, fn_decl, body_id, fn_decl_span, generator_option) }) </del> <ins> (body_id, generator_option) }); // Lower outside new scope to preserve `is_in_loop_condition`. let fn_decl = self.lower_fn_decl(decl, None, false, None); hir::ExprKind::Closure(capture_clause, fn_decl, body_id, fn_decl_span, generator_option) </ins> } fn generator_movability_for_fn(

) -> hir::ExprKind<'hir> { let outer_decl = FnDecl { inputs: decl.inputs.clone(), output: FnRetTy::Default(fn_decl_span) }; <del> // We need to lower the declaration outside the new scope, because we // have to conserve the state of being inside a loop condition for the // closure argument types. let fn_decl = self.lower_fn_decl(&outer_decl, None, false, None); self.with_new_scopes(move |this| { </del> <ins> let body_id = self.with_new_scopes(|this| { </ins> // FIXME(cramertj): allow `async` non-`move` closures with arguments. if capture_clause == CaptureBy::Ref && !decl.inputs.is_empty() { struct_span_err!(

); this.expr(fn_decl_span, async_body, ThinVec::new()) }); <del> hir::ExprKind::Closure(capture_clause, fn_decl, body_id, fn_decl_span, None) }) </del> <ins> body_id }); // We need to lower the declaration outside the new scope, because we // have to conserve the state of being inside a loop condition for the // closure argument types. let fn_decl = self.lower_fn_decl(&outer_decl, None, false, None); hir::ExprKind::Closure(capture_clause, fn_decl, body_id, fn_decl_span, None) </ins> } /// Destructure the LHS of complex assignments.

<ins> // Check that using the parameter name in its type does not ICE. // edition:2018 #![feature(async_closure)] fn main() { let _ = |x: x| x; //~ ERROR expected type let _ = |x: bool| -> x { x }; //~ ERROR expected type let _ = async move |x: x| x; //~ ERROR expected type let _ = async move |x: bool| -> x { x }; //~ ERROR expected type } fn foo(x: x) {} //~ ERROR expected type fn foo_ret(x: bool) -> x {} //~ ERROR expected type async fn async_foo(x: x) {} //~ ERROR expected type async fn async_foo_ret(x: bool) -> x {} //~ ERROR expected type </ins>

<ins> error[E0573]: expected type, found local variable `x` --> $DIR/local-type-mix.rs:7:17 | LL |     let _ = |x: x| x; |                 ^ not a type error[E0573]: expected type, found local variable `x` --> $DIR/local-type-mix.rs:8:26 | LL |     let _ = |x: bool| -> x { x }; |                          ^ not a type error[E0573]: expected type, found local variable `x` --> $DIR/local-type-mix.rs:9:28 | LL |     let _ = async move |x: x| x; |                            ^ not a type error[E0573]: expected type, found local variable `x` --> $DIR/local-type-mix.rs:10:37 | LL |     let _ = async move |x: bool| -> x { x }; |                                     ^ not a type error[E0573]: expected type, found local variable `x` --> $DIR/local-type-mix.rs:13:11 | LL | fn foo(x: x) {} |           ^ not a type error[E0573]: expected type, found local variable `x` --> $DIR/local-type-mix.rs:14:24 | LL | fn foo_ret(x: bool) -> x {} |                        ^ not a type error[E0573]: expected type, found local variable `x` --> $DIR/local-type-mix.rs:16:23 | LL | async fn async_foo(x: x) {} |                       ^ not a type error[E0573]: expected type, found local variable `x` --> $DIR/local-type-mix.rs:17:36 | LL | async fn async_foo_ret(x: bool) -> x {} |                                    ^ not a type error: aborting due to 8 previous errors For more information about this error, try `rustc --explain E0573`. </ins>