stfc / PSyclone

Domain-specific compiler and code transformation system for Finite Difference/Volume/Element Earth-system models in Fortran
BSD 3-Clause "New" or "Revised" License
104 stars 28 forks source link

[PSyIR FE] crash when an array of structures is accessed implicitly #2448

Open arporter opened 9 months ago

arporter commented 9 months ago

Running PSyclone on:

subroutine test()
  implicit none
  integer, parameter :: n = 10
  type :: field_type
    real, dimension(10) :: data
  end type field_type
  type(field_type) :: a, b(5)

  a%data(n) = 0.0
  b%data(n) = 1.0
  b(:)%data(n) = 2.0

end subroutine test

(i.e. b is an array of structures but is accessed without any indication that it is an array) results in a crash:

File "/home/kbc59144/Projects/PSyclone/src/psyclone/psyir/frontend/fparser2.py", line 3870, in _assignment_handler
  self.process_nodes(parent=assignment, nodes=[node.items[0]])
File "/home/kbc59144/Projects/PSyclone/src/psyclone/psyir/frontend/fparser2.py", line 2677, in process_nodes
  psy_child = self._create_child(child, parent)
File "/home/kbc59144/Projects/PSyclone/src/psyclone/psyir/frontend/fparser2.py", line 2740, in _create_child
  return handler(child, parent)
File "/home/kbc59144/Projects/PSyclone/src/psyclone/psyir/frontend/fparser2.py", line 3943, in _data_ref_handler
  new_ref = _create_struct_reference(
File "/home/kbc59144/Projects/PSyclone/src/psyclone/psyir/frontend/fparser2.py", line 986, in _create_struct_reference
  return base_ref.create(base_symbol, new_members, parent=parent)
File "/home/kbc59144/Projects/PSyclone/src/psyclone/psyir/nodes/structure_reference.py", line 129, in create
  return StructureReference.\
File "/home/kbc59144/Projects/PSyclone/src/psyclone/psyir/nodes/structure_reference.py", line 178, in _create
  raise TypeError(
TypeError: A StructureReference must refer to a symbol that is (or could be) a structure, however symbol 'b' has type 'Array<field_type: DataTypeSymbol, shape=[5]>'.
arporter commented 8 months ago

Hit this in vremap.f90 in NEMO when testing sea-ice branch.