The following program is taken from
http://home.comcast.net/%7Ekmbtib/Fortran_stuff/fire.f90

The is_g95 check returns T for g95 and NAG f95 and F for ifort 9.1 and sunf95.
I believe it should return TRUE by the standard.

Running the program through valgrind shows:
==317== Invalid read of size 1
==317==    at 0x41EC17: check_interface0 (interface.c:918)
==317==    by 0x41F88A: gfc_check_interfaces (interface.c:1086)
...
==317== Invalid read of size 8
==317==    at 0x41EC7E: check_interface0 (interface.c:920)
==317==    by 0x41F88A: gfc_check_interfaces (interface.c:1086)
......
fire2.f90:12.37:

            module procedure assign_t
                                    1
Error: Procedure 'assign_t' in intrinsic assignment operator at (1) is neither
function nor subroutine.

(Without using valgrind this crashes and gives an ICE -> ice-on-valid-code.)

If one changes the order of "is_g95" and "assign_t", no invalid read occurs but
the same error message is printed. (-> rejects-valid)

If one moves the interface from the subroutine to before the contains line, it
compiles and prints T. (-> good code; ifort still prints "F")

Please check afterwards whether also the big program "fire.f90" compiles and
runs.


! Based on:
! http://home.comcast.net/%7Ekmbtib/Fortran_stuff/fire.f90
module chk_g95
   implicit none
   type t
      integer x
   end type t
   contains
      function is_g95()
         logical is_g95
         interface assignment(=)
            module procedure assign_t
         end interface assignment(=)
         type(t) y(3)

         y%x = (/1,2,3/)
         y = y((/2,3,1/))
         is_g95 = y(3)%x == 1
      end function is_g95

      elemental subroutine assign_t(lhs,rhs)
         type(t), intent(in) :: rhs
         type(t), intent(out) :: lhs

         lhs%x = rhs%x
      end subroutine assign_t
end module chk_g95

program fire
   use chk_g95
   implicit none
   print *, is_g95()
   if(.not. is_g95()) call abort()
end program fire


-- 
           Summary: ICE with module procedure interface in a procedure body
           Product: gcc
           Version: 4.3.0
            Status: UNCONFIRMED
          Keywords: ice-on-valid-code, rejects-valid
          Severity: normal
          Priority: P3
         Component: fortran
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: burnus at gcc dot gnu dot org


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

Reply via email to