mirror of
https://github.com/rust-lang/rust
synced 2024-11-05 20:45:15 +00:00
60 lines
1.2 KiB
Rust
60 lines
1.2 KiB
Rust
//@ build-pass
|
|
//@ ignore-compare-mode-next-solver (hangs)
|
|
|
|
// Closures include captured types twice in a type tree.
|
|
//
|
|
// Wrapping one closure with another leads to doubling
|
|
// the amount of types in the type tree.
|
|
//
|
|
// This test ensures that rust can handle
|
|
// deeply nested type trees with a lot
|
|
// of duplicated subtrees.
|
|
|
|
fn dup(f: impl Fn(i32) -> i32) -> impl Fn(i32) -> i32 {
|
|
move |a| f(a * 2)
|
|
}
|
|
|
|
fn main() {
|
|
let f = |a| a;
|
|
|
|
let f = dup(f);
|
|
let f = dup(f);
|
|
let f = dup(f);
|
|
let f = dup(f);
|
|
let f = dup(f);
|
|
|
|
let f = dup(f);
|
|
let f = dup(f);
|
|
let f = dup(f);
|
|
let f = dup(f);
|
|
let f = dup(f);
|
|
|
|
let f = dup(f);
|
|
let f = dup(f);
|
|
let f = dup(f);
|
|
let f = dup(f);
|
|
let f = dup(f);
|
|
|
|
let f = dup(f);
|
|
let f = dup(f);
|
|
let f = dup(f);
|
|
let f = dup(f);
|
|
let f = dup(f);
|
|
|
|
// Compiler dies around here if it tries
|
|
// to walk the tree exhaustively.
|
|
|
|
let f = dup(f);
|
|
let f = dup(f);
|
|
let f = dup(f);
|
|
let f = dup(f);
|
|
let f = dup(f);
|
|
|
|
let f = dup(f);
|
|
let f = dup(f);
|
|
let f = dup(f);
|
|
let f = dup(f);
|
|
let f = dup(f);
|
|
|
|
println!("Type size was at least {}", f(1));
|
|
}
|