Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

librustc: Put #[unsafe_destructor] behind a feature gate. #14988

Merged
merged 1 commit into from
Jun 20, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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