I had a bit of fun with the tags.
Liveness analysis calculates the set of live/dead values in the program. However, statements don't always have a value associated with them, expressions do. For this reason, I found it puzzling why LivenessAnalysis work with "live statements", or answers questions such as "is this statement live". After a bit of digging, I found that the only client of statement liveness is EnvironmentManager::removeDeadBindings (the one modified in this patch), and the only non-expression statement it queries are ObjCForCollectionStmts, but no lit tests crashed on the added asserts.
This patch isn't necesserily intended to be committed -- it more of a request for comments whether it would be safe to change statement liveness to strictly expression liveness. It would be great, because my ultimate goal is to merge the implementation of UninitializedVariable and LivenessAnalaysis, and add Reaching Definitions under the same hood, but the statement liveness was very much out of place and makes the merge very awkward, if even possible.
I have a number of changes planned, but I didn't want to go too far ahead of myself, in case I missed something fundamental that justifies statement liveness as it is.