diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp index 536438b347a20..9f79a7bcf9d34 100644 --- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -1291,7 +1291,7 @@ bool ByteCodeExprGen::visitArrayInitializer(const Expr *Initializer) { // 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; diff --git a/clang/test/AST/Interp/arrays.cpp b/clang/test/AST/Interp/arrays.cpp index 413ab2fa45d84..22ccafd579241 100644 --- a/clang/test/AST/Interp/arrays.cpp +++ b/clang/test/AST/Interp/arrays.cpp @@ -334,3 +334,19 @@ namespace IncDec { // 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, ""); +}