------- 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