Looks much better.

Attached another test case that fails compilation. The function result as 
declared
in the module procedure interface is not propagated to the submodule that uses 
the
argument/resultless form in the implementation. 

Cheers
Reinhold

> -----Ursprüngliche Nachricht-----
> Von: Paul Richard Thomas [mailto:paul.richard.tho...@gmail.com]
> Gesendet: Donnerstag, 25. Juni 2015 17:16
> An: fort...@gcc.gnu.org; gcc-patches
> Cc: Damian Rouson; Tobias Burnus; salvatore.filipp...@uniroma2.it; Bader,
> Reinhold
> Betreff: Re: [Patch, fortran] PR52846 - [F2008] Support submodules
> 
> Dear All,
> 
> Please find attached an updated version of the submodule patch.
> Reinhold Bader uncovered a couple of bugs, which have now been fixed:
> (i) IMPORT is no longer permitted in module_procedure interface
> bodies, as required by F2008(C1210). Instead, import occurs
> automatically; and
> (ii) The end statement for the abreviated module procedure declaration
> was wrong; should have been END PROCEDURE. I started introducing
> COMP_MODPROC_FUNC/SUBR in the parser to fix this. However, many of the
> if statement became impossibly torturous considering that there was
> only one place where it matters. Therefore, I decided to add a bit
> field to gfc_symbol as the least invasive way of dealing with the
> problem.
> 
> The testcases were modified accordingly.
> 
> Bootstraps and regtests on FC21/x86_64 - OK for trunk?
> 
> Thanks Reinhold!
> 
> Paul
> 
> 2015-06-25  Paul Thomas  <pa...@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.
>     (gfc_match_import): IMPORT is not permitted in the interface
>     declaration of module procedures.
>     (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. If
>     attr abr_modproc_decl is set, switch the message accordingly
>     for subroutines and functions.
>     (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): Set attr has_'import_set' for
>     the interface declaration of module procedures. 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-25  Paul Thomas  <pa...@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
> 
> On 22 June 2015 at 14:39, Paul Richard Thomas
> <paul.richard.tho...@gmail.com> wrote:
> > 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  <pa...@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  <pa...@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
> 
> 
> 
> --
> Outside of a dog, a book is a man's best friend. Inside of a dog it's
> too dark to read.
> 
> Groucho Marx

Attachment: subm_04_pos.f90
Description: subm_04_pos.f90

Reply via email to