diff options
| author | Eduard Burtescu <edy.burt@gmail.com> | 2016-08-23 10:39:30 +0300 |
|---|---|---|
| committer | Eduard Burtescu <edy.burt@gmail.com> | 2016-08-24 13:23:37 +0300 |
| commit | 119508cdb4051280a6b89d4ba1a8157f1113d379 (patch) | |
| tree | eaa0cb8e2df53fad235592948a07f400b2b93a87 /src/libsyntax | |
| parent | d0654ae5e53124273340624aa2e25f5a9aa9ecb3 (diff) | |
| download | rust-119508cdb4051280a6b89d4ba1a8157f1113d379.tar.gz rust-119508cdb4051280a6b89d4ba1a8157f1113d379.zip | |
Remove drop flags from structs and enums implementing Drop.
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/feature_gate.rs | 11 | ||||
| -rw-r--r-- | src/libsyntax/lib.rs | 1 | ||||
| -rw-r--r-- | src/libsyntax/ptr.rs | 20 |
3 files changed, 17 insertions, 15 deletions
diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 05a485cefab..d746f8e2114 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -164,10 +164,6 @@ declare_features! ( // Allows using `box` in patterns; RFC 469 (active, box_patterns, "1.0.0", Some(29641)), - // Allows using the unsafe_no_drop_flag attribute (unlikely to - // switch to Accepted; see RFC 320) - (active, unsafe_no_drop_flag, "1.0.0", None), - // Allows using the unsafe_destructor_blind_to_params attribute; // RFC 1238 (active, dropck_parametricity, "1.3.0", Some(28498)), @@ -300,7 +296,8 @@ declare_features! ( (removed, quad_precision_float, "1.0.0", None), (removed, struct_inherit, "1.0.0", None), (removed, test_removed_feature, "1.0.0", None), - (removed, visible_private_types, "1.0.0", None) + (removed, visible_private_types, "1.0.0", None), + (removed, unsafe_no_drop_flag, "1.0.0", None) ); declare_features! ( @@ -565,10 +562,6 @@ pub const KNOWN_ATTRIBUTES: &'static [(&'static str, AttributeType, AttributeGat attribute is just used for the Rust test \ suite", cfg_fn!(omit_gdb_pretty_printer_section))), - ("unsafe_no_drop_flag", Whitelisted, Gated("unsafe_no_drop_flag", - "unsafe_no_drop_flag has unstable semantics \ - and may be removed in the future", - cfg_fn!(unsafe_no_drop_flag))), ("unsafe_destructor_blind_to_params", Normal, Gated("dropck_parametricity", diff --git a/src/libsyntax/lib.rs b/src/libsyntax/lib.rs index b4311fc007d..65bc9f34c90 100644 --- a/src/libsyntax/lib.rs +++ b/src/libsyntax/lib.rs @@ -26,7 +26,6 @@ #![feature(associated_consts)] #![feature(const_fn)] -#![feature(filling_drop)] #![feature(libc)] #![feature(rustc_private)] #![feature(staged_api)] diff --git a/src/libsyntax/ptr.rs b/src/libsyntax/ptr.rs index 9d04cb75daa..c3f8a977a65 100644 --- a/src/libsyntax/ptr.rs +++ b/src/libsyntax/ptr.rs @@ -39,7 +39,7 @@ use std::fmt::{self, Display, Debug}; use std::iter::FromIterator; use std::ops::Deref; -use std::{ptr, slice, vec}; +use std::{mem, ptr, slice, vec}; use serialize::{Encodable, Decodable, Encoder, Decoder}; @@ -74,12 +74,22 @@ impl<T: 'static> P<T> { pub fn map<F>(mut self, f: F) -> P<T> where F: FnOnce(T) -> T, { + let p: *mut T = &mut *self.ptr; + + // Leak self in case of panic. + // FIXME(eddyb) Use some sort of "free guard" that + // only deallocates, without dropping the pointee, + // in case the call the `f` below ends in a panic. + mem::forget(self); + unsafe { - let p = &mut *self.ptr; - // FIXME(#5016) this shouldn't need to drop-fill to be safe. - ptr::write(p, f(ptr::read_and_drop(p))); + ptr::write(p, f(ptr::read(p))); + + // Recreate self from the raw pointer. + P { + ptr: Box::from_raw(p) + } } - self } } |
