<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<div class="markdown-here-wrapper" data-md-url="" style="">
<p style="margin: 0px 0px 1.2em !important;">Interesting
observation.</p>
<p style="margin: 0px 0px 1.2em !important;">On 19/10/2024 18:14,
Archie Cobbs wrote:</p>
<p style="margin: 0px 0px 1.2em !important;"></p>
<div class="markdown-here-exclude">
<p></p>
<blockquote type="cite" cite="mid:CANSoFxuLxZN0bf8qROcGWf1QX29MVnUg7e_uSgMD69K6O76iYw@mail.gmail.com">But
wait... what exactly is the meaning of the word "after" in
that observation? Does "after" mean "later in time as the
program executes" or simply "lexically later in the source
code of the program"?</blockquote>
<p></p>
</div>
<p style="margin: 0px 0px 1.2em !important;"></p>
<p style="margin: 0px 0px 1.2em !important;">I agree with your
subjective feeling that the latter seems to be more important
when reading the code.</p>
<p style="margin: 0px 0px 1.2em !important;">But, as you observed,
for loops are still kind of problematic here, because the space
vs. time conflict: e.g. even though a loop variable might not be
modified after it is captured in a loop body, you can still see
“previous values” of the captured variable, exposed via previous
capturing lambdas.</p>
<p style="margin: 0px 0px 1.2em !important;">I also wonder if
saying that all that matters is the “space” dimension (e.g.
where variable references occur lexically, in a program) would
create asymmetries with some of the other flow-dependent
analyses we do. For instance, DA/DU does not treat the loop body
in a truly lexical fashion - e.g. something like this is an
error:</p>
<pre style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(204, 204, 204); padding: 0.5em 0.7em; display: block !important;">final int x;
while (loopCond) {
x = 1;
}
</code></pre>
<p style="margin: 0px 0px 1.2em !important;">This might look good
if the “time” dimension didn’t exist. But DA/DU takes time into
account, and detects that <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">x</code>
might be actually assigned twice.</p>
<p style="margin: 0px 0px 1.2em !important;">In other words, to me
the crux of the problem remains the definition of the loop
induction variable. We want to carve out some special rules that
allow us to treat the loop induction variable <em>as if</em> it
was a variable freshly declared inside the loop body (e.g.
meaning that the assignment we see in the STEP part of the loop
doesn’t really affect whether that variable can be captured or
not).</p>
<p style="margin: 0px 0px 1.2em !important;">That seems kind of an
orthogonal extension to the one you are proposing here - surely,
“effectively frozen” will allow capture for far more locals (as
your finder experiments show), but we still need to somehow be
able to special case the treatment for loop induction variables.</p>
<p style="margin: 0px 0px 1.2em !important;">Maurizio</p>
<div title="MDH:PHA+SW50ZXJlc3Rpbmcgb2JzZXJ2YXRpb24uPC9wPjxkaXYgY2xhc3M9Im1vei1jaXRlLXByZWZp
eCI+T24gMTkvMTAvMjAyNCAxODoxNCwgQXJjaGllIENvYmJzIHdyb3RlOjxicj48L2Rpdj48Ymxv
Y2txdW90ZSB0eXBlPSJjaXRlIiBjaXRlPSJtaWQ6Q0FOU29GeHVMeFpOMGJmOHFST2NHV2YxUVgy
OU1WblVnN2VfdVNnTUQ2OUs2Tzc2aVl3QG1haWwuZ21haWwuY29tIj5CdXQgd2FpdC4uLiB3aGF0
IGV4YWN0bHkgaXMgdGhlIG1lYW5pbmcgb2YgdGhlIHdvcmQgImFmdGVyIiBpbiB0aGF0IApvYnNl
cnZhdGlvbj8gRG9lcyAiYWZ0ZXIiIG1lYW4gImxhdGVyIGluIHRpbWUgYXMgdGhlIHByb2dyYW0g
ZXhlY3V0ZXMiIApvciBzaW1wbHkgImxleGljYWxseSBsYXRlciBpbiB0aGUgc291cmNlIGNvZGUg
b2YgdGhlIHByb2dyYW0iPzwvYmxvY2txdW90ZT48cD5JIGFncmVlIHdpdGggeW91ciBzdWJqZWN0
aXZlIGZlZWxpbmcgdGhhdCB0aGUgbGF0dGVyIHNlZW1zIHRvIGJlIG1vcmUgaW1wb3J0YW50IHdo
ZW4gcmVhZGluZyB0aGUgY29kZS48L3A+PHA+QnV0LCBhcyB5b3Ugb2JzZXJ2ZWQsIGZvciBsb29w
cyBhcmUgc3RpbGwga2luZCBvZiBwcm9ibGVtYXRpYyBoZXJlLCBiZWNhdXNlIHRoZSBzcGFjZSB2
cy4gdGltZSBjb25mbGljdDogZS5nLiBldmVuIHRob3VnaCBhIGxvb3AgdmFyaWFibGUgbWlnaHQg
bm90IGJlIG1vZGlmaWVkIGFmdGVyIGl0IGlzIGNhcHR1cmVkIGluIGEgbG9vcCBib2R5LCB5b3Ug
Y2FuIHN0aWxsIHNlZSAicHJldmlvdXMgdmFsdWVzIiBvZiB0aGUgY2FwdHVyZWQgdmFyaWFibGUs
IGV4cG9zZWQgdmlhIHByZXZpb3VzIGNhcHR1cmluZyBsYW1iZGFzLjwvcD48cD5JIGFsc28gd29u
ZGVyIGlmIHNheWluZyB0aGF0IGFsbCB0aGF0IG1hdHRlcnMgaXMgdGhlICJzcGFjZSIgZGltZW5z
aW9uIChlLmcuIHdoZXJlIHZhcmlhYmxlIHJlZmVyZW5jZXMgb2NjdXIgbGV4aWNhbGx5LCBpbiBh
IHByb2dyYW0pIHdvdWxkIGNyZWF0ZSBhc3ltbWV0cmllcyB3aXRoIHNvbWUgb2YgdGhlIG90aGVy
IGZsb3ctZGVwZW5kZW50IGFuYWx5c2VzIHdlIGRvLiBGb3IgaW5zdGFuY2UsIERBL0RVIGRvZXMg
bm90IHRyZWF0IHRoZSBsb29wIGJvZHkgaW4gYSB0cnVseSBsZXhpY2FsIGZhc2hpb24gLSBlLmcu
IHNvbWV0aGluZyBsaWtlIHRoaXMgaXMgYW4gZXJyb3I6PC9wPjxwPmBgYDxicj5maW5hbCBpbnQg
eDs8YnI+d2hpbGUgKGxvb3BDb25kKSB7PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyB4ID0gMTs8YnI+
fTxicj5gYGA8L3A+PHA+VGhpcyBtaWdodCBsb29rIGdvb2QgaWYgdGhlICJ0aW1lIiBkaW1lbnNp
b24gZGlkbid0IGV4aXN0LiBCdXQgREEvRFUgdGFrZXMgdGltZSBpbnRvIGFjY291bnQsIGFuZCBk
ZXRlY3RzIHRoYXQgYHhgIG1pZ2h0IGJlIGFjdHVhbGx5IGFzc2lnbmVkIHR3aWNlLjwvcD48cD5J
biBvdGhlciB3b3JkcywgdG8gbWUgdGhlIGNydXggb2YgdGhlIHByb2JsZW0gcmVtYWlucyB0aGUg
ZGVmaW5pdGlvbiBvZiB0aGUgbG9vcCBpbmR1Y3Rpb24gdmFyaWFibGUuIFdlIHdhbnQgdG8gY2Fy
dmUgb3V0IHNvbWUgc3BlY2lhbCBydWxlcyB0aGF0IGFsbG93IHVzIHRvIHRyZWF0IHRoZSBsb29w
IGluZHVjdGlvbiB2YXJpYWJsZSBfYXMgaWZfIGl0IHdhcyBhIHZhcmlhYmxlIGZyZXNobHkgZGVj
bGFyZWQgaW5zaWRlIHRoZSBsb29wIGJvZHkgKGUuZy4gbWVhbmluZyB0aGF0IHRoZSBhc3NpZ25t
ZW50IHdlIHNlZSBpbiB0aGUgU1RFUCBwYXJ0IG9mIHRoZSBsb29wIGRvZXNuJ3QgcmVhbGx5IGFm
ZmVjdCB3aGV0aGVyIHRoYXQgdmFyaWFibGUgY2FuIGJlIGNhcHR1cmVkIG9yIG5vdCkuPC9wPjxw
PlRoYXQgc2VlbXMga2luZCBvZiBhbiBvcnRob2dvbmFsIGV4dGVuc2lvbiB0byB0aGUgb25lIHlv
dSBhcmUgcHJvcG9zaW5nIGhlcmUgLSBzdXJlbHksICJlZmZlY3RpdmVseSBmcm96ZW4iIHdpbGwg
YWxsb3cgY2FwdHVyZSBmb3IgZmFyIG1vcmUgbG9jYWxzIChhcyB5b3VyIGZpbmRlciBleHBlcmlt
ZW50cyBzaG93KSwgYnV0IHdlIHN0aWxsIG5lZWQgdG8gc29tZWhvdyBiZSBhYmxlIHRvIHNwZWNp
YWwgY2FzZSB0aGUgdHJlYXRtZW50IGZvciBsb29wIGluZHVjdGlvbiB2YXJpYWJsZXMuPC9wPjxw
Pk1hdXJpemlvPGJyPjwvcD4=" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;"></div>
</div>
</body>
</html>