FIR CFG: when unifying flows, group statements by assignment

Consider a function `run2` that has 2 lambda arguments called in place.
We don't know the order in which they're called, so here:

    var x: Any? = something
    run2(
      { x = null },
      { x as String },
    )
    // <--

it's not correct to simply `&&` the statements together, as that would
produce `x is Nothing? && x is String && x is Any?`. Instead, statements
should be grouped by assignment first, and different groups are `||`-ed.
This means in the above example we now get `x is Nothing? || (x is Any?
&& x is String)` == `x is String?`.
This commit is contained in:
pyos
2022-06-15 11:20:48 +02:00
committed by teamcity
parent 25f66b4e0e
commit c2ae74c7cd
11 changed files with 514 additions and 51 deletions
@@ -1083,6 +1083,12 @@ public class DiagnosisCompilerFirTestdataTestGenerated extends AbstractDiagnosis
runTest("compiler/fir/analysis-tests/testData/resolve/cfg/flowFromInplaceLambda2.kt");
}
@Test
@TestMetadata("flowFromTwoInplaceLambdas.kt")
public void testFlowFromTwoInplaceLambdas() throws Exception {
runTest("compiler/fir/analysis-tests/testData/resolve/cfg/flowFromTwoInplaceLambdas.kt");
}
@Test
@TestMetadata("initBlock.kt")
public void testInitBlock() throws Exception {