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

    <tr>
        <th>Summary</th>
        <td>
            __alignof(_BitInt(64)) evaluates to 4 when targeting IA-32, whereas GCC evaluates it as 8
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          pascal-cuoq
      </td>
    </tr>
</table>

<pre>
    While investigating the implementation of the _BitInt construct in Clang and GCC together with @MisterDA, we found some differences between Clang and GCC. Some of the differences are redundant with https://github.com/llvm/llvm-project/issues/47017 or with https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61447 but at least the value of `__alignof(_BitInt(64))`, 4 in Clang and 8 in GCC, seems to me to be a previously-undocumented difference between the compilers, that does not even rely on the compiler extension of allowing lvalues in alignof constructs, although it does rely on the compiler extension `__alignof` which provides the recommended alignment (8 for the type `long long` for IA-32, considering modern implementations of that ISA).

```c
long long vll;
_BitInt(64) vbi;

struct result {
int uppercase_alignof_bi64;
int uppercase_alignof_vbi;
int uppercase_alignof_longlong;
int uppercase_alignof_vll;
int lowercase_alignof_bi64;
int lowercase_alignof_vbi;
int lowercase_alignof_longlong;
int lowercase_alignof_vll;
} result =
{
.uppercase_alignof_bi64 = _Alignof(_BitInt(64)),
.uppercase_alignof_vbi = _Alignof(vbi),
.uppercase_alignof_longlong = _Alignof(long long),
.uppercase_alignof_vll = _Alignof(vll),
.lowercase_alignof_bi64 = __alignof(_BitInt(64)),
.lowercase_alignof_vbi = __alignof(vbi),
.lowercase_alignof_longlong = __alignof(long long),
.lowercase_alignof_vll = __alignof(vll),
};
```

Using Clang 20.1.0 with `-O2 -std=c23 -m32`:
```asm
result:
        .long   4
 .long   4
        .long   4
        .long   8
        .long   4
 .long   4
        .long   8
        .long   8
```

Using GCC 15.2 with the same options:
```
result:
        .long   4
        .long   8
 .long   4
        .long   8
        .long   8
        .long   8
 .long   8
        .long   8
```

Compiler Explorer link: https://gcc.godbolt.org/z/z59c6Tn7n
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJycVk-P4rgT_TTmUiIyTsifQw40_Bj14ac9zK72iJykSLzr2Fnbgen59CsngW4gzY4aBVBcrlfvlcsuc2tFrRBzsn4h692C967RJu-4Lblclr3-Z1Ho6i3_sxESQagTWidq7oSqwTUIou0ktqgcd0Ir0Mdh9PAi3KtyUGplnelLB0LBVnJVA1cVfNtuwekaXYMGzsI1QCL6f2Edmt2GsC2cEY66VxVY3SJU4nhEg6pECwW6M-IdWADf_bwp-Mfp3CAYrHpVceXGUI1znSXhhrA9YftauKYvglK3hO2lPF3-lp3Rf2HpCNsLa3u0hO2jhK4S0GYWpyyDWvWBNjVh-6KvfwopOWF72-jzoejroKwFCfeiIuEuXkVRAkXvgDuQyK0biJ-47AcVJKaHA5eiVvpIWDplk7A0jgjL_BNTn6boNq2pf_223XqTRWwtOA0t-t8CgUNn8CR0b-XbsleVLnu_blh9SNg1vZ5OqdtOSDTW47mGO6g0WlDaAZ5QgUH5Bvp2LuAPh8pOpcCl1GdfKXKQZj2_SdZ7aQzwXLpG93UDYoryH-A3GYopnBtRNtAZfRIV2sHLYKnbFlWF1RjUqwXC0hSO2gxT3FuHHkpqz1Gr2kN54-tmGTLPy7MUFRovotUVGnVX8XasOu7g9fuGsCwgdOOfmI5PSejmCg8nKUn4QujmbknhVIjRQOhm2jEGbS8dkMQPC-Wg7zo0Jbd4EX4oRByNbvP2K-q82VMaVD-DuDD2ZqnPTxk82m8YPJofGcxAXBiQZHdNSrgbBvxwMJ8XPwcOm2ebiG3n3U-FuPf2Op54XHTcu70X1rNwUj6Ek_LdYz7ro8vzU-Iz_6vAD-43Cj9fqQe_GYmza_gY8INGkuymNb7sm3Er_GH9xhtPOEaDVUCndhHT5W8Mltb547RkISzbkHm38Gb3cdsSuhmLZjTB9AkG3gCRH7t5mZtwN5Z-BWjOKf1Msu-Qq3XARrn-rLLcd7huOHPuVP6KxDkyX2H7FOgXJW4v5_n_fnRSGzQghfqbhJu5nqqrQks39dWf_rvOyvh3lahFlYdVFmZ8gfkqWa9jRhNGF01eRFixgjIWs2SVZYymSVyyIsUsY8nqmC5Ezihb03SVrWK2ZjSoeJWF8SouooRFWcRJRLHlQgb-KuBjL4ZLQL5aR2ESLSQvUNrhysSYwjMMVsKYv0GZfLg_FH1tSUSlsM6-wzjhJObPty2g75bc4dC_Izg3viFzU-Nw67r2pnODBrkdauXdRTjgFtJFb2T-9avOJPSUs38DAAD__1qjNog">