<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/70605>70605</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Enum not in scope inside its (fixed underlying) enum type specifier
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
alexshpilkin
</td>
</tr>
</table>
<pre>
Quoth C23 draft [N3096](https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3096.pdf) in 6.2.1p7 (I haven’t seen the more recent but paywalled N3149):
> Structure, union, and enumeration tags have scope that begins just after the appearance of the tag in a type specifier that declares the tag.
In [Clang trunk](https://godbolt.org/z/evfchebb6) with `-std=c23` as well as Clang 16.0.6 with `-std=c2x`, on the other hand, I can refer to the enclosing scope’s definition of the tag being declared inside the *enum-type-specifier*, even though I wouldn’t have been able to do that later inside the *enumerator-list*:
```c
struct foo { int x; };
void bar(void) { enum foo : typeof(((struct foo *)0)->x); }
// void baz(void) { enum foo { A = sizeof(((struct foo *)0)->x) }; }
// ^^^ error: use of 'foo' with tag type that does not match previous declaration
```
So this looks to be wrong as far as C23 is concerned. Replacing `typeof` by `decltype`, I also see this being accepted in C++ mode with `-std=c++11`, `c++14`, `c++17` and `c++20`. I don’t know if that’s correct for C++, but I would be surprised if so, because it’s certainly inconsistent with how the typical instance of the CRTP works.
See also https://github.com/llvm/llvm-project/issues/57836 re this feature in C generally.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVd2OozgTfRrnptQITALhIhedTkfKzej7ZvYFjF2Apx0b2SZ05ulXZejZzPSutFoJBSgq9XPOqbIIQfcW8cB2R7Y7bcQUB-cPwuB7GEZt3rTdtE7dD_-fXBzghZegvOgisN3xS5k3FdudGN8PMY6Blc-Mnxk_z_OcuRHtU4gqc75n_Pw9yoLxc5Cck0NfbBc_xs_KycD42VK0bFQd4w1oC1XGs2KsgfH9BQZxQ8teOdvnrGkiBEQLcUC4Oo_gUaKN0E4RRnGfhTGo4EtZbBvGG6oqP7H847d8hW_RTzJOHhl_gclqZ-lBWAVopyt6EbWzEEUfUmII0o0IcRARWuy1DfB9ChFEF9GnKsQ4ovDCSgTXJUsUPTUhIN5HhDCi1J1O3iKCQmmEx_DhmT0WeLGE7YsRtofoJ_v2dwj3TrXOxBXcH4yf8dbJAdu2IvhmHQdgVU4EsPIkecmqHESAGY2h-xK-qLI8qz57v7MqJ0TcgrGLA3oYhFVkvIAUFjx21I1LDmilcUHbfkHqJ08BFHba6gTnAzAtku-KggJtg1aYvjL-TBQ8EWpPP1Fj_Jky4y2R7qZ-gAvMbjLqUROJqpaEIVqDVJtyC95GEFGf0xDTzj8ZHSKl-E0oVb5ccnkPSTTQOQesPoK2Ed5ZeQRWn1h5XHxuTitohWd8T49EBflSruWP5XMShOsY3y_XY1hqs8kZb55Y-fqetLvEXwpKzMOa48c_5qiP8AysPEHQP_51prWNT9nY7nW5AL13nhqYQlI543XnHOP1oh_iNWl9UbjDANZFuIooBxg93rSbwsp5mq_fUH6E_hvxpgMY594CEdkizN7ZnqTbCZ8UzEvQAaSzEr1FlcFXHI2QpCxW5SvKVQ7tnd4pMdlWZV9AmOBojSyZFkUKKXGMSZHwwviR8SNcncJPE7J8K4o1WhLJYtp-NtVp9qx6sHHqOIMLKPeo4DfrZtBdgvBhiKTzHhNz_qMsSkHrbh0DAihMfvQ6UPUdBJc8UApiS_8SDX0U2po7aCudDTpEWp6pxcHNy5DeRy2FoZGJj1vt5esf_4PZ-bfwy8r6hrjg-duS0nGY2ky6K-NnY24ft6fRu-8oI-NnHcKEtP139b6swK90dChoPSceoEeLXhhzzzbqUKqmbMQGD0XV7Kui3uV8Mxxqtd3ty7JriwYrVeR7KbdtWddNsW_Lcss3-sBzXhY5bzgvii3PVK54y6tmm2_5vlQ52-Z4FdpkVCCt1U0q7VDnVb7bGNGiCemM5NziDOkj45yOTH9ITbVTH9g2p2US_ooSdTR4eKXhpHHQdj1M1mWkY6ADrtPvqGCyCr25a9vTQKaB_vX02EzeHP47xqmXPwMAAP__Abx38w">