forked from OSchip/llvm-project
dc6b596ebb
Implement lambda capture of *this by copy. For e.g.: struct A { int d = 10; auto foo() { return [*this] (auto a) mutable { d+=a; return d; }; } }; auto L = A{}.foo(); // A{}'s lifetime is gone. // Below is still ok, because *this was captured by value. assert(L(10) == 20); assert(L(100) == 120); If the capture was implicit, or [this] (i.e. *this was captured by reference), this code would be otherwise undefined. Implementation Strategy: - amend the parser to accept *this in the lambda introducer - add a new king of capture LCK_StarThis - teach Sema::CheckCXXThisCapture to handle by copy captures of the enclosing object (i.e. *this) - when CheckCXXThisCapture does capture by copy, the corresponding initializer expression for the closure's data member direct-initializes it thus making a copy of '*this'. - in codegen, when assigning to CXXThisValue, if *this was captured by copy, make sure it points to the corresponding field member, and not, unlike when captured by reference, what the field member points to. - mark feature as implemented in svn Much gratitude to Richard Smith for his carefully illuminating reviews! llvm-svn: 263921 |
||
---|---|---|
.. | ||
analyzer | ||
demo | ||
OpenProjects.html | ||
UniversalDriver.html | ||
builtins.py | ||
carbon-compile.png | ||
clang_video-05-25-2007.html | ||
clang_video-07-25-2007.html | ||
comparison.html | ||
compatibility.html | ||
content.css | ||
cxx_compatibility.html | ||
cxx_dr_status.html | ||
cxx_status.html | ||
diagnostics.html | ||
favicon.ico | ||
feature-compile1.png | ||
feature-compile2.png | ||
feature-memory1.png | ||
features.html | ||
get_involved.html | ||
get_started.html | ||
hacking.html | ||
index.html | ||
libstdc++4.4-clang0x.patch | ||
libstdc++4.6-clang11.patch | ||
libstdc++4.7-clang11.patch | ||
make_cxx_dr_status | ||
menu.css | ||
menu.html.incl | ||
related.html | ||
robots.txt |