From 431e468591314789b689a3188e0fe1921acb0197 Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Thu, 14 Feb 2013 10:37:53 +0100 Subject: [PATCH] revert: [multiple changes] 2013-02-14 Paul Thomas Tobias Burnus PR testsuite/56138 * trans-decl.c (gfc_get_symbol_decl): Fix deferred-length results for functions without extra result variable. Revert: 2013-01-30 Tobias Burnus PR fortran/56138 * trans-decl.c (gfc_trans_deferred_vars): Fix deferred-length results for functions without extra result variable. 2013-02-14 Dominique d'Humieres Tobias Burnus PR testsuite/56138 * gfortran.dg/allocatable_function_7.f90: New. From-SVN: r196047 --- gcc/fortran/ChangeLog | 14 ++++++++++ gcc/fortran/trans-decl.c | 9 ++++-- gcc/testsuite/ChangeLog | 6 ++++ .../gfortran.dg/allocatable_function_7.f90 | 28 +++++++++++++++++++ 4 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/allocatable_function_7.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 0a08a199fe4..3e9e7914d06 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,17 @@ +2013-02-14 Paul Thomas + Tobias Burnus + + PR testsuite/56138 + * trans-decl.c (gfc_get_symbol_decl): Fix deferred-length + results for functions without extra result variable. + + Revert: + 2013-01-30 Tobias Burnus + + PR fortran/56138 + * trans-decl.c (gfc_trans_deferred_vars): Fix deferred-length + results for functions without extra result variable. + 2013-02-12 Janus Weil PR fortran/46952 diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 77324408eb7..337d747520f 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -1205,6 +1205,7 @@ gfc_get_symbol_decl (gfc_symbol * sym) tree attributes; int byref; bool intrinsic_array_parameter = false; + bool fun_or_res; gcc_assert (sym->attr.referenced || sym->attr.flavor == FL_PROCEDURE @@ -1244,7 +1245,9 @@ gfc_get_symbol_decl (gfc_symbol * sym) length = gfc_create_string_length (sym); } - if ((sym->attr.dummy && ! sym->attr.function) || (sym->attr.result && byref)) + fun_or_res = byref && (sym->attr.result + || (sym->attr.function && sym->ts.deferred)); + if ((sym->attr.dummy && ! sym->attr.function) || fun_or_res) { /* Return via extra parameter. */ if (sym->attr.result && byref @@ -1270,7 +1273,7 @@ gfc_get_symbol_decl (gfc_symbol * sym) (sym->ts.u.cl->passed_length == sym->ts.u.cl->backend_decl)) sym->ts.u.cl->backend_decl = NULL_TREE; - if (sym->ts.deferred && sym->attr.result + if (sym->ts.deferred && fun_or_res && sym->ts.u.cl->passed_length == NULL && sym->ts.u.cl->backend_decl) { @@ -3775,7 +3778,7 @@ gfc_trans_deferred_vars (gfc_symbol * proc_sym, gfc_wrapped_block * block) null_pointer_node)); } - if ((sym->attr.dummy || sym->attr.result || sym->result == sym) + if ((sym->attr.dummy ||sym->attr.result) && sym->ts.type == BT_CHARACTER && sym->ts.deferred) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8d145390e88..8da89182c6c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2013-02-14 Dominique d'Humieres + Tobias Burnus + + PR testsuite/56138 + * gfortran.dg/allocatable_function_7.f90: New. + 2013-02-14 Jakub Jelinek * g++.dg/asan/dejagnu-gtest.h: Add multiple inclusion guards. diff --git a/gcc/testsuite/gfortran.dg/allocatable_function_7.f90 b/gcc/testsuite/gfortran.dg/allocatable_function_7.f90 new file mode 100644 index 00000000000..755584ca1b6 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/allocatable_function_7.f90 @@ -0,0 +1,28 @@ +! { dg-do run } +! +! PR fortran/56138 +! +! Contributed by Dominique d'Humieres and John Chludzinski, +! using the code of John Reid +! +implicit none +interface +PURE FUNCTION s_to_c(string) + CHARACTER(LEN=*),INTENT(IN) :: string + CHARACTER(LEN=:),ALLOCATABLE :: s_to_c +ENDFUNCTION s_to_c +end interface +CHARACTER(LEN=:),ALLOCATABLE :: str +if (s_to_c("ABCdef") /= "ABCdef" .or. len(s_to_c("ABCdef")) /= 6) call abort() +str = s_to_c("ABCdef") +if (str /= "ABCdef" .or. len(str) /= 6) call abort() +str(1:3) = s_to_c("123") +if (str /= "123def" .or. len(str) /= 6) call abort() + +end + +PURE FUNCTION s_to_c(string) + CHARACTER(LEN=*),INTENT(IN) :: string + CHARACTER(LEN=:),ALLOCATABLE :: s_to_c + s_to_c = string +END FUNCTION s_to_c -- 2.30.2