Skip to content

Commit e212731

Browse files
committed
Tree-check the Labeled blocks and their Returns.
1 parent 89bdb12 commit e212731

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ class TreeChecker extends Phase with SymTransformer {
191191
def assertDefined(tree: untpd.Tree)(implicit ctx: Context) =
192192
if (
193193
tree.symbol.maybeOwner.isTerm &&
194-
!(tree.symbol.is(Label) && !tree.symbol.owner.isClass && ctx.phase.labelsReordered) // labeldefs breaks scoping
194+
!(tree.symbol.is(Label | Method) && !tree.symbol.owner.isClass && ctx.phase.labelsReordered) // labeldefs breaks scoping
195195
)
196196
assert(nowDefinedSyms contains tree.symbol, i"undefined symbol ${tree.symbol} at line " + tree.pos.line)
197197

@@ -446,6 +446,22 @@ class TreeChecker extends Phase with SymTransformer {
446446
super.typedStats(trees, exprOwner)
447447
}
448448

449+
override def typedLabeled(tree: untpd.Labeled)(implicit ctx: Context): Labeled = {
450+
checkOwner(tree.bind)
451+
withDefinedSyms(tree.bind :: Nil) { super.typedLabeled(tree) }
452+
}
453+
454+
override def typedReturn(tree: untpd.Return)(implicit ctx: Context): Return = {
455+
val tree1 = super.typedReturn(tree)
456+
val from = tree1.from
457+
val fromSym = from.symbol
458+
if (fromSym.is(Label)) {
459+
assert(!fromSym.is(Method), i"return from a label-def $fromSym at $tree")
460+
assertDefined(from)
461+
}
462+
tree1
463+
}
464+
449465
override def ensureNoLocalRefs(tree: Tree, pt: Type, localSyms: => List[Symbol])(implicit ctx: Context): Tree =
450466
tree
451467

compiler/src/dotty/tools/dotc/typer/Typer.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,7 +1069,7 @@ class Typer extends Namer
10691069
caseRest(pat1)(gadtCtx.fresh.setNewScope)
10701070
}
10711071

1072-
def typedLabeled(tree: untpd.Labeled, pt: Type)(implicit ctx: Context): Tree = track("typedLabeled") {
1072+
def typedLabeled(tree: untpd.Labeled)(implicit ctx: Context): Labeled = track("typedLabeled") {
10731073
val bind1 = typedBind(tree.bind, WildcardType).asInstanceOf[Bind]
10741074
val expr1 = typed(tree.expr, bind1.symbol.info)
10751075
assignType(cpy.Labeled(tree)(bind1, expr1))
@@ -1815,7 +1815,7 @@ class Typer extends Namer
18151815
typedClassDef(tree, sym.asClass)(ctx.localContext(tree, sym).setMode(ctx.mode &~ Mode.InSuperCall))
18161816
else
18171817
typedTypeDef(tree, sym)(ctx.localContext(tree, sym).setNewScope)
1818-
case tree: untpd.Labeled => typedLabeled(tree, pt)
1818+
case tree: untpd.Labeled => typedLabeled(tree)
18191819
case _ => typedUnadapted(desugar(tree), pt, locked)
18201820
}
18211821
}

0 commit comments

Comments
 (0)