https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48298

--- Comment #24 from Jerry DeLisle <jvdelisle at gcc dot gnu.org> ---
Author: jvdelisle
Date: Fri Sep 23 20:36:21 2016
New Revision: 240456

URL: https://gcc.gnu.org/viewcvs?rev=240456&root=gcc&view=rev
Log:
2016-09-23  Jerry DeLisle  <jvdeli...@gcc.gnu.org>

        PR libgfortran/48298
        * io/inquire.c (inquire_via_unit): Adjust error check for the
        two possible internal unit KINDs.
        * io/io.h: Adjust defines for is_internal_unit and
        is_char4_unit. (gfc_unit): Add internal unit data to structure.
        (get_internal_unit): Change declaration to set_internal_unit.
        (free_internal_unit): Change name to stash_internal_unit_number.
        (get_unique_unit_number): Adjust parameter argument.
        Define IOPARM_DT_HAS_UDTIO. (gfc_saved_unit): New structure.
        * io/list_read.c (next_char_internal): Use is_char4_unit.
        * io/open.c (st_open): Adjust call to get_unique_unit_number.
        * io/transfer.c (write_block): Use is_char4_unit.
        (data_transfer_init): Update check for unit numbers.
        (st_read_done): Free the various allocated memories used for the
        internal units and stash the negative unit number and pointer to unit
        structure to allow reuse. (st_write_done): Likewise stash the freed
        unit.
        * io/unit.c: Create a fixed size buffer of 16 gfc_saved_unit's to use
        as a stack to save newunit unit numbers and unit structure for reuse.
        (get_external_unit): Change name to get_gfc_unit to better
        reflect what it does. (find_unit): Change call to get_gfc_unit.
        (find_or_create_unit): Likewise. (get_internal_unit): Change
        name to set_internal_unit. Move internal unit from the dtp
        structure to the gfc_unit structure so that it can be passed to
        child I/O statements through the UNIT.
        (free_internal_unit): Change name to stash_internal_unit_number.
        Push the common.unit number onto the newunit stack, saving it
        for possible reuse later. (get_unit): Set the internal unit
        KIND. Use get_unique_unit_number to get a negative unit number
        for the internal unit. Use get_gfc_unit to get the unit structure
        and use set_internal_unit to initialize it.
        (init_units): Initialize the newunit stack.
        (get_unique_unit_number): Check the stack for an available unit
        number and use it. If none there get the next most negative
        number. (close_units): Free any unit structures pointed to from the
save
        stack.

2016-09-23  Jerry DeLisle  <jvdeli...@gcc.gnu.org>

        PR fortran/48298
        * gfortran.h (gfc_dt): Add *udtio.
        * ioparm.def: Add bit IOPARM_dt_f2003 to align with library use of bit
        25. Add IOPARM_dt_dtio bit to common flags.
        * resolve.c (resolve_transfer): Set dt->udtio to expression.
        * io.c (gfc_match_inquire): Adjust error message for internal
        unit KIND.
        * libgfortran.h: Adjust defines for GFC_INTERNAL_UNIT4,
        GFC_INTERNAL_UNIT, and GFC_INVALID_UNIT.
        * trans-io.c (build_dt): Set common_unit to reflect the KIND of
        the internal unit. Set mask bit for presence of dt->udtio.

2016-09-23  Jerry DeLisle  <jvdeli...@gcc.gnu.org>

        PR fortran/48298
        * gfortran.dg/negative_unit_check.f90: Update test.
        * gfortran.dg/dtio_14.f90: New test.

Added:
    trunk/gcc/testsuite/gfortran.dg/dtio_14.f90
Modified:
    trunk/gcc/fortran/ChangeLog
    trunk/gcc/fortran/gfortran.h
    trunk/gcc/fortran/io.c
    trunk/gcc/fortran/ioparm.def
    trunk/gcc/fortran/libgfortran.h
    trunk/gcc/fortran/resolve.c
    trunk/gcc/fortran/trans-io.c
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/testsuite/gfortran.dg/negative_unit_check.f90
    trunk/libgfortran/ChangeLog
    trunk/libgfortran/io/inquire.c
    trunk/libgfortran/io/io.h
    trunk/libgfortran/io/list_read.c
    trunk/libgfortran/io/open.c
    trunk/libgfortran/io/transfer.c
    trunk/libgfortran/io/unit.c

Reply via email to