Skip to content

Commit 3e74816

Browse files
Merge pull request #13635 from dotty-staging/fix-13633
Fix #13633: Add regression test
2 parents 847cce2 + a7c179b commit 3e74816

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed

tests/pos/13633.scala

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import scala.compiletime.{constValueTuple, constValue}
2+
3+
object Sums extends App:
4+
5+
println(constValueTuple[Plus[(true, true, true), (true, true)]]) // works
6+
println(constValueTuple[Plus1[(true, true, true), (true, true)]]) // fails
7+
println(constValueTuple[
8+
Reverse[PlusLoop[Reverse[(true, true, true)], Reverse[(true, true)], false]]]
9+
) // also works despite it's just an unfold of `Plus1` application
10+
11+
type Plus[A <: Tuple, B <: Tuple] <: Tuple = (A, B) match
12+
case (EmptyTuple, EmptyTuple) => EmptyTuple
13+
case (a, b) => Reverse[PlusLoop[Reverse[A], Reverse[B], false]]
14+
15+
type Plus1[A <: Tuple, B <: Tuple] = Reverse[PlusLoop[Reverse[A], Reverse[B], false]]
16+
17+
type ReverseLoop[A, XS <: Tuple] <: Tuple = A match {
18+
case EmptyTuple => XS
19+
case x *: xs => ReverseLoop[xs, x *: XS]
20+
}
21+
22+
type Reverse[A] = ReverseLoop[A, EmptyTuple]
23+
24+
type PlusTri[A, B, C] = (A, B, C) match
25+
case (false, false, false) => (false, false)
26+
case (true, false, false) | (false, true, false) | (false, false, true) => (false, true)
27+
case (true, true, false) | (true, false, true) | (false, true, true) => (true, false)
28+
case (true, true, true) => (true, true)
29+
30+
type Inc[A <: Tuple] <: Tuple = A match
31+
case EmptyTuple => true *: EmptyTuple
32+
case t *: as =>
33+
t match
34+
case false => true *: as
35+
case true => false *: Inc[as]
36+
37+
type IncT[A <: Tuple, O <: Boolean] <: Tuple = O match
38+
case false => A
39+
case true => Inc[A]
40+
41+
type PlusLoop[A <: Tuple, B <: Tuple, O] <: Tuple = (A, B) match
42+
case (EmptyTuple, EmptyTuple) =>
43+
O match
44+
case true => (true *: EmptyTuple)
45+
case false => EmptyTuple
46+
case (EmptyTuple, B) => IncT[B, O]
47+
case (A, EmptyTuple) => IncT[A, O]
48+
case (a *: as, b *: bs) =>
49+
PlusTri[a, b, O] match
50+
case (x, y) => y *: PlusLoop[as, bs, x]

0 commit comments

Comments
 (0)