diff options
| author | Michael Woerister <michaelwoerister@posteo.net> | 2016-07-12 17:39:08 -0400 |
|---|---|---|
| committer | Michael Woerister <michaelwoerister@posteo.net> | 2016-08-01 04:34:01 -0400 |
| commit | eaea4ac8acbb46395f08b78452bfc758280e1421 (patch) | |
| tree | 7fd613db3e6d0bc663612fe5d92b41d106d955a3 | |
| parent | 59cfe904dcfbe2c3ad5396131b3d3ba6b7179fdd (diff) | |
| download | rust-eaea4ac8acbb46395f08b78452bfc758280e1421.tar.gz rust-eaea4ac8acbb46395f08b78452bfc758280e1421.zip | |
Add test case for large number of closures within one codegen unit
| -rw-r--r-- | src/test/run-pass/myriad-closures.rs | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/test/run-pass/myriad-closures.rs b/src/test/run-pass/myriad-closures.rs new file mode 100644 index 00000000000..d2c9a5d562b --- /dev/null +++ b/src/test/run-pass/myriad-closures.rs @@ -0,0 +1,48 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// 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. + +// 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 { + () => ({ + let c = |a: u32| a + 4; + let _ = c(2); + }) +} + +macro_rules! mk_fn { + () => { + { + fn function() { + // Make 16 closures + go_bacterial!(mk_closure 1 1 1 1); + } + let _ = function(); + } + } +} + +fn main() { + // Make 2^12 functions, each containing 16 closures, + // resulting in 2^16 closures overall. + go_bacterial!(mk_fn 1 1 1 1 1 1 1 1 1 1 1 1); +} |
