<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">