summaryrefslogtreecommitdiff
path: root/test/files
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2010-10-04 05:28:27 +0000
committerPaul Phillips <paulp@improving.org>2010-10-04 05:28:27 +0000
commita7fd7d6dc257e396cf2cf22a9e0a60c3ce44a992 (patch)
tree24dab3548d8cef970a748d149ebd566cce808e64 /test/files
parentafea859ef64122f71525405625d0006150d87fb0 (diff)
downloadscala-a7fd7d6dc257e396cf2cf22a9e0a60c3ce44a992.tar.gz
scala-a7fd7d6dc257e396cf2cf22a9e0a60c3ce44a992.tar.bz2
scala-a7fd7d6dc257e396cf2cf22a9e0a60c3ce44a992.zip
Pattern matching on Array types, working for re...
Pattern matching on Array types, working for reals. def f[T](a: Array[T]) = a match { case x: Array[Int] => x(0) case x: Array[Double] => 2 // etc. } I'd also like to thank "instantiateTypeVar" for displacing the mechanical spiders and giant squid beings which used to fill my nightmares. Now that I know true horror, I welcome the squid. Closes #2755, review by odersky.
Diffstat (limited to 'test/files')
-rw-r--r--test/files/neg/patmat-type-check.check14
-rw-r--r--test/files/neg/patmat-type-check.scala7
-rw-r--r--test/files/neg/t3692.check12
-rw-r--r--test/files/neg/t3692.scala2
-rw-r--r--test/files/run/bug2755.check21
-rw-r--r--test/files/run/bug2755.scala58
6 files changed, 94 insertions, 20 deletions
diff --git a/test/files/neg/patmat-type-check.check b/test/files/neg/patmat-type-check.check
index ab638b616d..8f81cede8f 100644
--- a/test/files/neg/patmat-type-check.check
+++ b/test/files/neg/patmat-type-check.check
@@ -1,21 +1,21 @@
-patmat-type-check.scala:18: error: scrutinee is incompatible with pattern type;
+patmat-type-check.scala:22: error: scrutinee is incompatible with pattern type;
found : Seq[A]
required: java.lang.String
def f1 = "bob".reverse match { case Seq('b', 'o', 'b') => true } // fail
^
-patmat-type-check.scala:19: error: scrutinee is incompatible with pattern type;
+patmat-type-check.scala:23: error: scrutinee is incompatible with pattern type;
found : Seq[A]
required: Array[Char]
def f2 = "bob".toArray match { case Seq('b', 'o', 'b') => true } // fail
^
-patmat-type-check.scala:23: error: scrutinee is incompatible with pattern type;
+patmat-type-check.scala:27: error: scrutinee is incompatible with pattern type;
found : Seq[A]
required: Test.Bop2
def f3(x: Bop2) = x match { case Seq('b', 'o', 'b') => true } // fail
^
-patmat-type-check.scala:27: error: scrutinee is incompatible with pattern type;
+patmat-type-check.scala:30: error: scrutinee is incompatible with pattern type;
found : Seq[A]
- required: Test.Bop3[T]
- def f4[T](x: Bop3[T]) = x match { case Seq('b', 'o', 'b') => true } // fail
- ^
+ required: Test.Bop3[Char]
+ def f4[T](x: Bop3[Char]) = x match { case Seq('b', 'o', 'b') => true } // fail
+ ^
four errors found
diff --git a/test/files/neg/patmat-type-check.scala b/test/files/neg/patmat-type-check.scala
index c6c689b256..26d0409fa0 100644
--- a/test/files/neg/patmat-type-check.scala
+++ b/test/files/neg/patmat-type-check.scala
@@ -14,6 +14,10 @@ object Test
final class Bop5[T, U, -V]
def s4[T1, T2](x: Bop5[_, T1, T2]) = x match { case Seq('b', 'o', 'b') => true }
+ // free type parameter, allowed
+ final class Bop3[T]
+ def f4[T](x: Bop3[T]) = x match { case Seq('b', 'o', 'b') => true }
+
// String and Array are final/invariant, disallowed
def f1 = "bob".reverse match { case Seq('b', 'o', 'b') => true } // fail
def f2 = "bob".toArray match { case Seq('b', 'o', 'b') => true } // fail
@@ -23,6 +27,5 @@ object Test
def f3(x: Bop2) = x match { case Seq('b', 'o', 'b') => true } // fail
// final, invariant type parameter, should be disallowed
- final class Bop3[T]
- def f4[T](x: Bop3[T]) = x match { case Seq('b', 'o', 'b') => true } // fail
+ def f4[T](x: Bop3[Char]) = x match { case Seq('b', 'o', 'b') => true } // fail
}
diff --git a/test/files/neg/t3692.check b/test/files/neg/t3692.check
index ce89a6563d..96ddd2a461 100644
--- a/test/files/neg/t3692.check
+++ b/test/files/neg/t3692.check
@@ -1,14 +1,4 @@
-t3692.scala:11: warning: type Integer in package scala is deprecated: use <code>java.lang.Integer</code> instead
- case m0: Map[Int, Int] => new java.util.HashMap[Integer, Integer]
- ^
-t3692.scala:12: warning: type Integer in package scala is deprecated: use <code>java.lang.Integer</code> instead
- case m1: Map[Int, V] => new java.util.HashMap[Integer, V]
- ^
-t3692.scala:13: warning: type Integer in package scala is deprecated: use <code>java.lang.Integer</code> instead
- case m2: Map[T, Int] => new java.util.HashMap[T, Integer]
- ^
-t3692.scala:13: error: unreachable code
+t3692.scala:15: error: unreachable code
case m2: Map[T, Int] => new java.util.HashMap[T, Integer]
^
-three warnings found
one error found
diff --git a/test/files/neg/t3692.scala b/test/files/neg/t3692.scala
index 78b0e4b843..151535ae94 100644
--- a/test/files/neg/t3692.scala
+++ b/test/files/neg/t3692.scala
@@ -1,3 +1,5 @@
+import java.lang.Integer
+
object ManifestTester {
def main(args: Array[String]) = {
val map = Map("John" -> 1, "Josh" -> 2)
diff --git a/test/files/run/bug2755.check b/test/files/run/bug2755.check
new file mode 100644
index 0000000000..4905c0052d
--- /dev/null
+++ b/test/files/run/bug2755.check
@@ -0,0 +1,21 @@
+1
+2
+3
+4
+5
+6
+7
+1
+2
+3
+4
+5
+6
+7
+1
+2
+3
+4
+5
+6
+7
diff --git a/test/files/run/bug2755.scala b/test/files/run/bug2755.scala
new file mode 100644
index 0000000000..8d10b56734
--- /dev/null
+++ b/test/files/run/bug2755.scala
@@ -0,0 +1,58 @@
+// Test cases: the only place we can cut and paste without crying
+// ourself to sleep.
+object Test {
+ def f1(a: Any) = a match {
+ case x: Array[Int] => x(0)
+ case x: Array[Double] => 2
+ case x: Array[Float] => x.sum.toInt
+ case x: Array[String] => x.size
+ case x: Array[AnyRef] => 5
+ case x: Array[_] => 6
+ case _ => 7
+ }
+ def f2(a: Array[_]) = a match {
+ case x: Array[Int] => x(0)
+ case x: Array[Double] => 2
+ case x: Array[Float] => x.sum.toInt
+ case x: Array[String] => x.size
+ case x: Array[AnyRef] => 5
+ case x: Array[_] => 6
+ case _ => 7
+ }
+ def f3[T](a: Array[T]) = a match {
+ case x: Array[Int] => x(0)
+ case x: Array[Double] => 2
+ case x: Array[Float] => x.sum.toInt
+ case x: Array[String] => x.size
+ case x: Array[AnyRef] => 5
+ case x: Array[_] => 6
+ case _ => 7
+ }
+
+
+ def main(args: Array[String]): Unit = {
+ println(f1(Array(1, 2, 3)))
+ println(f1(Array(1.0, -2.0, 3.0, 1.0)))
+ println(f1(Array(1.0f, 2.0f, 3.0f, -3.0f)))
+ println(f1((1 to 4).toArray map (_.toString)))
+ println(f1(new Array[Any](10))) // should match as Array[AnyRef]
+ println(f1(Array(1L)))
+ println(f1(null))
+
+ println(f2(Array(1, 2, 3)))
+ println(f2(Array(1.0, -2.0, 3.0, 1.0)))
+ println(f2(Array(1.0f, 2.0f, 3.0f, -3.0f)))
+ println(f2((1 to 4).toArray map (_.toString)))
+ println(f2(new Array[Any](10))) // should match as Array[AnyRef]
+ println(f2(Array(1L)))
+ println(f2(null))
+
+ println(f3(Array(1, 2, 3)))
+ println(f3(Array(1.0, -2.0, 3.0, 1.0)))
+ println(f3(Array(1.0f, 2.0f, 3.0f, -3.0f)))
+ println(f3((1 to 4).toArray map (_.toString)))
+ println(f3(new Array[Any](10))) // should match as Array[AnyRef]
+ println(f3(Array(1L)))
+ println(f3(null))
+ }
+}