This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [Patch, fortran] PR52846 - [F2008] Support submodules
- From: Paul Richard Thomas <paul dot richard dot thomas at gmail dot com>
- To: "Bader, Reinhold" <Reinhold dot Bader at lrz dot de>
- Cc: "fortran at gcc dot gnu dot org" <fortran at gcc dot gnu dot org>, gcc-patches <gcc-patches at gcc dot gnu dot org>, Damian Rouson <damian at sourceryinstitute dot org>, Tobias Burnus <burnus at net-b dot de>, "salvatore dot filippone at uniroma2 dot it" <salvatore dot filippone at uniroma2 dot it>
- Date: Fri, 26 Jun 2015 00:48:46 +0200
- Subject: Re: [Patch, fortran] PR52846 - [F2008] Support submodules
- Authentication-results: sourceware.org; auth=none
- References: <CAGkQGiLMYzxJgKYHiGQ5GGsZ3E202STvfn9d4hynhtS6JTVK=g at mail dot gmail dot com> <CAGkQGiJ0tLwoXHBntOuq_W1X=87TSBUHcPWYZgFUSuvHKSR5aQ at mail dot gmail dot com> <d0e5c8c06ffc4822b0e70978f8996120 at BADWLRZ-SW13MB6 dot ads dot mwn dot de>
Dear Reinhold,
That looks like a very strange bug. I am out of the loop until Sunday
evening and so cannot look at it until then.
Thanks, this really helps
Paul
On 25 June 2015 at 23:21, Bader, Reinhold <Reinhold.Bader@lrz.de> wrote:
> 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.thomas@gmail.com]
>> Gesendet: Donnerstag, 25. Juni 2015 17:16
>> An: fortran@gcc.gnu.org; gcc-patches
>> Cc: Damian Rouson; Tobias Burnus; salvatore.filippone@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 <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.
>> (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 <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
>>
>> On 22 June 2015 at 14:39, Paul Richard Thomas
>> <paul.richard.thomas@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 <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
>>
>>
>>
>> --
>> Outside of a dog, a book is a man's best friend. Inside of a dog it's
>> too dark to read.
>>
>> Groucho Marx
--
Outside of a dog, a book is a man's best friend. Inside of a dog it's
too dark to read.
Groucho Marx