summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2012-06-16 23:35:06 +0200
committerJason Zaugg <jzaugg@gmail.com>2012-06-19 21:35:28 +0200
commit7d8527b40a3bd6d93cf155b39ee50577751f3e91 (patch)
treed02e00108568bfc8236782962f15ccc30b50446c /src
parent277dc7cf43566f8294bde4143107d9bfaa59e8e3 (diff)
downloadscala-7d8527b40a3bd6d93cf155b39ee50577751f3e91.tar.gz
scala-7d8527b40a3bd6d93cf155b39ee50577751f3e91.tar.bz2
scala-7d8527b40a3bd6d93cf155b39ee50577751f3e91.zip
SI-2807 Resurrect and refine the promiscuous catch warning.
The previous incarnation didn't survive 4fb3473. This version can be cleared by using a typed pattern: `catch { case _: Throwable => }`. This is motivated by the recent appearance of such a catch in `util.Try`, and by battle scars left by one too many processes bravely but stupidly catching and logging OutOfMemoryErrors. -Y status has been skipped: this warning is enabled by default and can only be silenced with use of a typed pattern.
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala10
1 files changed, 10 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..a23bc35e77 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -4825,6 +4825,16 @@ trait Typers extends Modes with Adaptations with Tags {
case Try(block, catches, finalizer) =>
var block1 = typed(block, pt)
var catches1 = typedCases(catches, ThrowableClass.tpe, pt)
+
+ for (cdef <- catches1 if cdef.guard.isEmpty) {
+ def warn(name: Name) = context.warning(cdef.pat.pos, s"This catches all Throwables. If this is really intended, use `case ${name.decoded} : Throwable` to clear this warning.")
+ cdef.pat match {
+ case Bind(name, Ident(_)) => warn(name)
+ case Ident(name) => warn(name)
+ case _ =>
+ }
+ }
+
val finalizer1 = if (finalizer.isEmpty) finalizer
else typed(finalizer, UnitClass.tpe)
val (owntype, needAdapt) = ptOrLub(block1.tpe :: (catches1 map (_.tpe)), pt)