@@ -164,13 +164,6 @@ class SepCheck(checker: CheckCaptures.CheckerAPI) extends tpd.TreeTraverser:
164164 /** The set of references that were consumed so far in the current method */
165165 private var consumed : MutConsumedSet = MutConsumedSet ()
166166
167- /** Run `op`` with a fresh, initially empty consumed set. */
168- private def withFreshConsumed (op : => Unit ): Unit =
169- val saved = consumed
170- consumed = MutConsumedSet ()
171- op
172- consumed = saved
173-
174167 /** Infos aboput Labeled expressions enclosing the current traversal point.
175168 * For each labeled expression, it's label name, and a list buffer containing
176169 * all consumed sets of return expressions referring to that label.
@@ -499,7 +492,7 @@ class SepCheck(checker: CheckCaptures.CheckerAPI) extends tpd.TreeTraverser:
499492 else assert(! argDeps.isEmpty)
500493
501494 if arg.needsSepCheck then
502- // println(i"testing $arg, ${ argPeaks.actual}/${argPeaks.formal } against ${currentPeaks.actual}")
495+ // println(i"testing $arg, formal = ${arg.formalType}, peaks = ${ argPeaks.actual}/${argPeaks.hidden } against ${currentPeaks.actual}")
503496 checkType(arg.formalType, arg.srcPos, TypeRole .Argument (arg))
504497 // 2. test argPeaks.hidden against previously captured actuals
505498 if ! argPeaks.hidden.sharedWith(currentPeaks.actual).isEmpty then
@@ -548,6 +541,7 @@ class SepCheck(checker: CheckCaptures.CheckerAPI) extends tpd.TreeTraverser:
548541 def checkUse (tree : Tree )(using Context ): Unit =
549542 val used = tree.markedFree.elems
550543 if ! used.isEmpty then
544+ capt.println(i " check use $tree: $used" )
551545 val usedPeaks = used.peaks
552546 val overlap = defsShadow.peaks.sharedWith(usedPeaks)
553547 if ! defsShadow.peaks.sharedWith(usedPeaks).isEmpty then
@@ -569,7 +563,7 @@ class SepCheck(checker: CheckCaptures.CheckerAPI) extends tpd.TreeTraverser:
569563 sepUseError(tree, null , used, defsShadow)
570564
571565 for ref <- used do
572- val pos = consumed.get(ref)
566+ val pos = consumed.get(ref.stripReadOnly )
573567 if pos != null then consumeError(ref, pos, tree.srcPos)
574568 end checkUse
575569
@@ -656,7 +650,7 @@ class SepCheck(checker: CheckCaptures.CheckerAPI) extends tpd.TreeTraverser:
656650 case _ : TypeRole .Argument | _ : TypeRole .Qualifier =>
657651 for ref <- refsToCheck do
658652 if ! ref.derivesFromSharedCapability then
659- consumed.put(ref, pos)
653+ consumed.put(ref.stripReadOnly , pos)
660654 case _ =>
661655 end checkConsumedRefs
662656
@@ -913,7 +907,7 @@ class SepCheck(checker: CheckCaptures.CheckerAPI) extends tpd.TreeTraverser:
913907 checkValOrDefDef(tree)
914908 case tree : DefDef =>
915909 inSection :
916- withFreshConsumed :
910+ consumed.segment :
917911 for params <- tree.paramss; case param : ValDef <- params do
918912 pushDef(param, emptyRefs)
919913 traverseChildren(tree)
@@ -945,7 +939,7 @@ class SepCheck(checker: CheckCaptures.CheckerAPI) extends tpd.TreeTraverser:
945939 val caseConsumed = for cas <- cases yield consumed.segment(traverse(cas))
946940 caseConsumed.foreach(consumed ++= _)
947941 case tree : TypeDef if tree.symbol.isClass =>
948- withFreshConsumed :
942+ consumed.segment :
949943 traverseChildren(tree)
950944 case tree : WhileDo =>
951945 val loopConsumed = consumed.segment(traverseChildren(tree))
0 commit comments