My program testpublic5.f90 (see below) when compiled with -std=f95
using gfortran version 4.8.0 20120701 (experimental) (GCC)
reveals two compiler bugs, giving an unjustified warning and failing
to mention that the program violates an f95 constraint. It compiles
and runs with -std=f95 the same way as with -std=f2003
1. Gfortran warns that the declaration character name*63 is obsolescent,
but it is not. Character*63 name would be obsolescent, of course.
(You will notice that the program contains several declarations of that
nature, but only the one in the declaration of a derived type triggers
the warning.)
2. The f95 constraint is that a function returning a private type must
not have a public generic identifier. That constraint is not in f2003.
ayley[~/Jfh] % cat testpublic5.f90
! Bad f95 (forbidden by 3rd constraint after R523 that functions of
! private type [e.g. namekindlen] can't have public generic identifiers
! [e.g. attributes].) The constraint does not apply to the private
! function chstring with the public generic identifier string because
! neither its argument nor its function value is of private type.
! Good f2003/2008.
!
module whattype
private
public properties,attributes
interface attributes
module procedure namekindlen
end interface attributes
interface properties
module procedure charprops
end interface properties
type charints
character name*63 ! Max length of a name in f2003
integer sort
integer leng
end type charints
contains
pure function namekindlen(string)
type(charints) namekindlen
character(*),intent(in):: string
namekindlen = charints(string,kind(string),len(string))
end function namekindlen
pure integer function ilen(i) ! Minimum space to write integer i
integer,intent(in):: i
character str*(range(i)+3)
write(str,"(I0,A)") i,'?'
ilen = index(str,'?')-1
end function ilen
pure function charprops(s) result( answer)
character,intent(in)::s*(*)
character(len(s)+ilen(kind(s))+ilen(len(s))+32) answer
type(charints) nkl
nkl = attributes(s)
write(answer,"(2(A,I0))") '"'//nkl%name(1:len(s))//'"'// &
' is type character, kind ',nkl%sort,' len ',nkl%leng
end function charprops
end module whattype
program testpublic
use whattype
character,parameter:: stuff*(*) = 'foobar '
print "(A)",properties(stuff)
end program testpublic
cayley[~/Jfh] %
cayley[~/Jfh] % alias gf
/local/scratch/gf/bin/gfortran
cayley[~/Jfh] % gf -v
Using built-in specs.
COLLECT_GCC=/local/scratch/gf/bin/gfortran
COLLECT_LTO_WRAPPER=/local/scratch/gf/libexec/gcc/i686-pc-linux-gnu/4.8.0/lto-wrapper
Target: i686-pc-linux-gnu
Configured with: /local/scratch/gcc-4.8-20120701/configure
--prefix=/local/scratch/gf --enable-languages=c,fortran --disable-libada
--with-local-prefix=/local/scratch --with-gmp=/local/scratch
Thread model: posix
gcc version 4.8.0 20120701 (experimental) (GCC)
cayley[~/Jfh] %
cayley[~/Jfh] % gf -std=f95 testpublic5.f90
testpublic5.f90:18.22:
character name*63 ! Max length of a name in f2003
1
Warning: Obsolescent feature: Old-style character length at (1)
cayley[~/Jfh] % ./a.out
"foobar " is type character, kind 1 len 8
cayley[~/Jfh] %
-- John Harper, School of Mathematics Statistics and Operations Research
Victoria University, PO Box 600, Wellington 6140, New Zealand
e-mail john.har...@vuw.ac.nz phone (+64)(4)463 5276 fax (+64)(4)463 5045