https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69263
Bug ID: 69263 Summary: internal compiler error: in cxx_eval_store_expression Product: gcc Version: 6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: jens.auer at cgi dot com Target Milestone: --- Compilation of the following program with gcc 6.0.0 201601 (from the online compiler http://melpon.org/wandbox, http://melpon.org/wandbox/permlink/CMreVotFuJMgnuI7) crashes: #include <cstdint> #include <tuple> #include <iostream> using std::size_t; template<size_t N> struct string_constexpr { constexpr string_constexpr() = default; template<size_t M> constexpr string_constexpr( char const (&d)[M] ): data{0} { static_assert( M <= N, "size!" ); for(size_t i=0; i != M; i++) { data[i] = d[i]; } } char data[N]; }; template<typename T, size_t N> T& operator<<(T& stream, string_constexpr<N> const& str) { return (stream << str.data); } template<int N> constexpr string_constexpr<N> s( char const (&d)[N] ) { string_constexpr<N> c{}; for(size_t i=0; i != N; i++) { c.data[i] = d[i]; } return c; } template<size_t N, size_t M> constexpr auto concat(string_constexpr<N> const& s1, string_constexpr<M> const& s2) { string_constexpr<N+M-1> s( s1.data ); for(size_t i=0; i != M; i++) { s.data[N+i-1] = s2.data[i]; } return s; } template<size_t N, size_t M> constexpr auto concat(char const (&x)[N], char const (&y)[M]) { static_assert(N == 4 && M == 4, ""); string_constexpr<N+M-1> tmp{x}; for(size_t i=0; i != M; i++) { tmp.data[N+i-1] = y[i]; } return tmp; } void foo() { auto constexpr s1 = s( "bla" ); auto constexpr s2 = s( "blub" ); string_constexpr<8> constexpr s1s2 = concat(s1,s2); auto constexpr c = concat("bla", "blub"); std::cout << s1.data << std::endl << s2.data << std::endl << s1s2.data << std::endl << c << std::endl; } int main() { foo(); return 0; } g++ prog.cc -Wall -Wextra -std=gnu++1z prog.cc: In function 'void foo()': prog.cc:74:33: in constexpr expansion of 's<4>("bla")' prog.cc:74:33: internal compiler error: in cxx_eval_store_expression, at cp/constexpr.c:2808 auto constexpr s1 = s( "bla" ); ^ 0x6f249e cxx_eval_store_expression /home/heads/gcc/gcc-source/gcc/cp/constexpr.c:2808 0x6f03bb cxx_eval_constant_expression /home/heads/gcc/gcc-source/gcc/cp/constexpr.c:3312 0x6efc5f cxx_eval_constant_expression /home/heads/gcc/gcc-source/gcc/cp/constexpr.c:3570 0x6f0267 cxx_eval_constant_expression /home/heads/gcc/gcc-source/gcc/cp/constexpr.c:3349 0x6f0267 cxx_eval_constant_expression /home/heads/gcc/gcc-source/gcc/cp/constexpr.c:3349 0x6f2b21 cxx_eval_statement_list /home/heads/gcc/gcc-source/gcc/cp/constexpr.c:3028 0x6f0563 cxx_eval_loop_expr /home/heads/gcc/gcc-source/gcc/cp/constexpr.c:3055 0x6f0563 cxx_eval_constant_expression /home/heads/gcc/gcc-source/gcc/cp/constexpr.c:3680 0x6f2b21 cxx_eval_statement_list /home/heads/gcc/gcc-source/gcc/cp/constexpr.c:3028 0x6f044c cxx_eval_constant_expression /home/heads/gcc/gcc-source/gcc/cp/constexpr.c:3614 0x6efd2f cxx_eval_constant_expression /home/heads/gcc/gcc-source/gcc/cp/constexpr.c:3669 0x6f2b21 cxx_eval_statement_list /home/heads/gcc/gcc-source/gcc/cp/constexpr.c:3028 0x6f044c cxx_eval_constant_expression /home/heads/gcc/gcc-source/gcc/cp/constexpr.c:3614 0x6efd2f cxx_eval_constant_expression /home/heads/gcc/gcc-source/gcc/cp/constexpr.c:3669 0x6ef1df cxx_eval_call_expression /home/heads/gcc/gcc-source/gcc/cp/constexpr.c:1386 0x6efd0b cxx_eval_constant_expression /home/heads/gcc/gcc-source/gcc/cp/constexpr.c:3238 0x6f0c7a cxx_eval_constant_expression /home/heads/gcc/gcc-source/gcc/cp/constexpr.c:3296 0x6efedb cxx_eval_constant_expression /home/heads/gcc/gcc-source/gcc/cp/constexpr.c:3378 0x6efc5f cxx_eval_constant_expression /home/heads/gcc/gcc-source/gcc/cp/constexpr.c:3570 0x6f2cf8 cxx_eval_outermost_constant_expr /home/heads/gcc/gcc-source/gcc/cp/constexpr.c:3773 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <http://gcc.gnu.org/bugs.html> for instructions. 1 Finish