Skip to content

Commit 8e257a6

Browse files
committed
Add test case
1 parent 8711886 commit 8e257a6

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

test/dotc/tests.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ class tests extends CompilerTest {
148148
@Test def neg_boundspropagation = compileFile(negDir, "boundspropagation", xerrors = 5)
149149
@Test def neg_refinedSubtyping = compileFile(negDir, "refinedSubtyping", xerrors = 2)
150150
@Test def neg_hklower = compileFile(negDir, "hklower", xerrors = 3)
151+
@Test def neg_Iter2 = compileFile(negDir, "Iter2", xerrors = 2)
151152
@Test def neg_i0091_infpaths = compileFile(negDir, "i0091-infpaths", xerrors = 3)
152153
@Test def neg_i0248_inherit_refined = compileFile(negDir, "i0248-inherit-refined", xerrors = 4)
153154
@Test def neg_i0281 = compileFile(negDir, "i0281-null-primitive-conforms", xerrors = 3)

tests/neg/Iter2.scala

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// NOTE: this test case is very fragile, removing seemingly unrelated code like
2+
// the "Dummy" trait somehow changes how the types of cget and dget are inferred
3+
// and avoids the bug.
4+
5+
object Test {
6+
trait Dummy {
7+
def foo: Unit = {
8+
var i = 0
9+
i += 1
10+
}
11+
}
12+
13+
trait FromIterator[+C[X] <: Iterable[X]] {
14+
def get(): C[Int]
15+
}
16+
17+
trait Iterable[+IA] extends FromIterator[Iterable]
18+
trait SubIterable[+IA] extends Iterable[IA] with FromIterator[SubIterable]
19+
20+
class IterableC extends Iterable[Int] { def get() = this }
21+
class SubIterableC extends SubIterable[Int] { def get() = this }
22+
23+
24+
implicit class IterableTransforms[A, C[X] <: Iterable[X], D[X] <: SubIterable[X]]
25+
(val dummy: Unit) {
26+
def foo(c: Iterable[A] with FromIterator[C], d: Iterable[A] with FromIterator[D]): Unit = {
27+
var cget = c.get()
28+
var dget = d.get()
29+
dget = cget // error
30+
cget = dget // error
31+
}
32+
}
33+
34+
def main(args: Array[String]): Unit = {
35+
new IterableTransforms(()).foo(new IterableC, new SubIterableC)
36+
// java.lang.ClassCastException: Test$IterableC cannot be cast to Test$SubIterable
37+
}
38+
}
39+
40+

0 commit comments

Comments
 (0)