https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84778
kargl at gcc dot gnu.org changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |WAITING Last reconfirmed| |2018-03-09 CC| |kargl at gcc dot gnu.org Ever confirmed|0 |1 --- Comment #2 from kargl at gcc dot gnu.org --- (In reply to david.applegate from comment #0) > Pass a character "a" into a subroutine with an additional argument integer > "b" which specifies its length. This does not compile if integer "b" is > declared after character "a" in the subroutine. See below > > program test > > implicit none > integer, parameter :: b = 5 > character(len=b) :: a > > a = "hello" > > write(*,*)a//" from main program" > > call testsub(a,b) > > contains > > subroutine testsub(a,b) > > ! integer, intent(in) :: b ! if we put declaration of b here instead > it compiles ok > character(len=b), intent(in) :: a > integer, intent(in) :: b > > write(*,*)a//" from testsub" > > end subroutine testsub > end program test The gfortran gives % gfcx -o z m.f90 m.f90:16:18: character(len=b), intent(in) :: a 1 Error: Scalar INTEGER expression expected at (1) plus a few run on errors. The above error message is correct. The dummy argument 'b' in testsub prevents host associate, so when 'b' is used in the above statement it has no type and the implicit none prevents determining what type to use in the specification statement. F2003 explicitly states A variable in a specification expression shall have its type and type parameters, if any, specified by a previous declaration in the same scoping unit, by the implicit typing rules in effect for the scoping unit, or by host or use association. If a variable in a specification expression is typed by the implicit typing rules, its appearance in any subsequent type declaration statement shall confirm the implied type and type parameters.