auto merge of #10748 : kballard/rust/issue-10734-rpass, r=alexcrichton

Stop relying on a malloc error to indicate failure and instead use an
explicit check. Also ensure that the value is dropped at the correct
time (e.g. that the if statement is translated into `{ expr }` instead
of `expr`).
This commit is contained in:
bors 2013-12-01 04:26:52 -08:00
commit 83084e9c77

View File

@ -8,13 +8,37 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
pub fn main() {
if true {
let _a = ~3;
}
if false {
fail!()
} else {
let _a = ~3;
static mut drop_count: uint = 0;
#[unsafe_no_drop_flag]
struct Foo {
dropped: bool
}
impl Drop for Foo {
fn drop(&mut self) {
// Test to make sure we haven't dropped already
assert!(!self.dropped);
self.dropped = true;
// And record the fact that we dropped for verification later
unsafe { drop_count += 1; }
}
}
pub fn main() {
// An `if true { expr }` statement should compile the same as `{ expr }`.
if true {
let _a = Foo{ dropped: false };
}
// Check that we dropped already (as expected from a `{ expr }`).
unsafe { assert!(drop_count == 1); }
// An `if false {} else { expr }` statement should compile the same as `{ expr }`.
if false {
fail!();
} else {
let _a = Foo{ dropped: false };
}
// Check that we dropped already (as expected from a `{ expr }`).
unsafe { assert!(drop_count == 2); }
}