So I did some more digging and added some custom diagnostics to miri and found this:
5 | let x = &mut x;
| ^^^^^^ stack accessed using <2945>: [UNQ<2945>]
| ^^^^^^ stack updated [added <2946>] to [UNQ<2945>, UNQ<2946>]
6 | let ptr = &mut *x as *mut i32;
| ^^^^^^^ stack accessed using <2946>: [UNQ<2945>, UNQ<2946>]
| ^^^^^^^ stack updated [added <2947>] to [UNQ<2945>, UNQ<2946>, UNQ<2947>]
| ^^^^^^^ stack updated [added <2948>] to [UNQ<2945>, UNQ<2946>, UNQ<2947>, SRW<2948>]
7 | *ptr += 20;
| ^^^^^^^^^^ stack accessed using <2948>: [UNQ<2945>, UNQ<2946>, UNQ<2947>, SRW<2948>]
8 | &*x;
| ^^^ stack updated [changed <2947>] to [UNQ<2945>, UNQ<2946>, DBL<2947>, SRW<2948>]
| ^^^ stack accessed using <2946>: [UNQ<2945>, UNQ<2946>, DBL<2947>, SRW<2948>]
| ^^^ stack updated [added <2949>] to [UNQ<2945>, UNQ<2946>, DBL<2947>, SRW<2948>, SRO<2949>]
9 | *ptr += 20;
| ^^^^^^^^^^ stack accessed using <2948>: [UNQ<2945>, UNQ<2946>, DBL<2947>, SRW<2948>, SRO<2949>]
| ^^^^^^^^^^ stack updated [removed <2949>] to [UNQ<2945>, UNQ<2946>, DBL<2947>, SRW<2948>]
| ^^^^^^^^^^ stack accessed using <2948>: [UNQ<2945>, UNQ<2946>, DBL<2947>, SRW<2948>]
10 | &*x;
| ^^^ stack accessed using <2946>: [UNQ<2945>, UNQ<2946>, DBL<2947>, SRW<2948>]
| ^^^ stack updated [added <2950>] to [UNQ<2945>, UNQ<2946>, DBL<2947>, SRW<2948>, SRO<2950>]
Raw data
note: tracking was triggered
--> src/main.rs:5:17
|
5 | let x = &mut x;
| ^^^^^^ created allocation with id 1533
|
= note: inside `main` at src/main.rs:5:17
note: tracking was triggered
--> src/main.rs:5:17
|
5 | let x = &mut x;
| ^^^^^^ stack accessed using <2945>: [UNQ<2945>]
|
= note: inside `main` at src/main.rs:5:17
note: tracking was triggered
--> src/main.rs:5:17
|
5 | let x = &mut x;
| ^^^^^^ stack updated [added <2946>] to [UNQ<2945>, UNQ<2946>]
|
= note: inside `main` at src/main.rs:5:17
note: tracking was triggered
--> src/main.rs:6:19
|
6 | let ptr = &mut *x as *mut i32;
| ^^^^^^^ stack accessed using <2946>: [UNQ<2945>, UNQ<2946>]
|
= note: inside `main` at src/main.rs:6:19
note: tracking was triggered
--> src/main.rs:6:19
|
6 | let ptr = &mut *x as *mut i32;
| ^^^^^^^ stack updated [added <2947>] to [UNQ<2945>, UNQ<2946>, UNQ<2947>]
|
= note: inside `main` at src/main.rs:6:19
note: tracking was triggered
--> src/main.rs:6:19
|
6 | let ptr = &mut *x as *mut i32;
| ^^^^^^^ stack updated [added <2948>] to [UNQ<2945>, UNQ<2946>, UNQ<2947>, SRW<2948>]
|
= note: inside `main` at src/main.rs:6:19
note: tracking was triggered
--> src/main.rs:7:9
|
7 | *ptr += 20;
| ^^^^^^^^^^ stack accessed using <2948>: [UNQ<2945>, UNQ<2946>, UNQ<2947>, SRW<2948>]
|
= note: inside `main` at src/main.rs:7:9
note: tracking was triggered
--> src/main.rs:8:9
|
8 | &*x;
| ^^^ stack updated [changed <2947>] to [UNQ<2945>, UNQ<2946>, DBL<2947>, SRW<2948>]
|
= note: inside `main` at src/main.rs:8:9
note: tracking was triggered
--> src/main.rs:8:9
|
8 | &*x;
| ^^^ stack accessed using <2946>: [UNQ<2945>, UNQ<2946>, DBL<2947>, SRW<2948>]
|
= note: inside `main` at src/main.rs:8:9
note: tracking was triggered
--> src/main.rs:8:9
|
8 | &*x;
| ^^^ stack updated [added <2949>] to [UNQ<2945>, UNQ<2946>, DBL<2947>, SRW<2948>, SRO<2949>]
|
= note: inside `main` at src/main.rs:8:9
note: tracking was triggered
--> src/main.rs:9:9
|
9 | *ptr += 20;
| ^^^^^^^^^^ stack accessed using <2948>: [UNQ<2945>, UNQ<2946>, DBL<2947>, SRW<2948>, SRO<2949>]
|
= note: inside `main` at src/main.rs:9:9
note: tracking was triggered
--> src/main.rs:9:9
|
9 | *ptr += 20;
| ^^^^^^^^^^ stack updated [removed <2949>] to [UNQ<2945>, UNQ<2946>, DBL<2947>, SRW<2948>]
|
= note: inside `main` at src/main.rs:9:9
note: tracking was triggered
--> src/main.rs:9:9
|
9 | *ptr += 20;
| ^^^^^^^^^^ stack accessed using <2948>: [UNQ<2945>, UNQ<2946>, DBL<2947>, SRW<2948>]
|
= note: inside `main` at src/main.rs:9:9
note: tracking was triggered
--> src/main.rs:10:9
|
10 | &*x;
| ^^^ stack accessed using <2946>: [UNQ<2945>, UNQ<2946>, DBL<2947>, SRW<2948>]
|
= note: inside `main` at src/main.rs:10:9
note: tracking was triggered
--> src/main.rs:10:9
|
10 | &*x;
| ^^^ stack updated [added <2950>] to [UNQ<2945>, UNQ<2946>, DBL<2947>, SRW<2948>, SRO<2950>]
|
= note: inside `main` at src/main.rs:10:9
I also differentiated between two-phase borrows by adding a new permission tag that would print TPU
, but I do not see it in the output (so either I did not add it correctly, or there are no two-phase borrows here).