diff options
author | Josh Suereth <Joshua.Suereth@gmail.com> | 2012-06-18 09:45:37 -0700 |
---|---|---|
committer | Josh Suereth <Joshua.Suereth@gmail.com> | 2012-06-18 09:45:37 -0700 |
commit | bf4b982389dcd573e81155bfe233f70f1471b017 (patch) | |
tree | 97239b357d7eb6549ca5bb2867e21956c2c43e40 /src/compiler | |
parent | 33901013cdd8aef50c28006a5cf52aa3137f747f (diff) | |
parent | 0ada0706746c9c603bf5bc8a0e6780e5783297cf (diff) | |
download | scala-bf4b982389dcd573e81155bfe233f70f1471b017.tar.gz scala-bf4b982389dcd573e81155bfe233f70f1471b017.tar.bz2 scala-bf4b982389dcd573e81155bfe233f70f1471b017.zip |
Merge pull request #720 from phaller/cps-ticket-1681
CPS: enable return expressions in CPS code if they are in tail position
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Modes.scala | 4 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 3 |
2 files changed, 6 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Modes.scala b/src/compiler/scala/tools/nsc/typechecker/Modes.scala index 3eff5ef024..bde3ad98c9 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Modes.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Modes.scala @@ -86,6 +86,10 @@ trait Modes { */ final val TYPEPATmode = 0x10000 + /** RETmode is set when we are typing a return expression. + */ + final val RETmode = 0x20000 + final private val StickyModes = EXPRmode | PATTERNmode | TYPEmode | ALTmode final def onlyStickyModes(mode: Int) = diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index 2bdae4164a..1193d3013a 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -3987,7 +3987,8 @@ trait Typers extends Modes with Adaptations with Tags { ReturnWithoutTypeError(tree, enclMethod.owner) } else { context.enclMethod.returnsSeen = true - val expr1: Tree = typed(expr, EXPRmode | BYVALmode, restpt.tpe) + val expr1: Tree = typed(expr, EXPRmode | BYVALmode | RETmode, restpt.tpe) + // 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 |