<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/64811>64811</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
`inline` variable initializers inconsistently put closure types into block scopes
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Eisenwave
</td>
</tr>
</table>
<pre>
```cpp
inline decltype([]{}) x = {};
inline auto y = decltype([]{}){};
inline auto z = []{};
[[gnu::used]] void foo(decltype(x)) {}
[[gnu::used]] void bar(decltype(y)) {}
[[gnu::used]] void baz(decltype(z)) {}
```
This produces (with demangled identifiers) (https://godbolt.org/z/Kj8hq4K9M):
```asm
foo($_0):
ret
bar($_1):
ret
baz(z::{lambda()#1}):
ret
```
For some reason, the closure type corresponding to the lambda expression which initializes `z` is scoped to `z`, instead of being in global scope like the other closure types.
This makes no sense because inline variable initializers don't introduces a block scope in the first place (see [[basic.scope.block] p1](https://eel.is/c++draft/basic.scope.block#1)
> The closure type is declared in the smallest block scope, class scope, or namespace scope that contains the corresponding [lambda-
\- [[expr.lambda.closure] p2](https://eel.is/c++draft/expr.prim.lambda.closure#2)
According to this paragraph, the closure type should be scoped just like that of `x` and `y`, in global scope.
It's possible that this mistake is the result of misinterpreting [[basic.def.odr] p14.4](https://eel.is/c++draft/basic.def.odr#14.4), which is not defining behavior, and merely requiring it.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVVFvozgQ_jXOi1UEJgnwkIdmu5FOq3vb95OxhzCtsVmPaZv8-pMN2SbZ3un2qooC_eabmW--MZIIjxZgxzZ7tnlaySn0zu--IoF9k6-wap0-7dg2n3_VOLL8ieWPaA1a4BqUCacRmKhnAlbtWfXERMPfOSuf-PJc7m_C5BQcPyXAPzP8S-h55r7GX2DLNf5rf7QTKx9Z-TgR6AjdPPFXh5p3zjFRX6V-j_lEcyn3v3C00t9ynP4Px_mW4_wZx0X8-fF7j8RH7_SkgDgT9RuGnmsYpD0a0Bw12IAdgqfEJOo-hJFiAeLAxOHodOtMyJw_MnE4M3H49lz3P9bfmj9j8vLxLqukYX4zi8bE-q_8Gsg9hPluViQCihvA8nOFO6dWkySs2hs5tFqm0IaJsljG_2uCOyUOznNyA3APkpxl4gsPPXBlHE0eeJSUK-c90OisRnvkwSXEnJDD--iBCJ3lbz2qnqPFgNLgOQq7zc9sm3MkTsqNoGPw8jJmQksBpOau4y1EbrT8aFwrzYznBl8gZXOhB39TFWXXXk0DHeQLELeOE1gC3oKSEwFfTP8qPcrWwFWFnriOPVeBow0XO0jeGqdelhLQpgI69BT4aKSCaAcCmFdn30pClSVsluKiMcciOvTeNQAmQ2LioJjYM7HXXnaBicOvFHGAolkaLL_y7_cjQUpLL30061whDdIYoHBdfRRZGUn08eg8t3IAGmMnc4uhl4ErZ4NES_P4bybONou9Hm6Phy8PiwbRBNkMyZYykwrid1RIJKPH4Z5JlOJDjHR9VMr5DzPGXZZeHr0c-08NTL2bjOYtXGz4PFG4mEuG6D-2zd-jVaXV8f7006E3hrzx3B-BiYr46Igw-ipRpWoGpCBf0pRiLR5oMinLgIQ2gB89hEXZnxbS0GVO-9k-62z9-w66MIgyxceD4MtlK-NeBK6hQxsTt9DLV3Q-ImLLA3gwJ-7hx4Q-bWLI-ErvSt2UjVzBrtg2oqxqUa9X_a6rhVRVXlRFu6naXKky74q6KKuulJtWdyvciVyUeV3URZWv12W2LivRqLLLoWoAoGHrHAaJJjPmdYjH6AqJJtht13VRrIxswdDlc-p3EfTQTkdi69wgBfoICxgMxG_rvOVxhJ8vOlrlLCEFsMGc-DiF2-MkngDuendoNXmzuzv3MfRTmyk3MHGINSx_HkbvnkHFUaQ-4ohSK38HAAD___mHgz4">