Smart casts for local variables not captured in a closure and not changed in a loop, see #KT-3175.

isLocalVariable added. Assignment / initialization analysis.
Control whether a variable is changed in a loop at the beginning and at the end of the loop.
Control whether a variable is captured in a closure. #KT-3175  Fixed. #KT-2266  Fixed.
Tests for variable null safety and for variables is/as operations.
Loop / closure / variable property tests are included.
Old tests changed in accordance with KT-3175. In particular, all three of testSmartcastImpossible were fixed.
This commit is contained in:
Mikhail Glukhikh
2015-03-24 17:03:01 +03:00
parent e4b1046a54
commit d5aed62410
126 changed files with 1655 additions and 71 deletions
@@ -0,0 +1,19 @@
fun x(): Boolean { return true }
public fun foo(qq: String?): Int {
var q = qq
while(true) {
q!!.length()
var r = q
do {
var p = r
do {
// p = r, r = q and q is not null
<!DEBUG_INFO_SMARTCAST!>p<!>.length()
} while (!x())
} while (<!SENSELESS_COMPARISON!>r == null<!>) // r = q and q is not null
if (!x()) break
}
// Smart cast is possible
return <!DEBUG_INFO_SMARTCAST!>q<!>.length()
}