<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Oct 21, 2015 at 11:14 AM, Tim Prince via cfe-dev <span dir="ltr"><<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>></span> wrote:<br><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">Hi everyone,<br>
<br>
We've been working on upgrading our frontend from clang 3.4 to 3.7 and have run<br>
into an issue where 'DeclRefExpr::refersToEnclosingVariableOrCapture' seems to be<br>
returning the incorrect result. Here's a test case:<br>
<br>
  int fn1() {<br>
    const int i = 0;<br>
    return [] { return i; }();<br>
  }<br>
<br>
Calling 'refersToEnclosingVariableOrCapture' on the 'DeclRefExpr' for 'i' within<br>
the lambda body yields false. In clang 3.4, the equivalent 'refersToCapturedVariable'<br>
method yields true. It looks this behavior was probably introduced by r224323,<br>
which changed 'Sema::BuildDeclRefExpr' to determine this via 'tryCaptureVariable'.<br>
<br></blockquote><div><br></div><div>That's an interesting case.  `i` is a compile-time constant expression there, so there's</div><div>no ODR-use of the variable, hence it's not captured.  I don't know what that should</div><div>imply for refersToEnclosingVariableOrCapture; the specification is a touch vague.</div><div><br></div><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">
So with that background, I have a few questions:<br>
<br>
- Is this code even valid? It seems like it shouldn't be since there's no<br>
  capture-default or capture-list, but both clang and GCC accept it.<br></blockquote><div><br></div><div>I believe it is, as only the value of the constant expression is used.</div><div> </div><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">
- Assuming the code is valid, is this a bug in clang?<br></blockquote><div><br></div><div>I don't know.</div><div> </div><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">
- If not, is there some other way to detect when a DeclRefExpr in a lambda body<br>
  refers to a declaration from the enclosing scope?<br></blockquote><div><br></div><div>One way is to keep track of the enclosing lambdas, and while that's something I do in code right now (out of tree) I'd prefer to get rid of that.</div><div><br></div><div>-- James</div><div> </div></div></div></div>