8000 BUG,MAINT: `f2py` doesn't map `iso_c_binding` values by default · Issue #24553 · numpy/numpy · GitHub
[go: up one dir, main page]

Skip to content

BUG,MAINT: f2py doesn't map iso_c_binding values by default #24553

@HaoZeke

Description

@HaoZeke

Reproducer

Consider:

! isoc_oddity.f90
  module coddity
    use iso_c_binding, only: c_double
    implicit none
    contains
      subroutine c_add(a, b, c) bind(c, name="c_add")
        real(c_double), intent(in) :: a, b
        real(c_double), intent(out) :: c
        print*, "a is", a
        print*, "b is", b
        c = a + b
      end subroutine c_add
  end module coddity

Which compiles fine but doesn't do what one might expect:

python -m numpy.f2py -c isoc_oddity.f90 -m buggy
python -c 'import buggy;res=buggy.coddity.c_add(1, 2); print(f"res: {res}, exp: 3, eq: {res==3}")'
 a is   2.0000004731118679     
 b is   5.3049894774131808E-315
res: 1.0, exp: 3, eq: False

Clearly, c_double is not being interpreted correctly. This has an easy user-land fix though, adding an .f2py_f2cmap file to the directory (or passing a named file in via the command line) with the following:

# isoc_f2cmap
dict(
    real=dict(c_double="double"),
)

Will work correctly:

python -m numpy.f2py -c isoc_oddity.f90 -m buggy --f2cmap isoc_f2cmap
python -c 'import buggy;res=buggy.coddity.c_add(1, 2); print(f"res: {res}, exp: 3, eq: {res==3}")'
 a is   1.0000000000000000     
 b is   2.0000000000000000     
res: 3.0, exp: 3, eq: True

Suggestion

This is definitely unexpected behavior, iso_c_binding values should be mapped correctly by default, or atleast loaded in when the iso_c_binding module is used.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      0