Skip to content

Commit c3b9ff7

Browse files
oderskyBlaisorblade
authored andcommitted
Also catch TypeErrors in all transforms
Once we are at it, let's try to bullet-proof everything.
1 parent 7d3927b commit c3b9ff7

File tree

3 files changed

+27
-15
lines changed

3 files changed

+27
-15
lines changed

compiler/src/dotty/tools/dotc/core/TypeErrors.scala

+1
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ class RecursionOverflow(val op: String, details: => String, previous: Throwable,
6666
val mostCommon = recursions.groupBy(_.op).toList.maxBy(_._2.map(_.weight).sum)._2.reverse
6767
s"""Recursion limit exceeded.
6868
|Maybe there is an illegal cyclic reference?
69+
|If that's not the case, you could also try to increase the stacksize using the -Xss JVM option.
6970
|A recurring operation is (inner to outer):
7071
|${opsString(mostCommon)}""".stripMargin
7172
}

compiler/src/dotty/tools/dotc/transform/MacroTransform.scala

+19-14
Original file line numberDiff line numberDiff line change
@@ -46,22 +46,27 @@ abstract class MacroTransform extends Phase {
4646
flatten(trees.mapconserve(transformStat(_)))
4747
}
4848

49-
override def transform(tree: Tree)(implicit ctx: Context): Tree = {
50-
tree match {
51-
case EmptyValDef =>
49+
override def transform(tree: Tree)(implicit ctx: Context): Tree =
50+
try
51+
tree match {
52+
case EmptyValDef =>
53+
tree
54+
case _: PackageDef | _: MemberDef =>
55+
super.transform(tree)(localCtx(tree))
56+
case impl @ Template(constr, parents, self, _) =>
57+
cpy.Template(tree)(
58+
transformSub(constr),
59+
transform(parents)(ctx.superCallContext),
60+
transformSelf(self),
61+
transformStats(impl.body, tree.symbol))
62+
case _ =>
63+
super.transform(tree)
64+
}
65+
catch {
66+
case ex: TypeError =>
67+
ctx.error(ex.toMessage, tree.pos)
5268
tree
53-
case _: PackageDef | _: MemberDef =>
54-
super.transform(tree)(localCtx(tree))
55-
case impl @ Template(constr, parents, self, _) =>
56-
cpy.Template(tree)(
57-
transformSub(constr),
58-
transform(parents)(ctx.superCallContext),
59-
transformSelf(self),
60-
transformStats(impl.body, tree.symbol))
61-
case _ =>
62-
super.transform(tree)
6369
}
64-
}
6570

6671
def transformSelf(vd: ValDef)(implicit ctx: Context) =
6772
cpy.ValDef(vd)(tpt = transform(vd.tpt))

compiler/src/dotty/tools/dotc/transform/MegaPhase.scala

+7-1
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,13 @@ class MegaPhase(val miniPhases: Array[MiniPhase]) extends Phase {
193193
case tree: Alternative => goAlternative(tree, start)
194194
case tree => goOther(tree, start)
195195
}
196-
if (tree.isInstanceOf[NameTree]) goNamed(tree, start) else goUnnamed(tree, start)
196+
try
197+
if (tree.isInstanceOf[NameTree]) goNamed(tree, start) else goUnnamed(tree, start)
198+
catch {
199+
case ex: TypeError =>
200+
ctx.error(ex.toMessage, tree.pos)
201+
tree
202+
}
197203
}
198204

199205
/** Transform full tree using all phases in this group that have idxInGroup >= start */

0 commit comments

Comments
 (0)