https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69261
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2016-01-13 CC| |jakub at gcc dot gnu.org, | |jason at gcc dot gnu.org Target Milestone|--- |6.0 Summary|Copying char arrays during |[6 Regression] Copying char |constexpr evaluation does |arrays during constexpr |not work reliably |evaluation does not work | |reliably Ever confirmed|0 |1 --- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> --- The ICE started with r226949. Adjusted testcase without need for headers: typedef __SIZE_TYPE__ size_t; template <size_t N> struct S { constexpr S() = default; template<size_t M> constexpr S (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 <int N> constexpr S<N> s (char const (&d)[N]) { S<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 (S<N> const& s1, S<M> const& s2) { S<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]) { S<N+M-1> tmp { x }; for (size_t i = 0; i != M; i++) tmp.data[N+i-1] = y[i]; return tmp; } int main () { auto constexpr s1 = s ("bla"); auto constexpr s2 = s ("blub"); S<8> constexpr s1s2 = concat (s1, s2); auto constexpr c = concat ("bla", "blub"); if (__builtin_strcmp (s1.data, "bla") || __builtin_strcmp (s2.data, "blub") || __builtin_strcmp (s1s2.data, "blablub") || __builtin_strcmp (c.data, "blablub")) __builtin_abort (); }