From ac4542b356cc918da5e94dd11616c6d9f0d455cf Mon Sep 17 00:00:00 2001 From: Paul Phillips Date: Tue, 7 Jul 2009 17:42:06 +0000 Subject: Lots of work hardening matching on sequences. one long-standing bug which actually had a test case testing its bugginess (which is to say, when I fixed the bug, the test case failed.) This: - def doMatch4(xs:Seq[Char]) = xs match { - case Seq(x, y, _*) => x::y::Nil - case Seq(x, y, z, w) => List(z,w) // redundant! - } ...should never have compiled - which must have been recognized on some level given the "redundant!" comment, but it never made it into neg/. --- test/files/neg/pat_unreachable.check | 7 +++++++ test/files/neg/pat_unreachable.scala | 20 ++++++++++++++++++++ test/files/neg/patternalts.scala | 5 +---- test/files/run/patmatnew.scala | 26 +++++++++++++++----------- 4 files changed, 43 insertions(+), 15 deletions(-) create mode 100644 test/files/neg/pat_unreachable.check create mode 100644 test/files/neg/pat_unreachable.scala (limited to 'test') diff --git a/test/files/neg/pat_unreachable.check b/test/files/neg/pat_unreachable.check new file mode 100644 index 0000000000..4e1463d591 --- /dev/null +++ b/test/files/neg/pat_unreachable.check @@ -0,0 +1,7 @@ +pat_unreachable.scala:5: error: unreachable code + case Seq(x, y, z, w) => List(z,w) // redundant! + ^ +pat_unreachable.scala:9: error: unreachable code + case Seq(x, y) => List(x, y) + ^ +two errors found diff --git a/test/files/neg/pat_unreachable.scala b/test/files/neg/pat_unreachable.scala new file mode 100644 index 0000000000..c07be8edf0 --- /dev/null +++ b/test/files/neg/pat_unreachable.scala @@ -0,0 +1,20 @@ + +object Test extends Application { + def unreachable1(xs:Seq[Char]) = xs match { + case Seq(x, y, _*) => x::y::Nil + case Seq(x, y, z, w) => List(z,w) // redundant! + } + def unreachable2(xs:Seq[Char]) = xs match { + case Seq(x, y, _*) => x::y::Nil + case Seq(x, y) => List(x, y) + } + + def not_unreachable(xs:Seq[Char]) = xs match { + case Seq(x, y, _*) => x::y::Nil + case Seq(x) => List(x) + } + def not_unreachable2(xs:Seq[Char]) = xs match { + case Seq(x, y) => x::y::Nil + case Seq(x, y, z, _*) => List(x,y) + } +} \ No newline at end of file diff --git a/test/files/neg/patternalts.scala b/test/files/neg/patternalts.scala index 62d0325a8b..513b81eb5e 100644 --- a/test/files/neg/patternalts.scala +++ b/test/files/neg/patternalts.scala @@ -2,7 +2,4 @@ object Test { List(1) match { case List(x) | List() => Console.println(x) } - List(2) match { - case List(_: Int) | List() => Console.println() - } -} +} \ No newline at end of file diff --git a/test/files/run/patmatnew.scala b/test/files/run/patmatnew.scala index 0ab5e92099..34bd024b29 100644 --- a/test/files/run/patmatnew.scala +++ b/test/files/run/patmatnew.scala @@ -273,10 +273,14 @@ object Test extends TestConsoleMain { //def doMatch3(xs:List[char]) = xs match { // case List(_*, z, w) => w::Nil //} - def doMatch4(xs:Seq[Char]) = xs match { - case Seq(x, y, _*) => x::y::Nil - case Seq(x, y, z, w) => List(z,w) // redundant! - } + // + // Since the second case should have been unreachable all along, + // let's just comment this one out. + // + // def doMatch4(xs:Seq[Char]) = xs match { + // case Seq(x, y, _*) => x::y::Nil + // case Seq(x, y, z, w) => List(z,w) // redundant! + // } def doMatch5(xs:Seq[Char]) = xs match { case Seq(x, y, 'c', w @ _*) => x::y::Nil case Seq(x, y, z @ _*) => z @@ -289,8 +293,8 @@ object Test extends TestConsoleMain { override def runTest() { assertEquals(List('a','b'), doMatch1(List('a','b','c','d'))) assertEquals(List('c','d'), doMatch2(List('a','b','c','d'))) - //assertEquals(doMatch3(List('a','b','c','d')), List('d')) - assertEquals(List('a','b'), doMatch4(List('a','b','c','d'))) + // assertEquals(doMatch3(List('a','b','c','d')), List('d')) + // assertEquals(List('a','b'), doMatch4(List('a','b','c','d'))) assertEquals(List('a','b'), doMatch5(List('a','b','c','d'))) assertEquals(List('c','d'), doMatch6(List('a','b','c','d'))) } @@ -315,7 +319,7 @@ object Test extends TestConsoleMain { case Stream.cons(hd, tl) => hd + sum(tl) } - val str: Stream[int] = Stream.fromIterator(List(1,2,3).iterator) + val str: Stream[Int] = List(1,2,3).iterator.toStream def runTest() = assertEquals(sum(str), 6) } @@ -500,8 +504,8 @@ object Test extends TestConsoleMain { object Bug1261 { sealed trait Elem - case class Foo extends Elem - case class Bar extends Elem + case class Foo() extends Elem + case class Bar() extends Elem trait Row extends Elem object Row { def unapply(r: Row) = true @@ -924,8 +928,8 @@ override def runTest() { object Ticket710 { // compile-only def method { - sealed case class Parent - case object Child extends Parent + sealed case class Parent() + case object Child extends Parent() val x: Parent = Child x match { case Child => () -- cgit v1.2.3