From f84aded848f6fdd2704c9376263c6d1aee6bb0ca Mon Sep 17 00:00:00 2001 From: Marek Polacek Date: Mon, 30 Mar 2020 15:49:17 -0400 Subject: [PATCH] c++: Fix crash in gimplifier with paren init of aggregates [PR94155] Here we crash in the gimplifier because gimplify_init_ctor_eval doesn't expect null indexes for a constructor: /* ??? Here's to hoping the front end fills in all of the indices, so we don't have to figure out what's missing ourselves. */ gcc_assert (purpose); The indexes weren't filled because we never called reshape_init: for a constructor that represents parenthesized initialization of an aggregate we don't allow brace elision or designated initializers. PR c++/94155 - crash in gimplifier with paren init of aggregates. * init.c (build_vec_init): Fill in indexes. * g++.dg/cpp2a/paren-init22.C: New test. --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/init.c | 2 ++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/cpp2a/paren-init22.C | 15 +++++++++++++++ 4 files changed, 28 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp2a/paren-init22.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a382235d7cc..fc75879d14f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2020-04-04 Marek Polacek + Jason Merrill + + PR c++/94155 - crash in gimplifier with paren init of aggregates. + * init.c (build_vec_init): Fill in indexes. + 2020-04-04 Jason Merrill PR c++/91377 diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 27623cf4db1..ea95a3bc910 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -4438,6 +4438,8 @@ build_vec_init (tree base, tree maxindex, tree init, errors = true; if (try_const) { + if (!field) + field = size_int (idx); tree e = maybe_constant_init (one_init); if (reduced_constant_expression_p (e)) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 88bab5d3d19..29830633d79 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-04-04 Marek Polacek + + PR c++/94155 - crash in gimplifier with paren init of aggregates. + * g++.dg/cpp2a/paren-init22.C: New test. + 2020-04-05 Iain Sandoe * g++.dg/coroutines/torture/co-await-14-template-traits.C: Rename... diff --git a/gcc/testsuite/g++.dg/cpp2a/paren-init22.C b/gcc/testsuite/g++.dg/cpp2a/paren-init22.C new file mode 100644 index 00000000000..1b2959e7731 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/paren-init22.C @@ -0,0 +1,15 @@ +// PR c++/94155 - crash in gimplifier with paren init of aggregates. +// { dg-do compile { target c++2a } } + +struct S { int i, j; }; + +struct A { + S s; + constexpr A(S e) : s(e) {} +}; + +void +f() +{ + A g[1]({{1, 1}}); +} -- 2.30.2