| See https://github.com/rust-lang/rust/issues/107975 |
| |
| Basically, if you have two pointers with the same address but from two different allocations, |
| the compiler gets confused whether their addresses are equal or not, |
| resulting in some self-contradictory behavior of the compiled code. |
| |
| This folder contains some examples. |
| They all boil down to allocating a variable on the stack, taking its address, |
| getting rid of the variable, and then doing it all again. |
| This way we end up with two addresses stored in two `usize`s (`a` and `b`). |
| The addresses are (probably) equal but (definitely) come from two different allocations. |
| Logically, we would expect that exactly one of the following options holds true: |
| 1. `a == b` |
| 2. `a != b` |
| Sadly, the compiler does not always agree. |
| |
| Due to Rust having at least three meaningfully different ways |
| to get a variable's address as an `usize`, |
| each example is provided in three versions, each in the corresponding subfolder: |
| 1. `./as-cast/` for `&v as *const _ as usize`, |
| 2. `./strict-provenance/` for `addr_of!(v).addr()`, |
| 2. `./exposed-provenance/` for `addr_of!(v).expose_provenance()`. |