aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/typer/Typer.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2016-08-22 15:46:06 +0200
committerMartin Odersky <odersky@gmail.com>2016-08-26 11:13:15 +0200
commit23d1bfb4111d8aff513659f2b3e3dd695b9b6e03 (patch)
tree500cb526bde1bdb56707f6606c551a6c6eb573e9 /src/dotty/tools/dotc/typer/Typer.scala
parentf5972c7904ce802e3e7668094726c21c3a603419 (diff)
downloaddotty-23d1bfb4111d8aff513659f2b3e3dd695b9b6e03.tar.gz
dotty-23d1bfb4111d8aff513659f2b3e3dd695b9b6e03.tar.bz2
dotty-23d1bfb4111d8aff513659f2b3e3dd695b9b6e03.zip
Make expressions using GADTs type check in later phases
GADT logic is lost after PatMat. To make code typecheck, the typer should already insert casts where a subtype check succeeded because it involved bounds established by a GADT comparison.
Diffstat (limited to 'src/dotty/tools/dotc/typer/Typer.scala')
-rw-r--r--src/dotty/tools/dotc/typer/Typer.scala5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/dotty/tools/dotc/typer/Typer.scala b/src/dotty/tools/dotc/typer/Typer.scala
index 7eb022b51..39d9d267e 100644
--- a/src/dotty/tools/dotc/typer/Typer.scala
+++ b/src/dotty/tools/dotc/typer/Typer.scala
@@ -1715,6 +1715,7 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
else
missingArgs
case _ =>
+ ctx.typeComparer.GADTused = false
if (ctx.mode is Mode.Pattern) {
tree match {
case _: RefTree | _: Literal if !isVarPattern(tree) =>
@@ -1723,7 +1724,9 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
}
tree
}
- else if (tree.tpe <:< pt) tree
+ else if (tree.tpe <:< pt)
+ if (ctx.typeComparer.GADTused) tree.asInstance(pt)
+ else tree
else if (wtp.isInstanceOf[MethodType]) missingArgs
else {
typr.println(i"adapt to subtype ${tree.tpe} !<:< $pt")