| //! Regression test for https://github.com/rust-lang/rust/issues/41696 | |
| //@ run-pass | |
| #![allow(dead_code)] | |
| #![allow(unused_variables)] | |
| #![recursion_limit = "128"] | |
| // this used to cause exponential code-size blowup during LLVM passes. | |
| #![feature(test)] | |
| extern crate test; | |
| struct MayUnwind; | |
| impl Drop for MayUnwind { | |
| fn drop(&mut self) { | |
| if test::black_box(false) { | |
| panic!() | |
| } | |
| } | |
| } | |
| struct DS<U> { | |
| may_unwind: MayUnwind, | |
| name: String, | |
| next: U, | |
| } | |
| fn add<U>(ds: DS<U>, name: String) -> DS<DS<U>> { | |
| DS { | |
| may_unwind: MayUnwind, | |
| name: "?".to_owned(), | |
| next: ds, | |
| } | |
| } | |
| fn main() { | |
| let deserializers = DS { may_unwind: MayUnwind, name: "?".to_owned(), next: () }; | |
| let deserializers = add(deserializers, "?".to_owned()); | |
| let deserializers = add(deserializers, "?".to_owned()); | |
| let deserializers = add(deserializers, "?".to_owned()); | |
| let deserializers = add(deserializers, "?".to_owned()); | |
| let deserializers = add(deserializers, "?".to_owned()); | |
| let deserializers = add(deserializers, "?".to_owned()); | |
| let deserializers = add(deserializers, "?".to_owned()); // 0.7s | |
| let deserializers = add(deserializers, "?".to_owned()); // 1.3s | |
| let deserializers = add(deserializers, "?".to_owned()); // 2.4s | |
| let deserializers = add(deserializers, "?".to_owned()); // 6.7s | |
| let deserializers = add(deserializers, "?".to_owned()); // 26.0s | |
| let deserializers = add(deserializers, "?".to_owned()); // 114.0s | |
| let deserializers = add(deserializers, "?".to_owned()); // 228.0s | |
| let deserializers = add(deserializers, "?".to_owned()); // 400.0s | |
| let deserializers = add(deserializers, "?".to_owned()); // 800.0s | |
| let deserializers = add(deserializers, "?".to_owned()); // 1600.0s | |
| let deserializers = add(deserializers, "?".to_owned()); // 3200.0s | |
| } |