@@ -237,19 +237,19 @@ pub enum StatementKind<'tcx> {
237
237
238
238
/// `StorageLive` and `StorageDead` statements mark the live range of a local.
239
239
///
240
- /// Using a local before a `StorageLive` or after a `StorageDead` is not well-formed. These
241
- /// statements are not required. If the entire MIR body contains no `StorageLive`/`StorageDead`
242
- /// statements for a particular local, the local is always considered live.
243
- ///
244
- /// More precisely, the MIR validator currently does a `MaybeStorageLiveLocals` analysis to
245
- /// check validity of each use of a local. I believe this is equivalent to requiring for every
246
- /// use of a local, there exist at least one path from the root to that use that contains a
247
- /// `StorageLive` more recently than a `StorageDead`.
248
- ///
249
- /// **Needs clarification**: Is it permitted to have two `StorageLive`s without an intervening
250
- /// `StorageDead`? Two `StorageDead`s without an intervening `StorageLive`? LLVM says poison,
251
- /// yes. If the answer to any of these is "no," is breaking that rule UB or is it an error to
252
- /// have a path in the CFG that might do this?
240
+ /// At any point during the execution of a function, each local is either allocated or
241
+ /// unallocated. Except as noted below, all locals except function parameters are initially
242
+ /// unallocated. `StorageLive` statements cause memory to be allocated for the local while
243
+ /// `StorageDead` statements cause the memory to be freed. Using a local in any way (not only
244
+ /// reading/writing from it) while it is unallocated is UB.
245
+ ///
246
+ /// Some locals have no `StorageLive` or `StorageDead` statements within the entire MIR body.
247
+ /// These locals are implicitly allocated for the full duration of the function. There is a
248
+ /// convenience method at `rustc_mir_dataflow::storage::always_storage_live_locals` for
249
+ /// computing these locals.
250
+ ///
251
+ /// If the local is already allocated, calling `StorageLive` again is UB. However, for an
252
+ /// unallocated local an additional `StorageDead` all is simply a nop.
253
253
StorageLive ( Local ) ,
254
254
255
255
/// See `StorageLive` above.
0 commit comments