Skip to content

[ICE]: Panic with recursive type + GAT #107362

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
3 of 4 tasks
douglas-raillard-arm opened this issue Jan 27, 2023 · 7 comments · Fixed by #138599
Closed
3 of 4 tasks

[ICE]: Panic with recursive type + GAT #107362

douglas-raillard-arm opened this issue Jan 27, 2023 · 7 comments · Fixed by #138599
Labels
A-GATs Area: Generic associated types (GATs) C-bug Category: This is a bug. fixed-by-next-solver Fixed by the next-generation trait solver, `-Znext-solver`. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ P-medium Medium priority regression-from-stable-to-stable Performance or correctness regression from one stable version to another. S-bug-has-test Status: This bug is tracked inside the repo by a `known-bug` test. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@douglas-raillard-arm
Copy link

douglas-raillard-arm commented Jan 27, 2023

Code

pub trait Functor
{
    type With<T>: Functor;
}

pub struct IdFunctor<T>(T);
impl<T> Functor for IdFunctor<T> {
    type With<T2> = IdFunctor<T2>;
}

impl<T> Functor for Vec<T> {
    type With<T2> = Vec<T2> ;
}


pub struct Compose<F1, F2, T>(F1::With<F2::With<T>>)
where
    F1: Functor + ?Sized,
    F2: Functor + ?Sized;

impl<F1, F2, T> Functor for Compose<F1, F2, T>
where
    F1: Functor + ?Sized,
    F2: Functor + ?Sized
{
    type With<T2> = F1::With<F2::With<T2>> ;
}

pub enum Value<F>
where
    F: Functor + ?Sized,
{
    SignedInt(*mut F::With<i64>),
    Array(*mut Value<Compose<F, Vec<()>, ()>>),

}

fn main() {
    let x: Value<IdFunctor<()>> = Value::SignedInt(&mut IdFunctor(1));
}

Affected release channels

  • Previous Stable
  • Current Stable
  • Current Beta
  • Current Nightly

Rust Version

Compiled on the playground so here is the info I could gather:

note: rustc 1.69.0-nightly (d7948c843 2023-01-26) running on x86_64-unknown-linux-gnu
note: compiler flags: --crate-type bin -C embed-bitcode=no -C codegen-units=1 -C debuginfo=2
note: some of the compiler flags provided by cargo are hidden

Current error output

 
⣿
Standard Error

   Compiling playground v0.0.1 (/playground)
warning: unused variable: `x`
  --> src/main.rs:39:9
   |
39 |     let x: Value<IdFunctor<()>> = Value::SignedInt(&mut IdFunctor(1));
   |         ^ help: if this is intentional, prefix it with an underscore: `_x`
   |
   = note: `#[warn(unused_variables)]` on by default

thread 'rustc' panicked at 'index out of bounds: the len is 0 but the index is 0', /cargo/registry/src/github.com-1ecc6299db9ec823/ena-0.14.0

[...]

error: internal compiler error: unexpected panic

note: the compiler unexpectedly panicked. this is a bug.

note: we would appreciate a bug report: https://github.com/rust-lang/rust/issues/new?labels=C-bug%2C+I-ICE%2C+T-compiler&template=ice.md

note: rustc 1.69.0-nightly (d7948c843 2023-01-26) running on x86_64-unknown-linux-gnu

note: compiler flags: --crate-type bin -C embed-bitcode=no -C codegen-units=1 -C debuginfo=2

note: some of the compiler flags provided by cargo are hidden

query stack during panic:
#0 [is_sized_raw] computing whether `_` is `Sized`
#1 [layout_of] computing layout of `*mut _`
#2 [layout_of] computing layout of `*mut <Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<IdFunctor<()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()> as Functor>::With<i64>`
#3 [layout_of] computing layout of `Value<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<IdFunctor<()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>, alloc::vec::Vec<()>, ()>>`
end of query stack
warning: `playground` (bin "playground") generated 1 warning (run `cargo fix --bin "playground"` to apply 1 suggestion)
error: could not compile `playground`; 1 warning emitted

Backtrace

Apologies for pastebin, but github rejects issues with more than 65536 char:
https://pastebin.com/jsEBz8MM

Anything else?

replacing this:

    SignedInt(*mut F::With<i64>),
[...]
    let x: Value<IdFunctor<()>> = Value::SignedInt(&mut IdFunctor(1));

By that:

    SignedInt(F::With<i64>),
[...]
    let x: Value<IdFunctor<()>> = Value::SignedInt(IdFunctor(1));

brings a "normal compiler error":

