| //@ run-pass |
| // This test case tests whether we can handle code bases that contain a high |
| // number of closures, something that needs special handling in the MingGW |
| // toolchain. |
| // See https://github.com/rust-lang/rust/issues/34793 for more information. |
| |
| // Make sure we don't optimize anything away: |
| //@ compile-flags: -C no-prepopulate-passes -Cpasses=name-anon-globals |
| |
| // Expand something exponentially |
| macro_rules! go_bacterial { |
| ($mac:ident) => ($mac!()); |
| ($mac:ident 1 $($t:tt)*) => ( |
| go_bacterial!($mac $($t)*); |
| go_bacterial!($mac $($t)*); |
| ) |
| } |
| |
| macro_rules! mk_closure { |
| () => ((move || {})()) |
| } |
| |
| macro_rules! mk_fn { |
| () => { |
| { |
| fn function() { |
| // Make 16 closures |
| go_bacterial!(mk_closure 1 1 1 1); |
| } |
| let _ = function(); |
| } |
| } |
| } |
| |
| fn main() { |
| // Make 2^8 functions, each containing 16 closures, |
| // resulting in 2^12 closures overall. |
| go_bacterial!(mk_fn 1 1 1 1 1 1 1 1); |
| } |