[Patch, fortran] PR63205 - [OOP] Wrongly rejects type = class (for identical declared type)
Paul Richard Thomas
paul.richard.thomas@gmail.com
Thu Jan 29 20:59:00 GMT 2015
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
More information about the Gcc-patches
mailing list