re PR fortran/22607 (Elemental character functions don't work)
authorErik Edelmann <eedelman@gcc.gnu.org>
Wed, 9 Nov 2005 11:27:56 +0000 (11:27 +0000)
committerErik Edelmann <eedelman@gcc.gnu.org>
Wed, 9 Nov 2005 11:27:56 +0000 (11:27 +0000)
fortran/
2005-11-09  Erik Edelmann  <eedelman@gcc.gnu.org>

        PR fortran/22607
        * trans-decl.c(build_function_decl): Don't set
        DECL_IS_PURE (fndecl) = 1 for return-by-reference
        functions.

testsuite/
2005-11-09  Erik Edelmann  <eedelman@gcc.gnu.org>

        PR fortran/22607
        * gfortran-dg/pure_byref_1.f90: New.
        * gfortran-dg/pure_byref_2.f90: New.

From-SVN: r106683

gcc/fortran/ChangeLog
gcc/fortran/trans-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pure_byref_1.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/pure_byref_2.f90 [new file with mode: 0644]

index f610a2ed12ba61b639cca114da521a7a4548f291..c60bdfd3187026950cede2dd44d1433babfcf32c 100644 (file)
@@ -1,3 +1,10 @@
+2005-11-09  Erik Edelmann  <eedelman@gcc.gnu.org>
+
+       PR fortran/22607
+       * trans-decl.c(build_function_decl): Don't set
+       DECL_IS_PURE (fndecl) = 1 for return-by-reference
+       functions.
+
 2005-11-08  Tobias Schl"uter  <tobias.schlueter@physik.uni-muenchen.de>
 
        * dump-parse-tree.c: Fix comment typo, add a few blank lines.
index 9d71d7143bc1217b675b9269146a8d958fe4a5d6..04f037b53f67c5d4aed9be71392725b3f2bbba62 100644 (file)
@@ -1203,7 +1203,7 @@ build_function_decl (gfc_symbol * sym)
       /* TODO: check if a pure SUBROUTINE has no INTENT(OUT) arguments
         including a alternate return. In that case it can also be
         marked as PURE. See also in gfc_get_extern_function_decl().  */
-      if (attr.function)
+      if (attr.function && !gfc_return_by_reference (sym))
        DECL_IS_PURE (fndecl) = 1;
       TREE_SIDE_EFFECTS (fndecl) = 0;
     }
index d0bd89e28e8c1c3db0c2db3c466e920fb2d0b152..6725ae3623875268b7218e3b40c870603b3d6756 100644 (file)
@@ -1,3 +1,9 @@
+2005-11-09  Erik Edelmann  <eedelman@gcc.gnu.org>
+
+       PR fortran/22607
+       * gfortran-dg/pure_byref_1.f90: New.
+       * gfortran-dg/pure_byref_2.f90: New.
+
 2005-11-09  Uros Bizjak  <uros@kss-loka.si>
 
        PR c/24101
diff --git a/gcc/testsuite/gfortran.dg/pure_byref_1.f90 b/gcc/testsuite/gfortran.dg/pure_byref_1.f90
new file mode 100644 (file)
index 0000000..5e080e5
--- /dev/null
@@ -0,0 +1,15 @@
+! { dg-do run }
+! PR 22607: PURE/ELEMENTAL return-by-reference functions
+program main
+  implicit none
+  character(2), dimension(2) :: a, b
+  a = 'ok'
+  b = fun(a)
+  if (.not.all(b == 'ok')) call abort()
+contains
+  elemental function fun(a) 
+    character(*), intent(in) :: a
+    character(len(a)) :: fun
+    fun = a
+  end function fun
+end program main
diff --git a/gcc/testsuite/gfortran.dg/pure_byref_2.f90 b/gcc/testsuite/gfortran.dg/pure_byref_2.f90
new file mode 100644 (file)
index 0000000..805653e
--- /dev/null
@@ -0,0 +1,17 @@
+! { dg-do run }
+! PR 22607: PURE return-by-reference functions
+program main
+  implicit none
+  integer, dimension(2) :: b
+  b = fun(size(b))
+  if (b(1) /= 1 .or. b(2) /= 2) call abort()
+contains
+  pure function fun(n) 
+    integer, intent(in) :: n
+    integer :: fun(n)
+    integer :: i
+    do i = 1, n
+        fun(i) = i
+    end do
+  end function fun
+end program main