diff options
author | Martin Odersky <odersky@gmail.com> | 2016-03-19 19:40:47 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2016-03-30 09:51:02 +0200 |
commit | 0855b071d913e7acd5271ab34062c69e25cd93cd (patch) | |
tree | 471dbd97344a9946e71a20ac80bf0ba59cd3b848 /tests/pos/flowops.scala | |
parent | 035aff45e89084290b8f67ca49007c3eac00f13f (diff) | |
download | dotty-0855b071d913e7acd5271ab34062c69e25cd93cd.tar.gz dotty-0855b071d913e7acd5271ab34062c69e25cd93cd.tar.bz2 dotty-0855b071d913e7acd5271ab34062c69e25cd93cd.zip |
Fixes to checkNonCyclic
Simplified logic and now check prefixes of TypeRefs.
Without the simplified logic we would get false cyclic errors for ski.scala.
Test case: flowops.scala
Fixes #1185.
Diffstat (limited to 'tests/pos/flowops.scala')
-rw-r--r-- | tests/pos/flowops.scala | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/tests/pos/flowops.scala b/tests/pos/flowops.scala new file mode 100644 index 000000000..6aead26be --- /dev/null +++ b/tests/pos/flowops.scala @@ -0,0 +1,31 @@ +object Test { + import language.higherKinds + + class NotUsed + + trait FO[+Out, +Mat] { self => + type Repr[+O] <: FO[O, Mat] { + type Repr[+OO] = self.Repr[OO] + } + def map[T](f: Out => T): Repr[T] = ??? + } + + class Source[+O, +M] extends FO[O, M] { + type Repr[+OO] <: Source[OO, M] + } + + class Flow[-I, +O, +M] extends FO[O, M] { + type Repr[+OO] <: Flow[I, OO, M] + } + + implicit class x[O, M, F[o, m] <: FO[o, m]](val f: F[O, M]) extends AnyVal { + def xx(i: Int): f.Repr[O] = f.map(identity) + } + + type IntFlow[O, M] = Flow[Int, O, M] + + val s1 = new Source[Int, NotUsed].xx(12) + val s2: Source[Int, NotUsed] = s1 + val f1 = x[Int, NotUsed, IntFlow](new Flow[Int, Int, NotUsed]).xx(12) + val f2: Flow[Int, Int, NotUsed] = f1 +} |