[Bug fortran/50069] FORALL fails on a character array

dominiq at lps dot ens.fr gcc-bugzilla@gcc.gnu.org
Tue Nov 8 15:04:00 GMT 2016


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=50069

--- Comment #10 from Dominique d'Humieres <dominiq at lps dot ens.fr> ---
> The attached patch adds a slight variation of Tobias Burnus's patch
> for 50069 to my patch for 55086, and it seems to fix the two tests in 50069.

I have applied the patch without the last hunk. It fixes the first test by
supplying the needed temporary. However compiling the test (variant of the test
in comment 6)

function  reverse(string) ! bind(c, name='reverse')
implicit none
character(len=*), intent(in) :: string
character(len=:),allocatable :: reverse
integer :: i
reverse = string
forall (i=1:len(reverse)) reverse(i:i) =
reverse(len(reverse)-i+1:len(reverse)-i+1)
end function reverse

still gives an ICE

 forall (i=1:len(reverse)) reverse(i:i) =
reverse(len(reverse)-i+1:len(reverse)-i+1)

internal compiler error: in gfc_conv_variable, at fortran/trans-expr.c:2550

The patch also fixes the ICE for the test reduced test from pr55086

  implicit none
  character(len=5), pointer :: c, d
  allocate (c, d)

  d = '12345'
  c = "abcde"

  call test2p (d, c)
  print *, d
  if (d /= '1cb15') stop 'WRONG'

contains
 subroutine test2p(o, i)
  character(len=*), pointer :: o, i
  integer :: nl1, nu1
  integer :: i1
  nl1 = 2
  nu1 = 4
  forall (i1 = nl1:nu1) o(i1:i1) = i(i1:i1)   ! <<<< ICE
  forall (i1 = nl1:nu1) o(i1:i1) = o(nu1+1-i1:nu1+1-i1)
 end subroutine test2p
end

but at the expense of an unneeded temporary:

  {
    integer(kind=4) i1.0;
    integer(kind=4) D.3446;
    integer(kind=8) count1.1;
    integer(kind=8) num.2;
    character(kind=1)[0:][1:1] * temp.4;
    void * restrict D.3452;

    D.3446 = nu1;
    count1.1 = 0;
    num.2 = 0;
    {
      integer(kind=4) count.3;

      i1.0 = nl1;
      count.3 = (1 - nl1) + nu1;
      while (1)
        {
          if (count.3 <= 0) goto L.1;
          num.2 = num.2 + 1;
          i1.0 = i1.0 + 1;
          count.3 = count.3 + -1;
        }
      L.1:;
    }
    D.3452 = (void * restrict) __builtin_malloc (MAX_EXPR <(unsigned long)
num.2, 1>);
    temp.4 = (character(kind=1)[0:][1:1] *) D.3452;
    {
      integer(kind=4) count.5;

      i1.0 = nl1;
      count.5 = (1 - nl1) + nu1;
      while (1)
        {
          if (count.5 <= 0) goto L.2;
          (*temp.4)[count1.1][1]{lb: 1 sz: 1} = (**i)[i1.0]{lb: 1 sz: 1};
          count1.1 = count1.1 + 1;
          i1.0 = i1.0 + 1;
          count.5 = count.5 + -1;
        }
      L.2:;
    }
    count1.1 = 0;
    {
      integer(kind=4) count.6;

      i1.0 = nl1;
      count.6 = (1 - nl1) + nu1;
      while (1)
        {
          if (count.6 <= 0) goto L.3;
          (**o)[i1.0]{lb: 1 sz: 1} = (*temp.4)[count1.1][1]{lb: 1 sz: 1};
          count1.1 = count1.1 + 1;
          i1.0 = i1.0 + 1;
          count.6 = count.6 + -1;
        }
      L.3:;
    }
    __builtin_free ((void *) temp.4);
  }


More information about the Gcc-bugs mailing list