re PR fortran/45019 (Aliasing of TARGET dummy argument not detected correctly)
2010-07-22 Tobias Burnus <burnus@net-b.de> PR fortran/45019 * dependency.c (gfc_check_dependency): Add argument alising * check. * symbol.c (gfc_symbols_could_alias): Add argument alising * check. 2010-07-22 Tobias Burnus <burnus@net-b.de> PR fortran/45019 * gfortran.dg/aliasing_dummy_5.f90: New. From-SVN: r162410
This commit is contained in:
parent
ba3ff5c2db
commit
e1d818f7ea
|
@ -1,3 +1,9 @@
|
||||||
|
2010-07-22 Tobias Burnus <burnus@net-b.de>
|
||||||
|
|
||||||
|
PR fortran/45019
|
||||||
|
* dependency.c (gfc_check_dependency): Add argument alising check.
|
||||||
|
* symbol.c (gfc_symbols_could_alias): Add argument alising check.
|
||||||
|
|
||||||
2010-07-22 Daniel Kraft <d@domob.eu>
|
2010-07-22 Daniel Kraft <d@domob.eu>
|
||||||
|
|
||||||
* trans-stmt.c (gfc_trans_return): Put back in the handling of se.post,
|
* trans-stmt.c (gfc_trans_return): Put back in the handling of se.post,
|
||||||
|
|
|
@ -807,6 +807,19 @@ gfc_check_dependency (gfc_expr *expr1, gfc_expr *expr2, bool identical)
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gfc_symbol *sym1 = expr1->symtree->n.sym;
|
||||||
|
gfc_symbol *sym2 = expr2->symtree->n.sym;
|
||||||
|
if (sym1->attr.target && sym2->attr.target
|
||||||
|
&& ((sym1->attr.dummy && !sym1->attr.contiguous
|
||||||
|
&& (!sym1->attr.dimension
|
||||||
|
|| sym2->as->type == AS_ASSUMED_SHAPE))
|
||||||
|
|| (sym2->attr.dummy && !sym2->attr.contiguous
|
||||||
|
&& (!sym2->attr.dimension
|
||||||
|
|| sym2->as->type == AS_ASSUMED_SHAPE))))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* Otherwise distinct symbols have no dependencies. */
|
/* Otherwise distinct symbols have no dependencies. */
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -2811,6 +2811,17 @@ gfc_symbols_could_alias (gfc_symbol *lsym, gfc_symbol *rsym)
|
||||||
if (lsym->attr.allocatable && rsym->attr.pointer)
|
if (lsym->attr.allocatable && rsym->attr.pointer)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
/* Special case: Argument association, cf. F90 12.4.1.6, F2003 12.4.1.7
|
||||||
|
and F2008 12.5.2.13 items 3b and 4b. The pointer case (a) is already
|
||||||
|
checked above. */
|
||||||
|
if (lsym->attr.target && rsym->attr.target
|
||||||
|
&& ((lsym->attr.dummy && !lsym->attr.contiguous
|
||||||
|
&& (!lsym->attr.dimension || lsym->as->type == AS_ASSUMED_SHAPE))
|
||||||
|
|| (rsym->attr.dummy && !rsym->attr.contiguous
|
||||||
|
&& (!rsym->attr.dimension
|
||||||
|
|| rsym->as->type == AS_ASSUMED_SHAPE))))
|
||||||
|
return 1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
2010-07-22 Tobias Burnus <burnus@net-b.de>
|
||||||
|
|
||||||
|
PR fortran/45019
|
||||||
|
* gfortran.dg/aliasing_dummy_5.f90: New.
|
||||||
|
|
||||||
2010-07-22 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
|
2010-07-22 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
|
||||||
|
|
||||||
PR target/43698
|
PR target/43698
|
||||||
|
@ -6,7 +11,7 @@
|
||||||
2010-07-21 Steven G. Kargl <kargl@gcc.gnu.org>
|
2010-07-21 Steven G. Kargl <kargl@gcc.gnu.org>
|
||||||
|
|
||||||
PR fortran/44929
|
PR fortran/44929
|
||||||
* Revert my commit r162325 for this PR.
|
* Revert my commit r162325 for this PR.
|
||||||
|
|
||||||
2010-07-21 Jakub Jelinek <jakub@redhat.com>
|
2010-07-21 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
! { dg-do run }
|
||||||
|
!
|
||||||
|
! PR fortran/45019
|
||||||
|
!
|
||||||
|
! Check that the compiler knows that
|
||||||
|
! "arg" and "arr" can alias.
|
||||||
|
!
|
||||||
|
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 bar(arr)
|
||||||
|
if (any (arr /= (/ 1, 1, 2 /))) call abort()
|
||||||
|
CALL test()
|
||||||
|
contains
|
||||||
|
subroutine bar(x)
|
||||||
|
INTEGER, TARGET :: x(:)
|
||||||
|
CALL foobar (x)
|
||||||
|
end subroutine bar
|
||||||
|
END PROGRAM main
|
||||||
|
|
||||||
|
MODULE m2
|
||||||
|
IMPLICIT NONE
|
||||||
|
INTEGER, TARGET :: arr(3)
|
||||||
|
CONTAINS
|
||||||
|
SUBROUTINE foobar (arg)
|
||||||
|
INTEGER, TARGET :: arg(:)
|
||||||
|
arr(1) = 5
|
||||||
|
arg(1) = 6
|
||||||
|
if (arr(1) == 5) call abort()
|
||||||
|
END SUBROUTINE foobar
|
||||||
|
END MODULE m2
|
||||||
|
subroutine test
|
||||||
|
USE m2
|
||||||
|
IMPLICIT NONE
|
||||||
|
arr = (/ 1, 2, 3 /)
|
||||||
|
CALL bar(arr)
|
||||||
|
contains
|
||||||
|
subroutine bar(x)
|
||||||
|
INTEGER, TARGET :: x(:)
|
||||||
|
CALL foobar (x)
|
||||||
|
end subroutine bar
|
||||||
|
END subroutine test
|
||||||
|
|
||||||
|
! { dg-final { cleanup-modules "m m2" } }
|
Loading…
Reference in New Issue