From: Erik Edelmann Date: Wed, 9 Nov 2005 11:27:56 +0000 (+0000) Subject: re PR fortran/22607 (Elemental character functions don't work) X-Git-Tag: releases/gcc-4.1.0~975 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a01db3bf1a1430d7c4665364250ac63fab318a6a;p=thirdparty%2Fgcc.git re PR fortran/22607 (Elemental character functions don't work) fortran/ 2005-11-09 Erik Edelmann 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 PR fortran/22607 * gfortran-dg/pure_byref_1.f90: New. * gfortran-dg/pure_byref_2.f90: New. From-SVN: r106683 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index f610a2ed12ba..c60bdfd31870 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2005-11-09 Erik Edelmann + + 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 * dump-parse-tree.c: Fix comment typo, add a few blank lines. diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 9d71d7143bc1..04f037b53f67 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d0bd89e28e8c..6725ae362387 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2005-11-09 Erik Edelmann + + PR fortran/22607 + * gfortran-dg/pure_byref_1.f90: New. + * gfortran-dg/pure_byref_2.f90: New. + 2005-11-09 Uros Bizjak 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 index 000000000000..5e080e5af101 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pure_byref_1.f90 @@ -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 index 000000000000..805653e2ed3d --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pure_byref_2.f90 @@ -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