I should have been clearer in my initial post regarding what doesn't 
currently work in clang.

  clang croaks on the following:
    void test() {
      const int x = 10;
      auto L = [&j = x](int i) { };
    }

  We get the following error:
    - error: variable 'x' cannot be implicitly captured in a lambda with no 
capture-default specified

  The reason is that the init-capture's init-expr doesn't actually get analyzed 
for any lvalue-to-rvalue conversions during the initial parsing and creation of 
declrefexprs.  All declrefexprs of variables that do not involve constants, get 
appropriately tagged for odr-use and capture.  But for constants that might not 
be odr-used, this ends up happening later once the lambda's call operator has 
been pushed on the declcontext stack, and so 'x' is attempted to be captured by 
the lambda, which seems wrong.

  So the patch attempts to move up the creation of the init-var and analysis of 
the init-expr.

  Thanks!

http://llvm-reviews.chandlerc.com/D2092
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to