Rollup merge of #114965 - benschulz:mpsc-drop, r=dtolnay

Remove Drop impl of mpsc Receiver and (Sync)Sender

This change removes the empty `Drop` implementations for `mpsc::Receiver`, `mpsc::Sender` and `mpsc::SyncSender`. These implementations do not specify `#[may_dangle]`, so by removing them we make `mpsc` types play nice with drop check.

This was previously attempted in [#105243](https://github.com/rust-lang/rust/pull/105243#issuecomment-1337188646) but then [abandoned due to a test failure](https://github.com/rust-lang/rust/pull/105243#issuecomment-1337227970). I've aligned the test with those for `Mutex` and `RwLock`.
This commit is contained in:
Dylan DPC 2023-09-17 11:23:23 +00:00 committed by GitHub
commit 7cbe7fa6bf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 4 additions and 21 deletions

View File

@ -626,11 +626,6 @@ impl<T> Clone for Sender<T> {
}
}
#[stable(feature = "rust1", since = "1.0.0")]
impl<T> Drop for Sender<T> {
fn drop(&mut self) {}
}
#[stable(feature = "mpsc_debug", since = "1.8.0")]
impl<T> fmt::Debug for Sender<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
@ -755,11 +750,6 @@ impl<T> Clone for SyncSender<T> {
}
}
#[stable(feature = "rust1", since = "1.0.0")]
impl<T> Drop for SyncSender<T> {
fn drop(&mut self) {}
}
#[stable(feature = "mpsc_debug", since = "1.8.0")]
impl<T> fmt::Debug for SyncSender<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
@ -1096,11 +1086,6 @@ impl<T> IntoIterator for Receiver<T> {
}
}
#[stable(feature = "rust1", since = "1.0.0")]
impl<T> Drop for Receiver<T> {
fn drop(&mut self) {}
}
#[stable(feature = "mpsc_debug", since = "1.8.0")]
impl<T> fmt::Debug for Receiver<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {

View File

@ -46,7 +46,7 @@ fn channel() {
tx.send(&z).unwrap();
}
//~^^ ERROR `z` does not live long enough
// (channels lack #[may_dangle], thus their dtors are implicit uses of `z`)
tx.use_ref(); // (channel drop glue does not use `z` => needs explicit use)
}
fn main() {}

View File

@ -75,11 +75,9 @@ LL | tx.send(&z).unwrap();
| ^^ borrowed value does not live long enough
LL | }
| - `z` dropped here while still borrowed
...
LL | }
| - borrow might be used here, when `tx` is dropped and runs the `Drop` code for type `Sender`
|
= note: values in a scope are dropped in the opposite order they are defined
LL |
LL | tx.use_ref(); // (channel drop glue does not use `z` => needs explicit use)
| -- borrow later used here
error: aborting due to 6 previous errors