<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div><blockquote type="cite" class=""><div class="">On Jan 4, 2015, at 1:11 AM, Richard Smith <<a href="mailto:richard@metafoo.co.uk" class="">richard@metafoo.co.uk</a>> wrote:</div><div class=""><div dir="ltr" class=""><div class="gmail_extra"><div class="gmail_quote">On Sat, Jan 3, 2015 at 1:46 PM, John McCall <span dir="ltr" class=""><<a href="mailto:rjmccall@apple.com" target="_blank" class="">rjmccall@apple.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class=""><div class=""><span class=""><blockquote type="cite" class=""><div class="">On Jan 2, 2015, at 7:10 AM, Richard Smith <<a href="mailto:richard@metafoo.co.uk" target="_blank" class="">richard@metafoo.co.uk</a>> wrote:</div><div class=""><div dir="ltr" class=""><div class="gmail_extra"><div class="gmail_quote">On Tue, Dec 16, 2014 at 12:01 AM, Alexey Bataev <span dir="ltr" class=""><<a href="mailto:a.bataev@hotmail.com" target="_blank" class="">a.bataev@hotmail.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Author: abataev<br class="">
Date: Tue Dec 16 02:01:48 2014<br class="">
New Revision: 224329<br class="">
<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=224329&view=rev" target="_blank" class="">http://llvm.org/viewvc/llvm-project?rev=224329&view=rev</a><br class="">
Log:<br class="">
Renamed RefersToEnclosingLocal bitfield to RefersToCapturedVariable.<br class="">
Bitfield RefersToEnclosingLocal of Stmt::DeclRefExprBitfields renamed to RefersToCapturedVariable to reflect latest changes introduced in commit 224323. Also renamed method Expr::refersToEnclosingLocal() to Expr::refersToCapturedVariable() and comments for constant arguments.<br class="">
No functional changes.<br class=""></blockquote><div class=""><br class=""></div><div class="">This seems like a bad idea for me. It's incorrect: for a lambda, the flag means that the DeclRefExpr refers to an enclosing local, and does *not* imply that the variable is necessarily captured. This confusion has already led to a bug (fixed in <span style="font-size:13px" class="">r225060).</span></div></div></div></div></div></blockquote><div class=""><br class=""></div></span>If that’s actually a useful property to track, I have no complaint about tracking the two things separately.  I don’t think DRE is short of bits.</div></div></blockquote><div class=""><br class=""></div><div class="">The problem is that we can't reasonably track whether a DRE refers to a captured variable, because that is not a local property of the DRE; it depends on non-trivial properties of the context in which the DRE is used (and more generally it depends on how else that same variable is used elsewhere in the lambda, but we can largely ignore that).</div><div class=""><br class=""></div><div class="">I'd be fine having separate flags for 'refers to enclosing local' and 'refers to captured global' (if the latter is the point of this change), but we should not claim a DRE refers to a capture when it does not.</div></div></div></div>
</div></blockquote><br class=""></div><div>Richard, I understand that not all DREs are potentially evaluated and thus may not actually induce capturing, and I concede your point that the flag's name shouldn’t use the word “capture” if it’s set on unevaluated DREs.  The question is this: what information do we actually need to track on DREs?</div><div><br class=""></div><div>It is very useful for IR-gen to be able to immediately know whether a DRE refers to a captured local or global variable, no matter why that capture was performed.  As far as I’m aware, IR-gen does not care about whether the flag is set on unevaluated references to enclosing variables, because IR-gen should never see an unevaluated use in normal expression emission.</div><div><br class=""></div><div>I do not know if there is any reason to track whether a DRE refers to an enclosing local, independently of whether that enclosing local was captured.  If you think there is, then we will need a bit for it.  If it’s important to track that but *not* include captured globals, we will need separate bits; otherwise, since the difference only seems to exist on unevaluated DREs, and that doesn’t conflict with IR-gen’s needs, we can use the same bit.</div><div><br class=""></div><div>If we use the same bit, and the bit shouldn’t be set on unevaluated references, we will need to avoid using the word “capture", but we should also avoid using the word “local”.  Probably we should just invent our own bit of jargon.</div><div><br class=""></div><div>If you don’t actually care about tracking unevaluated references to enclosing locals in the AST, and are just making sure that the name isn’t actively misleading, then I suggest we name the bit “RefersToCapturedVariable" and simply say that it’s never set on unevaluated references.  I think it’s a reasonable gloss to say that unevaluated references always semantically refer to the original variable even if it’s otherwise captured.  We can handle PPE contexts by just setting the bit retroactively as part of the same walk that finds ODR uses.</div><div><br class=""></div><div class="">John.</div></body></html>