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