This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [C++ PATCH] Fix ICE in reshape_init_class (PR c++/84874)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Jason Merrill <jason at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Fri, 16 Mar 2018 09:46:49 +0100
- Subject: Re: [C++ PATCH] Fix ICE in reshape_init_class (PR c++/84874)
- References: <20180315232958.GZ8577@tucnak>
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
On Fri, Mar 16, 2018 at 12:29:58AM +0100, Jakub Jelinek wrote:
> As the testcase shows, even when we've already reshaped the initializer, if
> it uses designated initializers and skips using those over others, we can
> have field != d->cur->index. The following patch handles that case.
Just to verify we don't ICE even with anonymous aggregates, I've added
another testcase, tested on x86_64-linux, committed to trunk as obvious.
2018-03-16 Jakub Jelinek <jakub@redhat.com>
PR c++/84874
* g++.dg/cpp2a/desig8.C: New test.
--- gcc/testsuite/g++.dg/cpp2a/desig8.C.jj 2018-03-16 09:42:08.585005338 +0100
+++ gcc/testsuite/g++.dg/cpp2a/desig8.C 2018-03-16 09:41:15.100019444 +0100
@@ -0,0 +1,31 @@
+// PR c++/84874
+// { dg-do run { target c++17 } }
+// { dg-options "" }
+
+struct A { int a; struct { int b; }; };
+struct B { A d; };
+
+void
+foo (B *x)
+{
+ *x = { .d = { .b = 5 } };
+}
+
+void
+bar (A *x)
+{
+ *x = { .b = 6 };
+}
+
+int
+main ()
+{
+ B b = { { 2, 3 } };
+ foo (&b);
+ if (b.d.a != 0 || b.d.b != 5)
+ __builtin_abort ();
+ b.d.a = 8;
+ bar (&b.d);
+ if (b.d.a != 0 || b.d.b != 6)
+ __builtin_abort ();
+}
Jakub