diff options
| author | bors <bors@rust-lang.org> | 2013-06-28 05:28:32 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2013-06-28 05:28:32 -0700 |
| commit | 811e045c609f8f6bc53faeec817e9ba7aeadf056 (patch) | |
| tree | 2e11e915a59d73825ea43122162cfdd5070f9d82 /src/libstd | |
| parent | 887ae82382ff4fad401a6539356245d2a05d6b4f (diff) | |
| parent | 3fbea161075aa21a217bd794e3f5cac7085e94ec (diff) | |
| download | rust-811e045c609f8f6bc53faeec817e9ba7aeadf056.tar.gz rust-811e045c609f8f6bc53faeec817e9ba7aeadf056.zip | |
auto merge of #7426 : thestinger/rust/zero-size-noncopyable, r=catamorphism
4885918 r=huonw 42a63fc r=thestinger 7ec5a08 r=catamorphism fb1e5f1 r=thestinger 659cd55 r=cmr
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/libc.rs | 1 | ||||
| -rw-r--r-- | src/libstd/option.rs | 2 | ||||
| -rw-r--r-- | src/libstd/unstable/atomics.rs | 2 | ||||
| -rw-r--r-- | src/libstd/util.rs | 54 |
4 files changed, 44 insertions, 15 deletions
diff --git a/src/libstd/libc.rs b/src/libstd/libc.rs index 3c2ae93b656..41b78afded1 100644 --- a/src/libstd/libc.rs +++ b/src/libstd/libc.rs @@ -349,7 +349,6 @@ pub mod types { use libc::types::os::arch::c95::{c_uchar, c_uint, c_ulong, time_t}; use libc::types::os::arch::c99::{c_longlong, c_ulonglong}; use libc::types::os::arch::posix88::{uid_t, gid_t, ino_t}; - use libc::types::os::arch::posix88::{uid_t}; pub type nlink_t = u16; pub type blksize_t = u32; diff --git a/src/libstd/option.rs b/src/libstd/option.rs index f3ea81f1ae5..12ae2abd4a1 100644 --- a/src/libstd/option.rs +++ b/src/libstd/option.rs @@ -447,7 +447,7 @@ fn test_option_dance() { } #[test] #[should_fail] #[ignore(cfg(windows))] fn test_option_too_much_dance() { - let mut y = Some(util::NonCopyable::new()); + let mut y = Some(util::NonCopyable); let _y2 = y.swap_unwrap(); let _y3 = y.swap_unwrap(); } diff --git a/src/libstd/unstable/atomics.rs b/src/libstd/unstable/atomics.rs index 45eced9846c..1e5ac305df3 100644 --- a/src/libstd/unstable/atomics.rs +++ b/src/libstd/unstable/atomics.rs @@ -62,7 +62,7 @@ pub struct AtomicPtr<T> { /** * An owned atomic pointer. Ensures that only a single reference to the data is held at any time. */ -#[no_drop_flag] +#[unsafe_no_drop_flag] pub struct AtomicOption<T> { priv p: *mut c_void } diff --git a/src/libstd/util.rs b/src/libstd/util.rs index 6eddae17ce6..fd29d7dc14b 100644 --- a/src/libstd/util.rs +++ b/src/libstd/util.rs @@ -75,18 +75,14 @@ pub fn replace<T>(dest: &mut T, mut src: T) -> T { } /// A non-copyable dummy type. +#[deriving(Eq, TotalEq, Ord, TotalOrd)] +#[unsafe_no_drop_flag] pub struct NonCopyable; -impl NonCopyable { - /// Creates a dummy non-copyable structure and returns it for use. - pub fn new() -> NonCopyable { NonCopyable } -} - impl Drop for NonCopyable { fn drop(&self) { } } - /// A type with no inhabitants pub enum Void { } @@ -130,39 +126,73 @@ pub fn unreachable() -> ! { #[cfg(test)] mod tests { + use super::*; use option::{None, Some}; - use util::{Void, NonCopyable, id, replace, swap}; use either::{Either, Left, Right}; + use sys::size_of; + use kinds::Drop; #[test] - pub fn identity_crisis() { + fn identity_crisis() { // Writing a test for the identity function. How did it come to this? let x = ~[(5, false)]; //FIXME #3387 assert!(x.eq(id(copy x))); let y = copy x; assert!(x.eq(&id(y))); } + #[test] - pub fn test_swap() { + fn test_swap() { let mut x = 31337; let mut y = 42; swap(&mut x, &mut y); assert_eq!(x, 42); assert_eq!(y, 31337); } + #[test] - pub fn test_replace() { - let mut x = Some(NonCopyable::new()); + fn test_replace() { + let mut x = Some(NonCopyable); let y = replace(&mut x, None); assert!(x.is_none()); assert!(y.is_some()); } + #[test] - pub fn test_uninhabited() { + fn test_uninhabited() { let could_only_be_coin : Either <Void, ()> = Right (()); match could_only_be_coin { Right (coin) => coin, Left (is_void) => is_void.uninhabited () } } + + #[test] + fn test_noncopyable() { + assert_eq!(size_of::<NonCopyable>(), 0); + + // verify that `#[unsafe_no_drop_flag]` works as intended on a zero-size struct + + // NOTE: uncomment after snapshot, will not parse yet + //static mut did_run: bool = false; + + struct Foo { five: int } + + impl Drop for Foo { + fn drop(&self) { + assert_eq!(self.five, 5); + // NOTE: uncomment after snapshot, will not parse yet + //unsafe { + //did_run = true; + //} + } + } + + { + let _a = (NonCopyable, Foo { five: 5 }, NonCopyable); + } + + // NOTE: uncomment after snapshot, will not parse yet + //unsafe { assert_eq!(did_run, true); } + } } |
