@@ -164,13 +164,6 @@ class SepCheck(checker: CheckCaptures.CheckerAPI) extends tpd.TreeTraverser:
164
164
/** The set of references that were consumed so far in the current method */
165
165
private var consumed : MutConsumedSet = MutConsumedSet ()
166
166
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
-
174
167
/** Infos aboput Labeled expressions enclosing the current traversal point.
175
168
* For each labeled expression, it's label name, and a list buffer containing
176
169
* all consumed sets of return expressions referring to that label.
@@ -499,7 +492,7 @@ class SepCheck(checker: CheckCaptures.CheckerAPI) extends tpd.TreeTraverser:
499
492
else assert(! argDeps.isEmpty)
500
493
501
494
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}")
503
496
checkType(arg.formalType, arg.srcPos, TypeRole .Argument (arg))
504
497
// 2. test argPeaks.hidden against previously captured actuals
505
498
if ! argPeaks.hidden.sharedWith(currentPeaks.actual).isEmpty then
@@ -548,6 +541,7 @@ class SepCheck(checker: CheckCaptures.CheckerAPI) extends tpd.TreeTraverser:
548
541
def checkUse (tree : Tree )(using Context ): Unit =
549
542
val used = tree.markedFree.elems
550
543
if ! used.isEmpty then
544
+ capt.println(i " check use $tree: $used" )
551
545
val usedPeaks = used.peaks
552
546
val overlap = defsShadow.peaks.sharedWith(usedPeaks)
553
547
if ! defsShadow.peaks.sharedWith(usedPeaks).isEmpty then
@@ -569,7 +563,7 @@ class SepCheck(checker: CheckCaptures.CheckerAPI) extends tpd.TreeTraverser:
569
563
sepUseError(tree, null , used, defsShadow)
570
564
571
565
for ref <- used do
572
- val pos = consumed.get(ref)
566
+ val pos = consumed.get(ref.stripReadOnly )
573
567
if pos != null then consumeError(ref, pos, tree.srcPos)
574
568
end checkUse
575
569
@@ -656,7 +650,7 @@ class SepCheck(checker: CheckCaptures.CheckerAPI) extends tpd.TreeTraverser:
656
650
case _ : TypeRole .Argument | _ : TypeRole .Qualifier =>
657
651
for ref <- refsToCheck do
658
652
if ! ref.derivesFromSharedCapability then
659
- consumed.put(ref, pos)
653
+ consumed.put(ref.stripReadOnly , pos)
660
654
case _ =>
661
655
end checkConsumedRefs
662
656
@@ -913,7 +907,7 @@ class SepCheck(checker: CheckCaptures.CheckerAPI) extends tpd.TreeTraverser:
913
907
checkValOrDefDef(tree)
914
908
case tree : DefDef =>
915
909
inSection :
916
- withFreshConsumed :
910
+ consumed.segment :
917
911
for params <- tree.paramss; case param : ValDef <- params do
918
912
pushDef(param, emptyRefs)
919
913
traverseChildren(tree)
@@ -945,7 +939,7 @@ class SepCheck(checker: CheckCaptures.CheckerAPI) extends tpd.TreeTraverser:
945
939
val caseConsumed = for cas <- cases yield consumed.segment(traverse(cas))
946
940
caseConsumed.foreach(consumed ++= _)
947
941
case tree : TypeDef if tree.symbol.isClass =>
948
- withFreshConsumed :
942
+ consumed.segment :
949
943
traverseChildren(tree)
950
944
case tree : WhileDo =>
951
945
val loopConsumed = consumed.segment(traverseChildren(tree))
0 commit comments