summaryrefslogtreecommitdiff
path: root/test/files/neg/t5589neg.scala
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2012-03-19 18:26:55 -0700
committerPaul Phillips <paulp@improving.org>2012-03-19 20:13:36 -0700
commitc82ecabad6fc050411495f3fd50c3bf79ac7e96e (patch)
treee6498f4f2843bd14e16de365079601093af1abb5 /test/files/neg/t5589neg.scala
parent4f565de67fcaf3818c1bcbe204e254014077e1de (diff)
downloadscala-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/neg/t5589neg.scala')
-rw-r--r--test/files/neg/t5589neg.scala28
1 files changed, 28 insertions, 0 deletions
diff --git a/test/files/neg/t5589neg.scala b/test/files/neg/t5589neg.scala
new file mode 100644
index 0000000000..ddd382d8d8
--- /dev/null
+++ b/test/files/neg/t5589neg.scala
@@ -0,0 +1,28 @@
+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
+**/
+
+
+ def f5(x: Either[Int, String]) = for ((y1, y2: String) <- x.right) yield ((y1, y2))
+ def f6(x: Either[Int, String]) = for ((y1, y2: Any) <- x.right) yield ((y1, y2))
+ def f7(x: Either[Int, (String, Int)]) = for (y1 @ Tuple1(y2) <- x.right) yield ((y1, y2))
+ def f8(x: Either[Int, (String, Int)]) = for ((y1, y2, y3) <- x.right) yield ((y1, y2))
+}