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

Dominique d'Humieres <dominiq at lps dot ens.fr> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |tkoenig at gcc dot gnu.org
          Component|lto                         |fortran

--- Comment #2 from Dominique d'Humieres <dominiq at lps dot ens.fr> ---
For the test

program test
   implicit none
   integer :: c(2), d(2)
   real, allocatable :: x(:,:)

   allocate(x(2,5))
   c = shape(x)
   d = shape(x,kind=4)
end

the result of the compilation with -fdump-tree-original is

...
    {
      struct array2_real(kind=4) * D.3443;
      struct array1_integer(kind=4) parm.1;

      parm.1.dtype = 265;
      parm.1.dim[0].lbound = 1;
      parm.1.dim[0].ubound = 2;
      parm.1.dim[0].stride = 1;
      parm.1.data = (void *) &c[0];
      parm.1.offset = -1;
      D.3443 = &x;
      _gfortran_shape_4 (&parm.1, D.3443);
    }
    {
      integer(kind=4) * D.3453;
      static integer(kind=4) C.3452 = 4;
      struct array2_real(kind=4) * D.3451;
      struct array1_integer(kind=4) parm.2;

      parm.2.dtype = 265;
      parm.2.dim[0].lbound = 1;
      parm.2.dim[0].ubound = 2;
      parm.2.dim[0].stride = 1;
      parm.2.data = (void *) &d[0];
      parm.2.offset = -1;
      D.3451 = &x;
      D.3453 = &C.3452;
      _gfortran_shape_4 (&parm.2, D.3451, D.3453);
    }
...

and -Wlto-type-mismatch seems right to complain that

_gfortran_shape_4 (&parm.2, D.3451, D.3453);

does not match

      _gfortran_shape_4 (&parm.1, D.3443);

I have tried to understand why using the optional 'kind' argument generates a
third argument (not needed as it is reflected by _gfortran_shape_x for kind=x).

Looking at libgfortran/generated/shape_i4.c I see that shape_4 expects only two
arguments. 

Looking at gcc/fortran/trans-intrinsic.c, I see

...
    case GFC_ISYM_SHAPE:
    case GFC_ISYM_SPREAD:
    case GFC_ISYM_YN2:
      /* Ignore absent optional parameters.  */
      return 1;
...

Am I correct to understand that it is intended to prevents the emission of the
optional argument? If yes, why is it not working (I lost the scent after that)?

Reply via email to