| //KT-3869 Loops and finally: outer finally block not run | |
| class MyString { | |
| var s = "" | |
| operator fun plus(x : String) : MyString { | |
| s += x | |
| return this | |
| } | |
| override fun toString(): String { | |
| return s | |
| } | |
| } | |
| fun test1() : MyString { | |
| var r = MyString() | |
| try { | |
| r + "Try" | |
| while(r.toString() != "") { | |
| return r + "Loop" | |
| } | |
| return r + "Fail" | |
| } finally { | |
| r + "Finally" | |
| } | |
| } | |
| fun test2() : MyString { | |
| var r = MyString() | |
| try { | |
| r + "Try" | |
| do { | |
| if (r.toString() != "") { | |
| return r + "Loop" | |
| } | |
| } while (r.toString() != "") | |
| return r + "Fail" | |
| } finally { | |
| r + "Finally" | |
| } | |
| } | |
| fun test3() : MyString { | |
| var r = MyString() | |
| try { | |
| r + "Try" | |
| for(i in 1..2) { | |
| r + "Loop" | |
| return r | |
| } | |
| return r + "Fail" | |
| } finally { | |
| r + "Finally" | |
| } | |
| } | |
| fun box(): String { | |
| if (test1().toString() != "TryLoopFinally") return "fail1: ${test1()}" | |
| if (test2().toString() != "TryLoopFinally") return "fail2: ${test2()}" | |
| if (test3().toString() != "TryLoopFinally") return "fail3: ${test3()}" | |
| return "OK" | |
| } |