http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50753
kargl at gcc dot gnu.org changed: What |Removed |Added ---------------------------------------------------------------------------- AssignedTo|unassigned at gcc dot |kargl at gcc dot gnu.org |gnu.org | --- Comment #1 from kargl at gcc dot gnu.org 2011-10-27 15:49:15 UTC --- (In reply to comment #0) > Found when checking PR fortran/50514: > > gfortran rejects: > > integer :: I, J > print *, dshiftl(z'FFF', J, (bit_size(j)+1)) > end > > with > Error: 'j' argument of 'dshiftl' intrinsic at (1) must > be the same type and kind as 'i' I think that this diagnostic is correct [1]. A BOZ is translated into an integer with the largest kind type parameter. On some systems that is INTEGER(8) and on others it is INTEGER(16). Neither is a default integer. On i686-*-freebsd, I get laptop:kargl[210] cat a.f90 integer(8) :: I, J print *, dshiftl(z'FFF', J, (bit_size(j)+1)) end laptop:kargl[211] gfc4x -o z a.f90 a.f90:2.31: print *, dshiftl(z'FFF', J, (bit_size(j)+1)) 1 Error: 'SHIFT' at (1) must be less than or equal to BIT_SIZE('I') So, the BOZ is accepted, and the error you were trying to generate is seen. > Expected: > a) The BOZ is accepted > b) There is a diagnostic as SHIFT is larger than BIT_SIZE(J). > > > The same applies to DSHIFTR. > > > From Fortran 2008's 13.7.50 DSHIFTL (I, J, SHIFT) > > "Arguments. > > I shall be of type integer or a boz-literal-constant. > J shall be of type integer or a boz-literal-constant. If both I and J are > of type integer, they shall have the same kind type parameter. I and J > shall not both be boz-literal-constants. > SHIFT shall be of type integer. It shall be nonnegative and less than > or equal to BIT SIZE (I) if I is of type integer; otherwise, it shall > be less than or equal to BIT SIZE (J)." > > Result Value. If either I or J is a boz-literal-constant, it is first > converted as if by the intrinsic function INT to type integer with the kind > type parameter of the other." [1] Crude, just read this part! OK, in gfc_check_dshift, one has if (same_type_check (i, 0, j, 1) == FAILURE) return FAILURE; which will need to be changed to do the conversion. The psuedo-code would be something like if (i_is_boz == true && j_is_boz == true) error else if (i_is_boz == true) convert boz to int convert int type to j type else if (j_is_boz == true) same as above with j <--> i else if (same_type == false) error. > * * * > > Additionally, the following is accepted but invalid: Only one BOZ is allowed: > > print *, dshiftl(z'FFF', z'AAA', 0) > end > > I am not sure whether it should be allowed with -std=gnu, but none of my > compilers diagnoses it correctly. (Well, except for ifort, which even rejects > the example of the Fortran 2008 standard.) Since this is new in F2008, I think gfortran should follow the standard; and, not allow this under -std=gnu. There is no need for backwards compatibility. -- steve