* trans-decl.c (gfc_get_extern_function_decl): Set DECL_IS_PURE
authorpbrook <pbrook@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 22 May 2004 13:31:07 +0000 (13:31 +0000)
committerpbrook <pbrook@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 22 May 2004 13:31:07 +0000 (13:31 +0000)
only for functions.
(gfc_build_function_decl): Likewise.

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

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

index f2c2354..3d0d427 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 8708bea..32dfdc4 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;
     }