Skip to content

Commit 4baaa50

Browse files
committed
Add latest test case
1 parent 0bce5e5 commit 4baaa50

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed

tests/neg/i15893.scala

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
sealed trait NatT
2+
case class Zero() extends NatT
3+
case class Succ[+N <: NatT](n: N) extends NatT
4+
5+
type Mod2[N <: NatT] <: NatT = N match
6+
case Zero => Zero
7+
case Succ[Zero] => Succ[Zero]
8+
case Succ[Succ[predPredN]] => Mod2[predPredN]
9+
10+
def mod2(n: NatT): NatT = n match
11+
case Zero() => Zero()
12+
case Succ(Zero()) => Succ(Zero())
13+
case Succ(Succ(predPredN)) => mod2(predPredN)
14+
15+
inline def inlineMod2(inline n: NatT): NatT = inline n match
16+
case Zero() => Zero()
17+
case Succ(Zero()) => Succ(Zero())
18+
case Succ(Succ(predPredN)) => inlineMod2(predPredN)
19+
20+
transparent inline def transparentInlineMod2(inline n: NatT): NatT = inline n match
21+
case Zero() => Zero()
22+
case Succ(Zero()) => Succ(Zero())
23+
case Succ(Succ(predPredN)) => transparentInlineMod2(predPredN)
24+
25+
def dependentlyTypedMod2[N <: NatT](n: N): Mod2[N] = n match // exhaustivity warning; unexpected
26+
case Zero(): Zero => Zero() // error
27+
case Succ(Zero()): Succ[Zero] => Succ(Zero()) // error
28+
case Succ(Succ(predPredN)): Succ[Succ[_]] => dependentlyTypedMod2(predPredN) // error
29+
30+
inline def inlineDependentlyTypedMod2[N <: NatT](inline n: N): Mod2[N] = inline n match
31+
case Zero(): Zero => Zero() // error
32+
case Succ(Zero()): Succ[Zero] => Succ(Zero()) // error
33+
case Succ(Succ(predPredN)): Succ[Succ[_]] => inlineDependentlyTypedMod2(predPredN) // error
34+
35+
transparent inline def transparentInlineDependentlyTypedMod2[N <: NatT](inline n: N): Mod2[N] = inline n match
36+
case Zero(): Zero => Zero() // error
37+
case Succ(Zero()): Succ[Zero] => Succ(Zero()) // error
38+
case Succ(Succ(predPredN)): Succ[Succ[_]] => transparentInlineDependentlyTypedMod2(predPredN) // error
39+
40+
def foo(n: NatT): NatT = mod2(n) match
41+
case Succ(Zero()) => Zero()
42+
case _ => n
43+
44+
inline def inlineFoo(inline n: NatT): NatT = inline inlineMod2(n) match
45+
case Succ(Zero()) => Zero()
46+
case _ => n
47+
48+
inline def transparentInlineFoo(inline n: NatT): NatT = inline transparentInlineMod2(n) match
49+
case Succ(Zero()) => Zero()
50+
case _ => n
51+
52+
@main def main(): Unit =
53+
println(mod2(Succ(Succ(Succ(Zero()))))) // prints Succ(Zero()), as expected
54+
println(foo(Succ(Succ(Succ(Zero()))))) // prints Zero(), as expected
55+
println(inlineMod2(Succ(Succ(Succ(Zero()))))) // prints Succ(Zero()), as expected
56+
println(inlineFoo(Succ(Succ(Succ(Zero()))))) // prints Succ(Succ(Succ(Zero()))); unexpected
57+
println(transparentInlineMod2(Succ(Succ(Succ(Zero()))))) // prints Succ(Zero()), as expected
58+
println(transparentInlineFoo(Succ(Succ(Succ(Zero()))))) // prints Zero(), as expected
59+
println(dependentlyTypedMod2(Succ(Succ(Succ(Zero()))))) // runtime error; unexpected
60+
// println(inlineDependentlyTypedMod2(Succ(Succ(Succ(Zero()))))) // doesn't compile; unexpected
61+
// println(transparentInlineDependentlyTypedMod2(Succ(Succ(Succ(Zero()))))) // doesn't compile; unexpected

0 commit comments

Comments
 (0)