diff options
author | Paul Phillips <paulp@improving.org> | 2010-02-18 05:40:27 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2010-02-18 05:40:27 +0000 |
commit | 23e5428008fc88377e59a1a5c20d5476c586d62e (patch) | |
tree | 45a0eb248c9d7c11674c6d0484c009518197d0d4 /test/files | |
parent | cf2f9d7fbe4311b2373957b4bc78520984f4eafc (diff) | |
download | scala-23e5428008fc88377e59a1a5c20d5476c586d62e.tar.gz scala-23e5428008fc88377e59a1a5c20d5476c586d62e.tar.bz2 scala-23e5428008fc88377e59a1a5c20d5476c586d62e.zip |
Tighter pattern matching hits the street.
is final and does not conform to the pattern, it will no longer compile.
See all the exciting things you can no longer do:
"bob".reverse match { case Seq('b', 'o', 'b') => true } // denied!
"bob".toArray match { case Seq('b', 'o', 'b') => true } // rejected!
final class Dunk
def f3(x: Dunk) = x match { case Seq('b', 'o', 'b') => true } // uh-uh!
And so forth. Review by odersky.
Diffstat (limited to 'test/files')
-rw-r--r-- | test/files/neg/bug1878.check | 7 | ||||
-rw-r--r-- | test/files/neg/patmat-type-check.check | 21 | ||||
-rw-r--r-- | test/files/neg/patmat-type-check.scala | 28 | ||||
-rw-r--r-- | test/files/pos/bug0646.scala | 2 | ||||
-rw-r--r-- | test/files/run/withIndex.scala | 2 |
5 files changed, 57 insertions, 3 deletions
diff --git a/test/files/neg/bug1878.check b/test/files/neg/bug1878.check index 5484d675af..f760781fa0 100644 --- a/test/files/neg/bug1878.check +++ b/test/files/neg/bug1878.check @@ -1,10 +1,15 @@ bug1878.scala:3: error: _* may only come last val err1 = "" match { case Seq(f @ _*, ',') => f } ^ +bug1878.scala:3: error: scrutinee is incompatible with pattern type; + found : Seq[A] + required: java.lang.String + val err1 = "" match { case Seq(f @ _*, ',') => f } + ^ bug1878.scala:9: error: _* may only come last val List(List(_*, arg2), _) = List(List(1,2,3), List(4,5,6)) ^ bug1878.scala:13: error: _* may only come last case <p> { _* } </p> => ^ -three errors found +four errors found diff --git a/test/files/neg/patmat-type-check.check b/test/files/neg/patmat-type-check.check new file mode 100644 index 0000000000..ab638b616d --- /dev/null +++ b/test/files/neg/patmat-type-check.check @@ -0,0 +1,21 @@ +patmat-type-check.scala:18: 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; + 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; + 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; + found : Seq[A] + required: Test.Bop3[T] + def f4[T](x: Bop3[T]) = 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 new file mode 100644 index 0000000000..c6c689b256 --- /dev/null +++ b/test/files/neg/patmat-type-check.scala @@ -0,0 +1,28 @@ +object Test +{ + def s1 = "bob".toList match { case Seq('b', 'o', 'b') => true } // list ok + + // not final, allowed + class Bop + def s2(x: Bop) = x match { case Seq('b', 'o', 'b') => true } + + // covariance, allowed + final class Bop4[+T] + def s3[T](x: Bop4[T]) = x match { case Seq('b', 'o', 'b') => true } + + // contravariance, allowed + final class Bop5[T, U, -V] + def s4[T1, T2](x: Bop5[_, T1, T2]) = 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 + + // final, no type parameters, should be disallowed + final class Bop2 + 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 +} diff --git a/test/files/pos/bug0646.scala b/test/files/pos/bug0646.scala index 64214f65b1..a56e857223 100644 --- a/test/files/pos/bug0646.scala +++ b/test/files/pos/bug0646.scala @@ -10,7 +10,7 @@ object xfor { </bks>; new NodeSeq { val theSeq = books.child } match { - case t @ <title>Blabla</title> => t + case t @ Seq(<title>Blabla</title>) => t } //val n: NodeSeq = new NodeSeq { val theSeq = books.child } diff --git a/test/files/run/withIndex.scala b/test/files/run/withIndex.scala index 3b9c9e84e5..910b1f1f9e 100644 --- a/test/files/run/withIndex.scala +++ b/test/files/run/withIndex.scala @@ -3,7 +3,7 @@ object Test { val ary: Array[String] = Array("a", "b", "c") val lst: List[String] = List("a", "b", "c") val itr: Iterator[String] = lst.iterator - val str: Stream[String] = Stream.fromIterator(lst.iterator) + val str: Stream[String] = lst.iterator.toStream Console.println(ary.zipWithIndex.toList) Console.println(lst.zipWithIndex.toList) |