diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2013-01-13 17:42:48 +0100 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@typesafe.com> | 2013-01-27 22:42:02 -0800 |
commit | a87d40960bfdb4a683c05d3430a8874cb4dcff36 (patch) | |
tree | a65ddd00ebdee081055d982f6408cbfc34e9e62c /test/pending/pos | |
parent | 02963d724c512251ce66502226408091686989ee (diff) | |
download | scala-a87d40960bfdb4a683c05d3430a8874cb4dcff36.tar.gz scala-a87d40960bfdb4a683c05d3430a8874cb4dcff36.tar.bz2 scala-a87d40960bfdb4a683c05d3430a8874cb4dcff36.zip |
SI-6968 Simple Tuple patterns aren't irrefutable
Reverts part of c82ecab. The parser can't assume that
a pattern `(a, b)` will match, as results of
`.isInstanceOf[Tuple2]` can't be statically known until
after the typer.
The reopens SI-1336, SI-5589 and SI-4574, in exchange for fixing
this regression SI-6968. Keeping all of those fixed will require
a better definition of irrefutability, and some acrobatics to
ensure safe passage to the ambiguous trees through typechecking.
Diffstat (limited to 'test/pending/pos')
-rw-r--r-- | test/pending/pos/t1336.scala | 10 | ||||
-rw-r--r-- | test/pending/pos/t5589.scala | 22 |
2 files changed, 32 insertions, 0 deletions
diff --git a/test/pending/pos/t1336.scala b/test/pending/pos/t1336.scala new file mode 100644 index 0000000000..63967985c7 --- /dev/null +++ b/test/pending/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/pending/pos/t5589.scala b/test/pending/pos/t5589.scala new file mode 100644 index 0000000000..69cbb20391 --- /dev/null +++ b/test/pending/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 +**/ +} |