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

--- Comment #13 from Paul Thomas <pault at gcc dot gnu.org> ---
(In reply to Jürgen Reuter from comment #12)
> Paul, getting back to this one? At first glance seems not overly much work
> left for the remaining case.

Hi Juergen,

I am in the midst of a triage of my assigned PRs and, this time, I started at
the oldest. There always seems to be an urgency associated with the most recent
because the reporters usually press for a fix in the weeks or months after
posting.

If 's' is declared thus:

character(x), allocatable, save :: s

it produces the error

Error: Automatic object ‘s’ at (1) cannot have the SAVE attribute

It seems to me that what is true for an explicit save is true for an implicit
one too and that the second testcase is invalid.

Either that or the automatic length should switch off the implicit save
attribute.

Note that this version works as expected:

program test
   logical :: L
   L = g(1)
   write(*,*) L
   L = g(2)
   write(*,*) L
   L = g(4)
   write(*,*) L
   L = g(1)
   write(*,*) L
contains
  logical function g(x)
      integer :: x
      character(:), allocatable :: s
      save
      if(.NOT.allocated(s)) then
        allocate(character(len=x) :: s)
        s='x'
        g = .FALSE.
      elseif (x .eq. 4) then
        s = 'abcd'
      else
        g = .TRUE.
      end if
      write(*,*) "len(s)=", len(s), "s=", s
  end function g
end

[pault@pc30 69654]$ ./a.out
 len(s)=           1 s=x
 F
 len(s)=           1 s=x
 T
 len(s)=           4 s=abcd
 T
 len(s)=           4 s=abcd
 T

That is, a deferred character length respects the save attribute, whereas an
automatic length cannot.

What do you think?

Paul

Reply via email to