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

    <tr>
        <th>Summary</th>
        <td>
            [Clang] `constexpr` `std::string` fails to compile
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

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

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

<pre>
    The following code snippet cannot be compiled with clang and libstdc++. However, it builds fine with gcc.

```cpp
#include <string>

using namespace std::string_literals;

int main()
{
    static_assert(u"🧸"s.size() == 2);
    return 0;
}
```

```
❯ clang++ literal.cpp -std=c++20
literal.cpp:7:19: error: static assertion expression is not an integral constant expression
    7 |     static_assert(u"🧸"s.size() == 2);
      |                   ^~~~~~~~~~~~~~~~~~
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.1.1/../../../../include/c++/15.1.1/bits/basic_string.h:692:2: note: undefined function '_M_construct<const char16_t *>' cannot be used in a constant expression
  692 |         _M_construct(__s, __s + __n, std::forward_iterator_tag());
      |         ^
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.1.1/../../../../include/c++/15.1.1/bits/basic_string.h:5006:14: note: in call to 'basic_string(&u"\U0001F9F8"[0], 2, std::allocator<char16_t>())'
 5006 |     { return basic_string<char16_t>{__str, __len}; }
      |              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
literal.cpp:7:19: note: in call to 'operator""s(&u"\U0001F9F8"[0], 2)'
    7 |     static_assert(u"🧸"s.size() == 2);
      |                   ^~~~~~
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/15.1.1/../../../../include/c++/15.1.1/bits/basic_string.h:343:9: note: declared here
  343 |         _M_construct(_FwdIterator __beg, _FwdIterator __end,
      |         ^
1 error generated.

~
❯ g++ literal.cpp -std=c++20

~
❯ 
```

Distro: Arch Linux
clang version: 20.1.8 \
gcc and libstdc++ version: 15.1.1
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzMVs-PqzYQ_msml1EQ2PwIhxxIsqiV2lt7RsY4xJVjkG12X9_h_e3VANkmu29X71BVD5Fgg8f298034xHe694qtYfsANlpI6ZwGdz-61fRb9qh-3v_x0XheTBmeNG2Rzl0Cr3V46gCSmHtELBVKIfrqI3q8EWHC0ojbI_Cdmh060MngR2AHSL8ZXhRz8oBO6IO2E7adB7P2qrFrpcygriiO4-XW44jdRnXVpqpUwj86IPTtgf-tIydPG3Miqvyo5AKfeiAV8CrZVxjdFBOGA_8sBhoG_AqtAW2A1bSu4K-ICL6IIKWjfBeuQBsNwFjUMdQ1lAVcNgBYz7y-qtabBH4CfgJGc3Db5M4FSZnMV4XLE73gN7go_YTg_IEVb3wtnCF664jOY64nSGdVhoZGd19Bl4VwKukBF6hcm5w1FiQ4IJEDxbVl9Ep76mpPZLfhEVtg-qdMCgH64Ow4W7YiqZAKI74n5GDr9M9XpA9fXt7zZ6vJ--A1S35q44iYLXRbZ4Cq3spgdVfdnmTp9tRbo2205dtbydgdZJFSZTcLN78rVoCVq-U3hu0Onh6CK9ls0gougCv8pIBr-hH5Cl6TrZTpN4Oz5OVM8vAiub3ZmbTTTIAP85tlBfhkrwJCKwi5bLiLnomrzrUFsWHbshL9sDbwxps1zSeYqppPJJ2msZS9zUQzoN7Ea5rZs2EwTVB9Kv4P3YNZE8_Ff9ZHOck8_TeA9qiFMZgGIj5e5sZXz5LNDv-GcdxUpf1bu4eYshORBB7YEkYM0iih5y2umt21Y0oVhBRtI9XoqA43ML9YfHHGYpDQx8WFxllKSXwAy6Z4YOg-F48vL8-yQTfp2gYFwkQEYz5H2Tphv3_Twc_lQR5yoFXD-x2ShrhVIcX5dSMiaf801CtX7pf1zjEpmlVP8vi8a2yHbDjJ2GZLIkee2XJSHXrufnt4Tz5wbPknd378-qkfXADAa6cvOBvRDPE1XLQPys3JypeIYujJNohZLT5Xsr3RcD96IXwTbfnXclLsVH7pMh4sSvSONlc9sVOZKxteSp4suvKtk1zIVicyDxPd0KdN3rPYpbFBSuTJInjJCrSVkmRlkkSd0wkDNJYXYU2kTHP12hw_UZ7P6l9kiUJyzdGtMr4ufJhbD18GRVBbk8G23bqPaSx0T74f6cIOpi5XDrOFtkJqU4hF1PShjym_psihN6ehTaewnAtljaTM_tLCKOnkawmOetwmdpIDlfSuHm-PbajG_5SpJ96BuBntc4YnvfsnwAAAP__7H7QdQ">