@@ -237,19 +237,19 @@ pub enum StatementKind<'tcx> {
237237
238238 /// `StorageLive` and `StorageDead` statements mark the live range of a local.
239239 ///
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.
253253 StorageLive ( Local ) ,
254254
255255 /// See `StorageLive` above.
0 commit comments