<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/150594>150594</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang] Enums differing in underlying type are compatible
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
bolshakov-a
</td>
</tr>
</table>
<pre>
The following code is accepted by clang but rejected by GCC (C23 mode):
```cpp
enum E : int {A, B, C};
enum E e;
int main() {
extern enum E Fn();
enum E {A, B, C};
extern enum E Fn();
return __builtin_types_compatible_p(enum E, typeof(e));
}
```
https://godbolt.org/z/Eab5nz3q9
Compiled by clang, it returns 1, whereas if compiled by GCC (provided that the second `Fn()` declaration is removed) it returns 0.
I think GCC behavior is correct because 6.2.7 "Compatible type and composite type" states:
> For two enumerations, ... if one has a fixed underlying type, then the other shall have a compatible fixed underlying type.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyEVMGOozgQ_RpzKTUyRQjhwIGmm9Xe9x4ZXATvGJu1TXp6vn5lYDJRa1cjRUGU61XVe6-M8F7dDFHNildWvCViDZN1dW-1n8Q3e38RSW_lZ_3XRDBare2HMjcYrCRQHsQw0BJIQv8JgxbmBv0awNHfNBzRP9oWGF5azGG2khhWLG8Yb9iZ779hWRhvyKwzvAPLG1AmACtfG4YtvMa_lpVvLH-NoEciPQIxfRbKMLwwrCKS8QboeyBn4MjujtMdBD_D_9MFfoN2FFZn4HrtV6WDMtfwuZC_DnZeRFC9puvC8LKDY-V4bMcYikV-1ontnmRgvJlCWHxUBzuG3c3K3uqQWndj2P1g2L2LvjA_8n8qxpvWzovST8LHRiocs3nI4vvHRI6EBzXC8JR_WLI4e1eSJIRJBAgTgafBGgnszB-UzxwkDVo4EZQ10XJHs72TjFo_9ePp7safECZlvm09eprEXVkXUYN1joYAPQ1i9QTnFNMSGGL7UG3TCYSR27DWq7CHGCL4IAL5Y3Pyd4DOOggfdrOI9uF8pJymaaRrDcEkPAgY1XeSsBpJTn_G1d1LtpGw2VjbMJEDPwmtYRJ3AgG_rPxvfCSbyDqXVV6JhOqsLPJTXnBeJVN9qS6YyeyCWVYiH8ehKKk4lxJRnAuZl4mqkWPBSyx4lZ1PVYpZUVa84pzo1J_OyE6cZqF0qvV9jguQKO9XqrOCF9Up0aIn7bcLi3iYj_HuujoCXvr15tmJa-WD_1UiqKC3W74jijd4N-vsQapxJBeZKfOVJwhHT2Ikq9P1ly1VYVr7dLAzwy72Oh4vi7PxI8Cw22b3DLtj_HuN_wYAAP__E1ZmIQ">