aboutsummaryrefslogtreecommitdiff
path: root/tests/neg/i1802.scala
diff options
context:
space:
mode:
Diffstat (limited to 'tests/neg/i1802.scala')
-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 _)
+}