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

    <tr>
        <th>Summary</th>
        <td>
            [clang][c23] Compatibility of structs containing unnamed structs
        </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 issue is somehow similar to #150594, but this time with unnamed record types:
```cpp
struct ContainsUnnamed {
  struct {
    int i;
  } x;
};
struct ContainsUnnamed cu;
int main() {
  extern struct ContainsUnnamed y;
  struct ContainsUnnamed {
    struct {
      int i;
 } x;
  };
  extern struct ContainsUnnamed y;
  return __builtin_types_compatible_p(struct ContainsUnnamed, typeof(cu));
}
```
https://godbolt.org/z/Yh97EPr59

Again, Clang accepts while GCC rejects. Replacing `struct` with `union` gives the same result.

I think the wording suggests that the code should be rejected because it is stated in 6.2.7 that tag types can be compatible if they are declared with the same tag:
> Moreover, two complete structure, union, or enumerated types declared with the same tag are compatible if ...

but in my example the tag is absent. Moreover, Clang already treats top-level unnamed types as incompatible.

CC @AaronBallman
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyMVEGPqzYQ_jXOZbTImBCWA4c88lL1UKmq2kNPkTETcJ-xkT1ONv31lYHdfVu9VSuhxGb4Zr755rNlCHqwiA0rv7DytJORRuebzpkwym_u9iR3nesfze8jgg4hpl8IbsLR3SHoSRvpgRwwUeQlL-s9Ey10kYBGHYD0hHDXNEK0Vk7Yg0flfA_0mDGw4sj4kR34-qh5ZvwYyEdF0DpLUtvwx4Zj1RfGjwBb-HULoC2BZsW6ZdUJXtYNq07r4pOEKq7hhJ-ktkw8M1G_JcYXQm_hE_DjteB_sP0B34-MvyO8sH9d_s_yHil6C5dLF7UhbS-LrhflplmS7gxeZiaef5wlDSp97q5MPKvIRJ2eN-2-Gwzjx5FoXuYlzkycB9d3zlDm_MDE-W8mzn-OdfX1V1_WCcePx2FRtIXWSDuAVApnCnAftUH4qW3B41-oKGTwG85GKm0HYAe-EmUHvnqGHXi02tn0YtA3DEAjQpATgscQDWVrtZ-T2ey3JXp3vk_ZQhwGDJQgkpaIcj1CGF00PXS4McC0VjIGBE2LtUmml9rCIRNZtcHlsDoWlLQJ_C4w6GvK_gDpEXpURnrsV_pvZEkOm9WLr_CL8-hu6Bf5725JZZBwm3X0mCJr36IF5wFtnNAvtFYSn5dZWHwkl2WbSulQagvTA_BFppoLMoF0ANkFtJR9YLfNzniU_QPIo0xyuvnJ4A3N24leOckA2r5X3mq2LbA9P0rv7BdpzCTtrm-Kvi5qucMmr8qi5nUh-G5sSnnAXhR5XxT7uu5EV_Viz8tr_VwfRFHlO90ILkpeFVzkPC-fs32dV3l5VblAJbuqZ3uOk9QmM-Y2JW_ulgurycu8qPc7Izs0YbnnhFCpNyZEuvJ8kwBPXRwC23OjA4X3FKTJLJfjiihPaSkKVp6g3brVRtMD3HWbYAC1HrRkw1eRttAuetP86yxpGmOXKTcxcU5lt7-n2bvkUCbOSxuBifPWya0R_wQAAP__b4Td_w">