diff options
author | Paul Phillips <paulp@improving.org> | 2012-03-01 12:24:18 -0800 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2012-03-01 12:24:18 -0800 |
commit | 0fccb4ee76b55dea2073f234b4626c145ebd1b2f (patch) | |
tree | 20f4d9ac2cf95cb12a690f4b16cbd93dabc56aa4 | |
parent | 84ab871a18c2a5b2d4dce8c2f42b47f1aada2a09 (diff) | |
parent | edf3ae0b8c3688b5cacbe2f7e2ae826f5fbb7644 (diff) | |
download | scala-0fccb4ee76b55dea2073f234b4626c145ebd1b2f.tar.gz scala-0fccb4ee76b55dea2073f234b4626c145ebd1b2f.tar.bz2 scala-0fccb4ee76b55dea2073f234b4626c145ebd1b2f.zip |
Merge remote-tracking branch 'szabolcsberecz/SI-5380' into develop
Conflicts:
src/compiler/scala/tools/nsc/transform/UnCurry.scala
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/UnCurry.scala | 10 | ||||
-rw-r--r-- | test/files/run/si5380.scala | 6 |
2 files changed, 13 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/UnCurry.scala b/src/compiler/scala/tools/nsc/transform/UnCurry.scala index 7d66549a52..ee565530b7 100644 --- a/src/compiler/scala/tools/nsc/transform/UnCurry.scala +++ b/src/compiler/scala/tools/nsc/transform/UnCurry.scala @@ -469,6 +469,7 @@ abstract class UnCurry extends InfoTransform deriveDefDef(dd)(_ => body) case _ => tree } + def isNonLocalReturn(ret: Return) = ret.symbol != currentOwner.enclMethod || currentOwner.isLazy // ------ The tree transformers -------------------------------------------------------- @@ -570,6 +571,9 @@ abstract class UnCurry extends InfoTransform case Assign(lhs, _) if lhs.symbol.owner != currentMethod || lhs.symbol.hasFlag(LAZY | ACCESSOR) => withNeedLift(true) { super.transform(tree) } + case ret @ Return(_) if (isNonLocalReturn(ret)) => + withNeedLift(true) { super.transform(ret) } + case Try(block, catches, finalizer) => if (needTryLift || shouldBeLiftedAnyway(tree)) transform(liftTree(tree)) else super.transform(tree) @@ -675,9 +679,9 @@ abstract class UnCurry extends InfoTransform applyUnary() case Select(_, _) | TypeApply(_, _) => applyUnary() - case Return(expr) if (tree.symbol != currentOwner.enclMethod || currentOwner.isLazy) => - debuglog("non local return in "+tree.symbol+" from "+currentOwner.enclMethod) - atPos(tree.pos)(nonLocalReturnThrow(expr, tree.symbol)) + case ret @ Return(expr) if (isNonLocalReturn(ret)) => + debuglog("non local return in "+ret.symbol+" from "+currentOwner.enclMethod) + atPos(ret.pos)(nonLocalReturnThrow(expr, ret.symbol)) case TypeTree() => tree case _ => diff --git a/test/files/run/si5380.scala b/test/files/run/si5380.scala new file mode 100644 index 0000000000..6083161a9b --- /dev/null +++ b/test/files/run/si5380.scala @@ -0,0 +1,6 @@ +object Test { + def main(args: Array[String]) { + val f = () => return try { 1 } catch { case _ => 0 } + f() + } +} |