aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/transform/TreeChecker.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-08-30 13:02:56 +0200
committerMartin Odersky <odersky@gmail.com>2014-08-30 13:02:56 +0200
commit4041c5d590f78323d640c6eec7e370a37a01c416 (patch)
tree15e33ffb26e1bfd4c47842670dee696c582322bf /src/dotty/tools/dotc/transform/TreeChecker.scala
parent5362969b55cc73c22ea959d1960e3696a801c469 (diff)
downloaddotty-4041c5d590f78323d640c6eec7e370a37a01c416.tar.gz
dotty-4041c5d590f78323d640c6eec7e370a37a01c416.tar.bz2
dotty-4041c5d590f78323d640c6eec7e370a37a01c416.zip
Ensure that after erasure all types are erased.
Defines a predicate isErasedTypes and checks that all tree types and their widened underlying types are erased.
Diffstat (limited to 'src/dotty/tools/dotc/transform/TreeChecker.scala')
-rw-r--r--src/dotty/tools/dotc/transform/TreeChecker.scala14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/dotty/tools/dotc/transform/TreeChecker.scala b/src/dotty/tools/dotc/transform/TreeChecker.scala
index 2edaabdf2..bd7e351e1 100644
--- a/src/dotty/tools/dotc/transform/TreeChecker.scala
+++ b/src/dotty/tools/dotc/transform/TreeChecker.scala
@@ -12,6 +12,7 @@ import core.Flags._
import core.Constants._
import core.StdNames._
import core.Decorators._
+import core.TypeErasure.isErasedType
import typer._
import typer.ErrorReporting._
import reporting.ThrowingReporter
@@ -42,7 +43,7 @@ class TreeChecker {
object Checker extends ReTyper {
override def typed(tree: untpd.Tree, pt: Type)(implicit ctx: Context) = try {
- tree match {
+ val res = tree match {
case _: untpd.UnApply =>
// can't recheck patterns
tree.asInstanceOf[tpd.Tree]
@@ -66,6 +67,8 @@ class TreeChecker {
assert(isSubType(tree1.tpe, tree.typeOpt), divergenceMsg(tree1.tpe, tree.typeOpt))
tree1
}
+ if (ctx.erasedTypes) assertErased(res)
+ res
} catch {
case ex: Throwable =>
println(i"exception while checking $tree of class ${tree.getClass} # ${tree.uniqueId}")
@@ -119,6 +122,15 @@ class TreeChecker {
tree
}
}
+
+ def assertErased(tp: Type, tree: Tree = EmptyTree)(implicit ctx: Context): Unit =
+ assert(isErasedType(tp), i"The type $tp - ${tp.toString} of class ${tp.getClass} of tree $tree / ${tree.getClass} is illegal after erasure, phase = ${ctx.phase}")
+
+ def assertErased(tree: Tree)(implicit ctx: Context): Unit = {
+ assertErased(tree.typeOpt, tree)
+ if (!(tree.symbol == defn.Any_isInstanceOf || tree.symbol == defn.Any_asInstanceOf))
+ assertErased(tree.typeOpt.widen, tree)
+ }
}
object TreeChecker extends TreeChecker \ No newline at end of file