diff options
author | Paul Phillips <paulp@improving.org> | 2012-03-19 18:26:55 -0700 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2012-03-19 20:13:36 -0700 |
commit | c82ecabad6fc050411495f3fd50c3bf79ac7e96e (patch) | |
tree | e6498f4f2843bd14e16de365079601093af1abb5 /test/files/pos | |
parent | 4f565de67fcaf3818c1bcbe204e254014077e1de (diff) | |
download | scala-c82ecabad6fc050411495f3fd50c3bf79ac7e96e.tar.gz scala-c82ecabad6fc050411495f3fd50c3bf79ac7e96e.tar.bz2 scala-c82ecabad6fc050411495f3fd50c3bf79ac7e96e.zip |
Finally did something about broken irrefutability.
The parser has always been confused about tuple patterns in
for comprehensions. It thinks it can fail to recognize an
irrefutable pattern and have it removed in refchecks, but it
is sadly mistaken, because the unnecessary filter has a tendency
to fail the compile in typer.
Look more intently for irrefutable patterns and don't insert
the unnecessary filter. Closes SI-5589, SI-1336.
Diffstat (limited to 'test/files/pos')
-rw-r--r-- | test/files/pos/t1336.scala | 10 | ||||
-rw-r--r-- | test/files/pos/t5589.scala | 22 |
2 files changed, 32 insertions, 0 deletions
diff --git a/test/files/pos/t1336.scala b/test/files/pos/t1336.scala new file mode 100644 index 0000000000..63967985c7 --- /dev/null +++ b/test/files/pos/t1336.scala @@ -0,0 +1,10 @@ +object Foo { + def foreach( f : ((Int,Int)) => Unit ) { + println("foreach") + f(1,2) + } + + for( (a,b) <- this ) { + println((a,b)) + } +} diff --git a/test/files/pos/t5589.scala b/test/files/pos/t5589.scala new file mode 100644 index 0000000000..69cbb20391 --- /dev/null +++ b/test/files/pos/t5589.scala @@ -0,0 +1,22 @@ +class A { + // First three compile. + def f1(x: Either[Int, String]) = x.right map (y => y) + def f2(x: Either[Int, String]) = for (y <- x.right) yield y + def f3(x: Either[Int, (String, Int)]) = x.right map { case (y1, y2) => (y1, y2) } + // Last one fails. + def f4(x: Either[Int, (String, Int)]) = for ((y1, y2) <- x.right) yield ((y1, y2)) +/** +./a.scala:5: error: constructor cannot be instantiated to expected type; + found : (T1, T2) + required: Either[Nothing,(String, Int)] + def f4(x: Either[Int, (String, Int)]) = for ((y1, y2) <- x.right) yield ((y1, y2)) + ^ +./a.scala:5: error: not found: value y1 + def f4(x: Either[Int, (String, Int)]) = for ((y1, y2) <- x.right) yield ((y1, y2)) + ^ +./a.scala:5: error: not found: value y2 + def f4(x: Either[Int, (String, Int)]) = for ((y1, y2) <- x.right) yield ((y1, y2)) + ^ +three errors found +**/ +} |