diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2015-03-24 15:27:14 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2015-03-24 15:27:14 -0700 |
| commit | 3b13b9c2b4e72d08cb1c68024ccc4f50001f4878 (patch) | |
| tree | d4efd6426beeeee1f0c543cfe345b9625285f46e /src/doc | |
| parent | 91b633aa038008fdbee658a10182afdd794d2aa6 (diff) | |
| parent | 1955e052675d4457432da85a00db0ae55be64e83 (diff) | |
| download | rust-3b13b9c2b4e72d08cb1c68024ccc4f50001f4878.tar.gz rust-3b13b9c2b4e72d08cb1c68024ccc4f50001f4878.zip | |
rollup merge of #23638: pnkfelix/fsk-reject-specialized-drops
Reject specialized Drop impls.
See Issue #8142 for discussion.
This makes it illegal for a Drop impl to be more specialized than the original item.
So for example, all of the following are now rejected (when they would have been blindly accepted before):
```rust
struct S<A> { ... };
impl Drop for S<i8> { ... } // error: specialized to concrete type
struct T<'a> { ... };
impl Drop for T<'static> { ... } // error: specialized to concrete region
struct U<A> { ... };
impl<A:Clone> Drop for U<A> { ... } // error: added extra type requirement
struct V<'a,'b>;
impl<'a,'b:a> Drop for V<'a,'b> { ... } // error: added extra region requirement
```
Due to examples like the above, this is a [breaking-change].
(The fix is to either remove the specialization from the `Drop` impl, or to transcribe the requirements into the struct/enum definition; examples of both are shown in the PR's fixed to `libstd`.)
----
This is likely to be the last thing blocking the removal of the `#[unsafe_destructor]` attribute.
Fix #8142
Fix #23584
Diffstat (limited to 'src/doc')
| -rw-r--r-- | src/doc/trpl/unsafe.md | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/src/doc/trpl/unsafe.md b/src/doc/trpl/unsafe.md index 2116976d55a..dbf0cae6f4b 100644 --- a/src/doc/trpl/unsafe.md +++ b/src/doc/trpl/unsafe.md @@ -197,15 +197,16 @@ use std::ptr; // Define a wrapper around the handle returned by the foreign code. // Unique<T> has the same semantics as Box<T> -pub struct Unique<T> { +// +// NB: For simplicity and correctness, we require that T has kind Send +// (owned boxes relax this restriction). +pub struct Unique<T: Send> { // It contains a single raw, mutable pointer to the object in question. ptr: *mut T } // Implement methods for creating and using the values in the box. -// NB: For simplicity and correctness, we require that T has kind Send -// (owned boxes relax this restriction). impl<T: Send> Unique<T> { pub fn new(value: T) -> Unique<T> { unsafe { @@ -239,11 +240,11 @@ impl<T: Send> Unique<T> { // 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 parameterized types, due to -// bad interaction with managed boxes. (With the Send restriction, -// we don't have this problem.) Note that the `#[unsafe_destructor]` -// feature gate is required to use unsafe destructors. +// NB: This is an unsafe destructor; rustc will not normally allow +// destructors to be associated with parameterized types (due to +// historically failing to check them soundly). Note that the +// `#[unsafe_destructor]` feature gate is currently required to use +// unsafe destructors. #[unsafe_destructor] impl<T: Send> Drop for Unique<T> { fn drop(&mut self) { |
