diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/desig7.C | 31 |
4 files changed, 53 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a4f845a..7322a76 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2018-03-16 Jakub Jelinek <jakub@redhat.com> + + 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 <jakub@redhat.com> PR c++/84222 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 98f762e..727bb04 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 14e70af..dbd7640 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-03-16 Jakub Jelinek <jakub@redhat.com> + + PR c++/84874 + * g++.dg/cpp2a/desig7.C: New test. + 03-16-2018 Mark Doffman <mark.doffman@codethink.co.uk> Jim MacArthur <jim.macarthur@codethink.co.uk> diff --git a/gcc/testsuite/g++.dg/cpp2a/desig7.C b/gcc/testsuite/g++.dg/cpp2a/desig7.C new file mode 100644 index 0000000..2865014 --- /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 (); +} |