------- Comment #5 from rguenth at gcc dot gnu dot org  2007-11-18 13:53 -------
Hm, this is an unlucky case because of the way fold_stmt works.  What we have
is
(even more simplified):

void prepare_s(const char *fmt)
{
  char ** f = (char **)&fmt;
  *f = 0;
}

where it is not hard to see that for the store we can substitute

  fmt = 0;

as a char * rhs can be trivially converted to a const char * lhs.

Now what happens is that forwprop decides for this reason that a
propagation of (char **)&fmt is worthwhile and asks fold_stmt_in_place
to fold

  *(char **)&fmt = 0;

now the path goes through maybe_fold_stmt_indirect which only strips
same-type conversions (STRIP_TYPE_NOPS) and so fails to dispatch to
maybe_fold_offset_to_reference.  Now, if we strip the conversion in
forwprop already then in turn maybe_fold_offset_to_reference fails to
do the conversion because it (even while it would strip all conversions)
asks if the conversion from const char * to char * is useless (which
it is not) and refuses to do the trivial folding.


-- 


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

Reply via email to