mirror of
https://github.com/rust-lang/rust.git
synced 2025-10-02 18:27:37 +00:00
48 lines
1.5 KiB
Rust
48 lines
1.5 KiB
Rust
//! Test that the compiler can handle code bases with a high number of closures.
|
|
//! This is particularly important for the MinGW toolchain which has a limit of
|
|
//! 2^15 weak symbols per binary. This test creates 2^12 closures (256 functions
|
|
//! with 16 closures each) to check the compiler handles this correctly.
|
|
//!
|
|
//! Regression test for <https://github.com/rust-lang/rust/issues/34793>.
|
|
//! See also <https://github.com/rust-lang/rust/pull/34830>.
|
|
|
|
//@ run-pass
|
|
|
|
// Make sure we don't optimize anything away:
|
|
//@ compile-flags: -C no-prepopulate-passes -Cpasses=name-anon-globals
|
|
|
|
/// Macro for exponential expansion - creates 2^n copies of the given macro call
|
|
macro_rules! go_bacterial {
|
|
($mac:ident) => ($mac!());
|
|
($mac:ident 1 $($t:tt)*) => (
|
|
go_bacterial!($mac $($t)*);
|
|
go_bacterial!($mac $($t)*);
|
|
)
|
|
}
|
|
|
|
/// Creates and immediately calls a closure
|
|
macro_rules! create_closure {
|
|
() => {
|
|
(move || {})()
|
|
};
|
|
}
|
|
|
|
/// Creates a function containing 16 closures (2^4)
|
|
macro_rules! create_function_with_closures {
|
|
() => {
|
|
{
|
|
fn function_with_closures() {
|
|
// Create 16 closures using exponential expansion: 2^4 = 16
|
|
go_bacterial!(create_closure 1 1 1 1);
|
|
}
|
|
let _ = function_with_closures();
|
|
}
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
// Create 2^8 = 256 functions, each containing 16 closures,
|
|
// resulting in 2^12 = 4096 closures total.
|
|
go_bacterial!(create_function_with_closures 1 1 1 1 1 1 1 1);
|
|
}
|