[Bug fortran/37829] Incorrect name mangling with iso_c_binding

jvdelisle at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Thu Jan 13 06:40:00 GMT 2011


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

Jerry DeLisle <jvdelisle at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jvdelisle at gcc dot
                   |                            |gnu.org
      Known to fail|                            |

--- Comment #16 from Jerry DeLisle <jvdelisle at gcc dot gnu.org> 2011-01-13 05:46:01 UTC ---
>From c.l.f James Van Buskirk; Elusive bug PR37829

That bug bugs me so bad and it's hard to reproduce, but I found a
trigger:

C:\gfortran\clf\opengl2>type bug1.f90
module m3
   use ISO_C_BINDING
   implicit none
   private

   public kill_C_PTR
   interface
      function kill_C_PTR() bind(C)
         import
         implicit none
         type(C_PTR) kill_C_PTR
      end function kill_C_PTR
   end interface

   public kill_C_FUNPTR
   interface
      function kill_C_FUNPTR() bind(C)
         import
         implicit none
         type(C_FUNPTR) kill_C_FUNPTR
      end function kill_C_FUNPTR
   end interface
end module m3

module m1
   use m3
end module m1

program X
   use m1
   use ISO_C_BINDING
   implicit none
   type(C_PTR) cp
   type(C_FUNPTR) fp
   integer(C_INT),target :: i
   interface
      function fun() bind(C)
         use ISO_C_BINDING
         implicit none
         real(C_FLOAT) fun
      end function fun
   end interface

   cp = C_NULL_PTR
   cp = C_LOC(i)
   fp = C_NULL_FUNPTR
   fp = C_FUNLOC(fun)
end program X

function fun() bind(C)
   use ISO_C_BINDING
   implicit none
   real(C_FLOAT) fun
   fun = 1.0
end function fun

function kill_C_PTR() bind(C)
   use ISO_C_BINDING
   implicit none
   type(C_PTR) kill_C_PTR
   integer(C_INT), pointer :: p
   allocate(p)
   kill_C_PTR = C_LOC(p)
end function kill_C_PTR

function kill_C_FUNPTR() bind(C)
   use ISO_C_BINDING
   implicit none
   type(C_FUNPTR) kill_C_FUNPTR
   interface
      function fun() bind(C)
         use ISO_C_BINDING
         implicit none
         real(C_FLOAT) fun
      end function fun
   end interface
   kill_C_FUNPTR = C_FUNLOC(fun)
end function kill_C_FUNPTR

C:\gfortran\clf\opengl2>gfortran bug1.f90 -obug1
bug1.f90:44.8:

   cp = C_NULL_PTR
        1
Error: Can't convert TYPE(_gfortran_iso_c_binding_c_ptr) to TYPE(c_ptr) at 
(1)
bug1.f90:45.8:

   cp = C_LOC(i)
        1
Error: Can't convert TYPE(_gfortran_iso_c_binding_c_ptr) to TYPE(c_ptr) at 
(1)
bug1.f90:46.8:

   fp = C_NULL_FUNPTR
        1
Error: Can't convert TYPE(_gfortran_iso_c_binding_c_funptr) to 
TYPE(c_funptr) at
 (1)
bug1.f90:47.8:

   fp = C_FUNLOC(fun)
        1
Error: Can't convert TYPE(_gfortran_iso_c_binding_c_funptr) to 
TYPE(c_funptr) at
 (1)
bug1.f90:63.16:

   kill_C_PTR = C_LOC(p)
                1
Error: Can't convert TYPE(_gfortran_iso_c_binding_c_ptr) to TYPE(c_ptr) at 
(1)
bug1.f90:77.19:

   kill_C_FUNPTR = C_FUNLOC(fun)
                   1
Error: Can't convert TYPE(_gfortran_iso_c_binding_c_funptr) to 
TYPE(c_funptr) at
 (1)

It's the use of a function with result of TYPE(C_PTR) that kills
C_PTR subsequently and similarly the function with a result of
TYPE(C_FUNPTR) kills off C_FUNPTR.  Abstract interfaces do the trick
as well as interfaces to realized functions.  Note that directly
USEing module m3 in program X above isn't sufficient to trigger the
bug: m3 needs to be USEd in intermediate module m1 which then is
USEd in program X.

It's hard to set this one off, but when you do, look out!  Note that
the last two failures occur in external functions that don't even
USE module m3 or m1 directly or indirectly, yet they still fall
victim once the compiler has come off the rails.



More information about the Gcc-bugs mailing list