trans-decl.c (gfc_get_extern_function_decl): Set DECL_IS_PURE only for functions.
authorTobias Schlüter <tobias.schlueter@physik.uni-muenchen.de>
Sat, 22 May 2004 13:31:07 +0000 (13:31 +0000)
committerPaul Brook <pbrook@gcc.gnu.org>
Sat, 22 May 2004 13:31:07 +0000 (13:31 +0000)
* trans-decl.c (gfc_get_extern_function_decl): Set DECL_IS_PURE
only for functions.
(gfc_build_function_decl): Likewise.

From-SVN: r82132

gcc/fortran/ChangeLog
gcc/fortran/trans-decl.c

index f2c23546bbcff0768b323efe926df289b36d8ad7..3d0d427b78ae223560f032ab5f5fa00dc436f5c2 100644 (file)
@@ -1,3 +1,9 @@
+2004-05-22  Tobias Schlüter  <tobias.schlueter@physik.uni-muenchen.de>
+
+       * trans-decl.c (gfc_get_extern_function_decl): Set DECL_IS_PURE
+       only for functions.
+       (gfc_build_function_decl): Likewise.
+
 2004-05-22  Steven G. Kargl  <kargls@comcast.net>
 
        * check.c (gfc_check_system_clock): New function.
index 8708bea14b109467b901b9c286cab1cc0bdaeedc..32dfdc4a643829986ebef6cb6679ad188e5a5a94 100644 (file)
@@ -951,9 +951,13 @@ gfc_get_extern_function_decl (gfc_symbol * sym)
      sense.  */
   if (sym->attr.pure || sym->attr.elemental)
     {
-      DECL_IS_PURE (fndecl) = 1;
-/* TODO: check if pure/elemental procedures can have INTENT(OUT) parameters.
-      TREE_SIDE_EFFECTS (fndecl) = 0;*/
+      if (sym->attr.function)
+       DECL_IS_PURE (fndecl) = 1;
+      /* TODO: check if pure SUBROUTINEs don't have INTENT(OUT)
+        parameters and don't use alternate returns (is this
+        allowed?). In that case, calls to them are meaningless, and
+        can be optimized away. See also in gfc_build_function_decl().  */
+      TREE_SIDE_EFFECTS (fndecl) = 0;
     }
 
   sym->backend_decl = fndecl;
@@ -1060,7 +1064,11 @@ gfc_build_function_decl (gfc_symbol * sym)
      sense.  */
   if (attr.pure || attr.elemental)
     {
-      DECL_IS_PURE (fndecl) = 1;
+      /* 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_fucntion_decl().  */
+      if (attr.function)
+       DECL_IS_PURE (fndecl) = 1;
       TREE_SIDE_EFFECTS (fndecl) = 0;
     }