f8039249c6
Also #KT-13612 Fixed (cherry picked from commit 7c188b3)
138 lines
14 KiB
Plaintext
Vendored
138 lines
14 KiB
Plaintext
Vendored
== sample ==
|
|
fun sample(): String? {
|
|
try {
|
|
if (false) {
|
|
return "fail"
|
|
} else {
|
|
if (false) {
|
|
if (false) {
|
|
var foo: String? = null
|
|
try {
|
|
foo = "test"
|
|
} catch (e: Exception) {
|
|
return "fail"
|
|
} finally {
|
|
println(foo) // Variable 'foo' must be initialized
|
|
}
|
|
}
|
|
return "fail"
|
|
}
|
|
}
|
|
} finally {}
|
|
return null
|
|
}
|
|
---------------------
|
|
L0:
|
|
1 <START> INIT: in: {} out: {}
|
|
2 mark({ try { if (false) { return "fail" } else { if (false) { if (false) { var foo: String? = null try { foo = "test" } catch (e: Exception) { return "fail" } finally { println(foo) // Variable 'foo' must be initialized } } return "fail" } } } finally {} return null })
|
|
mark(try { if (false) { return "fail" } else { if (false) { if (false) { var foo: String? = null try { foo = "test" } catch (e: Exception) { return "fail" } finally { println(foo) // Variable 'foo' must be initialized } } return "fail" } } } finally {})
|
|
jmp?(L2)
|
|
3 mark({ if (false) { return "fail" } else { if (false) { if (false) { var foo: String? = null try { foo = "test" } catch (e: Exception) { return "fail" } finally { println(foo) // Variable 'foo' must be initialized } } return "fail" } } })
|
|
mark(if (false) { return "fail" } else { if (false) { if (false) { var foo: String? = null try { foo = "test" } catch (e: Exception) { return "fail" } finally { println(foo) // Variable 'foo' must be initialized } } return "fail" } })
|
|
r(false) -> <v0>
|
|
jf(L3|<v0>)
|
|
4 mark({ return "fail" })
|
|
jmp?(L2)
|
|
mark("fail")
|
|
r("fail") -> <v1>
|
|
L4 [start finally]:
|
|
5 mark({})
|
|
read (Unit)
|
|
L5 [finish finally]:
|
|
4 ret(*|<v1>) L1 USE: in: {} out: {}
|
|
- 3 jmp(L6)
|
|
L3 [else branch]:
|
|
4 mark({ if (false) { if (false) { var foo: String? = null try { foo = "test" } catch (e: Exception) { return "fail" } finally { println(foo) // Variable 'foo' must be initialized } } return "fail" } }) INIT: in: {} out: {}
|
|
mark(if (false) { if (false) { var foo: String? = null try { foo = "test" } catch (e: Exception) { return "fail" } finally { println(foo) // Variable 'foo' must be initialized } } return "fail" })
|
|
r(false) -> <v3>
|
|
jf(L7|<v3>)
|
|
5 mark({ if (false) { var foo: String? = null try { foo = "test" } catch (e: Exception) { return "fail" } finally { println(foo) // Variable 'foo' must be initialized } } return "fail" })
|
|
mark(if (false) { var foo: String? = null try { foo = "test" } catch (e: Exception) { return "fail" } finally { println(foo) // Variable 'foo' must be initialized } })
|
|
r(false) -> <v4>
|
|
jf(L8|<v4>) USE: in: {} out: {}
|
|
6 mark({ var foo: String? = null try { foo = "test" } catch (e: Exception) { return "fail" } finally { println(foo) // Variable 'foo' must be initialized } })
|
|
v(var foo: String? = null) INIT: in: {} out: {foo=D}
|
|
r(null) -> <v5> INIT: in: {foo=D} out: {foo=D}
|
|
w(foo|<v5>) INIT: in: {foo=D} out: {foo=ID}
|
|
mark(try { foo = "test" } catch (e: Exception) { return "fail" } finally { println(foo) // Variable 'foo' must be initialized }) INIT: in: {foo=ID} out: {foo=ID}
|
|
jmp?(L9)
|
|
jmp?(L10) USE: in: {foo=READ} out: {foo=READ}
|
|
7 mark({ foo = "test" })
|
|
mark("test")
|
|
r("test") -> <v6> USE: in: {foo=WRITTEN_AFTER_READ} out: {foo=WRITTEN_AFTER_READ}
|
|
w(foo|<v6>) USE: in: {foo=READ} out: {foo=WRITTEN_AFTER_READ}
|
|
6 jmp?(L9)
|
|
jmp?(L10)
|
|
jmp(L11)
|
|
L9 [onException]:
|
|
7 v(e: Exception) INIT: in: {foo=ID} out: {e=D, foo=ID}
|
|
magic[FAKE_INITIALIZER](e: Exception) -> <v8> INIT: in: {e=D, foo=ID} out: {e=D, foo=ID}
|
|
w(e|<v8>) INIT: in: {e=D, foo=ID} out: {e=ID, foo=ID}
|
|
8 mark({ return "fail" }) INIT: in: {e=ID, foo=ID} out: {e=ID, foo=ID}
|
|
jmp?(L2)
|
|
mark("fail")
|
|
r("fail") -> <v9>
|
|
L12 [start finally]:
|
|
9 mark({ println(foo) // Variable 'foo' must be initialized }) USE: in: {foo=READ} out: {foo=READ}
|
|
r(foo) -> <v10> USE: in: {} out: {foo=READ}
|
|
mark(println(foo))
|
|
magic[UNRESOLVED_CALL](println(foo)|<v10>, !<v11>) -> <v12>
|
|
L13 [finish finally]:
|
|
5 mark({}) INIT: in: {} out: {}
|
|
read (Unit)
|
|
8 ret(*|<v9>) L1 USE: in: {} out: {}
|
|
- 7 jmp(L11)
|
|
L11 [afterCatches]:
|
|
6 jmp(L14) INIT: in: {foo=ID} out: {foo=ID}
|
|
L10 [onExceptionToFinallyBlock]:
|
|
9 mark({ println(foo) // Variable 'foo' must be initialized }) USE: in: {foo=READ} out: {foo=READ}
|
|
r(foo) -> <v10> USE: in: {} out: {foo=READ}
|
|
mark(println(foo))
|
|
magic[UNRESOLVED_CALL](println(foo)|<v10>, !<v11>) -> <v12>
|
|
5 mark({}) INIT: in: {} out: {}
|
|
read (Unit)
|
|
6 jmp(error) USE: in: {} out: {}
|
|
L14 [skipFinallyToErrorBlock]:
|
|
9 mark({ println(foo) // Variable 'foo' must be initialized }) INIT: in: {foo=ID} out: {foo=ID} USE: in: {foo=READ} out: {foo=READ}
|
|
r(foo) -> <v10> USE: in: {} out: {foo=READ}
|
|
mark(println(foo))
|
|
magic[UNRESOLVED_CALL](println(foo)|<v10>, !<v11>) -> <v12>
|
|
6 merge(try { foo = "test" } catch (e: Exception) { return "fail" } finally { println(foo) // Variable 'foo' must be initialized }|!<v7>, !<v13>) -> <v14>
|
|
5 jmp(L15) INIT: in: {} out: {}
|
|
L8 [else branch]:
|
|
read (Unit)
|
|
L15 ['if' expression result]:
|
|
merge(if (false) { var foo: String? = null try { foo = "test" } catch (e: Exception) { return "fail" } finally { println(foo) // Variable 'foo' must be initialized } }|<v14>) -> <v15>
|
|
jmp?(L2)
|
|
mark("fail")
|
|
r("fail") -> <v16>
|
|
mark({})
|
|
read (Unit)
|
|
ret(*|<v16>) L1 USE: in: {} out: {}
|
|
- 4 jmp(L16)
|
|
L7 [else branch]:
|
|
read (Unit) INIT: in: {} out: {}
|
|
L16 ['if' expression result]:
|
|
merge(if (false) { if (false) { var foo: String? = null try { foo = "test" } catch (e: Exception) { return "fail" } finally { println(foo) // Variable 'foo' must be initialized } } return "fail" }|!<v17>) -> <v18>
|
|
L6 ['if' expression result]:
|
|
3 merge(if (false) { return "fail" } else { if (false) { if (false) { var foo: String? = null try { foo = "test" } catch (e: Exception) { return "fail" } finally { println(foo) // Variable 'foo' must be initialized } } return "fail" } }|!<v2>, <v18>) -> <v19>
|
|
2 jmp?(L2)
|
|
jmp(L17)
|
|
L2 [onExceptionToFinallyBlock]:
|
|
5 mark({})
|
|
read (Unit)
|
|
2 jmp(error)
|
|
L17 [skipFinallyToErrorBlock]:
|
|
5 mark({})
|
|
read (Unit)
|
|
2 merge(try { if (false) { return "fail" } else { if (false) { if (false) { var foo: String? = null try { foo = "test" } catch (e: Exception) { return "fail" } finally { println(foo) // Variable 'foo' must be initialized } } return "fail" } } } finally {}|<v19>) -> <v20>
|
|
r(null) -> <v21>
|
|
ret(*|<v21>) L1
|
|
L1:
|
|
1 <END>
|
|
error:
|
|
<ERROR>
|
|
sink:
|
|
<SINK> USE: in: {} out: {}
|
|
=====================
|