The code

use iso_c_binding
integer, target :: i
type(c_ptr) :: bar
bar = c_loc(i)
end

produces:

  bar = c_loc (&i);

g95 produces:
  bar = &i;;
and NAG f95:
  bar_ = (char*) &i_;

Analogously for C_FUNPOINTER:
---------------
use iso_c_binding
interface
  subroutine bar() bind(c)
  end subroutine bar
end interface
type(c_funptr) :: fptr
fptr = c_funloc(bar)
end
---------------

gfortran:
  void * fptr;
  fptr = c_funloc (bar);
g95:
  void (*<T34>) (void) fptr;
  fptr = bar;;
NAG f95:
  typedef void * __NAGf90_MODULE_iso_c_binding_DT_c_ptr;
  typedef void (* __NAGf90_MODULE_iso_c_binding_DT_c_funptr)();
  auto __NAGf90_MODULE_iso_c_binding_DT_c_funptr fptr_;
  fptr_ = (void(*)())bar;


-- 
           Summary: [ISO Bind C] C_LOC/C_FUNLOC should not be library
                    functions
           Product: gcc
           Version: 4.3.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          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=32600

Reply via email to