|
| 1 | +import annotation.precise |
| 2 | +import language.implicitConversions |
| 3 | + |
| 4 | +object preciseDefs: |
| 5 | + def id[T <: Any@precise](x: T): T = x |
| 6 | + class Box[T] |
| 7 | + def idBox[T <: Any@precise](t: T): Box[T] = ??? |
| 8 | + |
| 9 | + final val x = id(3) |
| 10 | + val xTest: 3 = x |
| 11 | + |
| 12 | + final val x3 = id(id(id(3))) |
| 13 | + val x3Test: 3 = x3 |
| 14 | + |
| 15 | + final val tpl = id((1, 2)) |
| 16 | + val tplTest: (1, 2) = tpl |
| 17 | + |
| 18 | + final val list1 = id(1 :: Nil) |
| 19 | + val list1Test: List[1] = list1 |
| 20 | + |
| 21 | + final val list1hi = id(1 :: "hi" :: Nil) |
| 22 | + val list1hiTest: List[1 | "hi"] = list1hi |
| 23 | + |
| 24 | + val c : Boolean = ??? |
| 25 | + val ifVal = idBox(if c then 2 else 3) |
| 26 | + val ifValTest: Box[2 | 3] = ifVal |
| 27 | + |
| 28 | + def same[T <: Any@precise](x: T, y: T) : Box[T] = ??? |
| 29 | + final val sameVal = same(1, 2) |
| 30 | + val sameValTest: Box[1 | 2] = sameVal |
| 31 | + |
| 32 | + def sameVarArgs[T <: Any@precise](a: T*) : Box[T] = ??? |
| 33 | + final val sameVal123hi = sameVarArgs(1, 2, 3, "hi") |
| 34 | + val sameVal123hiTest: Box[1 | 2 | 3 | "hi"] = sameVal123hi |
| 35 | + |
| 36 | + def dep1[T1 <: Any@precise, T2 <: T1](t1: T1)(t2: T2): Box[T1] = ??? |
| 37 | + val d1 = dep1(1)(2) // error |
| 38 | + |
| 39 | + def dep2[T1 <: Any, T2 <: T1@precise](t1: T1)(t2: T2): Box[T1] = ??? |
| 40 | + final val d2 = dep2(1)(2) |
| 41 | + val d2Test: Box[Int] = d2 |
| 42 | + |
| 43 | + def dep12[T1 <: Any@precise, T2 <: T1@precise](t1: T1)(t2: T2): Box[T1] = ??? |
| 44 | + final val d12 = dep12(1)(2) |
| 45 | + val d12Test: Box[1 | 2] = d12 |
| 46 | + |
| 47 | + class PreciseBox[T <: Any@precise] |
| 48 | + given [T]: PreciseBox[T] with {} |
| 49 | + |
| 50 | + def check[T](t: T)(using PreciseBox[T]): Box[T] = ??? |
| 51 | + val c1 = check(1) |
| 52 | + val c1Test: Box[Int] = c1 |
| 53 | + |
| 54 | + |
| 55 | +object preciseInvariance: |
| 56 | + class Box[T <: Any @precise](x: T) |
| 57 | + val c: Boolean = ??? |
| 58 | + val b = Box(if c then 2 else 3) |
| 59 | + val bTest: Box[2 | 3] = b |
| 60 | + final val b3 = Box(Box(Box(3))) |
| 61 | + val b3Test: Box[Box[Box[3]]] = b3 |
| 62 | + |
| 63 | + final val tpl = Box((1, (2, 3), "hi")) |
| 64 | + val tplTest: Box[(1, (2, 3), "hi")] = tpl |
| 65 | + |
| 66 | + final val tpl2: (1, (2, 3), "hi") = (1, (2, 3), "hi") |
| 67 | + final val tpl3 = Box(tpl2) |
| 68 | + val tpl3Test: Box[tpl2.type] = tpl3 |
| 69 | + |
| 70 | + implicit def toBox[T <: Any @precise](from: T): Box[T] = Box(from) |
| 71 | + def box[T](b: Box[T]): Box[T] = b |
| 72 | + |
| 73 | + final val btpl = box(((1, 2), (3, 4))) |
| 74 | + val btplTest: Box[((1, 2), (3, 4))] = btpl |
| 75 | + |
| 76 | + final val b1 = box(1) |
| 77 | + val b1Test: Box[1] = b1 |
| 78 | + |
| 79 | + class Boxx[T <: Any@precise](x: T*) |
| 80 | + val b123 = Boxx(1, 2, 3) |
| 81 | + val b123Test: Boxx[1 | 2 | 3] = b123 |
| 82 | + |
| 83 | + |
| 84 | +object preciseCovariance: |
| 85 | + class Box[+A <: Any@precise](x: A) |
| 86 | + def fromBox[B <: Any](x: Box[B]): Box[B] = x |
| 87 | + final val b1 = Box(1) |
| 88 | + val b11 = fromBox(b1) |
| 89 | + val b11Test: Box[1] = b11 |
| 90 | + val b11CovTest: Box[Int] = b11 |
| 91 | + |
| 92 | + class Inv[A, B] |
| 93 | + class BoxCI[+C <: Any@precise, +I](c: C, i: I) |
| 94 | + def fromBoxCI[C, I](x: BoxCI[C, I]): Inv[C, I] = ??? |
| 95 | + val bci = BoxCI(1, 2) |
| 96 | + val bciTest: BoxCI[1, Int] = bci |
| 97 | + val fbci = fromBoxCI(bci) |
| 98 | + val fbciTest: Inv[1, Int] = fbci |
| 99 | + val fbci12 = fromBoxCI(??? : BoxCI[1, 2]) |
| 100 | + val fbci12Test: Inv[1, Int] = fbci12 |
| 101 | + |
| 102 | + class BoxIC[+I, +C <: Any@precise](i: I, c: C) |
| 103 | + def fromBoxIC[I, C](x: BoxIC[I, C]): Inv[I, C] = ??? |
| 104 | + val bic = BoxIC(1, 2) |
| 105 | + val bicTest: BoxIC[Int, 2] = bic |
| 106 | + val fbic = fromBoxIC(bic) |
| 107 | + val fbicTest: Inv[Int, 2] = fbic |
| 108 | + val fbic12 = fromBoxIC(??? : BoxIC[1, 2]) |
| 109 | + val fbic12Test: Inv[Int, 2] = fbic12 |
| 110 | + |
| 111 | + |
| 112 | +/* |
| 113 | + errors we are not supposed to have |
| 114 | +*/ |
| 115 | +object problems: |
| 116 | + class Box[T] |
| 117 | + def idBox[T <: Any@precise](t: T): Box[T] = ??? |
| 118 | + def idBoxBox[BB](x: Box[BB]): Box[BB] = x |
| 119 | + |
| 120 | + val b1 = idBoxBox(idBox(1)) |
| 121 | + val b1Test: Box[1] = b1 |
0 commit comments