summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2011-04-24 19:16:10 +0000
committerPaul Phillips <paulp@improving.org>2011-04-24 19:16:10 +0000
commit60463a8721728545d7d626d96f77e8688084c71f (patch)
tree6cc639b7b4539cfdae45a0ab468c2d6202d1651a
parent870679585afc3fe8dc07b40fe032919ede414489 (diff)
downloadscala-60463a8721728545d7d626d96f77e8688084c71f.tar.gz
scala-60463a8721728545d7d626d96f77e8688084c71f.tar.bz2
scala-60463a8721728545d7d626d96f77e8688084c71f.zip
Added warning when someone tries to return a no...
Added warning when someone tries to return a non-Unit value from a Unit method, no review.
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala20
-rw-r--r--test/files/neg/unit-returns-value.check4
-rw-r--r--test/files/neg/unit-returns-value.flags1
-rw-r--r--test/files/neg/unit-returns-value.scala11
4 files changed, 29 insertions, 7 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index 8718d31520..add3bca6f2 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -3141,14 +3141,20 @@ trait Typers extends Modes {
) {
errorTree(tree, "return outside method definition")
} else {
- val DefDef(_, _, _, _, restpt, _) = enclMethod.tree
- var restpt0 = restpt
- if (restpt0.tpe eq null) {
- errorTree(tree, "" + enclMethod.owner +
- " has return statement; needs result type")
- } else {
+ val DefDef(_, name, _, _, restpt, _) = enclMethod.tree
+ if (restpt.tpe eq null)
+ errorTree(tree, enclMethod.owner + " has return statement; needs result type")
+ else {
context.enclMethod.returnsSeen = true
- val expr1: Tree = typed(expr, EXPRmode | BYVALmode, restpt0.tpe)
+ val expr1: Tree = typed(expr, EXPRmode | BYVALmode, 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
+ // it is non-Unit) so we have to retype it. Fortunately it won't come up much
+ // unless the warning is legitimate.
+ if (typed(expr).tpe.typeSymbol != UnitClass)
+ unit.warning(tree.pos, "enclosing method " + name + " has result type Unit: return value discarded")
+ }
treeCopy.Return(tree, checkDead(expr1)) setSymbol enclMethod.owner setType NothingClass.tpe
}
}
diff --git a/test/files/neg/unit-returns-value.check b/test/files/neg/unit-returns-value.check
new file mode 100644
index 0000000000..18368f45ab
--- /dev/null
+++ b/test/files/neg/unit-returns-value.check
@@ -0,0 +1,4 @@
+unit-returns-value.scala:4: error: enclosing method f has result type Unit: return value discarded
+ if (b) return 5
+ ^
+one error found
diff --git a/test/files/neg/unit-returns-value.flags b/test/files/neg/unit-returns-value.flags
new file mode 100644
index 0000000000..e8fb65d50c
--- /dev/null
+++ b/test/files/neg/unit-returns-value.flags
@@ -0,0 +1 @@
+-Xfatal-warnings \ No newline at end of file
diff --git a/test/files/neg/unit-returns-value.scala b/test/files/neg/unit-returns-value.scala
new file mode 100644
index 0000000000..27a1111c5b
--- /dev/null
+++ b/test/files/neg/unit-returns-value.scala
@@ -0,0 +1,11 @@
+object Test {
+ def f {
+ var b = false
+ if (b) return 5
+ }
+
+ // no warning
+ def g {
+ return println("hello")
+ }
+}