swig-fortran / swig

This fork of SWIG creates Fortran wrapper code from C++ headers.
http://www.swig.org
Other
42 stars 11 forks source link

Fix XL compiler errors, ignore others #149

Closed sethrj closed 4 years ago

sethrj commented 4 years ago

Fixed: string conversion type consistency, where one was C_CHAR and another the default type.

1516-044 (S) A conversion from type unknown is not permitted.

Fixed: arrays_global_twodim.cpptest, where the runme program name was an unintentional duplicate of the module name


Not fixed: imports.multicpptest, where a function name is the same in the parent and daughter modules, causing a name collision. SWIG doesn't call the functionHandler class in import mode, so unlike the classHandler it doesn't do any symbol definitions in the target code.

"imports_b.f90", line 45.12: 1513-100 (S) Generic name global_test is the same name as an accessible module procedure. Use a MODULE PROCEDURE statement to make name generic.

Compiler bug: multi_import_a.f90 where it's ignoring the swigclasswrapper type presumably because the imported upstream module had a private class of the same name.

"multi_import_a.f90", line 40.27: 1514-084 (S) Identifier farg1 is being declared with type name swigclasswrapper which has not been defined in a derived type definition.

Compiler bug: problems with same-name module procedures and generic, nopass bound procedures:

"overload_template.f90", line 48.21: 1514-699 (S) Procedure "swigf_a_foo__swig_0" must have a nonoptional dummy argument that corresponds by position in the argument list to a dummy argument not present in procedure "swigf_foo__swig_3", present and type incompatible, present with different kind type parameters, or present with a different rank.

Reproduced this error with:

module poop
 implicit none
 type, public :: A
 contains
  procedure, private, nopass :: a_foo_1
  procedure, private, nopass :: a_foo_2
  generic :: foo => a_foo_1, a_foo_2
 end type A

 interface foo
  module procedure foo_1, foo_2
 end interface
contains

function foo_1(x) result(y)
  integer, intent(in) :: x
  integer :: y
  y = x
end function
function foo_2(x) result(y)
  real, intent(in) :: x
  real :: y
  y = x
end function

function a_foo_1() result(y)
  integer :: y
  y = 10
end function
function a_foo_2(x) result(y)
  real, intent(in) :: x
  real :: y
  y = x
end function
end module