------- Comment #3 from pault at gcc dot gnu dot org  2008-03-26 21:38 -------

> If I would hazard a guess, something is going wrong in
> trans-expr.c(gfc_trans_string_copy), where LEN=1 is treated separately.

Yes, this is correct.  In this particular case, we have:

lhs => (void *) &(*(character(kind=1)[0:][1:1] *) atmp.4.data)[S.5]
rhs => (void *) &(*tda1l.0)[(S.5 + 1) * D.590 + D.578].c[1]{lb: 1 sz: 1}

which will clearly run afoul of the check in trans.c.  Rather than mess around
casting and uncasting the rhs, which I know from experience is a pain in the
posterior, I propose the following:

Index: gcc/fortran/trans-expr.c
===================================================================
*** gcc/fortran/trans-expr.c    (revision 133278)
--- gcc/fortran/trans-expr.c    (working copy)
***************
*** 2857,2864 ****
    if (dlength != NULL_TREE && POINTER_TYPE_P (TREE_TYPE (dest)))
      dsc = gfc_to_single_character (dlen, dest);

!
!   if (dsc != NULL_TREE && ssc != NULL_TREE)
      {
        gfc_add_modify_expr (block, dsc, ssc);
        return;
--- 2840,2848 ----
    if (dlength != NULL_TREE && POINTER_TYPE_P (TREE_TYPE (dest)))
      dsc = gfc_to_single_character (dlen, dest);

!   /* Assign directly if the types are compatible.  */
!   if (dsc != NULL_TREE && ssc != NULL_TREE
!       && TREE_TYPE (dsc) == TREE_TYPE (ssc))
      {
        gfc_add_modify_expr (block, dsc, ssc);
        return;

It does not produce the most efficient code for this case but is guaranteed to
work.  This has just gone on to regtest.

Paul


-- 


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

Reply via email to