Skip to content

Commit

Permalink
auto merge of #14988 : pcwalton/rust/unsafe-destructor-feature-gate, …
Browse files Browse the repository at this point in the history
…r=alexcrichton

Closes #8142.

This is not the semantics we want long-term. You can continue to use
`#[unsafe_destructor]`, but you'll need to add
`#![feature(unsafe_destructor)]` to the crate attributes.

[breaking-change]

r? @alexcrichton
  • Loading branch information
bors committed Jun 20, 2014
2 parents 43d1938 + dcbf4ec commit 2563481
Show file tree
Hide file tree
Showing 36 changed files with 78 additions and 33 deletions.
8 changes: 6 additions & 2 deletions src/doc/guide-unsafe.md
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,8 @@ As an example, we give a reimplementation of owned boxes by wrapping
reimplementation is as safe as the `Box` type.

```
#![feature(unsafe_destructor)]
extern crate libc;
use libc::{c_void, size_t, malloc, free};
use std::mem;
Expand Down Expand Up @@ -242,10 +244,12 @@ impl<T: Send> Unique<T> {
// A key ingredient for safety, we associate a destructor with
// Unique<T>, making the struct manage the raw pointer: when the
// struct goes out of scope, it will automatically free the raw pointer.
//
// NB: This is an unsafe destructor, because rustc will not normally
// allow destructors to be associated with parametrized types, due to
// allow destructors to be associated with parameterized types, due to
// bad interaction with managed boxes. (With the Send restriction,
// we don't have this problem.)
// we don't have this problem.) Note that the `#[unsafe_destructor]`
// feature gate is required to use unsafe destructors.
#[unsafe_destructor]
impl<T: Send> Drop for Unique<T> {
fn drop(&mut self) {
Expand Down
5 changes: 3 additions & 2 deletions src/doc/rust.md
Original file line number Diff line number Diff line change
Expand Up @@ -1940,12 +1940,13 @@ interpreted:
enum representation in C is undefined, and this may be incorrect when the C
code is compiled with certain flags.
- `simd` - on certain tuple structs, derive the arithmetic operators, which
lower to the target's SIMD instructions, if any.
lower to the target's SIMD instructions, if any; the `simd` feature gate
is necessary to use this attribute.
- `static_assert` - on statics whose type is `bool`, terminates compilation
with an error if it is not initialized to `true`.
- `unsafe_destructor` - allow implementations of the "drop" language item
where the type it is implemented for does not implement the "send" language
item.
item; the `unsafe_destructor` feature gate is needed to use this attribute
- `unsafe_no_drop_flag` - on structs, remove the flag that prevents
destructors from being run twice. Destructors might be run multiple times on
the same object with this attribute.
Expand Down
3 changes: 2 additions & 1 deletion src/liballoc/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@
html_root_url = "http://doc.rust-lang.org/")]

#![no_std]
#![feature(phase)]
#![feature(phase, unsafe_destructor)]
#![allow(unknown_features)] // NOTE: remove after a stage0 snap

#[phase(plugin, link)]
extern crate core;
Expand Down
3 changes: 3 additions & 0 deletions src/libarena/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,10 @@
#![doc(html_logo_url = "http://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
html_favicon_url = "http://www.rust-lang.org/favicon.ico",
html_root_url = "http://doc.rust-lang.org/")]

#![feature(unsafe_destructor)]
#![allow(missing_doc)]
#![allow(unknown_features)] // NOTE: remove after a stage0 snap

use std::cell::{Cell, RefCell};
use std::cmp;
Expand Down
2 changes: 2 additions & 0 deletions src/libcollections/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@
html_playground_url = "http://play.rust-lang.org/")]

#![feature(macro_rules, managed_boxes, default_type_params, phase, globs)]
#![feature(unsafe_destructor)]
#![no_std]
#![allow(unknown_features)] // NOTE: remove after a stage0 snap

#[phase(plugin, link)] extern crate core;
extern crate alloc;
Expand Down
3 changes: 2 additions & 1 deletion src/libcore/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,9 @@
html_playground_url = "http://play.rust-lang.org/")]

#![no_std]
#![feature(globs, macro_rules, managed_boxes, phase, simd)]
#![feature(globs, macro_rules, managed_boxes, phase, simd, unsafe_destructor)]
#![deny(missing_doc)]
#![allow(unknown_features)] // NOTE: remove after a stage0 snap

#[cfg(test)] extern crate realcore = "core";
#[cfg(test)] extern crate libc;
Expand Down
4 changes: 3 additions & 1 deletion src/libnative/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,15 +52,17 @@
#![doc(html_logo_url = "http://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
html_favicon_url = "http://www.rust-lang.org/favicon.ico",
html_root_url = "http://doc.rust-lang.org/")]

