aboutsummaryrefslogtreecommitdiff
path: root/tests/pos/i0268.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-12-11 18:47:18 +0100
committerMartin Odersky <odersky@gmail.com>2014-12-16 17:46:14 +0100
commit16554c0efe2d09ab3ef760522f0811a964f7ee84 (patch)
treeb3c94dc415850f264c16dbd0b91418e49947045a /tests/pos/i0268.scala
parent21fa5dd1a47727c977848163e2610be745951dbc (diff)
downloaddotty-16554c0efe2d09ab3ef760522f0811a964f7ee84.tar.gz
dotty-16554c0efe2d09ab3ef760522f0811a964f7ee84.tar.bz2
dotty-16554c0efe2d09ab3ef760522f0811a964f7ee84.zip
Fixed #264 - failure to typecheck GADTs
The previous scheme derived the right bounds, but then failed to use them because a TypeRef already has a set info (its bounds). Changing the bounds in the symbol by a side effect does not affect that. This is good! But it showed that the previous scheme was too fragile because it used a sneaky side effect when updating the symbol info which failed to propgate into the cached info in TypeRef. We now keep GADT computed bounds separate form the symbol info in a map `gadt` in the current context.
Diffstat (limited to 'tests/pos/i0268.scala')
-rw-r--r--tests/pos/i0268.scala15
1 files changed, 15 insertions, 0 deletions
diff --git a/tests/pos/i0268.scala b/tests/pos/i0268.scala
new file mode 100644
index 000000000..6ac0c5c90
--- /dev/null
+++ b/tests/pos/i0268.scala
@@ -0,0 +1,15 @@
+package typespatmat
+
+sealed trait Box2[T]
+final case class Int2(x: Int) extends Box2[Int]
+final case class Str2(x: String)
+ extends Box2[String]
+final case class Gen[T](x: T) extends Box2[T]
+
+object Box2 {
+ def double2[T](x: Box2[T]): T = x match {
+ case Int2(i) => i * 2
+ case Str2(s) => s + s
+ case Gen(x) => x
+ }
+}