@@ -317,14 +317,16 @@ class CheckCaptures extends Recheck, SymTransformer:
317317 /** Instantiate capture set variables appearing contra-variantly to their
318318 * upper approximation.
319319 */
320- private def interpolator (startingVariance : Int = 1 )(using Context ) = new TypeTraverser :
320+ private def interpolator (sym : Symbol , startingVariance : Int = 1 )(using Context ) = new TypeTraverser :
321321 variance = startingVariance
322322 override def traverse (t : Type ) = t match
323323 case t @ CapturingType (parent, refs) =>
324324 refs match
325325 case refs : CaptureSet .Var if ! refs.isConst =>
326- if variance < 0 then refs.solve()
327- else if ccConfig.newScheme then refs.markSolved(provisional = true )
326+ if variance < 0 then
327+ refs.solve()
328+ else if ccConfig.newScheme && ! sym.isAnonymousFunction then
329+ refs.markSolved(provisional = ! sym.isMutableVar)
328330 case _ =>
329331 traverse(parent)
330332 case t @ defn.RefinedFunctionOf (rinfo) =>
@@ -356,7 +358,7 @@ class CheckCaptures extends Recheck, SymTransformer:
356358 */
357359 private def interpolateVarsIn (tpt : Tree , sym : Symbol )(using Context ): Unit =
358360 if tpt.isInstanceOf [InferredTypeTree ] then
359- interpolator().traverse(tpt.nuType)
361+ interpolator(sym ).traverse(tpt.nuType)
360362 .showing(i " solved vars for $sym in ${tpt.nuType}" , capt)
361363 anchorCaps(sym).traverse(tpt.nuType)
362364 for msg <- ccState.approxWarnings do
@@ -378,8 +380,9 @@ class CheckCaptures extends Recheck, SymTransformer:
378380 if d.isEmpty then provenance else " "
379381 em " $prefix included in the allowed capture set ${res.blocking}$descr$toAdd"
380382 target match
381- case target : CaptureSet .Var if res.blocking.isProvisionallySolved =>
382- report.warning(msg.prepend(i " Another capture checking run needs to be scheduled because: " ), pos)
383+ case target : CaptureSet .Var
384+ if res.blocking.isProvisionallySolved =>
385+ report.error(msg.prepend(i " Another capture checking run needs to be scheduled because \n " ), pos)
383386 needAnotherRun = true
384387 added match
385388 case added : CaptureRef => target.elems += added
@@ -745,7 +748,7 @@ class CheckCaptures extends Recheck, SymTransformer:
745748 protected override def recheckArg (arg : Tree , formal : Type )(using Context ): Type =
746749 val freshenedFormal = root.capToFresh(formal)
747750 val argType = recheck(arg, freshenedFormal)
748- .showing(i " recheck arg $arg vs $freshenedFormal" , capt)
751+ .showing(i " recheck arg $arg vs $freshenedFormal = $result " , capt)
749752 if formal.hasAnnotation(defn.UseAnnot ) || formal.hasAnnotation(defn.ConsumeAnnot ) then
750753 // The @use and/or @consume annotation is added to `formal` by `prepareFunction`
751754 capt.println(i " charging deep capture set of $arg: ${argType} = ${argType.deepCaptureSet}" )
@@ -1016,7 +1019,7 @@ class CheckCaptures extends Recheck, SymTransformer:
10161019
10171020 val saved = curEnv
10181021 val localSet = capturedVars(sym)
1019- if ! localSet.isAlwaysEmpty then
1022+ if localSet ne CaptureSet .empty then
10201023 curEnv = Env (sym, EnvKind .Regular , localSet, curEnv, nestedClosure(tree.rhs))
10211024
10221025 // ctx with AssumedContains entries for each Contains parameter
@@ -1098,7 +1101,7 @@ class CheckCaptures extends Recheck, SymTransformer:
10981101 .toMap
10991102 def restoreEnvFor (sym : Symbol ): Env =
11001103 val localSet = capturedVars(sym)
1101- if localSet.isAlwaysEmpty then rootEnv
1104+ if localSet eq CaptureSet .empty then rootEnv
11021105 else envForOwner.get(sym) match
11031106 case Some (e) => e
11041107 case None => Env (sym, EnvKind .Regular , localSet, restoreEnvFor(sym.owner))
@@ -1125,7 +1128,7 @@ class CheckCaptures extends Recheck, SymTransformer:
11251128 checkSubset(capturedVars(parent.tpe.classSymbol), localSet, parent.srcPos,
11261129 i " \n of the references allowed to be captured by $cls" )
11271130 val saved = curEnv
1128- if ! localSet.isAlwaysEmpty then
1131+ if localSet ne CaptureSet .empty then
11291132 curEnv = Env (cls, EnvKind .Regular , localSet, curEnv)
11301133 try
11311134 val thisSet = cls.classInfo.selfType.captureSet.withDescription(i " of the self type of $cls" )
@@ -1779,7 +1782,7 @@ class CheckCaptures extends Recheck, SymTransformer:
17791782 inContext(ctx.fresh.setOwner(root)):
17801783 checkSelfAgainstParents(root, root.baseClasses)
17811784 val selfType = root.asClass.classInfo.selfType
1782- interpolator(startingVariance = - 1 ).traverse(selfType)
1785+ interpolator(root, startingVariance = - 1 ).traverse(selfType)
17831786 selfType match
17841787 case CapturingType (_, refs : CaptureSet .Var )
17851788 if ! root.isEffectivelySealed
0 commit comments