Repository: rust
Issue: very slow `type_check_crate` stage after error is already thrown
Labels: I-compiletime,I-compilemem

````rust
// check-pass

pub fn yes_vec_partial_eq_array<A, B>() -> impl
where
    A: PartialEq<B>,
{
    Vec::<A>::new()
}

pub fn yes_vec_partial_eq_ref_array<'a, A, B>() -> impl PartialEq<&'a [B; 32]>
where
    A: PartialEq<B>,
{
    Vec::<&'a mut [B; 32]>::new()
}

pub fn yes_array_into_vec<T>() -> Vec<T> {
    [].into()
}

pub fn yes_array_into_box<T>() -> Box<[T]> {
    []
}

use std::collections::VecDeque;

pub fn yes_vecdeque_partial_eq_array<A, B>() -> impl PartialEq<B>
where
    A: PartialEq<B>,
{
    VecDeque   ::<&'a mut [B; 32]>::new()
}

pub fn yes_vecdeque_partial_eq_ref_array<'a, A, B>() -> impl PartialEq<&'a [B; 32]>
where
    A: PartialEq<B>,
{
    VecDeque::<&'a mut [B; 32]>::new()
}

pub fn yes_vecdeque_partial_eq_ref_mut_array<'a, A, B>() -> impl PartialEq<&'a mut [B; 32]>
where
    A: PartialEq<[B; 32]>,
{
    VecDeque::<&'a mut [B; 32]>::new()
}

fn main() {}
````

Ztime-passes output

````
time:   0.001; rss:   45MB ->   49MB (   +4MB)	parse_crate
time:   0.004; rss:   53MB ->   69MB (  +16MB)	expand_crate
time:   0.004; rss:   53MB ->   69MB (  +16MB)	macro_expand_crate
error: at least one trait must be specified
 --> /home/matthias/vcs/github/rust6_omni/74/747e8d427cd8043eab8193a8549a36a531ad0563.rs:3:44
  |
3 | pub fn yes_vec_partial_eq_array<A, B>() -> impl
  |                                            ^^^^

time:   0.005; rss:   69MB ->   73MB (   +4MB)	AST_validation
error[E0261]: use of undeclared lifetime name `'a`
  --> /home/matthias/vcs/github/rust6_omni/74/747e8d427cd8043eab8193a8549a36a531ad0563.rs:31:20
   |
27 | pub fn yes_vecdeque_partial_eq_array<A, B>() -> impl PartialEq<B>
   |                                      - help: consider introducing lifetime `'a` here: `'a,`
...
31 |     VecDeque   ::<&'a mut [B; 32]>::new()
   |                    ^^ undeclared lifetime

time:   0.001; rss:   73MB ->   76MB (   +3MB)	late_resolve_crate
time:   0.002; rss:   73MB ->   76MB (   +3MB)	resolve_crate
time:   0.001; rss:   76MB ->   80MB (   +4MB)	misc_checking_1
time:   0.001; rss:   80MB ->   85MB (   +4MB)	wf_checking
error[E0277]: can't compare `&mut [B; 32]` with `B`
  --> /home/matthias/vcs/github/rust6_omni/74/747e8d427cd8043eab8193a8549a36a531ad0563.rs:10:52
   |
10 | pub fn yes_vec_partial_eq_ref_array<'a, A, B>() -> impl PartialEq<&'a [B; 32]>
   |                                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `&mut [B; 32] == B`
   |
   = help: the trait `PartialEq<B>` is not implemented for `&mut [B; 32]`
   = note: required for `Vec<&mut [B; 32]>` to implement `PartialEq<&'a [B; 32]>`
help: consider extending the `where` clause, but there might be an alternative better way to express this requirement
   |
12 |     A: PartialEq<B>, &mut [B; 32]: PartialEq<B>
   |                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

error[E0277]: can't compare `VecDeque<&mut [B; 32]>` with `B`
  --> /home/matthias/vcs/github/rust6_omni/74/747e8d427cd8043eab8193a8549a36a531ad0563.rs:27:49
   |
