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

--- Comment #5 from Steve Kargl <sgk at troutmask dot apl.washington.edu> ---
On Fri, Sep 13, 2019 at 07:34:11AM +0000, juergen.reuter at desy dot de wrote:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91752
> 
> --- Comment #4 from Jürgen Reuter <juergen.reuter at desy dot de> ---
> (In reply to kargl from comment #3)
> > See the documentation.  -fallow-invalid-boz reduces the error to a warning. 
> > The warning can only be silenced by -w.  This was done with intent.
> 
> Actually not all of them, this one is still flagged as an error:
> implicit none
> integer :: h
> h = B"11"
> select case (h)
> case (B"11")
>    print *, "Found"
> end select
> end
> 

That is the intended behavior.  I did not try to
allow every previous invalid use of BOZ.  When I
made BOZ work 15 years ago, I implemented the
requirement of F95 that a BOZ is converted to the
integer with the widest decimal range (ie, either
INTEGER(8) or INTEGER(16)).  A BOZ was parsed and
immediately converted, so a BOZ could appear in any
place that an INTEGER could appear.  That was a mistake,
and undocumented behavior.  I have corrected that
mistake.

This used to compile with gfortran where INTEGER(8)
is the integer with widest kind:

module m
  interface prn
    module procedure prn4
    module procedure prn8
  end interface prn
  contains
    subroutine prn4(i)
       integer(4), intent(in) :: i
       print *, i
    end subroutine prn4
    subroutine prn8(i)
       integer(8), intent(in) :: i
       print *, i
    end subroutine prn8
end module m

program foo
  use m
  call prn(B'11')
end program foo

It now issues an error and -fallow-invalid-boz will
not downgrade the error in this case.  Because a BOZ
is a typeless and kindless entity, there is no way
to resolve the interface.

Sure, you can argue that if gfortran use to compile
some garbage code, it should always compile that
garbage code.  My stance is gfortran should reject
the garbage.

Reply via email to