aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-01-09 08:34:41 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2016-01-09 08:34:41 +0100
commitc50e614be6bb98f8a67f6fda4f73b412b035329d (patch)
treee6d90067b2fcf0f2a56beecc585194053d6bc670
parentfe71aa4ea5d17256d6f0343fbd730a66eddd1e92 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/cp/class.c11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/opt/pr69164.C30
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);
+}