diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/neg/inlineAccess/C_1.scala | 8 | ||||
-rw-r--r-- | tests/neg/inlineAccess/Test_2.scala | 7 | ||||
-rw-r--r-- | tests/neg/inlinevals.scala | 24 | ||||
-rw-r--r-- | tests/neg/power.scala | 15 | ||||
-rw-r--r-- | tests/pos/rbtree.scala | 10 | ||||
-rw-r--r-- | tests/run/inline.check | 9 | ||||
-rw-r--r-- | tests/run/inline/Test_2.scala | 21 | ||||
-rw-r--r-- | tests/run/inline/inlines_1.scala | 41 | ||||
-rw-r--r-- | tests/run/inlineAccess/C_1.scala | 7 | ||||
-rw-r--r-- | tests/run/inlineAccess/Test_2.scala | 7 | ||||
-rw-r--r-- | tests/run/inlineArrowAssoc.scala | 24 | ||||
-rw-r--r-- | tests/run/inlineForeach.check | 137 | ||||
-rw-r--r-- | tests/run/inlineForeach.scala | 48 | ||||
-rw-r--r-- | tests/run/inlinePower.check | 2 | ||||
-rw-r--r-- | tests/run/inlinePower/Test_2.scala | 9 | ||||
-rw-r--r-- | tests/run/inlinePower/power_1.scala | 12 | ||||
-rw-r--r-- | tests/run/inlinePrivates.scala | 36 | ||||
-rw-r--r-- | tests/run/inlinedAssign.scala | 24 | ||||
-rw-r--r-- | tests/run/outerPatternMatch/Outer_1.scala | 6 | ||||
-rw-r--r-- | tests/run/outerPatternMatch/Test_2.scala | 14 |
20 files changed, 456 insertions, 5 deletions
diff --git a/tests/neg/inlineAccess/C_1.scala b/tests/neg/inlineAccess/C_1.scala new file mode 100644 index 000000000..9d34fa3f0 --- /dev/null +++ b/tests/neg/inlineAccess/C_1.scala @@ -0,0 +1,8 @@ +package p +private class D +class C { + inline def inl(): Unit = { + val d = new D() // error (when inlined): not accessible + } +} + diff --git a/tests/neg/inlineAccess/Test_2.scala b/tests/neg/inlineAccess/Test_2.scala new file mode 100644 index 000000000..98ea7693a --- /dev/null +++ b/tests/neg/inlineAccess/Test_2.scala @@ -0,0 +1,7 @@ + +object Test { + def main(args: Array[String]) = { + val c = new p.C() + c.inl() + } +} diff --git a/tests/neg/inlinevals.scala b/tests/neg/inlinevals.scala new file mode 100644 index 000000000..184aa2168 --- /dev/null +++ b/tests/neg/inlinevals.scala @@ -0,0 +1,24 @@ +object Test { + + def power(x: Double, inline n: Int): Double = ??? + + inline val N = 10 + def X = 20 + + inline inline val twice = 30 // error: repeated modifier + + class C(inline x: Int, private inline val y: Int) { + inline val foo: Int // error: abstract member may not be inline + inline def bar: Int // error: abstract member may not be inline + } + + power(2.0, N) // ok, since it's a by-name parameter + power(2.0, X) // error: argument to inline parameter must be a constant expression + + inline val M = X // error: rhs must be constant expression + + def byname(inline f: => String): Int = ??? // ok + + byname("hello" ++ " world") + +} diff --git a/tests/neg/power.scala b/tests/neg/power.scala new file mode 100644 index 000000000..6230b4e51 --- /dev/null +++ b/tests/neg/power.scala @@ -0,0 +1,15 @@ +object Test { + + @inline + def power(x: Double, n: Int): Double = + if (n == 0) 1.0 + else if (n == 1) x + else { + val y = power(x, n / 2) // error: maximal number of inlines exceeded + if (n % 2 == 0) y * y else y * y * x + } + + def main(args: Array[String]): Unit = { + println(power(2.0, args.length)) + } +} diff --git a/tests/pos/rbtree.scala b/tests/pos/rbtree.scala index 1401a1231..04c084596 100644 --- a/tests/pos/rbtree.scala +++ b/tests/pos/rbtree.scala @@ -430,12 +430,12 @@ object RedBlackTree { * An alternative is to implement the these classes using plain old Java code... */ sealed abstract class Tree[A, +B]( - @(inline @getter) final val key: A, - @(inline @getter) final val value: B, - @(inline @getter) final val left: Tree[A, B], - @(inline @getter) final val right: Tree[A, B]) + @(`inline` @getter) final val key: A, + @(`inline` @getter) final val value: B, + @(`inline` @getter) final val left: Tree[A, B], + @(`inline` @getter) final val right: Tree[A, B]) extends Serializable { - @(inline @getter) final val count: Int = 1 + RedBlackTree.count(left) + RedBlackTree.count(right) + @(`inline` @getter) final val count: Int = 1 + RedBlackTree.count(left) + RedBlackTree.count(right) def black: Tree[A, B] def red: Tree[A, B] } diff --git a/tests/run/inline.check b/tests/run/inline.check new file mode 100644 index 000000000..5f711274b --- /dev/null +++ b/tests/run/inline.check @@ -0,0 +1,9 @@ +100 +10000 + + Inner +Outer.f +Outer.f Inner + Inner +Outer.f +Outer.f Inner diff --git a/tests/run/inline/Test_2.scala b/tests/run/inline/Test_2.scala new file mode 100644 index 000000000..605868c80 --- /dev/null +++ b/tests/run/inline/Test_2.scala @@ -0,0 +1,21 @@ +object Test { + + import p.inlines._ + + def main(args: Array[String]): Unit = { + println(f(10)) + println(f(f(10))) + + track("hello") { println("") } + + val o = new Outer + val i = new o.Inner + println(i.m) + println(i.g) + println(i.h) + println(o.inner.m) + println(o.inner.g) + println(o.inner.h) + } + +} diff --git a/tests/run/inline/inlines_1.scala b/tests/run/inline/inlines_1.scala new file mode 100644 index 000000000..24f1c78fe --- /dev/null +++ b/tests/run/inline/inlines_1.scala @@ -0,0 +1,41 @@ +package p +import collection.mutable + +object inlines { + + final val monitored = false + + inline def f(x: Int): Int = x * x + + val hits = new mutable.HashMap[String, Int] { + override def default(key: String): Int = 0 + } + + def record(fn: String, n: Int = 1) = { + if (monitored) { + val name = if (fn.startsWith("member-")) "member" else fn + hits(name) += n + } + } + + @volatile private var stack: List[String] = Nil + + inline def track[T](fn: String)(op: => T) = + if (monitored) { + stack = fn :: stack + record(fn) + try op + finally stack = stack.tail + } else op + + class Outer { + def f = "Outer.f" + class Inner { + val msg = " Inner" + inline def m = msg + inline def g = f + inline def h = f ++ m + } + val inner = new Inner + } +} diff --git a/tests/run/inlineAccess/C_1.scala b/tests/run/inlineAccess/C_1.scala new file mode 100644 index 000000000..349f5b150 --- /dev/null +++ b/tests/run/inlineAccess/C_1.scala @@ -0,0 +1,7 @@ +package p { +class C { + protected def f(): Unit = () + + inline def inl() = f() // error (when inlined): not accessible +} +} diff --git a/tests/run/inlineAccess/Test_2.scala b/tests/run/inlineAccess/Test_2.scala new file mode 100644 index 000000000..98ea7693a --- /dev/null +++ b/tests/run/inlineAccess/Test_2.scala @@ -0,0 +1,7 @@ + +object Test { + def main(args: Array[String]) = { + val c = new p.C() + c.inl() + } +} diff --git a/tests/run/inlineArrowAssoc.scala b/tests/run/inlineArrowAssoc.scala new file mode 100644 index 000000000..c3625609a --- /dev/null +++ b/tests/run/inlineArrowAssoc.scala @@ -0,0 +1,24 @@ +import scala.collection.immutable._ + +import scala.collection.mutable.{ Builder, ListBuffer } + +object Test { + + private val defaultOrdering = Map[Numeric[_], Ordering[_]]( + Numeric.BigIntIsIntegral -> Ordering.BigInt, + Numeric.IntIsIntegral -> Ordering.Int + ) + + final implicit class ArrowAssoc[A](private val self: A) extends AnyVal { + @inline def -> [B](y: B): Tuple2[A, B] = Tuple2(self, y) + def →[B](y: B): Tuple2[A, B] = ->(y) + } + + def main(args: Array[String]): Unit = { + assert((1 -> 2) == (1, 2)) + assert((1 → 2) == (1, 2)) + } + + +} + diff --git a/tests/run/inlineForeach.check b/tests/run/inlineForeach.check new file mode 100644 index 000000000..3fced2fad --- /dev/null +++ b/tests/run/inlineForeach.check @@ -0,0 +1,137 @@ +1 +2 +3 +4 +5 +6 +7 +8 +9 +1 +2 +3 +4 +5 +6 +7 +8 +9 +1 +2 +3 +4 +5 +6 +7 +8 +9 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +4 +4 +4 +4 +4 +4 +4 +4 +4 +4 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +6 +6 +6 +6 +6 +6 +6 +6 +6 +6 +7 +7 +7 +7 +7 +7 +7 +7 +7 +7 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +9 +9 +9 +9 +9 +9 +9 +9 +9 +9 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 diff --git a/tests/run/inlineForeach.scala b/tests/run/inlineForeach.scala new file mode 100644 index 000000000..1389ad6c4 --- /dev/null +++ b/tests/run/inlineForeach.scala @@ -0,0 +1,48 @@ +object Test { + + class Range(from: Int, end: Int) { + + inline + def foreach(inline op: Int => Unit): Unit = { + var i = from + while (i < end) { + op(i) + i += 1 + } + } + + def filter(p: Int => Boolean): List[Int] = ??? + } + + implicit class intWrapper(private val start: Int) extends AnyVal { + def until(end: Int) = new Range(start, end) + def to(limit: Int) = new Range(start, limit + 1) + } + + def matmul(xs: Array[Array[Double]], ys: Array[Array[Double]]): Array[Array[Double]] = { + def nrows = xs.length + def ncols = ys(0).length + def n = ys.length + assert(xs(0).length == n) + val zs = Array.ofDim[Double](nrows, ncols) + for (i <- intWrapper(0) until nrows) + for (j <- 0 until ncols) { + var x = 0.0 + for (k <- 0 until n) + x += xs(i)(k) * ys(k)(j) + zs(i)(j) = x + } + zs + } + + def main(args: Array[String]) = { + 1.until(10).foreach(i => println(i)) + 1.until(10).foreach(println(_)) + 1.until(10).foreach(println) + for (i <- 1 to 10) println(i) + + for (k1 <- 1 to 10) + for (k2 <- 1 to 10) + println(s"$k1") + } +} diff --git a/tests/run/inlinePower.check b/tests/run/inlinePower.check new file mode 100644 index 000000000..25e115634 --- /dev/null +++ b/tests/run/inlinePower.check @@ -0,0 +1,2 @@ +1024.0 +2048.0 diff --git a/tests/run/inlinePower/Test_2.scala b/tests/run/inlinePower/Test_2.scala new file mode 100644 index 000000000..8e16587b5 --- /dev/null +++ b/tests/run/inlinePower/Test_2.scala @@ -0,0 +1,9 @@ +import p.pow.power +object Test { + + def main(args: Array[String]): Unit = { + println(power(2.0, 10)) + def x = 2.0 + println(power(x, 11)) + } +} diff --git a/tests/run/inlinePower/power_1.scala b/tests/run/inlinePower/power_1.scala new file mode 100644 index 000000000..4e96d7caa --- /dev/null +++ b/tests/run/inlinePower/power_1.scala @@ -0,0 +1,12 @@ +package p + +object pow { + + inline def power(x: Double, n: Int): Double = + if (n == 0) 1.0 + else if (n == 1) x + else { + val y = power(x, n / 2) + if (n % 2 == 0) y * y else y * y * x + } +} diff --git a/tests/run/inlinePrivates.scala b/tests/run/inlinePrivates.scala new file mode 100644 index 000000000..ce438ae8d --- /dev/null +++ b/tests/run/inlinePrivates.scala @@ -0,0 +1,36 @@ +object Test { + + class C[T](private val x: T) { + + private def foo[Z](z: Z): T = x + + private var y: T = _ + + inline def get1 = x + inline def get2[U](c: C[U]) = c.x + + inline def foo1(x: Int) = foo(x) + inline def foo2[U](c: C[U]) = c.foo(x) + + inline def set1(z: T) = { y = z; y } + inline def set2[U](c: C[U]) = { c.y = c.x; c.y } + } + + object CC { + private val x = 3 + inline def get1 = x + } + + def main(args: Array[String]) = { + val cc = new C(2) + assert(cc.get1 == 2) + assert(cc.get2(cc) == 2) + assert(cc.foo1(1) == 2) + assert(cc.foo2(cc) == 2) + assert(cc.set1(3) == 3) + assert(cc.set2(cc) == 2) + + assert(CC.get1 == 3) + } + +} diff --git a/tests/run/inlinedAssign.scala b/tests/run/inlinedAssign.scala new file mode 100644 index 000000000..1b524f92b --- /dev/null +++ b/tests/run/inlinedAssign.scala @@ -0,0 +1,24 @@ +object Test { + + inline def swap[T](x: T, inline x_= : T => Unit, y: T, inline y_= : T => Unit) = { + x_=(y) + y_=(x) + } + + inline def f(x: Int => Unit) = x + + def main(args: Array[String]) = { + var x = 1 + var y = 2 + inline def setX(z: Int) = x = z + inline def setY(z: Int) = y = z + swap(x, setX, y, setY) + assert(x == 2 && y == 1) + + swap(x, x = _, y, y = _) + assert(x == 1 && y == 2) + + + val z = f(setX) // tests case where inline arg is not applied + } +} diff --git a/tests/run/outerPatternMatch/Outer_1.scala b/tests/run/outerPatternMatch/Outer_1.scala new file mode 100644 index 000000000..c3b102323 --- /dev/null +++ b/tests/run/outerPatternMatch/Outer_1.scala @@ -0,0 +1,6 @@ +class Outer { + + class Inner + +} + diff --git a/tests/run/outerPatternMatch/Test_2.scala b/tests/run/outerPatternMatch/Test_2.scala new file mode 100644 index 000000000..e46f52f20 --- /dev/null +++ b/tests/run/outerPatternMatch/Test_2.scala @@ -0,0 +1,14 @@ +object Test { + + def main(args: Array[String]): Unit = { + val x = new Outer + val y = new Outer + val i = new x.Inner + val j = new y.Inner + i match { + case _: y.Inner => assert(false) + case _: x.Inner => // OK + } + } + +} |