ping! On 27 January 2015 at 20:38, Paul Richard Thomas <paul.richard.tho...@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 <pa...@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 <pa...@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