blob: cb28625f976bd2ffc5a05b369ef9d0151061a8a7 [file]
// { dg-output "^drop\r*\nafter conditional\r*\nafter conditional\r*\ndrop\r*\nafter static\r*\ndrop\r*\nafter static\r*\ndrop\r*\ndrop\r*\ndrop\r*\n$" }
// { dg-additional-options "-frust-borrowcheck -w" }
#![feature(no_core)]
#![feature(lang_items)]
#![no_core]
extern "C" {
fn printf(s: *const i8, ...);
}
#[lang = "sized"]
pub trait Sized {}
#[lang = "drop"]
pub trait Drop {
fn drop(&mut self);
}
struct Droppable {
value: i32,
}
struct AfterConditional {
value: i32,
}
struct AfterStatic {
value: i32,
}
impl Drop for Droppable {
fn drop(&mut self) {
let msg = "drop\n\0" as *const str as *const i8;
unsafe {
printf(msg);
}
}
}
impl Drop for AfterConditional {
fn drop(&mut self) {
let msg = "after conditional\n\0" as *const str as *const i8;
unsafe {
printf(msg);
}
}
}
impl Drop for AfterStatic {
fn drop(&mut self) {
let msg = "after static\n\0" as *const str as *const i8;
unsafe {
printf(msg);
}
}
}
fn conditional_move(condition: bool) {
let x = Droppable { value: 1 };
if condition {
let _y = x;
}
let _after = AfterConditional { value: 0 };
}
fn static_after_join(condition: bool) {
let _x = Droppable { value: 2 };
if condition {
let _n = 1;
}
let _after = AfterStatic { value: 0 };
}
fn move_on_both_branches(condition: bool) {
let x = Droppable { value: 3 };
if condition {
let _y = x;
} else {
let _z = x;
}
}
fn main() -> i32 {
conditional_move(true);
conditional_move(false);
static_after_join(true);
static_after_join(false);
move_on_both_branches(true);
move_on_both_branches(false);
0
}