mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-16 21:15:18 +03:00
68 lines
2.2 KiB
Rust
68 lines
2.2 KiB
Rust
//@ 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);
|
|
}
|