Tested x86_64-pc-linux-gnu, applying to trunk.
-- 8< --
A couple of cases where the asserts need loosening. Thanks to Marek for
suggesting the fix for 127516.
PR c++/128532
PR c++/127516
gcc/cp/ChangeLog:
* decl.cc (reshape_init_r): Also treat a vector as aggregate.
(reshape_init): The old designated initializer extension
allows designators with brace elision.
gcc/testsuite/ChangeLog:
* g++.dg/ext/desig12.C: New test.
* g++.dg/ext/desig13.C: New test.
---
gcc/cp/decl.cc | 5 ++++-
gcc/testsuite/g++.dg/ext/desig12.C | 9 +++++++++
gcc/testsuite/g++.dg/ext/desig13.C | 6 ++++++
3 files changed, 19 insertions(+), 1 deletion(-)
create mode 100644 gcc/testsuite/g++.dg/ext/desig12.C
create mode 100644 gcc/testsuite/g++.dg/ext/desig13.C
diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc
index 7243c8a3caa..cd5170330c1 100644
--- a/gcc/cp/decl.cc
+++ b/gcc/cp/decl.cc
@@ -8261,7 +8261,7 @@ reshape_init_r (tree type, reshape_iter *d, tree
first_initializer_p,
{
/* Deliberately not CP_AGGREGATE_TYPE_P to get a better diagnostic for
trying to designate a member of a non-aggregate class. */
- if (AGGREGATE_TYPE_P (type))
+ if (AGGREGATE_TYPE_P (type) || gnu_vector_type_p (type))
goto skip_single;
else
gcc_checking_assert (seen_error ());
@@ -8540,6 +8540,9 @@ reshape_init (tree type, tree init, tsubst_flags_t
complain)
if (CONSTRUCTOR_IS_DESIGNATED_INIT (init)
&& BRACE_ENCLOSED_INITIALIZER_P (new_init))
gcc_checking_assert (CONSTRUCTOR_IS_DESIGNATED_INIT (new_init)
+ /* The old extension allows brace elision
+ (128532). */
+ || cxx_dialect < cxx20
|| seen_error ());
return new_init;
diff --git a/gcc/testsuite/g++.dg/ext/desig12.C
b/gcc/testsuite/g++.dg/ext/desig12.C
new file mode 100644
index 00000000000..ffa694da885
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/desig12.C
@@ -0,0 +1,9 @@
+// PR c++/128532
+// The pre-C++20 designated initializer extension was more flexible than what
+// was standardized.
+
+// { dg-additional-options -Wno-c++20-extensions }
+
+struct A { int a, b; };
+struct S { A x; int c; };
+S s = { 1, .b = 2 }; // { dg-error "designated" "" { target c++20 } }
diff --git a/gcc/testsuite/g++.dg/ext/desig13.C
b/gcc/testsuite/g++.dg/ext/desig13.C
new file mode 100644
index 00000000000..41102ac4845
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/desig13.C
@@ -0,0 +1,6 @@
+// PR c++/127516
+// This shouldn't ICE.
+
+typedef int __attribute__((vector_size(8))) V;
+
+V v = { .v = 42 }; // { dg-error "designated" }
base-commit: a70f7ee802d9adaf3727d392e7be2f5eacba78ca
--
2.56.0