From d2b515a58ce604a454f5c616bd760aa96e6b38c7 Mon Sep 17 00:00:00 2001 From: Daniel Henry-Mantilla Date: Mon, 7 Aug 2023 20:06:31 +0200 Subject: [PATCH] Improve the `PhantomData` table - simplify and clarify the auto-traits (_c.f._, #411) - No more `-` in the auto-traits part - move `dropck` to its own dedicated column - Name the `'a` and `T` columns with "variance" - Emphasize the `cov` _vs._ `inv` _vs._ `contra` distinctions - Add a mention to the `PhantomPinned` type. --- src/phantom-data.md | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/phantom-data.md b/src/phantom-data.md index 449d9e7..1cfd38f 100644 --- a/src/phantom-data.md +++ b/src/phantom-data.md @@ -234,14 +234,18 @@ standard library made a utility for itself called `Unique` which: Here’s a table of all the wonderful ways `PhantomData` could be used: -| Phantom type | `'a` | `T` | `Send` | `Sync` | -|-----------------------------|-----------|-----------------------------|-----------|-----------| -| `PhantomData` | - | covariant (with drop check) | `T: Send` | `T: Sync` | -| `PhantomData<&'a T>` | covariant | covariant | `T: Sync` | `T: Sync` | -| `PhantomData<&'a mut T>` | covariant | invariant | `T: Send` | `T: Sync` | -| `PhantomData<*const T>` | - | covariant | - | - | -| `PhantomData<*mut T>` | - | invariant | - | - | -| `PhantomData` | - | contravariant | `Send` | `Sync` | -| `PhantomData T>` | - | covariant | `Send` | `Sync` | -| `PhantomData T>` | - | invariant | `Send` | `Sync` | -| `PhantomData>` | invariant | - | `Send` | - | +| Phantom type | variance of `'a` | variance of `T` | `Send`/`Sync`
(or lack thereof) | dangling `'a` or `T` in drop glue
(_e.g._, `#[may_dangle] Drop`) | +|-----------------------------|:----------------:|:-----------------:|:-----------------------------------------:|:------------------------------------------------:| +| `PhantomData` | - | **cov**ariant | inherited | disallowed ("owns `T`") | +| `PhantomData<&'a T>` | **cov**ariant | **cov**ariant | `Send + Sync`
requires
`T : Sync` | allowed | +| `PhantomData<&'a mut T>` | **cov**ariant | **inv**ariant | inherited | allowed | +| `PhantomData<*const T>` | - | **cov**ariant | `!Send + !Sync` | allowed | +| `PhantomData<*mut T>` | - | **inv**ariant | `!Send + !Sync` | allowed | +| `PhantomData` | - | **contra**variant | `Send + Sync` | allowed | +| `PhantomData T>` | - | **cov**ariant | `Send + Sync` | allowed | +| `PhantomData T>` | - | **inv**ariant | `Send + Sync` | allowed | +| `PhantomData>` | **inv**ariant | - | `Send + !Sync` | allowed | + + - Note: opting out of the `Unpin` auto-trait requires the dedicated [`PhantomPinned`] type instead. + +[`PhantomPinned`]: ../core/marker/struct.PhantomPinned.html