Index: clang/lib/AST/Interp/ByteCodeExprGen.cpp =================================================================== --- clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -1432,7 +1432,7 @@ // since we memset our Block*s to 0 and so we have the desired value // without this. for (size_t I = 0; I != NumElems; ++I) { - if (!this->emitZero(*ElemT, Initializer)) + if (!this->visitZeroInitializer(CAT->getElementType(), Initializer)) return false; if (!this->emitInitElem(*ElemT, I, Initializer)) return false; Index: clang/test/AST/Interp/arrays.cpp =================================================================== --- clang/test/AST/Interp/arrays.cpp +++ clang/test/AST/Interp/arrays.cpp @@ -334,3 +334,19 @@ // ref-error {{not an integral constant expression}} \ // ref-note {{in call to}} }; + +namespace ZeroInit { + struct A { + int *p[2]; + }; + constexpr A a = {}; + static_assert(a.p[0] == nullptr, ""); + static_assert(a.p[1] == nullptr, ""); + + struct B { + double f[2]; + }; + constexpr B b = {}; + static_assert(b.f[0] == 0.0, ""); + static_assert(b.f[1] == 0.0, ""); +}