The following program:
MODULE m
IMPLICIT NONE
INTEGER, TARGET :: arr(3)
CONTAINS
SUBROUTINE foobar (arg)
INTEGER, TARGET :: arg(:)
arr(2:3) = arg(1:2)
END SUBROUTINE foobar
END MODULE m
PROGRAM main
USE :: m
IMPLICIT NONE
arr = (/ 1, 2, 3 /)
CALL foobar (arr)
PRINT *, arr
END PROGRAM main
does not create a temporary array inside foobar and prints "1 1 1", while I
think it should print "1 1 2".
In the Fortran 2008 standard, 12.5.2.13, 3b):
(3) Action that affects the value of the entity or any subobject of it shall be
taken only through the dummy argument unless
a) ... or
b) the dummy argument has the TARGET attribute, the dummy argument does not
have INTENT(IN), the dummy argument is a scalar object or an assumed-shape
array without the CONTIGUOUS attribute, and the actual argument is a target
other than an array section with a vector subscript.
It seems to me that this allows the code above.
--
Summary: Aliasing of TARGET dummy argument not detected correctly
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: domob at gcc dot gnu dot org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45019