//@ test-mir-pass: RemoveUnneededDrops #![feature(custom_mir, core_intrinsics)] use std::intrinsics::mir::*; // EMIT_MIR remove_unneeded_drops.opt.RemoveUnneededDrops.diff #[custom_mir(dialect = "runtime")] fn opt(x: bool) { // CHECK-LABEL: fn opt( // CHECK-NOT: drop( mir! { { Drop(x, ReturnTo(bb1), UnwindUnreachable()) } bb1 = { Return() } } } // EMIT_MIR remove_unneeded_drops.dont_opt.RemoveUnneededDrops.diff #[custom_mir(dialect = "runtime")] fn dont_opt(x: Vec) { // CHECK-LABEL: fn dont_opt( // CHECK: drop( mir! { { Drop(x, ReturnTo(bb1), UnwindUnreachable()) } bb1 = { Return() } } } // EMIT_MIR remove_unneeded_drops.opt_generic_copy.RemoveUnneededDrops.diff #[custom_mir(dialect = "runtime")] fn opt_generic_copy(x: T) { // CHECK-LABEL: fn opt_generic_copy( // CHECK-NOT: drop( mir! { { Drop(x, ReturnTo(bb1), UnwindUnreachable()) } bb1 = { Return() } } } // EMIT_MIR remove_unneeded_drops.cannot_opt_generic.RemoveUnneededDrops.diff // since the pass is not running on monomorphisized code, // we can't (but probably should) optimize this #[custom_mir(dialect = "runtime")] fn cannot_opt_generic(x: T) { // CHECK-LABEL: fn cannot_opt_generic( // CHECK: drop( mir! { { Drop(x, ReturnTo(bb1), UnwindUnreachable()) } bb1 = { Return() } } } fn main() { // CHECK-LABEL: fn main( opt(true); opt_generic_copy(42); cannot_opt_generic(42); dont_opt(vec![true]); }