http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58498
            Bug ID: 58498
           Summary: Bogus "Invalid kind for INTEGER"
           Product: gcc
           Version: 4.9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: janus at gcc dot gnu.org

Reported by James van Buskirk at
https://groups.google.com/forum/?fromgroups#!topic/comp.lang.fortran/hb2_DNa5ylY

Considering the (supposedly valid) code:


module intkinds
   implicit none
   private
   integer, parameter :: Kmax = 10
   integer, parameter :: K1 = selected_int_kind(1)
   integer, parameter :: tK2 = selected_int_kind(range(0_K1)+1)
   integer, parameter :: cK2 = (sign(1,tK2)+1)/2
   integer, parameter :: K2 = cK2*tK2+(1-cK2)*K1
   integer, parameter :: tK3 = selected_int_kind(range(0_K2)+1)
   integer, parameter :: cK3 = (sign(1,tK3)+1)/2
   integer, parameter :: K3 = cK3*tK3+(1-cK3)*K2
   integer, parameter :: tK4 = selected_int_kind(range(0_K3)+1)
   integer, parameter :: cK4 = (sign(1,tK4)+1)/2
   integer, parameter :: K4 = cK4*tK4+(1-cK4)*K3
   integer, parameter :: tK5 = selected_int_kind(range(0_K4)+1)
   integer, parameter :: cK5 = (sign(1,tK5)+1)/2
   integer, parameter :: K5 = cK5*tK5+(1-cK5)*K4
   integer, parameter :: tK6 = selected_int_kind(range(0_K5)+1)
   integer, parameter :: cK6 = (sign(1,tK6)+1)/2
   integer, parameter :: K6 = cK6*tK6+(1-cK6)*K5
   integer, parameter :: tK7 = selected_int_kind(range(0_K6)+1)
   integer, parameter :: cK7 = (sign(1,tK7)+1)/2
   integer, parameter :: K7 = cK7*tK7+(1-cK7)*K6
   integer, parameter :: tK8 = selected_int_kind(range(0_K7)+1)
   integer, parameter :: cK8 = (sign(1,tK8)+1)/2
   integer, parameter :: K8 = cK8*tK8+(1-cK8)*K7
   integer, parameter :: tK9 = selected_int_kind(range(0_K8)+1)
   integer, parameter :: cK9 = (sign(1,tK9)+1)/2
   integer, parameter :: K9 = cK9*tK9+(1-cK9)*K8
   integer, parameter :: tK10 = selected_int_kind(range(0_K9)+1)
   integer, parameter :: cK10 = (sign(1,tK10)+1)/2
   integer, parameter :: K10 = cK10*tK10+(1-cK10)*K9
   integer, parameter :: iKsize = 1+cK2+cK3+cK4+cK5+cK6+cK7+cK8+cK9+cK10
   integer, parameter :: tKINDS(Kmax) = (/K1,K2,K3,K4,K5,K6,K7,K8,K9,K10/)
   integer, parameter, public :: iKINDS(iKsize) = tKINDS(1:iKsize)
end module intkinds

program testme
   use intkinds
   implicit none
   integer iRANGES(size(iKINDS))
   integer i

   iRANGES = (/(range(int(0,iKINDS(i))),i=1,size(iKINDS))/)
   write(*,*) 'iKINDS = ',iKINDS
   write(*,*) 'iRANGES = ', iRANGES
end program testme  


This is rejected by gfortran 4.7 and earlier with:

   iRANGES = (/(range(int(0,iKINDS(i))),i=1,size(iKINDS))/)
                            1
Error: 'kind' argument of 'int' intrinsic at (1) must be a constant


4.8 and trunk report:

   iRANGES = (/(range(int(0,iKINDS(i))),i=1,size(iKINDS))/)
                            1
Error: Invalid kind for INTEGER at (1)


Both errors are apparently wrong, since the KIND argument to the intrinsic INT
shall be a scalar integer initialization expression, which it seems to be in
this case (for further details and standard quotes see the c.l.f. thread).

Reply via email to