https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81509

Dominique d'Humieres <dominiq at lps dot ens.fr> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Priority|P3                          |P5
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2017-07-26
     Ever confirmed|0                           |1
           Severity|normal                      |enhancement

--- Comment #3 from Dominique d'Humieres <dominiq at lps dot ens.fr> ---
(1) Work around: wrap the boz-literal-constant inside an INT, e.g.,

program p
  implicit none
  write(*,*) iand(int(z'1A2B3C4D' ),3), iand(8, int(z'1A2B3C4D' ))
  write(*,*)  ior(int(z'1A2B3C4D' ),3),  ior(8, int(z'1A2B3C4D' ))
  write(*,*) ieor(int(z'1A2B3C4D' ),3), ieor(8, int(z'1A2B3C4D' ))

  write(*,*) iand(int(o'123456'   ),4), iand(7, int(o'123456'   ))
  write(*,*)  ior(int(o'123456'   ),4),  ior(7, int(o'123456'   ))
  write(*,*) ieor(int(o'123456'   ),4), ieor(7, int(o'123456'   ))

  write(*,*) iand(int(b'001011101'),5), iand(6, int(b'001011101'))
  write(*,*)  ior(int(b'001011101'),5),  ior(6, int(b'001011101'))
  write(*,*) ieor(int(b'001011101'),5), ieor(6, int(b'001011101'))
end program p

(2) From
https://gcc.gnu.org/onlinedocs/gfortran/BOZ-literal-constants.html#BOZ-literal-constants

> In all other cases, the BOZ literal constant is converted to an INTEGER value 
> with the largest decimal representation. 

i.e., INTEGER(16) in 64-bit mode and INTEGER(8) in 32-bit mode. IMO it is
compatible with

> The processor shall allow the position of the leftmost nonzero bit to be
> at least z - 1, where z is the maximum value that could result from invoking
> the intrinsic function STORAGE_SIZE (13.8.175) with an argument that is
> a real or integer scalar of any kind supported by the processor.

Note that the (invalid, see pr54072) code

program p
  implicit none

  print *, kind(iand(b'001011101',b'101'))
  print *, kind(ieor(b'001011101',b'101'))
  print *, kind(ior(b'001011101',b'101'))
end program p

gives

          16
          16
          16

in 64-bit mode, and

           8
           8
           8

in 32-bit mode.

(3) I agree that the KIND should not be checked for boz-literal-constant.

Reply via email to