jacodb
jacodb copied to clipboard
Wrong IR or JVM bytecode generation with empty try
Example:
var lambda: (() -> String)? = null
fun f() {
try {
} finally {
lambda = { "OK" }
}
}
@JvmStatic
fun box(): String {
f()
return lambda?.let { it() } ?: "fail"
}
One more test for try/catch/finally:
fun test1() : String {
var s = "";
try {
try {
s += "Try";
throw Exception()
} catch (x : Exception) {
s += "Catch";
throw x
} finally {
s += "Finally";
}
} catch (x : Exception) {
return s
}
}
fun test2() : String {
var s = "";
try {
s += "Try";
throw Exception()
} catch (x : Exception) {
s += "Catch";
} finally {
s += "Finally";
}
return s
}
fun box() : String {
if (test1() != "TryCatchFinally") return "fail1: ${test1()}"
if (test2() != "TryCatchFinally") return "fail2: ${test2()}"
return "OK"
}
More:
fun unsupportedEx() {
if (true) throw UnsupportedOperationException()
}
fun runtimeEx() {
if (true) throw RuntimeException()
}
fun test1WithFinally() : String {
var s = "";
try {
try {
s += "Try";
unsupportedEx()
} finally {
s += "Finally"
}
} catch (x : RuntimeException) {
return s
}
return s + "Failed"
}
fun test2WithFinally() : String {
var s = "";
try {
try {
s += "Try";
unsupportedEx()
return s
} finally {
s += "Finally"
}
} catch (x : RuntimeException) {
return s
}
}
fun box() : String {
if (test1WithFinally() != "TryFinally") return "fail2: ${test1WithFinally()}"
if (test2WithFinally() != "TryFinally") return "fail4: ${test2WithFinally()}"
return "OK"
}