diff options
author | Martin Odersky <odersky@gmail.com> | 2014-08-30 13:02:56 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2014-08-30 13:02:56 +0200 |
commit | 4041c5d590f78323d640c6eec7e370a37a01c416 (patch) | |
tree | 15e33ffb26e1bfd4c47842670dee696c582322bf /src/dotty/tools/dotc/transform/TreeChecker.scala | |
parent | 5362969b55cc73c22ea959d1960e3696a801c469 (diff) | |
download | dotty-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.scala | 14 |
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 |