------- Additional Comments From jsm28 at gcc dot gnu dot org  2004-10-28 16:35 -------
RTH suggested:

> If we must accept this construct because it might not be
> executed, a possible solution is to notice fallback==fb_lvalue
> for a CALL_EXPR in c_gimplify_expr and create a temporary for
> the call result, and which will also satisfy the lvalue.

c_gimplify_expr doesn't have the fallback information available.
gimplify_expr does (and there's already code specific to this
sort of thing in gimplify.c), but the obvious fix

+         if (fallback == fb_lvalue)
+           *expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);

just moves the ICE to expand_assignment (while changing the testcase
to insert an explicit temporary yields almost identical tree dumps
but without the ICE).

A related example

struct foo {char x, y, z[2];};
struct foo p, q; int r;
void bar(int baz)
{
  (r ? p : q).z[baz] = 1;
}

ICEs in 3.4 as well as on mainline (in expand_assignment in both cases);
a temporary is already created in gimplifying the COND_EXPR.

While if the non-lvalue structure is the result of an assignment, 3.4 ICEs
and mainline doesn't.

struct foo {char x, y, z[2];};
struct foo p, q;
void bar(int baz)
{
  (p = q).z[baz] = 1;
}


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17855

Reply via email to