<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=http://email.email.llvm.org/c/eJylVE1v4yAQ_TXkgmJhnNTJwYc2aVY970o9rrAZ21TEZPlomv76HbDTNlUrdbsWxmAG5s2bN9RGnqqNGZySYKnvgbZGa3NUQ0cbI4EU14RtCbsmV2xqaaoGj5Zm4QhfEb6mpLwZFyg-FnywA8Ul9lQyxgiPPUt2xQYbXZBisifldhqkPiCSbgBJzw7CPzgIX_EwHZx_E3n-VeT5d5F_5OGS_GOvmp4eexgwR_uD0uj1qHxP0WLuvCTFtiH8BhtndH4vtMYenrwV-D2AFINXDdoiGhe0dwj5szwjIGeCbVAIt2jD43uFHT0KO6BI4nCK2_Wq9dORrwGyM38W_gSFq7S4orVCp97gvwP-gcETvqF1iNtKFWclNYM-0V6gOR_NyfJmfp98zM0j2BZFSpbb74mOvj6kvP1KQ_e3o3E6ID_HTzsYwAoPMvuYv9TfDXRzTkgMNdaZg33Kg6PCAn0IzlOM9giYLAmtioy2ZizJieBGOIg2-OuUNp3XX6QXLcbzgzsjiyDFC9wkmsRinCViTfCx-qlp0W46yAvbgaf-dECPg6SD8e-2Xux6AfB2nwPYR2k18XZxHrMcU76H7C0zPzYbKg2qInlAkLgB4Ss3RqveEEf3eB9l9CdATGjv_cFF1fIdts7I2mifGdvh7Bnfta1F-1z0BQr3wuOv8fA90nYYY5LKNcG5kSin9koLG3UUBRlhYZgxUUJHLSnnQsKFyD8D0zRZN4QJTB26Z6W1wKHrzfE3zrOmU6TYqVioOStWsaImYc1kVch1sRYzEXxvbIUieTIW-ZsFq6t3jrDmQ53hHYATrR_Pn_nBmgdosI52CS5edbslX5XFrK8ASrGUclXKRQ6NyDnkBROirZfNYtFwOdOiBu0qLDfC-QDHMWIcY7XN_h-Bqjjjec75MnaMZYvVSqxZAwteMCnWkiwYVobSWTwncjizVToSiXO4qJEL97ooXJIeJMCI0Cuvobp7q7rLS-NcCu5CXLMEs0oY_wIklRtM>52873</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Inconsistent shift-overflow warnings in C++20
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          manxorist
      </td>
    </tr>
</table>

<pre>
    Consider the following code:
```
int foo4s() {
    return (0x7000'0000) << 4;
}

unsigned int foo4u() {
    return (0x7000'0000u) << 4;
}

int foo1s() {
    return (0x7000'0000) << 1;
}

unsigned int foo1u() {
    return (0x7000'0000u) << 1;
}
```
which when compiled with `-std=c++20 -Wall -Wextra -Wpedantic` results in:
```
<source>:2:26: warning: signed shift result (0x700000000) requires 36 bits to represent, but 'int' only has 32 bits [-Wshift-overflow]
    return (0x7000'0000) << 4;
           ~~~~~~~~~~~~~ ^  ~
1 warning generated.
```

In C++20, the semantics are just as well defined for the signed case as they are for the unsigned case, thus generating a warning when shifting bits outside of a signed target type and not when shifting outside of a unsigned target type seems inconsistent to me.

GCC does not warn in this case in C++20 mode. See <https://godbolt.org/z/9rbafz3h3>.

This came up when discussing a similar (but not identical) issue in GCC. See <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103826>

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJydVE1v4yAQ_TXkgmJhnMTxwYc2aVY970p7XGFDbCoCWT7qpr9-B2y3TdVK3VoYgxmYN2_e0Bh-qXdGO8mFxb4X-GiUMoPUHW4NF6i4QWSPyA3akKmlqdQeLM3KIbpFtMKovB0XMDxW-GA1hiXyVBJCEI09SXbFDhpeoWKyR-V-GqQ-AJJOC45nB-E_HISveJgOzr-JPP8q8vy7yD_ycE3-0Mu2x0MvNOTodJYKvA7S9xgsls5zVOxbRG-hUYKXv5lS0Isnbxl8z4Iz7WULtoDGBeUdQP4szwDImWBbEMId2ND4bqDDA7MaRBKHU9yul0c_HfkaIJn5s-JvkLCKiw1uJDj1Bv6d4Y_QHtEdbkLcVso4K7HR6oJ7BuZ0NEfr2-Xv5GNpHoU9gkjRev890eHXB5V3X2ng_m40Tgfkc_y4E1pY5gXPPuYv9fca7-aExFBjnTlxSnlwmFmBH4LzGKIdBCSLi6OMjB7NWJITwS1zItrAr0vaNK-_SC9ajOcHNyOLINkL3CSaxGKcJWJN8LH6sTmC3XSQZ7YTHvvLGTxqjrXx77Ze7XoB8HafE-IUpdXG28V5yHJM-Ulkb5n5sdthbkAVyQOAhA0AX7oxWvmGOHyC-yjDP4WICe29P7uoWnqA1hneGOUzYzuYPcNb2YYdn4u-AOFeefw1Hn4C2s5jTFy6Njg3EuXkSSpmo46iICMsCDMmiqmoJelcSLgA-Wdg2jbrdJjANKF7lkoxGLreDH9gnrWdRMVBxkLNSbGNFTUJa8HrgldFxRZeeiXq-7f0Xat_zqm7YmkRrKrf4YGrITQZXBUwUepx_izP1jyIFsrtkKKCG_GwptuyWPT1alusN21ZrdqiXOfbddlUtCrJBoZ8QwCeYo1QroaqRJRqMYzEwBiKciFrSmieU7qOHSHZartlFWnFihaEs4qjFQH5S5VFHJGoha0TJGDHwaKCiN3rInNJXyK5g_NZ8L2xNRTQk7FgukjO6wT-HxjTA8I">