<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/58421>58421</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
CLang OpenMP: error capturing by reference variable of double nested lambdas
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
polkovnikov
</td>
</tr>
</table>
<pre>
Following code doesn't compile in CLang:
```cpp
#include <vector>
int main() {
std::vector<int> a(10);
auto F = [&](auto f){
#pragma omp parallel for
for (int i = 0; i < 10; ++i)
[&, i]{
auto x = a[0];
}();
};
F([&](auto i){ return i + 1; });
}
```
with error: `error: reference to local variable 'a' declared in enclosing function 'main'`
See example [inside GodBolt](https://godbolt.org/z/4xa6sT54K).
But it compiles in GCC.
Code starts to compile in CLang after 3 types of modifications:
1) Either change `auto F = [&](auto f){` to `auto F = [&a](auto f){`, i.e. do explicit capture of `&a`.
2) Or remove argument of F, i.e. change `auto F = [&](auto f){` to `auto F = [&]{`, here `(auto f)` removed (also call F just as `F();`).
3) Or remove `#pragma omp parallel for`, i.e. remove OpenMP completely.
All 1)-3) types of modifications lead to compilable code. Of course only 1) is acceptable solution.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJytVNtu2zAM_Rr7RWjgS2wnD35okmYP29AB2w_IEp2oUyxDkrNmXz9STlo76IA9zMhFl0PykDx0Y-Sl3hutzS_VHZgwEpg04LooqzxuT73SwFTHtl94d4jyxyjZRcntt0zGj-j760mWq07oAb1E-fYMwhsb5U9TI9V5duIKA6yibM2iajOeM3yclxQif7xZbhGN9owjOk0QH-UTOB-8YXuMtGNRsYmyMip2CAzHLYGnvulBer3lhxNnmBjrueVag2Ythprh8ACxK6KqgvsE44bllqVhHWUYb6MoyMwyRBm5ZFumiNA9idsTaL4G9xxNEsLmH2CjajfWanZLp9P9njD3RVBjEZgFP9iOEsg2LA38yem7R9rOWzpt2S_ljwyspY48Mrx8W1towUIngGE0bQTX7Myt4g2KBhWEbauYBKG5BUkqQqg2jpTWDp3wynQEG-VQ3UX9DsDglZ968lVsVOcUyuqTkRuj_Zjk0fvekWIyTH9_MLLBq4WxB9z9xu_ylZfuR7H8jLkupr43A3b2Td-OqH3abmeQLY2C89x6R8ndjwLjrQfLcuYvPTowLTsZqVolOGXl7iYlJak_YRnRRBzRHKiM_6LfMqHoH4H5h-gguwUscIqxer1WgvLkPQoAiGWAoG2ZzLLNiOCzxYaezBkYt4fhBCh_tNi_ufxfzK9TMZLFksDIamKOtiMTSXPItcMG4Kyil5fBecYdWezfx4LM5x3O5wkFxF-Hf1K2K_65h-7rt9B1DR70Zeb8EalQSx9ClI8VwDRw-a6cMBL0el2w5xYXg3XYj05fgiOmHONCQO8Dzhk9kJNr0BjqtCzLJM_yfBXLOpfrfM1jr7yGelTjyJdGMszmteM0aM1lMqVvw4lspRlo1YHzWGbNT43kLh6sru_GCmU7NAtMAzdan29_D701L_iexq1ybgCHi2K1zNL4iAyFkOtlJdN0BRKWBYhUVGuZNaLlhWxjrAdoV5Meil2s6izJsjRJq3S1LPLVohRJ06zbpFon5aoSbbRMAN8SekGBacBjWwcOzXBweKmV8-79kjunDh3AzT8K62hs3Rv905w7hT9xoFwHvn8A5iIDZw">