diff options
author | phaller <hallerp@gmail.com> | 2012-05-25 17:36:19 +0200 |
---|---|---|
committer | phaller <philipp.haller@typesafe.com> | 2012-06-14 17:42:31 +0200 |
commit | 796024c7429a03e974a7d8e1dc5c80b84f82467d (patch) | |
tree | b4c900328a78ec7941530d1ecc27d544284febaf /test/files/continuations-neg | |
parent | 4448e7a530626105776997fde04b4af76bf13de1 (diff) | |
download | scala-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.check | 4 | ||||
-rw-r--r-- | test/files/continuations-neg/ts-1681-nontail-return.scala | 18 |
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 +} |