This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Patch, fortran] PR63205 - [OOP] Wrongly rejects type = class (for identical declared type)


ping!

On 27 January 2015 at 20:38, Paul Richard Thomas
<paul.richard.thomas@gmail.com> wrote:
> Dear All,
>
> This patch enables the passing of an allocatable class object, scalar
> or array, to a derived type of the declared type, either in an
> assignment or as an actual argument. Much of the effort went into
> sorting out the finalization call so that the 'left over' allocatable
> components added by the dynamic type do not leak memory. At the
> moment, the existence of the finalization function is tested for. A
> check to see if the dynamic type is the same as the declared type
> could be added.
>
> Note that adding the 'must_finalize' field to gfc_expr will be useful
> in enabling the missing mandatory finalization calls.
>
> There are still interrogation marks about the patch; especially in
> build_class_array_ref, where I do not understand why the added code
> does not work in general, except for hidden function results.
> Nonetheless, the code does not leak memory, apart perhaps from the
> compound derived type constructors, with allocatable components that
> already show leaks elsewhere. It is also well ringfenced and so should
> not cause any regressions... touch wood!
>
> Bootstraps and regtests on x86_64/FC21 - OK for trunk?
>
> Paul
>
> 2015-01-27  Paul Thomas  <pault@gcc.gnu.org>
>
>     PR fortran/63205
>     * gfortran.h: Add 'must finalize' field to gfc_expr and
>     prototypes for gfc_is_alloc_class_scalar_function and for
>     gfc_is_alloc_class_array_function.
>     * expr.c (gfc_is_alloc_class_scalar_function,
>     gfc_is_alloc_class_array_function): New functions.
>     * trans-array.c (gfc_add_loop_ss_code): Do not move the
>     expression for allocatable class scalar functions outside the
>     loop.
>     (conv_array_index_offset): Cope with deltas being NULL_TREE.
>     (build_class_array_ref): Do not return with allocatable class
>     array functions. Add code to pick out the returned class array.
>     Dereference if necessary and return if not a class object.
>     (gfc_conv_scalarized_array_ref): Cope with offsets being NULL.
>     (gfc_walk_function_expr): Return an array ss for the result of
>     an allocatable class array function.
>     * trans-expr.c (gfc_conv_subref_array_arg): Remove the assert
>     that the argument should be a variable. If an allocatable class
>     array function, set the offset to zero and skip the write-out
>     loop in this case.
>     (gfc_conv_procedure_call): Add allocatable class array function
>     to the assert. Call gfc_conv_subref_array_arg for allocatable
>     class array function arguments with derived type formal arg..
>     Add the code for handling allocatable class functions, including
>     finalization calls to prevent memory leaks.
>     (arrayfunc_assign_needs_temporary): Return if an allocatable
>     class array function.
>     (gfc_trans_assignment_1): Set must_finalize to rhs expression
>     for allocatable class functions. Set scalar_to_array as needed
>     for scalar class allocatable functions assigned to an array.
>     Nullify the allocatable components corresponding the the lhs
>     derived type so that the finalization does not free them.
>
> 2015-01-27  Paul Thomas  <pault@gcc.gnu.org>
>
>     PR fortran/63205
>     * gfortran.dg/class_to_type_4.f90: New test



-- 
Outside of a dog, a book is a man's best friend. Inside of a dog it's
too dark to read.

Groucho Marx


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]