@@ -259,18 +259,15 @@ class CheckCaptures extends Recheck, SymTransformer:
259
259
/** The references used at identifier or application trees */
260
260
private val usedSet = util.EqHashMap [Tree , CaptureSet ]()
261
261
262
- /** The set of symbols that were rechecked via a completer, mapped to the completer. */
263
- private val completed = new mutable.HashMap [Symbol , Type ]
262
+ /** The set of symbols that were rechecked via a completer */
263
+ private val completed = new mutable.HashSet [Symbol ]
264
264
265
265
var needAnotherRun = false
266
266
267
267
def resetIteration ()(using Context ): Unit =
268
268
needAnotherRun = false
269
269
resetNuTypes()
270
270
todoAtPostCheck.clear()
271
- for (sym, completer) <- completed do
272
- sym.info = completer
273
- sym.resetFlag(Touched )
274
271
completed.clear()
275
272
276
273
extension [T <: Tree ](tree : T )
@@ -357,23 +354,27 @@ class CheckCaptures extends Recheck, SymTransformer:
357
354
def checkOK (res : CompareResult , prefix : => String , added : CaptureRef | CaptureSet , target : CaptureSet , pos : SrcPos , provenance : => String = " " )(using Context ): Unit =
358
355
res match
359
356
case res : CompareFailure =>
360
- def msg =
357
+ def msg ( provisional : Boolean ) =
361
358
def toAdd : String = errorNotes(res.errorNotes).toAdd.mkString
362
359
def descr : String =
363
360
val d = res.blocking.description
364
361
if d.isEmpty then provenance else " "
365
- em " $prefix included in the allowed capture set ${res.blocking}$descr$toAdd"
362
+ def kind = if provisional then " previously estimated\n " else " allowed "
363
+ em " $prefix included in the ${kind}capture set ${res.blocking}$descr$toAdd"
366
364
target match
367
365
case target : CaptureSet .Var
368
366
if res.blocking.isProvisionallySolved =>
369
- report.error(msg.prepend(i " Another capture checking run needs to be scheduled because \n " ), pos)
367
+ report.warning(
368
+ msg(provisional = true )
369
+ .prepend(i " Another capture checking run needs to be scheduled because \n " ),
370
+ pos)
370
371
needAnotherRun = true
371
372
added match
372
373
case added : CaptureRef => target.elems += added
373
374
case added : CaptureSet => target.elems ++= added.elems
374
375
case _ =>
375
376
inContext(root.printContext(added, res.blocking)):
376
- report.error(msg, pos)
377
+ report.error(msg(provisional = false ) , pos)
377
378
case _ =>
378
379
379
380
/** Check subcapturing `{elem} <: cs`, report error on failure */
@@ -1107,7 +1108,7 @@ class CheckCaptures extends Recheck, SymTransformer:
1107
1108
curEnv = restoreEnvFor(sym.owner)
1108
1109
capt.println(i " Complete $sym in ${curEnv.outersIterator.toList.map(_.owner)}" )
1109
1110
try recheckDef(tree, sym)
1110
- finally completed(sym) = completer
1111
+ finally completed += sym
1111
1112
finally
1112
1113
curEnv = saved
1113
1114
@@ -1737,11 +1738,14 @@ class CheckCaptures extends Recheck, SymTransformer:
1737
1738
withCaptureSetsExplained :
1738
1739
while
1739
1740
super .checkUnit(unit)
1740
- ! ctx.reporter.errorsReported && needAnotherRun
1741
+ ! ctx.reporter.errorsReported
1742
+ && (needAnotherRun || ccConfig.alwaysRepeatRun && ccState.iterCount == 1 )
1741
1743
do
1742
1744
resetIteration()
1745
+ setup.setupUnit(unit.tpdTree, this )
1743
1746
ccState.iterCount += 1
1744
- println(s " **** capture checking run ${ccState.iterCount} started on ${ctx.source}" )
1747
+ capt.println(s " **** capture checking run ${ccState.iterCount} started on ${ctx.source}" )
1748
+
1745
1749
checkOverrides.traverse(unit.tpdTree)
1746
1750
postCheck(unit.tpdTree)
1747
1751
checkSelfTypes(unit.tpdTree)
0 commit comments