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.rs | ||
| combine_clone_of_primitives.{impl#0}-clone.InstSimplify.panic-abort.diff | ||
| combine_clone_of_primitives.{impl#0}-clone.InstSimplify.panic-unwind.diff | ||
| combine_transmutes.adt_transmutes.InstSimplify.diff | ||
| combine_transmutes.identity_transmutes.InstSimplify.diff | ||
| combine_transmutes.integer_transmutes.InstSimplify.diff | ||
| combine_transmutes.rs | ||
| const_allocation.main.ConstProp.after.32bit.mir | ||
| const_allocation.main.ConstProp.after.64bit.mir | ||
| const_allocation.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_debuginfo.main.ConstDebugInfo.diff | ||
| const_debuginfo.rs | ||
| const_goto.issue_77355_opt.ConstGoto.diff | ||
| const_goto.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_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.main.Derefer.diff | ||
| derefer_test.rs | ||
| derefer_test_multiple.main.Derefer.diff | ||
| derefer_test_multiple.rs | ||
| dont_yeet_assert.generic.InstSimplify.diff | ||
| dont_yeet_assert.rs | ||
| early_otherwise_branch.opt1.EarlyOtherwiseBranch.diff | ||
| early_otherwise_branch.opt2.EarlyOtherwiseBranch.diff | ||
| early_otherwise_branch.opt3.EarlyOtherwiseBranch.diff | ||
| early_otherwise_branch.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 | ||
| 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.rs | ||
| issue_41697.{impl#0}-{constant#0}.SimplifyCfg-promote-consts.after.mir | ||
| 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.bar.built.after.mir | ||
| issue_72181.foo.built.after.mir | ||
| issue_72181.main.built.after.mir | ||
| issue_72181.rs | ||
| issue_72181_1.f.built.after.mir | ||
| issue_72181_1.main.built.after.mir | ||
| issue_72181_1.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.NormalizeArrayLen.panic-abort.diff | ||
| lower_array_len.array_bound.NormalizeArrayLen.panic-unwind.diff | ||
| lower_array_len.array_bound_mut.NormalizeArrayLen.panic-abort.diff | ||
| lower_array_len.array_bound_mut.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.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.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.MatchBranchSimplification.diff | ||
| matches_u8.exhaustive_match_i8.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.ReferencePropagation.diff | ||
| reference_prop.reference_propagation_const_ptr.ReferencePropagation.diff | ||
| reference_prop.reference_propagation_mut.ReferencePropagation.diff | ||
| reference_prop.reference_propagation_mut_ptr.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.RemoveUnneededDrops.panic-abort.diff | ||
| remove_unneeded_drops.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.rs | ||
| remove_zsts.get_union.PreCodegen.after.mir | ||
| remove_zsts.get_union.RemoveZsts.diff | ||
| remove_zsts.rs | ||
| 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 | ||
| retag.{impl#0}-foo.SimplifyCfg-elaborate-drops.after.panic-abort.mir | ||
| retag.{impl#0}-foo.SimplifyCfg-elaborate-drops.after.panic-unwind.mir | ||
| retag.{impl#0}-foo_shr.SimplifyCfg-elaborate-drops.after.panic-abort.mir | ||
| retag.{impl#0}-foo_shr.SimplifyCfg-elaborate-drops.after.panic-unwind.mir | ||
| return_an_array.rs | ||
| separate_const_switch.identity.SeparateConstSwitch.diff | ||
| separate_const_switch.rs | ||
| separate_const_switch.too_complex.SeparateConstSwitch.diff | ||
| simplify_arm.id_try.SimplifyArmIdentity.diff | ||
| simplify_arm.id_try.SimplifyBranchSame.diff | ||
| simplify_arm.rs | ||
| simplify_arm_identity.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.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_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_match.main.ConstProp.panic-abort.diff | ||
| simplify_match.main.ConstProp.panic-unwind.diff | ||
| simplify_match.rs | ||
| simplify_try_if_let.rs | ||
| simplify_try_if_let.{impl#0}-append.SimplifyArmIdentity.diff | ||
| 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.process_never.SimplifyLocals-final.after.mir | ||
| uninhabited_enum.process_void.SimplifyLocals-final.after.mir | ||
| uninhabited_enum.rs | ||
| uninhabited_enum_branching.main.SimplifyCfg-after-uninhabited-enum-branching.after.mir | ||
| uninhabited_enum_branching.main.UninhabitedEnumBranching.diff | ||
| uninhabited_enum_branching.rs | ||
| uninhabited_enum_branching2.main.SimplifyCfg-after-uninhabited-enum-branching.after.mir | ||
| uninhabited_enum_branching2.main.UninhabitedEnumBranching.diff | ||
| uninhabited_enum_branching2.rs | ||
| uninhabited_fallthrough_elimination.eliminate_fallthrough.UninhabitedEnumBranching.diff | ||
| uninhabited_fallthrough_elimination.keep_fallthrough.UninhabitedEnumBranching.diff | ||
| uninhabited_fallthrough_elimination.rs | ||
| unreachable.main.UnreachablePropagation.panic-abort.diff | ||
| unreachable.main.UnreachablePropagation.panic-unwind.diff | ||
| unreachable.rs | ||
| unreachable_diverging.main.UnreachablePropagation.panic-abort.diff | ||
| unreachable_diverging.main.UnreachablePropagation.panic-unwind.diff | ||
| unreachable_diverging.rs | ||
| 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 | ||
| unusual_item_types.{impl#0}-ASSOCIATED_CONSTANT.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).
--blessable 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