summaryrefslogtreecommitdiff
path: root/test/files/neg/tailrec.scala
blob: e0ebde9863e730498d1903df25a4796ab7960d1b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import scala.annotation.tailrec

// putting @tailrec through the paces
object Winners {
  @tailrec
  def facsucc(n: Int, acc: Int): Int =
    if (n == 0) acc
    else facsucc(n - 1, n * acc)

  @tailrec def loopsucc1(x: Int): Int = loopsucc1(x - 1)
  @tailrec def loopsucc2[T](x: Int): Int = loopsucc2[T](x - 1)

  def ding() {
    object dong {
      @tailrec def loopsucc3(x: Int): Int = loopsucc3(x)
    }
    ()
  }

  def inner(q: Int) = {
    @tailrec
    def loopsucc4(x: Int): Int = loopsucc4(x + 1)

    loopsucc4(q)
  }

  object innerBob {
    @tailrec def loopsucc5(x: Int): Int = loopsucc5(x)
  }
}

class Winners {
  @tailrec private def succ1(x: Int): Int = succ1(x)
  @tailrec final def succ2(x: Int): Int = succ2(x)
  @tailrec final def succ3[T](in: List[T], acc: List[T]): List[T] = in match {
    case Nil      => Nil
    case x :: xs  => succ3(xs, x :: acc)
  }
}

object Failures {
  @tailrec
  def facfail(n: Int): Int =
    if (n == 0) 1
    else n * facfail(n - 1)
}

class Failures {
  // not private, not final
  @tailrec def fail1(x: Int): Int = fail1(x)

  // a typical between-chair-and-keyboard error
  @tailrec final def fail2[T](xs: List[T]): List[T] = xs match {
    case Nil      => Nil
    case x :: xs  => x :: fail2[T](xs)
  }

  // unsafe
  @tailrec final def fail3[T](x: Int): Int = fail3(x - 1)

  // unsafe
  class Tom[T](x: Int) {
    @tailrec final def fail4[U](other: Tom[U], x: Int): Int = other.fail4[U](other, x - 1)
  }
}