codee-com / open-catalog

A collaborative effort to consolidate expert knowledge on code guidelines for the correctness, modernization, and optimization of code written in C, C++, and Fortran programming languages
https://open-catalog.codee.com/
Apache License 2.0
83 stars 9 forks source link

[Fortran] Replace `if (integer)` with `if (logical)` #38

Open RRiva opened 1 month ago

RRiva commented 1 month ago

In Fortran there is no equivalence between logical and integer variables, so 0 is not a replacement for .false., and 1 does not replace .true.. Yet, some compilers (ifort) will happily compile if (1).

Example:

if (0) write(*, *) 'Test is false'
if (1) write(*, *) 'Test is true'

A slightly more meaningful example

integer val
val = 1
if (val) write(*, *) 'Test is true'

This should be replaced by

integer val
val = 1
if (val > 0) write(*, *) 'Test is true'
inaki-amatria commented 1 month ago

Thank you so much for your valuable contribution!

Your example perfectly aligns with the broader efforts to modernize Fortran. And indeed, as you've pointed out, although these conditional expressions may not break compilation, they certainly lead to confusion and maintenance challenges.

We'd love for you to open a PR proposing a check for this in the Open Catalog. You can follow the guidance in #36 for adding new entries. Of course, if you'd prefer, just let us know, and we'll be happy to handle it!

RRiva commented 1 month ago

Thanks @inaki-amatria 🙂 I don't think that I've more time to work on this, so I'll be happy if you can take over. The same goes for the other issues that I've opened 😅