fortran-lang / minpack

Modernized Minpack: for solving nonlinear equations and nonlinear least squares problems
https://fortran-lang.github.io/minpack/
Other
94 stars 20 forks source link

Compilation fails with ifx #58

Closed awvwgk closed 2 years ago

awvwgk commented 2 years ago

Seems like the Intel compiler can almost compile minpack, except for one of the examples

❯ ifx -V
Intel(R) Fortran Compiler for applications running on Intel(R) 64, Version 2022.0.0 Build 20211123
Copyright (C) 1985-2021 Intel Corporation. All rights reserved.
❯ fpm test --compiler ifx
minpack.f90                            done.
minpack_testing.f90                    done.
example_hybrd1.f90                     done.
example_lmdif1.f90                     done.
example_hybrd.f90                      done.
example_lmder1.f90                     done.
example_primes.f90                     failed.
test_chkder.f90                        done.
test_hybrd.f90                         done.
test_hybrj.f90                         done.
[  38%]Compiling...
examples/example_primes.f90: remark #5415: Feature not yet implemented: Some 'check' options temporarily disabled.
 #0 0x0000000001084382 (/opt/intel/oneapi/compiler/2022.0.2/linux/bin-llvm/xfortcom+0x1084382)
 #1 0x0000000001084356 (/opt/intel/oneapi/compiler/2022.0.2/linux/bin-llvm/xfortcom+0x1084356)
 #2 0x0000000000fdf5b6 (/opt/intel/oneapi/compiler/2022.0.2/linux/bin-llvm/xfortcom+0xfdf5b6)
 #3 0x000000000100082a (/opt/intel/oneapi/compiler/2022.0.2/linux/bin-llvm/xfortcom+0x100082a)
 #4 0x0000000000ffec51 (/opt/intel/oneapi/compiler/2022.0.2/linux/bin-llvm/xfortcom+0xffec51)
 #5 0x0000000000fe1e3d (/opt/intel/oneapi/compiler/2022.0.2/linux/bin-llvm/xfortcom+0xfe1e3d)
 #6 0x000000000105bc37 (/opt/intel/oneapi/compiler/2022.0.2/linux/bin-llvm/xfortcom+0x105bc37)
 #7 0x000000000105e391 (/opt/intel/oneapi/compiler/2022.0.2/linux/bin-llvm/xfortcom+0x105e391)
 #8 0x000000000105f5d8 (/opt/intel/oneapi/compiler/2022.0.2/linux/bin-llvm/xfortcom+0x105f5d8)
 #9 0x00000000010d1e75 (/opt/intel/oneapi/compiler/2022.0.2/linux/bin-llvm/xfortcom+0x10d1e75)
#10 0x00000000010cfae2 (/opt/intel/oneapi/compiler/2022.0.2/linux/bin-llvm/xfortcom+0x10cfae2)
#11 0x00000000010d01b2 (/opt/intel/oneapi/compiler/2022.0.2/linux/bin-llvm/xfortcom+0x10d01b2)
#12 0x00000000010cd9a2 (/opt/intel/oneapi/compiler/2022.0.2/linux/bin-llvm/xfortcom+0x10cd9a2)
#13 0x00000000010cfae2 (/opt/intel/oneapi/compiler/2022.0.2/linux/bin-llvm/xfortcom+0x10cfae2)
#14 0x00000000010cd05a (/opt/intel/oneapi/compiler/2022.0.2/linux/bin-llvm/xfortcom+0x10cd05a)
#15 0x00000000010cfae2 (/opt/intel/oneapi/compiler/2022.0.2/linux/bin-llvm/xfortcom+0x10cfae2)
#16 0x0000000000f9d436 (/opt/intel/oneapi/compiler/2022.0.2/linux/bin-llvm/xfortcom+0xf9d436)
#17 0x0000000000f9cb71 (/opt/intel/oneapi/compiler/2022.0.2/linux/bin-llvm/xfortcom+0xf9cb71)
#18 0x0000000001116541 (/opt/intel/oneapi/compiler/2022.0.2/linux/bin-llvm/xfortcom+0x1116541)
#19 0x00007fc61d475b25 __libc_start_main (/usr/lib/libc.so.6+0x27b25)
#20 0x0000000000de27a9 (/opt/intel/oneapi/compiler/2022.0.2/linux/bin-llvm/xfortcom+0xde27a9)

examples/example_primes.f90(31): error #5533: Feature found on this line is not yet supported in ifx
    function expr(x, pars) result(y)
-------------^
compilation aborted for examples/example_primes.f90 (code 3)
<ERROR> Compilation failed for object " examples_example_primes.f90.o "
<ERROR>stopping due to failed compilation
STOP 1

But passes with a small workaround

diff --git a/examples/example_primes.f90 b/examples/example_primes.f90
index c014bd3..57b2531 100644
--- a/examples/example_primes.f90
+++ b/examples/example_primes.f90
@@ -18,6 +18,14 @@ implicit none
 private
 public find_fit

+interface
+    function expr_interface(x, pars) result(y)
+    use types, only: dp
+    implicit none
+    real(dp), intent(in) :: x(:), pars(:)
+    real(dp) :: y(size(x))
+    end function
+end interface
 contains

 subroutine find_fit(data_x, data_y, expr, pars)
@@ -27,15 +35,8 @@ subroutine find_fit(data_x, data_y, expr, pars)
 ! array 'x'. The arrays 'data_x' and 'data_y' must have the same
 ! length.
 real(dp), intent(in) :: data_x(:), data_y(:)
-interface
-    function expr(x, pars) result(y)
-    use types, only: dp
-    implicit none
-    real(dp), intent(in) :: x(:), pars(:)
-    real(dp) :: y(size(x))
-    end function
-end interface
 real(dp), intent(inout) :: pars(:)
+procedure(expr_interface) :: expr

 real(dp) :: tol, fvec(size(data_x))
 integer :: iwa(size(pars)), info, m, n
awvwgk commented 2 years ago

This is resolved with the refactoring of the examples.