summaryrefslogtreecommitdiff
path: root/test/files/neg/t4818.check
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2013-09-30 12:11:49 -0700
committerPaul Phillips <paulp@improving.org>2013-10-01 20:26:54 -0700
commit95d5554b9a263e3eb060c181463234f3e79864ab (patch)
treeab5d0185f0096d723403c14209fe638d337463ec /test/files/neg/t4818.check
parentbef9e52d7337dafcc1f507ff1d93241f12f7c6d9 (diff)
downloadscala-95d5554b9a263e3eb060c181463234f3e79864ab.tar.gz
scala-95d5554b9a263e3eb060c181463234f3e79864ab.tar.bz2
scala-95d5554b9a263e3eb060c181463234f3e79864ab.zip
SI-7886 unsoundness in pattern matcher.
I tracked down what was behind the issue described here: // TODO: fix the illegal type bound in pos/t602 -- type inference // messes up before we get here: /*override def equals(x$1: Any): Boolean = ... // Span[Any] --> Any is not a legal type argument for Span! val o5: Option[com.mosol.sl.Span[Any]] = */ ...which led straight to the unsoundness seen in neg/t7886. It is dangerous to have an expected type of "Any" because the type system will blithely ignore kind errors, since "Any" can absorb anything. The consequence in this instance was that inferring the case constructor for a type like Foo[T <: Bound] if done with expected type Any, this would come up with Foo[Any]. I altered it to use expected type Foo[T], which lets the dummy type parameter survive to carry the bound forward and restores sense to the inference. The before/after output for -Xprint:patmat on pos/t602.scala is: 15c15 < if (x1.isInstanceOf[com.mosol.sl.Span[Any]]) --- > if (x1.isInstanceOf[com.mosol.sl.Span[K]]) 17c17 < <synthetic> val x2: com.mosol.sl.Span[Any] = \ (x1.asInstanceOf[com.mosol.sl.Span[Any]]: com.mosol.sl.Span[Any]); --- > <synthetic> val x2: com.mosol.sl.Span[K] = \ (x1.asInstanceOf[com.mosol.sl.Span[K]]: com.mosol.sl.Span[K]); 19,20c19,20 < val low$0: Option[Any] = x2.low; < val high$0: Option[Any] = x2.high; --- > val low$0: Option[K] = x2.low; > val high$0: Option[K] = x2.high; A file in the library depended (needlessly) on the unsoundness. It was easy to fix but reminds us this may affect existing code.
Diffstat (limited to 'test/files/neg/t4818.check')
-rw-r--r--test/files/neg/t4818.check2
1 files changed, 1 insertions, 1 deletions
diff --git a/test/files/neg/t4818.check b/test/files/neg/t4818.check
index a5e15e456b..8a2c024b30 100644
--- a/test/files/neg/t4818.check
+++ b/test/files/neg/t4818.check
@@ -1,6 +1,6 @@
t4818.scala:4: error: type mismatch;
found : Int(5)
- required: Nothing
+ required: A
def f(x: Any) = x match { case Fn(f) => f(5) }
^
one error found