<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/55219>55219</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            clang-tidy: Potential leak of memory in lambda capture
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          igagis
      </td>
    </tr>
</table>

<pre>
    # to reproduce

create file `main.cpp` with contents:
```cpp
#include <memory>
#include <iostream>

int main(int argc, const char** argv){

        auto f = [c = std::make_shared<int>(10)](){
                        return *c + 3;
                };

        auto i = f();
        std::cout << "i = " << i << std::endl;

        return 0;
}
```
run `clang-tidy` with command:
```console
clang-tidy main.cpp -- -std=c++17
```

# expected result

no warnings generated

# actual result

```console
/home/ivan/prj/test/main.cpp:14:1: warning: Potential leak of memory pointed to by field '_M_pi' [clang-analyzer-cplusplus.NewDeleteLeaks]
}
^
/home/ivan/prj/test/main.cpp:6:16: note: Calling 'make_shared<int, int>'
        auto f = [c = std::make_shared<int>(10)](){
                      ^
/usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/shared_ptr.h:875:14: note: Calling 'allocate_shared<int, std::allocator<int>, int>'
      return std::allocate_shared<_Tp>(std::allocator<_Tp_nc>(),
             ^
/usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/shared_ptr.h:859:14: note: Calling constructor for 'shared_ptr<int>'
      return shared_ptr<_Tp>(_Sp_alloc_shared_tag<_Alloc>{__a},
             ^
/usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/shared_ptr.h:408:4: note: Calling constructor for '__shared_ptr<int, __gnu_cxx::_S_atomic>'
        : __shared_ptr<_Tp>(__tag, std::forward<_Args>(__args)...)
          ^
/usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/shared_ptr_base.h:1371:14: note: Calling constructor for '__shared_count<__gnu_cxx::_S_atomic>'
        : _M_ptr(), _M_refcount(_M_ptr, __tag, std::forward<_Args>(__args)...)
                    ^
/usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/shared_ptr_base.h:680:19: note: Calling '__allocate_guarded<std::allocator<std::_Sp_counted_ptr_inplace<int, std::allocator<int>, __gnu_cxx::_S_atomic>>>'
          auto __guard = std::__allocate_guarded(__a2);
                         ^
/usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/allocated_ptr.h:97:21: note: Calling 'allocator_traits::allocate'
      return { __a, std::allocator_traits<_Alloc>::allocate(__a, 1) };
                    ^
/usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/alloc_traits.h:460:16: note: Calling 'new_allocator::allocate'
      { return __a.allocate(__n); }
               ^
/usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/ext/new_allocator.h:105:2: note: Taking false branch
        if (__n > this->_M_max_size())
        ^
/usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/ext/new_allocator.h:109:2: note: Taking false branch
        if (alignof(_Tp) > __STDCPP_DEFAULT_NEW_ALIGNMENT__)
        ^
/usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/ext/new_allocator.h:115:27: note: Memory is allocated
        return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp)));
                                 ^
/usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/alloc_traits.h:460:16: note: Returned allocated memory
      { return __a.allocate(__n); }
               ^
/usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/allocated_ptr.h:97:21: note: Returned allocated memory
      return { __a, std::allocator_traits<_Alloc>::allocate(__a, 1) };
                    ^
/usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/shared_ptr_base.h:680:19: note: Returned allocated memory
          auto __guard = std::__allocate_guarded(__a2);
                         ^
/usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/shared_ptr_base.h:1371:14: note: Returning from constructor for '__shared_count<__gnu_cxx::_S_atomic>'
        : _M_ptr(), _M_refcount(_M_ptr, __tag, std::forward<_Args>(__args)...)
                    ^
/usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/shared_ptr.h:408:4: note: Returning from constructor for '__shared_ptr<int, __gnu_cxx::_S_atomic>'
        : __shared_ptr<_Tp>(__tag, std::forward<_Args>(__args)...)
          ^
/usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/shared_ptr.h:859:14: note: Returning from constructor for 'shared_ptr<int>'
      return shared_ptr<_Tp>(_Sp_alloc_shared_tag<_Alloc>{__a},
             ^
/usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/bits/shared_ptr.h:875:14: note: Returned allocated memory
      return std::allocate_shared<_Tp>(std::allocator<_Tp_nc>(),
             ^
/home/ivan/prj/test/main.cpp:6:16: note: Returned allocated memory
        auto f = [c = std::make_shared<int>(10)](){
                      ^
/home/ivan/prj/test/main.cpp:14:1: note: Potential leak of memory pointed to by field '_M_pi'
}
^
```

# version

