diff options
author | Tobias Burnus <burnus@gcc.gnu.org> | 2013-02-14 10:37:53 +0100 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2013-02-14 10:37:53 +0100 |
commit | 431e468591314789b689a3188e0fe1921acb0197 (patch) | |
tree | c42e3552e7f21df88d25d9919468595bddc98f5b /gcc | |
parent | 3b0c7324054b014b73bd7e1c82ed95ae306ef794 (diff) | |
download | gcc-431e468591314789b689a3188e0fe1921acb0197.zip gcc-431e468591314789b689a3188e0fe1921acb0197.tar.gz gcc-431e468591314789b689a3188e0fe1921acb0197.tar.bz2 |
revert: [multiple changes]
2013-02-14 Paul Thomas <pault@gcc.gnu.org>
Tobias Burnus <burnus@net-b.de>
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 <burnus@net-b.de>
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 <dominiq@lps.ens.fr>
Tobias Burnus <burnus@net-b.de>
PR testsuite/56138
* gfortran.dg/allocatable_function_7.f90: New.
From-SVN: r196047
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 14 | ||||
-rw-r--r-- | gcc/fortran/trans-decl.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/allocatable_function_7.f90 | 28 |
4 files changed, 54 insertions, 3 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 0a08a19..3e9e791 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,17 @@ +2013-02-14 Paul Thomas <pault@gcc.gnu.org> + Tobias Burnus <burnus@net-b.de> + + 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 <burnus@net-b.de> + + 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 <janus@gcc.gnu.org> PR fortran/46952 diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 7732440..337d747 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 8d14539..8da8918 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2013-02-14 Dominique d'Humieres <dominiq@lps.ens.fr> + Tobias Burnus <burnus@net-b.de> + + PR testsuite/56138 + * gfortran.dg/allocatable_function_7.f90: New. + 2013-02-14 Jakub Jelinek <jakub@redhat.com> * 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 0000000..755584c --- /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 |