summaryrefslogtreecommitdiff
path: root/test/files/continuations-neg
diff options
context:
space:
mode:
authorphaller <hallerp@gmail.com>2012-05-25 17:36:19 +0200
committerphaller <philipp.haller@typesafe.com>2012-06-14 17:42:31 +0200
commit796024c7429a03e974a7d8e1dc5c80b84f82467d (patch)
treeb4c900328a78ec7941530d1ecc27d544284febaf /test/files/continuations-neg
parent4448e7a530626105776997fde04b4af76bf13de1 (diff)
downloadscala-796024c7429a03e974a7d8e1dc5c80b84f82467d.tar.gz
scala-796024c7429a03e974a7d8e1dc5c80b84f82467d.tar.bz2
scala-796024c7429a03e974a7d8e1dc5c80b84f82467d.zip
CPS: enable return expressions in CPS code if they are in tail position
Adds a stack of context trees to AnnotationChecker(s). Here, it is used to enforce that adaptAnnotations will only adapt the annotation of a return expression if the expected type is a CPS type. The remove-tail-return transform is reasonably general, covering cases such as try-catch-finally. Moreover, an error is thrown if, in a CPS method, a return is encountered which is not in a tail position such that it will be removed subsequently.
Diffstat (limited to 'test/files/continuations-neg')
-rw-r--r--test/files/continuations-neg/ts-1681-nontail-return.check4
-rw-r--r--test/files/continuations-neg/ts-1681-nontail-return.scala18
2 files changed, 22 insertions, 0 deletions
diff --git a/test/files/continuations-neg/ts-1681-nontail-return.check b/test/files/continuations-neg/ts-1681-nontail-return.check
new file mode 100644
index 0000000000..8fe15f154b
--- /dev/null
+++ b/test/files/continuations-neg/ts-1681-nontail-return.check
@@ -0,0 +1,4 @@
+ts-1681-nontail-return.scala:10: error: return expressions in CPS code must be in tail position
+ return v
+ ^
+one error found
diff --git a/test/files/continuations-neg/ts-1681-nontail-return.scala b/test/files/continuations-neg/ts-1681-nontail-return.scala
new file mode 100644
index 0000000000..af86ad304f
--- /dev/null
+++ b/test/files/continuations-neg/ts-1681-nontail-return.scala
@@ -0,0 +1,18 @@
+import scala.util.continuations._
+
+class ReturnRepro {
+ def s1: Int @cpsParam[Any, Unit] = shift { k => k(5) }
+ def caller = reset { println(p(3)) }
+
+ def p(i: Int): Int @cpsParam[Unit, Any] = {
+ val v= s1 + 3
+ if (v == 8)
+ return v
+ v + 1
+ }
+}
+
+object Test extends App {
+ val repro = new ReturnRepro
+ repro.caller
+}