#![deny(unused_result, unused_must_use)]
#![allow(non_camel_case_types)]
#![allow(deprecated)]
#![allow(unknown_features)] // NOTE: remove after a stage0 snap
#![feature(default_type_params)]

// NB this crate explicitly does *not* allow glob imports, please seriously
// consider whether they're needed before adding that feature here (the
// answer is that you don't need them)
#![feature(macro_rules)]
#![feature(macro_rules, unsafe_destructor)]

extern crate alloc;
extern crate libc;
Expand Down
12 changes: 12 additions & 0 deletions src/librustc/front/feature_gate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ static KNOWN_FEATURES: &'static [(&'static str, Status)] = &[
("log_syntax", Active),
("trace_macros", Active),
("concat_idents", Active),
("unsafe_destructor", Active),

("simd", Active),
("default_type_params", Active),
Expand Down Expand Up @@ -220,6 +221,17 @@ impl<'a> Visitor<()> for Context<'a> {
}
}

ast::ItemImpl(..) => {
if attr::contains_name(i.attrs.as_slice(),
"unsafe_destructor") {
self.gate_feature("unsafe_destructor",
i.span,
"`#[unsafe_destructor]` allows too \
many unsafe patterns and may be \
removed in the future");
}
}

_ => {}
}

Expand Down
5 changes: 3 additions & 2 deletions src/librustc/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,9 @@ This API is completely unstable and subject to change.
html_root_url = "http://doc.rust-lang.org/")]

#![allow(deprecated)]
#![feature(macro_rules, globs, struct_variant, managed_boxes, quote,
default_type_params, phase)]
#![allow(unknown_features)] // NOTE: remove after a stage0 snap
#![feature(macro_rules, globs, struct_variant, managed_boxes, quote)]
#![feature(default_type_params, phase, unsafe_destructor)]

extern crate arena;
extern crate debug;
Expand Down
6 changes: 4 additions & 2 deletions src/librustrt/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,12 @@
#![doc(html_logo_url = "http://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
html_favicon_url = "http://www.rust-lang.org/favicon.ico",
html_root_url = "http://doc.rust-lang.org/")]
#![feature(macro_rules, phase, globs, thread_local, managed_boxes, asm,
linkage)]

#![feature(macro_rules, phase, globs, thread_local, managed_boxes, asm)]
#![feature(linkage, unsafe_destructor)]
#![no_std]
#![experimental]
#![allow(unknown_features)] // NOTE: remove after a stage0 snap

#[phase(plugin, link)] extern crate core;
extern crate alloc;
Expand Down
2 changes: 1 addition & 1 deletion src/librustuv/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ via `close` and `delete` methods.
#![crate_type = "rlib"]
#![crate_type = "dylib"]

#![feature(macro_rules)]
#![feature(macro_rules, unsafe_destructor)]
#![deny(unused_result, unused_must_use)]
#![allow(visible_private_types)]

Expand Down
6 changes: 4 additions & 2 deletions src/libstd/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -103,14 +103,16 @@
html_favicon_url = "http://www.rust-lang.org/favicon.ico",
html_root_url = "http://doc.rust-lang.org/",
html_playground_url = "http://play.rust-lang.org/")]
#![feature(macro_rules, globs, managed_boxes,
linkage, default_type_params, phase)]

#![feature(macro_rules, globs, managed_boxes)]
#![feature(linkage, default_type_params, phase, unsafe_destructor)]

// Don't link to std. We are std.
#![no_std]

#![allow(deprecated)]
#![deny(missing_doc)]
#![allow(unknown_features)] // NOTE: remove after a stage0 snap

// When testing libstd, bring in libuv as the I/O backend so tests can print
// things and all of the std::io tests have an I/O interface to run on top
Expand Down
3 changes: 2 additions & 1 deletion src/libsync/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,11 @@
html_favicon_url = "http://www.rust-lang.org/favicon.ico",
html_root_url = "http://doc.rust-lang.org/",
html_playground_url = "http://play.rust-lang.org/")]
#![feature(phase, globs, macro_rules)]

#![feature(phase, globs, macro_rules, unsafe_destructor)]
#![deny(missing_doc)]
#![no_std]
#![allow(unknown_features)] // NOTE: remove after a stage0 snap

#[phase(plugin, link)] extern crate core;
extern crate alloc;
Expand Down
5 changes: 3 additions & 2 deletions src/libsyntax/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,10 @@ This API is completely unstable and subject to change.
html_favicon_url = "http://www.rust-lang.org/favicon.ico",
html_root_url = "http://doc.rust-lang.org/")]

#![feature(macro_rules, globs, managed_boxes, default_type_params, phase,
quote)]
#![feature(macro_rules, globs, managed_boxes, default_type_params, phase)]
#![feature(quote, unsafe_destructor)]
#![allow(deprecated)]
#![allow(unknown_features)] // NOTE: remove after a stage0 snap

