| //@ needs-unwind - this test verifies the amount of drop calls when unwinding is used | |
| //@ compile-flags: -C no-prepopulate-passes | |
| #![crate_type = "lib"] | |
| struct SomeUniqueName; | |
| impl Drop for SomeUniqueName { | |
| #[inline(never)] | |
| fn drop(&mut self) {} | |
| } | |
| #[inline(never)] | |
| pub fn possibly_unwinding() {} | |
| // CHECK-LABEL: @droppy | |
| #[no_mangle] | |
| pub fn droppy() { | |
| // Check that there are exactly 6 drop calls. The cleanups for the unwinding should be reused, | |
| // so that's one new drop call per call to possibly_unwinding(), and finally 3 drop calls for | |
| // the regular function exit. We used to have problems with quadratic growths of drop calls in | |
| // such functions. | |
| // FIXME(eddyb) the `void @` forces a match on the instruction, instead of the | |
| // comment, that's `; call core::ptr::drop_in_place::<drop::SomeUniqueName>` | |
| // for the `v0` mangling, should switch to matching on that once `legacy` is gone. | |
| // CHECK-COUNT-6: {{(call|invoke) void @.*}}drop_in_place{{.*}}SomeUniqueName | |
| // CHECK-NOT: {{(call|invoke) void @.*}}drop_in_place{{.*}}SomeUniqueName | |
| // The next line checks for the } that ends the function definition | |
| // CHECK-LABEL: {{^[}]}} | |
| let _s = SomeUniqueName; | |
| possibly_unwinding(); | |
| let _s = SomeUniqueName; | |
| possibly_unwinding(); | |
| let _s = SomeUniqueName; | |
| possibly_unwinding(); | |
| } |