Dear All, Following an exchange with Dominique on #gfortran, I fixed PR54070 comment #23. The changes are in trans-array.c and are listed in the ChangeLogs below.
Committed to trunk as revision 232450. I will wait some weeks before committing to 5-branch. This patch should have made deferred character length a rather more usable feature. They still don't work in common blocks (PR55735) and there are still problems with them as associate variables (PR60458). I will endeavour to fix these PRs next. Thanks, Dominique! Paul On 9 January 2016 at 20:33, Paul Richard Thomas <paul.richard.tho...@gmail.com> wrote: > Dear All, > > This is a further instalment of deferred character length fixes. I > have listed the status of all the deferred length PRs that I know of > in an attachment. As far as I can see, there are five left that are > really concerned with deferred character length functionality. > > In terms of the number of PRs fixed, this patch is rather less > impressive than it looks. Essentially four things have been fixed: > (i) Deferred character length results are passed by reference and so, > within the procedure itself, they are consistently indirectly > referenced; > (ii) The deferred character types are made correctly by indirectly > referencing the character length; > (iii) Array references to deferred character arrays use pointer arithmetic; > and > (iv) Scalar assignments to unallocated arrays are trapped at runtime > with -fcheck=mem. > > A minor tweak was required to fix PR64324 because deferred length > characters were being misidentified as assumed length. > > The ChangeLog is clear as to what has been done. The only point on > which I am uncertain is that of making the length parameter of > deferred character length procedure results TREE_STATIC. This was > required to make the patch function correctly at any level of > optimization. Is this the best and/or only way of doing this? > > Bootstrapped and regtested on FC21/x86_64 - OK for trunk and, after a > decent interval, 5 branch? > > Cheers > > Paul > > 2016-01-09 Paul Thomas <pa...@gcc.gnu.org> > > PR fortran/64324 > * resolve.c (check_uop_procedure): Prevent deferred length > characters from being trapped by assumed length error. > > PR fortran/49630 > PR fortran/54070 > PR fortran/60593 > PR fortran/60795 > PR fortran/61147 > PR fortran/64324 > * trans-array.c (gfc_conv_scalarized_array_ref): Pass decl for > function as well as variable expressions. > * trans.c (gfc_build_array_ref): Expand logic for setting span > to include indirect references to character lengths. > * trans-decl.c (gfc_get_symbol_decl): Ensure that deferred > result char lengths that are PARM_DECLs are indirectly > referenced both for directly passed and by reference. > (create_function_arglist): If the length type is a pointer type > then store the length as the 'passed_length' and make the char > length an indirect reference to it. > (gfc_trans_deferred_vars): If a character length has escaped > being set as an indirect reference, return it via the 'passed > length'. > * trans-expr.c (gfc_conv_procedure_call): The length of > deferred character length results is set TREE_STATIC and set to > zero. > (gfc_trans_assignment_1): Do not fix the rse string_length if > it is a variable, a parameter or an indirect reference. Add the > code to trap assignment of scalars to unallocated arrays. > * trans-stmt.c (gfc_trans_allocate): Remove 'def_str_len' and > all references to it. Instead, replicate the code to obtain a > explicitly defined string length and provide a value before > array allocation so that the dtype is correctly set. > trans-types.c (gfc_get_character_type): If the character length > is a pointer, use the indirect reference. > > 2016-01-09 Paul Thomas <pa...@gcc.gnu.org> > > PR fortran/49630 > * gfortran.dg/deferred_character_13.f90: New test for the fix > of comment 3 of the PR. > > PR fortran/54070 > * gfortran.dg/deferred_character_8.f90: New test > * gfortran.dg/allocate_error_5.f90: New test > > PR fortran/60593 > * gfortran.dg/deferred_character_10.f90: New test > > PR fortran/60795 > * gfortran.dg/deferred_character_14.f90: New test > > PR fortran/61147 > * gfortran.dg/deferred_character_11.f90: New test > > PR fortran/64324 > * gfortran.dg/deferred_character_9.f90: New test -- The difference between genius and stupidity is; genius has its limits. Albert Einstein