aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/dotc/tests.scala1
-rw-r--r--tests/neg/Iter2.scala40
2 files changed, 41 insertions, 0 deletions
diff --git a/test/dotc/tests.scala b/test/dotc/tests.scala
index 3787a9c98..895bf89a7 100644
--- a/test/dotc/tests.scala
+++ b/test/dotc/tests.scala
@@ -148,6 +148,7 @@ class tests extends CompilerTest {
@Test def neg_boundspropagation = compileFile(negDir, "boundspropagation", xerrors = 5)
@Test def neg_refinedSubtyping = compileFile(negDir, "refinedSubtyping", xerrors = 2)
@Test def neg_hklower = compileFile(negDir, "hklower", xerrors = 3)
+ @Test def neg_Iter2 = compileFile(negDir, "Iter2", xerrors = 2)
@Test def neg_i0091_infpaths = compileFile(negDir, "i0091-infpaths", xerrors = 3)
@Test def neg_i0248_inherit_refined = compileFile(negDir, "i0248-inherit-refined", xerrors = 4)
@Test def neg_i0281 = compileFile(negDir, "i0281-null-primitive-conforms", xerrors = 3)
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
+ }
+}
+
+