@@ -259,18 +259,15 @@ class CheckCaptures extends Recheck, SymTransformer:
259259 /** The references used at identifier or application trees */
260260 private val usedSet = util.EqHashMap [Tree , CaptureSet ]()
261261
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 ]
264264
265265 var needAnotherRun = false
266266
267267 def resetIteration ()(using Context ): Unit =
268268 needAnotherRun = false
269269 resetNuTypes()
270270 todoAtPostCheck.clear()
271- for (sym, completer) <- completed do
272- sym.info = completer
273- sym.resetFlag(Touched )
274271 completed.clear()
275272
276273 extension [T <: Tree ](tree : T )
@@ -357,23 +354,27 @@ class CheckCaptures extends Recheck, SymTransformer:
357354 def checkOK (res : CompareResult , prefix : => String , added : CaptureRef | CaptureSet , target : CaptureSet , pos : SrcPos , provenance : => String = " " )(using Context ): Unit =
358355 res match
359356 case res : CompareFailure =>
360- def msg =
357+ def msg ( provisional : Boolean ) =
361358 def toAdd : String = errorNotes(res.errorNotes).toAdd.mkString
362359 def descr : String =
363360 val d = res.blocking.description
364361 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"
366364 target match
367365 case target : CaptureSet .Var
368366 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)
370371 needAnotherRun = true
371372 added match
372373 case added : CaptureRef => target.elems += added
373374 case added : CaptureSet => target.elems ++= added.elems
374375 case _ =>
375376 inContext(root.printContext(added, res.blocking)):
376- report.error(msg, pos)
377+ report.error(msg(provisional = false ) , pos)
377378 case _ =>
378379
379380 /** Check subcapturing `{elem} <: cs`, report error on failure */
@@ -1107,7 +1108,7 @@ class CheckCaptures extends Recheck, SymTransformer:
11071108 curEnv = restoreEnvFor(sym.owner)
11081109 capt.println(i " Complete $sym in ${curEnv.outersIterator.toList.map(_.owner)}" )
11091110 try recheckDef(tree, sym)
1110- finally completed(sym) = completer
1111+ finally completed += sym
11111112 finally
11121113 curEnv = saved
11131114
@@ -1737,11 +1738,14 @@ class CheckCaptures extends Recheck, SymTransformer:
17371738 withCaptureSetsExplained :
17381739 while
17391740 super .checkUnit(unit)
1740- ! ctx.reporter.errorsReported && needAnotherRun
1741+ ! ctx.reporter.errorsReported
1742+ && (needAnotherRun || ccConfig.alwaysRepeatRun && ccState.iterCount == 1 )
17411743 do
17421744 resetIteration()
1745+ setup.setupUnit(unit.tpdTree, this )
17431746 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+
17451749 checkOverrides.traverse(unit.tpdTree)
17461750 postCheck(unit.tpdTree)
17471751 checkSelfTypes(unit.tpdTree)
0 commit comments