aboutsummaryrefslogtreecommitdiff
path: root/tests/neg/Iter2.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-12-19 11:36:07 +0100
committerMartin Odersky <odersky@gmail.com>2015-12-19 11:36:13 +0100
commit8e257a63872697bd48a51ce93a0289c9f5acdfd8 (patch)
treedd8d75640a5d7387082f751db52548c306d0618f /tests/neg/Iter2.scala
parent871188627d5bee19488e60922d23df2243d068d9 (diff)
downloaddotty-8e257a63872697bd48a51ce93a0289c9f5acdfd8.tar.gz
dotty-8e257a63872697bd48a51ce93a0289c9f5acdfd8.tar.bz2
dotty-8e257a63872697bd48a51ce93a0289c9f5acdfd8.zip
Add test case
Diffstat (limited to 'tests/neg/Iter2.scala')
-rw-r--r--tests/neg/Iter2.scala40
1 files changed, 40 insertions, 0 deletions
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
+ }
+}
+
+