Bug 47474 - Wrong code with allocatable scalar, allocatable components as function result
Summary: Wrong code with allocatable scalar, allocatable components as function result
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: fortran (show other bugs)
Version: 4.6.0
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords: wrong-code
Depends on:
Blocks: 47455
  Show dependency treegraph
 
Reported: 2011-01-26 13:12 UTC by Tobias Burnus
Modified: 2011-02-02 17:58 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Tobias Burnus 2011-01-26 13:12:55 UTC
Found as part of PR 47455. For the following program

   function find_y() result(res)
     type(tx), allocatable :: res
     ! do something sensible such as "allocate(res)"
   end function find_y

the dump looks as follows

  find_y ()
  {
    struct tx * res;

    res.i.data = 0B;  /* <<<< WRONG.  */
    res = 0B;
    /* some code.  */
    return res;
  }

If one does not use a RESULT variable but "find_y" as result variable, the dump looks as follows:

  find_y ()
  {
     __result_find_y.i.data = 0B;  /* Note: 1.  */
     return __result_find_y;
  }

Note 1: Unless "find_y" is used (e.g. "allocate(find_y)") the function is generated with an empty body.


For some reason, the example program below does not crash here with gfortran 4.5/4.6, but the dump is wrong and I am sure it can cause problems in certain cases. The example of bug 47455 comment 4 does crash - and I believe(d) that it is due to this bug.

program test
    type :: tx
        integer, dimension(:), allocatable :: i
    end type tx
    type(tx) :: x
    x = find_y()
    if (allocated(x%i)) call abort()
contains
    function find_y() result(res)
        type(tx), allocatable :: res
        allocate(res)
   end function find_y
end program test
Comment 1 Tobias Burnus 2011-01-26 15:04:53 UTC
Patch. The order was wrong; additionally, if there is an allocatable RESULT variable, it seems to get zero initialized via sym->value or similarly. Thus the sym->result == result check prevents that two "res = 0B;" lines get added.


--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -4602,16 +4716,18 @@ gfc_generate_function_code (gfc_namespace * ns)
            && sym->attr.function
            && !sym->attr.pointer)
        {
-         if (sym->ts.type == BT_DERIVED
-             && sym->ts.u.derived->attr.alloc_comp)
+         if (sym->attr.allocatable && sym->attr.dimension == 0
+             && sym->result == sym)
+           gfc_add_modify (&init, result, fold_convert (TREE_TYPE (result),
+                                                        null_pointer_node));
+         else if (sym->ts.type == BT_DERIVED
+             && sym->ts.u.derived->attr.alloc_comp
+             && !sym->attr.allocatable)
            {
              rank = sym->as ? sym->as->rank : 0;
              tmp = gfc_nullify_alloc_comp (sym->ts.u.derived, result, rank);
              gfc_add_expr_to_block (&init, tmp);
            }
-         else if (sym->attr.allocatable && sym->attr.dimension == 0)
-           gfc_add_modify (&init, result, fold_convert (TREE_TYPE (result),
-                                                        null_pointer_node));
        }

       if (result == NULL_TREE)
Comment 2 Tobias Burnus 2011-01-26 16:58:28 UTC
Submitted patch: http://gcc.gnu.org/ml/fortran/2011-01/msg00235.html
Comment 3 Tobias Burnus 2011-01-27 22:47:14 UTC
Author: burnus
Date: Thu Jan 27 22:47:08 2011
New Revision: 169340

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=169340
Log:
2011-01-27  Tobias Burnus  <burnus@net-b.de>

        PR fortran/47474
        * trans-decl.c (gfc_generate_function_code): Fix init
        of allocatable result variable with allocatable components.


Modified:
    trunk/gcc/fortran/ChangeLog
    trunk/gcc/fortran/trans-decl.c
Comment 4 Tobias Burnus 2011-01-27 22:50:25 UTC
FIXED on the trunk (4.6)
Comment 5 Diego Novillo 2011-02-02 17:58:22 UTC
Author: dnovillo
Date: Wed Feb  2 17:58:18 2011
New Revision: 169657

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=169657
Log:
2011-01-27  Tobias Burnus  <burnus@net-b.de>

        PR fortran/47474
        * trans-decl.c (gfc_generate_function_code): Fix init
        of allocatable result variable with allocatable components.

Modified:
    branches/google/integration/gcc/fortran/ChangeLog
    branches/google/integration/gcc/fortran/trans-decl.c