Change:
I get the following ICE with 1.51.0 stable (but not on nightly). The ICE can currently be reproduced on the [playground]. [playground]: (_%3A%20%26mut%20F)%0Awhere%0A%20%20%20%20F%3A%20FnMut()%2C%0A%7B%0A%7D%0A%0Afn%20main()%20%7B%0A%20%20%20%20let%20f%20%3D%20%7C%7C%20%7B%7D%3B%0A%20%20%20%20foo(%26mut%20f)%3B%0A%7D%0A <!-- 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. --: <details<summary<strongBacktrace</strong</summary<p</p</details
Even simpler: [playground]. [playground]: ()%20%7B%0A%20%20%20%20let%20f%20%3D%20%7C%7C%20%7B%7D%3B%0A%20%20%20%20drop(%26mut%20f)%3B%0A%7D%0A
This ICE also does not happen in the 1.52 beta.
Does not seem to ICE modify labels: E-needs-test

Discussion:
<ins> // #84044: This used to ICE. fn main() { let f = || {}; drop(&mut f); //~ ERROR cannot borrow `f` as mutable, as it is not declared as mutable } </ins>

<ins> error[E0596]: cannot borrow `f` as mutable, as it is not declared as mutable --> $DIR/issue-84044-drop-non-mut.rs:5:10 | LL |     let f = || {}; |         - help: consider changing this to be mutable: `mut f` LL |     drop(&mut f); |          ^^^^^^ cannot borrow as mutable error: aborting due to previous error For more information about this error, try `rustc --explain E0596`. </ins>

<ins> // compile-flags: -Zsave-analysis // Check that this does not ICE. // Stolen from src/test/ui/const-generics/generic_arg_infer/infer-arg-test.rs #![feature(generic_arg_infer)] struct All<'a, T, const N: usize> { v: &'a T, } struct BadInfer<_>; //~^ ERROR expected identifier //~| ERROR parameter `_` is never used fn all_fn<'a, T, const N: usize>() {} fn bad_infer_fn<_>() {} //~^ ERROR expected identifier fn main() { let a: All<_, _, _>; //~^ ERROR this struct takes 2 generic arguments but 3 generic arguments were supplied all_fn(); let v: [u8; _]; let v: [u8; 10] = [0; _]; } </ins>

<ins> error: expected identifier, found reserved identifier `_` --> $DIR/issue-89066.rs:12:17 | LL | struct BadInfer<_>; |                 ^ expected identifier, found reserved identifier error: expected identifier, found reserved identifier `_` --> $DIR/issue-89066.rs:18:17 | LL | fn bad_infer_fn<_>() {} |                 ^ expected identifier, found reserved identifier error[E0392]: parameter `_` is never used --> $DIR/issue-89066.rs:12:17 | LL | struct BadInfer<_>; |                 ^ unused parameter | = help: consider removing `_`, referring to it in a field, or using a marker such as `PhantomData` = help: if you intended `_` to be a const parameter, use `const _: usize` instead error[E0107]: this struct takes 2 generic arguments but 3 generic arguments were supplied --> $DIR/issue-89066.rs:23:10 | LL |   let a: All<_, _, _>; |          ^^^       - help: remove this generic argument |          | |          expected 2 generic arguments | note: struct defined here, with 2 generic parameters: `T`, `N` --> $DIR/issue-89066.rs:8:8 | LL | struct All<'a, T, const N: usize> { |        ^^^     -        - error: aborting due to 4 previous errors Some errors have detailed explanations: E0107, E0392. For more information about an error, try `rustc --explain E0107`. </ins>

<ins> // #91594: This used to ICE. trait Component<M> { type Interface; } trait HasComponent<I> {} struct Foo; impl HasComponent<<Foo as Component<Foo>>::Interface> for Foo {} //~^ ERROR the trait bound `Foo: HasComponent<()>` is not satisfied impl<M: HasComponent<()>> Component<M> for Foo { type Interface = u8; } fn main() {} </ins>

<ins> error[E0277]: the trait bound `Foo: HasComponent<()>` is not satisfied --> $DIR/issue-91594.rs:10:6 | LL | impl HasComponent<<Foo as Component<Foo>>::Interface> for Foo {} |      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `HasComponent<()>` is not implemented for `Foo` | = help: the following implementations were found: <Foo as HasComponent<<Foo as Component<Foo>>::Interface>> note: required because of the requirements on the impl of `Component<Foo>` for `Foo` --> $DIR/issue-91594.rs:13:27 | LL | impl<M: HasComponent<()>> Component<M> for Foo { |                           ^^^^^^^^^^^^     ^^^ error: aborting due to previous error For more information about this error, try `rustc --explain E0277`. </ins>