revert: [multiple changes]
authorTobias Burnus <burnus@gcc.gnu.org>
Thu, 14 Feb 2013 09:37:53 +0000 (10:37 +0100)
committerTobias Burnus <burnus@gcc.gnu.org>
Thu, 14 Feb 2013 09:37:53 +0000 (10:37 +0100)
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

gcc/fortran/ChangeLog
gcc/fortran/trans-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/allocatable_function_7.f90 [new file with mode: 0644]

index 0a08a19..3e9e791 100644 (file)
@@ -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
index 7732440..337d747 100644 (file)
@@ -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)
                {
index 8d14539..8da8918 100644 (file)
@@ -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 (file)
index 0000000..755584c
--- /dev/null
@@ -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