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]

[Patch, fortran] PR52846 - [F2008] Support submodules


Dear All,

This patch enables submodule support in gfortran. Submodules are a
feature of F2008 but are fully described in ISO/IEC TR 19767:2004(E).

The patch has one significant non-conformance (that I know about,
anyway!); whilst private derived type components are correctly dealt
with, symbols whose access is private within the parent module are
not. They should effectively be host associated in descendant
submodules. At present gfortran handles private access at the module
write stage. This means that when a submodule reads the module file,
there is no information present about symbols whose access was
private. Since this modification might cause significant fall-out to
existing code, I propose to submit a separate patch later on to sort
out the non-conformance. However, as required private and public
statements are not allowed in submodules.

The patch makes maximum possible leverage of existing code to handle
modules. Once the submodule is matched, the ancestor module and
submodules are first "used" and then all the symbols are set host
associated and private derived type components set public.

Most of the work involved matching module procedures, with both the
traditional form of declaration and the abbreviated one. I have chosen
to treat MODULE as a prefix like PURE or ELEMENTAL. This is logical
both because of the form of the declaration and because the
identification of module procedures is most easily done with an
attribute bit. With traditional procedure declarations, the procedure,
result and dummy characteristics are compared with those of the
interface declaration. The comparison of the dummy characteristics is
a bit cobbled together and might be better done by copying the
formal_namespace and it's contents to the new symbol and retaining the
old for the interface symbol. This patch leaves the old dummy symbols
in the formal namespace in the new ones in the formal arglist. I have
checked that cleanup occurs for all objects.

Note the comment in submodule_1.f90 about the possibility of
undetected recursion between procedures in different submodules. I am
not at all sure that I know how to deal with this and am open to
suggestions.

In addition, it should be noted that collisions between the names of
entities and procedures, other than module procedures are detected by
the linker at present.

Apart from this, all is very straightforward and follows the the ChangeLogs.

Thanks for testing of an early version of the patch by Damian Rouson,
Salvatore Filippone and Tobias Burnus.

Bootstrapped and regtested on FC21/x86_64 - OK for trunk?

Cheers

Paul

2015-06-22  Paul Thomas  <pault@gcc.gnu.org>

    PR fortran/52846
    * decl.c (get_proc_name): Make a partially populated interface
    symbol to carry the characteristics of a module procedure and
    its result.
    (match_attr_spec): Submodule variables have implicit save
    attribute for F2008 onwards.
    (gfc_match_prefix): Add 'module' as the a prefix and set the
    module_procedure attribute.
    (gfc_match_formal_arglist): For a module procedure keep the
    interface formal_arglist from the interface, match new the
    formal arguments and then compare the number and names of each.
    (gfc_match_procedure): Add case COMP_SUBMODULE.
    (gfc_match_function_decl, gfc_match_subroutine_decl): Set the
    module_procedure attribute.
    (gfc_match_entry, gfc_match_end):  Add case COMP_SUBMODULE.
    (gfc_match_submod_proc): New function to match the abbreviated
    style of submodule declaration.
    * gfortran.h : Add ST_SUBMODULE and ST_END_SUBMODULE. Add the
    attribute bits 'used_in_submodule' and 'module_procedure'. Add
    prototypes for the functions 'gfc_check_dummy_characteristics'
    and 'gfc_check_result_characteristics'.
    * interface.c : Add the prefix 'gfc_' to the names of functions
    'check_dummy(result)_characteristics' and all their references.
    * match.h : Add prototype for 'gfc_match_submod_proc' and
    'gfc_match_submodule'.
    * module.c (gfc_match_submodule): New function. Add handling
    for the 'module_procedure' attribute bit.
    * parse.c (decode_statement): Handle a match occurring in
    'gfc_match_submod_proc' and a match for 'submodule'.
    (gfc_enclosing_unit): Include the state COMP_SUBMODULE.
    (gfc_ascii_statement): Add END SUBMODULE.
    (accept_statement): Add ST_SUBMODULE.
    (parse_spec): Disallow statement functions in a submodule
    specification part.
    (parse_contained): Add ST_END_SUBMODULE and COMP_SUBMODULE
    twice each.
    (set_syms_host_assoc): Make symbols from the ancestor module
    and submodules use associated, as required by the standard and
    set all private components public. Module procedures 'external'
    attribute bit is reset and the 'used_in_submodule' bit is set.
    (parse_module): If this is a submodule, use the ancestor module
    and submodules. Traverse the namespace, calling
    'set_syms_host_assoc'. Add ST_END_SUBMODULE and COMP_SUBMODULE.
    * parse.h : Add COMP_SUBMODULE.
    * primary.c (match_variable): Add COMP_SUBMODULE.
    * resolve.c (compare_fsyms): New function to compare the dummy
    characteristics of a module procedure with its interface.
    (resolve_fl_procedure): Compare the procedure, result and dummy
    characteristics of a module_procedure with its interface, using
    'compare_fsyms' for the dummy arguments.
    * symbol.c (gfc_add_procedure): Suppress the check for existing
    procedures in the case of a module procedure.
    (gfc_add_explicit_interface): Skip checks that must fail for
    module procedures.
    (gfc_add_type): Allow a new type to be added to module
    procedures, their results or their dummy arguments.
    * trans-decl.c (gfc_sym_mangled_function_id): Module procedures
    must always have their names mangled as if they are symbols
    coming from a declaration in a module.
    (gfc_finish_var_decl): Symbols with the 'used_in_submodule' bit
    set are set DECL_EXTERNAL as if they were use associated.

2015-06-22  Paul Thomas  <pault@gcc.gnu.org>

    PR fortran/52846
    * gfortran.dg/submodule_1.f90: New test
    * gfortran.dg/submodule_2.f90: New test
    * gfortran.dg/submodule_3.f90: New test
    * gfortran.dg/submodule_4.f90: New test
    * gfortran.dg/submodule_5.f90: New test

Attachment: submit.diff
Description: Text document


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