Skip to content
  • Faisal Vali's avatar
    [Cxx1z] Implement Lambda Capture of *this by Value as [=,*this] (P0018R3) · 60783472
    Faisal Vali authored
    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!   
    
    
    git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@263921 91177308-0d34-0410-b5e6-96231b3b80d8
    60783472