Skip to content

Commit

Permalink
Add Gankro's table to nomicon/src/phantom-data.md
Browse files Browse the repository at this point in the history
Original: rust-lang#30069 (comment)

Testing confirms that:

  - PhantomData<fn() -> T> does not actually enable drop checking.
  - PhantomData<fn(T) -> T> is neither variant nor contravariant.
  • Loading branch information
Rufflewind committed Feb 25, 2017
1 parent 413a975 commit 1f75085
Showing 1 changed file with 20 additions and 2 deletions.
22 changes: 20 additions & 2 deletions src/doc/nomicon/src/phantom-data.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,5 +82,23 @@ standard library made a utility for itself called `Unique<T>` which:

* wraps a `*const T` for variance
* includes a `PhantomData<T>`
* auto-derives Send/Sync as if T was contained
* marks the pointer as NonZero for the null-pointer optimization
* auto-derives `Send`/`Sync` as if T was contained
* marks the pointer as `NonZero` for the null-pointer optimization

## Table of `PhantomData` patterns

Here’s a table of all the wonderful ways `PhantomData` could be used:

| Phantom type | `'a` | `T` |
|-----------------------------|-----------|---------------------------|
| `PhantomData<T>` | - | variant (with drop check) |
| `PhantomData<&'a T>` | variant | variant |
| `PhantomData<&'a mut T>` | variant | invariant |
| `PhantomData<*const T>` | - | variant |
| `PhantomData<*mut T>` | - | invariant |
| `PhantomData<fn(T)>` | - | contravariant (*) |
| `PhantomData<fn() -> T>` | - | variant |
| `PhantomData<fn(T) -> T>` | - | invariant |
| `PhantomData<Cell<&'a ()>>` | invariant | - |

(*) If contravariance gets scrapped, this would be invariant.

0 comments on commit 1f75085

Please sign in to comment.