https://gcc.gnu.org/g:1804554a11d4dcdc0d513926f90fb1f33b0eeba9
commit r16-5834-g1804554a11d4dcdc0d513926f90fb1f33b0eeba9 Author: Jakub Jelinek <[email protected]> Date: Tue Dec 2 14:36:06 2025 +0100 c++: Fix up error recovery for invalid designators [PR122836] The following testcase ICEs since r12-7741 on the newly added gcc_assert. We've diagnosed the designator is invalid before, but kept it as is. The following patch changes it into error_mark_node, so that don't ICE on it. 2025-12-02 Jakub Jelinek <[email protected]> PR c++/122836 * decl.cc (check_array_designated_initializer): Change ce->index to error_mark_node after emitting an error for it. * g++.dg/ext/pr122836.C: New test. Diff: --- gcc/cp/decl.cc | 1 + gcc/testsuite/g++.dg/ext/pr122836.C | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc index d1fbbab6e4c3..974fa8598a65 100644 --- a/gcc/cp/decl.cc +++ b/gcc/cp/decl.cc @@ -6981,6 +6981,7 @@ check_array_designated_initializer (constructor_elt *ce, { error ("name %qD used in a GNU-style designated " "initializer for an array", ce->index); + ce->index = error_mark_node; return false; } diff --git a/gcc/testsuite/g++.dg/ext/pr122836.C b/gcc/testsuite/g++.dg/ext/pr122836.C new file mode 100644 index 000000000000..5307ae9510b3 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pr122836.C @@ -0,0 +1,11 @@ +// PR c++/122836 +// { dg-do compile } +// { dg-options "" } + +struct V { __attribute__ ((__vector_size__ (2 * sizeof (float)))) float v[2]; }; + +V +foo () +{ + return (V) { { .v = { 0, 0 } } }; // { dg-error "name 'v' used in a GNU-style designated initializer for an array" } +}