```console
$ clang-tidy --version
LLVM (http://llvm.org/):
  LLVM version 11.0.1
  
  Optimized build.
  Default target: x86_64-pc-linux-gnu
  Host CPU: haswell
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztWVlz2zYQ_jXUC0YcHjof9CBLVtsZ2_U0TvuIAUmIQgIeA4A--uu7y0uUTDtSJnWcNhoKhHAsdr89sICCLHpaWJ5PTEYUz1UWFSG3nLXlLKsyVJwZTrZCcmJNnISJ1A7zHKrkQZgdCbPU8NRoy68nQE_14KiqxfNFGsoiAgr-KuFJpp4s_7KvU2TawILJvrssRWoIrmx5M6wyFYeWt8K1tSHhjinLA0JL7Li3vLk1vejOtpw5K0C-LaywJtb4Iiwr2kTItL9M2GdONVDhEbKQGlzdm7kOkhqvoXpIc149iptCpQTWBXreBfEt_3DIdN1p6TIiyvW3NeHOrJalMCsM4gEP0PaqCVBp2kRTaWfwNJLPl6t5dPY9wNShmqqfqkhRvaFkaTw0InrqKDhJWBr16BfQz2RtLPuJpDERMhySYcnfGrR1AY877V27NQTCH3MeGh6BKepCmm53mpEHplKRxprEPOUKrDI6ns9CUzDZM7ufacvb7LKEw0vcMzCuTa4-QWm4NvBqTd1fuiMs4NvwgNXbDA1fwHqSs88k25LKtEmegQ2BEKDp4Ak8h8sIdDel1zQX8C4tsISLpUw-_c3VMMxlofFr3_CHNZfc8CugqdH6jtQ2vjyT9wmyjgVJgWF8r5iUIAPy9Nz0wa0aD6i1RerPN_Qh0vvpylZo8OmNFAGUcQj2s3mcTehkNATOi8dhnBbQhNQ3tv28qCMK1GrLawYHAiKVt6kYpblR9g6Yn03HjZL7QIJaFoK5PQOqlb4ekamO7C_gWHvk8dQOcXqXV-D1kodemobVAITUW_VA-v2QHM9fRLKM1qoIQQ6yhS8As5_dAa4Xru7AFiD6IaclNjV41LAY-5fYhkOmF5Qy9J33hdLImWF5IkiUPoMJjItS4ImGj4-VidAPFAwkEWGf5-ICR1T2GJagdY0ZloUoV1riUsW6Gcaw7s1tFHh-jOb3gJIGTPMST9efuueYXYsFbLNodKuzwbwuYWw8EH8rvq2oAVZ1LyrpW4D7XmCezBxEef5CmKS0jWVxATKWwaw3hrWN6MAlavVSIs0lg_zz1Aj7mt6q51h79TZGKxYP97AeAUrdeN0srX_relPdNFzuA8p8CoXnvr5_ZYoaxUSVqu83nv6AC6GTYOzs1UFLpxNqj2jO6skuYEe6mfA7gK5mvwrFE-e1_CjlD7Rjeq_ghoDV2IHo9gESaWVApM3i3l5-_ohp4YE4Veh0MPXxuuLfsc8o_ZZJzUmgWBruDrkWkASWYoH7XBKzE3oIFYh6CXukWvzNm8B4FMm-q5jzrxSTSRGnGZ7VcMtEYwaZKf1wt17d3tL15Wb58eqO3lz-RZdXv_1yc315c0fpuxLdLTU87cp-XR1UhCZtLDnkt81SmREhDZk2dc4A5-wq9Sx9IcvxHAabKizbmAQcw9EGOpDVzxcj6DsNB3-UWMB5rsWqPuj9QO5_zs5xkrz_7W3i1OznJKjw8-MnHSfn3RUmZWhVWfIz_f6XDoxnwPzz3Pgc0b6Lii9D-j-9r-i7Hztnl3i7y66vvRI9MZC_6RXouVfTjSxfey_94k3zS7f191xpkaWn3LOPSOcPguHwYObV1Z_XmGnvjEGBQDy0bHmf2JmKy1_oqg1q5eh6PnFd27Hdpqt5_54bkUAKGpGgEDKym_Y137JCGmIgJHGDUNU-k4cdt6kH_5ppQ1a3H3HYjukHLuWRiINo4Udzf84GRhjJF53_Tl7TgkiJZEkQMRKyHKyODwolFyi8bqWPhdkVgR1mSQ1F_RrmKvvEQzQBoXXB0VfHY8-dD3YLHowCl408z3eY74xG3A_cMZ_6fuTPR2w2G0gWcKkXYLiW50HCTkoSUAfjHIiF53ieM3bc6m1PoslsPJtEbBLN-HbkWCOHg9lJu9HMQC1KloIC4vvIkUJDDt12Mq3h3MR5uRzQB8_ZZWohYhYLPShXXpSc_wPqURdU">