fortran-lang / stdlib

Fortran Standard Library
https://stdlib.fortran-lang.org
MIT License
1.02k stars 161 forks source link

Nonstandard forward reference to 'lk' is not allowed in the same specification part causes compilation errors #810

Closed sscalpone closed 1 month ago

sscalpone commented 1 month ago

Description

There's some non-standard non-portable Fortran code at line 55569 of stdlib_linalg_lapack_s.fypp.

55569            logical(lk) :: lquery, upper
55570            integer(ilp) :: i, j, iinfo, lwmin, pn, pk, lk, ldt, ldw, lds2, lds1, ls2, ls1, lw, lt,&
55571                       tpos, wpos, s2pos, s1pos

Forward reference to 'lk' is not allowed in the same specification part. Some compilers will allow the use of 'lk' at line 55569 to reference the outer 'lk' and then from line 55570 onward use the 'lk' that is defined on line 55570.

Expected Behaviour

The code would compile. We see an error with XLF, NAG, and LLVM flang.

Version of stdlib

33559f551d1c7f22ea2511e4f7e779e2aed410c3

Platform and Architecture

Linux

Additional Information

In the following subroutines, I changed the local declaration and all uses of 'lk' to 'llk' and things compiled fine.

stdlib_linalg_lapack_c.fypp:36510:           integer(ilp) :: i, j, iinfo, lwmin, pn, pk, lk, ldt, ldw, lds2, lds1, ls2, ls1, lw, lt,&
stdlib_linalg_lapack_d.fypp:57095:           integer(ilp) :: i, j, iinfo, lwmin, pn, pk, lk, ldt, ldw, lds2, lds1, ls2, ls1, lw, lt,&
stdlib_linalg_lapack_q.fypp:72920:           integer(ilp) :: i, j, iinfo, lwmin, pn, pk, lk, ldt, ldw, lds2, lds1, ls2, ls1, lw, lt,&
stdlib_linalg_lapack_s.fypp:55570:           integer(ilp) :: i, j, iinfo, lwmin, pn, pk, lk, ldt, ldw, lds2, lds1, ls2, ls1, lw, lt,&
stdlib_linalg_lapack_w.fypp:28871:           integer(ilp) :: i, j, iinfo, lwmin, pn, pk, lk, ldt, ldw, lds2, lds1, ls2, ls1, lw, lt,&
stdlib_linalg_lapack_z.fypp:36925:           integer(ilp) :: i, j, iinfo, lwmin, pn, pk, lk, ldt, ldw, lds2, lds1, ls2, ls1, lw, lt,&
jvdp1 commented 1 month ago

@perazz Any idea what could be the problem? (I never use these compilers)

perazz commented 1 month ago

Sorry, I had not seen this issue. There is a variable in LAPACK that's named lk which is the same name as the library's logical kind:

https://github.com/fortran-lang/stdlib/blob/0a00ced88dc5a1b7b6c510ab3d9ca06d1ea1fa30/src/stdlib_kinds.fypp#L25

One solution is to rename either variable. Probably the integer variables in LAPACK, as I guess the logical kind is used elsewhere in stdlib

sscalpone commented 1 month ago

One solution is to rename either variable. Probably the integer variables in LAPACK, as I guess the logical kind is used elsewhere in stdlib

I renamed the local variable in six different files. This change allowed the files to compile.

jvdp1 commented 1 month ago

One solution is to rename either variable. Probably the integer variables in LAPACK, as I guess the logical kind is used elsewhere in stdlib

You could also "rename" inside the LAPACK module when importing it:

 use stdlib_kinds, only: stdlib_lk => lk, ...