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] Bug 68241 - [meta-bug] Deferred-length character - PRs49630, 54070, 60593, 60795, 61147, 63232 and 64324


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.thomas@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  <pault@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  <pault@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


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