@@ -95,11 +95,22 @@ class CheckCaptures extends Recheck:
95
95
val ref = sym.termRef
96
96
def recur (env : Env ): Unit =
97
97
if env.isOpen && env.owner != sym.enclosure then
98
- capt.println(i " Mark $sym free in ${env.owner}" )
98
+ capt.println(i " Mark $sym with cs ${ref.captureSet} free in ${env.owner}" )
99
99
checkElem(ref, env.captured, pos)
100
100
recur(env.outer)
101
101
if ref.isTracked then recur(curEnv)
102
102
103
+ def includeCallCaptures (sym : Symbol , pos : SrcPos )(using Context ): Unit =
104
+ if curEnv.isOpen then
105
+ val ownEnclosure = ctx.owner.enclosingMethodOrClass
106
+ var targetSet = capturedVars(sym)
107
+ if ! targetSet.isEmpty && sym.enclosure == ownEnclosure then
108
+ targetSet = targetSet.filter {
109
+ case ref : TermRef => ref.symbol.enclosure != ownEnclosure
110
+ case _ => true
111
+ }
112
+ checkSubset(targetSet, curEnv.captured, pos)
113
+
103
114
def assertSub (cs1 : CaptureSet , cs2 : CaptureSet )(using Context ) =
104
115
assert((cs1 <:< cs2) == CompareResult .OK , i " $cs1 is not a subset of $cs2" )
105
116
@@ -121,6 +132,7 @@ class CheckCaptures extends Recheck:
121
132
122
133
override def recheckIdent (tree : Ident )(using Context ): Type =
123
134
markFree(tree.symbol, tree.srcPos)
135
+ if tree.symbol.is(Method ) then includeCallCaptures(tree.symbol, tree.srcPos)
124
136
super .recheckIdent(tree)
125
137
126
138
override def recheckDefDef (tree : DefDef , sym : Symbol )(using Context ): Type =
@@ -138,17 +150,8 @@ class CheckCaptures extends Recheck:
138
150
finally curEnv = saved
139
151
140
152
override def recheckApply (tree : Apply , pt : Type )(using Context ): Type =
141
- if curEnv.isOpen then
142
- val ownEnclosure = ctx.owner.enclosingMethodOrClass
143
- var targetSet = capturedVars(tree.symbol)
144
- if ! targetSet.isEmpty && tree.symbol.enclosure == ownEnclosure then
145
- targetSet = targetSet.filter {
146
- case ref : TermRef => ref.symbol.enclosure != ownEnclosure
147
- case _ => true
148
- }
149
-
150
- checkSubset(targetSet, curEnv.captured, tree.srcPos)
151
153
val sym = tree.symbol
154
+ includeCallCaptures(sym, tree.srcPos)
152
155
val cs = if sym.isConstructor then capturedVars(sym.owner) else CaptureSet .empty
153
156
super .recheckApply(tree, pt).capturing(cs)
154
157
0 commit comments