This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: zero sized initializers with side effects discarded



On Sep 9, 2005, at 8:30 AM, Olivier Hainque wrote:


Hello,

I have been experimenting with a simple patch adding side effects
checks to the conditions, like "! TREE_SIDE_EFFECTS (value)"
in init_ctor_eval

Yes the one in needs to gimplify only the expression as a statement and not add a modify statement. More on the testcase later.


and "! TREE_SIDE_EFFECTS (*from_p)" in modify_expr.

You should not need the check in modify_expr as the side effects are
never mishandled as we always will add the lhs and rhs to the
instruction stream:
/* For zero sized types only gimplify the left hand side and right hand side
as statements and throw away the assignment. */
if (zero_sized_type (TREE_TYPE (*from_p)))
{
gimplify_stmt (from_p);
gimplify_stmt (to_p);
append_to_statement_list (*from_p, pre_p);
append_to_statement_list (*to_p, pre_p);
*expr_p = NULL_TREE;
return GS_ALL_DONE;
}


I already made sure of that because it was ran into with
some of the vararg testcases on some targets.


Now back to init_ctor_eval. Here is a testcase which should pass: struct g{}; char y[3]; char *f = &y[0]; char *ff = &y[0]; struct h{struct g hhh; struct g hhh1;}; void h(void) { struct g t; struct h t1 = {*((struct g*)(f++)), *((struct g*)(ff++))}; }

void abort (void);

int main(void)
{
  h();
  if (f != &y[1])
    abort();
  if (ff != &y[1])
    abort();
  return 0;
}

And it does for 2.95.3 but does not from 3.0.4 and up. It looks
like the front-end or somewhere else is messing it up before even getting
to gimplifier. Also the ff test is actually working correctly too even
in 4.1.0 so I really doubt that init_ctor_eval is wrong any more.
If you want me to file a bug, I can, I can also look into the issue some
too and figure out where the f++ is going to. Note if we change struct g
to be a non zero sized struct, it works.


-- Pinski


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]