Add a failing test
This commit is contained in:
parent
a52085d9f6
commit
2e57394d80
3 changed files with 402 additions and 0 deletions
|
@ -0,0 +1,183 @@
|
|||
// MIR for `method_1` after ElaborateDrops
|
||||
|
||||
fn method_1(_1: Guard) -> () {
|
||||
debug g => _1;
|
||||
let mut _0: ();
|
||||
let mut _2: std::result::Result<OtherDrop, ()>;
|
||||
let mut _3: &Guard;
|
||||
let _4: &Guard;
|
||||
let _5: Guard;
|
||||
let mut _6: &Guard;
|
||||
let mut _7: isize;
|
||||
let _8: OtherDrop;
|
||||
let _9: ();
|
||||
let mut _10: bool;
|
||||
let mut _11: bool;
|
||||
let mut _12: isize;
|
||||
let mut _13: isize;
|
||||
let mut _14: isize;
|
||||
scope 1 {
|
||||
debug other_drop => _8;
|
||||
}
|
||||
scope 2 {
|
||||
debug err => _9;
|
||||
}
|
||||
|
||||
bb0: {
|
||||
_11 = const false;
|
||||
_10 = const false;
|
||||
StorageLive(_2);
|
||||
StorageLive(_3);
|
||||
StorageLive(_4);
|
||||
StorageLive(_5);
|
||||
StorageLive(_6);
|
||||
_6 = &_1;
|
||||
_5 = <Guard as Clone>::clone(move _6) -> [return: bb1, unwind: bb16];
|
||||
}
|
||||
|
||||
bb1: {
|
||||
_11 = const true;
|
||||
StorageDead(_6);
|
||||
_4 = &_5;
|
||||
_3 = &(*_4);
|
||||
_2 = method_2(move _3) -> [return: bb2, unwind: bb14];
|
||||
}
|
||||
|
||||
bb2: {
|
||||
_10 = const true;
|
||||
StorageDead(_3);
|
||||
PlaceMention(_2);
|
||||
_7 = discriminant(_2);
|
||||
switchInt(move _7) -> [0: bb5, 1: bb4, otherwise: bb3];
|
||||
}
|
||||
|
||||
bb3: {
|
||||
unreachable;
|
||||
}
|
||||
|
||||
bb4: {
|
||||
StorageLive(_9);
|
||||
_9 = copy ((_2 as Err).0: ());
|
||||
_0 = const ();
|
||||
StorageDead(_9);
|
||||
goto -> bb7;
|
||||
}
|
||||
|
||||
bb5: {
|
||||
StorageLive(_8);
|
||||
_8 = move ((_2 as Ok).0: OtherDrop);
|
||||
_0 = const ();
|
||||
drop(_8) -> [return: bb6, unwind: bb11];
|
||||
}
|
||||
|
||||
bb6: {
|
||||
StorageDead(_8);
|
||||
goto -> bb7;
|
||||
}
|
||||
|
||||
bb7: {
|
||||
backward incompatible drop(_2);
|
||||
backward incompatible drop(_5);
|
||||
goto -> bb24;
|
||||
}
|
||||
|
||||
bb8: {
|
||||
drop(_5) -> [return: bb9, unwind: bb16];
|
||||
}
|
||||
|
||||
bb9: {
|
||||
_11 = const false;
|
||||
StorageDead(_5);
|
||||
StorageDead(_4);
|
||||
_10 = const false;
|
||||
StorageDead(_2);
|
||||
drop(_1) -> [return: bb10, unwind: bb17];
|
||||
}
|
||||
|
||||
bb10: {
|
||||
return;
|
||||
}
|
||||
|
||||
bb11 (cleanup): {
|
||||
goto -> bb28;
|
||||
}
|
||||
|
||||
bb12 (cleanup): {
|
||||
drop(_5) -> [return: bb13, unwind terminate(cleanup)];
|
||||
}
|
||||
|
||||
bb13 (cleanup): {
|
||||
goto -> bb15;
|
||||
}
|
||||
|
||||
bb14 (cleanup): {
|
||||
drop(_5) -> [return: bb15, unwind terminate(cleanup)];
|
||||
}
|
||||
|
||||
bb15 (cleanup): {
|
||||
goto -> bb30;
|
||||
}
|
||||
|
||||
bb16 (cleanup): {
|
||||
drop(_1) -> [return: bb17, unwind terminate(cleanup)];
|
||||
}
|
||||
|
||||
bb17 (cleanup): {
|
||||
resume;
|
||||
}
|
||||
|
||||
bb18: {
|
||||
goto -> bb8;
|
||||
}
|
||||
|
||||
bb19 (cleanup): {
|
||||
goto -> bb15;
|
||||
}
|
||||
|
||||
bb20 (cleanup): {
|
||||
goto -> bb15;
|
||||
}
|
||||
|
||||
bb21: {
|
||||
goto -> bb18;
|
||||
}
|
||||
|
||||
bb22: {
|
||||
goto -> bb18;
|
||||
}
|
||||
|
||||
bb23 (cleanup): {
|
||||
goto -> bb15;
|
||||
}
|
||||
|
||||
bb24: {
|
||||
_12 = discriminant(_2);
|
||||
switchInt(move _12) -> [0: bb21, otherwise: bb22];
|
||||
}
|
||||
|
||||
bb25 (cleanup): {
|
||||
_13 = discriminant(_2);
|
||||
switchInt(move _13) -> [0: bb19, otherwise: bb23];
|
||||
}
|
||||
|
||||
bb26 (cleanup): {
|
||||
goto -> bb12;
|
||||
}
|
||||
|
||||
bb27 (cleanup): {
|
||||
goto -> bb12;
|
||||
}
|
||||
|
||||
bb28 (cleanup): {
|
||||
_14 = discriminant(_2);
|
||||
switchInt(move _14) -> [0: bb26, otherwise: bb27];
|
||||
}
|
||||
|
||||
bb29 (cleanup): {
|
||||
drop(_5) -> [return: bb16, unwind terminate(cleanup)];
|
||||
}
|
||||
|
||||
bb30 (cleanup): {
|
||||
switchInt(copy _11) -> [0: bb16, otherwise: bb29];
|
||||
}
|
||||
}
|
|
@ -0,0 +1,183 @@
|
|||
// MIR for `method_1` after ElaborateDrops
|
||||
|
||||
fn method_1(_1: Guard) -> () {
|
||||
debug g => _1;
|
||||
let mut _0: ();
|
||||
let mut _2: std::result::Result<OtherDrop, ()>;
|
||||
let mut _3: &Guard;
|
||||
let _4: &Guard;
|
||||
let _5: Guard;
|
||||
let mut _6: &Guard;
|
||||
let mut _7: isize;
|
||||
let _8: OtherDrop;
|
||||
let _9: ();
|
||||
let mut _10: bool;
|
||||
let mut _11: bool;
|
||||
let mut _12: isize;
|
||||
let mut _13: isize;
|
||||
let mut _14: isize;
|
||||
scope 1 {
|
||||
debug other_drop => _8;
|
||||
}
|
||||
scope 2 {
|
||||
debug err => _9;
|
||||
}
|
||||
|
||||
bb0: {
|
||||
_11 = const false;
|
||||
_10 = const false;
|
||||
StorageLive(_2);
|
||||
StorageLive(_3);
|
||||
StorageLive(_4);
|
||||
StorageLive(_5);
|
||||
StorageLive(_6);
|
||||
_6 = &_1;
|
||||
_5 = <Guard as Clone>::clone(move _6) -> [return: bb1, unwind: bb16];
|
||||
}
|
||||
|
||||
bb1: {
|
||||
_11 = const true;
|
||||
StorageDead(_6);
|
||||
_4 = &_5;
|
||||
_3 = &(*_4);
|
||||
_2 = method_2(move _3) -> [return: bb2, unwind: bb14];
|
||||
}
|
||||
|
||||
bb2: {
|
||||
_10 = const true;
|
||||
StorageDead(_3);
|
||||
PlaceMention(_2);
|
||||
_7 = discriminant(_2);
|
||||
switchInt(move _7) -> [0: bb5, 1: bb4, otherwise: bb3];
|
||||
}
|
||||
|
||||
bb3: {
|
||||
unreachable;
|
||||
}
|
||||
|
||||
bb4: {
|
||||
StorageLive(_9);
|
||||
_9 = copy ((_2 as Err).0: ());
|
||||
_0 = const ();
|
||||
StorageDead(_9);
|
||||
goto -> bb7;
|
||||
}
|
||||
|
||||
bb5: {
|
||||
StorageLive(_8);
|
||||
_8 = move ((_2 as Ok).0: OtherDrop);
|
||||
_0 = const ();
|
||||
drop(_8) -> [return: bb6, unwind: bb11];
|
||||
}
|
||||
|
||||
bb6: {
|
||||
StorageDead(_8);
|
||||
goto -> bb7;
|
||||
}
|
||||
|
||||
bb7: {
|
||||
backward incompatible drop(_2);
|
||||
backward incompatible drop(_5);
|
||||
goto -> bb24;
|
||||
}
|
||||
|
||||
bb8: {
|
||||
drop(_5) -> [return: bb9, unwind: bb16];
|
||||
}
|
||||
|
||||
bb9: {
|
||||
_11 = const false;
|
||||
StorageDead(_5);
|
||||
StorageDead(_4);
|
||||
_10 = const false;
|
||||
StorageDead(_2);
|
||||
drop(_1) -> [return: bb10, unwind: bb17];
|
||||
}
|
||||
|
||||
bb10: {
|
||||
return;
|
||||
}
|
||||
|
||||
bb11 (cleanup): {
|
||||
goto -> bb28;
|
||||
}
|
||||
|
||||
bb12 (cleanup): {
|
||||
drop(_5) -> [return: bb13, unwind terminate(cleanup)];
|
||||
}
|
||||
|
||||
bb13 (cleanup): {
|
||||
goto -> bb15;
|
||||
}
|
||||
|
||||
bb14 (cleanup): {
|
||||
drop(_5) -> [return: bb15, unwind terminate(cleanup)];
|
||||
}
|
||||
|
||||
bb15 (cleanup): {
|
||||
goto -> bb30;
|
||||
}
|
||||
|
||||
bb16 (cleanup): {
|
||||
drop(_1) -> [return: bb17, unwind terminate(cleanup)];
|
||||
}
|
||||
|
||||
bb17 (cleanup): {
|
||||
resume;
|
||||
}
|
||||
|
||||
bb18: {
|
||||
goto -> bb8;
|
||||
}
|
||||
|
||||
bb19 (cleanup): {
|
||||
goto -> bb15;
|
||||
}
|
||||
|
||||
bb20 (cleanup): {
|
||||
goto -> bb15;
|
||||
}
|
||||
|
||||
bb21: {
|
||||
goto -> bb18;
|
||||
}
|
||||
|
||||
bb22: {
|
||||
goto -> bb18;
|
||||
}
|
||||
|
||||
bb23 (cleanup): {
|
||||
goto -> bb15;
|
||||
}
|
||||
|
||||
bb24: {
|
||||
_12 = discriminant(_2);
|
||||
switchInt(move _12) -> [0: bb21, otherwise: bb22];
|
||||
}
|
||||
|
||||
bb25 (cleanup): {
|
||||
_13 = discriminant(_2);
|
||||
switchInt(move _13) -> [0: bb19, otherwise: bb23];
|
||||
}
|
||||
|
||||
bb26 (cleanup): {
|
||||
goto -> bb12;
|
||||
}
|
||||
|
||||
bb27 (cleanup): {
|
||||
goto -> bb12;
|
||||
}
|
||||
|
||||
bb28 (cleanup): {
|
||||
_14 = discriminant(_2);
|
||||
switchInt(move _14) -> [0: bb26, otherwise: bb27];
|
||||
}
|
||||
|
||||
bb29 (cleanup): {
|
||||
drop(_5) -> [return: bb16, unwind terminate(cleanup)];
|
||||
}
|
||||
|
||||
bb30 (cleanup): {
|
||||
switchInt(copy _11) -> [0: bb16, otherwise: bb29];
|
||||
}
|
||||
}
|
36
tests/mir-opt/tail_expr_drop_order_unwind.rs
Normal file
36
tests/mir-opt/tail_expr_drop_order_unwind.rs
Normal file
|
@ -0,0 +1,36 @@
|
|||
// skip-filecheck
|
||||
// EMIT_MIR_FOR_EACH_PANIC_STRATEGY
|
||||
// EMIT_MIR tail_expr_drop_order_unwind.method_1.ElaborateDrops.after.mir
|
||||
|
||||
#![deny(tail_expr_drop_order)]
|
||||
|
||||
use std::backtrace::Backtrace;
|
||||
|
||||
#[derive(Clone)]
|
||||
struct Guard;
|
||||
impl Drop for Guard {
|
||||
fn drop(&mut self) {
|
||||
println!("Drop!");
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
struct OtherDrop;
|
||||
impl Drop for OtherDrop {
|
||||
fn drop(&mut self) {
|
||||
println!("Drop!");
|
||||
}
|
||||
}
|
||||
|
||||
fn method_1(g: Guard) {
|
||||
match method_2(&g.clone()) {
|
||||
Ok(other_drop) => {
|
||||
// repro needs something else being dropped too.
|
||||
},
|
||||
Err(err) => {},
|
||||
}
|
||||
}
|
||||
|
||||
fn method_2(_: &Guard) -> Result<OtherDrop, ()> {
|
||||
panic!("Method 2 panics!");
|
||||
}
|
Loading…
Add table
Reference in a new issue