Hi! I’m playing with the dataflow analysis of librustc_mir by running it on the following example:
fn main() {
let cond: bool = true;
if cond { // switchInt(move _2)
// here _2 is still definitely initialised.
} else {
// here _2 is still definitely initialised.
}
// StorageDead(_2)
}
The generated MIR contains a terminator switchInt(move _2). I expected _2 to be tracked as “definitely uninitialized” after that move. However, the effect of this terminator does not add _2 (of type bool) to the “maybe uninitialized” gen set (nor to the “maybe initialized” kill set). In other words, it seems to me that _2 remains “definitely initialized” after the branch.
Is this intended? Is the switchInt(move _2) really a move of _2?
(I use a compiler driver plugin to obtain the MIR with optimized_mir(..), then I call mir_borrowck(..) on it and I inspect the state: Flows variable in do_mir_borrowck(..) to check the result of the dataflow analysis).