extern crate serialize;
extern crate term;
Expand Down
2 changes: 2 additions & 0 deletions src/test/auxiliary/issue-2526.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
#![crate_id="issue_2526#0.2"]
#![crate_type = "lib"]

#![feature(unsafe_destructor)]

struct arc_destruct<T> {
_data: int,
}
Expand Down
2 changes: 1 addition & 1 deletion src/test/bench/task-perf-alloc-unwind.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(managed_boxes)]
#![feature(managed_boxes, unsafe_destructor)]

extern crate collections;
extern crate time;
Expand Down
2 changes: 2 additions & 0 deletions src/test/compile-fail/borrowck-borrowed-uniq-rvalue-2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(unsafe_destructor)]

extern crate debug;

struct defer<'a> {
Expand Down
2 changes: 1 addition & 1 deletion src/test/compile-fail/no-send-res-ports.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(managed_boxes)]
#![feature(managed_boxes, unsafe_destructor)]

extern crate debug;

Expand Down
2 changes: 1 addition & 1 deletion src/test/compile-fail/pinned-deep-copy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(managed_boxes)]
#![feature(managed_boxes, unsafe_destructor)]

extern crate debug;

Expand Down
2 changes: 1 addition & 1 deletion src/test/compile-fail/unique-vec-res.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(managed_boxes)]
#![feature(managed_boxes, unsafe_destructor)]

extern crate debug;
use std::cell::Cell;
Expand Down
2 changes: 1 addition & 1 deletion src/test/run-fail/unwind-resource-fail3.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(managed_boxes)]
#![feature(managed_boxes, unsafe_destructor)]

// error-pattern:quux

Expand Down
2 changes: 2 additions & 0 deletions src/test/run-pass/attr-no-drop-flag-size.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(unsafe_destructor)]

use std::mem::size_of;

#[unsafe_no_drop_flag]
Expand Down
2 changes: 2 additions & 0 deletions src/test/run-pass/drop-trait-generic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(unsafe_destructor)]

struct S<T> {
x: T
}
Expand Down
2 changes: 1 addition & 1 deletion src/test/run-pass/init-res-into-things.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(managed_boxes)]
#![feature(managed_boxes, unsafe_destructor)]

use std::cell::Cell;
use std::gc::{Gc, GC};
Expand Down
2 changes: 2 additions & 0 deletions src/test/run-pass/issue-2718.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(unsafe_destructor)]

pub type Task = int;

// tjc: I don't know why
Expand Down
2 changes: 1 addition & 1 deletion src/test/run-pass/issue-2735-2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(managed_boxes)]
#![feature(managed_boxes, unsafe_destructor)]

use std::cell::Cell;
use std::gc::{Gc, GC};
Expand Down
2 changes: 1 addition & 1 deletion src/test/run-pass/issue-2735-3.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(managed_boxes)]
#![feature(managed_boxes, unsafe_destructor)]

use std::cell::Cell;
use std::gc::{Gc, GC};
Expand Down
2 changes: 2 additions & 0 deletions src/test/run-pass/issue-4252.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(unsafe_destructor)]

extern crate debug;

trait X {
Expand Down
2 changes: 1 addition & 1 deletion src/test/run-pass/issue-979.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(managed_boxes)]
#![feature(managed_boxes, unsafe_destructor)]

use std::cell::Cell;
use std::gc::{GC, Gc};
Expand Down
2 changes: 1 addition & 1 deletion src/test/run-pass/newtype-struct-drop-run.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(managed_boxes)]
#![feature(managed_boxes, unsafe_destructor)]

// Make sure the destructor is run for newtype structs.

Expand Down
2 changes: 1 addition & 1 deletion src/test/run-pass/option-unwrap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(managed_boxes)]
#![feature(managed_boxes, unsafe_destructor)]

use std::cell::Cell;
use std::gc::{GC, Gc};
Expand Down
2 changes: 1 addition & 1 deletion src/test/run-pass/resource-assign-is-not-copy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(managed_boxes)]
#![feature(managed_boxes, unsafe_destructor)]

extern crate debug;

Expand Down
2 changes: 1 addition & 1 deletion src/test/run-pass/resource-destruct.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(managed_boxes)]
#![feature(managed_boxes, unsafe_destructor)]

use std::cell::Cell;
use std::gc::{GC, Gc};
Expand Down
2 changes: 1 addition & 1 deletion src/test/run-pass/resource-in-struct.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(managed_boxes)]
#![feature(managed_boxes, unsafe_destructor)]

// Ensures that class dtors run if the object is inside an enum
// variant
Expand Down
2 changes: 1 addition & 1 deletion src/test/run-pass/unwind-resource2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

#![feature(managed_boxes)]
#![feature(managed_boxes, unsafe_destructor)]

use std::task;
use std::gc::{Gc, GC};
Expand Down
Loading

0 comments on commit 2563481

Please sign in to comment.