FIR DFA: fork flow everywhere

In theory, forking persistent flows should be cheap because of object
reuse, so the proposal here is to start from scratch and prove
redundancy of forks on a case-by-case basis. Something something better
safe than sorry.

^KT-28333 tag fixed-in-k2
^KT-28489 tag fixed-in-k2
This commit is contained in:
pyos
2022-11-08 21:33:40 +01:00
committed by teamcity
parent 757921e63e
commit edaca59d83
17 changed files with 554 additions and 683 deletions
@@ -8,7 +8,7 @@ fun calc(x: String?, y: String?): Int {
// x is not null in condition but we do not see it yet
} while (x.length > 0)
// y is nullable because of break
y.length
y<!UNSAFE_CALL!>.<!>length
// x is not null, at least in theory
return x.length
}
@@ -7,5 +7,5 @@ fun test(foo: Foo?) {
// Unnecessary
foo<!UNNECESSARY_SAFE_CALL!>?.<!>bar?.length
}
foo.bar<!UNNECESSARY_SAFE_CALL!>?.<!>length
foo.bar?.length
}
@@ -3,7 +3,7 @@ fun foo(y: String?) {
if (x != null) {
with(y?.let { x = null; it }) {
this<!UNSAFE_CALL!>.<!>length
x<!UNSAFE_CALL!>.<!>length
<!SMARTCAST_IMPOSSIBLE!>x<!>.length
}
x<!UNSAFE_CALL!>.<!>length
}