summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2016-10-18 23:11:54 +1100
committerGitHub <noreply@github.com>2016-10-18 23:11:54 +1100
commit7aeb1bfa4199e18ffd8a6cadcdaebfac2c5c8066 (patch)
tree6716ec9a7add1cfeb7187dabf425fc644a33256b
parentb7d43cf9265bb3afb40c2cd7548681a5a2a3f96f (diff)
parent9b6a65bc890081b48a86e72aa3eb49aaf2d69d09 (diff)
downloadscala-7aeb1bfa4199e18ffd8a6cadcdaebfac2c5c8066.tar.gz
scala-7aeb1bfa4199e18ffd8a6cadcdaebfac2c5c8066.tar.bz2
scala-7aeb1bfa4199e18ffd8a6cadcdaebfac2c5c8066.zip
Merge pull request #5218 from retronym/ticket/9806
SI-9806 Fix incorrect codegen with optimizer, constants, try/catch
-rw-r--r--src/compiler/scala/tools/nsc/backend/opt/ConstantOptimization.scala4
-rw-r--r--test/files/run/t9806.scala18
2 files changed, 20 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/opt/ConstantOptimization.scala b/src/compiler/scala/tools/nsc/backend/opt/ConstantOptimization.scala
index a7ce7dfa04..eafaf41932 100644
--- a/src/compiler/scala/tools/nsc/backend/opt/ConstantOptimization.scala
+++ b/src/compiler/scala/tools/nsc/backend/opt/ConstantOptimization.scala
@@ -539,14 +539,14 @@ abstract class ConstantOptimization extends SubComponent {
// number of instructions excluding the last one
val normalCount = block.size - 1
- val exceptionState = in.cleanStack
+ var exceptionState = in.cleanStack
var normalExitState = in
var idx = 0
while (idx < normalCount) {
val inst = block(idx)
normalExitState = interpretInst(normalExitState, inst)
if (normalExitState.locals ne exceptionState.locals)
- exceptionState.copy(locals = exceptionState mergeLocals normalExitState.locals)
+ exceptionState = exceptionState.copy(locals = exceptionState mergeLocals normalExitState.locals)
idx += 1
}
diff --git a/test/files/run/t9806.scala b/test/files/run/t9806.scala
new file mode 100644
index 0000000000..ccde989efe
--- /dev/null
+++ b/test/files/run/t9806.scala
@@ -0,0 +1,18 @@
+object Ex extends Exception
+object Test {
+ def main(args: Array[String]) {
+ try foo catch { case Ex => }
+ }
+
+ def isTrue(b: Boolean) = b
+ def foo = {
+ var streamErrors1 = true
+ try {
+ streamErrors1 = false
+ throw Ex
+ } catch {
+ case ex if streamErrors1 =>
+ assert(isTrue(streamErrors1))
+ }
+ }
+}