diff options
author | Paul Phillips <paulp@improving.org> | 2012-03-11 10:50:57 -0400 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2012-03-11 13:23:30 -0400 |
commit | 79e937bea265675c73bca753ba74dc1a829b8737 (patch) | |
tree | 083a4256daec69d3b874afa47939a295ad854188 /test/files | |
parent | f1c39dd9816fd48663064307c39e2d9c8c936cd5 (diff) | |
download | scala-79e937bea265675c73bca753ba74dc1a829b8737.tar.gz scala-79e937bea265675c73bca753ba74dc1a829b8737.tar.bz2 scala-79e937bea265675c73bca753ba74dc1a829b8737.zip |
Fix for tailcall transform/recognition bugs.
Closes SI-3275, SI-5455.
Diffstat (limited to 'test/files')
-rw-r--r-- | test/files/neg/t3275.check | 4 | ||||
-rw-r--r-- | test/files/neg/t3275.scala | 3 | ||||
-rw-r--r-- | test/files/neg/t5455.check | 4 | ||||
-rw-r--r-- | test/files/neg/t5455.scala | 16 | ||||
-rw-r--r-- | test/files/neg/tailrec-2.check | 7 | ||||
-rw-r--r-- | test/files/neg/tailrec-2.scala | 3 |
6 files changed, 35 insertions, 2 deletions
diff --git a/test/files/neg/t3275.check b/test/files/neg/t3275.check new file mode 100644 index 0000000000..117c792321 --- /dev/null +++ b/test/files/neg/t3275.check @@ -0,0 +1,4 @@ +t3275.scala:2: error: @tailrec annotated method contains no recursive calls + @annotation.tailrec def foo() = 5 + ^ +one error found diff --git a/test/files/neg/t3275.scala b/test/files/neg/t3275.scala new file mode 100644 index 0000000000..18e38a1a97 --- /dev/null +++ b/test/files/neg/t3275.scala @@ -0,0 +1,3 @@ +object Test { + @annotation.tailrec def foo() = 5 +} diff --git a/test/files/neg/t5455.check b/test/files/neg/t5455.check new file mode 100644 index 0000000000..788daf99fa --- /dev/null +++ b/test/files/neg/t5455.check @@ -0,0 +1,4 @@ +t5455.scala:4: error: lazy vals are not tailcall transformed + @annotation.tailrec final lazy val bar: Thing[Int] = { + ^ +one error found diff --git a/test/files/neg/t5455.scala b/test/files/neg/t5455.scala new file mode 100644 index 0000000000..22d6c442c9 --- /dev/null +++ b/test/files/neg/t5455.scala @@ -0,0 +1,16 @@ +trait Test { + def root: Test + + @annotation.tailrec final lazy val bar: Thing[Int] = { + if (this eq root) + Thing(() => System.identityHashCode(bar)) + else + root.bar + } + + def f = bar.f() +} + +case class Thing[A](f: () => A) { + override def toString = "" + f() +} diff --git a/test/files/neg/tailrec-2.check b/test/files/neg/tailrec-2.check index 4f763a1c8d..a918858773 100644 --- a/test/files/neg/tailrec-2.check +++ b/test/files/neg/tailrec-2.check @@ -1,4 +1,7 @@ -tailrec-2.scala:6: error: could not optimize @tailrec annotated method f: it contains a recursive call targetting a supertype +tailrec-2.scala:8: error: could not optimize @tailrec annotated method f: it contains a recursive call targetting a supertype @annotation.tailrec final def f[B >: A](mem: List[B]): List[B] = (null: Super[A]).f(mem) ^ -one error found +tailrec-2.scala:9: error: @tailrec annotated method contains no recursive calls + @annotation.tailrec final def f1[B >: A](mem: List[B]): List[B] = this.g(mem) + ^ +two errors found diff --git a/test/files/neg/tailrec-2.scala b/test/files/neg/tailrec-2.scala index 342cd85323..9eb3af2f07 100644 --- a/test/files/neg/tailrec-2.scala +++ b/test/files/neg/tailrec-2.scala @@ -1,9 +1,12 @@ sealed abstract class Super[+A] { def f[B >: A](mem: List[B]) : List[B] + def g(mem: List[_]) = ??? } // This one should fail, target is a supertype class Bop1[+A](val element: A) extends Super[A] { + @annotation.tailrec final def f[B >: A](mem: List[B]): List[B] = (null: Super[A]).f(mem) + @annotation.tailrec final def f1[B >: A](mem: List[B]): List[B] = this.g(mem) } // These succeed class Bop2[+A](val element: A) extends Super[A] { |