Rollup merge of #126154 - RalfJung:storage-live, r=compiler-errors
StorageLive: refresh storage (instead of UB) when local is already live Blocked on [this FCP](https://github.com/rust-lang/rust/issues/99160#issuecomment-2155924538), which also contains the motivation. Fixes https://github.com/rust-lang/rust/issues/99160 Fixes https://github.com/rust-lang/rust/issues/98896 (by declaring it not-a-bug) Fixes https://github.com/rust-lang/rust/issues/119366 Fixes https://github.com/rust-lang/unsafe-code-guidelines/issues/129
This commit is contained in:
commit
035285b464
7 changed files with 71 additions and 11 deletions
|
@ -361,16 +361,19 @@ pub enum StatementKind<'tcx> {
|
|||
/// At any point during the execution of a function, each local is either allocated or
|
||||
/// unallocated. Except as noted below, all locals except function parameters are initially
|
||||
/// unallocated. `StorageLive` statements cause memory to be allocated for the local while
|
||||
/// `StorageDead` statements cause the memory to be freed. Using a local in any way (not only
|
||||
/// reading/writing from it) while it is unallocated is UB.
|
||||
/// `StorageDead` statements cause the memory to be freed. In other words,
|
||||
/// `StorageLive`/`StorageDead` act like the heap operations `allocate`/`deallocate`, but for
|
||||
/// stack-allocated local variables. Using a local in any way (not only reading/writing from it)
|
||||
/// while it is unallocated is UB.
|
||||
///
|
||||
/// Some locals have no `StorageLive` or `StorageDead` statements within the entire MIR body.
|
||||
/// These locals are implicitly allocated for the full duration of the function. There is a
|
||||
/// convenience method at `rustc_mir_dataflow::storage::always_storage_live_locals` for
|
||||
/// computing these locals.
|
||||
///
|
||||
/// If the local is already allocated, calling `StorageLive` again is UB. However, for an
|
||||
/// unallocated local an additional `StorageDead` all is simply a nop.
|
||||
/// If the local is already allocated, calling `StorageLive` again will implicitly free the
|
||||
/// local and then allocate fresh uninitilized memory. If a local is already deallocated,
|
||||
/// calling `StorageDead` again is a NOP.
|
||||
StorageLive(Local),
|
||||
|
||||
/// See `StorageLive` above.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue