[Bug fortran/48298] [F03] User-Defined Derived-Type IO (DTIO)

pault at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Aug 31 05:37:00 GMT 2016


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

--- Comment #17 from Paul Thomas <pault at gcc dot gnu.org> ---
Author: pault
Date: Wed Aug 31 05:36:22 2016
New Revision: 239880

URL: https://gcc.gnu.org/viewcvs?rev=239880&root=gcc&view=rev
Log:
2016-08-31  Paul Thomas  <pault@gcc.gnu.org>
        Jerry DeLisle  <jvdelisle@gcc.gnu.org>

        PR fortran/48298

        * decl.c (access_attr_decl): Include case INTERFACE_DTIO as
        appropriate.
        * gfortran.h : Add INTRINSIC_FORMATTED and
        INTRINSIC_UNFORMATTED to gfc_intrinsic_op. Add INTERFACE_DTIO
        to interface type. Add new enum 'dtio_codes'. Add bitfield
        'has_dtio_procs' to symbol_attr. Add prototypes
        'gfc_check_dtio_interfaces' and 'gfc_find_specific_dtio_proc'.
        * interface.c (dtio_op): New function.
        (gfc_match_generic_spec): Match generic DTIO interfaces.
        (gfc_match_interface): Treat DTIO interfaces in the same way as
        (gfc_current_interface_head): Add INTERFACE_DTIO appropriately.
        (check_dtio_arg_TKR_intent): New function.
        (check_dtio_interface1): New function.
        (gfc_check_dtio_interfaces): New function.
        (gfc_find_specific_dtio_proc): New function.
        * io.c : Add FMT_DT to format_token.
        (format_lex): Handle DTIO formatting.
        * match.c (gfc_op2string): Add DTIO operators.
        * resolve.c (derived_inaccessible): Ignore pointer components
        to enclosing derived type.
        (resolve_transfer): Resolve transfers that involve DTIO.
        procedures. Find the specific subroutine for the transfer and
        use its existence to over-ride some of the constraints on
        derived types. If the transfer is recursive, require that the
        subroutine be so qualified.
        (dtio_procs_present): New function.
        (resolve_fl_namelist): Remove inhibition of polymorphic objects
        in namelists if DTIO read and write subroutines exist. Likewise
        for derived types.
        (resolve_types): Invoke 'gfc_verify_dtio_procedures'.
        * symbol.c : Set 'dtio_procs' using 'minit'.
        * trans-decl.c (gfc_finish_var_decl): If a derived-type/class
        object is associated with DTIO procedures, make it TREE_STATIC.
        * trans-expr.c (gfc_get_vptr_from_expr): If the expression
        drills down to a PARM_DECL, extract the vptr correctly.
        (gfc_conv_derived_to_class): Check 'info' in the test for
        'useflags'. If the se expression exists and is a pointer, use
        it as the class _data.
        * trans-io.c : Add IOCALL_X_DERIVED to iocall and the function
        prototype. Likewise for IOCALL_SET_NML_DTIO_VAL.
        (set_parameter_tree): Renamed from 'set_parameter_const', now
        returns void and has new tree argument. Calls modified to match
        new interface.
        (transfer_namelist_element): Transfer DTIO procedure pointer
        and vpointer using the new function IOCALL_SET_NML_DTIO_VAL.
        (get_dtio_proc): New function.
        (transfer_expr): Add new argument for the vptr field of class
        objects. Add the code to call the specific DTIO proc, convert
        derived types to class and call IOCALL_X_DERIVED.
        (trans_transfer): Add BT_CLASS to structures for treatment by
        the scalarizer. Obtain the vptr for the dynamic type, both for
        scalar and array transfer.

2016-08-31  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
        Paul Thomas  <pault@gcc.gnu.org>

        PR libgfortran/48298
        * gfortran.map : Flag _st_set_nml_dtio_var and
        _gfortran_transfer_derived.
        * io/format.c (format_lex): Detect DTIO formatting.
        (parse_format_list): Parse the DTIO format.
        (next_format): Include FMT_DT.
        * io/format.h : Likewise. Add structure 'udf' to structure
        'fnode' to carry the IOTYPE string and the 'vlist'.
        * io/io.h : Add prototypes for the two types of DTIO subroutine
        and a typedef for gfc_class. Also, add to 'namelist_type'
        fields for the pointer to the DTIO procedure and the vtable.
        Add fields to struct st_parameter_dt for pointers to the two
        types of DTIO subroutine. Add to gfc_unit DTIO specific fields.
        (internal_proto): Add prototype for 'read_user_defined' and
        'write_user_defined'.
        * io/list_read.c (check_buffers): Use the 'current_unit' field.
        (unget_char): Likewise.
        (eat_spaces): Likewise.
        (list_formatted_read_scalar): For case BT_CLASS, call the DTIO
        procedure.
        (nml_get_obj_data): Likewise when DTIO procedure is present,.
        * io/transfer.c : Export prototypes for 'transfer_derived' and
        'transfer_derived_write'.
        (unformatted_read): For case BT_CLASS, call the DTIO procedure.
        (unformatted_write): Likewise.
        (formatted_transfer_scalar_read): Likewise.
        (formatted_transfer_scalar_write: Likewise.
        (transfer_derived): New function.
        (data_transfer_init): Set last_char if no child_dtio.
        (finalize_transfer): Return if child_dtio set.
        (st_write_done): Add condition for child_dtio not set.
        Add extra arguments for st_set_nml_var prototype.
        (set_nml_var): New function that contains the contents of the
        old version of st_set_nml_var. Also sets the 'dtio_sub' and
        'vtable' fields of the 'nml' structure.
        (st_set_nml_var): Now just calls set_nml_var with 'dtio_sub'
        and 'vtable' NULL.
        (st_set_nml_dtio_var): New function that calls set_nml_var.
        * io/unit.c (get_external_unit): If the found unit child_dtio
        is non zero, don't do any mutex locking/unlocking.  Just
        return the unit.
        * io/unix.c (tempfile_open): Revert to C style comment.
        * io/write.c (list_formatted_write_scalar): Do the DTIO call.
        (nml_write_obj): Add BT_CLASS and do the DTIO call.

2016-08-31  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
        Paul Thomas  <pault@gcc.gnu.org>

        PR fortran/48298
        * gfortran.dg/dtio_1.f90: New test.
        * gfortran.dg/dtio_2.f90: New test.
        * gfortran.dg/dtio_3.f90: New test.
        * gfortran.dg/dtio_4.f90: New test.
        * gfortran.dg/dtio_5.f90: New test.
        * gfortran.dg/dtio_6.f90: New test.
        * gfortran.dg/dtio_7.f90: New test.
        * gfortran.dg/dtio_8.f90: New test.
        * gfortran.dg/dtio_9.f90: New test.
        * gfortran.dg/dtio_10.f90: New test.

Added:
    trunk/gcc/testsuite/gfortran.dg/dtio_1.f90
    trunk/gcc/testsuite/gfortran.dg/dtio_10.f90
    trunk/gcc/testsuite/gfortran.dg/dtio_2.f90
    trunk/gcc/testsuite/gfortran.dg/dtio_3.f90
    trunk/gcc/testsuite/gfortran.dg/dtio_4.f90
    trunk/gcc/testsuite/gfortran.dg/dtio_5.f90
    trunk/gcc/testsuite/gfortran.dg/dtio_6.f90
    trunk/gcc/testsuite/gfortran.dg/dtio_7.f90
    trunk/gcc/testsuite/gfortran.dg/dtio_8.f90
    trunk/gcc/testsuite/gfortran.dg/dtio_9.f90
Modified:
    trunk/gcc/fortran/ChangeLog
    trunk/gcc/fortran/decl.c
    trunk/gcc/fortran/gfortran.h
    trunk/gcc/fortran/interface.c
    trunk/gcc/fortran/io.c
    trunk/gcc/fortran/match.c
    trunk/gcc/fortran/resolve.c
    trunk/gcc/fortran/symbol.c
    trunk/gcc/fortran/trans-decl.c
    trunk/gcc/fortran/trans-expr.c
    trunk/gcc/fortran/trans-io.c
    trunk/gcc/testsuite/ChangeLog
    trunk/libgfortran/ChangeLog
    trunk/libgfortran/gfortran.map
    trunk/libgfortran/io/format.c
    trunk/libgfortran/io/format.h
    trunk/libgfortran/io/io.h
    trunk/libgfortran/io/list_read.c
    trunk/libgfortran/io/transfer.c
    trunk/libgfortran/io/unit.c
    trunk/libgfortran/io/unix.c
    trunk/libgfortran/io/write.c


More information about the Gcc-bugs mailing list