jameskermode/f90wrap

unexpected removal of procedures associated with derived types

sunt05 opened this issue · 1 comments

sunt05 commented

Hi there,

In the recent update to 0.2.13, we were excited to see the support for procedures of derived types.
However, out trial encountered an error:

Traceback (most recent call last):
  File "/opt/homebrew/Caskroom/mambaforge/base/envs/suews-dev/lib/python3.9/site-packages/f90wrap/scripts/main.py", line 363, in main
    tree = tf.transform_to_generic_wrapper(tree,
  File "/opt/homebrew/Caskroom/mambaforge/base/envs/suews-dev/lib/python3.9/site-packages/f90wrap/transform.py", line 1343, in transform_to_generic_wrapper
    tree = remove_private_symbols(tree, force_public)
  File "/opt/homebrew/Caskroom/mambaforge/base/envs/suews-dev/lib/python3.9/site-packages/f90wrap/transform.py", line 226, in remove_private_symbols
    node = AccessUpdater(force_public).visit(node)
  File "/opt/homebrew/Caskroom/mambaforge/base/envs/suews-dev/lib/python3.9/site-packages/f90wrap/fortran.py", line 513, in visit
    result = visitor(node)
  File "/opt/homebrew/Caskroom/mambaforge/base/envs/suews-dev/lib/python3.9/site-packages/f90wrap/fortran.py", line 542, in generic_visit
    value = self.visit(value)
  File "/opt/homebrew/Caskroom/mambaforge/base/envs/suews-dev/lib/python3.9/site-packages/f90wrap/fortran.py", line 513, in visit
    result = visitor(node)
  File "/opt/homebrew/Caskroom/mambaforge/base/envs/suews-dev/lib/python3.9/site-packages/f90wrap/transform.py", line 103, in visit_Module
    mod = self.generic_visit(mod)
  File "/opt/homebrew/Caskroom/mambaforge/base/envs/suews-dev/lib/python3.9/site-packages/f90wrap/fortran.py", line 542, in generic_visit
    value = self.visit(value)
  File "/opt/homebrew/Caskroom/mambaforge/base/envs/suews-dev/lib/python3.9/site-packages/f90wrap/fortran.py", line 513, in visit
    result = visitor(node)
  File "/opt/homebrew/Caskroom/mambaforge/base/envs/suews-dev/lib/python3.9/site-packages/f90wrap/transform.py", line 146, in visit_Type
    binding_names = [b.procedures[0].name for b in node.bindings]
  File "/opt/homebrew/Caskroom/mambaforge/base/envs/suews-dev/lib/python3.9/site-packages/f90wrap/transform.py", line 146, in <listcomp>
    binding_names = [b.procedures[0].name for b in node.bindings]
IndexError: list index out of range
f90wrap: IndexError('list index out of range')

After looking into the source code, it seems the issue was caused by missing procedures of derived types.

Further investigation led me to the code below:

f90wrap/f90wrap/transform.py

Lines 1076 to 1079 in c6de284

def visit_Procedure(self, node):
if len(self.kept_subs) > 0:
if node not in self.kept_subs:
return None

which seems not to consider the the normalised names of the procedures belonging to derived types (e.g., procedureA__binding__moduleB) as the procedures with normalised names won't be included in the kept_subs list, leading to unintentional/accidental removal.

Sorry to be so slow this this - PR looks good, I'll go ahead and merge it and then close this isse.