Consider this code
a=1.
b=a*c
Print*,b
end
NO ERRORS, 1 WARNING [<main program> FTN95/Win32 v7.10.0]
Compiler says OK, go ahead, and the code produces its absurd result. Surprised?
Now let's add IMPLICIT NONE to it
implicit none
real a,b
a=1.
b=a*c
Print*,b
end
and we get what we must get, and error *** C must appear in a type declaration because IMPLICIT NONE has been used 1 ERROR, 1 WARNING [<main program> FTN95/Win32 v7.10.0] *** Compilation failed
IMPLICIT NONE, designed to get rid of implicit definitions of variables based on their first letter had two additional spurious consequences, positive and negative. The positive one is that compiler now finds static typos in the source at the compile time and issues an error mesage. Negative is that you need to declare every variable. Bad about last one is that if you do that in the module, then when you look at the code you have to jump into distantly placed module to see how specifically you declared everything including each and every index i,j,k...That becomes a hell when you make variables long but differ in few letters. By the time you get back and forth, you forget the variable 😃 doing that few times. And I am dead serious! With very large codes that is unacceptable, killing time and certainty and making huge inconvenience. And by the way, the integers and reals are given evils in Fortran, IMPLICIT NONE makes them all same faced, like males and females become of something middle.
I suspect that the absurdness of first example most probably has some strong backing by the Fortran Standard a la 'It is the used who has to take care of everything in his own code , not compiler' or 'if change that behavior this will break a lot of old codes' etc.
There exist an option in FTN95 to make all WARNINGs to become errors, but that is absolutely not acceptable with large codes, they have megabytes of different kind warnings.
To make all happy i suggest to add the compiler special switch which will oblige compiler to declare an error on every statically undefined variable it finds at compilation time like the C variable above. May be this option exists already hiddenly ?
Then we will get best of all worlds by checking static and dynamic errors (with /undef) forgetting forever annoying error-prone IMPLICIT NONE