27 | pub fn yes_vecdeque_partial_eq_array<A, B>() -> impl PartialEq<B>
   |                                                 ^^^^^^^^^^^^^^^^^ no implementation for `VecDeque<&mut [B; 32]> == B`
...
31 |     VecDeque   ::<&'a mut [B; 32]>::new()
   |     ------------------------------------- return type was inferred to be `VecDeque<&mut [B; 32]>` here
   |
   = help: the trait `PartialEq<B>` is not implemented for `VecDeque<&mut [B; 32]>`
help: consider extending the `where` clause, but there might be an alternative better way to express this requirement
   |
29 |     A: PartialEq<B>, VecDeque<&mut [B; 32]>: PartialEq<B>
   |                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

error[E0277]: can't compare `&mut [B; 32]` with `B`
  --> /home/matthias/vcs/github/rust6_omni/74/747e8d427cd8043eab8193a8549a36a531ad0563.rs:34:57
   |
34 | pub fn yes_vecdeque_partial_eq_ref_array<'a, A, B>() -> impl PartialEq<&'a [B; 32]>
   |                                                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `&mut [B; 32] == B`
   |
   = help: the trait `PartialEq<B>` is not implemented for `&mut [B; 32]`
   = note: required for `VecDeque<&mut [B; 32]>` to implement `PartialEq<&'a [B; 32]>`
help: consider extending the `where` clause, but there might be an alternative better way to express this requirement
   |
36 |     A: PartialEq<B>, &mut [B; 32]: PartialEq<B>
   |                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

error[E0277]: can't compare `&mut [B; 32]` with `B`
  --> /home/matthias/vcs/github/rust6_omni/74/747e8d427cd8043eab8193a8549a36a531ad0563.rs:41:61
   |
41 | pub fn yes_vecdeque_partial_eq_ref_mut_array<'a, A, B>() -> impl PartialEq<&'a mut [B; 32]>
   |                                                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `&mut [B; 32] == B`
   |
   = help: the trait `PartialEq<B>` is not implemented for `&mut [B; 32]`
   = note: required for `VecDeque<&mut [B; 32]>` to implement `PartialEq<&'a mut [B; 32]>`
help: consider extending the `where` clause, but there might be an alternative better way to express this requirement
   |
43 |     A: PartialEq<[B; 32]>, &mut [B; 32]: PartialEq<B>
   |                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

time: 120.775; rss:   85MB -> 2445MB (+2360MB)	item_types_checking
error[E0308]: mismatched types
  --> /home/matthias/vcs/github/rust6_omni/74/747e8d427cd8043eab8193a8549a36a531ad0563.rs:22:5
   |
21 | pub fn yes_array_into_box<T>() -> Box<[T]> {
   |                                   -------- expected `Box<[T]>` because of return type
22 |     []
   |     ^^ expected `Box<[T]>`, found `[_; 0]`
   |
   = note: expected struct `Box<[T]>`
               found array `[_; 0]`
   = note: for more on the distinction between the stack and the heap, read https://doc.rust-lang.org/book/ch15-01-box.html, https://doc.rust-lang.org/rust-by-example/std/box.html, and https://doc.rust-lang.org/std/boxed/index.html
help: store this in the heap by calling `Box::new`
   |
22 |     Box::new([])
   |     +++++++++  +

time:   0.007; rss: 2445MB -> 2455MB (  +10MB)	item_bodies_checking
time: 120.784; rss:   80MB -> 2455MB (+2375MB)	type_check_crate
time:   0.093; rss: 2455MB ->  230MB (-2225MB)	free_global_ctxt
error: aborting due to 7 previous errors

Some errors have detailed explanations: E0261, E0277, E0308.
For more information about an error, try `rustc --explain E0261`.
time: 120.907; rss:   35MB ->   97MB (  +63MB)	total
````

rustc keeps crunching on it, probably to get further diagnostics. Also note the almost 2.5 gb of memory needed, probably some recursive blowup? :thinking: