[Fortran-Experiments]: patch

Christopher D. Rickett crickett@lanl.gov
Tue Mar 6 17:55:00 GMT 2007


hi Tobias,

> * * *
>
> Request for comments:
> As a mere user of Fortran 2003 code (such as F03GL), I'm overwhelmed by
> "[variable] may not be C interoperable" warnings. Compiling F03GL:
> | $ gfortran -c -fno-range-check OpenGL_glut.f90 2>&1 |wc -l
> | 65
> However, as programmer of Fortran 2003 code, I really like these warnings.
>
> Of cause, in both cases I usually run "gfortran" without further options.
> Nonetheless, I'm thinking of only showing these warnings with -std=f2003
> or -pedantic or -Wall, but not by default. Comments, suggestions?
>

i've been considering this too and have added a function 
(gfc_check_any_c_kind) that basically will ignore the warning if it finds 
any C kind that interops.  this new function could be used to issue an 
ERROR if no C kind is found to interop, and a warning if the user wishes 
pedantic or something along those lines.  i personally think the warnings 
are useful in cases were a single fortran type/kind can interop with 
multiple C types but having the warnings on by default is probably too 
much.

> * * *
>
> With F03GL I actually found two errors in the current Bind(C)
> implementation:
>
> The following code is valid, but gfortran prints
> "CHARACTER argument 'empty_string' to 'c_loc' must have a length of 1".
> The string length is not specified and thus one. (Note: Character arrays
> are allowed, independent of their size/dimension [they need to have a
> target attribute, though]; for pointers: only pointers to scalars are
> allowed - or one chooses one element of a pointer array (-> pointer
> target, no longer a pointer).)
> -----------------
>
> module x
> use iso_c_binding
> contains
> SUBROUTINE glutInit_f03()
>  TYPE(C_PTR), DIMENSION(1), TARGET :: argv=C_NULL_PTR
>  CHARACTER(C_CHAR), DIMENSION(1), TARGET :: empty_string=C_NULL_CHAR
>  argv(1)=C_LOC(empty_string)
> END SUBROUTINE
> end module x
>

this has been fixed.  the issue was that i simply had not finished 
implementing the scalar expression check that looks into the size of an 
array if given the whole array.  in my copy, this is happily accepted.  i 
have made a new test case out of this code.

> Gfortran produces an internal compiler error for the following code. The
> reason is (I think) the bind-label checking:
> -----------------
>
>        subroutine display() bind(c)
>        implicit none
>        end
>
>        program main
>        implicit none
>        interface
>          subroutine display() bind(c)
>          end subroutine display
>        end interface
>        end
>
> -----------------

this was a simple fix in the binding label checking.  this is now happily 
accepted with no ICE.  thanks for the bug reports.

> Not related to F03GL: The error checking of the "func" argument yields a
> bogus error message:
> "Variable 'glutcreatemenu' at (1) may not be a C interoperable kind but
> it is bind(c)"
> The correct error would use "Variable 'func'...". Therefore, it seems as
> if the error message is printed twice for 'glutcreatemenu' and missing
> for 'func' at:
> -----------------
>
> ! Warning printed twice:
> ! Variable 'glutcreatemenu' at (1) may not be a C interoperable kind but it is bind(c)
> MODULE OpenGL_glut
> IMPLICIT NONE
> INTERFACE
>  FUNCTION glutCreateMenu(func) BIND(C,NAME="glutCreateMenu")
>    use iso_c_binding
>    INTEGER :: glutCreateMenu ! <<<< two warnings
>    INTERFACE
>      SUBROUTINE func()! <<<<<< no warning
>      END SUBROUTINE func
>    END INTERFACE
>  END FUNCTION glutCreateMenu
> END INTERFACE
> END MODULE OpenGL_glut
>
> -----------------

i'll look into why it's being duplicated and why the warning for func is 
not printed.  should be a simple fix.

>
> Other missing parts encountered when trying the Bind C examples:
> - c_f_procpointer is missing for CP2K; one needs to implement procedural
> pointers first (no PR)
> - F03 interface to pthreads: Fails due to a bug in IMPORT, PR30922
> - F03GL has to be modified slightly as the storage equivalence of
> character arrays and character strings is not properly honoured in
> gfortran, PR 30940.
>
>
> Question to Chris:
> In http://gcc.gnu.org/ml/fortran/2007-02/msg00558.html you wrote:
> "on my list of things to do yet for iso_c_binding, i have:
> "1) add versions of c_f_pointer for complex type/kind combos"
>
> Is this finished or what remains to do there?

i haven't started.  i should probably get my patch for c_ptr/c_funptr 
committed before this work so whoever implements these can follow what's 
currently done in iso_c_*.

thanks for the feedback.
Chris



More information about the Fortran mailing list