File tree 2 files changed +19
-3
lines changed
compiler/src/dotty/tools/dotc
2 files changed +19
-3
lines changed Original file line number Diff line number Diff line change @@ -191,7 +191,7 @@ class TreeChecker extends Phase with SymTransformer {
191
191
def assertDefined (tree : untpd.Tree )(implicit ctx : Context ) =
192
192
if (
193
193
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
195
195
)
196
196
assert(nowDefinedSyms contains tree.symbol, i " undefined symbol ${tree.symbol} at line " + tree.pos.line)
197
197
@@ -446,6 +446,22 @@ class TreeChecker extends Phase with SymTransformer {
446
446
super .typedStats(trees, exprOwner)
447
447
}
448
448
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
+
449
465
override def ensureNoLocalRefs (tree : Tree , pt : Type , localSyms : => List [Symbol ])(implicit ctx : Context ): Tree =
450
466
tree
451
467
Original file line number Diff line number Diff line change @@ -1069,7 +1069,7 @@ class Typer extends Namer
1069
1069
caseRest(pat1)(gadtCtx.fresh.setNewScope)
1070
1070
}
1071
1071
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" ) {
1073
1073
val bind1 = typedBind(tree.bind, WildcardType ).asInstanceOf [Bind ]
1074
1074
val expr1 = typed(tree.expr, bind1.symbol.info)
1075
1075
assignType(cpy.Labeled (tree)(bind1, expr1))
@@ -1815,7 +1815,7 @@ class Typer extends Namer
1815
1815
typedClassDef(tree, sym.asClass)(ctx.localContext(tree, sym).setMode(ctx.mode &~ Mode .InSuperCall ))
1816
1816
else
1817
1817
typedTypeDef(tree, sym)(ctx.localContext(tree, sym).setNewScope)
1818
- case tree : untpd.Labeled => typedLabeled(tree, pt )
1818
+ case tree : untpd.Labeled => typedLabeled(tree)
1819
1819
case _ => typedUnadapted(desugar(tree), pt, locked)
1820
1820
}
1821
1821
}
You can’t perform that action at this time.
0 commit comments