[cfe-dev] Incorrect result from DeclRefExpr::refersToEnclosingVariableCapture?
James Dennett via cfe-dev
cfe-dev at lists.llvm.org
Wed Oct 21 16:08:22 PDT 2015
On Wed, Oct 21, 2015 at 11:14 AM, Tim Prince via cfe-dev <
cfe-dev at lists.llvm.org> wrote:
> Hi everyone,
>
> We've been working on upgrading our frontend from clang 3.4 to 3.7 and
> have run
> into an issue where 'DeclRefExpr::refersToEnclosingVariableOrCapture'
> seems to be
> returning the incorrect result. Here's a test case:
>
> int fn1() {
> const int i = 0;
> return [] { return i; }();
> }
>
> Calling 'refersToEnclosingVariableOrCapture' on the 'DeclRefExpr' for 'i'
> within
> the lambda body yields false. In clang 3.4, the equivalent
> 'refersToCapturedVariable'
> method yields true. It looks this behavior was probably introduced by
> r224323,
> which changed 'Sema::BuildDeclRefExpr' to determine this via
> 'tryCaptureVariable'.
>
>
That's an interesting case. `i` is a compile-time constant expression
there, so there's
no ODR-use of the variable, hence it's not captured. I don't know what
that should
imply for refersToEnclosingVariableOrCapture; the specification is a touch
vague.
So with that background, I have a few questions:
>
> - Is this code even valid? It seems like it shouldn't be since there's no
> capture-default or capture-list, but both clang and GCC accept it.
>
I believe it is, as only the value of the constant expression is used.
> - Assuming the code is valid, is this a bug in clang?
>
I don't know.
> - If not, is there some other way to detect when a DeclRefExpr in a lambda
> body
> refers to a declaration from the enclosing scope?
>
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.
-- James
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20151021/b3efa361/attachment.html>
More information about the cfe-dev
mailing list