https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103294

--- Comment #3 from cqwrteur <unlvsur at live dot com> ---
(In reply to Andrew Pinski from comment #1)
> GCC complains with -std=c++2b:
> <source>: In function 'constexpr bool foo()':
> <source>:7:33: error: call to non-'constexpr' function
> 'std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::basic_string(const
> _CharT*, const _Alloc&) [with <template-parameter-2-1> =
> std::allocator<char>; _CharT = char; _Traits = std::char_traits<char>;
> _Alloc = std::allocator<char>]'
>     7 |         std::string str2{"abcwe"};
>       |                                 ^
> In file included from
> /opt/compiler-explorer/gcc-trunk-20211116/include/c++/12.0.0/string:53,
>                  from <source>:2:
> /opt/compiler-explorer/gcc-trunk-20211116/include/c++/12.0.0/bits/
> basic_string.h:535:7: note: 'std::__cxx11::basic_string<_CharT, _Traits,
> _Alloc>::basic_string(const _CharT*, const _Alloc&) [with
> <template-parameter-2-1> = std::allocator<char>; _CharT = char; _Traits =
> std::char_traits<char>; _Alloc = std::allocator<char>]' declared here
>   535 |       basic_string(const _CharT* __s, const _Alloc& __a = _Alloc())
>       |       ^~~~~~~~~~~~
> <source>: At global scope:
> <source>:11:18: error: non-constant condition for static assertion
>    11 | static_assert(foo());
>       |               ~~~^~
> <source>:11:18: error: 'constexpr bool foo()' called in a constant expression
> <source>:5:16: note: 'constexpr bool foo()' declared here
>     5 | constexpr bool foo()
>       |                ^~~
> 
> Even libc++ fails to compile the code:
> <source>:7:14: error: variable of non-literal type 'std::string' (aka
> 'basic_string<char, char_traits<char>, allocator<char>>') cannot be defined
> in a constexpr function
>         std::string str2{"abcwe"};
>                     ^
> /opt/compiler-explorer/clang-trunk-20211116/bin/../include/c++/v1/string:679:
> 5: note: 'basic_string<char>' is not literal because it is not an aggregate
> and has no constexpr constructors other than copy or move constructors
>     basic_string
>     ^
> 1 error generated.

Your gcc is old and needs update. This is a new feature added today. But it
does not work clang.

Reply via email to