------- Comment #2 from burnus at gcc dot gnu dot org  2008-07-31 11:14 -------
> subroutine test2 (n, arr)
>   integer :: arr(n), n
> end subroutine test2

That example is valid as "n" is then implicitly typed as integer, which is
later confirmed. It only becomes invalid using:

  implicit none
or
  implicit real(a-z)

Note: Code such as
   subroutine sub(n,array)
     implicit none
     real    :: array(n)
     integer :: n
   end
can be found in several real-world codes. Such declarations should be allowed,
unless -std=* is given. (It is e.g. allowed by gfortran, ifort, sunf95,
g95,...; but not by NAG f95. I think those compilers which allow it also do not
warn with -std=*.)

> where in test2, reversing the order of the definition of arr(n) and n should
> make it work again.  Did I understand this correctly?

Yes (with above's implicit statements).

Another example, which works with gfortran, but is rejected by other compilers:

ifort:
hjf.f90(5): error #6361: An array-valued argument is required in this context. 
 [SIZE]
  integer :: b(size(a)), a(:)
--------------------^
hjf.f90(5): error #6435: This name has already been used in a specification
expression.   [A]
  integer :: b(size(a)), a(:)
-------------------------^

NAG: Error: line 3: SIZE of A used before its array declarator

g95: Error: Argument of SIZE intrinsic at (1) must be an array

(gfortran compiles and gives the expected result.)


subroutine sub(a)
   implicit none
   real    :: b(size(a)), a(:)
end

I think on should be able to do something like you proposed, but with -std=gnu
the above mentioned
  integer :: arr(n)
  integer :: n
should be still permitted (but it should be rejected with -std=f*).
See also: PR 34228.

In any case, for the example given in comment 0 we need to give an error (as
ifort or g95) or we need to get it working properly (as NAG f95) does. The
former solution seems to be cleaner and easier.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32095

Reply via email to