Skip to content

Commit 8c841e0

Browse files
committed
Minimise and fix upstream ZIO's problem
1 parent 5a06db7 commit 8c841e0

File tree

4 files changed

+48
-1
lines changed

4 files changed

+48
-1
lines changed

tests/neg/i18453.zio.scala

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Minimised from zio's ZLayer ++
2+
class Cov[+W]:
3+
def add[X >: W, Y](y: Cov[Y]): Cov[X & Y] = ???
4+
def pre[Y >: W, X](x: Cov[X]): Cov[X & Y] = ???
5+
6+
class Test:
7+
def a1[A, B, C](a: Cov[A], b: Cov[B], c: Cov[C]): Cov[A & B & C] = a.add(b).add(c)
8+
def a2[A, B, C](a: Cov[A], b: Cov[B], c: Cov[C]): Cov[A with B with C] = a.add(b).add(c) // error
9+
10+
def b1[A, B, C](a: Cov[A], b: Cov[B], c: Cov[C]): Cov[A & (B & C)] = a.add(b).add(c) // error (a2)
11+
def b2[A, B, C](a: Cov[A], b: Cov[B], c: Cov[C]): Cov[(A & B) & C] = a.add(b).add(c)
12+
def b3[A, B, C](a: Cov[A], b: Cov[B], c: Cov[C]): Cov[A & (B & C)] = a.add(b.add(c))
13+
def b4[A, B, C](a: Cov[A], b: Cov[B], c: Cov[C]): Cov[(A & B) & C] = a.add(b.add(c))
14+
15+
16+
def c3[A, B, C](a: Cov[A], b: Cov[B], c: Cov[C]): Cov[A & B & C] = a.pre(b).pre(c)
17+
def c4[A, B, C](a: Cov[A], b: Cov[B], c: Cov[C]): Cov[A with B with C] = a.pre(b).pre(c) // error
18+
19+
def d1[A, B, C](a: Cov[A], b: Cov[B], c: Cov[C]): Cov[A & (B & C)] = a.pre(b).pre(c) // error (c4)
20+
def d2[A, B, C](a: Cov[A], b: Cov[B], c: Cov[C]): Cov[(A & B) & C] = a.pre(b).pre(c)
21+
def d3[A, B, C](a: Cov[A], b: Cov[B], c: Cov[C]): Cov[A & (B & C)] = a.pre(b.pre(c))
22+
def d4[A, B, C](a: Cov[A], b: Cov[B], c: Cov[C]): Cov[(A & B) & C] = a.pre(b.pre(c))
23+
24+
25+
def add[X, Y](x: Cov[X], y: Cov[Y]): Cov[X & Y] = ???
26+
def e1[A, B, C](a: Cov[A], b: Cov[B], c: Cov[C]): Cov[A & (B & C)] = add(add(a, b), c) // alt assoc: ok!
27+
def e2[A, B, C](a: Cov[A], b: Cov[B], c: Cov[C]): Cov[(A & B) & C] = add(add(a, b), c) // reg assoc: ok
28+
def e3[A, B, C](a: Cov[A], b: Cov[B], c: Cov[C]): Cov[A & (B & C)] = add(a, add(b, c)) // reg assoc: ok
29+
def e4[A, B, C](a: Cov[A], b: Cov[B], c: Cov[C]): Cov[(A & B) & C] = add(a, add(b, c)) // alt assoc: ok!

tests/pos/i18453.min.scala

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
trait Box[T]
2+
3+
trait Foo
4+
5+
class Test:
6+
def meth[A](func: A => A & Foo)(using boxA: Box[A]): Unit = ???
7+
def test[B] (using boxB: Box[B]): Unit =
8+
def nest(p: B): B & Foo = ???
9+
meth(nest)

tests/pos/i19009.min3.scala

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
trait Foo[A]
2+
trait Bar[B] extends Foo[B]
3+
4+
class Test[C]:
5+
def put[X >: Bar[C]](fn: X => Unit, x1: X): Unit = ()
6+
def id(foo: Foo[C]): Foo[C] = foo
7+
8+
def t1(foo2: Foo[C]): Unit =
9+
put(id, foo2) // was: error: exp: Bar[C], got (foo2 : Foo[C])

0 commit comments

Comments
 (0)