https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94885
--- Comment #4 from CVS Commits <cvs-commit at gcc dot gnu.org> --- The master branch has been updated by Marek Polacek <mpola...@gcc.gnu.org>: https://gcc.gnu.org/g:30da2906ac521749aef8260fc1d942e62073f19d commit r11-20-g30da2906ac521749aef8260fc1d942e62073f19d Author: Marek Polacek <pola...@redhat.com> Date: Thu Apr 30 11:36:17 2020 -0400 c++: Parenthesized-init of aggregates accepts invalid code [PR94885] Here we have (conceptually *) something like struct B { }; struct D : B { }; D(0); // invalid and in C++20 the ()-initialization has created a { 0 } constructor that it tries to initialize an object of type D with. We should reject initializing an object of type B from 0, but we wrongly accept it because process_init_constructor_record skips initializers for empty bases/fields: if (DECL_SIZE (field) && integer_zerop (DECL_SIZE (field)) && !TREE_SIDE_EFFECTS (next)) /* Don't add trivial initialization of an empty base/field to the constructor, as they might not be ordered the way the back-end expects. */ continue; but here 'next' was error_mark_node, returned by massage_elt_init, so we wound up with { } which would validly value-initialize the object. [*] Usually digest_init in build_new_method_call_1 would detect this, but in this case the instance is is_dummy_object and we don't call digest just yet. PR c++/94885 * typeck2.c (process_init_constructor_record): Return PICFLAG_ERRONEOUS if an initializer element was erroneous. * g++.dg/cpp2a/paren-init26.C: New test.