//@ revisions: RAW OPT //@ compile-flags: -C opt-level=z -C panic=abort //@[RAW] compile-flags: -C no-prepopulate-passes -Z inline-mir #![crate_type = "lib"] // Ensure all the different array drop_glue functions just delegate to the slice one, // rather than emitting two loops in each of the three. // When this test was first written, the array drop glues came out in the // seemingly-arbitrary order of 42, then 7, then 13, so to avoid potential // fragility from that changing we don't check any particular order. // RAW: ; core::ptr::drop_glue::<[array_drop_glue::NeedsDrop; [[N:7|13|42]]]> // RAW-NEXT: inlinehint // RAW: call core::ptr::drop_glue::<[array_drop_glue::NeedsDrop]> // RAW-NEXT: noundef [[N]]) // RAW: } // RAW: ; core::ptr::drop_glue::<[array_drop_glue::NeedsDrop; [[N:7|13|42]]]> // RAW-NEXT: inlinehint // RAW: call core::ptr::drop_glue::<[array_drop_glue::NeedsDrop]> // RAW-NEXT: noundef [[N]]) // RAW: } // RAW: ; core::ptr::drop_glue::<[array_drop_glue::NeedsDrop; [[N:7|13|42]]]> // RAW-NEXT: inlinehint // RAW: call core::ptr::drop_glue::<[array_drop_glue::NeedsDrop]> // RAW-NEXT: noundef [[N]]) // RAW: } // CHECK-LABEL: ; core::ptr::drop_glue::<[array_drop_glue::NeedsDrop]> // CHECK-NOT: inlinehint // OPT: add nuw nsw {{.+}} 1 // CHECK: } #[no_mangle] // CHECK-LABEL: @drop_arrays pub fn drop_arrays(x: [NeedsDrop; 7], y: [NeedsDrop; 13], z: [NeedsDrop; 42]) { // I don't remember the parameter drop order, so write out the order the test expects. // RAW: call core::ptr::drop_glue::<[array_drop_glue::NeedsDrop; 7]> // OPT: call core::ptr::drop_glue::<[array_drop_glue::NeedsDrop]> // OPT-NEXT: noundef 7) drop(x); // RAW: call core::ptr::drop_glue::<[array_drop_glue::NeedsDrop; 13]> // OPT: call core::ptr::drop_glue::<[array_drop_glue::NeedsDrop]> // OPT-NEXT: noundef 13) drop(y); // RAW: call core::ptr::drop_glue::<[array_drop_glue::NeedsDrop; 42]> // OPT: call core::ptr::drop_glue::<[array_drop_glue::NeedsDrop]> // OPT-NEXT: noundef 42) drop(z); } struct NeedsDrop(u32); impl Drop for NeedsDrop { #[inline] fn drop(&mut self) { do_the_drop(self); } } unsafe extern "Rust" { safe fn do_the_drop(_: &mut NeedsDrop); }