Consider this simple testcase: extern "C" { int printf(const char *format, ...); }; struct Test { Test() : i(10) {} Test(int i) : i(i) {} int i; private: int j; }; int main() { Test partial[3] = { 1 }; printf("%d %d %d\n", partial[0].i, partial[1].i, partial[2].i); Test empty[3] = {}; printf("%d %d %d\n", empty[0].i, empty[1].i, empty[2].i); } This is a regression; as of r129729 it worked. The program should print "1 10 10" "10 10 10". It currently prints "1 10 10" "0 0 0". If you shrink the array down to 2 members, the bug goes away. If you remove private members, the bug goes away.
Clang r129896 and r129933 made changes in this area.
cloned to <rdar://problem/9347552>
FIxed at r130421, thanks for the report!