Properly process nested try and loop blocks
KT-3894: Loops and finally: finally block executed twice when break and return exists in try/finally block KT-3874: Compilation error on try catch block contains break and continue KT-3869: Loops and finally: outer finally block not run #KT-3869 Fixed #KT-3894 Fixed #KT-3874 Fixed
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
//KT-3869 Loops and finally: outer finally block not run
|
||||
|
||||
class MyString {
|
||||
var s = ""
|
||||
fun plus(x : String) : MyString {
|
||||
s += x
|
||||
return this
|
||||
}
|
||||
|
||||
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"
|
||||
}
|
||||
Reference in New Issue
Block a user