diff options
author | Jakub Jelinek <jakub@redhat.com> | 2018-10-20 10:58:00 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2018-10-20 10:58:00 +0200 |
commit | ca66a6cd6101b234a0506715f517cc16e570b123 (patch) | |
tree | a6e5b34a27cde236ff726070a5b16b1cfd64c63f /gcc | |
parent | 79e61dc24903e853707b47e665bc62591b07885c (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr87647.c | 15 | ||||
-rw-r--r-- | gcc/varasm.c | 5 |
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 (); } |