------- Comment #4 from jvdelisle at gcc dot gnu dot org  2007-11-16 06:23 
-------
program test
 implicit none
 call sub(1)
 call sub()
contains
 subroutine sub(dimmy)
   integer, optional :: dimmy
   logical :: lotto(4)
   lotto = .false.
   lotto = cshift((/.true.,.true.,.true.,.true./),1,dimmy)
   print *, lotto
 end subroutine
end program test

After enabling the optional argument with -m32 -fdump-tree-original we get:

sub (dimmy)
{
  logical4 lotto[4];

  (void) __builtin_memset ((void *) &lotto, 0, 16);
  {
    int4 * D.515;
    static int4 C.514 = 1;
    struct array1_logical4 parm.2;
    static logical4 A.1[4] = {1, 1, 1, 1};
    struct array1_logical4 parm.0;

    parm.0.dtype = 273;
    parm.0.dim[0].lbound = 1;
    parm.0.dim[0].ubound = 4;
    parm.0.dim[0].stride = 1;
    parm.0.data = (void *) &lotto[0];
    parm.0.offset = -1;
    parm.2.dtype = 273;
    parm.2.dim[0].lbound = 1;
    parm.2.dim[0].ubound = 4;
    parm.2.dim[0].stride = 1;
    parm.2.data = (void *) &A.1[0];
    parm.2.offset = 0;
    D.515 = dimmy != 0B ? dimmy : 0B;
    _gfortran_cshift0_4 (&parm.0, &parm.2, &C.514, D.515);
  }
 and it works as expected.

With -m64 it obviously fails with the following:

sub (dimmy)
{
  logical4 lotto[4];

  (void) __builtin_memset ((void *) &lotto, 0, 16);
  {
    int4 D.874;
    static int4 C.873 = 1;
    struct array1_logical4 parm.2;
    static logical4 A.1[4] = {1, 1, 1, 1};
    struct array1_logical4 parm.0;

    parm.0.dtype = 273;
    parm.0.dim[0].lbound = 1;
    parm.0.dim[0].ubound = 4;
    parm.0.dim[0].stride = 1;
    parm.0.data = (void *) &lotto[0];
    parm.0.offset = -1;
    parm.2.dtype = 273;
    parm.2.dim[0].lbound = 1;
    parm.2.dim[0].ubound = 4;
    parm.2.dim[0].stride = 1;
    parm.2.data = (void *) &A.1[0];
    parm.2.offset = 0;
    D.874 = *dimmy;
    _gfortran_cshift0_4 (&parm.0, &parm.2, &C.873, &D.874);
  }


-- 


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

Reply via email to