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

Reply via email to