[FIR] Add checker for uninitialized properties
This commit is contained in:
Vendored
+7
-7
@@ -9,13 +9,13 @@ fun doSmth(i: Int) {}
|
||||
|
||||
fun t1(b : Boolean) {
|
||||
val v : Int
|
||||
if (v == 0) {}
|
||||
if (<!UNINITIALIZED_VARIABLE!>v<!> == 0) {}
|
||||
|
||||
var u: String
|
||||
if (b) {
|
||||
u = "s"
|
||||
}
|
||||
doSmth(u)
|
||||
doSmth(<!UNINITIALIZED_VARIABLE!>u<!>)
|
||||
|
||||
var r: String
|
||||
if (b) {
|
||||
@@ -28,10 +28,10 @@ fun t1(b : Boolean) {
|
||||
|
||||
var t: String
|
||||
if (b)
|
||||
doSmth(t)
|
||||
doSmth(<!UNINITIALIZED_VARIABLE!>t<!>)
|
||||
else
|
||||
t = "ss"
|
||||
doSmth(t) //repeat for t
|
||||
doSmth(<!UNINITIALIZED_VARIABLE!>t<!>) //repeat for t
|
||||
|
||||
val i = 3
|
||||
doSmth(i)
|
||||
@@ -207,7 +207,7 @@ class LocalValsVsProperties(val a: Int, w: Int) : Open(a, w) {
|
||||
val r : Int
|
||||
doSmth(x)
|
||||
doSmth(y)
|
||||
doSmth(r)
|
||||
doSmth(<!UNINITIALIZED_VARIABLE!>r<!>)
|
||||
doSmth(a)
|
||||
}
|
||||
var xx = w
|
||||
@@ -257,7 +257,7 @@ class ClassObject() {
|
||||
|
||||
fun foo() {
|
||||
val a : Int
|
||||
doSmth(a)
|
||||
doSmth(<!UNINITIALIZED_VARIABLE!>a<!>)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -317,7 +317,7 @@ object TestObjectDeclaration {
|
||||
if (1 < 3) {
|
||||
i = 10
|
||||
}
|
||||
doSmth(i)
|
||||
doSmth(<!UNINITIALIZED_VARIABLE!>i<!>)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -12,7 +12,7 @@ val a: Int
|
||||
return d
|
||||
}
|
||||
|
||||
return b
|
||||
return <!UNINITIALIZED_VARIABLE!>b<!>
|
||||
}
|
||||
|
||||
class A {
|
||||
@@ -21,7 +21,7 @@ class A {
|
||||
val b: Int
|
||||
val c: Int
|
||||
42
|
||||
return b
|
||||
return <!UNINITIALIZED_VARIABLE!>b<!>
|
||||
}
|
||||
|
||||
fun foo() {
|
||||
@@ -31,7 +31,7 @@ class A {
|
||||
val b: Int
|
||||
val c: Int
|
||||
42
|
||||
return b
|
||||
return <!UNINITIALIZED_VARIABLE!>b<!>
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -11,7 +11,7 @@ fun foo() {
|
||||
x = 42
|
||||
}
|
||||
// Error!
|
||||
x.hashCode()
|
||||
<!UNINITIALIZED_VARIABLE!>x<!>.hashCode()
|
||||
}
|
||||
|
||||
fun bar() {
|
||||
|
||||
+5
-5
@@ -8,7 +8,7 @@ fun foo() {
|
||||
}
|
||||
}
|
||||
// Error! See KT-10042
|
||||
x.length
|
||||
<!UNINITIALIZED_VARIABLE!>x<!>.length
|
||||
}
|
||||
|
||||
fun bar() {
|
||||
@@ -19,7 +19,7 @@ fun bar() {
|
||||
}
|
||||
}
|
||||
// Ok
|
||||
x.length
|
||||
<!UNINITIALIZED_VARIABLE!>x<!>.length
|
||||
}
|
||||
|
||||
fun gav() {
|
||||
@@ -31,7 +31,7 @@ fun gav() {
|
||||
}
|
||||
}
|
||||
// Error! See KT-10042
|
||||
x.length
|
||||
<!UNINITIALIZED_VARIABLE!>x<!>.length
|
||||
val y: String
|
||||
class C(val s: String) {
|
||||
constructor(): this("") {
|
||||
@@ -39,7 +39,7 @@ fun gav() {
|
||||
y = s
|
||||
}
|
||||
}
|
||||
y.length
|
||||
<!UNINITIALIZED_VARIABLE!>y<!>.length
|
||||
}
|
||||
|
||||
open class Gau(val s: String)
|
||||
@@ -53,7 +53,7 @@ fun gau() {
|
||||
}
|
||||
}
|
||||
// Ok
|
||||
x.length
|
||||
<!UNINITIALIZED_VARIABLE!>x<!>.length
|
||||
val y: String
|
||||
fun local() {
|
||||
object: Any() {
|
||||
|
||||
-8
@@ -1,8 +0,0 @@
|
||||
fun foo() {
|
||||
var x: Int
|
||||
fun bar() {
|
||||
x = 42
|
||||
}
|
||||
x.hashCode()
|
||||
bar()
|
||||
}
|
||||
+1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
fun foo() {
|
||||
var x: Int
|
||||
fun bar() {
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
//KT-2369 Variable is not marked as uninitialized in 'finally' section
|
||||
|
||||
fun main() {
|
||||
var x : Int
|
||||
try {
|
||||
throw Exception()
|
||||
}
|
||||
finally {
|
||||
doSmth(x + 1)
|
||||
}
|
||||
}
|
||||
|
||||
fun doSmth(a: Any?) = a
|
||||
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
//KT-2369 Variable is not marked as uninitialized in 'finally' section
|
||||
|
||||
fun main() {
|
||||
|
||||
@@ -12,7 +12,7 @@ private fun doTest() : Int {
|
||||
return 0 ;
|
||||
}
|
||||
finally {
|
||||
if(list != null) { // Must be an ERROR
|
||||
if(<!UNINITIALIZED_VARIABLE!>list<!> != null) { // Must be an ERROR
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ val o = object {
|
||||
p.x = 4
|
||||
|
||||
val z : Int
|
||||
doSmth(z)
|
||||
doSmth(<!UNINITIALIZED_VARIABLE!>z<!>)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@ class A {
|
||||
val a : Int = 1
|
||||
get() {
|
||||
val x : Int
|
||||
doSmth(x)
|
||||
doSmth(<!UNINITIALIZED_VARIABLE!>x<!>)
|
||||
return field
|
||||
}
|
||||
}
|
||||
|
||||
Vendored
+3
-3
@@ -15,7 +15,7 @@ fun f1(flag: Boolean) {
|
||||
// KT-13612: reassignment
|
||||
n = 3
|
||||
}
|
||||
n.hashCode()
|
||||
<!UNINITIALIZED_VARIABLE!>n<!>.hashCode()
|
||||
}
|
||||
|
||||
fun f2(flag: Boolean) {
|
||||
@@ -32,7 +32,7 @@ fun f2(flag: Boolean) {
|
||||
// KT-13612: reassignment
|
||||
n = 3
|
||||
}
|
||||
n.hashCode()
|
||||
<!UNINITIALIZED_VARIABLE!>n<!>.hashCode()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,6 +50,6 @@ fun f3(flag: Boolean) {
|
||||
// KT-13612: reassignment
|
||||
n = 3
|
||||
}
|
||||
n.hashCode()
|
||||
<!UNINITIALIZED_VARIABLE!>n<!>.hashCode()
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -10,6 +10,6 @@ class C {
|
||||
|
||||
fun foo() {
|
||||
val a : Int
|
||||
a + 1
|
||||
a + 1
|
||||
<!UNINITIALIZED_VARIABLE!>a<!> + 1
|
||||
<!UNINITIALIZED_VARIABLE!>a<!> + 1
|
||||
}
|
||||
|
||||
Vendored
+2
-2
@@ -23,14 +23,14 @@ fun test2() {
|
||||
fun test3() {
|
||||
val f = {
|
||||
val a : Int
|
||||
doSmth(a)
|
||||
doSmth(<!UNINITIALIZED_VARIABLE!>a<!>)
|
||||
}
|
||||
}
|
||||
|
||||
fun test4() {
|
||||
doSmth {
|
||||
val a : Int
|
||||
doSmth(a)
|
||||
doSmth(<!UNINITIALIZED_VARIABLE!>a<!>)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
-6
@@ -1,6 +0,0 @@
|
||||
fun bar(f: () -> Unit) = f()
|
||||
|
||||
fun foo() {
|
||||
var v: Any
|
||||
bar { v.hashCode() }
|
||||
}
|
||||
+1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
fun bar(f: () -> Unit) = f()
|
||||
|
||||
fun foo() {
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
//FILE: foo.kt
|
||||
fun main() {
|
||||
val c: Type
|
||||
when (c) {
|
||||
when (<!UNINITIALIZED_VARIABLE!>c<!>) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
// !LANGUAGE: +LateinitLocalVariables
|
||||
|
||||
fun test1() {
|
||||
lateinit var s: String
|
||||
<!UNINITIALIZED_VARIABLE!>s<!>.length
|
||||
}
|
||||
|
||||
fun test2() {
|
||||
lateinit var s: String
|
||||
run {
|
||||
s = ""
|
||||
}
|
||||
s.length
|
||||
}
|
||||
|
||||
fun almostAlwaysTrue(): Boolean = true
|
||||
|
||||
fun test3() {
|
||||
lateinit var s: String
|
||||
if (almostAlwaysTrue()) {
|
||||
s = ""
|
||||
}
|
||||
<!UNINITIALIZED_VARIABLE!>s<!>.length
|
||||
}
|
||||
@@ -1,4 +1,3 @@
|
||||
// FIR_IDENTICAL
|
||||
// !LANGUAGE: +LateinitLocalVariables
|
||||
|
||||
fun test1() {
|
||||
|
||||
@@ -5,5 +5,5 @@ fun foo(k: Int): Int {
|
||||
for (j in 1..k) {
|
||||
i = j
|
||||
}
|
||||
return i
|
||||
return <!UNINITIALIZED_VARIABLE!>i<!>
|
||||
}
|
||||
@@ -4,7 +4,7 @@ package kt455
|
||||
|
||||
fun foo() {
|
||||
val a: Int
|
||||
doSmth(a) //error
|
||||
doSmth(a) //no repeat error
|
||||
doSmth(<!UNINITIALIZED_VARIABLE!>a<!>) //error
|
||||
doSmth(<!UNINITIALIZED_VARIABLE!>a<!>) //no repeat error
|
||||
}
|
||||
fun doSmth(i: Int) {}
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@ public fun foo(x: String?): Int {
|
||||
y = if (x == null) break else x
|
||||
}
|
||||
// In future we can infer this initialization
|
||||
y.hashCode()
|
||||
<!UNINITIALIZED_VARIABLE!>y<!>.hashCode()
|
||||
// x is null because of the break
|
||||
return x.<!INAPPLICABLE_CANDIDATE!>length<!>
|
||||
}
|
||||
|
||||
+1
-1
@@ -18,5 +18,5 @@ fun bar(a: Boolean, b: Boolean): Int {
|
||||
when (b) {
|
||||
false -> x = 3
|
||||
}
|
||||
return x
|
||||
return <!UNINITIALIZED_VARIABLE!>x<!>
|
||||
}
|
||||
+1
-1
@@ -18,5 +18,5 @@ fun bar(a: Boolean, b: Boolean): Int {
|
||||
when (b) {
|
||||
false -> x = 3
|
||||
}
|
||||
return x
|
||||
return <!UNINITIALIZED_VARIABLE!>x<!>
|
||||
}
|
||||
+1
-1
@@ -12,7 +12,7 @@ fun testSimpleValInWhenSubject() {
|
||||
|
||||
fun testValWithoutInitializerWhenSubject() {
|
||||
when (val y: Any) {
|
||||
is String -> y.<!UNRESOLVED_REFERENCE!>length<!>
|
||||
is String -> <!UNINITIALIZED_VARIABLE!>y<!>.<!UNRESOLVED_REFERENCE!>length<!>
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user