http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47474

           Summary: Wrong code with allocatable scalar, allocatable
                    components as function result
           Product: gcc
           Version: 4.6.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: fortran
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: bur...@gcc.gnu.org
                CC: ja...@gcc.gnu.org
            Blocks: 47455


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

Reply via email to