2010-07-22 Tobias Burnus <burnus@net-b.de>
authorburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 22 Jul 2010 11:35:09 +0000 (11:35 +0000)
committerburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 22 Jul 2010 11:35:09 +0000 (11:35 +0000)
        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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@162410 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/dependency.c
gcc/fortran/symbol.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/aliasing_dummy_5.f90 [new file with mode: 0644]

index ee2566d..de6e55f 100644 (file)
@@ -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>
 
        * trans-stmt.c (gfc_trans_return): Put back in the handling of se.post,
index 083058d..c21a2e4 100644 (file)
@@ -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;
index df6ada9..c12ea23 100644 (file)
@@ -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;
 }
 
index 9c67b0a..7a454a9 100644 (file)
@@ -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>
 
        PR target/43698
@@ -6,7 +11,7 @@
 2010-07-21  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        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>
 
diff --git a/gcc/testsuite/gfortran.dg/aliasing_dummy_5.f90 b/gcc/testsuite/gfortran.dg/aliasing_dummy_5.f90
new file mode 100644 (file)
index 0000000..379fbd7
--- /dev/null
@@ -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" } }