aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2018-10-20 10:58:00 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2018-10-20 10:58:00 +0200
commitca66a6cd6101b234a0506715f517cc16e570b123 (patch)
treea6e5b34a27cde236ff726070a5b16b1cfd64c63f /gcc
parent79e61dc24903e853707b47e665bc62591b07885c (diff)
downloadgcc-ca66a6cd6101b234a0506715f517cc16e570b123.zip
gcc-ca66a6cd6101b234a0506715f517cc16e570b123.tar.gz
gcc-ca66a6cd6101b234a0506715f517cc16e570b123.tar.bz2
re PR middle-end/87647 (ICE on valid code in decode_addr_const, at varasm.c:2958)
PR middle-end/87647 * varasm.c (decode_addr_const): Handle COMPOUND_LITERAL_EXPR. * gcc.c-torture/compile/pr87647.c: New test. From-SVN: r265341
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr87647.c15
-rw-r--r--gcc/varasm.c5
4 files changed, 30 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 622765d..f59167c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2018-10-20 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/87647
+ * varasm.c (decode_addr_const): Handle COMPOUND_LITERAL_EXPR.
+
2018-10-20 Andreas Schwab <schwab@linux-m68k.org>
* doc/ux.texi: Move @section directly after @node.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3000e21..86fa756 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-10-20 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/87647
+ * gcc.c-torture/compile/pr87647.c: New test.
+
2018-10-19 Jakub Jelinek <jakub@redhat.com>
PR middle-end/85488
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr87647.c b/gcc/testsuite/gcc.c-torture/compile/pr87647.c
new file mode 100644
index 0000000..67f9d87
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr87647.c
@@ -0,0 +1,15 @@
+/* PR middle-end/87647 */
+
+struct A {};
+struct A *const b = &(struct A) {};
+struct B { char *s; struct A *t; };
+void bar (struct B *);
+
+void
+foo (void)
+{
+ struct B a[] = { "", b, "", b, "", b, "", b, "", b, "", b, "", b, "", b,
+ "", b, "", b, "", b, "", b, "", b, "", b, "", b, "", b,
+ "", b };
+ bar (a);
+}
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 78cb000..91650ee 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -2953,6 +2953,11 @@ decode_addr_const (tree exp, struct addr_const *value)
gen_rtx_SYMBOL_REF (Pmode, "origin of addresses"));
break;
+ case COMPOUND_LITERAL_EXPR:
+ gcc_assert (COMPOUND_LITERAL_EXPR_DECL (target));
+ x = DECL_RTL (COMPOUND_LITERAL_EXPR_DECL (target));
+ break;
+
default:
gcc_unreachable ();
}