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

    <tr>
        <th>Summary</th>
        <td>
            `cppcoreguidelines-missing-std-forward` should consider expressions in lambda captures.
        </td>
    </tr>

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

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

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

<pre>
    The following code triggers a false positive in Clang-Tidy 17 and many versions prior:

```cpp
#include <utility>

template<typename F>
auto MakeFunc(F&& func) {
 return [func2 = std::forward<F>(func)]() {
        func2();
 };
}
```

```
[warning: forwarding reference parameter 'func' is never forwarded inside the function body [cppcoreguidelines-missing-std-forward]
```

However, this is a false positive because the `func` variable is captured by an expression in which `std::forward` is indeed called on it. It's pretty easy to test that `std::forward` is being called too:

```cpp
#include<utility>
template<typename F>auto MakeFunc(F&&func){
    return[func=std::forward<F>(func)]{
 func();
    };
}
#include<iostream>
struct foo{
 foo(){std::cout<<"default construction\n";}
    foo(const foo&){std::cout<<"copy construction\n";}
 foo(foo&&){std::cout<<"move construction\n";}
    foo&operator=(const foo&){std::cout<<"copy assignment\n";return*this;}
 foo&operator=(foo&&){std::cout<<"move assignment\n";return*this;}
 void operator()()const&{std::cout<<"lvalue\n";}
    void operator()()const&&{std::cout<<"rvalue\n";}
};
int main(){
 MakeFunc(foo())();
    foo f;
 MakeFunc(f)();
}
```

Prints:
```
default construction
move construction
lvalue
default construction
copy construction
lvalue
```

`cppcoreguidelines-missing-std-forward` should consider expressions in lambda captures.

Godbolt's for the above snippets:
https://godbolt.org/z/9sh3szr7c
https://godbolt.org/z/sYxhsss14

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0Vk-T4rYT_TTi0gVlZGzDgcMM_Pglh1TtYQ_JUZbathJZckltWPbTp2QbhlkWduaQKYqx_rzXr9VPbUQIuraIW5a9smw_Ez01zm_3f35xJ_Sz0qnz9muDUDlj3EnbGqRTCOR1XaMPIKASJiB0LmjSRwRtYWeEredftTrDsgBhFbTCnuGIPmhnA3ReO8_SF5bsWXL5zpPxI7tumuGpttL0CoGlu5600XRm6f9uUYRtZwQhS3d07tCKFuFw3SN6cvCH-AcPvZWMrw-M54znUA3DDbDiddwIHqn3Flj2Gtc4sHQPgVTUmL5Uzp-EVyzdDdR8PeFZtmd8_Z5o-htYxkWWXtZYsb8O4vP7vH96GNMwez0Jb7WtWfoCk5xYCo8VerQSoRNetEjogfFi1FeADmDxiP4CQQXaBh3LFyvaW0naWYg1jqnLrpPOY91rhUZbDPNWh6BtPQ-k5pdTyJ4J_82dYkDGd0CNDlHBnUFKlKIPowaWJ4PYPIGj8FqUBiNGio56jwrKMwgL-K3zGKJ3ortOjZZNRN4VKE8iWFuFqEAKY1BBxNACfifGi-g8JDoDinAGckAYCKgR9ISuxMH0Ixs59wnf_sS2jwz7wKoXp936a_TqZFWW7j_k0yvBOPfemAAPvHmbiXaBPIr2mkog30uCyrkbducm8uL1qku6nli6ix_OFVaiNwTS2ZFAO8uynWWcRwGX0MMlGsiGjeNz_oxYuu78S9aR8kL2lK91R_ywytx16AXFrrb_rOaxA7do6S3CVGP-Em_RfQY_hPt4Pp-LdXRawTXUWNfhe8gvxnsUzByF6fHBif2a9gmzf8R862BtCVqh7dWLU_CbC_bm1Ev0d_ehcg6qt5lb4D3geTP_4rWl8NY23u_56X0YVu4NOExPR_sL8P1tuAM_evN87DWQJxAa1xs1RNEK_U2bjk0YjGhLJS69PCxuw_zfqdKZsSdXzg_vAlHGhIPVXYc359UQdcOIHxg_1CNw4XzN-OE744dNaNLw3RfyY9vDX9-aEMJyNW6fqW2qNulGzHC7LBK-ydbLdTFrtqVIxXojcr4qkiWKTKoywWSdF2JZJkJWM73lCU-XfLlJ0iznxWKVcrUpVqooV8s8X0m2SrAV2iyMObZRwUyH0OO2yNab5cyIEk0YfnVxbvEEw2L0dLaf-W3EzMu-DmyVGB0ovLGQJoPb_7BQs96b7Q_nqKnpy4V0LeOHqGT6N--8-xslMX4Y9AfGD0N-_wYAAP__rYQdCw">