[PATCH] Fix ICE with address of (static) compound literal (PR middle-end/87647)

Jakub Jelinek jakub@redhat.com
Sat Oct 20 06:47:00 GMT 2018


Hi!

COMPOUND_LITERAL_EXPRs are removed from static initializers in
record_references_in_initializer, unfortunately decode_addr_const can be
called from const_hash_1 from output_constant_def before that happens
and as record_references_in_initializer needs a varpool node, we can't call
it during the hashing used to check if we have such a constant already.

The following patch handles COMPOUND_LITERAL_EXPRs like they will be handled
later on for the purpose of hashing them.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2018-10-19  Jakub Jelinek  <jakub@redhat.com>

	PR middle-end/87647
	* varasm.c (decode_addr_const): Handle COMPOUND_LITERAL_EXPR.

	* gcc.c-torture/compile/pr87647.c: New test.

--- gcc/varasm.c.jj	2018-10-11 09:05:48.124511816 +0200
+++ gcc/varasm.c	2018-10-19 13:27:41.921160889 +0200
@@ -2953,6 +2953,11 @@ decode_addr_const (tree exp, struct addr
 		       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 ();
     }
--- gcc/testsuite/gcc.c-torture/compile/pr87647.c.jj	2018-10-19 13:30:28.797388068 +0200
+++ gcc/testsuite/gcc.c-torture/compile/pr87647.c	2018-10-19 13:30:00.778853626 +0200
@@ -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);
+}

	Jakub



More information about the Gcc-patches mailing list