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

            Bug ID: 87142
           Summary: Aliasing issue with overloaded assignment and
                    allocatable components
           Product: gcc
           Version: 7.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mscfd at gmx dot net
  Target Milestone: ---

The following code does not work, as the left hand side in "str = str%cs(1:10)"
is deallocated, before the right hand side, where str also appears, is
evaluated. With gfortran-7.3.0, the output looks right, but I see invalid
memory accesses in valgrind. In other circumstances, depending on the length of
the string and with 8.1.0, I have also seen wrong results, but then depending
on the optimisation level. As far as I know, this is a violation of the
standard, which requires that the right hand side is evaluated before the left
hand side is modified (i.e. in this case deallocated).

module mod

implicit none
private

type, public :: string
   character(len=:), allocatable :: cs

contains
   procedure, public :: assign
   generic, public :: assignment(=) => assign
end type string

contains

elemental subroutine assign(self, cs)
class(string), intent(inout) :: self
character(len=*), intent(in) :: cs

! this is not working if cs and self%cs are aliasing
self%cs = cs
end subroutine assign

end module mod



program assign_alias

use mod
implicit none

type(string) :: str

str%cs = repeat('0123456789', 100)

str = str%cs(1:10)

end program assign_alias

Reply via email to