aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/trans-decl.c16
2 files changed, 18 insertions, 4 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index f2c2354..3d0d427 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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.
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
index 8708bea..32dfdc4 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -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;
}