aboutsummaryrefslogtreecommitdiff
path: root/tests/pos/tycons.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-05-28 11:27:11 +0200
committerMartin Odersky <odersky@gmail.com>2014-05-30 15:43:02 +0200
commitc2175ec910165308e81c48bd8ca8910c50862be4 (patch)
tree82af4c43d1167cc0d897d31b1afa855c068f856e /tests/pos/tycons.scala
parent70e785f5d8a583dae127dadf4d9add70bdea71f7 (diff)
downloaddotty-c2175ec910165308e81c48bd8ca8910c50862be4.tar.gz
dotty-c2175ec910165308e81c48bd8ca8910c50862be4.tar.bz2
dotty-c2175ec910165308e81c48bd8ca8910c50862be4.zip
Avoid classtype checking for refinements.
In a refinement type T { R } we do not need T to be a class. But analyzing the refeinement type will create a temporary class type. This refinement class has to be treated specially in what concerns parent types.
Diffstat (limited to 'tests/pos/tycons.scala')
-rw-r--r--tests/pos/tycons.scala22
1 files changed, 22 insertions, 0 deletions
diff --git a/tests/pos/tycons.scala b/tests/pos/tycons.scala
new file mode 100644
index 000000000..f138c78be
--- /dev/null
+++ b/tests/pos/tycons.scala
@@ -0,0 +1,22 @@
+class TypeConstructor {
+ type TypeArg
+}
+
+trait List[+T] extends TypeConstructor { type TypeArg <: T }
+
+trait Set[T] extends TypeConstructor { type TypeArg <: T }
+
+object obj extends List[Number] with Set[Exception] {
+ val x: TypeArg = ???
+ val n: Number = x
+ val e: Exception = x
+}
+
+class Functor[F <: TypeConstructor] {
+ def map[A, B](f: F { type TypeArg <: A }): F { type TypeArg <: B }
+}
+
+implicit object ListFunctor extends Functor[List] {
+ def map[A, B](f: List[A]): List[B] = ???
+}
+