https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68006
Bug ID: 68006 Summary: [6 Regression] [C++14] Incorrect aggregate initialization from empty initializer list with NSDMI Product: gcc Version: 6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: Casey at Carter dot net Target Milestone: --- r228925 miscompiles this program: inline void* operator new(decltype(sizeof(0)), void* ptr) { return ptr; } struct X { int x; int y; int z = 42; }; void test_bar(X* p) { new(p) X{}; // Bad. } to: ~/gcc6/bin/g++ -std=c++14 foo.cpp -O -S -o - .file "foo.cpp" .text .globl _Z8test_barP1X .type _Z8test_barP1X, @function _Z8test_barP1X: .LFB1: .cfi_startproc movl $42, 8(%rdi) ret .cfi_endproc .LFE1: .size _Z8test_barP1X, .-_Z8test_barP1X .ident "GCC: (GNU) 6.0.0 20151016 (experimental)" .section .note.GNU-stack,"",@progbits The construction in test_bar only initializes the member with the NSDMI - X::z - and does not correctly initialize the other members to 0. GCC 5.1 and 5.2 both compile the program correctly: ~/gcc-5.2/bin/g++ -std=c++14 foo.cpp -O -S -o - .file "foo.cpp" .text .globl _Z8test_barP1X .type _Z8test_barP1X, @function _Z8test_barP1X: .LFB1: .cfi_startproc movl $0, (%rdi) movl $0, 4(%rdi) movl $42, 8(%rdi) ret .cfi_endproc .LFE1: .size _Z8test_barP1X, .-_Z8test_barP1X .ident "GCC: (GNU) 5.2.0" .section .note.GNU-stack,"",@progbits