From eabdc8c960f971bd0ce72e50a5847f3bfedaa65f Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Thu, 7 Nov 2013 17:36:17 -0800 Subject: [PATCH] std: Make atomic types non-copyable. Closes #8380 --- src/libstd/unstable/atomics.rs | 34 +++++++++++-------- .../compile-fail/std-uncopyable-atomics.rs | 31 +++++++++++++++++ 2 files changed, 51 insertions(+), 14 deletions(-) create mode 100644 src/test/compile-fail/std-uncopyable-atomics.rs diff --git a/src/libstd/unstable/atomics.rs b/src/libstd/unstable/atomics.rs index e8835462a80..9aaccb3ebba 100644 --- a/src/libstd/unstable/atomics.rs +++ b/src/libstd/unstable/atomics.rs @@ -23,40 +23,46 @@ use cast; use option::{Option,Some,None}; use libc::c_void; use ops::Drop; +use util::NonCopyable; /** * A simple atomic flag, that can be set and cleared. The most basic atomic type. */ pub struct AtomicFlag { - priv v: int + priv v: int, + priv nocopy: NonCopyable } /** * An atomic boolean type. */ pub struct AtomicBool { - priv v: uint + priv v: uint, + priv nocopy: NonCopyable } /** * A signed atomic integer type, supporting basic atomic arithmetic operations */ pub struct AtomicInt { - priv v: int + priv v: int, + priv nocopy: NonCopyable } /** * An unsigned atomic integer type, supporting basic atomic arithmetic operations */ pub struct AtomicUint { - priv v: uint + priv v: uint, + priv nocopy: NonCopyable } /** * An unsafe atomic pointer. Only supports basic atomic operations */ pub struct AtomicPtr { - priv p: *mut T + priv p: *mut T, + priv nocopy: NonCopyable } /** @@ -75,15 +81,15 @@ pub enum Ordering { SeqCst } -pub static INIT_ATOMIC_FLAG : AtomicFlag = AtomicFlag { v: 0 }; -pub static INIT_ATOMIC_BOOL : AtomicBool = AtomicBool { v: 0 }; -pub static INIT_ATOMIC_INT : AtomicInt = AtomicInt { v: 0 }; -pub static INIT_ATOMIC_UINT : AtomicUint = AtomicUint { v: 0 }; +pub static INIT_ATOMIC_FLAG : AtomicFlag = AtomicFlag { v: 0, nocopy: NonCopyable }; +pub static INIT_ATOMIC_BOOL : AtomicBool = AtomicBool { v: 0, nocopy: NonCopyable }; +pub static INIT_ATOMIC_INT : AtomicInt = AtomicInt { v: 0, nocopy: NonCopyable }; +pub static INIT_ATOMIC_UINT : AtomicUint = AtomicUint { v: 0, nocopy: NonCopyable }; impl AtomicFlag { pub fn new() -> AtomicFlag { - AtomicFlag { v: 0 } + AtomicFlag { v: 0, nocopy: NonCopyable } } /** @@ -106,7 +112,7 @@ impl AtomicFlag { impl AtomicBool { pub fn new(v: bool) -> AtomicBool { - AtomicBool { v: if v { 1 } else { 0 } } + AtomicBool { v: if v { 1 } else { 0 }, nocopy: NonCopyable } } #[inline] @@ -171,7 +177,7 @@ impl AtomicBool { impl AtomicInt { pub fn new(v: int) -> AtomicInt { - AtomicInt { v:v } + AtomicInt { v:v, nocopy: NonCopyable } } #[inline] @@ -209,7 +215,7 @@ impl AtomicInt { impl AtomicUint { pub fn new(v: uint) -> AtomicUint { - AtomicUint { v:v } + AtomicUint { v:v, nocopy: NonCopyable } } #[inline] @@ -247,7 +253,7 @@ impl AtomicUint { impl AtomicPtr { pub fn new(p: *mut T) -> AtomicPtr { - AtomicPtr { p:p } + AtomicPtr { p:p, nocopy: NonCopyable } } #[inline] diff --git a/src/test/compile-fail/std-uncopyable-atomics.rs b/src/test/compile-fail/std-uncopyable-atomics.rs new file mode 100644 index 00000000000..a46dec7830a --- /dev/null +++ b/src/test/compile-fail/std-uncopyable-atomics.rs @@ -0,0 +1,31 @@ +// Copyright 2012 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Issue #8380 + +#[feature(globs)]; + +use std::unstable::atomics::*; +use std::ptr; + +fn main() { + let x = INIT_ATOMIC_FLAG; + let x = *&x; //~ ERROR: cannot move out of dereference + let x = INIT_ATOMIC_BOOL; + let x = *&x; //~ ERROR: cannot move out of dereference + let x = INIT_ATOMIC_INT; + let x = *&x; //~ ERROR: cannot move out of dereference + let x = INIT_ATOMIC_UINT; + let x = *&x; //~ ERROR: cannot move out of dereference + let x: AtomicPtr = AtomicPtr::new(ptr::mut_null()); + let x = *&x; //~ ERROR: cannot move out of dereference + let x: AtomicOption = AtomicOption::empty(); + let x = *&x; //~ ERROR: cannot move out of dereference +}