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:
commit
83084e9c77
@ -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); }
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user