[Bug fortran/35830] ICE with PROCEDURE(<interface>) containing array formal arguments

burnus at gcc dot gnu dot org gcc-bugzilla@gcc.gnu.org
Sat Apr 5 14:57:00 GMT 2008



------- Comment #1 from burnus at gcc dot gnu dot org  2008-04-05 14:56 -------
(Problem was found when creating PR 35831.)

Janus, do you have time to look at it?

The invalid read happens for in gfc_is_nodesc_array. The problem is that
sym->attr.dimension == 1, sym->dummy == 1 but sym->as == NULL. This of cause
fails for:
      if (sym->as->type != AS_ASSUMED_SHAPE)
Hereby, sym->name is the dummy argument "a".

First attempt of solving. This gets past the ICE, but the produced code which
gives wrong results.
----------------------
--- symbol.c    (revision 133937)
+++ symbol.c    (working copy)
@@ -3626,5 +3643,6 @@ add_proc_interface (gfc_symbol *sym, ifs
    args based on the args of a given named interface.  */

-void copy_formal_args (gfc_symbol *dest, gfc_symbol *src)
+void
+copy_formal_args (gfc_symbol *dest, gfc_symbol *src)
 {
   gfc_formal_arglist *head = NULL;
@@ -3649,4 +3667,5 @@ void copy_formal_args (gfc_symbol *dest,
       formal_arg->sym->attr = curr_arg->sym->attr;
       formal_arg->sym->ts = curr_arg->sym->ts;
+      formal_arg->sym->as = curr_arg->sym->as;

       /* If this isn't the first arg, set up the next ptr.  For the
----------------------

That the result is wrong can be seen with the following program. ubound of the
array is 32 instead of 3:
----------------------
module m
contains
  subroutine one(a)
      integer a(:)
      print *, lbound(a), ubound(a), size(a)
      if ((lbound(a,dim=1) /= 1) .or. (ubound(a,dim=1) /= 3)) &
        call abort()
      print *, a
      if (any(a /= [1,2,3])) call abort()
  end subroutine one
end module m

program test
  use m
  implicit none
  call foo(one)
contains
  subroutine foo(f)
    ! The following interface block is needed
    ! for NAG f95 as it wrongly does not like
    ! use-associated interfaces for PROCEDURE
    ! (It is not needed for gfortran)
    interface
      subroutine one(a)
        integer a(:)
      end subroutine
    end interface
    procedure(one) :: f
    call f([1,2,3])
  end subroutine foo
end program test


-- 

burnus at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jaydub66 at gmail dot com
           Keywords|                            |wrong-code
            Summary|ICE with                    |ICE with
                   |PROCEDURE(<interface>)      |PROCEDURE(<interface>)
                   |                            |containing array formal
                   |                            |arguments


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



More information about the Gcc-bugs mailing list