https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90938
--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> --- Not a dup, because turning {0, 0} into {} is still wrong even for trivial classes: struct X { X() = default; X(int n) : n(n+1) { } int n; }; static_assert(__is_trivial(X), ""); int main() { X x[1] { 1 }; // OK if (x->n != 2) __builtin_abort(); X y[1] { 0 }; if (y->n != 1) __builtin_abort(); } Aborted (core dumped) The array element has a non-empty initializer, so must call the X(int) constructor, which has very different semantics from the default constructor. An {0} initializer could be a null pointer constant too: struct X { X() = default; X(int* p) : p(p ? p : new int(1)) { } int* p; }; static_assert(__is_trivial(X), ""); int main() { X x[1] { nullptr }; // OK if (*x->p != 1) __builtin_abort(); X y[1] { 0 }; if (*y->p != 1) __builtin_abort(); } Segmentation fault (core dumped)