![]() when terminating during unwinding, show the reason why With this, the output on double-panic becomes something like that: ``` thread 'main' panicked at src/tools/miri/tests/fail/panic/double_panic.rs:15:5: first note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace thread 'main' panicked at src/tools/miri/tests/fail/panic/double_panic.rs:10:9: second stack backtrace: 0: 0xbe273a - std::backtrace_rs::backtrace::miri::trace_unsynchronized::<&mut [closure@std::sys_common::backtrace::_print_fmt::{closure#1}]> at /home/r/src/rust/rustc.3/library/std/src/../../backtrace/src/backtrace/miri.rs:99:5 1: 0xbe22e6 - std::backtrace_rs::backtrace::miri::trace::<&mut [closure@std::sys_common::backtrace::_print_fmt::{closure#1}]> at /home/r/src/rust/rustc.3/library/std/src/../../backtrace/src/backtrace/miri.rs:62:14 2: 0xbe1086 - std::backtrace_rs::backtrace::trace_unsynchronized::<[closure@std::sys_common::backtrace::_print_fmt::{closure#1}]> at /home/r/src/rust/rustc.3/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5 3: 0xba3afd - std::sys_common::backtrace::_print_fmt at /home/r/src/rust/rustc.3/library/std/src/sys_common/backtrace.rs:67:5 4: 0xba2471 - <std::sys_common::backtrace::_print::DisplayBacktrace as std::fmt::Display>::fmt at /home/r/src/rust/rustc.3/library/std/src/sys_common/backtrace.rs:44:22 5: 0xbcf754 - core::fmt::rt::Argument::<'_>::fmt at /home/r/src/rust/rustc.3/library/core/src/fmt/rt.rs:138:9 6: 0x9b8f81 - std::fmt::write at /home/r/src/rust/rustc.3/library/core/src/fmt/mod.rs:1094:17 7: 0x21391d - <std::sys::unix::stdio::Stderr as std::io::Write>::write_fmt at /home/r/src/rust/rustc.3/library/std/src/io/mod.rs:1714:15 8: 0xba37b1 - std::sys_common::backtrace::_print at /home/r/src/rust/rustc.3/library/std/src/sys_common/backtrace.rs:47:5 9: 0xba365b - std::sys_common::backtrace::print at /home/r/src/rust/rustc.3/library/std/src/sys_common/backtrace.rs:34:9 10: 0x143c67 - std::panic_hook_with_disk_dump::{closure#1} at /home/r/src/rust/rustc.3/library/std/src/panicking.rs:278:22 11: 0x144187 - std::panic_hook_with_disk_dump at /home/r/src/rust/rustc.3/library/std/src/panicking.rs:312:9 12: 0x143659 - std::panicking::default_hook at /home/r/src/rust/rustc.3/library/std/src/panicking.rs:239:5 13: 0x1482a7 - std::panicking::rust_panic_with_hook at /home/r/src/rust/rustc.3/library/std/src/panicking.rs:729:13 14: 0x1475d5 - std::rt::begin_panic::<&str>::{closure#0} at /home/r/src/rust/rustc.3/library/std/src/panicking.rs:650:9 15: 0xba496a - std::sys_common::backtrace::__rust_end_short_backtrace::<[closure@std::rt::begin_panic<&str>::{closure#0}], !> at /home/r/src/rust/rustc.3/library/std/src/sys_common/backtrace.rs:170:18 16: 0x147599 - std::rt::begin_panic::<&str> at /home/r/src/rust/rustc.3/library/std/src/panicking.rs:649:12 17: 0x31916 - <Foo as std::ops::Drop>::drop at src/tools/miri/tests/fail/panic/double_panic.rs:10:9 18: 0x1a2b5e - std::ptr::drop_in_place::<Foo> - shim(Some(Foo)) at /home/r/src/rust/rustc.3/library/core/src/ptr/mod.rs:497:1 19: 0x202bf - main at src/tools/miri/tests/fail/panic/double_panic.rs:16:1 20: 0xcc6a8 - <fn() as std::ops::FnOnce<()>>::call_once - shim(fn()) at /home/r/src/rust/rustc.3/library/core/src/ops/function.rs:250:5 21: 0xba47d9 - std::sys_common::backtrace::__rust_begin_short_backtrace::<fn(), ()> at /home/r/src/rust/rustc.3/library/std/src/sys_common/backtrace.rs:154:18 22: 0x141a6a - std::rt::lang_start::<()>::{closure#0} at /home/r/src/rust/rustc.3/library/std/src/rt.rs:166:18 23: 0xcca18 - std::ops::function::impls::<impl std::ops::FnOnce<()> for &dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe>::call_once at /home/r/src/rust/rustc.3/library/core/src/ops/function.rs:284:13 24: 0x146469 - std::panicking::try::do_call::<&dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe, i32> at /home/r/src/rust/rustc.3/library/std/src/panicking.rs:524:40 25: 0x145e09 - std::panicking::try::<i32, &dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe> at /home/r/src/rust/rustc.3/library/std/src/panicking.rs:488:19 26: 0x7b0ac - std::panic::catch_unwind::<&dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe, i32> at /home/r/src/rust/rustc.3/library/std/src/panic.rs:142:14 27: 0x14189b - std::rt::lang_start_internal::{closure#2} at /home/r/src/rust/rustc.3/library/std/src/rt.rs:148:48 28: 0x146481 - std::panicking::try::do_call::<[closure@std::rt::lang_start_internal::{closure#2}], isize> at /home/r/src/rust/rustc.3/library/std/src/panicking.rs:524:40 29: 0x145e2c - std::panicking::try::<isize, [closure@std::rt::lang_start_internal::{closure#2}]> at /home/r/src/rust/rustc.3/library/std/src/panicking.rs:488:19 30: 0x7b0d5 - std::panic::catch_unwind::<[closure@std::rt::lang_start_internal::{closure#2}], isize> at /home/r/src/rust/rustc.3/library/std/src/panic.rs:142:14 31: 0x1418b0 - std::rt::lang_start_internal at /home/r/src/rust/rustc.3/library/std/src/rt.rs:148:20 32: 0x141a97 - std::rt::lang_start::<()> at /home/r/src/rust/rustc.3/library/std/src/rt.rs:165:17 thread 'main' panicked at /home/r/src/rust/rustc.3/library/core/src/panicking.rs:126:5: panic in a destructor during cleanup stack backtrace: 0: 0xe9f6d7 - std::backtrace_rs::backtrace::miri::trace_unsynchronized::<&mut [closure@std::sys_common::backtrace::_print_fmt::{closure#1}]> at /home/r/src/rust/rustc.3/library/std/src/../../backtrace/src/backtrace/miri.rs:99:5 1: 0xe9f27d - std::backtrace_rs::backtrace::miri::trace::<&mut [closure@std::sys_common::backtrace::_print_fmt::{closure#1}]> at /home/r/src/rust/rustc.3/library/std/src/../../backtrace/src/backtrace/miri.rs:62:14 2: 0xe9e016 - std::backtrace_rs::backtrace::trace_unsynchronized::<[closure@std::sys_common::backtrace::_print_fmt::{closure#1}]> at /home/r/src/rust/rustc.3/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5 3: 0xba3afd - std::sys_common::backtrace::_print_fmt at /home/r/src/rust/rustc.3/library/std/src/sys_common/backtrace.rs:67:5 4: 0xba2471 - <std::sys_common::backtrace::_print::DisplayBacktrace as std::fmt::Display>::fmt at /home/r/src/rust/rustc.3/library/std/src/sys_common/backtrace.rs:44:22 5: 0xbcf754 - core::fmt::rt::Argument::<'_>::fmt at /home/r/src/rust/rustc.3/library/core/src/fmt/rt.rs:138:9 6: 0x9b8f81 - std::fmt::write at /home/r/src/rust/rustc.3/library/core/src/fmt/mod.rs:1094:17 7: 0x4d0895 - <std::sys::unix::stdio::Stderr as std::io::Write>::write_fmt at /home/r/src/rust/rustc.3/library/std/src/io/mod.rs:1714:15 8: 0xba37b1 - std::sys_common::backtrace::_print at /home/r/src/rust/rustc.3/library/std/src/sys_common/backtrace.rs:47:5 9: 0xba365b - std::sys_common::backtrace::print at /home/r/src/rust/rustc.3/library/std/src/sys_common/backtrace.rs:34:9 10: 0x400bd4 - std::panic_hook_with_disk_dump::{closure#1} at /home/r/src/rust/rustc.3/library/std/src/panicking.rs:278:22 11: 0x144187 - std::panic_hook_with_disk_dump at /home/r/src/rust/rustc.3/library/std/src/panicking.rs:312:9 12: 0x143659 - std::panicking::default_hook at /home/r/src/rust/rustc.3/library/std/src/panicking.rs:239:5 13: 0x1482a7 - std::panicking::rust_panic_with_hook at /home/r/src/rust/rustc.3/library/std/src/panicking.rs:729:13 14: 0x40403b - std::panicking::begin_panic_handler::{closure#0} at /home/r/src/rust/rustc.3/library/std/src/panicking.rs:619:13 15: 0xe618b3 - std::sys_common::backtrace::__rust_end_short_backtrace::<[closure@std::panicking::begin_panic_handler::{closure#0}], !> at /home/r/src/rust/rustc.3/library/std/src/sys_common/backtrace.rs:170:18 16: 0x403fc8 - std::panicking::begin_panic_handler at /home/r/src/rust/rustc.3/library/std/src/panicking.rs:617:5 17: 0xee23e9 - core::panicking::panic_nounwind_fmt at /home/r/src/rust/rustc.3/library/core/src/panicking.rs:96:14 18: 0xee29e6 - core::panicking::panic_nounwind at /home/r/src/rust/rustc.3/library/core/src/panicking.rs:126:5 19: 0xee365e - core::panicking::panic_in_cleanup at /home/r/src/rust/rustc.3/library/core/src/panicking.rs:206:5 20: 0x2028a - main at src/tools/miri/tests/fail/panic/double_panic.rs:13:1 21: 0x3895ee - <fn() as std::ops::FnOnce<()>>::call_once - shim(fn()) at /home/r/src/rust/rustc.3/library/core/src/ops/function.rs:250:5 22: 0xe61725 - std::sys_common::backtrace::__rust_begin_short_backtrace::<fn(), ()> at /home/r/src/rust/rustc.3/library/std/src/sys_common/backtrace.rs:154:18 23: 0x3fe9aa - std::rt::lang_start::<()>::{closure#0} at /home/r/src/rust/rustc.3/library/std/src/rt.rs:166:18 24: 0x389962 - std::ops::function::impls::<impl std::ops::FnOnce<()> for &dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe>::call_once at /home/r/src/rust/rustc.3/library/core/src/ops/function.rs:284:13 25: 0x4033b9 - std::panicking::try::do_call::<&dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe, i32> at /home/r/src/rust/rustc.3/library/std/src/panicking.rs:524:40 26: 0x402d58 - std::panicking::try::<i32, &dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe> at /home/r/src/rust/rustc.3/library/std/src/panicking.rs:488:19 27: 0x337ff7 - std::panic::catch_unwind::<&dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe, i32> at /home/r/src/rust/rustc.3/library/std/src/panic.rs:142:14 28: 0x3fe7e7 - std::rt::lang_start_internal::{closure#2} at /home/r/src/rust/rustc.3/library/std/src/rt.rs:148:48 29: 0x4033d6 - std::panicking::try::do_call::<[closure@std::rt::lang_start_internal::{closure#2}], isize> at /home/r/src/rust/rustc.3/library/std/src/panicking.rs:524:40 30: 0x402d7f - std::panicking::try::<isize, [closure@std::rt::lang_start_internal::{closure#2}]> at /home/r/src/rust/rustc.3/library/std/src/panicking.rs:488:19 31: 0x338028 - std::panic::catch_unwind::<[closure@std::rt::lang_start_internal::{closure#2}], isize> at /home/r/src/rust/rustc.3/library/std/src/panic.rs:142:14 32: 0x1418b0 - std::rt::lang_start_internal at /home/r/src/rust/rustc.3/library/std/src/rt.rs:148:20 33: 0x3fe9dc - std::rt::lang_start::<()> at /home/r/src/rust/rustc.3/library/std/src/rt.rs:165:17 thread caused non-unwinding panic. aborting. ``` If we also land https://github.com/rust-lang/rust/pull/115020, the 2nd backtrace disappears, hopefully making the "panic in a destructor during cleanup" easier to see. Fixes https://github.com/rust-lang/rust/issues/114954. |
||
---|---|---|
.. | ||
building | ||
const_prop | ||
copy-prop | ||
dataflow-const-prop | ||
dead-store-elimination | ||
deref-patterns | ||
dest-prop | ||
inline | ||
issues | ||
nll | ||
pre-codegen | ||
sroa | ||
address_of.address_of_reborrow.SimplifyCfg-initial.after.mir | ||
address_of.borrow_and_cast.SimplifyCfg-initial.after.mir | ||
address_of.rs | ||
array_index_is_temporary.main.SimplifyCfg-elaborate-drops.after.panic-abort.mir | ||
array_index_is_temporary.main.SimplifyCfg-elaborate-drops.after.panic-unwind.mir | ||
array_index_is_temporary.rs | ||
asm_unwind_panic_abort.main.AbortUnwindingCalls.after.mir | ||
asm_unwind_panic_abort.rs | ||
basic_assignment.main.ElaborateDrops.diff | ||
basic_assignment.main.SimplifyCfg-initial.after.mir | ||
basic_assignment.rs | ||
bool_compare.opt1.InstSimplify.diff | ||
bool_compare.opt2.InstSimplify.diff | ||
bool_compare.opt3.InstSimplify.diff | ||
bool_compare.opt4.InstSimplify.diff | ||
bool_compare.rs | ||
box_expr.main.ElaborateDrops.before.panic-abort.mir | ||
box_expr.main.ElaborateDrops.before.panic-unwind.mir | ||
box_expr.rs | ||
byte_slice.main.SimplifyCfg-elaborate-drops.after.mir | ||
byte_slice.rs | ||
casts.redundant.InstSimplify.diff | ||
casts.redundant.PreCodegen.after.mir | ||
casts.roundtrip.PreCodegen.after.mir | ||
casts.rs | ||
combine_array_len.norm2.InstSimplify.panic-abort.diff | ||
combine_array_len.norm2.InstSimplify.panic-unwind.diff | ||
combine_array_len.rs | ||
combine_clone_of_primitives.{impl#0}-clone.InstSimplify.panic-abort.diff | ||
combine_clone_of_primitives.{impl#0}-clone.InstSimplify.panic-unwind.diff | ||
combine_clone_of_primitives.rs | ||
combine_transmutes.adt_transmutes.InstSimplify.diff | ||
combine_transmutes.identity_transmutes.InstSimplify.diff | ||
combine_transmutes.integer_transmutes.InstSimplify.diff | ||
combine_transmutes.rs | ||
const_allocation2.main.ConstProp.after.32bit.mir | ||
const_allocation2.main.ConstProp.after.64bit.mir | ||
const_allocation2.rs | ||
const_allocation3.main.ConstProp.after.32bit.mir | ||
const_allocation3.main.ConstProp.after.64bit.mir | ||
const_allocation3.rs | ||
const_allocation.main.ConstProp.after.32bit.mir | ||
const_allocation.main.ConstProp.after.64bit.mir | ||
const_allocation.rs | ||
const_debuginfo.main.ConstDebugInfo.diff | ||
const_debuginfo.rs | ||
const_goto_const_eval_fail.f.ConstGoto.diff | ||
const_goto_const_eval_fail.rs | ||
const_goto_storage.match_nested_if.ConstGoto.diff | ||
const_goto_storage.rs | ||
const_goto.issue_77355_opt.ConstGoto.diff | ||
const_goto.rs | ||
const_promotion_extern_static.BAR-promoted[0].SimplifyCfg-elaborate-drops.after.mir | ||
const_promotion_extern_static.BAR.PromoteTemps.diff | ||
const_promotion_extern_static.BOP.built.after.mir | ||
const_promotion_extern_static.FOO-promoted[0].SimplifyCfg-elaborate-drops.after.mir | ||
const_promotion_extern_static.FOO.PromoteTemps.diff | ||
const_promotion_extern_static.rs | ||
const_prop_miscompile.bar.ConstProp.diff | ||
const_prop_miscompile.foo.ConstProp.diff | ||
const_prop_miscompile.rs | ||
coverage_graphviz.bar.InstrumentCoverage.0.dot | ||
coverage_graphviz.main.InstrumentCoverage.0.dot | ||
coverage_graphviz.rs | ||
deduplicate_blocks.is_line_doc_comment_2.DeduplicateBlocks.panic-abort.diff | ||
deduplicate_blocks.is_line_doc_comment_2.DeduplicateBlocks.panic-unwind.diff | ||
deduplicate_blocks.rs | ||
derefer_complex_case.main.Derefer.panic-abort.diff | ||
derefer_complex_case.main.Derefer.panic-unwind.diff | ||
derefer_complex_case.rs | ||
derefer_inline_test.main.Derefer.panic-abort.diff | ||
derefer_inline_test.main.Derefer.panic-unwind.diff | ||
derefer_inline_test.rs | ||
derefer_terminator_test.main.Derefer.panic-abort.diff | ||
derefer_terminator_test.main.Derefer.panic-unwind.diff | ||
derefer_terminator_test.rs | ||
derefer_test_multiple.main.Derefer.diff | ||
derefer_test_multiple.rs | ||
derefer_test.main.Derefer.diff | ||
derefer_test.rs | ||
dont_yeet_assert.generic.InstSimplify.diff | ||
dont_yeet_assert.rs | ||
early_otherwise_branch_3_element_tuple.opt1.EarlyOtherwiseBranch.diff | ||
early_otherwise_branch_3_element_tuple.rs | ||
early_otherwise_branch_68867.rs | ||
early_otherwise_branch_68867.try_sum.EarlyOtherwiseBranch.diff | ||
early_otherwise_branch_noopt.noopt1.EarlyOtherwiseBranch.diff | ||
early_otherwise_branch_noopt.rs | ||
early_otherwise_branch_soundness.no_deref_ptr.EarlyOtherwiseBranch.diff | ||
early_otherwise_branch_soundness.no_downcast.EarlyOtherwiseBranch.diff | ||
early_otherwise_branch_soundness.rs | ||
early_otherwise_branch.opt1.EarlyOtherwiseBranch.diff | ||
early_otherwise_branch.opt2.EarlyOtherwiseBranch.diff | ||
early_otherwise_branch.opt3.EarlyOtherwiseBranch.diff | ||
early_otherwise_branch.rs | ||
enum_opt.cand.EnumSizeOpt.32bit.diff | ||
enum_opt.cand.EnumSizeOpt.64bit.diff | ||
enum_opt.invalid.EnumSizeOpt.32bit.diff | ||
enum_opt.invalid.EnumSizeOpt.64bit.diff | ||
enum_opt.rs | ||
enum_opt.trunc.EnumSizeOpt.32bit.diff | ||
enum_opt.trunc.EnumSizeOpt.64bit.diff | ||
enum_opt.unin.EnumSizeOpt.32bit.diff | ||
enum_opt.unin.EnumSizeOpt.64bit.diff | ||
equal_true.opt.InstSimplify.diff | ||
equal_true.rs | ||
exponential_or.match_tuple.SimplifyCfg-initial.after.mir | ||
exponential_or.rs | ||
fn_ptr_shim.core.ops-function-Fn-call.AddMovesForPackedDrops.before.mir | ||
fn_ptr_shim.rs | ||
funky_arms.float_to_exponential_common.ConstProp.panic-abort.diff | ||
funky_arms.float_to_exponential_common.ConstProp.panic-unwind.diff | ||
funky_arms.rs | ||
generator_drop_cleanup.main-{closure#0}.generator_drop.0.panic-abort.mir | ||
generator_drop_cleanup.main-{closure#0}.generator_drop.0.panic-unwind.mir | ||
generator_drop_cleanup.rs | ||
generator_storage_dead_unwind.main-{closure#0}.StateTransform.before.panic-abort.mir | ||
generator_storage_dead_unwind.main-{closure#0}.StateTransform.before.panic-unwind.mir | ||
generator_storage_dead_unwind.rs | ||
generator_tiny.main-{closure#0}.generator_resume.0.mir | ||
generator_tiny.rs | ||
graphviz.main.built.after.dot | ||
graphviz.rs | ||
if_condition_int.dont_opt_bool.SimplifyComparisonIntegral.diff | ||
if_condition_int.dont_opt_floats.SimplifyComparisonIntegral.diff | ||
if_condition_int.dont_remove_comparison.SimplifyComparisonIntegral.diff | ||
if_condition_int.opt_char.SimplifyComparisonIntegral.diff | ||
if_condition_int.opt_i8.SimplifyComparisonIntegral.diff | ||
if_condition_int.opt_multiple_ifs.SimplifyComparisonIntegral.diff | ||
if_condition_int.opt_negative.SimplifyComparisonIntegral.diff | ||
if_condition_int.opt_u32.SimplifyComparisonIntegral.diff | ||
if_condition_int.rs | ||
instrument_coverage.bar.InstrumentCoverage.diff | ||
instrument_coverage.main.InstrumentCoverage.diff | ||
instrument_coverage.rs | ||
instsimplify_duplicate_switch_targets.assert_zero.InstSimplify.diff | ||
instsimplify_duplicate_switch_targets.rs | ||
intrinsic_asserts.generic.InstSimplify.diff | ||
intrinsic_asserts.panics.InstSimplify.diff | ||
intrinsic_asserts.removable.InstSimplify.diff | ||
intrinsic_asserts.rs | ||
issue_38669.main.SimplifyCfg-initial.after.mir | ||
issue_38669.rs | ||
issue_41110.main.ElaborateDrops.panic-abort.diff | ||
issue_41110.main.ElaborateDrops.panic-unwind.diff | ||
issue_41110.rs | ||
issue_41110.test.ElaborateDrops.panic-abort.diff | ||
issue_41110.test.ElaborateDrops.panic-unwind.diff | ||
issue_41697.{impl#0}-{constant#0}.SimplifyCfg-promote-consts.after.mir | ||
issue_41697.rs | ||
issue_41888.main.ElaborateDrops.panic-abort.diff | ||
issue_41888.main.ElaborateDrops.panic-unwind.diff | ||
issue_41888.rs | ||
issue_62289.rs | ||
issue_62289.test.ElaborateDrops.before.panic-abort.mir | ||
issue_62289.test.ElaborateDrops.before.panic-unwind.mir | ||
issue_72181_1.f.built.after.mir | ||
issue_72181_1.main.built.after.mir | ||
issue_72181_1.rs | ||
issue_72181.bar.built.after.mir | ||
issue_72181.foo.built.after.mir | ||
issue_72181.main.built.after.mir | ||
issue_72181.rs | ||
issue_76432.rs | ||
issue_76432.test.SimplifyComparisonIntegral.panic-abort.diff | ||
issue_76432.test.SimplifyComparisonIntegral.panic-unwind.diff | ||
issue_78192.f.InstSimplify.diff | ||
issue_78192.rs | ||
issue_91633.bar.built.after.mir | ||
issue_91633.foo.built.after.mir | ||
issue_91633.fun.built.after.mir | ||
issue_91633.hey.built.after.mir | ||
issue_91633.rs | ||
issue_99325.main.built.after.mir | ||
issue_99325.rs | ||
issue_101973.inner.ConstProp.panic-abort.diff | ||
issue_101973.inner.ConstProp.panic-unwind.diff | ||
issue_101973.rs | ||
issue_104451_unwindable_intrinsics.main.AbortUnwindingCalls.after.panic-abort.mir | ||
issue_104451_unwindable_intrinsics.main.AbortUnwindingCalls.after.panic-unwind.mir | ||
issue_104451_unwindable_intrinsics.rs | ||
loop_test.main.SimplifyCfg-promote-consts.after.mir | ||
loop_test.rs | ||
lower_array_len.array_bound_mut.NormalizeArrayLen.panic-abort.diff | ||
lower_array_len.array_bound_mut.NormalizeArrayLen.panic-unwind.diff | ||
lower_array_len.array_bound.NormalizeArrayLen.panic-abort.diff | ||
lower_array_len.array_bound.NormalizeArrayLen.panic-unwind.diff | ||
lower_array_len.array_len_by_value.NormalizeArrayLen.panic-abort.diff | ||
lower_array_len.array_len_by_value.NormalizeArrayLen.panic-unwind.diff | ||
lower_array_len.array_len_raw.NormalizeArrayLen.panic-abort.diff | ||
lower_array_len.array_len_raw.NormalizeArrayLen.panic-unwind.diff | ||
lower_array_len.array_len_reborrow.NormalizeArrayLen.panic-abort.diff | ||
lower_array_len.array_len_reborrow.NormalizeArrayLen.panic-unwind.diff | ||
lower_array_len.array_len.NormalizeArrayLen.panic-abort.diff | ||
lower_array_len.array_len.NormalizeArrayLen.panic-unwind.diff | ||
lower_array_len.rs | ||
lower_intrinsics.align_of.LowerIntrinsics.panic-abort.diff | ||
lower_intrinsics.align_of.LowerIntrinsics.panic-unwind.diff | ||
lower_intrinsics.assume.LowerIntrinsics.panic-abort.diff | ||
lower_intrinsics.assume.LowerIntrinsics.panic-unwind.diff | ||
lower_intrinsics.discriminant.LowerIntrinsics.panic-abort.diff | ||
lower_intrinsics.discriminant.LowerIntrinsics.panic-unwind.diff | ||
lower_intrinsics.f_copy_nonoverlapping.LowerIntrinsics.panic-abort.diff | ||
lower_intrinsics.f_copy_nonoverlapping.LowerIntrinsics.panic-unwind.diff | ||
lower_intrinsics.forget.LowerIntrinsics.panic-abort.diff | ||
lower_intrinsics.forget.LowerIntrinsics.panic-unwind.diff | ||
lower_intrinsics.non_const.LowerIntrinsics.panic-abort.diff | ||
lower_intrinsics.non_const.LowerIntrinsics.panic-unwind.diff | ||
lower_intrinsics.option_payload.LowerIntrinsics.panic-abort.diff | ||
lower_intrinsics.option_payload.LowerIntrinsics.panic-unwind.diff | ||
lower_intrinsics.ptr_offset.LowerIntrinsics.panic-abort.diff | ||
lower_intrinsics.ptr_offset.LowerIntrinsics.panic-unwind.diff | ||
lower_intrinsics.read_via_copy_primitive.LowerIntrinsics.panic-abort.diff | ||
lower_intrinsics.read_via_copy_primitive.LowerIntrinsics.panic-unwind.diff | ||
lower_intrinsics.read_via_copy_uninhabited.LowerIntrinsics.panic-abort.diff | ||
lower_intrinsics.read_via_copy_uninhabited.LowerIntrinsics.panic-unwind.diff | ||
lower_intrinsics.rs | ||
lower_intrinsics.size_of.LowerIntrinsics.panic-abort.diff | ||
lower_intrinsics.size_of.LowerIntrinsics.panic-unwind.diff | ||
lower_intrinsics.transmute_inhabited.LowerIntrinsics.panic-abort.diff | ||
lower_intrinsics.transmute_inhabited.LowerIntrinsics.panic-unwind.diff | ||
lower_intrinsics.transmute_ref_dst.LowerIntrinsics.panic-abort.diff | ||
lower_intrinsics.transmute_ref_dst.LowerIntrinsics.panic-unwind.diff | ||
lower_intrinsics.transmute_to_box_uninhabited.LowerIntrinsics.panic-abort.diff | ||
lower_intrinsics.transmute_to_box_uninhabited.LowerIntrinsics.panic-unwind.diff | ||
lower_intrinsics.transmute_to_mut_uninhabited.LowerIntrinsics.panic-abort.diff | ||
lower_intrinsics.transmute_to_mut_uninhabited.LowerIntrinsics.panic-unwind.diff | ||
lower_intrinsics.transmute_to_ref_uninhabited.LowerIntrinsics.panic-abort.diff | ||
lower_intrinsics.transmute_to_ref_uninhabited.LowerIntrinsics.panic-unwind.diff | ||
lower_intrinsics.transmute_uninhabited.LowerIntrinsics.panic-abort.diff | ||
lower_intrinsics.transmute_uninhabited.LowerIntrinsics.panic-unwind.diff | ||
lower_intrinsics.unchecked.LowerIntrinsics.panic-abort.diff | ||
lower_intrinsics.unchecked.LowerIntrinsics.panic-unwind.diff | ||
lower_intrinsics.unreachable.LowerIntrinsics.panic-abort.diff | ||
lower_intrinsics.unreachable.LowerIntrinsics.panic-unwind.diff | ||
lower_intrinsics.with_overflow.LowerIntrinsics.panic-abort.diff | ||
lower_intrinsics.with_overflow.LowerIntrinsics.panic-unwind.diff | ||
lower_intrinsics.wrapping.LowerIntrinsics.panic-abort.diff | ||
lower_intrinsics.wrapping.LowerIntrinsics.panic-unwind.diff | ||
lower_intrinsics.write_via_move_string.LowerIntrinsics.panic-abort.diff | ||
lower_intrinsics.write_via_move_string.LowerIntrinsics.panic-unwind.diff | ||
lower_slice_len.bound.LowerSliceLenCalls.panic-abort.diff | ||
lower_slice_len.bound.LowerSliceLenCalls.panic-unwind.diff | ||
lower_slice_len.rs | ||
match_arm_scopes.complicated_match.panic-abort.SimplifyCfg-initial.after-ElaborateDrops.after.diff | ||
match_arm_scopes.complicated_match.panic-unwind.SimplifyCfg-initial.after-ElaborateDrops.after.diff | ||
match_arm_scopes.rs | ||
match_test.main.SimplifyCfg-initial.after.mir | ||
match_test.rs | ||
matches_reduce_branches.bar.MatchBranchSimplification.diff | ||
matches_reduce_branches.foo.MatchBranchSimplification.diff | ||
matches_reduce_branches.match_nested_if.MatchBranchSimplification.diff | ||
matches_reduce_branches.rs | ||
matches_u8.exhaustive_match_i8.MatchBranchSimplification.diff | ||
matches_u8.exhaustive_match.MatchBranchSimplification.diff | ||
matches_u8.rs | ||
multiple_return_terminators.rs | ||
multiple_return_terminators.test.MultipleReturnTerminators.diff | ||
no_drop_for_inactive_variant.rs | ||
no_drop_for_inactive_variant.unwrap.SimplifyCfg-elaborate-drops.after.panic-abort.mir | ||
no_drop_for_inactive_variant.unwrap.SimplifyCfg-elaborate-drops.after.panic-unwind.mir | ||
no_spurious_drop_after_call.main.ElaborateDrops.before.panic-abort.mir | ||
no_spurious_drop_after_call.main.ElaborateDrops.before.panic-unwind.mir | ||
no_spurious_drop_after_call.rs | ||
not_equal_false.opt.InstSimplify.diff | ||
not_equal_false.rs | ||
nrvo_miscompile_111005.rs | ||
nrvo_miscompile_111005.wrong.RenameReturnPlace.diff | ||
nrvo_simple.nrvo.RenameReturnPlace.panic-abort.diff | ||
nrvo_simple.nrvo.RenameReturnPlace.panic-unwind.diff | ||
nrvo_simple.rs | ||
packed_struct_drop_aligned.main.SimplifyCfg-elaborate-drops.after.panic-abort.mir | ||
packed_struct_drop_aligned.main.SimplifyCfg-elaborate-drops.after.panic-unwind.mir | ||
packed_struct_drop_aligned.rs | ||
README.md | ||
reference_prop.debuginfo.ReferencePropagation.diff | ||
reference_prop.dominate_storage.ReferencePropagation.diff | ||
reference_prop.maybe_dead.ReferencePropagation.diff | ||
reference_prop.multiple_storage.ReferencePropagation.diff | ||
reference_prop.mut_raw_then_mut_shr.ReferencePropagation.diff | ||
reference_prop.read_through_raw.ReferencePropagation.diff | ||
reference_prop.reference_propagation_const_ptr.ReferencePropagation.diff | ||
reference_prop.reference_propagation_mut_ptr.ReferencePropagation.diff | ||
reference_prop.reference_propagation_mut.ReferencePropagation.diff | ||
reference_prop.reference_propagation.ReferencePropagation.diff | ||
reference_prop.rs | ||
reference_prop.unique_with_copies.ReferencePropagation.diff | ||
remove_fake_borrows.match_guard.CleanupPostBorrowck.panic-abort.diff | ||
remove_fake_borrows.match_guard.CleanupPostBorrowck.panic-unwind.diff | ||
remove_fake_borrows.rs | ||
remove_never_const.no_codegen.PreCodegen.after.mir | ||
remove_never_const.rs | ||
remove_storage_markers.main.RemoveStorageMarkers.panic-abort.diff | ||
remove_storage_markers.main.RemoveStorageMarkers.panic-unwind.diff | ||
remove_storage_markers.rs | ||
remove_unneeded_drops.cannot_opt_generic.RemoveUnneededDrops.panic-abort.diff | ||
remove_unneeded_drops.cannot_opt_generic.RemoveUnneededDrops.panic-unwind.diff | ||
remove_unneeded_drops.dont_opt.RemoveUnneededDrops.panic-abort.diff | ||
remove_unneeded_drops.dont_opt.RemoveUnneededDrops.panic-unwind.diff | ||
remove_unneeded_drops.opt_generic_copy.RemoveUnneededDrops.panic-abort.diff | ||
remove_unneeded_drops.opt_generic_copy.RemoveUnneededDrops.panic-unwind.diff | ||
remove_unneeded_drops.opt.RemoveUnneededDrops.panic-abort.diff | ||
remove_unneeded_drops.opt.RemoveUnneededDrops.panic-unwind.diff | ||
remove_unneeded_drops.rs | ||
remove_zsts.get_union.PreCodegen.after.mir | ||
remove_zsts.get_union.RemoveZsts.diff | ||
remove_zsts.rs | ||
retag.{impl#0}-foo_shr.SimplifyCfg-elaborate-drops.after.panic-abort.mir | ||
retag.{impl#0}-foo_shr.SimplifyCfg-elaborate-drops.after.panic-unwind.mir | ||
retag.{impl#0}-foo.SimplifyCfg-elaborate-drops.after.panic-abort.mir | ||
retag.{impl#0}-foo.SimplifyCfg-elaborate-drops.after.panic-unwind.mir | ||
retag.array_casts.SimplifyCfg-elaborate-drops.after.panic-abort.mir | ||
retag.array_casts.SimplifyCfg-elaborate-drops.after.panic-unwind.mir | ||
retag.core.ptr-drop_in_place.Test.SimplifyCfg-make_shim.after.panic-abort.mir | ||
retag.core.ptr-drop_in_place.Test.SimplifyCfg-make_shim.after.panic-unwind.mir | ||
retag.main-{closure#0}.SimplifyCfg-elaborate-drops.after.panic-abort.mir | ||
retag.main-{closure#0}.SimplifyCfg-elaborate-drops.after.panic-unwind.mir | ||
retag.main.SimplifyCfg-elaborate-drops.after.panic-abort.mir | ||
retag.main.SimplifyCfg-elaborate-drops.after.panic-unwind.mir | ||
retag.rs | ||
return_an_array.rs | ||
separate_const_switch.identity.SeparateConstSwitch.diff | ||
separate_const_switch.rs | ||
separate_const_switch.too_complex.SeparateConstSwitch.diff | ||
simplify_arm_identity.rs | ||
simplify_arm.id_try.SimplifyArmIdentity.diff | ||
simplify_arm.id_try.SimplifyBranchSame.diff | ||
simplify_arm.rs | ||
simplify_cfg.main.SimplifyCfg-early-opt.diff | ||
simplify_cfg.main.SimplifyCfg-initial.diff | ||
simplify_cfg.rs | ||
simplify_duplicate_unreachable_blocks.assert_nonzero_nonmax.SimplifyCfg-after-uninhabited-enum-branching.diff | ||
simplify_duplicate_unreachable_blocks.rs | ||
simplify_if.main.SimplifyConstCondition-after-const-prop.panic-abort.diff | ||
simplify_if.main.SimplifyConstCondition-after-const-prop.panic-unwind.diff | ||
simplify_if.rs | ||
simplify_locals_fixedpoint.foo.SimplifyLocals-final.panic-abort.diff | ||
simplify_locals_fixedpoint.foo.SimplifyLocals-final.panic-unwind.diff | ||
simplify_locals_fixedpoint.rs | ||
simplify_locals_removes_unused_consts.main.SimplifyLocals-before-const-prop.panic-abort.diff | ||
simplify_locals_removes_unused_consts.main.SimplifyLocals-before-const-prop.panic-unwind.diff | ||
simplify_locals_removes_unused_consts.rs | ||
simplify_locals_removes_unused_discriminant_reads.map.SimplifyLocals-before-const-prop.diff | ||
simplify_locals_removes_unused_discriminant_reads.rs | ||
simplify_locals.c.SimplifyLocals-before-const-prop.diff | ||
simplify_locals.d1.SimplifyLocals-before-const-prop.diff | ||
simplify_locals.d2.SimplifyLocals-before-const-prop.diff | ||
simplify_locals.expose_addr.SimplifyLocals-before-const-prop.diff | ||
simplify_locals.r.SimplifyLocals-before-const-prop.diff | ||
simplify_locals.rs | ||
simplify_locals.t1.SimplifyLocals-before-const-prop.diff | ||
simplify_locals.t2.SimplifyLocals-before-const-prop.diff | ||
simplify_locals.t3.SimplifyLocals-before-const-prop.diff | ||
simplify_locals.t4.SimplifyLocals-before-const-prop.diff | ||
simplify_match.main.ConstProp.panic-abort.diff | ||
simplify_match.main.ConstProp.panic-unwind.diff | ||
simplify_match.rs | ||
simplify_try_if_let.{impl#0}-append.SimplifyArmIdentity.diff | ||
simplify_try_if_let.rs | ||
slice_drop_shim.core.ptr-drop_in_place.[String].AddMovesForPackedDrops.before.mir | ||
slice_drop_shim.rs | ||
spanview_block.main.built.after.html | ||
spanview_block.rs | ||
spanview_statement.main.built.after.html | ||
spanview_statement.rs | ||
spanview_terminator.main.built.after.html | ||
spanview_terminator.rs | ||
storage_ranges.main.nll.0.mir | ||
storage_ranges.rs | ||
switch_to_self.rs | ||
switch_to_self.test.MatchBranchSimplification.diff | ||
tls_access.main.PreCodegen.after.mir | ||
tls_access.rs | ||
uninhabited_enum_branching2.main.SimplifyCfg-after-uninhabited-enum-branching.after.mir | ||
uninhabited_enum_branching2.main.UninhabitedEnumBranching.diff | ||
uninhabited_enum_branching2.rs | ||
uninhabited_enum_branching.main.SimplifyCfg-after-uninhabited-enum-branching.after.mir | ||
uninhabited_enum_branching.main.UninhabitedEnumBranching.diff | ||
uninhabited_enum_branching.rs | ||
uninhabited_enum.process_never.SimplifyLocals-final.after.mir | ||
uninhabited_enum.process_void.SimplifyLocals-final.after.mir | ||
uninhabited_enum.rs | ||
uninhabited_fallthrough_elimination.eliminate_fallthrough.UninhabitedEnumBranching.diff | ||
uninhabited_fallthrough_elimination.keep_fallthrough.UninhabitedEnumBranching.diff | ||
uninhabited_fallthrough_elimination.rs | ||
unreachable_diverging.main.UnreachablePropagation.panic-abort.diff | ||
unreachable_diverging.main.UnreachablePropagation.panic-unwind.diff | ||
unreachable_diverging.rs | ||
unreachable.main.UnreachablePropagation.panic-abort.diff | ||
unreachable.main.UnreachablePropagation.panic-unwind.diff | ||
unreachable.rs | ||
unusual_item_types.{impl#0}-ASSOCIATED_CONSTANT.built.after.mir | ||
unusual_item_types.core.ptr-drop_in_place.Vec_i32_.AddMovesForPackedDrops.before.mir | ||
unusual_item_types.E-V-{constant#0}.built.after.mir | ||
unusual_item_types.rs | ||
unusual_item_types.Test-X-{constructor#0}.built.after.mir | ||
while_storage.rs | ||
while_storage.while_loop.PreCodegen.after.panic-abort.mir | ||
while_storage.while_loop.PreCodegen.after.panic-unwind.mir |
This folder contains tests for MIR optimizations.
The mir-opt
test format emits MIR to extra files that you can automatically update by specifying
--bless
on the command line (just like ui
tests updating .stderr
files).
--bless
able test format
By default 32 bit and 64 bit targets use the same dump files, which can be problematic in the presence of pointers in constants or other bit width dependent things. In that case you can add
// EMIT_MIR_FOR_EACH_BIT_WIDTH
to your test, causing separate files to be generated for 32bit and 64bit systems.
Unit testing
If you are only testing the behavior of a particular mir-opt pass on some specific input (as is usually the case), you should add
// unit-test: PassName
to the top of the file. This makes sure that other passes don't run which means you'll get the input you expected and your test won't break when other code changes.
Emit a diff of the mir for a specific optimization
This is what you want most often when you want to see how an optimization changes the MIR.
// EMIT_MIR $file_name_of_some_mir_dump.diff
Emit mir after a specific optimization
Use this if you are just interested in the final state after an optimization.
// EMIT_MIR $file_name_of_some_mir_dump.after.mir
Emit mir before a specific optimization
This exists mainly for completeness and is rarely useful.
// EMIT_MIR $file_name_of_some_mir_dump.before.mir