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

    <tr>
        <th>Summary</th>
        <td>
            [clang-static-analyzer] False positive core.NullDefererence when capturing a structured binding in a lambda
        </td>
    </tr>

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

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

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

<pre>
    Reproducible example:
```cpp
struct S { int x; };

void f(int x) { (void)x; }

int main()
{
    S s{42};
    auto& [x] = s;
    auto g = [x](){ f(x); };
 g();
}
```
This is perfectly valid C++20 code AFAIK, and compiles with both gcc (13) and clang (18.1).

The static analyzer, however, gets upset:
```
$ clang++ --version
clang version 18.1.5
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/lib/llvm/18/bin
Configuration file: /etc/clang/x86_64-pc-linux-gnu-clang++.cfg
$ clang++ --analyze --analyzer-output text bindings.cpp 
bindings.cpp:9:23: warning: Dereference of undefined pointer value [core.NullDereference]
    9 | auto g = [x](){ f(x); };
      | ^
bindings.cpp:10:5: note: Calling 'operator()'
   10 |     g();
 |     ^~~
bindings.cpp:9:23: note: Dereference of undefined pointer value
    9 |     auto g = [x](){ f(x); };
      | ^
1 warning generated.
```
But `x` in that context is neither a pointer nor undefined, as it's being captured by value into the lambda.

Godbolt to reproduce: https://godbolt.org/z/3zha6nv5f

Perhaps noteworthy:
- The same warning is emitted if `x` is captured by reference, i.e. `[&x]`
- The same warning is emitted if default by-value `[=]` or by-reference `[&]` capture is used
- However, if `x` is captured explicitly using an initializer (`[x = x]` or `[&x = x]`) the warning is not emitted
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVt2umzgQfhrnZhQEJkC4yEVyUnarlVarbe9XBgaYlWMj2-Qk56LPvrIhPz1t1VWjCIHn75vPM2MLa6lXiDuWHVh2XInJDdrsGjE6Qaoxk2sGtKtat9fd3zga3U4N1RIBL-I0SmTpnsVHFu9ZHs__ZhznFevM1Dj4BKw4ACkHF5YegBVHlh4Wm_A8a2qhY3w76_AyGDC-9QLGy7vZk41XPQlSjG8ZLxdJsbgFAPgElhWHDX8O59fF5DTjObDscGHZEVh6BPuNBvRBsCgtQYpDQOkRvk8E-kXnntkd7o2W-fPzQBbIwoimw8bJK5yFpBZeGD8wfuAxNLpF2Ff7j38w_gJCtdDo00gSLbySG6DWboC-aTxBSerZCjpSqD4sbaOE8TJ6JuvzgGCdcNSAUEJe39B434N-xfP82qOzMI0W3bf7uXzyzRxkBgrr9RmNJa1m8Rx_WQIPIsqW4ML0wS1ctvk_-WY9NmtJarqsezXd8BkULZx0i9IrjtrSZRZ9VNYJKbE9kvEixqvJGsYrSbV_yvOJ8SrZMl7VtGB50aqjfjLCeSwdhSL1lugaxqsli-o7cNZPGUZN1_8o9YXFx5tZ68mNkwOHFwc1qZZUb6NmHGH28bzE0n3J0j1PPaxXYRSp3r8e0WCHBlWDoDuYVIsdKWxh1KQcGl8qE_qibLTB6M9JyicTX6f3GvYt9PJrlRx-3pplH76LPYlZus88YKVdoPZFSEmh_Ao9ohFOmyUQL-5ekzh49b_3zXIXsOzDly8_IewW9P-x9Z6SX27wb2lJbnsHPSqfNbbRd1vnMDlgeXxheQykwA3CQaNVKBWyoJDcgAbEHbnS5pFPmAIWyDFeWKjRB_TTeTLYQn1dioKU0-AGBClOdSu-av_fdFtr6cBpMMsEDwwOzo3W9zuvGK_6WSvSxjfHG-NV-jaIXJ2z7tnZX2gGMdqwDa_auOF6nxhrCINGnPDODFnAEzmHLVD3IMF-lcGjhPkLUISRV_THEc_D5tx4_Kn_FjsxSQf1db20yuwnPc5uQBsve9TNPc4iX1B5t5PF9hb298eg_EEWeBklNeTn-WQ9MKGAFDkSkt7Q-ME8x7qEsrs88DxSfZb4se538ylPpd0t11W7S9syLcUKd0mRZGm5LYt4NezarG0xLTkmItvGdZnkQpR5ncdZkWJT5Cva8Zhv4ixJ4nTDszgqurzIUpFsszrlRdywTYwnQTLyk9XXwoqsnXBXJts0W0lRo7ThqsC5wlcIQsa5vzmYnbdZ11Nv2SaWZJ19eHHkZLhjhEG6nk-j-_T0B3ElpMUw-h2dEZ5GnN-teb9eB1QL6YFkmK8YcyHNA8N3mFi6YDUZuXtX5eSGqY4afXqcHgH2aPS_2DjGq5CTZbwKOf8XAAD__7t9tVM">