From 828fd2fbe88ee6adb16b708d584caf96237046da Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 16 Mar 2018 09:05:06 +0100 Subject: [PATCH] re PR c++/84874 (internal compiler error: in reshape_init_class, at cp/decl.c:5800) PR c++/84874 * decl.c (reshape_init_class): Don't assert d->cur->index == field if d->cur->index is a FIELD_DECL, instead set field to d->cur->index. * g++.dg/cpp2a/desig7.C: New test. From-SVN: r258585 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/decl.c | 13 ++++++++++-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/cpp2a/desig7.C | 31 +++++++++++++++++++++++++++++ 4 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp2a/desig7.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a4f845a061b..7322a76bd86 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2018-03-16 Jakub Jelinek + + PR c++/84874 + * decl.c (reshape_init_class): Don't assert d->cur->index == field + if d->cur->index is a FIELD_DECL, instead set field to d->cur->index. + 2018-03-15 Jakub Jelinek PR c++/84222 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 98f762e5253..727bb04a394 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -5885,8 +5885,17 @@ reshape_init_class (tree type, reshape_iter *d, bool first_initializer_p, return error_mark_node; if (TREE_CODE (d->cur->index) == FIELD_DECL) - /* We already reshaped this. */ - gcc_assert (d->cur->index == field); + { + /* We already reshaped this. */ + if (field != d->cur->index) + { + tree id = DECL_NAME (d->cur->index); + gcc_assert (id); + gcc_checking_assert (d->cur->index + == get_class_binding (type, id, false)); + field = d->cur->index; + } + } else if (TREE_CODE (d->cur->index) == IDENTIFIER_NODE) field = get_class_binding (type, d->cur->index, false); else diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 14e70af66d6..dbd76400253 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-03-16 Jakub Jelinek + + PR c++/84874 + * g++.dg/cpp2a/desig7.C: New test. + 03-16-2018 Mark Doffman Jim MacArthur diff --git a/gcc/testsuite/g++.dg/cpp2a/desig7.C b/gcc/testsuite/g++.dg/cpp2a/desig7.C new file mode 100644 index 00000000000..2865014f591 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/desig7.C @@ -0,0 +1,31 @@ +// PR c++/84874 +// { dg-do run { target c++11 } } +// { dg-options "" } + +struct A { int a, 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 (); +} -- 2.30.2