rust/tests/ui/mir-dataflow
..
def-inits-1.rs
def-inits-1.stderr
inits-1.rs
inits-1.stderr
liveness-enum.rs
liveness-enum.stderr
liveness-projection.rs
liveness-projection.stderr
liveness-ptr.rs
liveness-ptr.stderr
README.md
uninits-1.rs
uninits-1.stderr
uninits-2.rs
uninits-2.stderr

This directory contains unit tests for the MIR-based dataflow analysis.

These unit tests check the dataflow analysis by embedding calls to a special rustc_peek intrinsic within the code, in tandem with an attribute #[rustc_mir(rustc_peek_maybe_init)] (*). With that attribute in place, rustc_peek calls are a signal to the compiler to lookup the computed dataflow state for the Lvalue corresponding to the argument expression being fed to rustc_peek. If the dataflow state for that Lvalue is a 1-bit at that point in the control flow, then no error is emitted by the compiler at that point; if it is a 0-bit, then that invocation of rustc_peek will emit an error with the message "rustc_peek: bit not set".

(*): Or #[rustc_mir(rustc_peek_maybe_uninit)], and perhaps other variants in the future.

The end effect is that one can write unit tests for MIR dataflow that perform simple-queries of the computed dataflow state, and the tests should be able to be robust in the face of changes to how MIR is represented or constructed.


Sometimes understanding the dataflow results is difficult without looking at the actual MIR control-flow graph being processed with the corresponding GEN and KILL sets.

For a graphviz-rendering with dataflow annotations, add the attribute #[rustc_mir(borrowck_graphviz_postflow="/path/to/suffix.dot")] to the function in question. (You can change the content of "suffix.dot" to control the filenames used for the output). This will generate a separate file for each dataflow analysis, adding a prefix (corresponding to the name of the analysis) to the filename in each generated output path.

  • For example, the above attribute will currently cause two files to be generated: /path/to/maybe_init_suffix.dot and /path/to/maybe_uninit_suffix.dot.

  • The generated .dot file shows both the computed dataflow results on entry to each block, as well as the gen- and kill-sets that were so-called "transfer functions" summarizing the effect of each basic block.

  • (In addition to the borrowck_graphviz_postflow attribute-key noted above, there is also borrowck_graphviz_preflow; it has the same interface and generates the same set of files, but it renders the dataflow state after building the gen- and kill-sets but before running the dataflow analysis itself, so each entry-set is just the initial default state for that dataflow analysis. This is less useful for understanding the error message output in these tests.)