From 8e257a63872697bd48a51ce93a0289c9f5acdfd8 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Sat, 19 Dec 2015 11:36:07 +0100 Subject: Add test case --- tests/neg/Iter2.scala | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 tests/neg/Iter2.scala (limited to 'tests') diff --git a/tests/neg/Iter2.scala b/tests/neg/Iter2.scala new file mode 100644 index 000000000..d938f0379 --- /dev/null +++ b/tests/neg/Iter2.scala @@ -0,0 +1,40 @@ +// NOTE: this test case is very fragile, removing seemingly unrelated code like +// the "Dummy" trait somehow changes how the types of cget and dget are inferred +// and avoids the bug. + +object Test { + trait Dummy { + def foo: Unit = { + var i = 0 + i += 1 + } + } + + trait FromIterator[+C[X] <: Iterable[X]] { + def get(): C[Int] + } + + trait Iterable[+IA] extends FromIterator[Iterable] + trait SubIterable[+IA] extends Iterable[IA] with FromIterator[SubIterable] + + class IterableC extends Iterable[Int] { def get() = this } + class SubIterableC extends SubIterable[Int] { def get() = this } + + + implicit class IterableTransforms[A, C[X] <: Iterable[X], D[X] <: SubIterable[X]] + (val dummy: Unit) { + def foo(c: Iterable[A] with FromIterator[C], d: Iterable[A] with FromIterator[D]): Unit = { + var cget = c.get() + var dget = d.get() + dget = cget // error + cget = dget // error + } + } + + def main(args: Array[String]): Unit = { + new IterableTransforms(()).foo(new IterableC, new SubIterableC) + // java.lang.ClassCastException: Test$IterableC cannot be cast to Test$SubIterable + } +} + + -- cgit v1.2.3