summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/reflect/internal/Trees.scala12
-rw-r--r--test/files/run/nonlocalreturn.check1
-rw-r--r--test/files/run/nonlocalreturn.scala15
3 files changed, 8 insertions, 20 deletions
diff --git a/src/compiler/scala/reflect/internal/Trees.scala b/src/compiler/scala/reflect/internal/Trees.scala
index ac2147d284..1a40e0105c 100644
--- a/src/compiler/scala/reflect/internal/Trees.scala
+++ b/src/compiler/scala/reflect/internal/Trees.scala
@@ -324,10 +324,14 @@ trait Trees extends api.Trees { self: SymbolTable =>
}
class ChangeOwnerTraverser(val oldowner: Symbol, val newowner: Symbol) extends Traverser {
- def changeOwner(tree: Tree) = {
- if ((tree.isDef || tree.isInstanceOf[Function]) &&
- tree.symbol != NoSymbol && tree.symbol.owner == oldowner)
- tree.symbol.owner = newowner
+ def changeOwner(tree: Tree) = tree match {
+ case Return(expr) =>
+ if (tree.symbol == oldowner)
+ tree.symbol = newowner
+ case _: DefTree | _: Function =>
+ if (tree.symbol != NoSymbol && tree.symbol.owner == oldowner)
+ tree.symbol.owner = newowner
+ case _ =>
}
override def traverse(tree: Tree) {
changeOwner(tree)
diff --git a/test/files/run/nonlocalreturn.check b/test/files/run/nonlocalreturn.check
deleted file mode 100644
index aeb2d5e239..0000000000
--- a/test/files/run/nonlocalreturn.check
+++ /dev/null
@@ -1 +0,0 @@
-Some(1)
diff --git a/test/files/run/nonlocalreturn.scala b/test/files/run/nonlocalreturn.scala
deleted file mode 100644
index 3c1e7420ed..0000000000
--- a/test/files/run/nonlocalreturn.scala
+++ /dev/null
@@ -1,15 +0,0 @@
-object Test {
- def wrap[K](body: => K): K = body
-
- def f(): Option[Int] = {
- wrap({ return Some(1) ; None })
- }
-
- def main(args: Array[String]) {
- println(f())
- }
-}
-// java.lang.ClassCastException: scala.Some cannot be cast to scala.None$
-// at Test$$anonfun$f$1.apply(nonlocalreturn.scala:5)
-// at Test$$anonfun$f$1.apply(nonlocalreturn.scala:5)
-// at Test$.wrap(nonlocalreturn.scala:2)