Skip to content

Commit 2712b0b

Browse files
authored
Make sure we don't recheck closure bodies twice (#23066)
2 parents 48e8328 + 9443494 commit 2712b0b

File tree

2 files changed

+19
-7
lines changed

2 files changed

+19
-7
lines changed

compiler/src/dotty/tools/dotc/cc/CheckCaptures.scala

+11-1
Original file line numberDiff line numberDiff line change
@@ -949,7 +949,12 @@ class CheckCaptures extends Recheck, SymTransformer:
949949
// TODO follow up on this
950950
try
951951
matchParams(mdef.paramss, pt)
952-
recheckDef(mdef, mdef.symbol)
952+
capt.println(i"recheck closure block $mdef: ${mdef.symbol.infoOrCompleter}")
953+
if !mdef.symbol.isCompleted then
954+
mdef.symbol.ensureCompleted() // this will recheck def
955+
else
956+
recheckDef(mdef, mdef.symbol)
957+
953958
recheckClosure(expr, pt, forceDependent = true)
954959
finally
955960
openClosures = openClosures.tail
@@ -1112,6 +1117,10 @@ class CheckCaptures extends Recheck, SymTransformer:
11121117
finally
11131118
curEnv = saved
11141119

1120+
override def recheckTypeDef(tree: TypeDef, sym: Symbol)(using Context): Type =
1121+
try super.recheckTypeDef(tree, sym)
1122+
finally completed += sym
1123+
11151124
/** Recheck classDef by enforcing the following class-specific capture set relations:
11161125
* 1. The capture set of a class includes the capture sets of its parents.
11171126
* 2. The capture set of the self type of a class includes the capture set of the class.
@@ -1156,6 +1165,7 @@ class CheckCaptures extends Recheck, SymTransformer:
11561165
ccState.inNestedLevelUnless(cls.is(Module)):
11571166
super.recheckClassDef(tree, impl, cls)
11581167
finally
1168+
completed += cls
11591169
curEnv = saved
11601170

11611171
/** If type is of the form `T @requiresCapability(x)`,

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

+8-6
Original file line numberDiff line numberDiff line change
@@ -524,12 +524,14 @@ abstract class Recheck extends Phase, SymTransformer:
524524
if !skipRecheck(sym) then recheckDef(tree, sym)
525525
sym.termRef
526526
case tree: TypeDef =>
527-
// TODO: Should we allow for completers as for ValDefs or DefDefs?
528-
tree.rhs match
529-
case impl: Template =>
530-
recheckClassDef(tree, impl, sym.asClass)(using ctx.localContext(tree, sym))
531-
case _ =>
532-
recheckTypeDef(tree, sym)(using ctx.localContext(tree, sym))
527+
if !skipRecheck(sym) then
528+
// TODO: Should we allow for completers as for ValDefs or DefDefs?
529+
tree.rhs match
530+
case impl: Template =>
531+
recheckClassDef(tree, impl, sym.asClass)(using ctx.localContext(tree, sym))
532+
case _ =>
533+
recheckTypeDef(tree, sym)(using ctx.localContext(tree, sym))
534+
sym.typeRef
533535
case tree: Labeled => recheckLabeled(tree, pt)
534536

535537
def recheckUnnamed(tree: Tree, pt: Type): Type = tree match

0 commit comments

Comments
 (0)