Index: clang/lib/AST/Interp/ByteCodeExprGen.cpp =================================================================== --- clang/lib/AST/Interp/ByteCodeExprGen.cpp +++ clang/lib/AST/Interp/ByteCodeExprGen.cpp @@ -1007,6 +1007,30 @@ assert(false && "default initializer for non-primitive type"); } + return true; + } else if (const auto *Ctor = dyn_cast(Initializer)) { + const ArrayType *AT = Ctor->getType()->getAsArrayTypeUnsafe(); + const auto *CAT = cast(AT); + size_t NumElems = CAT->getSize().getZExtValue(); + const Function *Func = getFunction(Ctor->getConstructor()); + if (!Func || !Func->isConstexpr()) + return false; + + assert(Ctor->getNumArgs() == 0); + for (size_t I = 0; I != NumElems; ++I) { + if (!this->emitDupPtr(Initializer)) + return false; + if (!this->emitConstUint64(I, Initializer)) + return false; + if (!this->emitAddOffsetUint64(Initializer)) + return false; + if (!this->emitNarrowPtr(Initializer)) + return false; + + // Actually call the constructor + if (!this->emitCall(Func, Ctor)) + return false; + } return true; } Index: clang/test/AST/Interp/arrays.cpp =================================================================== --- clang/test/AST/Interp/arrays.cpp +++ clang/test/AST/Interp/arrays.cpp @@ -181,6 +181,18 @@ } }; +class A { +public: + int a; + constexpr A() : a(10) {} +}; +class B { +public: + A a[2]; + constexpr B() {} +}; +constexpr B b; + namespace IncDec { // FIXME: Pointer arithmethic needs to be supported in inc/dec // unary operators