Open fredlahde opened 2 years ago
Note that this issue is not actually related to #93082, since you can reach the same segfault on stable. Here is a MRE:
use std::io::Write;
fn main() {
let n = 1380;
let open = "impl Trait<Assoc = ".repeat(n);
let close = ">".repeat(n);
let code = format!("
trait Trait {{ type Assoc; }}
impl Trait for () {{ type Assoc = (); }}
fn _f() -> {open}(){close} {{}}
fn main() {{}}
");
std::fs::File::options()
.truncate(true)
.write(true)
.create(true)
.open("./nested_rpit.rs")
.unwrap()
.write(code.as_bytes())
.unwrap();
}
(this generates a file nested_rpit.rs
that segfaults the compiler)
Interestingly, the MRE from @WaffleLapkin only segfaults on stable (1.58.1) but not on nightly (rustc 1.60.0-nightly (bfe156467 2022-01-22)) https://dpaste.com/4AQ2Q3GE6
For nightly you just need a higher n
, like n = 1500
@rustbot label: -I-ICE +I-crash
@WaffleLapkin We don’t need to write code generators, we have macros…
trait Trait {
type Assoc;
}
impl Trait for () {
type Assoc = ();
}
macro_rules! m {
([#$($t:tt)*] [$($open:tt)*] [$($close:tt)*]) => {
m!{[$($t)*][$($open)*$($open)*][$($close)*$($close)*]}
};
([] [$($open:tt)*] [$($close:tt)*]) => {
fn _f() -> $($open)*()$($close)* {}
};
}
m! {[###########][impl Trait<Assoc =][>]}
This issue is tightly bound to this PR (93082), which aims to add the ability to return
impl Fn() -> impl Trait
from a function.I played around with it, and got the idea to test out if there is a limit to how deep we can nest those functions (since the PR also enables
impl Fn() -> impl Fn() -> impl Trait
). It quickly noticed a segfault fromrustc
and was able to determine the exact depth that causes the crash.Code
For generating test files quickly, I wrote a small code generator:
Once compiled, one can call it like this:
./gen <depth>
. Thedepth
argument controls the count of-> impl Fn()
that is emitted. The following listing is an example withdepth
set to 5:If one then tries to compile this with the rustc from the PR at commit 3ed486b37477dde94c87539, the test program compiles successfully.
However, when I set
depth
to 560, I get a segfault.Meta
rustc --version --verbose
:Error output
I got a backtrace from
gdb
:I am not entirely sure, if this is important enough for having it's own issue, since it's so tightly bound to the PR. Feel free to close / move accordingly.