JVM_IR: Add more local variable tests for finally code.

This commit is contained in:
Mads Ager
2021-04-27 17:19:07 +02:00
committed by Mikhael Bogdanov
parent 6095d8a7fa
commit 0c77565104
10 changed files with 268 additions and 3 deletions
+37
View File
@@ -0,0 +1,37 @@
// FILE: test.kt
fun box(): String {
try {
for (i in 0 until 1) {
try {
val x = "x"
throw RuntimeException(x)
} catch (e: Exception) {
val y = "y"
val z = "z"
break // TODO: why does the break not have a line number so we can stop on it?
} finally {
throw RuntimeException("$i") // TODO: `e` should not be visible here
}
}
} finally {
return "OK"
} // TODO: why do we go to this line before going to the line above for the finally block.
return "FAIL"
}
// The local variables `z` and `y` are visible in the finally block with old backend.
// IGNORE_BACKEND: JVM
// LOCAL VARIABLES
// test.kt:4 box:
// test.kt:5 box:
// test.kt:6 box: i:int=0:int
// test.kt:7 box: i:int=0:int
// test.kt:8 box: i:int=0:int, x:java.lang.String="x":java.lang.String
// test.kt:9 box: i:int=0:int
// test.kt:10 box: i:int=0:int, e:java.lang.Exception=java.lang.RuntimeException
// test.kt:11 box: i:int=0:int, e:java.lang.Exception=java.lang.RuntimeException, y:java.lang.String="y":java.lang.String
// test.kt:14 box: i:int=0:int, e:java.lang.Exception=java.lang.RuntimeException
// test.kt:19 box:
// test.kt:18 box:
+38
View File
@@ -0,0 +1,38 @@
// FILE: test.kt
fun box(): String {
try {
for (i in 0 until 1) {
try {
val x = "x"
throw RuntimeException(x)
} catch (e: Exception) {
val y = "y"
val z = "z"
continue // TODO: why does the continue not have a line number so we stop here?
} finally {
throw RuntimeException("$i") // TODO: `e` should not be visible here
}
}
} finally {
return "OK"
} // TODO: why stop here before the line above for the finally block?
return "FAIL"
}
// The local variables `z` and `y` are visible in the finally block with old backend.
// IGNORE_BACKEND: JVM
// LOCAL VARIABLES
// test.kt:4 box:
// test.kt:5 box:
// test.kt:6 box: i:int=0:int
// test.kt:7 box: i:int=0:int
// test.kt:8 box: i:int=0:int, x:java.lang.String="x":java.lang.String
// test.kt:9 box: i:int=0:int
// test.kt:10 box: i:int=0:int, e:java.lang.Exception=java.lang.RuntimeException
// test.kt:11 box: i:int=0:int, e:java.lang.Exception=java.lang.RuntimeException, y:java.lang.String="y":java.lang.String
// test.kt:14 box: i:int=0:int, e:java.lang.Exception=java.lang.RuntimeException
// test.kt:19 box:
// test.kt:18 box:
+36
View File
@@ -0,0 +1,36 @@
// FILE: test.kt
fun box(): String {
try {
for (i in 0 until 1) {
try {
val x = "x"
throw RuntimeException(x)
} catch (e: Exception) {
val y = "y"
return "FAIL1"
} finally {
return "FAIL2" // TODO: `e` should not be visible here.
}
}
} finally {
return "OK" // TODO: `e` should not be visible here.
}
return "FAIL3"
}
// The local variables `y` and `i` are visible in finally blocks with old backend.
// IGNORE_BACKEND: JVM
// LOCAL VARIABLES
// test.kt:4 box:
// test.kt:5 box:
// test.kt:6 box: i:int=0:int
// test.kt:7 box: i:int=0:int
// test.kt:8 box: i:int=0:int, x:java.lang.String="x":java.lang.String
// test.kt:9 box: i:int=0:int
// test.kt:10 box: i:int=0:int, e:java.lang.Exception=java.lang.RuntimeException
// test.kt:11 box: i:int=0:int, e:java.lang.Exception=java.lang.RuntimeException, y:java.lang.String="y":java.lang.String
// test.kt:13 box: i:int=0:int, e:java.lang.Exception=java.lang.RuntimeException
// test.kt:17 box: e:java.lang.Exception=java.lang.RuntimeException
+26
View File
@@ -0,0 +1,26 @@
// FILE: test.kt
fun box(): String {
try {
for (i in 0 until 1) {
try {
val x = "x"
var y = "y"
} finally {
break
}
}
} finally {
return "OK"
}
return "FAIL"
}
// LOCAL VARIABLES
// test.kt:4 box:
// test.kt:5 box:
// test.kt:6 box: i:int=0:int
// test.kt:7 box: i:int=0:int
// test.kt:8 box: i:int=0:int, x:java.lang.String="x":java.lang.String
// test.kt:10 box: i:int=0:int
// test.kt:14 box:
+27
View File
@@ -0,0 +1,27 @@
// FILE: test.kt
fun box(): String {
try {
for (i in 0 until 1) {
try {
val x = "x"
val y = "y"
} finally {
continue
}
}
} finally {
return "OK"
}
return "FAIL"
}
// LOCAL VARIABLES
// test.kt:4 box:
// test.kt:5 box:
// test.kt:6 box: i:int=0:int
// test.kt:7 box: i:int=0:int
// test.kt:8 box: i:int=0:int, x:java.lang.String="x":java.lang.String
// test.kt:10 box: i:int=0:int
// test.kt:5 box: i:int=0:int
// test.kt:14 box:
+29
View File
@@ -0,0 +1,29 @@
// FILE: test.kt
fun box(): String {
try {
for (i in 0 until 1) {
try {
val x = "x"
val y = "y"
} finally {
return "FAIL1"
}
}
} finally {
return "OK"
}
return "FAIL2"
}
// The local `i` is visible in the finally block with old backend.
// IGNORE_BACKEND: JVM
// LOCAL VARIABLES
// test.kt:4 box:
// test.kt:5 box:
// test.kt:6 box: i:int=0:int
// test.kt:7 box: i:int=0:int
// test.kt:8 box: i:int=0:int, x:java.lang.String="x":java.lang.String
// test.kt:10 box: i:int=0:int
// test.kt:14 box:
+1 -1
View File
@@ -20,7 +20,7 @@ fun compute(): String {
}
}
} finally {
x = "OK"
x = "OK" // TODO: `e` should not be visible here.
}
return "FAIL"
}