aboutsummaryrefslogblamecommitdiff
path: root/tests/neg/Iter2.scala
blob: d938f0379b02d3dfc6cd5a0dd465b3ed812f5afa (plain) (tree)







































                                                                                               
// 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
  }
}