Two gfortran bugs

John Harper John.Harper@msor.vuw.ac.nz
Wed Jul 4 23:38:00 GMT 2012


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.harper@vuw.ac.nz phone (+64)(4)463 5276 fax (+64)(4)463 5045



More information about the Gcc mailing list