From e1d818f7eabdac4b3a814866fe05e4f2a82860ed Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Thu, 22 Jul 2010 13:35:09 +0200 Subject: [PATCH] re PR fortran/45019 (Aliasing of TARGET dummy argument not detected correctly) 2010-07-22 Tobias Burnus 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 PR fortran/45019 * gfortran.dg/aliasing_dummy_5.f90: New. From-SVN: r162410 --- gcc/fortran/ChangeLog | 6 ++ gcc/fortran/dependency.c | 13 +++++ gcc/fortran/symbol.c | 11 ++++ gcc/testsuite/ChangeLog | 7 ++- .../gfortran.dg/aliasing_dummy_5.f90 | 55 +++++++++++++++++++ 5 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/aliasing_dummy_5.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index ee2566d4ed3..de6e55f6377 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2010-07-22 Tobias Burnus + + 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 * trans-stmt.c (gfc_trans_return): Put back in the handling of se.post, diff --git a/gcc/fortran/dependency.c b/gcc/fortran/dependency.c index 083058dab8b..c21a2e43588 100644 --- a/gcc/fortran/dependency.c +++ b/gcc/fortran/dependency.c @@ -807,6 +807,19 @@ gfc_check_dependency (gfc_expr *expr1, gfc_expr *expr2, bool identical) 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. */ return 0; diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c index df6ada963c3..c12ea23a05e 100644 --- a/gcc/fortran/symbol.c +++ b/gcc/fortran/symbol.c @@ -2811,6 +2811,17 @@ gfc_symbols_could_alias (gfc_symbol *lsym, gfc_symbol *rsym) if (lsym->attr.allocatable && rsym->attr.pointer) 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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9c67b0a4e73..7a454a94706 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-07-22 Tobias Burnus + + PR fortran/45019 + * gfortran.dg/aliasing_dummy_5.f90: New. + 2010-07-22 Ramana Radhakrishnan PR target/43698 @@ -6,7 +11,7 @@ 2010-07-21 Steven G. Kargl PR fortran/44929 - * Revert my commit r162325 for this PR. + * Revert my commit r162325 for this PR. 2010-07-21 Jakub Jelinek diff --git a/gcc/testsuite/gfortran.dg/aliasing_dummy_5.f90 b/gcc/testsuite/gfortran.dg/aliasing_dummy_5.f90 new file mode 100644 index 00000000000..379fbd7f8f9 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/aliasing_dummy_5.f90 @@ -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" } }