| // check that we clear the "ADT master drop flag" even when there are |
| // no fields to be dropped. |
| |
| fn main() { |
| let e; |
| if cond() { |
| e = E::F(K); |
| if let E::F(_k) = e { |
| // older versions of rustc used to not clear the |
| // drop flag for `e` in this path. |
| } |
| } |
| } |
| |
| fn cond() -> bool { false } |
| |
| struct K; |
| |
| enum E { |
| F(K), |
| G(Box<E>) |
| } |
| |
| // END RUST SOURCE |
| // fn main() -> () { |
| // let mut _0: (); |
| // scope 1 { |
| // let _1: E; |
| // debug e => _1; |
| // scope 2 { |
| // let _6: K; |
| // debug _k => _6; |
| // } |
| // } |
| // let mut _2: bool; |
| // let mut _3: (); |
| // let mut _4: E; |
| // let mut _5: K; |
| // let mut _7: isize; |
| // let mut _8: bool; // drop flag for `e` |
| // let mut _9: bool; |
| // let mut _10: bool; |
| // let mut _11: isize; |
| // let mut _12: isize; |
| // |
| // bb0: { |
| // _8 = const false; |
| // _10 = const false; |
| // _9 = const false; |
| // StorageLive(_1); |
| // StorageLive(_2); |
| // _2 = const cond() -> [return: bb3, unwind: bb2]; |
| // } |
| // |
| // bb1: { |
| // resume; |
| // } |
| // |
| // bb2: { |
| // goto -> bb1; |
| // } |
| // |
| // bb3: { |
| // switchInt(_2) -> [0u8: bb5, otherwise: bb4]; |
| // } |
| // |
| // bb4: { |
| // StorageLive(_4); |
| // StorageLive(_5); |
| // _5 = K::{{constructor}}; |
| // _4 = E::F(_5,); |
| // StorageDead(_5); |
| // goto -> bb15; |
| // } |
| // |
| // bb5: { |
| // _0 = (); |
| // goto -> bb12; |
| // } |
| // |
| // bb6: { |
| // goto -> bb2; |
| // } |
| // |
| // bb7: { |
| // goto -> bb8; |
| // } |
| // |
| // bb8: { |
| // StorageDead(_4); |
| // _7 = discriminant(_1); |
| // switchInt(_7) -> [0isize: bb10, otherwise: bb9]; |
| // } |
| // |
| // bb9: { |
| // _0 = (); |
| // goto -> bb11; |
| // } |
| // |
| // bb10: { |
| // StorageLive(_6); |
| // _10 = const false; |
| // _6 = ((_1 as F).0: K); |
| // _0 = (); |
| // goto -> bb11; |
| // } |
| // |
| // bb11: { |
| // StorageDead(_6); |
| // goto -> bb12; |
| // } |
| // |
| // bb12: { |
| // StorageDead(_2); |
| // goto -> bb22; |
| // } |
| // |
| // bb13: { |
| // StorageDead(_1); |
| // return; |
| // } |
| // |
| // bb14: { |
| // _8 = const true; |
| // _9 = const true; |
| // _10 = const true; |
| // _1 = _4; |
| // goto -> bb6; |
| // } |
| // |
| // bb15: { |
| // _8 = const true; |
| // _9 = const true; |
| // _10 = const true; |
| // _1 = _4; |
| // goto -> bb7; |
| // } |
| // |
| // bb16: { |
| // _8 = const false; // clear the drop flag - must always be reached |
| // goto -> bb13; |
| // } |
| // |
| // bb17: { |
| // _8 = const false; |
| // goto -> bb1; |
| // } |
| // |
| // bb18: { |
| // goto -> bb17; |
| // } |
| // |
| // bb19: { |
| // drop(_1) -> [return: bb16, unwind: bb17]; |
| // } |
| // |
| // bb20: { |
| // drop(_1) -> bb17; |
| // } |
| // |
| // bb21: { |
| // _11 = discriminant(_1); |
| // switchInt(_11) -> [0isize: bb16, otherwise: bb19]; |
| // } |
| // |
| // bb22: { |
| // switchInt(_8) -> [0u8: bb16, otherwise: bb21]; |
| // } |
| // |
| // bb23: { |
| // _12 = discriminant(_1); |
| // switchInt(_12) -> [0isize: bb18, otherwise: bb20]; |
| // } |
| // |
| // bb24: { |
| // switchInt(_8) -> [0u8: bb17, otherwise: bb23]; |
| // } |
| // } |