error[[E0275]](https://doc.rust-lang.org/nightly/error-index.html#E0275): overflow evaluating the requirement `Value<Compose<Compose<Compose<Compose<Compose<Compose<..., ..., ...>, ..., ...>, ..., ...>, ..., ...>, ..., ...>, ..., ...>>: Sized`
  |
  = help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`playground`)

Which seems pretty consistent with the error encountered with the pointer:

#0 [is_sized_raw] computing whether `_` is `Sized`
@douglas-raillard-arm douglas-raillard-arm added C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Jan 27, 2023
@douglas-raillard-arm
Copy link
Author

This came up while attempting to craft a Value type used for an interpreter that has a homogeneous array type. Being able to work with a type like that:

pub enum Value<F>
where
    F: Functor,
{
    SignedInt(F::With<i64>),
    Array(Box<Value<Compose<F, Vec<()>, ()>>>),

}

would allow "sharing" the tag between all the values in the array, without needing any unsafe code and without requiring boxing in the non-array case.

The code with pointers was a result of trying to get passed the Sized issue, where rustc is unable to prove that Compose<F1, F2, T> is Sized even when F1 is Sized and essentially Compose<F1, F2, ()> == F1<F2>`

@matthiaskrgr
Copy link
Member

Seems be some kind of overflow while computing layout with -Cdebuginfo=2

@matthiaskrgr matthiaskrgr added the regression-from-stable-to-stable Performance or correctness regression from one stable version to another. label Feb 7, 2023
@rustbot rustbot added the I-prioritize Issue: Indicates that prioritization has been requested for this issue. label Feb 7, 2023
@apiraino
Copy link
Contributor

apiraino commented Feb 9, 2023

WG-prioritization assigning priority (Zulip discussion).

@rustbot label -I-prioritize +P-medium

@rustbot rustbot added P-medium Medium priority and removed I-prioritize Issue: Indicates that prioritization has been requested for this issue. labels Feb 9, 2023
@apiraino

This comment was marked as outdated.

@bjorn3
Copy link
Member

bjorn3 commented Feb 9, 2023

How could that have caused this issue? That was a change in the linkage code, while this crash happens in typeck.

@apiraino
Copy link
Contributor

apiraino commented Feb 9, 2023

Ok, after a second run I'll post a better bisection result.

So, the regression really started in fd815a5 cc @compiler-errors

searched nightlies: from nightly-2022-11-15 to nightly-2022-12-10
regressed nightly: nightly-2022-11-25
searched commit range: 70f8737...b3bc6bf
regressed commit: fd815a5

bisected with cargo-bisect-rustc v0.6.5

Host triple: x86_64-unknown-linux-gnu
Reproduce with:

cargo bisect-rustc --start=2022-11-15 --end=2022-12-10 --script test.sh 

As mentioned before, I could not reproduce in the latest nightly.

thanks @bjorn3 for the tip and sorry about the unneeded mention before!

@matthiaskrgr matthiaskrgr added the fixed-by-next-solver Fixed by the next-generation trait solver, `-Znext-solver`. label Sep 16, 2023
@matthiaskrgr
Copy link
Member

this seems to no longer ice with the next solver

error: failed to get layout for Value<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<IdFunctor<()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>>: unable to determine layout for `*mut <Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<IdFunctor<()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()> as Functor>::With<i64>` because `*mut <Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<Compose<IdFunctor<()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()>, Vec<()>, ()> as Functor>::With<i64>` cannot be normalized

@matthiaskrgr matthiaskrgr added the S-bug-has-test Status: This bug is tracked inside the repo by a `known-bug` test. label Apr 19, 2024
@fmease fmease added the A-GATs Area: Generic associated types (GATs) label Sep 24, 2024
@bors bors closed this as completed in 68b439c Apr 18, 2025
rust-timer added a commit to rust-lang-ci/rust that referenced this issue Apr 18, 2025
Rollup merge of rust-lang#138599 - adwinwhite:recursive-overflow, r=wesleywiser

avoid overflow when generating debuginfo for expanding recursive types

Fixes rust-lang#135093
Fixes rust-lang#121538
Fixes rust-lang#107362
Fixes rust-lang#100618
Fixes rust-lang#115994

The overflow happens because expanding recursive types keep creating new nested types when recurring into sub fields.
I fixed that by returning an empty stub node when expanding recursion is detected.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-GATs Area: Generic associated types (GATs) C-bug Category: This is a bug. fixed-by-next-solver Fixed by the next-generation trait solver, `-Znext-solver`. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ P-medium Medium priority regression-from-stable-to-stable Performance or correctness regression from one stable version to another. S-bug-has-test Status: This bug is tracked inside the repo by a `known-bug` test. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

6 participants