| == 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: {foo=ID} |
| magic[FAKE_INITIALIZER](e: Exception) -> <v8> INIT: in: {foo=ID} out: {foo=ID} |
| w(e|<v8>) INIT: in: {foo=ID} out: {foo=ID} |
| 8 mark({ return "fail" }) INIT: in: {foo=ID} out: {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: {} |
| ===================== |