Skip to content

Commit

Permalink
Auto merge of rust-lang#114965 - benschulz:mpsc-drop, r=dtolnay
Browse files Browse the repository at this point in the history
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 [rust-lang#105243](rust-lang#105243 (comment)) but then [abandoned due to a test failure](rust-lang#105243 (comment)). I've aligned the test with those for `Mutex` and `RwLock`.
  • Loading branch information
bors committed Sep 17, 2023
2 parents 8ed1d4a + a38ea96 commit 4ce79c4
Show file tree
Hide file tree
Showing 3 changed files with 4 additions and 21 deletions.
15 changes: 0 additions & 15 deletions library/std/src/sync/mpsc/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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 {
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/span/send-is-not-static-std-sync.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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() {}
Expand Down
8 changes: 3 additions & 5 deletions tests/ui/span/send-is-not-static-std-sync.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down

0 comments on commit 4ce79c4

Please sign in to comment.