//@ 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::` // 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(); }