Issue 151126
Summary [Clang] `constexpr` `std::string` fails to compile
Labels clang
Assignees
Reporter zzag
    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
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to