open-catalog icon indicating copy to clipboard operation
open-catalog copied to clipboard

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

Open RRiva opened this issue 1 year ago • 2 comments

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'

RRiva avatar Sep 24 '24 11:09 RRiva

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!

inaki-amatria avatar Sep 25 '24 11:09 inaki-amatria

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 😅

RRiva avatar Sep 25 '24 11:09 RRiva