summaryrefslogtreecommitdiff
path: root/numpy/f2py
diff options
context:
space:
mode:
authorDamien Caliste <dcaliste@free.fr>2020-03-18 16:34:29 +0100
committerDamien Caliste <dcaliste@free.fr>2020-03-26 15:14:49 +0100
commit0198fcfd4143edf8ec23f2e028044e17c3c93368 (patch)
tree2a0c6345eb8a010bbd52cc17d264990695ba76ca /numpy/f2py
parent0b9b176dcef7f14f56dbd543c89e6da6c6b7b2e4 (diff)
downloadnumpy-0198fcfd4143edf8ec23f2e028044e17c3c93368.tar.gz
BUG: don't add 'public' or 'private' if the other one exists
Currently, setting 'public' or 'private' attribute is adding one even if the other one already exists because of the else: part that is always appending.
Diffstat (limited to 'numpy/f2py')
-rwxr-xr-xnumpy/f2py/crackfortran.py10
-rw-r--r--numpy/f2py/tests/test_crackfortran.py53
2 files changed, 59 insertions, 4 deletions
diff --git a/numpy/f2py/crackfortran.py b/numpy/f2py/crackfortran.py
index 894af3437..3d2f97a56 100755
--- a/numpy/f2py/crackfortran.py
+++ b/numpy/f2py/crackfortran.py
@@ -1749,10 +1749,12 @@ def setattrspec(decl, attr, force=0):
decl['attrspec'].append(attr)
elif attr == 'automatic' and 'static' not in decl['attrspec']:
decl['attrspec'].append(attr)
- elif attr == 'public' and 'private' not in decl['attrspec']:
- decl['attrspec'].append(attr)
- elif attr == 'private' and 'public' not in decl['attrspec']:
- decl['attrspec'].append(attr)
+ elif attr == 'public':
+ if 'private' not in decl['attrspec']:
+ decl['attrspec'].append(attr)
+ elif attr == 'private':
+ if 'public' not in decl['attrspec']:
+ decl['attrspec'].append(attr)
else:
decl['attrspec'].append(attr)
return decl
diff --git a/numpy/f2py/tests/test_crackfortran.py b/numpy/f2py/tests/test_crackfortran.py
index 18a1474b0..735804024 100644
--- a/numpy/f2py/tests/test_crackfortran.py
+++ b/numpy/f2py/tests/test_crackfortran.py
@@ -1,6 +1,9 @@
import numpy as np
from numpy.testing import assert_array_equal
from . import util
+from numpy.f2py import crackfortran
+import tempfile
+import textwrap
class TestNoSpace(util.F2PyTest):
@@ -33,3 +36,53 @@ class TestNoSpace(util.F2PyTest):
self.module.subc([w, k])
assert_array_equal(k, w + 1)
assert self.module.t0(23) == b'2'
+
+class TestPublicPrivate():
+ def test_defaultPrivate(self, tmp_path):
+ f_path = tmp_path / "mod.f90"
+ with f_path.open('w') as ff:
+ ff.write(textwrap.dedent("""\
+ module foo
+ private
+ integer :: a
+ public :: setA
+ integer :: b
+ contains
+ subroutine setA(v)
+ integer, intent(in) :: v
+ a = v
+ end subroutine setA
+ end module foo
+ """))
+ mod = crackfortran.crackfortran([str(f_path)])
+ assert len(mod) == 1
+ mod = mod[0]
+ assert 'private' in mod['vars']['a']['attrspec']
+ assert 'public' not in mod['vars']['a']['attrspec']
+ assert 'private' in mod['vars']['b']['attrspec']
+ assert 'public' not in mod['vars']['b']['attrspec']
+ assert 'private' not in mod['vars']['seta']['attrspec']
+ assert 'public' in mod['vars']['seta']['attrspec']
+
+ def test_defaultPublic(self, tmp_path):
+ f_path = tmp_path / "mod.f90"
+ with f_path.open('w') as ff:
+ ff.write(textwrap.dedent("""\
+ module foo
+ public
+ integer, private :: a
+ public :: setA
+ contains
+ subroutine setA(v)
+ integer, intent(in) :: v
+ a = v
+ end subroutine setA
+ end module foo
+ """))
+ mod = crackfortran.crackfortran([str(f_path)])
+ assert len(mod) == 1
+ mod = mod[0]
+ assert 'private' in mod['vars']['a']['attrspec']
+ assert 'public' not in mod['vars']['a']['attrspec']
+ assert 'private' not in mod['vars']['seta']['attrspec']
+ assert 'public' in mod['vars']['seta']['attrspec']