diff options
author | Jakub Jelinek <jakub@redhat.com> | 2016-01-09 08:34:41 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-01-09 08:34:41 +0100 |
commit | c50e614be6bb98f8a67f6fda4f73b412b035329d (patch) | |
tree | e6d90067b2fcf0f2a56beecc585194053d6bc670 | |
parent | fe71aa4ea5d17256d6f0343fbd730a66eddd1e92 (diff) | |
download | gcc-c50e614be6bb98f8a67f6fda4f73b412b035329d.zip gcc-c50e614be6bb98f8a67f6fda4f73b412b035329d.tar.gz gcc-c50e614be6bb98f8a67f6fda4f73b412b035329d.tar.bz2 |
re PR tree-optimization/69164 (ICE in create_tmp_var, at gimple-expr.c:468)
PR c++/69164
* class.c (layout_class_type): Use copy_node to copy FIELD_DECLs.
* g++.dg/opt/pr69164.C: New test.
From-SVN: r232187
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/class.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr69164.C | 30 |
4 files changed, 42 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8723cad..3ec2e1c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2016-01-09 Jakub Jelinek <jakub@redhat.com> + + PR c++/69164 + * class.c (layout_class_type): Use copy_node to copy FIELD_DECLs. + 2016-01-08 Jason Merrill <jason@redhat.com> PR c++/69158 diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 038e4c7..fc47f91 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -6484,18 +6484,11 @@ layout_class_type (tree t, tree *virtuals_p) for (field = TYPE_FIELDS (t); field; field = DECL_CHAIN (field)) if (TREE_CODE (field) == FIELD_DECL) { - *next_field = build_decl (input_location, - FIELD_DECL, - DECL_NAME (field), - TREE_TYPE (field)); + *next_field = copy_node (field); DECL_CONTEXT (*next_field) = base_t; - DECL_FIELD_OFFSET (*next_field) = DECL_FIELD_OFFSET (field); - DECL_FIELD_BIT_OFFSET (*next_field) - = DECL_FIELD_BIT_OFFSET (field); - DECL_SIZE (*next_field) = DECL_SIZE (field); - DECL_MODE (*next_field) = DECL_MODE (field); next_field = &DECL_CHAIN (*next_field); } + *next_field = NULL_TREE; /* Record the base version of the type. */ CLASSTYPE_AS_BASE (t) = base_t; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 73ecf30..cbcf1bd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-01-09 Jakub Jelinek <jakub@redhat.com> + + PR c++/69164 + * g++.dg/opt/pr69164.C: New test. + 2016-01-08 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/69167 diff --git a/gcc/testsuite/g++.dg/opt/pr69164.C b/gcc/testsuite/g++.dg/opt/pr69164.C new file mode 100644 index 0000000..e9a1a4f --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr69164.C @@ -0,0 +1,30 @@ +// PR c++/69164 +// { dg-do compile { target c++11 } } +// { dg-options "-O2" } + +struct A { + struct B { + B () {} + bool : 1; + }; + B foo () { B r; return r; } +}; + +struct C { + struct D { + D (C *x) : d (x->c.foo ()) {} + A::B d; + }; + A c; +}; + +struct F : C { + D f = this; + F (int, int) {} +}; + +void +bar (int a, int b) +{ + F (b, a); +} |