diff --git a/collector/benchmarks/README.md b/collector/benchmarks/README.md index 7b9c761e2..f0962e2a0 100644 --- a/collector/benchmarks/README.md +++ b/collector/benchmarks/README.md @@ -90,3 +90,6 @@ programs. behavior](https://github.com/rust-lang/rust/pull/32062) in the past. - **unused-warnings**: Contains many unused imports, which caused [quadratic behavior](https://github.com/rust-lang/rust/issues/43572) in the past. +- **wf-projection-stress-65510**: A stress test which showcases [quadratic + behavior](https://github.com/rust-lang/rust/issues/65510) (in the number of + associated type bounds). diff --git a/collector/benchmarks/wf-projection-stress-65510/Cargo.lock b/collector/benchmarks/wf-projection-stress-65510/Cargo.lock new file mode 100644 index 000000000..0c93d7c23 --- /dev/null +++ b/collector/benchmarks/wf-projection-stress-65510/Cargo.lock @@ -0,0 +1,6 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "wf-projection-stress-65510" +version = "0.1.0" + diff --git a/collector/benchmarks/wf-projection-stress-65510/Cargo.toml b/collector/benchmarks/wf-projection-stress-65510/Cargo.toml new file mode 100644 index 000000000..e571685d7 --- /dev/null +++ b/collector/benchmarks/wf-projection-stress-65510/Cargo.toml @@ -0,0 +1,3 @@ +[package] +name = "wf-projection-stress-65510" +version = "0.1.0" diff --git a/collector/benchmarks/wf-projection-stress-65510/src/lib.rs b/collector/benchmarks/wf-projection-stress-65510/src/lib.rs new file mode 100644 index 000000000..2828f375c --- /dev/null +++ b/collector/benchmarks/wf-projection-stress-65510/src/lib.rs @@ -0,0 +1,36 @@ +macro_rules! stress { + (type $name:ident: $($i:expr,)*) => { + type $name: $(From<[(); $i]> + Into<[(); $i]> +)*; + }; + (fn $($underscore:tt)*) => { + const _: () = { + $({fn _f() { + #[derive(Copy, Clone)] + struct Foo(X); + let $underscore = Foo(T::X::default()).clone(); + }})* + }; + }; +} + +trait Trait { + type X: Copy + Default; + + // The bounds would normally be on many separate + // associated types, but that makes no difference. + stress!(type _Unused: + 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + ); +} + +stress!(fn _ _ _ _ _ _ _ _ _ _);