diff --git a/compiler/test/dotty/tools/dotc/BootstrappedOnlyCompilationTests.scala b/compiler/test/dotty/tools/dotc/BootstrappedOnlyCompilationTests.scala index 7ab71230dc59..93b9fa6b68b5 100644 --- a/compiler/test/dotty/tools/dotc/BootstrappedOnlyCompilationTests.scala +++ b/compiler/test/dotty/tools/dotc/BootstrappedOnlyCompilationTests.scala @@ -33,6 +33,7 @@ class BootstrappedOnlyCompilationTests extends ParallelTesting { @Test def posMacros: Unit = { implicit val testGroup: TestGroup = TestGroup("compilePosMacros") aggregateTests( + compileFilesInDir("tests/bench", defaultOptions), compileFilesInDir("tests/pos-macros", defaultOptions), compileFilesInDir("tests/pos-custom-args/semanticdb", defaultOptions.and("-Ysemanticdb")), ).checkCompile() diff --git a/tests/bench/empty-class.scala b/tests/bench/empty-class.scala new file mode 100644 index 000000000000..c389887ee5aa --- /dev/null +++ b/tests/bench/empty-class.scala @@ -0,0 +1 @@ +class Foo diff --git a/tests/bench/empty-file.scala b/tests/bench/empty-file.scala new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/bench/empty-object.scala b/tests/bench/empty-object.scala new file mode 100644 index 000000000000..d3c853cc0441 --- /dev/null +++ b/tests/bench/empty-object.scala @@ -0,0 +1 @@ +object Foo diff --git a/tests/bench/exhaustivity-I.scala b/tests/bench/exhaustivity-I.scala new file mode 100644 index 000000000000..cb13893c80ac --- /dev/null +++ b/tests/bench/exhaustivity-I.scala @@ -0,0 +1,68 @@ +abstract sealed trait C +case object C1 extends C +case object C2 extends C +case object C3 extends C +case object C4 extends C +case object C5 extends C +case object C6 extends C +case object C7 extends C +case object C8 extends C +case object C9 extends C +case object C10 extends C +case object C11 extends C +case object C12 extends C +case object C13 extends C +case object C14 extends C +case object C15 extends C +case object C16 extends C +case object C17 extends C +case object C18 extends C +case object C19 extends C +case object C20 extends C +case object C21 extends C +case object C22 extends C +case object C23 extends C +case object C24 extends C +case object C25 extends C +case object C26 extends C +case object C27 extends C +case object C28 extends C +case object C29 extends C +case object C30 extends C + +object Test { + + def test(c: C): Int = c match { + case C1 => 1 + case C2 => 2 + case C3 => 3 + case C4 => 4 + case C5 => 5 + case C6 => 6 + case C7 => 7 + case C8 => 8 + case C9 => 9 + case C10 => 10 + case C11 => 11 + case C12 => 12 + case C13 => 13 + case C14 => 14 + case C15 => 15 + case C16 => 16 + case C17 => 17 + case C18 => 18 + case C19 => 19 + case C20 => 20 + case C21 => 21 + case C22 => 22 + case C23 => 23 + case C24 => 24 + case C25 => 25 + case C26 => 26 + case C27 => 27 + case C28 => 28 + case C29 => 29 + case C30 => 30 + + } +} diff --git a/tests/bench/exhaustivity-S.scala b/tests/bench/exhaustivity-S.scala new file mode 100644 index 000000000000..ba4fef3fde3d --- /dev/null +++ b/tests/bench/exhaustivity-S.scala @@ -0,0 +1,20 @@ + +sealed trait O +object A extends O +object B extends O + +object Test { + + def test(x: O) = + (x, x, x, x, x, x, x, x, x, x, x, x, x, x) match { + case (A, A, _, _, _, _, _, _, _, _, _, _, _, _) => 1 + case (_, _, A, A, _, _, _, _, _, _, _, _, _, _) => 2 + case (_, _, _, _, A, A, _, _, _, _, _, _, _, _) => 3 + case (_, _, _, _, _, _, A, A, _, _, _, _, _, _) => 4 + case (_, _, _, _, _, _, _, _, A, A, _, _, _, _) => 5 + case (_, _, _, _, _, _, _, _, _, _, A, A, _, _) => 6 + case (_, _, _, _, _, _, _, _, _, _, _, _, A, A) => 7 + case (B, A, B, A, B, A, B, A, B, A, B, A, B, A) => 8 + + } +} diff --git a/tests/bench/exhaustivity-T.scala b/tests/bench/exhaustivity-T.scala new file mode 100644 index 000000000000..4d094758a139 --- /dev/null +++ b/tests/bench/exhaustivity-T.scala @@ -0,0 +1,28 @@ + +sealed trait O +object A extends O +object B extends O + +object Test { + + def test(x: O) = + (x, x, x, x, x, x, x, x) match { + case (A, A, A, A, A, A, A, A) => 1 + case (B, B, B, B, B, B, B, B) => 2 + case (_, A, A, A, A, A, A, A) => 3 + case (_, B, B, B, B, B, B, B) => 4 + case (_, _, A, A, A, A, A, A) => 5 + case (_, _, B, B, B, B, B, B) => 6 + case (_, _, _, A, A, A, A, A) => 7 + case (_, _, _, B, B, B, B, B) => 8 + case (_, _, _, _, A, A, A, A) => 9 + case (_, _, _, _, B, B, B, B) => 10 + case (_, _, _, _, _, A, A, A) => 11 + case (_, _, _, _, _, B, B, B) => 12 + case (_, _, _, _, _, _, A, A) => 13 + case (_, _, _, _, _, _, B, B) => 14 + case (_, _, _, _, _, _, _, A) => 15 + case (_, _, _, _, _, _, _, B) => 16 + + } +} diff --git a/tests/bench/exhaustivity-V.scala b/tests/bench/exhaustivity-V.scala new file mode 100644 index 000000000000..be84934d32ab --- /dev/null +++ b/tests/bench/exhaustivity-V.scala @@ -0,0 +1,18 @@ + +sealed trait O +object A extends O +object B extends O + +object Test { + + def test(x: O) = + (x, x, x, x, x, x, x, x, x, x, x, x, x, x, x) match { + case (A, A, A, A, A, _, _, _, _, _, _, _, _, _, _) => 1 + case (B, _, _, _, _, A, A, A, A, _, _, _, _, _, _) => 2 + case (_, B, _, _, _, B, _, _, _, A, A, A, _, _, _) => 3 + case (_, _, B, _, _, _, B, _, _, B, _, _, A, A, _) => 4 + case (_, _, _, B, _, _, _, B, _, _, B, _, B, _, A) => 5 + case (_, _, _, _, B, _, _, _, B, _, _, B, _, B, B) => 6 + + } +} diff --git a/tests/bench/i1535.scala b/tests/bench/i1535.scala new file mode 100644 index 000000000000..0433e3ab20b0 --- /dev/null +++ b/tests/bench/i1535.scala @@ -0,0 +1,9 @@ +object Example { + case class C[H, T](h: H, t: T) + + type I = Int + + val p + : C[I,C[I,C[I,C[I,C[I,C[I,C[I,C[I,C[I,C[I,C[I,C[I,C[I,C[I,C[I,C[I,C[I,C[I,C[I,C[I,C[I,C[I,C[I,I]]]]]]]]]]]]]]]]]]]]]]] + = C(1,C(1,C(1,C(1,C(1,C(1,C(1,C(1,C(1,C(1,C(1,C(1,C(1,C(1,C(1,C(1,C(1,C(1,C(1,C(1,C(1,C(1,C(1,1))))))))))))))))))))))) +} \ No newline at end of file diff --git a/tests/bench/i1687.scala b/tests/bench/i1687.scala new file mode 100644 index 000000000000..7da9d2824b8c --- /dev/null +++ b/tests/bench/i1687.scala @@ -0,0 +1,10 @@ +object O { + def f: String = { + "1" + 1 + "1" + 1 + + "1" + 1 + "1" + 1 + + "1" + 1 + "1" + 1 + + "1" + 1 + "1" + 1 + + "1" + 1 + "1" + 1 + + "1" + 1 + "1" + 1 + } +} \ No newline at end of file diff --git a/tests/bench/implicit-scope-loop.scala b/tests/bench/implicit-scope-loop.scala new file mode 100644 index 000000000000..162f1a52c053 --- /dev/null +++ b/tests/bench/implicit-scope-loop.scala @@ -0,0 +1,17 @@ +trait Dummy[T] + + +trait A[T] extends B +trait B extends Dummy[A[Int]] +object B { + implicit def theB: B = new B {} + implicit def theA: A[Int] = new A[Int] {} +} + +object Test { + def getB(implicit b: B) = b + def getA[T](implicit a: A[T]) = a + + getB + getA +} \ No newline at end of file diff --git a/tests/bench/implicitNums.scala b/tests/bench/implicitNums.scala new file mode 100644 index 000000000000..d770a0a41abf --- /dev/null +++ b/tests/bench/implicitNums.scala @@ -0,0 +1,1408 @@ +object Test { + + trait Number + trait Zero extends Number + trait Succ[N <: Number](n: N) extends Number + + implicit def succ[N <: Number](implicit n: N): Succ[N] = new Succ[N](n) {} + implicit def zero: Zero = new Zero{} + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + +implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + + implicitly[Zero] + implicitly[Succ[Zero]] + implicitly[Succ[Succ[Zero]]] + implicitly[Succ[Succ[Succ[Zero]]]] + implicitly[Succ[Succ[Succ[Succ[Zero]]]]] + +} diff --git a/tests/bench/implicit_cache.scala b/tests/bench/implicit_cache.scala new file mode 100644 index 000000000000..d124876e0274 --- /dev/null +++ b/tests/bench/implicit_cache.scala @@ -0,0 +1,16 @@ +class A +object A { + implicit def theA: A = new A +} +class Foo[T] +object Foo { + implicit def theFoo: Foo[A] = new Foo[A] +} + +object Test { + def getFooA(implicit foo: Foo[A]) = foo + def getA(implicit a: A) = a + + getFooA + getA +} diff --git a/tests/bench/inductive-implicits.scala b/tests/bench/inductive-implicits.scala new file mode 100644 index 000000000000..4bf66af6e37d --- /dev/null +++ b/tests/bench/inductive-implicits.scala @@ -0,0 +1,619 @@ +// Compiled with ./build/pack/bin/scalac -J-Xss4M -J-Xmx2G test/induction/inductive-implicits-bench.scala +// +// 1: baseline - scalac 2.12.5 +// 2: scalac 2.12.5 with matchesPtInst +// +// (1) (2) +// HList Size +// 50 4 3 +// 100 7 4 +// 150 14 4 +// 200 25 5 +// 250 46 5 +// 300 74 6 +// 350 118 8 +// 400 183 10 +// 450 298 12 +// 500 421 15 +// +// Compile time in seconds + +package shapeless { + sealed trait HList extends Product with Serializable + + final case class ::[+H, +T <: HList](head : H, tail : T) extends HList { + def ::[HH](h : HH) : HH :: H :: T = shapeless.::(h, this) + + override def toString = head match { + case _: ::[_, _] => "("+head.toString+") :: "+tail.toString + case _ => head.toString+" :: "+tail.toString + } + } + + sealed trait HNil extends HList { + def ::[H](h : H) = shapeless.::(h, this) + override def toString = "HNil" + } + + case object HNil extends HNil + + //@annotation.inductive + trait Selector[L <: HList, U] { + def apply(l: L): U + } + + object Selector { + def apply[L <: HList, U](implicit selector: Selector[L, U]): Selector[L, U] = selector + + implicit def inHead[H, T <: HList]: Selector[H :: T, H] = + new Selector[H :: T, H] { + def apply(l : H :: T) = l.head + } + + implicit def inTail[H, T <: HList, U] + (implicit st : Selector[T, U]): Selector[H :: T, U] = + new Selector[H :: T, U] { + def apply(l : H :: T) = st(l.tail) + } + } +} + +import shapeless._ + +object Test extends App { + val sel = Selector[L, Boolean] + + type L = + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: +// + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: +// + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: +// + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: +// + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: +// + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: +// + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: +// + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: +// + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: +// + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: +// + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: +// + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: +// + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: +// + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: + Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// Int :: +// // + Boolean :: + HNil +} diff --git a/tests/bench/patmatexhaust.scala b/tests/bench/patmatexhaust.scala new file mode 100644 index 000000000000..935e0f8ae2f4 --- /dev/null +++ b/tests/bench/patmatexhaust.scala @@ -0,0 +1,131 @@ +class TestSealedExhaustive { // compile only + sealed abstract class Foo + + case class Bar(x:Int) extends Foo + case object Baz extends Foo + + def ma1(x:Foo) = x match { + case Bar(_) => // not exhaustive + } + + def ma2(x:Foo) = x match { + case Baz => // not exhaustive + } + + sealed abstract class Mult + case class Kult(s:Mult) extends Mult + case class Qult() extends Mult + + def ma33(x:Kult) = x match { // exhaustive + case Kult(_) => // exhaustive + } + + def ma3(x:Mult) = (x,x) match { // not exhaustive + case (Kult(_), Qult()) => // Kult missing + //case (Kult(_), Kult(_)) => + case (Qult(), Kult(_)) => // Qult missing + //case (Qult(), Qult()) => + } + + def ma3u(x:Mult) = ((x,x) : @unchecked) match { // not exhaustive, but not checked! + case (Kult(_), Qult()) => + case (Qult(), Kult(_)) => + } + + sealed abstract class Deep + + case object Ga extends Deep + sealed class Gp extends Deep + case object Gu extends Gp + + def zma3(x:Deep) = x match { // exhaustive! + case _ => + } + def zma4(x:Deep) = x match { // exhaustive! + case Ga => + case _ => + } + + def ma4(x:Deep) = x match { // missing cases: Gu, Gp which is not abstract so must be included + case Ga => + } + + def ma5(x:Deep) = x match { + case Gu => + case _ if 1 == 0 => + case Ga => + } + + def ma6() = List(1,2) match { // give up + case List(1,2) => + case x :: xs => + } + + def ma7() = List(1,2) match { //exhaustive + case 1::2::Nil => + case _ => + } + + sealed class B + case class B1() extends B + case object B2 extends B + def ma8(x: B) = x match { + case _: B => true + } + def ma9(x: B) = x match { + case B1() => true // missing B, which is not abstract so must be included + case B2 => true + } + + object ob1 { + sealed abstract class C + sealed abstract class C1 extends C + object C2 extends C + case class C3() extends C + case object C4 extends C + + def ma10(x: C) = x match { // exhaustive: abstract sealed C1 is dead end. + case C3() => true + case C2 | C4 => true + } + } + + object ob2 { + sealed abstract class C + abstract class C1 extends C + object C2 extends C + case class C3() extends C + case object C4 extends C + + def ma10(x: C) = x match { // not exhaustive: C1 is not sealed. + case C3() => true + case C2 | C4 => true + } + } + object ob3 { + sealed abstract class C + sealed abstract class C1 extends C + object D1 extends C1 + case class D2() extends C1 + object C2 extends C + case class C3() extends C + case object C4 extends C + + def ma10(x: C) = x match { // not exhaustive: C1 has subclasses. + case C3() => true + case C2 | C4 => true + } + } + object ob4 { + sealed abstract class C + sealed class C1 extends C + object C2 extends C + case class C3() extends C + case object C4 extends C + + def ma10(x: C) = x match { // not exhaustive: C1 is not abstract. + case C3() => true + case C2 | C4 => true + } + } +} diff --git a/tests/bench/power-macro/PowerInlined-1.scala b/tests/bench/power-macro/PowerInlined-1.scala new file mode 100644 index 000000000000..1e12da45f90a --- /dev/null +++ b/tests/bench/power-macro/PowerInlined-1.scala @@ -0,0 +1,6 @@ + +object PowerInlined { + import PowerMacro._ + + power(1, 5.0) // 1 quotes to unpickle +} diff --git a/tests/bench/power-macro/PowerInlined-1k.scala b/tests/bench/power-macro/PowerInlined-1k.scala new file mode 100644 index 000000000000..b5f6a5a11645 --- /dev/null +++ b/tests/bench/power-macro/PowerInlined-1k.scala @@ -0,0 +1,13 @@ + +object PowerInlined1K { + import PowerMacro._ + + power(Int.MaxValue, 5.0) + power(Int.MaxValue, 5.0) + power(Int.MaxValue, 5.0) + power(Int.MaxValue, 5.0) + power(Int.MaxValue, 5.0) + power(Int.MaxValue, 5.0) + power(Int.MaxValue, 5.0) + power(Int.MaxValue, 5.0) +} diff --git a/tests/bench/power-macro/PowerMacro.scala b/tests/bench/power-macro/PowerMacro.scala new file mode 100644 index 000000000000..c43345969989 --- /dev/null +++ b/tests/bench/power-macro/PowerMacro.scala @@ -0,0 +1,15 @@ +import scala.quoted._ + +object PowerMacro { + + inline def power(inline n: Long, x: Double) = ${ powerCode('n, 'x) } + + def powerCode(n: Expr[Long], x: Expr[Double])(using QuoteContext): Expr[Double] = + powerCode(n.unliftOrError, x) + + def powerCode(n: Long, x: Expr[Double])(using QuoteContext): Expr[Double] = + if (n == 0) '{1.0} + else if (n % 2 == 0) '{ val y = $x * $x; ${powerCode(n / 2, 'y)} } + else '{ $x * ${powerCode(n - 1, x)} } + +} \ No newline at end of file diff --git a/tests/bench/transactional/ImplicitMega.scala b/tests/bench/transactional/ImplicitMega.scala index 80e9c4a43b6e..3bee3297a329 100644 --- a/tests/bench/transactional/ImplicitMega.scala +++ b/tests/bench/transactional/ImplicitMega.scala @@ -1,6 +1,6 @@ package transactional object MegaBench extends Benchmark { - type Transactional[T] = implicit Transaction => T + type Transactional[T] = Transaction ?=> T def transaction[T](op: Transactional[T]): T = { implicit val trans: Transaction = new Transaction diff --git a/tests/bench/transactional/ImplicitMono.scala b/tests/bench/transactional/ImplicitMono.scala index 10391f191571..e2d74c61d0a4 100644 --- a/tests/bench/transactional/ImplicitMono.scala +++ b/tests/bench/transactional/ImplicitMono.scala @@ -1,6 +1,6 @@ package transactional object MonoBench extends Benchmark { - type Transactional[T] = implicit Transaction => T + type Transactional[T] = Transaction ?=> T def transaction[T](op: Transactional[T]): T = { implicit val trans: Transaction = new Transaction diff --git a/tests/bench/tuple22-apply.scala b/tests/bench/tuple22-apply.scala new file mode 100644 index 000000000000..f37e0dd41730 --- /dev/null +++ b/tests/bench/tuple22-apply.scala @@ -0,0 +1,11 @@ +class Foo { + val tup22: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) = ??? + tup22.apply(0) + tup22.apply(5) + tup22.apply(10) + tup22.apply(15) + tup22.apply(21) + + val tup23: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) = ??? + tup23.apply(22) +} diff --git a/tests/bench/tuple22-creation-apply.scala b/tests/bench/tuple22-creation-apply.scala new file mode 100644 index 000000000000..aee0e2dfd084 --- /dev/null +++ b/tests/bench/tuple22-creation-apply.scala @@ -0,0 +1,3 @@ +class Foo { + (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22) +} diff --git a/tests/bench/tuple22-creation-cons.scala b/tests/bench/tuple22-creation-cons.scala new file mode 100644 index 000000000000..9fd65c2dcecd --- /dev/null +++ b/tests/bench/tuple22-creation-cons.scala @@ -0,0 +1,3 @@ +class Foo { + 1 *: 2 *: 3 *: 4 *: 5 *: 6 *: 7 *: 8 *: 9 *: 10 *: 11 *: 12 *: 13 *: 14 *: 15 *: 16 *: 17 *: 18 *: 19 *: 20 *: 21 *: 22 *: Tuple() +} diff --git a/tests/bench/tuple22-size.scala b/tests/bench/tuple22-size.scala new file mode 100644 index 000000000000..aaf9f3712439 --- /dev/null +++ b/tests/bench/tuple22-size.scala @@ -0,0 +1,8 @@ +class Foo { + val tup: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) = ??? + tup.size + tup.size + tup.size + tup.size + tup.size +} diff --git a/tests/bench/tuple22-tails.scala b/tests/bench/tuple22-tails.scala new file mode 100644 index 000000000000..53b8e7c1df69 --- /dev/null +++ b/tests/bench/tuple22-tails.scala @@ -0,0 +1,20 @@ +class Foo { + + val tup1: Tuple1[Int] = ??? + tup1.tail + + val tup3: (Int, Int, Int) = ??? + tup3.tail + + val tup10: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) = ??? + tup10.tail + + val tup22: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) = ??? + tup22.tail + + val tup23: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) = ??? + tup23.tail + + val tup24: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) = ??? + tup24.tail +}