| //@ test-mir-pass: ElaborateDrops | |
| //@ needs-unwind | |
| // this tests move up progration, which is not yet implemented | |
| // EMIT_MIR basic_assignment.main.ElaborateDrops.diff | |
| // EMIT_MIR basic_assignment.main.SimplifyCfg-initial.after.mir | |
| // Check codegen for assignments (`a = b`) where the left-hand-side is | |
| // not yet initialized. Assignments tend to be absent in simple code, | |
| // so subtle breakage in them can leave a quite hard-to-find trail of | |
| // destruction. | |
| fn main() { | |
| // CHECK-LABEL: fn main( | |
| // CHECK: debug nodrop_x => [[nodrop_x:_.*]]; | |
| // CHECK: debug nodrop_y => [[nodrop_y:_.*]]; | |
| // CHECK: debug drop_x => [[drop_x:_.*]]; | |
| // CHECK: debug drop_y => [[drop_y:_.*]]; | |
| // CHECK-NOT: drop([[nodrop_x]]) | |
| // CHECK-NOT: drop([[nodrop_y]]) | |
| // CHECK-NOT: drop([[drop_x]]) | |
| // CHECK: [[drop_tmp:_.*]] = move [[drop_x]]; | |
| // CHECK-NOT: drop([[drop_x]]) | |
| // CHECK-NOT: drop([[drop_tmp]]) | |
| // CHECK: [[drop_y]] = move [[drop_tmp]]; | |
| // CHECK-NOT: drop([[drop_x]]) | |
| // CHECK-NOT: drop([[drop_tmp]]) | |
| // CHECK: drop([[drop_y]]) | |
| // CHECK-NOT: drop([[drop_x]]) | |
| // CHECK-NOT: drop([[drop_tmp]]) | |
| let nodrop_x = false; | |
| let nodrop_y; | |
| // Since boolean does not require drop, this can be a simple | |
| // assignment: | |
| nodrop_y = nodrop_x; | |
| let drop_x: Option<Box<u32>> = None; | |
| let drop_y; | |
| // Since the type of `drop_y` has drop, we generate a `replace` | |
| // terminator: | |
| drop_y = drop_x; | |
| } |