summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/typechecker/Typers.scala
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 /src/compiler/scala/tools/nsc/typechecker/Typers.scala
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 'src/compiler/scala/tools/nsc/typechecker/Typers.scala')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index 2bdae4164a..7e4f50ecd7 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -3987,7 +3987,11 @@ trait Typers extends Modes with Adaptations with Tags {
ReturnWithoutTypeError(tree, enclMethod.owner)
} else {
context.enclMethod.returnsSeen = true
+ //TODO: also pass enclMethod.tree, so that adaptAnnotations can check whether return is in tail position
+ pushAnnotationContext(tree)
val expr1: Tree = typed(expr, EXPRmode | BYVALmode, restpt.tpe)
+ popAnnotationContext()
+
// Warn about returning a value if no value can be returned.
if (restpt.tpe.typeSymbol == UnitClass) {
// The typing in expr1 says expr is Unit (it has already been coerced if