Patchwork Fix -g ICE with COMPOUND_LITERAL_EXPR (PR debug/57184)

login
register
mail settings
Submitter Jakub Jelinek
Date May 6, 2013, 6:52 p.m.
Message ID <20130506185249.GN28963@tucnak.redhat.com>
Download mbox | patch
Permalink /patch/241757/
State New
Headers show

Comments

Jakub Jelinek - May 6, 2013, 6:52 p.m.
Hi!

We ICE on the following testcase, because DECL_INITIAL contains
COMPOUND_LITERAL_EXPR, which expr.c assumes has been gimplified, but
initializers aren't gimplified.  Fixed thusly, bootstrapped/regtested on
x86_64-linux and i686-linux, ok for trunk/4.8?

2013-05-06  Jakub Jelinek  <jakub@redhat.com>

	PR debug/57184
	* expr.c (expand_expr_addr_expr_1): Handle COMPOUND_LITERAL_EXPR
	for modifier == EXPAND_INITIALIZER.

	* gcc.dg/pr57184.c: New test.


	Jakub
Richard Guenther - May 7, 2013, 8:07 a.m.
On Mon, 6 May 2013, Jakub Jelinek wrote:

> Hi!
> 
> We ICE on the following testcase, because DECL_INITIAL contains
> COMPOUND_LITERAL_EXPR, which expr.c assumes has been gimplified, but
> initializers aren't gimplified.  Fixed thusly, bootstrapped/regtested on
> x86_64-linux and i686-linux, ok for trunk/4.8?

Ok.

Thanks,
Richard.

> 2013-05-06  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR debug/57184
> 	* expr.c (expand_expr_addr_expr_1): Handle COMPOUND_LITERAL_EXPR
> 	for modifier == EXPAND_INITIALIZER.
> 
> 	* gcc.dg/pr57184.c: New test.
> 
> --- gcc/expr.c.jj	2013-05-03 14:55:04.000000000 +0200
> +++ gcc/expr.c	2013-05-06 13:41:03.274302405 +0200
> @@ -7561,6 +7561,15 @@ expand_expr_addr_expr_1 (tree exp, rtx t
>        inner = TREE_OPERAND (exp, 0);
>        break;
>  
> +    case COMPOUND_LITERAL_EXPR:
> +      /* Allow COMPOUND_LITERAL_EXPR in initializers, if e.g.
> +	 rtl_for_decl_init is called on DECL_INITIAL with
> +	 COMPOUNT_LITERAL_EXPRs in it, they aren't gimplified.  */
> +      if (modifier == EXPAND_INITIALIZER
> +	  && COMPOUND_LITERAL_EXPR_DECL (exp))
> +	return expand_expr_addr_expr_1 (COMPOUND_LITERAL_EXPR_DECL (exp),
> +					target, tmode, modifier, as);
> +      /* FALLTHRU */
>      default:
>        /* If the object is a DECL, then expand it for its rtl.  Don't bypass
>  	 expand_expr, as that can have various side effects; LABEL_DECLs for
> --- gcc/testsuite/gcc.dg/pr57184.c.jj	2013-05-06 13:42:12.514923650 +0200
> +++ gcc/testsuite/gcc.dg/pr57184.c	2013-05-06 13:41:55.000000000 +0200
> @@ -0,0 +1,13 @@
> +/* PR debug/57184 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -g" } */
> +
> +struct S {};
> +void bar (struct S *const);
> +static struct S *const c = &(struct S) {};
> +
> +void
> +foo (void)
> +{
> +  bar (c);
> +}
> 
> 	Jakub
> 
>

Patch

--- gcc/expr.c.jj	2013-05-03 14:55:04.000000000 +0200
+++ gcc/expr.c	2013-05-06 13:41:03.274302405 +0200
@@ -7561,6 +7561,15 @@  expand_expr_addr_expr_1 (tree exp, rtx t
       inner = TREE_OPERAND (exp, 0);
       break;
 
+    case COMPOUND_LITERAL_EXPR:
+      /* Allow COMPOUND_LITERAL_EXPR in initializers, if e.g.
+	 rtl_for_decl_init is called on DECL_INITIAL with
+	 COMPOUNT_LITERAL_EXPRs in it, they aren't gimplified.  */
+      if (modifier == EXPAND_INITIALIZER
+	  && COMPOUND_LITERAL_EXPR_DECL (exp))
+	return expand_expr_addr_expr_1 (COMPOUND_LITERAL_EXPR_DECL (exp),
+					target, tmode, modifier, as);
+      /* FALLTHRU */
     default:
       /* If the object is a DECL, then expand it for its rtl.  Don't bypass
 	 expand_expr, as that can have various side effects; LABEL_DECLs for
--- gcc/testsuite/gcc.dg/pr57184.c.jj	2013-05-06 13:42:12.514923650 +0200
+++ gcc/testsuite/gcc.dg/pr57184.c	2013-05-06 13:41:55.000000000 +0200
@@ -0,0 +1,13 @@ 
+/* PR debug/57184 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -g" } */
+
+struct S {};
+void bar (struct S *const);
+static struct S *const c = &(struct S) {};
+
+void
+foo (void)
+{
+  bar (c);
+}