aboutsummaryrefslogtreecommitdiff
path: root/tests/neg
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2016-12-17 15:09:27 +0100
committerMartin Odersky <odersky@gmail.com>2016-12-17 15:09:52 +0100
commitb63480a59bbdd284a5e32281fbb0037e509f4b1e (patch)
tree825824024ad6768646c3dbf630a2db9283eedcd4 /tests/neg
parent653698ef67a5cf8f5e0fd0fcdcd1f631f1dc96e2 (diff)
downloaddotty-b63480a59bbdd284a5e32281fbb0037e509f4b1e.tar.gz
dotty-b63480a59bbdd284a5e32281fbb0037e509f4b1e.tar.bz2
dotty-b63480a59bbdd284a5e32281fbb0037e509f4b1e.zip
Make errors are not swept under the carpet
Typer#ensureReported's comment outlines an example where errors could go unreported, resulting in error trees after typer without any reported error messages. This commit makes sure that at least one error is reported if a tree node has an error type. Fixes #1802.
Diffstat (limited to 'tests/neg')
-rw-r--r--tests/neg/i1802.scala21
1 files changed, 21 insertions, 0 deletions
diff --git a/tests/neg/i1802.scala b/tests/neg/i1802.scala
new file mode 100644
index 000000000..56da672a8
--- /dev/null
+++ b/tests/neg/i1802.scala
@@ -0,0 +1,21 @@
+import scala.collection.immutable.List
+import scala.reflect.{ ClassTag, classTag }
+import scala.language.implicitConversions
+
+object Exception {
+ type Catcher[+T] = PartialFunction[Throwable, T]
+
+ def mkCatcher[Ex <: Throwable: ClassTag, T](isDef: Ex => Boolean, f: Ex => T) = new Catcher[T] {
+ private def downcast(x: Throwable): Option[Ex] =
+ if (classTag[Ex].runtimeClass.isAssignableFrom(x.getClass)) Some(x.asInstanceOf[Ex])
+ else None
+
+ def isDefinedAt(x: Throwable) = downcast(x) exists isDef
+ def apply(x: Throwable): T = f(downcast(x).get)
+ }
+
+ def mkThrowableCatcher[T](isDef: Throwable => Boolean, f: Throwable => T) = mkCatcher(isDef, f)
+
+ implicit def throwableSubtypeToCatcher[Ex <: Throwable: ClassTag, T](pf: PartialFunction[Ex, T]) = // error: cyclic reference
+ mkCatcher(pf.isDefinedAt _, pf.apply _)
+}