@@ -106,14 +106,14 @@ object CheckCaptures:
106106 /** Check that a @retains annotation only mentions references that can be tracked.
107107 * This check is performed at Typer.
108108 */
109- def checkWellformed (parent : Tree , ann : Tree )(using Context ): Unit =
109+ def checkWellformedRetains (parent : Tree , ann : Tree )(using Context ): Unit =
110110 def check (elem : Type ): Unit = elem match
111111 case ref : TypeRef =>
112112 val refSym = ref.symbol
113113 if refSym.isType && ! refSym.info.derivesFrom(defn.Caps_CapSet ) then
114114 report.error(em " $elem is not a legal element of a capture set " , ann.srcPos)
115115 case ref : CoreCapability =>
116- if ! ref.isTrackableRef && ! ref.isCapRef then
116+ if ! ref.isTrackableRef && ! ref.isCapRef && ! ref.isLocalMutable then
117117 report.error(em " $elem cannot be tracked since it is not a parameter or local value " , ann.srcPos)
118118 case ReachCapability (ref) =>
119119 check(ref)
@@ -306,7 +306,7 @@ class CheckCaptures extends Recheck, SymTransformer:
306306 */
307307 private val useInfos = mutable.ArrayBuffer [(Tree , CaptureSet , Env )]()
308308
309- private var usedSet = util.EqHashMap [Tree , CaptureSet ]()
309+ private val usedSet = util.EqHashMap [Tree , CaptureSet ]()
310310
311311 /** The set of symbols that were rechecked via a completer */
312312 private val completed = new mutable.HashSet [Symbol ]
@@ -720,7 +720,7 @@ class CheckCaptures extends Recheck, SymTransformer:
720720 val sel = ref.select(pt.selector).asInstanceOf [TermRef ]
721721 markPathFree(sel, pt.pt, pt.select)
722722 case _ =>
723- markFree(ref.adjustReadOnly(pt), tree)
723+ markFree(ref.mapLocalMutable. adjustReadOnly(pt), tree)
724724
725725 /** The expected type for the qualifier of a selection. If the selection
726726 * could be part of a capability path or is a a read-only method, we return
@@ -1069,7 +1069,7 @@ class CheckCaptures extends Recheck, SymTransformer:
10691069 recheck(tree.rhs, lhsType.widen)
10701070 lhsType match
10711071 case lhsType @ TermRef (qualType, _)
1072- if (qualType ne NoPrefix ) && ! lhsType.symbol.hasAnnotation(defn.UntrackedCapturesAnnot ) =>
1072+ if ! lhsType.symbol.hasAnnotation(defn.UntrackedCapturesAnnot ) =>
10731073 checkUpdate(qualType, tree.srcPos)(i " Cannot assign to field ${lhsType.name} of ${qualType.showRef}" )
10741074 case _ =>
10751075 defn.UnitType
@@ -1142,6 +1142,13 @@ class CheckCaptures extends Recheck, SymTransformer:
11421142 openClosures = openClosures.tail
11431143 end recheckClosureBlock
11441144
1145+ /** Add var mirrors to the list of block-local symbols to avoid */
1146+ override def avoidLocals (tp : Type , symsToAvoid : => List [Symbol ])(using Context ): Type =
1147+ val locals = symsToAvoid
1148+ val varMirrors = locals.collect:
1149+ case local if local.termRef.isLocalMutable => local.varMirror
1150+ super .avoidLocals(tp, varMirrors ++ locals)
1151+
11451152 /** Elements of a SeqLiteral instantiate a Seq or Array parameter, so they
11461153 * should be boxed.
11471154 */
0 commit comments